summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xbin/syncqt3
-rw-r--r--config.tests/arch/arch.cpp1
-rw-r--r--config.tests/unix/directfb/directfb.cpp51
-rw-r--r--config.tests/unix/directfb/directfb.pro3
-rwxr-xr-xconfigure110
-rw-r--r--dist/changes-5.0.033
-rw-r--r--doc/global/qt-cpp-ignore.qdocconf54
-rw-r--r--doc/global/style/offline.css622
-rw-r--r--doc/src/snippets/code/doc_src_examples_textfinder.pro40
-rw-r--r--doc/src/snippets/code/doc_src_qplugin.pro44
-rw-r--r--doc/src/snippets/code/doc_src_qtgui.pro40
-rw-r--r--doc/src/snippets/code/doc_src_qtnetwork.pro40
-rw-r--r--doc/src/snippets/code/doc_src_qtsql.pro43
-rw-r--r--doc/src/snippets/code/doc_src_qtxml.pro43
-rw-r--r--examples/dbus/complexpingpong/complexping.cpp2
-rw-r--r--examples/dbus/complexpingpong/complexpong.h2
-rw-r--r--examples/dbus/complexpingpong/ping-common.h2
-rw-r--r--examples/dbus/dbus-chat/chat.cpp4
-rw-r--r--examples/dbus/dbus-chat/chat_adaptor.cpp2
-rw-r--r--examples/dbus/dbus-chat/chat_adaptor.h8
-rw-r--r--examples/dbus/dbus-chat/chat_interface.cpp2
-rw-r--r--examples/dbus/dbus-chat/chat_interface.h6
-rw-r--r--examples/dbus/dbus-chat/com.trolltech.chat.xml2
-rw-r--r--examples/dbus/dbus-chat/dbus-chat.pro4
-rw-r--r--examples/dbus/pingpong/ping-common.h2
-rw-r--r--examples/dbus/remotecontrolledcar/car/car.xml2
-rw-r--r--examples/dbus/remotecontrolledcar/car/car_adaptor.cpp8
-rw-r--r--examples/dbus/remotecontrolledcar/car/car_adaptor.h6
-rw-r--r--examples/dbus/remotecontrolledcar/car/main.cpp2
-rw-r--r--examples/dbus/remotecontrolledcar/controller/car.xml2
-rw-r--r--examples/dbus/remotecontrolledcar/controller/car_interface.h4
-rw-r--r--examples/dbus/remotecontrolledcar/controller/controller.cpp2
-rw-r--r--examples/dialogs/findfiles/window.cpp2
-rw-r--r--examples/graphicsview/elasticnodes/graphwidget.cpp2
-rw-r--r--examples/itemviews/chart/pieview.cpp2
-rw-r--r--examples/itemviews/fetchmore/filelistmodel.cpp3
-rw-r--r--examples/itemviews/interview/main.cpp4
-rw-r--r--examples/itemviews/pixelator/imagemodel.cpp3
-rw-r--r--examples/mainwindows/mdi/mainwindow.cpp14
-rw-r--r--examples/mainwindows/mdi/mainwindow.h4
-rw-r--r--examples/opengl/hellowindow/hellowindow.cpp13
-rw-r--r--examples/opengl/hellowindow/hellowindow.h2
-rw-r--r--examples/sql/masterdetail/mainwindow.cpp2
-rw-r--r--examples/tools/completer/mainwindow.cpp4
-rw-r--r--examples/tools/plugandpaint/mainwindow.cpp8
-rw-r--r--examples/tools/plugandpaintplugins/extrafilters/extrafiltersplugin.cpp4
-rw-r--r--examples/tools/settingseditor/locationdialog.cpp2
-rw-r--r--examples/tools/settingseditor/settingstree.cpp4
-rw-r--r--examples/widgets/charactermap/mainwindow.cpp9
-rw-r--r--examples/widgets/charactermap/mainwindow.h4
-rw-r--r--examples/widgets/icons/mainwindow.cpp6
-rw-r--r--examples/widgets/scribble/mainwindow.cpp8
-rw-r--r--mkspecs/cmake/Qt5BasicConfig.cmake.in23
-rw-r--r--mkspecs/common/gcc-base-ios.conf33
-rw-r--r--mkspecs/common/gcc-base.conf1
-rw-r--r--mkspecs/common/ios.conf21
-rw-r--r--mkspecs/common/ios/GLES/gl.h (renamed from src/plugins/platforms/openkode/shaders/frag.glslf)12
-rw-r--r--mkspecs/common/ios/GLES2/gl2.h43
-rw-r--r--mkspecs/common/ios/arch.conf84
-rw-r--r--mkspecs/common/ios/clang.conf47
-rw-r--r--mkspecs/common/ios/g++.conf21
-rw-r--r--mkspecs/common/ios/llvm.conf31
-rw-r--r--mkspecs/common/ios/qmake.conf66
-rw-r--r--mkspecs/common/ios/qplatformdefs.h (renamed from src/plugins/platforms/openvglite/qgraphicssystem_vglite.h)85
-rw-r--r--mkspecs/common/ios/versions.conf184
-rw-r--r--mkspecs/common/qcc-base-qnx-armv7le.conf25
-rw-r--r--mkspecs/common/qcc-base-qnx-x86.conf25
-rw-r--r--mkspecs/common/qcc-base-qnx.conf4
-rw-r--r--mkspecs/devices/linux-archos-gen8-g++/qmake.conf63
-rw-r--r--mkspecs/devices/linux-archos-gen8-g++/qplatformdefs.h (renamed from mkspecs/freebsd-g++40/qplatformdefs.h)2
-rw-r--r--mkspecs/devices/linux-arm-amlogic-8726M-g++/qeglfshooks_8726m.cpp3
-rw-r--r--mkspecs/devices/linux-arm-amlogic-8726M-g++/qmake.conf2
-rw-r--r--mkspecs/devices/linux-arm-trident-pnx8473-g++/qmake.conf2
-rw-r--r--mkspecs/devices/linux-beagleboard-g++/qmake.conf59
-rw-r--r--mkspecs/devices/linux-beagleboard-g++/qplatformdefs.h42
-rw-r--r--mkspecs/devices/linux-mipsel-broadcom-97425-g++/qdirectfbeglhooks_bcm97425.cpp3
-rw-r--r--mkspecs/devices/linux-mipsel-broadcom-97425-g++/qmake.conf2
-rw-r--r--mkspecs/devices/linux-n9-g++/qmake.conf34
-rw-r--r--mkspecs/devices/linux-n9-g++/qplatformdefs.h42
-rw-r--r--mkspecs/devices/linux-rasp-pi-g++/qeglfshooks_pi.cpp4
-rw-r--r--mkspecs/devices/linux-rasp-pi-g++/qmake.conf2
-rw-r--r--mkspecs/devices/linux-rasp-pi-g++/qplatformdefs.h2
-rw-r--r--mkspecs/devices/linux-sh4-stmicro-ST7108-g++/qmake.conf2
-rw-r--r--mkspecs/devices/linux-sh4-stmicro-ST7540-g++/qmake.conf2
-rw-r--r--mkspecs/features/create_cmake.prf18
-rw-r--r--mkspecs/features/declarative_debug.prf2
-rw-r--r--mkspecs/features/device_config.prf5
-rw-r--r--mkspecs/features/qt.prf27
-rw-r--r--mkspecs/features/qt_module_config.prf1
-rw-r--r--mkspecs/features/quick1_debug.prf1
-rw-r--r--mkspecs/freebsd-g++/qplatformdefs.h20
-rw-r--r--mkspecs/freebsd-g++34/qmake.conf84
-rw-r--r--mkspecs/freebsd-g++40/qmake.conf84
-rw-r--r--mkspecs/freebsd-g++46/qmake.conf61
-rw-r--r--mkspecs/freebsd-g++46/qplatformdefs.h (renamed from mkspecs/freebsd-g++34/qplatformdefs.h)0
-rw-r--r--mkspecs/unsupported/blackberry-armv7le-qcc/qmake.conf4
-rw-r--r--mkspecs/unsupported/blackberry-x86-qcc/qmake.conf2
-rw-r--r--mkspecs/unsupported/integrity-ghs/qplatformdefs.h4
-rw-r--r--mkspecs/unsupported/macx-iosdevice-clang-legacy/qmake.conf35
-rw-r--r--mkspecs/unsupported/macx-iosdevice-clang-legacy/qplatformdefs.h42
-rw-r--r--mkspecs/unsupported/macx-iosdevice-clang/qmake.conf35
-rw-r--r--mkspecs/unsupported/macx-iosdevice-clang/qplatformdefs.h42
-rw-r--r--mkspecs/unsupported/macx-iosdevice-g++-legacy/qmake.conf35
-rw-r--r--mkspecs/unsupported/macx-iosdevice-g++-legacy/qplatformdefs.h42
-rw-r--r--mkspecs/unsupported/macx-iosdevice-g++/qmake.conf35
-rw-r--r--mkspecs/unsupported/macx-iosdevice-g++/qplatformdefs.h42
-rw-r--r--mkspecs/unsupported/macx-iosdevice-llvm-legacy/qmake.conf35
-rw-r--r--mkspecs/unsupported/macx-iosdevice-llvm-legacy/qplatformdefs.h42
-rw-r--r--mkspecs/unsupported/macx-iosdevice-llvm/qmake.conf35
-rw-r--r--mkspecs/unsupported/macx-iosdevice-llvm/qplatformdefs.h42
-rw-r--r--mkspecs/unsupported/macx-iossimulator-clang-legacy/qmake.conf6
-rw-r--r--mkspecs/unsupported/macx-iossimulator-clang-legacy/qplatformdefs.h42
-rw-r--r--mkspecs/unsupported/macx-iossimulator-clang/qmake.conf6
-rw-r--r--mkspecs/unsupported/macx-iossimulator-clang/qplatformdefs.h42
-rw-r--r--mkspecs/unsupported/macx-iossimulator-g++-legacy/qmake.conf33
-rw-r--r--mkspecs/unsupported/macx-iossimulator-g++-legacy/qplatformdefs.h42
-rw-r--r--mkspecs/unsupported/macx-iossimulator-g++/qmake.conf33
-rw-r--r--mkspecs/unsupported/macx-iossimulator-g++/qplatformdefs.h42
-rw-r--r--mkspecs/unsupported/macx-iossimulator-llvm-legacy/qmake.conf33
-rw-r--r--mkspecs/unsupported/macx-iossimulator-llvm-legacy/qplatformdefs.h42
-rw-r--r--mkspecs/unsupported/macx-iossimulator-llvm/qmake.conf33
-rw-r--r--mkspecs/unsupported/macx-iossimulator-llvm/qplatformdefs.h42
-rw-r--r--mkspecs/unsupported/qnx-armv7le-qcc/qmake.conf22
-rw-r--r--mkspecs/unsupported/qnx-x86-qcc/qmake.conf22
-rw-r--r--qmake/generators/makefile.cpp3
-rw-r--r--qmake/generators/win32/msbuild_objectmodel.cpp7
-rw-r--r--qmake/generators/win32/msvc_objectmodel.cpp1
-rw-r--r--qmake/generators/win32/msvc_vcproj.cpp3
-rw-r--r--qmake/generators/win32/winmakefile.cpp12
-rw-r--r--qmake/project.cpp2
-rw-r--r--qmake/project.h13
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp48
-rw-r--r--src/3rdparty/libjpeg/jinclude.h2
-rw-r--r--src/3rdparty/libpng/ANNOUNCE112
-rw-r--r--src/3rdparty/libpng/CHANGES647
-rw-r--r--src/3rdparty/libpng/CMakeLists.txt406
-rw-r--r--src/3rdparty/libpng/INSTALL20
-rw-r--r--src/3rdparty/libpng/LICENSE4
-rw-r--r--src/3rdparty/libpng/README13
-rw-r--r--src/3rdparty/libpng/TODO27
-rw-r--r--src/3rdparty/libpng/config.guess1501
-rw-r--r--src/3rdparty/libpng/config.h.in86
-rw-r--r--src/3rdparty/libpng/config.sub1705
-rw-r--r--src/3rdparty/libpng/configure.ac167
-rw-r--r--src/3rdparty/libpng/example.c843
-rw-r--r--src/3rdparty/libpng/libpng-manual.txt1022
-rw-r--r--src/3rdparty/libpng/libpng.35376
-rw-r--r--src/3rdparty/libpng/libpng.pc.in11
-rw-r--r--src/3rdparty/libpng/libpngpf.330
-rw-r--r--src/3rdparty/libpng/png.574
-rw-r--r--src/3rdparty/libpng/png.c922
-rw-r--r--src/3rdparty/libpng/png.h898
-rw-r--r--src/3rdparty/libpng/pngconf.h174
-rw-r--r--src/3rdparty/libpng/pngdebug.h6
-rw-r--r--src/3rdparty/libpng/pngerror.c278
-rw-r--r--src/3rdparty/libpng/pngget.c120
-rw-r--r--src/3rdparty/libpng/pnginfo.h1
-rw-r--r--src/3rdparty/libpng/pnglibconf.h269
-rw-r--r--src/3rdparty/libpng/pngmem.c37
-rw-r--r--src/3rdparty/libpng/pngpread.c778
-rw-r--r--src/3rdparty/libpng/pngpriv.h755
-rw-r--r--src/3rdparty/libpng/pngread.c527
-rw-r--r--src/3rdparty/libpng/pngrtran.c2508
-rw-r--r--src/3rdparty/libpng/pngrutil.c1531
-rw-r--r--src/3rdparty/libpng/pngset.c144
-rw-r--r--src/3rdparty/libpng/pngstruct.h103
-rw-r--r--src/3rdparty/libpng/pngtest.c1787
-rw-r--r--src/3rdparty/libpng/pngtrans.c352
-rw-r--r--src/3rdparty/libpng/pngvalid.c6658
-rw-r--r--src/3rdparty/libpng/pngwrite.c256
-rw-r--r--src/3rdparty/libpng/pngwtran.c30
-rw-r--r--src/3rdparty/libpng/pngwutil.c581
-rw-r--r--src/3rdparty/zlib/gzguts.h8
-rw-r--r--src/concurrent/qfuturewatcher.cpp14
-rw-r--r--src/concurrent/qfuturewatcher.h4
-rw-r--r--src/corelib/arch/qatomic_sparc.h16
-rw-r--r--src/corelib/codecs/codecs.qdoc14
-rw-r--r--src/corelib/codecs/qtextcodec.cpp6
-rw-r--r--src/corelib/corelib.pro3
-rw-r--r--src/corelib/doc/doc.pri3
-rw-r--r--src/corelib/doc/images/abstract-connections.png (renamed from doc/src/images/abstract-connections.png)bin19849 -> 19849 bytes
-rw-r--r--src/corelib/doc/images/brush-styles.png (renamed from doc/src/images/brush-styles.png)bin13980 -> 13980 bytes
-rw-r--r--src/corelib/doc/images/cursor-arrow.png (renamed from doc/src/images/cursor-arrow.png)bin171 -> 171 bytes
-rw-r--r--src/corelib/doc/images/cursor-busy.png (renamed from doc/src/images/cursor-busy.png)bin201 -> 201 bytes
-rw-r--r--src/corelib/doc/images/cursor-closedhand.png (renamed from doc/src/images/cursor-closedhand.png)bin147 -> 147 bytes
-rw-r--r--src/corelib/doc/images/cursor-cross.png (renamed from doc/src/images/cursor-cross.png)bin130 -> 130 bytes
-rw-r--r--src/corelib/doc/images/cursor-forbidden.png (renamed from doc/src/images/cursor-forbidden.png)bin199 -> 199 bytes
-rw-r--r--src/corelib/doc/images/cursor-hand.png (renamed from doc/src/images/cursor-hand.png)bin159 -> 159 bytes
-rw-r--r--src/corelib/doc/images/cursor-hsplit.png (renamed from doc/src/images/cursor-hsplit.png)bin155 -> 155 bytes
-rw-r--r--src/corelib/doc/images/cursor-ibeam.png (renamed from doc/src/images/cursor-ibeam.png)bin124 -> 124 bytes
-rw-r--r--src/corelib/doc/images/cursor-openhand.png (renamed from doc/src/images/cursor-openhand.png)bin160 -> 160 bytes
-rw-r--r--src/corelib/doc/images/cursor-sizeall.png (renamed from doc/src/images/cursor-sizeall.png)bin174 -> 174 bytes
-rw-r--r--src/corelib/doc/images/cursor-sizeb.png (renamed from doc/src/images/cursor-sizeb.png)bin161 -> 161 bytes
-rw-r--r--src/corelib/doc/images/cursor-sizef.png (renamed from doc/src/images/cursor-sizef.png)bin161 -> 161 bytes
-rw-r--r--src/corelib/doc/images/cursor-sizeh.png (renamed from doc/src/images/cursor-sizeh.png)bin145 -> 145 bytes
-rw-r--r--src/corelib/doc/images/cursor-sizev.png (renamed from doc/src/images/cursor-sizev.png)bin141 -> 141 bytes
-rw-r--r--src/corelib/doc/images/cursor-uparrow.png (renamed from doc/src/images/cursor-uparrow.png)bin132 -> 132 bytes
-rw-r--r--src/corelib/doc/images/cursor-vsplit.png (renamed from doc/src/images/cursor-vsplit.png)bin161 -> 161 bytes
-rw-r--r--src/corelib/doc/images/cursor-wait.png (renamed from doc/src/images/cursor-wait.png)bin172 -> 172 bytes
-rw-r--r--src/corelib/doc/images/cursor-whatsthis.png (renamed from doc/src/images/cursor-whatsthis.png)bin191 -> 191 bytes
-rw-r--r--src/corelib/doc/images/javaiterators1.png (renamed from doc/src/images/javaiterators1.png)bin1062 -> 1062 bytes
-rw-r--r--src/corelib/doc/images/javaiterators2.png (renamed from doc/src/images/javaiterators2.png)bin2011 -> 2011 bytes
-rw-r--r--src/corelib/doc/images/modelindex-no-parent.png (renamed from doc/src/images/modelindex-no-parent.png)bin7407 -> 7407 bytes
-rw-r--r--src/corelib/doc/images/modelview-begin-append-columns.png (renamed from doc/src/images/modelview-begin-append-columns.png)bin12798 -> 12798 bytes
-rw-r--r--src/corelib/doc/images/modelview-begin-append-rows.png (renamed from doc/src/images/modelview-begin-append-rows.png)bin8967 -> 8967 bytes
-rw-r--r--src/corelib/doc/images/modelview-begin-insert-columns.png (renamed from doc/src/images/modelview-begin-insert-columns.png)bin14476 -> 14476 bytes
-rw-r--r--src/corelib/doc/images/modelview-begin-insert-rows.png (renamed from doc/src/images/modelview-begin-insert-rows.png)bin12565 -> 12565 bytes
-rw-r--r--src/corelib/doc/images/modelview-begin-remove-columns.png (renamed from doc/src/images/modelview-begin-remove-columns.png)bin14518 -> 14518 bytes
-rw-r--r--src/corelib/doc/images/modelview-begin-remove-rows.png (renamed from doc/src/images/modelview-begin-remove-rows.png)bin10896 -> 10896 bytes
-rw-r--r--src/corelib/doc/images/modelview-move-rows-1.png (renamed from doc/src/images/modelview-move-rows-1.png)bin19709 -> 19709 bytes
-rw-r--r--src/corelib/doc/images/modelview-move-rows-2.png (renamed from doc/src/images/modelview-move-rows-2.png)bin19385 -> 19385 bytes
-rw-r--r--src/corelib/doc/images/modelview-move-rows-3.png (renamed from doc/src/images/modelview-move-rows-3.png)bin9281 -> 9281 bytes
-rw-r--r--src/corelib/doc/images/modelview-move-rows-4.png (renamed from doc/src/images/modelview-move-rows-4.png)bin9381 -> 9381 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-inback.png (renamed from doc/src/images/qeasingcurve-inback.png)bin2808 -> 2808 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-inbounce.png (renamed from doc/src/images/qeasingcurve-inbounce.png)bin3154 -> 3154 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-incirc.png (renamed from doc/src/images/qeasingcurve-incirc.png)bin2605 -> 2605 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-incubic.png (renamed from doc/src/images/qeasingcurve-incubic.png)bin2722 -> 2722 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-inelastic.png (renamed from doc/src/images/qeasingcurve-inelastic.png)bin3304 -> 3304 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-inexpo.png (renamed from doc/src/images/qeasingcurve-inexpo.png)bin2675 -> 2675 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-inoutback.png (renamed from doc/src/images/qeasingcurve-inoutback.png)bin3241 -> 3241 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-inoutbounce.png (renamed from doc/src/images/qeasingcurve-inoutbounce.png)bin3386 -> 3386 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-inoutcirc.png (renamed from doc/src/images/qeasingcurve-inoutcirc.png)bin2843 -> 2843 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-inoutcubic.png (renamed from doc/src/images/qeasingcurve-inoutcubic.png)bin2931 -> 2931 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-inoutelastic.png (renamed from doc/src/images/qeasingcurve-inoutelastic.png)bin3461 -> 3461 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-inoutexpo.png (renamed from doc/src/images/qeasingcurve-inoutexpo.png)bin3004 -> 3004 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-inoutquad.png (renamed from doc/src/images/qeasingcurve-inoutquad.png)bin2893 -> 2893 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-inoutquart.png (renamed from doc/src/images/qeasingcurve-inoutquart.png)bin2925 -> 2925 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-inoutquint.png (renamed from doc/src/images/qeasingcurve-inoutquint.png)bin2823 -> 2823 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-inoutsine.png (renamed from doc/src/images/qeasingcurve-inoutsine.png)bin2891 -> 2891 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-inquad.png (renamed from doc/src/images/qeasingcurve-inquad.png)bin2733 -> 2733 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-inquart.png (renamed from doc/src/images/qeasingcurve-inquart.png)bin2727 -> 2727 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-inquint.png (renamed from doc/src/images/qeasingcurve-inquint.png)bin2630 -> 2630 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-insine.png (renamed from doc/src/images/qeasingcurve-insine.png)bin2567 -> 2567 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-linear.png (renamed from doc/src/images/qeasingcurve-linear.png)bin2318 -> 2318 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-outback.png (renamed from doc/src/images/qeasingcurve-outback.png)bin2852 -> 2852 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-outbounce.png (renamed from doc/src/images/qeasingcurve-outbounce.png)bin3360 -> 3360 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-outcirc.png (renamed from doc/src/images/qeasingcurve-outcirc.png)bin2796 -> 2796 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-outcubic.png (renamed from doc/src/images/qeasingcurve-outcubic.png)bin2792 -> 2792 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-outelastic.png (renamed from doc/src/images/qeasingcurve-outelastic.png)bin3423 -> 3423 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-outexpo.png (renamed from doc/src/images/qeasingcurve-outexpo.png)bin2803 -> 2803 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-outinback.png (renamed from doc/src/images/qeasingcurve-outinback.png)bin3026 -> 3026 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-outinbounce.png (renamed from doc/src/images/qeasingcurve-outinbounce.png)bin3629 -> 3629 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-outincirc.png (renamed from doc/src/images/qeasingcurve-outincirc.png)bin2822 -> 2822 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-outincubic.png (renamed from doc/src/images/qeasingcurve-outincubic.png)bin2872 -> 2872 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-outinelastic.png (renamed from doc/src/images/qeasingcurve-outinelastic.png)bin3941 -> 3941 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-outinexpo.png (renamed from doc/src/images/qeasingcurve-outinexpo.png)bin2923 -> 2923 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-outinquad.png (renamed from doc/src/images/qeasingcurve-outinquad.png)bin2858 -> 2858 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-outinquart.png (renamed from doc/src/images/qeasingcurve-outinquart.png)bin2830 -> 2830 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-outinquint.png (renamed from doc/src/images/qeasingcurve-outinquint.png)bin2724 -> 2724 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-outinsine.png (renamed from doc/src/images/qeasingcurve-outinsine.png)bin2817 -> 2817 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-outquad.png (renamed from doc/src/images/qeasingcurve-outquad.png)bin2760 -> 2760 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-outquart.png (renamed from doc/src/images/qeasingcurve-outquart.png)bin2764 -> 2764 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-outquint.png (renamed from doc/src/images/qeasingcurve-outquint.png)bin2687 -> 2687 bytes
-rw-r--r--src/corelib/doc/images/qeasingcurve-outsine.png (renamed from doc/src/images/qeasingcurve-outsine.png)bin2773 -> 2773 bytes
-rw-r--r--src/corelib/doc/images/qimage-scaling.png (renamed from doc/src/images/qimage-scaling.png)bin34785 -> 34785 bytes
-rw-r--r--src/corelib/doc/images/qline-coordinates.png (renamed from doc/src/images/qline-coordinates.png)bin9459 -> 9459 bytes
-rw-r--r--src/corelib/doc/images/qline-point.png (renamed from doc/src/images/qline-point.png)bin8484 -> 8484 bytes
-rw-r--r--src/corelib/doc/images/qlinef-angle-identicaldirection.png (renamed from doc/src/images/qlinef-angle-identicaldirection.png)bin6004 -> 6004 bytes
-rw-r--r--src/corelib/doc/images/qlinef-angle-oppositedirection.png (renamed from doc/src/images/qlinef-angle-oppositedirection.png)bin5834 -> 5834 bytes
-rw-r--r--src/corelib/doc/images/qlinef-bounded.png (renamed from doc/src/images/qlinef-bounded.png)bin4183 -> 4183 bytes
-rw-r--r--src/corelib/doc/images/qlinef-normalvector.png (renamed from doc/src/images/qlinef-normalvector.png)bin9432 -> 9432 bytes
-rw-r--r--src/corelib/doc/images/qlinef-unbounded.png (renamed from doc/src/images/qlinef-unbounded.png)bin3992 -> 3992 bytes
-rw-r--r--src/corelib/doc/images/qpen-bevel.png (renamed from doc/src/images/qpen-bevel.png)bin11527 -> 11527 bytes
-rw-r--r--src/corelib/doc/images/qpen-custom.png (renamed from doc/src/images/qpen-custom.png)bin6254 -> 6254 bytes
-rw-r--r--src/corelib/doc/images/qpen-dash.png (renamed from doc/src/images/qpen-dash.png)bin8221 -> 8221 bytes
-rw-r--r--src/corelib/doc/images/qpen-dashdot.png (renamed from doc/src/images/qpen-dashdot.png)bin5961 -> 5961 bytes
-rw-r--r--src/corelib/doc/images/qpen-dashdotdot.png (renamed from doc/src/images/qpen-dashdotdot.png)bin5999 -> 5999 bytes
-rw-r--r--src/corelib/doc/images/qpen-dot.png (renamed from doc/src/images/qpen-dot.png)bin5386 -> 5386 bytes
-rw-r--r--src/corelib/doc/images/qpen-flat.png (renamed from doc/src/images/qpen-flat.png)bin1885 -> 1885 bytes
-rw-r--r--src/corelib/doc/images/qpen-miter.png (renamed from doc/src/images/qpen-miter.png)bin11734 -> 11734 bytes
-rw-r--r--src/corelib/doc/images/qpen-roundcap.png (renamed from doc/src/images/qpen-roundcap.png)bin1920 -> 1920 bytes
-rw-r--r--src/corelib/doc/images/qpen-roundjoin.png (renamed from doc/src/images/qpen-roundjoin.png)bin11878 -> 11878 bytes
-rw-r--r--src/corelib/doc/images/qpen-solid.png (renamed from doc/src/images/qpen-solid.png)bin7416 -> 7416 bytes
-rw-r--r--src/corelib/doc/images/qpen-square.png (renamed from doc/src/images/qpen-square.png)bin2651 -> 2651 bytes
-rw-r--r--src/corelib/doc/images/qrect-coordinates.png (renamed from doc/src/images/qrect-coordinates.png)bin22218 -> 22218 bytes
-rw-r--r--src/corelib/doc/images/qrect-diagram-one.png (renamed from doc/src/images/qrect-diagram-one.png)bin9616 -> 9616 bytes
-rw-r--r--src/corelib/doc/images/qrect-diagram-three.png (renamed from doc/src/images/qrect-diagram-three.png)bin9458 -> 9458 bytes
-rw-r--r--src/corelib/doc/images/qrect-diagram-two.png (renamed from doc/src/images/qrect-diagram-two.png)bin9378 -> 9378 bytes
-rw-r--r--src/corelib/doc/images/qrect-diagram-zero.png (renamed from doc/src/images/qrect-diagram-zero.png)bin5198 -> 5198 bytes
-rw-r--r--src/corelib/doc/images/qrect-intersect.png (renamed from doc/src/images/qrect-intersect.png)bin8742 -> 8742 bytes
-rw-r--r--src/corelib/doc/images/qrect-unite.png (renamed from doc/src/images/qrect-unite.png)bin4626 -> 4626 bytes
-rw-r--r--src/corelib/doc/images/qrectf-coordinates.png (renamed from doc/src/images/qrectf-coordinates.png)bin21749 -> 21749 bytes
-rw-r--r--src/corelib/doc/images/qrectf-diagram-one.png (renamed from doc/src/images/qrectf-diagram-one.png)bin9594 -> 9594 bytes
-rw-r--r--src/corelib/doc/images/qrectf-diagram-three.png (renamed from doc/src/images/qrectf-diagram-three.png)bin9392 -> 9392 bytes
-rw-r--r--src/corelib/doc/images/qrectf-diagram-two.png (renamed from doc/src/images/qrectf-diagram-two.png)bin9387 -> 9387 bytes
-rw-r--r--src/corelib/doc/images/qsortfilterproxymodel-sorting.png (renamed from doc/src/images/qsortfilterproxymodel-sorting.png)bin11005 -> 11005 bytes
-rw-r--r--src/corelib/doc/images/qurl-authority.png (renamed from doc/src/images/qurl-authority.png)bin5099 -> 5099 bytes
-rw-r--r--src/corelib/doc/images/qurl-authority2.png (renamed from doc/src/images/qurl-authority2.png)bin2350 -> 2350 bytes
-rw-r--r--src/corelib/doc/images/qurl-authority3.png (renamed from doc/src/images/qurl-authority3.png)bin3552 -> 3552 bytes
-rw-r--r--src/corelib/doc/images/qurl-fragment.png (renamed from doc/src/images/qurl-fragment.png)bin2333 -> 2333 bytes
-rw-r--r--src/corelib/doc/images/qurl-ftppath.png (renamed from doc/src/images/qurl-ftppath.png)bin1974 -> 1974 bytes
-rw-r--r--src/corelib/doc/images/qurl-mailtopath.png (renamed from doc/src/images/qurl-mailtopath.png)bin1679 -> 1679 bytes
-rw-r--r--src/corelib/doc/images/qurl-querystring.png (renamed from doc/src/images/qurl-querystring.png)bin2955 -> 2955 bytes
-rw-r--r--src/corelib/doc/images/stliterators1.png (renamed from doc/src/images/stliterators1.png)bin1671 -> 1671 bytes
-rw-r--r--src/corelib/doc/images/thread_clock.png (renamed from doc/src/images/thread_clock.png)bin5964 -> 5964 bytes
-rw-r--r--src/corelib/doc/images/threadsandobjects.png (renamed from doc/src/images/threadsandobjects.png)bin66096 -> 66096 bytes
-rw-r--r--src/corelib/doc/images/threadvisual-example.png (renamed from doc/src/images/threadvisual-example.png)bin16823 -> 16823 bytes
-rw-r--r--src/corelib/doc/qtcore.qdocconf90
-rw-r--r--src/corelib/doc/snippets/buffer/buffer.cpp (renamed from doc/src/snippets/buffer/buffer.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/doc_src_containers.cpp (renamed from doc/src/snippets/code/doc_src_containers.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/doc_src_groups.cpp (renamed from doc/src/snippets/code/doc_src_groups.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/doc_src_objecttrees.cpp (renamed from doc/src/snippets/code/doc_src_objecttrees.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/doc_src_properties.cpp (renamed from doc/src/snippets/code/doc_src_properties.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/doc_src_qalgorithms.cpp (renamed from doc/src/snippets/code/doc_src_qalgorithms.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/doc_src_qcache.cpp (renamed from doc/src/snippets/code/doc_src_qcache.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/doc_src_qiterator.cpp (renamed from doc/src/snippets/code/doc_src_qiterator.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/doc_src_qnamespace.cpp (renamed from doc/src/snippets/code/doc_src_qnamespace.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/doc_src_qnamespace.qdoc (renamed from doc/src/snippets/code/doc_src_qnamespace.qdoc)0
-rw-r--r--src/corelib/doc/snippets/code/doc_src_qpair.cpp (renamed from doc/src/snippets/code/doc_src_qpair.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/doc_src_qplugin.cpp (renamed from doc/src/snippets/code/doc_src_qplugin.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/doc_src_qplugin.pro4
-rw-r--r--src/corelib/doc/snippets/code/doc_src_qset.cpp (renamed from doc/src/snippets/code/doc_src_qset.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/doc_src_qtcore.cpp (renamed from doc/src/snippets/code/doc_src_qtcore.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/doc_src_qvarlengtharray.cpp (renamed from doc/src/snippets/code/doc_src_qvarlengtharray.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/qlogging/qlogging.cpp (renamed from doc/src/snippets/qlogging/qloggingsnippet.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_codecs_qtextcodec.cpp (renamed from doc/src/snippets/code/src_corelib_codecs_qtextcodec.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_concurrent_qthreadpool.cpp (renamed from doc/src/snippets/code/src_corelib_concurrent_qthreadpool.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_global_qglobal.cpp (renamed from doc/src/snippets/code/src_corelib_global_qglobal.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qabstractfileengine.cpp (renamed from doc/src/snippets/code/src_corelib_io_qabstractfileengine.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qdatastream.cpp (renamed from doc/src/snippets/code/src_corelib_io_qdatastream.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qdir.cpp (renamed from doc/src/snippets/code/src_corelib_io_qdir.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qdiriterator.cpp (renamed from doc/src/snippets/code/src_corelib_io_qdiriterator.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qfile.cpp (renamed from doc/src/snippets/code/src_corelib_io_qfile.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qfileinfo.cpp (renamed from doc/src/snippets/code/src_corelib_io_qfileinfo.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qiodevice.cpp (renamed from doc/src/snippets/code/src_corelib_io_qiodevice.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qprocess.cpp (renamed from doc/src/snippets/code/src_corelib_io_qprocess.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qsettings.cpp (renamed from doc/src/snippets/code/src_corelib_io_qsettings.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qtemporarydir.cpp (renamed from doc/src/snippets/code/src_corelib_io_qtemporarydir.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qtemporaryfile.cpp (renamed from doc/src/snippets/code/src_corelib_io_qtemporaryfile.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qtextstream.cpp (renamed from doc/src/snippets/code/src_corelib_io_qtextstream.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qurl.cpp (renamed from doc/src/snippets/code/src_corelib_io_qurl.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_kernel_qabstracteventdispatcher.cpp (renamed from doc/src/snippets/code/src_corelib_kernel_qabstracteventdispatcher.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp (renamed from doc/src/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_kernel_qcoreapplication.cpp (renamed from doc/src/snippets/code/src_corelib_kernel_qcoreapplication.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_kernel_qmetaobject.cpp (renamed from doc/src/snippets/code/src_corelib_kernel_qmetaobject.cpp)4
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_kernel_qmetatype.cpp (renamed from doc/src/snippets/code/src_corelib_kernel_qmetatype.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_kernel_qmimedata.cpp (renamed from doc/src/snippets/code/src_corelib_kernel_qmimedata.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_kernel_qobject.cpp (renamed from doc/src/snippets/code/src_corelib_kernel_qobject.cpp)12
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_kernel_qsystemsemaphore.cpp (renamed from doc/src/snippets/code/src_corelib_kernel_qsystemsemaphore.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_kernel_qtimer.cpp (renamed from doc/src/snippets/code/src_corelib_kernel_qtimer.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_kernel_qvariant.cpp (renamed from doc/src/snippets/code/src_corelib_kernel_qvariant.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_mimetype_qmimedatabase.cpp (renamed from doc/src/snippets/code/src_corelib_mimetype_qmimedatabase.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_plugin_qlibrary.cpp (renamed from doc/src/snippets/code/src_corelib_plugin_qlibrary.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_plugin_quuid.cpp (renamed from doc/src/snippets/code/src_corelib_plugin_quuid.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_statemachine_qstatemachine.cpp (renamed from doc/src/snippets/code/src_corelib_statemachine_qstatemachine.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_thread_qatomic.cpp (renamed from doc/src/snippets/code/src_corelib_thread_qatomic.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_thread_qmutex.cpp (renamed from doc/src/snippets/code/src_corelib_thread_qmutex.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_thread_qmutexpool.cpp (renamed from doc/src/snippets/code/src_corelib_thread_qmutexpool.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_thread_qreadwritelock.cpp (renamed from doc/src/snippets/code/src_corelib_thread_qreadwritelock.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_thread_qsemaphore.cpp (renamed from doc/src/snippets/code/src_corelib_thread_qsemaphore.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_thread_qthread.cpp (renamed from doc/src/snippets/code/src_corelib_thread_qthread.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_thread_qwaitcondition_unix.cpp (renamed from doc/src/snippets/code/src_corelib_thread_qwaitcondition_unix.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qbitarray.cpp (renamed from doc/src/snippets/code/src_corelib_tools_qbitarray.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qbytearray.cpp (renamed from doc/src/snippets/code/src_corelib_tools_qbytearray.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qdatetime.cpp (renamed from doc/src/snippets/code/src_corelib_tools_qdatetime.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qeasingcurve.cpp (renamed from doc/src/snippets/code/src_corelib_tools_qeasingcurve.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qhash.cpp (renamed from doc/src/snippets/code/src_corelib_tools_qhash.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qlinkedlist.cpp (renamed from doc/src/snippets/code/src_corelib_tools_qlinkedlist.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qlistdata.cpp (renamed from doc/src/snippets/code/src_corelib_tools_qlistdata.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qlocale.cpp (renamed from doc/src/snippets/code/src_corelib_tools_qlocale.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qmap.cpp (renamed from doc/src/snippets/code/src_corelib_tools_qmap.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qpoint.cpp (renamed from doc/src/snippets/code/src_corelib_tools_qpoint.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qqueue.cpp48
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qrect.cpp (renamed from doc/src/snippets/code/src_corelib_tools_qrect.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qregexp.cpp (renamed from doc/src/snippets/code/src_corelib_tools_qregexp.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qregularexpression.cpp (renamed from doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qscopedpointer.cpp (renamed from doc/src/snippets/code/src_corelib_tools_qscopedpointer.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qsize.cpp (renamed from doc/src/snippets/code/src_corelib_tools_qsize.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qstring.cpp (renamed from doc/src/snippets/code/src_corelib_tools_qstring.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qtimeline.cpp (renamed from doc/src/snippets/code/src_corelib_tools_qtimeline.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qvector.cpp183
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_xml_qxmlstream.cpp (renamed from doc/src/snippets/code/src_corelib_xml_qxmlstream.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_gui_dialogs_qmessagebox.cpp (renamed from doc/src/snippets/code/src_gui_dialogs_qmessagebox.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_gui_itemviews_qidentityproxymodel.cpp (renamed from doc/src/snippets/code/src_gui_itemviews_qidentityproxymodel.cpp)0
-rw-r--r--src/corelib/doc/snippets/code/src_gui_itemviews_qitemselectionmodel.cpp (renamed from doc/src/snippets/code/src_gui_itemviews_qitemselectionmodel.cpp)0
-rw-r--r--src/corelib/doc/snippets/file/file.cpp (renamed from doc/src/snippets/file/file.cpp)0
-rw-r--r--src/corelib/doc/snippets/fileinfo/main.cpp (renamed from doc/src/snippets/fileinfo/main.cpp)0
-rw-r--r--src/corelib/doc/snippets/ntfsp.cpp (renamed from doc/src/snippets/ntfsp.cpp)0
-rw-r--r--src/corelib/doc/snippets/pointer/pointer.cpp60
-rw-r--r--src/corelib/doc/snippets/process/process.cpp (renamed from doc/src/snippets/process/process.cpp)0
-rw-r--r--src/corelib/doc/snippets/qdebug/qdebugsnippet.cpp (renamed from doc/src/snippets/qdebug/qdebugsnippet.cpp)0
-rw-r--r--src/corelib/doc/snippets/qdir-listfiles/main.cpp (renamed from doc/src/snippets/qdir-listfiles/main.cpp)0
-rw-r--r--src/corelib/doc/snippets/qdir-namefilters/main.cpp (renamed from doc/src/snippets/qdir-namefilters/main.cpp)0
-rw-r--r--src/corelib/doc/snippets/qelapsedtimer/main.cpp (renamed from doc/src/snippets/qelapsedtimer/main.cpp)0
-rw-r--r--src/corelib/doc/snippets/qmetaobject-invokable/main.cpp (renamed from doc/src/snippets/qmetaobject-invokable/main.cpp)0
-rw-r--r--src/corelib/doc/snippets/qmetaobject-invokable/qmetaobject-invokable.pro (renamed from doc/src/snippets/qmetaobject-invokable/qmetaobject-invokable.pro)0
-rw-r--r--src/corelib/doc/snippets/qmetaobject-invokable/window.cpp (renamed from doc/src/snippets/qmetaobject-invokable/window.cpp)0
-rw-r--r--src/corelib/doc/snippets/qmetaobject-invokable/window.h (renamed from doc/src/snippets/qmetaobject-invokable/window.h)0
-rw-r--r--src/corelib/doc/snippets/qprocess-environment/main.cpp (renamed from doc/src/snippets/qprocess-environment/main.cpp)0
-rw-r--r--src/corelib/doc/snippets/qprocess/qprocess-simpleexecution.cpp (renamed from doc/src/snippets/qprocess/qprocess-simpleexecution.cpp)0
-rw-r--r--src/corelib/doc/snippets/qsignalmapper/buttonwidget.cpp (renamed from doc/src/snippets/qsignalmapper/buttonwidget.cpp)0
-rw-r--r--src/corelib/doc/snippets/qsignalmapper/buttonwidget.h (renamed from doc/src/snippets/qsignalmapper/buttonwidget.h)0
-rw-r--r--src/corelib/doc/snippets/qsortfilterproxymodel-details/main.cpp (renamed from doc/src/snippets/qsortfilterproxymodel-details/main.cpp)0
-rw-r--r--src/corelib/doc/snippets/qstack/main.cpp (renamed from doc/src/snippets/qstack/main.cpp)0
-rw-r--r--src/corelib/doc/snippets/qstring/main.cpp (renamed from doc/src/snippets/qstring/main.cpp)0
-rw-r--r--src/corelib/doc/snippets/qstring/stringbuilder.cpp (renamed from doc/src/snippets/qstring/stringbuilder.cpp)0
-rw-r--r--src/corelib/doc/snippets/qstringlist/main.cpp (renamed from doc/src/snippets/qstringlist/main.cpp)0
-rw-r--r--src/corelib/doc/snippets/qstringlistmodel/main.cpp (renamed from doc/src/snippets/qstringlistmodel/main.cpp)0
-rw-r--r--src/corelib/doc/snippets/qtcast/qtcast.cpp (renamed from doc/src/snippets/qtcast/qtcast.cpp)0
-rw-r--r--src/corelib/doc/snippets/qxmlstreamwriter/main.cpp (renamed from doc/src/snippets/qxmlstreamwriter/main.cpp)0
-rw-r--r--src/corelib/doc/snippets/settings/settings.cpp (renamed from doc/src/snippets/settings/settings.cpp)0
-rw-r--r--src/corelib/doc/snippets/sharedemployee/employee.h (renamed from doc/src/snippets/sharedemployee/employee.h)0
-rw-r--r--src/corelib/doc/snippets/sharedemployee/main.cpp (renamed from doc/src/snippets/sharedemployee/main.cpp)0
-rw-r--r--src/corelib/doc/snippets/signalmapper/filereader.cpp (renamed from doc/src/snippets/signalmapper/filereader.cpp)0
-rw-r--r--src/corelib/doc/snippets/signalsandslots/lcdnumber.h (renamed from doc/src/snippets/signalsandslots/lcdnumber.h)0
-rw-r--r--src/corelib/doc/snippets/signalsandslots/signalsandslots.cpp (renamed from doc/src/snippets/signalsandslots/signalsandslots.cpp)0
-rw-r--r--src/corelib/doc/snippets/signalsandslots/signalsandslots.h (renamed from doc/src/snippets/signalsandslots/signalsandslots.h)0
-rw-r--r--src/corelib/doc/snippets/streaming/main.cpp (renamed from doc/src/snippets/streaming/main.cpp)0
-rw-r--r--src/corelib/doc/snippets/streaming/streaming.pro (renamed from doc/src/snippets/streaming/streaming.pro)0
-rw-r--r--src/corelib/doc/snippets/threads/threads.cpp (renamed from doc/src/snippets/threads/threads.cpp)0
-rw-r--r--src/corelib/doc/snippets/threads/threads.h (renamed from doc/src/snippets/threads/threads.h)0
-rw-r--r--src/corelib/doc/snippets/timers/timers.cpp (renamed from doc/src/snippets/timers/timers.cpp)0
-rw-r--r--src/corelib/doc/src/containers.qdoc (renamed from doc/src/corelib/containers.qdoc)60
-rw-r--r--src/corelib/doc/src/datastreamformat.qdoc (renamed from doc/src/network/files-and-resources/datastreamformat.qdoc)0
-rw-r--r--src/corelib/doc/src/implicit-sharing.qdoc (renamed from doc/src/corelib/implicit-sharing.qdoc)4
-rw-r--r--src/corelib/doc/src/json.qdoc (renamed from doc/src/corelib/json.qdoc)2
-rw-r--r--src/corelib/doc/src/objectmodel/metaobjects.qdoc (renamed from doc/src/corelib/objectmodel/metaobjects.qdoc)14
-rw-r--r--src/corelib/doc/src/objectmodel/object.qdoc (renamed from doc/src/corelib/objectmodel/object.qdoc)0
-rw-r--r--src/corelib/doc/src/objectmodel/objecttrees.qdoc (renamed from doc/src/corelib/objectmodel/objecttrees.qdoc)4
-rw-r--r--src/corelib/doc/src/objectmodel/properties.qdoc (renamed from doc/src/corelib/objectmodel/properties.qdoc)16
-rw-r--r--src/corelib/doc/src/objectmodel/signalsandslots.qdoc (renamed from doc/src/corelib/objectmodel/signalsandslots.qdoc)62
-rw-r--r--src/corelib/doc/src/qtcore.qdoc (renamed from doc/src/corelib/qtcore.qdoc)2
-rw-r--r--src/corelib/doc/src/threads-basics.qdoc (renamed from doc/src/corelib/threads-basics.qdoc)20
-rw-r--r--src/corelib/doc/src/threads.qdoc (renamed from doc/src/corelib/threads.qdoc)16
-rw-r--r--src/corelib/global/qcompilerdetection.h157
-rw-r--r--src/corelib/global/qconfig-medium.h3
-rw-r--r--src/corelib/global/qconfig-minimal.h3
-rw-r--r--src/corelib/global/qconfig-nacl.h3
-rw-r--r--src/corelib/global/qconfig-small.h3
-rw-r--r--src/corelib/global/qfeatures.h3
-rw-r--r--src/corelib/global/qglobal.cpp244
-rw-r--r--src/corelib/global/qglobal.h222
-rw-r--r--src/corelib/global/qlogging.cpp114
-rw-r--r--src/corelib/global/qlogging.h4
-rw-r--r--src/corelib/global/qnamespace.h10
-rw-r--r--src/corelib/global/qnamespace.qdoc18
-rw-r--r--src/corelib/global/qprocessordetection.h4
-rw-r--r--src/corelib/global/qsystemdetection.h4
-rw-r--r--src/corelib/io/io.pri2
-rw-r--r--src/corelib/io/qabstractfileengine.cpp20
-rw-r--r--src/corelib/io/qbuffer.cpp29
-rw-r--r--src/corelib/io/qbuffer.h4
-rw-r--r--src/corelib/io/qdatastream.cpp31
-rw-r--r--src/corelib/io/qdebug.cpp6
-rw-r--r--src/corelib/io/qdir.cpp62
-rw-r--r--src/corelib/io/qdiriterator.cpp5
-rw-r--r--src/corelib/io/qfile.cpp22
-rw-r--r--src/corelib/io/qfileinfo.cpp34
-rw-r--r--src/corelib/io/qfilesystemengine.cpp2
-rw-r--r--src/corelib/io/qfilesystemengine_p.h2
-rw-r--r--src/corelib/io/qfilesystemengine_unix.cpp21
-rw-r--r--src/corelib/io/qfilesystemmetadata_p.h4
-rw-r--r--src/corelib/io/qiodevice.cpp56
-rw-r--r--src/corelib/io/qiodevice_p.h5
-rw-r--r--src/corelib/io/qprocess.cpp34
-rw-r--r--src/corelib/io/qprocess_unix.cpp11
-rw-r--r--src/corelib/io/qresource.cpp2
-rw-r--r--src/corelib/io/qsettings.cpp106
-rw-r--r--src/corelib/io/qsettings_mac.cpp2
-rw-r--r--src/corelib/io/qstandardpaths.cpp2
-rw-r--r--src/corelib/io/qstandardpaths_json.cpp2
-rw-r--r--src/corelib/io/qtemporarydir.cpp6
-rw-r--r--src/corelib/io/qtemporaryfile.cpp2
-rw-r--r--src/corelib/io/qtextstream.cpp42
-rw-r--r--src/corelib/io/qurl.cpp209
-rw-r--r--src/corelib/io/qurl_p.h1
-rw-r--r--src/corelib/itemmodels/qabstractitemmodel.cpp48
-rw-r--r--src/corelib/itemmodels/qidentityproxymodel.cpp2
-rw-r--r--src/corelib/itemmodels/qitemselectionmodel.cpp12
-rw-r--r--src/corelib/itemmodels/qsortfilterproxymodel.cpp16
-rw-r--r--src/corelib/itemmodels/qstringlistmodel.cpp2
-rw-r--r--src/corelib/json/qjsonarray.cpp13
-rw-r--r--src/corelib/json/qjsondocument.cpp16
-rw-r--r--src/corelib/json/qjsonobject.cpp44
-rw-r--r--src/corelib/kernel/kernel.pri8
-rw-r--r--src/corelib/kernel/qabstracteventdispatcher.cpp4
-rw-r--r--src/corelib/kernel/qbasictimer.cpp8
-rw-r--r--src/corelib/kernel/qcore_mac_p.h2
-rw-r--r--src/corelib/kernel/qcoreapplication.cpp42
-rw-r--r--src/corelib/kernel/qeventdispatcher_blackberry.cpp262
-rw-r--r--src/corelib/kernel/qeventdispatcher_blackberry_p.h (renamed from src/plugins/platforms/openvglite/qwindowsurface_vglite.h)55
-rw-r--r--src/corelib/kernel/qeventloop.cpp2
-rw-r--r--src/corelib/kernel/qmetaobject.cpp153
-rw-r--r--src/corelib/kernel/qmetaobject.h22
-rw-r--r--src/corelib/kernel/qmetaobject_p.h7
-rw-r--r--src/corelib/kernel/qmetaobjectbuilder.cpp49
-rw-r--r--src/corelib/kernel/qmetaobjectbuilder_p.h2
-rw-r--r--src/corelib/kernel/qmetatype.cpp118
-rw-r--r--src/corelib/kernel/qmetatype.h69
-rw-r--r--src/corelib/kernel/qmetatype_p.h2
-rw-r--r--src/corelib/kernel/qmimedata.cpp16
-rw-r--r--src/corelib/kernel/qobject.cpp329
-rw-r--r--src/corelib/kernel/qobject.h5
-rw-r--r--src/corelib/kernel/qobject_impl.h425
-rw-r--r--src/corelib/kernel/qobject_p.h3
-rw-r--r--src/corelib/kernel/qobjectcleanuphandler.cpp2
-rw-r--r--src/corelib/kernel/qobjectdefs.h21
-rw-r--r--src/corelib/kernel/qobjectdefs_impl.h485
-rw-r--r--src/corelib/kernel/qpointer.cpp6
-rw-r--r--src/corelib/kernel/qsharedmemory.cpp14
-rw-r--r--src/corelib/kernel/qsignalmapper.cpp10
-rw-r--r--src/corelib/kernel/qsystemsemaphore.cpp6
-rw-r--r--src/corelib/kernel/qtimer.cpp18
-rw-r--r--src/corelib/kernel/qtranslator.cpp2
-rw-r--r--src/corelib/kernel/qvariant.cpp39
-rw-r--r--src/corelib/kernel/qwineventnotifier.cpp45
-rw-r--r--src/corelib/kernel/qwineventnotifier.h8
-rw-r--r--src/corelib/mimetypes/qmimedatabase.cpp2
-rw-r--r--src/corelib/mimetypes/qmimeglobpattern.cpp2
-rw-r--r--src/corelib/plugin/qfactoryloader.cpp29
-rw-r--r--src/corelib/plugin/qlibrary.cpp16
-rw-r--r--src/corelib/plugin/qlibrary.h3
-rw-r--r--src/corelib/plugin/qlibrary_unix.cpp12
-rw-r--r--src/corelib/plugin/qplugin.qdoc10
-rw-r--r--src/corelib/plugin/qpluginloader.h2
-rw-r--r--src/corelib/plugin/quuid.cpp6
-rw-r--r--src/corelib/statemachine/qstatemachine.cpp10
-rw-r--r--src/corelib/thread/qatomic.cpp77
-rw-r--r--src/corelib/thread/qatomic.h4
-rw-r--r--src/corelib/thread/qmutex.cpp42
-rw-r--r--src/corelib/thread/qmutex.h1
-rw-r--r--src/corelib/thread/qmutex_linux.cpp9
-rw-r--r--src/corelib/thread/qmutexpool.cpp4
-rw-r--r--src/corelib/thread/qreadwritelock.cpp24
-rw-r--r--src/corelib/thread/qsemaphore.cpp8
-rw-r--r--src/corelib/thread/qthread.cpp12
-rw-r--r--src/corelib/thread/qthread_unix.cpp27
-rw-r--r--src/corelib/thread/qthread_win.cpp2
-rw-r--r--src/corelib/thread/qthreadpool.cpp43
-rw-r--r--src/corelib/thread/qthreadpool.h3
-rw-r--r--src/corelib/thread/qthreadpool_p.h2
-rw-r--r--src/corelib/thread/qthreadstorage.cpp6
-rw-r--r--src/corelib/thread/qwaitcondition.qdoc8
-rw-r--r--src/corelib/tools/qalgorithms.qdoc52
-rw-r--r--src/corelib/tools/qarraydata.cpp2
-rw-r--r--src/corelib/tools/qarraydata.h2
-rw-r--r--src/corelib/tools/qbitarray.cpp34
-rw-r--r--src/corelib/tools/qbytearray.cpp125
-rw-r--r--src/corelib/tools/qcache.qdoc6
-rw-r--r--src/corelib/tools/qchar.cpp272
-rw-r--r--src/corelib/tools/qchar.h22
-rw-r--r--src/corelib/tools/qdatetime.cpp56
-rw-r--r--src/corelib/tools/qeasingcurve.cpp186
-rw-r--r--src/corelib/tools/qelapsedtimer.cpp6
-rw-r--r--src/corelib/tools/qelapsedtimer_generic.cpp4
-rw-r--r--src/corelib/tools/qhash.cpp57
-rw-r--r--src/corelib/tools/qhash.h28
-rw-r--r--src/corelib/tools/qiterator.qdoc104
-rw-r--r--src/corelib/tools/qlinkedlist.cpp40
-rw-r--r--src/corelib/tools/qlist.cpp58
-rw-r--r--src/corelib/tools/qlocale.cpp475
-rw-r--r--src/corelib/tools/qlocale.h21
-rw-r--r--src/corelib/tools/qlocale.qdoc8
-rw-r--r--src/corelib/tools/qlocale_data_p.h2
-rw-r--r--src/corelib/tools/qlocale_p.h126
-rw-r--r--src/corelib/tools/qlocale_unix.cpp2
-rw-r--r--src/corelib/tools/qmap.cpp60
-rw-r--r--src/corelib/tools/qpair.qdoc12
-rw-r--r--src/corelib/tools/qpoint.cpp42
-rw-r--r--src/corelib/tools/qpoint.h52
-rw-r--r--src/corelib/tools/qqueue.cpp2
-rw-r--r--src/corelib/tools/qrect.cpp16
-rw-r--r--src/corelib/tools/qrect.h212
-rw-r--r--src/corelib/tools/qregexp.cpp68
-rw-r--r--src/corelib/tools/qregexp.h6
-rw-r--r--src/corelib/tools/qregularexpression.cpp64
-rw-r--r--src/corelib/tools/qscopedpointer.cpp12
-rw-r--r--src/corelib/tools/qset.qdoc30
-rw-r--r--src/corelib/tools/qshareddata.cpp18
-rw-r--r--src/corelib/tools/qsimd.cpp278
-rw-r--r--src/corelib/tools/qsimd_p.h5
-rw-r--r--src/corelib/tools/qsize.cpp24
-rw-r--r--src/corelib/tools/qsize.h74
-rw-r--r--src/corelib/tools/qstack.cpp2
-rw-r--r--src/corelib/tools/qstring.cpp307
-rw-r--r--src/corelib/tools/qstring.h53
-rw-r--r--src/corelib/tools/qstringbuilder.cpp2
-rw-r--r--src/corelib/tools/qstringlist.cpp38
-rw-r--r--src/corelib/tools/qtimeline.cpp2
-rw-r--r--src/corelib/tools/qunicodetables.cpp60
-rw-r--r--src/corelib/tools/qunicodetables_p.h4
-rw-r--r--src/corelib/tools/qvarlengtharray.h3
-rw-r--r--src/corelib/tools/qvarlengtharray.qdoc8
-rw-r--r--src/corelib/tools/qvector.cpp36
-rw-r--r--src/corelib/xml/qxmlstream.cpp12
-rw-r--r--src/corelib/xml/qxmlutils.cpp14
-rw-r--r--src/dbus/qdbus_symbols.cpp2
-rw-r--r--src/dbus/qdbusabstractadaptor.cpp6
-rw-r--r--src/dbus/qdbusabstractinterface.cpp14
-rw-r--r--src/dbus/qdbusabstractinterface.h4
-rw-r--r--src/dbus/qdbusconnection_p.h4
-rw-r--r--src/dbus/qdbusconnectioninterface.cpp49
-rw-r--r--src/dbus/qdbusconnectioninterface.h4
-rw-r--r--src/dbus/qdbusdemarshaller.cpp2
-rw-r--r--src/dbus/qdbusintegrator.cpp14
-rw-r--r--src/dbus/qdbusmetaobject.cpp4
-rw-r--r--src/gui/accessible/qaccessible.cpp25
-rw-r--r--src/gui/accessible/qaccessible.h25
-rw-r--r--src/gui/accessible/qaccessibleobject.cpp2
-rw-r--r--src/gui/accessible/qplatformaccessibility_qpa.cpp9
-rw-r--r--src/gui/accessible/qplatformaccessibility_qpa.h11
-rw-r--r--src/gui/image/qimage.cpp15
-rw-r--r--src/gui/image/qimage.h21
-rw-r--r--src/gui/image/qimage_p.h10
-rw-r--r--src/gui/image/qimagepixmapcleanuphooks.cpp18
-rw-r--r--src/gui/image/qimagereader.cpp6
-rw-r--r--src/gui/image/qpixmap.cpp4
-rw-r--r--src/gui/image/qpixmap.h6
-rw-r--r--src/gui/image/qplatformpixmap.cpp9
-rw-r--r--src/gui/image/qpnghandler.cpp228
-rw-r--r--src/gui/kernel/kernel.pri2
-rw-r--r--src/gui/kernel/qclipboard.cpp11
-rw-r--r--src/gui/kernel/qclipboard.h5
-rw-r--r--src/gui/kernel/qclipboard_qpa.cpp14
-rw-r--r--src/gui/kernel/qevent.cpp32
-rw-r--r--src/gui/kernel/qevent.h24
-rw-r--r--src/gui/kernel/qguiapplication.cpp63
-rw-r--r--src/gui/kernel/qguiapplication.h6
-rw-r--r--src/gui/kernel/qguiapplication_p.h2
-rw-r--r--src/gui/kernel/qinputmethod.cpp14
-rw-r--r--src/gui/kernel/qinputmethod.h2
-rw-r--r--src/gui/kernel/qinputmethod_p.h11
-rw-r--r--src/gui/kernel/qkeysequence.cpp24
-rw-r--r--src/gui/kernel/qplatformclipboard_qpa.cpp10
-rw-r--r--src/gui/kernel/qplatformclipboard_qpa.h11
-rw-r--r--src/gui/kernel/qplatformcursor_qpa.cpp8
-rw-r--r--src/gui/kernel/qplatformcursor_qpa.h11
-rw-r--r--src/gui/kernel/qplatformdialoghelper_qpa.cpp29
-rw-r--r--src/gui/kernel/qplatformdialoghelper_qpa.h20
-rw-r--r--src/gui/kernel/qplatformdrag_qpa.cpp9
-rw-r--r--src/gui/kernel/qplatformdrag_qpa.h11
-rw-r--r--src/gui/kernel/qplatforminputcontext_qpa.cpp4
-rw-r--r--src/gui/kernel/qplatforminputcontext_qpa.h11
-rw-r--r--src/gui/kernel/qplatformintegration_qpa.h11
-rw-r--r--src/gui/kernel/qplatformnativeinterface_qpa.cpp35
-rw-r--r--src/gui/kernel/qplatformnativeinterface_qpa.h20
-rw-r--r--src/gui/kernel/qplatformopenglcontext_qpa.h11
-rw-r--r--src/gui/kernel/qplatformscreen_qpa.h11
-rw-r--r--src/gui/kernel/qplatformscreenpageflipper_qpa.cpp21
-rw-r--r--src/gui/kernel/qplatformscreenpageflipper_qpa.h11
-rw-r--r--src/gui/kernel/qplatformservices_qpa.h11
-rw-r--r--src/gui/kernel/qplatformsharedgraphicscache_qpa.h11
-rw-r--r--src/gui/kernel/qplatformsurface_qpa.cpp9
-rw-r--r--src/gui/kernel/qplatformsurface_qpa.h11
-rw-r--r--src/gui/kernel/qplatformtheme_qpa.h11
-rw-r--r--src/gui/kernel/qplatformthemeplugin_qpa.cpp9
-rw-r--r--src/gui/kernel/qplatformwindow_qpa.cpp24
-rw-r--r--src/gui/kernel/qplatformwindow_qpa.h15
-rw-r--r--src/gui/opengl/opengl.pri2
-rw-r--r--src/gui/opengl/qopenglshaderprogram.cpp7
-rw-r--r--src/gui/opengl/qopengltextureglyphcache.cpp4
-rw-r--r--src/gui/opengl/qtriangulator.cpp2
-rw-r--r--src/gui/painting/qbrush.cpp2
-rw-r--r--src/gui/painting/qdrawhelper.cpp135
-rw-r--r--src/gui/painting/qdrawhelper_p.h8
-rw-r--r--src/gui/painting/qmatrix.h14
-rw-r--r--src/gui/painting/qpainter.cpp2
-rw-r--r--src/gui/painting/qplatformbackingstore_qpa.h11
-rw-r--r--src/gui/painting/qrgb.h18
-rw-r--r--src/gui/painting/qtransform.h26
-rw-r--r--src/gui/text/qcssparser.cpp2
-rw-r--r--src/gui/text/qfont.cpp74
-rw-r--r--src/gui/text/qfont.h5
-rw-r--r--src/gui/text/qplatformfontdatabase_qpa.cpp8
-rw-r--r--src/gui/text/qplatformfontdatabase_qpa.h11
-rw-r--r--src/gui/text/qtextdocument.cpp2
-rw-r--r--src/gui/text/qtextengine.cpp63
-rw-r--r--src/gui/text/qtextlayout.cpp8
-rw-r--r--src/gui/text/qzip.cpp11
-rw-r--r--src/gui/util/qdesktopservices.cpp8
-rw-r--r--src/gui/util/qdesktopservices.h5
-rw-r--r--src/gui/util/qvalidator.cpp11
-rw-r--r--src/modules/qt_platformsupport.pri2
-rw-r--r--src/network/access/qftp.cpp21
-rw-r--r--src/network/access/qhttpmultipart.cpp4
-rw-r--r--src/network/access/qnetworkaccessftpbackend.cpp3
-rw-r--r--src/network/access/qnetworkaccessmanager.cpp4
-rw-r--r--src/network/access/qnetworkreplyhttpimpl.cpp31
-rw-r--r--src/network/access/qnetworkreplyhttpimpl_p.h3
-rw-r--r--src/network/access/qnetworkreplyimpl.cpp35
-rw-r--r--src/network/access/qnetworkreplyimpl_p.h3
-rw-r--r--src/network/bearer/qnetworksession.cpp13
-rw-r--r--src/network/bearer/qnetworksession.h4
-rw-r--r--src/network/doc/doc.pri3
-rw-r--r--src/network/doc/qtnetwork.qdocconf92
-rw-r--r--src/network/kernel/kernel.pri8
-rw-r--r--src/network/kernel/qdnslookup_android.cpp54
-rw-r--r--src/network/kernel/qhostinfo_unix.cpp2
-rw-r--r--src/network/kernel/qnetworkfunctions_wince.h88
-rw-r--r--src/network/kernel/qnetworkinterface_unix.cpp5
-rw-r--r--src/network/kernel/qnetworkproxy_generic.cpp38
-rw-r--r--src/network/kernel/qnetworkproxy_win.cpp22
-rw-r--r--src/network/network.pro1
-rw-r--r--src/network/socket/qnativesocketengine_unix.cpp6
-rw-r--r--src/network/ssl/qsslcertificate.cpp4
-rw-r--r--src/network/ssl/qsslcertificateextension.cpp9
-rw-r--r--src/network/ssl/qsslsocket.cpp51
-rw-r--r--src/network/ssl/qsslsocket_openssl.cpp16
-rw-r--r--src/network/ssl/qsslsocket_openssl_symbols.cpp65
-rw-r--r--src/network/ssl/qsslsocket_openssl_symbols_p.h1
-rw-r--r--src/network/ssl/qsslsocket_p.h23
-rw-r--r--src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp4
-rw-r--r--src/opengl/gl2paintengineex/qtextureglyphcache_gl_p.h2
-rw-r--r--src/opengl/qgl.cpp7
-rw-r--r--src/opengl/qgl.h2
-rw-r--r--src/platformsupport/cglconvenience/cglconvenience.pri2
-rw-r--r--src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm6
-rw-r--r--src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h2
-rw-r--r--src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm2
-rw-r--r--src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h2
-rw-r--r--src/platformsupport/udev/qudevicehelper.cpp19
-rw-r--r--src/platformsupport/udev/qudevicehelper_p.h5
-rw-r--r--src/plugins/accessible/widgets/complexwidgets.cpp2
-rw-r--r--src/plugins/accessible/widgets/itemviews.cpp4
-rw-r--r--src/plugins/accessible/widgets/qaccessiblemenu.cpp2
-rw-r--r--src/plugins/bearer/connman/qconnmanservice_linux.cpp68
-rw-r--r--src/plugins/bearer/connman/qconnmanservice_linux_p.h20
-rw-r--r--src/plugins/bearer/connman/qofonoservice_linux.cpp274
-rw-r--r--src/plugins/bearer/connman/qofonoservice_linux_p.h32
-rw-r--r--src/plugins/generic/evdevmouse/qevdevmousehandler.cpp24
-rw-r--r--src/plugins/generic/evdevmouse/qevdevmousehandler.h3
-rw-r--r--src/plugins/generic/evdevtouch/qevdevtouch.cpp3
-rw-r--r--src/plugins/platforms/cocoa/qcocoabackingstore.h1
-rw-r--r--src/plugins/platforms/cocoa/qcocoabackingstore.mm10
-rw-r--r--src/plugins/platforms/cocoa/qcocoacolordialoghelper.h4
-rw-r--r--src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm14
-rw-r--r--src/plugins/platforms/cocoa/qcocoaeventdispatcher.h11
-rw-r--r--src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm154
-rw-r--r--src/plugins/platforms/cocoa/qcocoafiledialoghelper.h4
-rw-r--r--src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm20
-rw-r--r--src/plugins/platforms/cocoa/qcocoafontdialoghelper.h4
-rw-r--r--src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm14
-rw-r--r--src/plugins/platforms/cocoa/qcocoaprintersupport.h8
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.h7
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.mm123
-rw-r--r--src/plugins/platforms/cocoa/qnsview.h5
-rw-r--r--src/plugins/platforms/cocoa/qnsview.mm95
-rw-r--r--src/plugins/platforms/directfb/qdirectfbinput.h4
-rw-r--r--src/plugins/platforms/eglfs/eglfs.pro2
-rw-r--r--src/plugins/platforms/eglfs/qeglfsbackingstore.cpp144
-rw-r--r--src/plugins/platforms/eglfs/qeglfsbackingstore.h17
-rw-r--r--src/plugins/platforms/eglfs/qeglfshooks_stub.cpp4
-rw-r--r--src/plugins/platforms/eglfs/qeglfshooks_x11.cpp3
-rw-r--r--src/plugins/platforms/eglfs/qeglfsscreen.cpp14
-rw-r--r--src/plugins/platforms/eglfs/qeglfswindow.cpp11
-rw-r--r--src/plugins/platforms/eglfs/qeglfswindow.h1
-rw-r--r--src/plugins/platforms/openkode/openkode.pro42
-rw-r--r--src/plugins/platforms/openkode/openkodekeytranslator.h244
-rw-r--r--src/plugins/platforms/openkode/qopenkodeeventloopintegration.cpp128
-rw-r--r--src/plugins/platforms/openkode/qopenkodeintegration.cpp247
-rw-r--r--src/plugins/platforms/openkode/qopenkodeintegration.h120
-rw-r--r--src/plugins/platforms/openkode/qopenkodewindow.cpp315
-rw-r--r--src/plugins/platforms/openkode/qopenkodewindow.h89
-rw-r--r--src/plugins/platforms/openkode/resources.qrc6
-rw-r--r--src/plugins/platforms/openvglite/openvglite.pro12
-rw-r--r--src/plugins/platforms/openvglite/qgraphicssystem_vglite.cpp193
-rw-r--r--src/plugins/platforms/openvglite/qwindowsurface_vglite.cpp131
-rw-r--r--src/plugins/platforms/platforms.pro2
-rw-r--r--src/plugins/platforms/qnx/main.cpp11
-rw-r--r--src/plugins/platforms/qnx/main.h (renamed from src/plugins/platforms/openkode/shaders/vert.glslv)26
-rw-r--r--src/plugins/platforms/qnx/qnx.json3
-rw-r--r--src/plugins/platforms/qnx/qnx.pro107
-rw-r--r--src/plugins/platforms/qnx/qqnxabstractnavigator.cpp74
-rw-r--r--src/plugins/platforms/qnx/qqnxabstractnavigator.h66
-rw-r--r--src/plugins/platforms/qnx/qqnxbpseventfilter.cpp204
-rw-r--r--src/plugins/platforms/qnx/qqnxbpseventfilter.h (renamed from src/plugins/platforms/qvfb/qvfbwindowsurface.h)53
-rw-r--r--src/plugins/platforms/qnx/qqnxclipboard.cpp2
-rw-r--r--src/plugins/platforms/qnx/qqnxeventdispatcher_blackberry.cpp (renamed from src/plugins/platforms/qvfb/main.cpp)47
-rw-r--r--src/plugins/platforms/qnx/qqnxeventdispatcher_blackberry.h66
-rw-r--r--src/plugins/platforms/qnx/qqnxglcontext.cpp1
-rw-r--r--src/plugins/platforms/qnx/qqnxintegration.cpp152
-rw-r--r--src/plugins/platforms/qnx/qqnxintegration.h45
-rw-r--r--src/plugins/platforms/qnx/qqnxnavigatorbps.cpp (renamed from src/plugins/platforms/openvglite/main.cpp)41
-rw-r--r--src/plugins/platforms/qnx/qqnxnavigatorbps.h62
-rw-r--r--src/plugins/platforms/qnx/qqnxnavigatorpps.cpp192
-rw-r--r--src/plugins/platforms/qnx/qqnxnavigatorpps.h (renamed from src/plugins/platforms/openkode/main.cpp)45
-rw-r--r--src/plugins/platforms/qnx/qqnxscreeneventthread.cpp (renamed from src/plugins/platforms/qnx/qqnxeventthread.cpp)45
-rw-r--r--src/plugins/platforms/qnx/qqnxscreeneventthread.h (renamed from src/plugins/platforms/qnx/qqnxeventthread.h)12
-rw-r--r--src/plugins/platforms/qnx/qqnxservices.cpp17
-rw-r--r--src/plugins/platforms/qnx/qqnxservices.h7
-rw-r--r--src/plugins/platforms/qnx/qqnxvirtualkeyboardbps.cpp209
-rw-r--r--src/plugins/platforms/qnx/qqnxvirtualkeyboardbps.h (renamed from src/plugins/platforms/openkode/qopenkodeeventloopintegration.h)39
-rw-r--r--src/plugins/platforms/qnx/qqnxvirtualkeyboardpps.cpp (renamed from src/plugins/platforms/qnx/qqnxvirtualkeyboard.cpp)65
-rw-r--r--src/plugins/platforms/qnx/qqnxvirtualkeyboardpps.h (renamed from src/plugins/platforms/qnx/qqnxvirtualkeyboard.h)13
-rw-r--r--src/plugins/platforms/qnx/qqnxwindow.cpp16
-rw-r--r--src/plugins/platforms/qnx/qqnxwindow.h10
-rw-r--r--src/plugins/platforms/qvfb/qvfb.pro14
-rw-r--r--src/plugins/platforms/qvfb/qvfbintegration.cpp454
-rw-r--r--src/plugins/platforms/qvfb/qvfbintegration.h102
-rw-r--r--src/plugins/platforms/qvfb/qvfbwindowsurface.cpp108
-rw-r--r--src/plugins/platforms/windows/accessible/comutils.cpp4
-rw-r--r--src/plugins/platforms/windows/accessible/comutils.h4
-rw-r--r--src/plugins/platforms/windows/accessible/iaccessible2.cpp27
-rw-r--r--src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp12
-rw-r--r--src/plugins/platforms/windows/accessible/qwindowsaccessibility.h2
-rw-r--r--src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp10
-rw-r--r--src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.h5
-rw-r--r--src/plugins/platforms/windows/main.cpp4
-rw-r--r--src/plugins/platforms/windows/qwindowsbackingstore.cpp5
-rw-r--r--src/plugins/platforms/windows/qwindowsclipboard.cpp2
-rw-r--r--src/plugins/platforms/windows/qwindowscontext.cpp6
-rw-r--r--src/plugins/platforms/windows/qwindowsdialoghelpers.cpp6
-rw-r--r--src/plugins/platforms/windows/qwindowsdialoghelpers.h4
-rw-r--r--src/plugins/platforms/windows/qwindowsfontdatabase.cpp608
-rw-r--r--src/plugins/platforms/windows/qwindowsfontdatabase.h9
-rw-r--r--src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp4
-rw-r--r--src/plugins/platforms/windows/qwindowsfontengine.cpp17
-rw-r--r--src/plugins/platforms/windows/qwindowsfontengine.h6
-rw-r--r--src/plugins/platforms/windows/qwindowsglcontext.cpp2
-rw-r--r--src/plugins/platforms/windows/qwindowsglcontext.h1
-rw-r--r--src/plugins/platforms/windows/qwindowsintegration.cpp13
-rw-r--r--src/plugins/platforms/windows/qwindowsintegration.h2
-rw-r--r--src/plugins/platforms/windows/qwindowswindow.cpp4
-rw-r--r--src/plugins/platforms/windows/windows.pro3
-rw-r--r--src/plugins/platforms/xcb/qxcbnativeinterface.cpp1
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.cpp2
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.h2
-rw-r--r--src/printsupport/dialogs/qabstractpagesetupdialog.h2
-rw-r--r--src/printsupport/dialogs/qabstractprintdialog.h2
-rw-r--r--src/printsupport/dialogs/qprintdialog_unix.cpp2
-rw-r--r--src/printsupport/kernel/qplatformprintersupport_qpa.cpp14
-rw-r--r--src/sql/doc/doc.pri3
-rw-r--r--src/sql/doc/images/foreignkeys.pngbin0 -> 3739 bytes
-rw-r--r--src/sql/doc/images/insertrowinmodelview.png (renamed from doc/src/images/insertrowinmodelview.png)bin3867 -> 3867 bytes
-rw-r--r--src/sql/doc/images/noforeignkeys.pngbin0 -> 3282 bytes
-rw-r--r--src/sql/doc/images/qdatawidgetmapper-simple.png (renamed from doc/src/images/qdatawidgetmapper-simple.png)bin26994 -> 26994 bytes
-rw-r--r--src/sql/doc/images/relationaltable.png (renamed from doc/src/images/relationaltable.png)bin4274 -> 4274 bytes
-rw-r--r--src/sql/doc/qtsql.qdocconf92
-rw-r--r--src/sql/doc/snippets/code/doc_src_qtsql.cpp (renamed from doc/src/snippets/code/doc_src_qtsql.cpp)0
-rw-r--r--src/sql/doc/snippets/code/doc_src_qtsql.pro3
-rw-r--r--src/sql/doc/snippets/code/doc_src_sql-driver.cpp (renamed from doc/src/snippets/code/doc_src_sql-driver.cpp)0
-rw-r--r--src/sql/doc/snippets/code/doc_src_sql-driver.qdoc (renamed from doc/src/snippets/code/doc_src_sql-driver.qdoc)0
-rw-r--r--src/sql/doc/snippets/code/src_sql_kernel_qsqldatabase.cpp (renamed from doc/src/snippets/code/src_sql_kernel_qsqldatabase.cpp)0
-rw-r--r--src/sql/doc/snippets/code/src_sql_kernel_qsqldriver.cpp (renamed from doc/src/snippets/code/src_sql_kernel_qsqldriver.cpp)0
-rw-r--r--src/sql/doc/snippets/code/src_sql_kernel_qsqlerror.cpp (renamed from doc/src/snippets/code/src_sql_kernel_qsqlerror.cpp)0
-rw-r--r--src/sql/doc/snippets/code/src_sql_kernel_qsqlquery.cpp (renamed from doc/src/snippets/code/src_sql_kernel_qsqlquery.cpp)0
-rw-r--r--src/sql/doc/snippets/code/src_sql_kernel_qsqlresult.cpp (renamed from doc/src/snippets/code/src_sql_kernel_qsqlresult.cpp)0
-rw-r--r--src/sql/doc/snippets/code/src_sql_models_qsqlquerymodel.cpp (renamed from doc/src/snippets/code/src_sql_models_qsqlquerymodel.cpp)0
-rw-r--r--src/sql/doc/snippets/sqldatabase/sqldatabase.cpp (renamed from doc/src/snippets/sqldatabase/sqldatabase.cpp)0
-rw-r--r--src/sql/doc/src/qsqldatatype-table.qdoc (renamed from doc/src/sql/sql-programming/qsqldatatype-table.qdoc)0
-rw-r--r--src/sql/doc/src/qtsql.qdoc (renamed from doc/src/sql/qtsql.qdoc)4
-rw-r--r--src/sql/doc/src/sql-driver.qdoc (renamed from doc/src/sql/sql-programming/sql-driver.qdoc)72
-rw-r--r--src/sql/doc/src/sql-programming.qdoc (renamed from doc/src/sql/sql-programming/sql-programming.qdoc)64
-rw-r--r--src/sql/drivers/mysql/qsql_mysql.cpp2
-rw-r--r--src/sql/drivers/odbc/qsql_odbc.cpp16
-rw-r--r--src/sql/kernel/qsql.qdoc2
-rw-r--r--src/sql/kernel/qsqldatabase.cpp60
-rw-r--r--src/sql/kernel/qsqldriver.cpp42
-rw-r--r--src/sql/kernel/qsqlerror.cpp12
-rw-r--r--src/sql/kernel/qsqlfield.cpp59
-rw-r--r--src/sql/kernel/qsqlquery.cpp69
-rw-r--r--src/sql/kernel/qsqlrecord.cpp20
-rw-r--r--src/sql/kernel/qsqlresult.cpp6
-rw-r--r--src/sql/models/qsqlquerymodel.cpp99
-rw-r--r--src/sql/models/qsqlquerymodel.h2
-rw-r--r--src/sql/models/qsqlquerymodel_p.h3
-rw-r--r--src/sql/models/qsqlrelationaldelegate.cpp2
-rw-r--r--src/sql/models/qsqlrelationaltablemodel.cpp12
-rw-r--r--src/sql/models/qsqltablemodel.cpp21
-rw-r--r--src/sql/sql.pro1
-rw-r--r--src/src.pro2
-rw-r--r--src/testlib/qbenchmarkvalgrind.cpp6
-rw-r--r--src/testlib/qtestcase.cpp78
-rw-r--r--src/testlib/qtestkeyboard.h2
-rw-r--r--src/testlib/qtesttouch.h31
-rw-r--r--src/testlib/testlib.pro7
-rw-r--r--src/tools/moc/generator.cpp30
-rw-r--r--src/tools/moc/outputrevision.h2
-rw-r--r--src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp2
-rw-r--r--src/tools/qdoc/config.cpp1
-rw-r--r--src/tools/qdoc/config.h2
-rw-r--r--src/tools/qdoc/ditaxmlgenerator.cpp505
-rw-r--r--src/tools/qdoc/ditaxmlgenerator.h49
-rw-r--r--src/tools/qdoc/generator.cpp180
-rw-r--r--src/tools/qdoc/generator.h13
-rw-r--r--src/tools/qdoc/helpprojectwriter.cpp30
-rw-r--r--src/tools/qdoc/htmlgenerator.cpp182
-rw-r--r--src/tools/qdoc/htmlgenerator.h3
-rw-r--r--src/tools/qdoc/main.cpp62
-rw-r--r--src/tools/qdoc/node.cpp127
-rw-r--r--src/tools/qdoc/node.h25
-rw-r--r--src/tools/qdoc/puredocparser.cpp2
-rw-r--r--src/tools/qdoc/qdoc.pro10
-rw-r--r--src/tools/qdoc/tree.cpp31
-rw-r--r--src/widgets/accessible/qaccessiblewidget.cpp9
-rw-r--r--src/widgets/dialogs/dialogs.pri21
-rw-r--r--src/widgets/dialogs/qcolordialog.cpp5
-rw-r--r--src/widgets/dialogs/qcolordialog_mac.mm505
-rw-r--r--src/widgets/dialogs/qdialog.cpp6
-rw-r--r--src/widgets/dialogs/qfiledialog_mac.mm741
-rw-r--r--src/widgets/dialogs/qfilesystemmodel.cpp3
-rw-r--r--src/widgets/dialogs/qfontdialog.cpp21
-rw-r--r--src/widgets/dialogs/qfontdialog_mac.mm676
-rw-r--r--src/widgets/dialogs/qfontdialog_p.h2
-rw-r--r--src/widgets/dialogs/qmessagebox.cpp2
-rw-r--r--src/widgets/dialogs/qnspanelproxy_mac.mm228
-rw-r--r--src/widgets/graphicsview/qgraph_p.h12
-rw-r--r--src/widgets/graphicsview/qgraphicsanchorlayout_p.cpp22
-rw-r--r--src/widgets/graphicsview/qgraphicsanchorlayout_p.h10
-rw-r--r--src/widgets/graphicsview/qgraphicswidget.cpp2
-rw-r--r--src/widgets/graphicsview/qgridlayoutengine.cpp6
-rw-r--r--src/widgets/graphicsview/qsimplex_p.cpp6
-rw-r--r--src/widgets/graphicsview/qsimplex_p.h10
-rw-r--r--src/widgets/itemviews/qtreeview.cpp52
-rw-r--r--src/widgets/itemviews/qtreeview_p.h2
-rw-r--r--src/widgets/kernel/qapplication.cpp16
-rw-r--r--src/widgets/kernel/qapplication.h14
-rw-r--r--src/widgets/kernel/qapplication_p.h7
-rw-r--r--src/widgets/kernel/qicon.cpp2
-rw-r--r--src/widgets/kernel/qiconloader.cpp2
-rw-r--r--src/widgets/kernel/qlayoutitem.cpp4
-rw-r--r--src/widgets/kernel/qplatformmenu_qpa.cpp36
-rw-r--r--src/widgets/kernel/qwhatsthis.cpp5
-rw-r--r--src/widgets/kernel/qwidget.cpp28
-rw-r--r--src/widgets/kernel/qwidget_p.h2
-rw-r--r--src/widgets/kernel/qwidget_qpa.cpp1
-rw-r--r--src/widgets/kernel/qwidgetsvariant.cpp3
-rw-r--r--src/widgets/kernel/qwidgetwindow_qpa.cpp2
-rw-r--r--src/widgets/styles/qgtkstyle.cpp2
-rw-r--r--src/widgets/styles/qgtkstyle_p.cpp32
-rw-r--r--src/widgets/styles/qgtkstyle_p.h1
-rw-r--r--src/widgets/styles/qplastiquestyle.cpp8
-rw-r--r--src/widgets/styles/qstylesheetstyle.cpp2
-rw-r--r--src/widgets/styles/qwindowsvistastyle.cpp18
-rw-r--r--src/widgets/styles/qwindowsxpstyle.cpp48
-rw-r--r--src/widgets/styles/styles.pri4
-rw-r--r--src/widgets/widgets/qabstractspinbox.cpp14
-rw-r--r--src/widgets/widgets/qdatetimeedit.cpp2
-rw-r--r--src/widgets/widgets/qdialogbuttonbox.cpp4
-rw-r--r--src/widgets/widgets/qprogressbar.cpp6
-rw-r--r--src/widgets/widgets/qsplitter.cpp2
-rw-r--r--src/xml/doc/doc.pri3
-rw-r--r--src/xml/doc/qtxml.qdocconf92
-rw-r--r--src/xml/doc/snippets/code/doc_src_qtxml.cpp (renamed from doc/src/snippets/code/doc_src_qtxml.cpp)0
-rw-r--r--src/xml/doc/snippets/code/doc_src_qtxml.pro3
-rw-r--r--src/xml/doc/snippets/code/doc_src_qtxml.qdoc102
-rw-r--r--src/xml/doc/snippets/code/src_xml_dom_qdom.cpp (renamed from doc/src/snippets/code/src_xml_dom_qdom.cpp)0
-rw-r--r--src/xml/doc/snippets/code/src_xml_sax_qxml.cpp (renamed from doc/src/snippets/code/src_xml_sax_qxml.cpp)0
-rw-r--r--src/xml/doc/snippets/rsslisting/handler.cpp (renamed from doc/src/snippets/xml/rsslisting/handler.cpp)0
-rw-r--r--src/xml/doc/snippets/rsslisting/rsslisting.cpp (renamed from doc/src/snippets/xml/rsslisting/rsslisting.cpp)0
-rw-r--r--src/xml/doc/snippets/simpleparse/main.cpp (renamed from doc/src/snippets/xml/simpleparse/main.cpp)0
-rw-r--r--src/xml/doc/src/external-resources.qdoc36
-rw-r--r--src/xml/doc/src/qtxml.qdoc (renamed from doc/src/xml/qtxml.qdoc)8
-rw-r--r--src/xml/doc/src/xml-processing.qdoc613
-rw-r--r--src/xml/dom/qdom.cpp214
-rw-r--r--src/xml/sax/qxml.cpp25
-rw-r--r--src/xml/xml.pro1
-rw-r--r--tests/auto/auto.pro10
-rw-r--r--tests/auto/cmake/CMakeLists.txt (renamed from tests/manual/cmake/CMakeLists.txt)13
-rw-r--r--tests/auto/cmake/cmake.pro54
-rw-r--r--tests/auto/cmake/fail4/CMakeLists.txt (renamed from tests/manual/cmake/fail4/CMakeLists.txt)0
-rw-r--r--tests/auto/cmake/fail4/myobject.cpp (renamed from tests/manual/cmake/fail4/myobject.cpp)0
-rw-r--r--tests/auto/cmake/fail4/myobject.h (renamed from tests/manual/cmake/fail4/myobject.h)0
-rw-r--r--tests/auto/cmake/fail4/pass4.qrc (renamed from tests/manual/cmake/fail4/pass4.qrc)0
-rw-r--r--tests/auto/cmake/fail4/resource_file.txt (renamed from tests/manual/cmake/fail4/resource_file.txt)0
-rw-r--r--tests/auto/cmake/fail5/CMakeLists.txt (renamed from tests/manual/cmake/fail5/CMakeLists.txt)0
-rw-r--r--tests/auto/cmake/fail5/myobject.cpp (renamed from tests/manual/cmake/fail5/myobject.cpp)0
-rw-r--r--tests/auto/cmake/fail5/myobject.h (renamed from tests/manual/cmake/fail5/myobject.h)0
-rw-r--r--tests/auto/cmake/pass(needsquoting)6/CMakeLists.txt (renamed from tests/manual/cmake/pass(needsquoting)6/CMakeLists.txt)0
-rw-r--r--tests/auto/cmake/pass(needsquoting)6/mywidget.cpp (renamed from tests/manual/cmake/pass(needsquoting)6/mywidget.cpp)0
-rw-r--r--tests/auto/cmake/pass(needsquoting)6/mywidget.h (renamed from tests/manual/cmake/pass(needsquoting)6/mywidget.h)0
-rw-r--r--tests/auto/cmake/pass(needsquoting)6/mywidget.ui (renamed from tests/manual/cmake/pass(needsquoting)6/mywidget.ui)0
-rw-r--r--tests/auto/cmake/pass1/CMakeLists.txt (renamed from tests/manual/cmake/pass1/CMakeLists.txt)0
-rw-r--r--tests/auto/cmake/pass1/three.cpp (renamed from tests/manual/cmake/pass1/three.cpp)0
-rw-r--r--tests/auto/cmake/pass1/two.cpp (renamed from tests/manual/cmake/pass1/two.cpp)0
-rw-r--r--tests/auto/cmake/pass2/CMakeLists.txt (renamed from tests/manual/cmake/pass2/CMakeLists.txt)0
-rw-r--r--tests/auto/cmake/pass2/myobject.cpp (renamed from tests/manual/cmake/pass2/myobject.cpp)0
-rw-r--r--tests/auto/cmake/pass2/myobject.h (renamed from tests/manual/cmake/pass2/myobject.h)0
-rw-r--r--tests/auto/cmake/pass2/pass2.qrc (renamed from tests/manual/cmake/pass2/pass2.qrc)0
-rw-r--r--tests/auto/cmake/pass2/resource_file.txt (renamed from tests/manual/cmake/pass2/resource_file.txt)0
-rw-r--r--tests/auto/cmake/pass3/CMakeLists.txt (renamed from tests/manual/cmake/pass3/CMakeLists.txt)0
-rw-r--r--tests/auto/cmake/pass3/mywidget.cpp (renamed from tests/manual/cmake/pass3/mywidget.cpp)0
-rw-r--r--tests/auto/cmake/pass3/mywidget.h (renamed from tests/manual/cmake/pass3/mywidget.h)0
-rw-r--r--tests/auto/cmake/pass3/mywidget.ui (renamed from tests/manual/cmake/pass3/mywidget.ui)0
-rw-r--r--tests/auto/cmake/pass7/CMakeLists.txt (renamed from tests/manual/cmake/pass7/CMakeLists.txt)0
-rw-r--r--tests/auto/cmake/pass7/main.cpp (renamed from tests/manual/cmake/pass7/main.cpp)0
-rw-r--r--tests/auto/cmake/pass8/CMakeLists.txt (renamed from tests/manual/cmake/pass8/CMakeLists.txt)0
-rw-r--r--tests/auto/cmake/pass8/myobject.cpp (renamed from tests/manual/cmake/pass8/myobject.cpp)0
-rw-r--r--tests/auto/cmake/pass8/myobject.h (renamed from tests/manual/cmake/pass8/myobject.h)0
-rw-r--r--tests/auto/cmake/pass9/CMakeLists.txt (renamed from tests/manual/cmake/pass9/CMakeLists.txt)8
-rw-r--r--tests/auto/cmake/pass9/mydbusobject.cpp (renamed from tests/manual/cmake/pass9/mydbusobject.cpp)0
-rw-r--r--tests/auto/cmake/pass9/mydbusobject.h (renamed from tests/manual/cmake/pass9/mydbusobject.h)0
-rw-r--r--tests/auto/concurrent/qtconcurrentfilter/qtconcurrentfilter.pro2
-rw-r--r--tests/auto/concurrent/qtconcurrentfilter/tst_qtconcurrentfilter.cpp2
-rw-r--r--tests/auto/corelib/animation/qanimationgroup/tst_qanimationgroup.cpp8
-rw-r--r--tests/auto/corelib/animation/qparallelanimationgroup/tst_qparallelanimationgroup.cpp66
-rw-r--r--tests/auto/corelib/animation/qpropertyanimation/tst_qpropertyanimation.cpp22
-rw-r--r--tests/auto/corelib/animation/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp50
-rw-r--r--tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp8
-rw-r--r--tests/auto/corelib/io/qprocess/test/test.pro4
-rw-r--r--tests/auto/corelib/io/qprocess/tst_qprocess.cpp16
-rw-r--r--tests/auto/corelib/io/qsettings/tst_qsettings.cpp7
-rw-r--r--tests/auto/corelib/io/qtextstream/tst_qtextstream.cpp46
-rw-r--r--tests/auto/corelib/io/qurl/tst_qurl.cpp22
-rw-r--r--tests/auto/corelib/itemmodels/itemmodels.pro2
-rw-r--r--tests/auto/corelib/itemmodels/qitemmodel/tst_qitemmodel.cpp14
-rw-r--r--tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp64
-rw-r--r--tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp28
-rw-r--r--tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp2
-rw-r--r--tests/auto/corelib/kernel/qobject/tst_qobject.cpp383
-rw-r--r--tests/auto/corelib/kernel/qtimer/tst_qtimer.cpp6
-rw-r--r--tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp290
-rw-r--r--tests/auto/corelib/plugin/qfactoryloader/test/test.pro1
-rw-r--r--tests/auto/corelib/plugin/qpluginloader/tst/tst.pro2
-rw-r--r--tests/auto/corelib/tools/qbytearray/tst_qbytearray.cpp8
-rw-r--r--tests/auto/corelib/tools/qchar/tst_qchar.cpp86
-rw-r--r--tests/auto/corelib/tools/qeasingcurve/tst_qeasingcurve.cpp6
-rw-r--r--tests/auto/corelib/tools/qlocale/test/test.pro1
-rw-r--r--tests/auto/corelib/tools/qstring/tst_qstring.cpp122
-rw-r--r--tests/auto/corelib/tools/qstringbuilder/qstringbuilder1/stringbuilder.cpp10
-rw-r--r--tests/auto/corelib/tools/qtimeline/qtimeline.pro1
-rw-r--r--tests/auto/corelib/tools/qtimeline/tst_qtimeline.cpp28
-rw-r--r--tests/auto/corelib/xml/qxmlstream/tst_qxmlstream.cpp2
-rw-r--r--tests/auto/dbus/qdbusabstractadaptor/tst_qdbusabstractadaptor.cpp26
-rw-r--r--tests/auto/dbus/qdbusabstractinterface/pinger.h8
-rw-r--r--tests/auto/dbus/qdbusabstractinterface/tst_qdbusabstractinterface.cpp22
-rw-r--r--tests/auto/dbus/qdbusinterface/tst_qdbusinterface.cpp14
-rw-r--r--tests/auto/dbus/qdbuslocalcalls/tst_qdbuslocalcalls.cpp4
-rw-r--r--tests/auto/dbus/qdbusmarshall/tst_qdbusmarshall.cpp352
-rw-r--r--tests/auto/gui/image/qimage/tst_qimage.cpp4
-rw-r--r--tests/auto/gui/image/qimagereader/tst_qimagereader.cpp3
-rw-r--r--tests/auto/gui/image/qimagewriter/tst_qimagewriter.cpp3
-rw-r--r--tests/auto/gui/kernel/kernel.pro1
-rw-r--r--tests/auto/gui/kernel/qbackingstore/qbackingstore.pro3
-rw-r--r--tests/auto/gui/kernel/qclipboard/test/test.pro2
-rw-r--r--tests/auto/gui/kernel/qclipboard/tst_qclipboard.cpp6
-rw-r--r--tests/auto/gui/kernel/qguiapplication/qguiapplication.pro2
-rw-r--r--tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp6
-rw-r--r--tests/auto/gui/kernel/qguitimer/qguitimer.pro4
-rw-r--r--tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp34
-rw-r--r--tests/auto/gui/kernel/qwindow/qwindow.pro1
-rw-r--r--tests/auto/gui/kernel/qwindow/tst_qwindow.cpp84
-rw-r--r--tests/auto/gui/math3d/qmatrixnxn/tst_qmatrixnxn.cpp6
-rw-r--r--tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp6
-rw-r--r--tests/auto/gui/math3d/qvectornd/tst_qvectornd.cpp18
-rw-r--r--tests/auto/gui/qopengl/qopengl.pro1
-rw-r--r--tests/auto/gui/text/qfontdatabase/qfontdatabase.pro2
-rw-r--r--tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp5
-rw-r--r--tests/auto/gui/text/qfontmetrics/tst_qfontmetrics.cpp2
-rw-r--r--tests/auto/gui/text/qrawfont/qrawfont.pro2
-rw-r--r--tests/auto/gui/text/qrawfont/tst_qrawfont.cpp11
-rw-r--r--tests/auto/gui/text/qstatictext/qstatictext.pro2
-rw-r--r--tests/auto/gui/text/qtextlayout/qtextlayout.pro2
-rw-r--r--tests/auto/gui/text/qtextscriptengine/qtextscriptengine.pro2
-rw-r--r--tests/auto/gui/text/qtextscriptengine/tst_qtextscriptengine.cpp6
-rw-r--r--tests/auto/gui/text/text.pro4
-rw-r--r--tests/auto/network/access/qnetworkcookie/tst_qnetworkcookie.cpp10
-rw-r--r--tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp198
-rw-r--r--tests/auto/network/access/qnetworkrequest/tst_qnetworkrequest.cpp22
-rw-r--r--tests/auto/network/kernel/kernel.pro2
-rw-r--r--tests/auto/network/kernel/qdnslookup/tst_qdnslookup.cpp4
-rw-r--r--tests/auto/network/kernel/qnetworkinterface/qnetworkinterface.pro2
-rw-r--r--tests/auto/network/kernel/qnetworkproxyfactory/tst_qnetworkproxyfactory.cpp4
-rw-r--r--tests/auto/network/network.pro6
-rw-r--r--tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp12
-rw-r--r--tests/auto/network/socket/qsocks5socketengine/qsocks5socketengine.pro2
-rw-r--r--tests/auto/network/socket/qsocks5socketengine/tst_qsocks5socketengine.cpp13
-rw-r--r--tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp6
-rw-r--r--tests/auto/network/socket/qudpsocket/test/test.pro2
-rw-r--r--tests/auto/network/ssl/qsslsocket/qsslsocket.pro5
-rw-r--r--tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp265
-rw-r--r--tests/auto/network/ssl/qsslsocket_onDemandCertificates_member/qsslsocket_onDemandCertificates_member.pro2
-rw-r--r--tests/auto/network/ssl/qsslsocket_onDemandCertificates_static/qsslsocket_onDemandCertificates_static.pro2
-rw-r--r--tests/auto/opengl/qgl/qgl.pro3
-rw-r--r--tests/auto/opengl/qglthreads/qglthreads.pro2
-rw-r--r--tests/auto/other/headersclean/headersclean.pri2
-rw-r--r--tests/auto/other/lancelot/lancelot.pro2
-rw-r--r--tests/auto/other/lancelot/paintcommands.cpp2
-rw-r--r--tests/auto/other/lancelot/tst_lancelot.cpp3
-rw-r--r--tests/auto/other/modeltest/modeltest.cpp14
-rw-r--r--tests/auto/other/other.pro4
-rw-r--r--tests/auto/other/qaccessibility/qaccessibility.pro2
-rw-r--r--tests/auto/other/qaccessibility/tst_qaccessibility.cpp3
-rw-r--r--tests/auto/other/qfocusevent/qfocusevent.pro1
-rw-r--r--tests/auto/other/qfocusevent/tst_qfocusevent.cpp3
-rw-r--r--tests/auto/printsupport/kernel/qprinter/qprinter.pro2
-rw-r--r--tests/auto/printsupport/kernel/qprinterinfo/qprinterinfo.pro2
-rw-r--r--tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp2
-rw-r--r--tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp64
-rw-r--r--tests/auto/sql/models/qsqlquerymodel/tst_qsqlquerymodel.cpp56
-rw-r--r--tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp52
-rw-r--r--tests/auto/tools/moc/tst_moc.cpp19
-rw-r--r--tests/auto/widgets/dialogs/dialogs.pro2
-rw-r--r--tests/auto/widgets/dialogs/qdialog/qdialog.pro1
-rw-r--r--tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp26
-rw-r--r--tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp4
-rw-r--r--tests/auto/widgets/dialogs/qfontdialog/tst_qfontdialog.cpp5
-rw-r--r--tests/auto/widgets/dialogs/qinputdialog/tst_qinputdialog.cpp4
-rw-r--r--tests/auto/widgets/effects/qgraphicseffect/qgraphicseffect.pro1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/tst_qgraphicsanchorlayout1.cpp4
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp10
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp80
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsproxywidget/qgraphicsproxywidget.pro5
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp14
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsscene/qgraphicsscene.pro2
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp2
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro4
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp9
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicswidget/qgraphicswidget.pro2
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp14
-rw-r--r--tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp2
-rw-r--r--tests/auto/widgets/itemviews/qitemdelegate/qitemdelegate.pro2
-rw-r--r--tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp8
-rw-r--r--tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp2
-rw-r--r--tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp58
-rw-r--r--tests/auto/widgets/kernel/kernel.pro2
-rw-r--r--tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp53
-rw-r--r--tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp8
-rw-r--r--tests/auto/widgets/kernel/qshortcut/tst_qshortcut.cpp12
-rw-r--r--tests/auto/widgets/kernel/qwidget/qwidget.pro2
-rw-r--r--tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp581
-rw-r--r--tests/auto/widgets/styles/qmacstyle/qmacstyle.pro3
-rw-r--r--tests/auto/widgets/styles/qmacstyle/tst_qmacstyle.cpp3
-rw-r--r--tests/auto/widgets/util/qcompleter/qcompleter.pro2
-rw-r--r--tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp2
-rw-r--r--tests/auto/widgets/widgets/qcombobox/qcombobox.pro2
-rw-r--r--tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp30
-rw-r--r--tests/auto/widgets/widgets/qdatetimeedit/qdatetimeedit.pro1
-rw-r--r--tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp43
-rw-r--r--tests/auto/widgets/widgets/qdoublespinbox/qdoublespinbox.pro2
-rw-r--r--tests/auto/widgets/widgets/qmdiarea/qmdiarea.pro2
-rw-r--r--tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp19
-rw-r--r--tests/auto/widgets/widgets/qmdisubwindow/qmdisubwindow.pro3
-rw-r--r--tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp12
-rw-r--r--tests/auto/widgets/widgets/qmenubar/qmenubar.pro2
-rw-r--r--tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp2
-rw-r--r--tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp2
-rw-r--r--tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp22
-rw-r--r--tests/auto/widgets/widgets/qsizegrip/qsizegrip.pro2
-rw-r--r--tests/auto/widgets/widgets/qsizegrip/tst_qsizegrip.cpp1
-rw-r--r--tests/auto/widgets/widgets/qstatusbar/tst_qstatusbar.cpp4
-rw-r--r--tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp2
-rw-r--r--tests/baselineserver/src/baselineserver.cpp1
-rw-r--r--tests/benchmarks/corelib/kernel/qvariant/tst_qvariant.cpp2
-rw-r--r--tests/benchmarks/dbus/qdbusperformance/server/server.cpp2
-rw-r--r--tests/benchmarks/dbus/qdbusperformance/serverobject.h2
-rw-r--r--tests/benchmarks/dbus/qdbusperformance/tst_qdbusperformance.cpp14
-rw-r--r--tests/manual/bearerex/bearerex.cpp8
-rw-r--r--tests/manual/keypadnavigation/main.cpp2
-rw-r--r--tests/manual/lance/main.cpp8
-rw-r--r--tests/manual/manual.pro1
-rw-r--r--tests/manual/windowflags/controllerwindow.cpp132
-rw-r--r--tests/manual/windowflags/controllerwindow.h37
-rw-r--r--tests/manual/windowflags/controls.cpp314
-rw-r--r--tests/manual/windowflags/controls.h171
-rw-r--r--tests/manual/windowflags/previewwindow.cpp6
-rw-r--r--tests/manual/windowflags/previewwindow.h6
-rw-r--r--tests/manual/windowflags/windowflags.pro9
-rw-r--r--tests/manual/windowgeometry/controllerwidget.cpp483
-rw-r--r--tests/manual/windowgeometry/controllerwidget.h168
-rw-r--r--tests/manual/windowgeometry/main.cpp51
-rw-r--r--tests/manual/windowgeometry/windowgeometry.pro9
-rw-r--r--tools/configure/configureapp.cpp27
-rwxr-xr-xutil/local_database/qlocalexml2cpp.py2
-rw-r--r--util/unicode/main.cpp257
1155 files changed, 26220 insertions, 35508 deletions
diff --git a/bin/syncqt b/bin/syncqt
index 3e77d2001d..bc2ccf38ae 100755
--- a/bin/syncqt
+++ b/bin/syncqt
@@ -959,6 +959,9 @@ foreach my $lib (@modules_to_sync) {
#calc subdirs
my @subdirs = ($headers_dir);
foreach my $subdir (@subdirs) {
+ if ($subdir =~ /\/doc$/) {
+ next;
+ }
opendir DIR, $subdir or next;
foreach my $t (sort readdir(DIR)) {
push @subdirs, "$subdir/$t" if(-d "$subdir/$t" && !($t eq ".") &&
diff --git a/config.tests/arch/arch.cpp b/config.tests/arch/arch.cpp
index 1a96fb982f..b1ec3d7111 100644
--- a/config.tests/arch/arch.cpp
+++ b/config.tests/arch/arch.cpp
@@ -40,6 +40,7 @@
****************************************************************************/
// NOTE: This file is not meant to be compiled, only preprocessed.
+#define QGLOBAL_H
#include "../../src/corelib/global/qprocessordetection.h"
#undef alpha
#undef arm
diff --git a/config.tests/unix/directfb/directfb.cpp b/config.tests/unix/directfb/directfb.cpp
new file mode 100644
index 0000000000..a5a0bd4760
--- /dev/null
+++ b/config.tests/unix/directfb/directfb.cpp
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Intel Corporation
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the config.tests of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <directfb.h>
+
+#ifdef __typeof__
+#error DirectFB headers are unclean and cannot compile
+#endif
+
+int main(int, char **)
+{
+ return 0;
+}
diff --git a/config.tests/unix/directfb/directfb.pro b/config.tests/unix/directfb/directfb.pro
new file mode 100644
index 0000000000..958ced7bea
--- /dev/null
+++ b/config.tests/unix/directfb/directfb.pro
@@ -0,0 +1,3 @@
+SOURCES = directfb.cpp
+CONFIG -= qt
+mac:CONFIG -= app_bundle
diff --git a/configure b/configure
index 1da85c5408..a6af39b0cb 100755
--- a/configure
+++ b/configure
@@ -155,7 +155,7 @@ BEGIN {
ovalue = ovalue substr(value, 1, RSTART - 1)
var = substr(value, RSTART + 2, RLENGTH - 2)
value = substr(value, RSTART + RLENGTH)
- if (var ~ /^{/) {
+ if (var ~ /^\{/) {
var = substr(var, 2, length(var) - 2)
}
ovalue = ovalue values[var]
@@ -818,6 +818,9 @@ QT_LIBS_GLIB=
QT_CFLAGS_GSTREAMER=
QT_LIBS_GSTREAMER=
+# default qpa platform
+QT_QPA_DEFAULT_PLATFORM=
+
#-------------------------------------------------------------------------------
# check SQL drivers available in this package
#-------------------------------------------------------------------------------
@@ -900,7 +903,7 @@ while [ "$#" -gt 0 ]; do
shift
VAL=$1
;;
- -prefix|-docdir|-headerdir|-plugindir|-importdir|-datadir|-libdir|-bindir|-translationdir|-sysconfdir|-examplesdir|-testsdir|-depths|-make|-nomake|-platform|-xplatform|-device|-device-option|-sdk|-arch|-host-arch|-mysql_config|-sysroot|-hostdatadir|-hostbindir)
+ -prefix|-docdir|-headerdir|-plugindir|-importdir|-datadir|-libdir|-bindir|-translationdir|-sysconfdir|-examplesdir|-testsdir|-depths|-make|-nomake|-platform|-xplatform|-device|-device-option|-sdk|-arch|-host-arch|-mysql_config|-sysroot|-hostdatadir|-hostbindir|-qpa)
VAR=`echo $1 | sed "s,^-\(.*\),\1,"`
shift
VAL="$1"
@@ -1292,6 +1295,9 @@ while [ "$#" -gt 0 ]; do
DEV_VAL=`echo $VAL | sed "s,^.*=\(.*\),\1,"`
DeviceVar set $DEV_VAR $DEV_VAL
;;
+ qpa)
+ QT_QPA_DEFAULT_PLATFORM="$VAL"
+ ;;
debug-and-release)
if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
CFG_DEBUG_RELEASE="$VAL"
@@ -2344,6 +2350,7 @@ PLATFORMS=`find "$relpath/mkspecs/" -type f | grep -v qws | sed "s,$relpath/mksp
case `basename "$XPLATFORM"` in win32-g++*) XPLATFORM_MINGW=yes;; esac
case "$XPLATFORM" in linux-g++-maemo) XPLATFORM_MAEMO=yes;; esac
+case "$XPLATFORM" in qnx-*) XPLATFORM_QNX=yes;; esac
if [ -d "$PLATFORM" ]; then
QMAKESPEC="$PLATFORM"
@@ -2428,15 +2435,6 @@ if [ "$CFG_RTOS_ENABLED" = "no" ]; then
fi
#-------------------------------------------------------------------------------
-# write out device config before we run the test.
-#-------------------------------------------------------------------------------
-if cmp -s "$DEVICE_VARS_FILE" "$outpath/mkspecs/qdevice.pri"; then
- rm -f "$DEVICE_VARS_FILE"
-else
- mv -f $DEVICE_VARS_FILE "$outpath/mkspecs/qdevice.pri"
-fi
-
-#-------------------------------------------------------------------------------
# tests that don't need qmake (must be run before displaying help)
#-------------------------------------------------------------------------------
@@ -2816,7 +2814,7 @@ if [ "$OPT_HELP" = "yes" ]; then
EGLFSN=" "
fi
- if [ "$CFG_DIRECTFB" = "no"]; then
+ if [ "$CFG_DIRECTFB" = "no" ]; then
DFBY=" "
DFBN="*"
else
@@ -3112,11 +3110,13 @@ Additional options:
$XCBY -xcb ............... Compile Xcb support.
$EGLFSN -no-eglfs .......... Do not compile EGLFS (EGL Full Screen/Single Surface) support.
- $EGLFSY -eglfs ............. Compile EGLFS support.
+ $EGLFSY -eglfs ............. Compile EGLFS support (Requires OpenGL ES 2 support).
$DFBN -no-directfb ....... Do not compile DirectFB support.
$DFBY -directfb .......... Compile DirectFB support.
+ -qpa <name> ......... Sets the default QPA platform (e.g xcb, cocoa, windows).
+
-xplatform target ... The target platform when cross-compiling.
-sysroot <dir> ...... Sets <dir> as the target compiler's and qmake's sysroot.
@@ -3661,6 +3661,15 @@ if [ -z "$PKG_CONFIG" ]; then
fi
#-------------------------------------------------------------------------------
+# write out device config before we run the test.
+#-------------------------------------------------------------------------------
+if cmp -s "$DEVICE_VARS_FILE" "$outpath/mkspecs/qdevice.pri"; then
+ rm -f "$DEVICE_VARS_FILE"
+else
+ mv -f $DEVICE_VARS_FILE "$outpath/mkspecs/qdevice.pri"
+fi
+
+#-------------------------------------------------------------------------------
# tests that need qmake
#-------------------------------------------------------------------------------
@@ -3873,6 +3882,11 @@ if [ "$CFG_EGLFS" = "yes" ]; then
echo "The EGLFS plugin requires EGL support and cannot be built"
exit 101
fi
+ if [ "$CFG_OPENGL" != "es2" ]; then
+ echo "The EGLFS plugin requires OpenGL ES 2 support and cannot be built"
+ exit 101
+ fi
+ CFG_OPENGL="es2"
CFG_EGL=yes
fi
@@ -4231,6 +4245,32 @@ if [ "$CFG_GLIB" != "no" ]; then
fi
fi
+# auto-detect GTK style support
+if [ "$CFG_GLIB" = "yes" -a "$CFG_QGTKSTYLE" != "no" ]; then
+ if [ -n "$PKG_CONFIG" ]; then
+ QT_CFLAGS_QGTKSTYLE=`$PKG_CONFIG --cflags gtk+-2.0 ">=" 2.10 atk 2>/dev/null`
+ QT_LIBS_QGTKSTYLE=`$PKG_CONFIG --libs gobject-2.0 2>/dev/null`
+ fi
+ if [ -n "$QT_CFLAGS_QGTKSTYLE" ] ; then
+ CFG_QGTKSTYLE=yes
+ QT_CONFIG="$QT_CONFIG gtkstyle"
+ QMakeVar set QT_CFLAGS_QGTKSTYLE "$QT_CFLAGS_QGTKSTYLE"
+ QMakeVar set QT_LIBS_QGTKSTYLE "$QT_LIBS_QGTKSTYLE"
+ else
+ if [ "$CFG_QGTKSTYLE" = "yes" ] && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
+ echo "Gtk theme support cannot be enabled due to functionality tests!"
+ echo " Turn on verbose messaging (-v) to $0 to see the fin al 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_QGTKSTYLE=no
+ fi
+ fi
+elif [ "$CFG_GLIB" = "no" ]; then
+ CFG_QGTKSTYLE=no
+fi
+
# ### Vestige
if [ "$CFG_GLIB" = "yes" -a "$CFG_GSTREAMER" != "no" ]; then
if [ -n "$PKG_CONFIG" ]; then
@@ -4569,7 +4609,17 @@ if [ "$CFG_DIRECTFB" != "no" ]; then
if [ -n "$PKG_CONFIG" ] && $PKG_CONFIG --exists directfb 2>/dev/null; then
QMAKE_CFLAGS_DIRECTFB=`$PKG_CONFIG --cflags directfb 2>/dev/null`
QMAKE_LIBS_DIRECTFB=`$PKG_CONFIG --libs directfb 2>/dev/null`
- QT_CONFIG="$QT_CONFIG directfb"
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" "config.tests/unix/directfb" "DirectFB" $L_FLAGS $I_FLAGS $l_FLAGS $QMAKE_CFLAGS_DIRECTFB $QMAKE_LIBS_DIRECTFB; then
+ CFG_DIRECTFB=yes
+ elif [ "$CFG_DIRECTFB" = "yes" ] && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
+ echo " DirectFB 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_DIRECTFB=no
+ fi
else
CFG_DIRECTFB=no
fi
@@ -4614,7 +4664,26 @@ elif [ "$CFG_OPENGL" = "desktop" ]; then
fi
if [ "$CFG_EGLFS" != "no" ]; then
- CFG_EGLFS="$CFG_EGL"
+ if [ "$CFG_OPENGL" = "es2" ]; then
+ CFG_EGLFS="$CFG_EGL"
+ else
+ CFG_EGLFS="no"
+ fi
+fi
+
+# Determine the default QPA platform
+if [ -z "$QT_QPA_DEFAULT_PLATFORM" ]; then
+ # check the mkspec
+ QT_QPA_DEFAULT_PLATFORM=`getXQMakeConf QT_QPA_DEFAULT_PLATFORM`
+ if [ -z "$QT_QPA_DEFAULT_PLATFORM" ]; then
+ if [ "$BUILD_ON_MAC" = "yes" ]; then
+ QT_QPA_DEFAULT_PLATFORM="cocoa"
+ elif [ "$UNAME_SYSTEM" = "QNX" ]; then
+ QT_QPA_DEFAULT_PLATFORM="qnx"
+ else
+ QT_QPA_DEFAULT_PLATFORM="xcb"
+ fi
+ fi
fi
if [ -n "$QMAKE_CFLAGS_XCB" ] || [ -n "$QMAKE_LIBS_XCB" ]; then
@@ -4622,7 +4691,8 @@ if [ -n "$QMAKE_CFLAGS_XCB" ] || [ -n "$QMAKE_LIBS_XCB" ]; then
QMakeVar set QMAKE_LIBS_XCB "$QMAKE_LIBS_XCB"
QMakeVar set QMAKE_DEFINES_XCB "$QMAKE_DEFINES_XCB"
fi
-if [ -n "$QMAKE_CFLAGS_DIRECTFB" ] || [ -n "$QMAKE_LIBS_DIRECTFB" ]; then
+if [ "$CFG_DIRECTFB" = "yes" ]; then
+ QT_CONFIG="$QT_CONFIG directfb"
QMakeVar set QMAKE_CFLAGS_DIRECTFB "$QMAKE_CFLAGS_DIRECTFB"
QMakeVar set QMAKE_LIBS_DIRECTFB "$QMAKE_LIBS_DIRECTFB"
fi
@@ -4635,14 +4705,14 @@ if [ "$BUILD_ON_MAC" = "yes" ]; then
fi
fi
-if [ "$BUILD_ON_MAC" = "no" ] && [ "$XPLATFORM_MINGW" = "no" ]; then
+if [ "$BUILD_ON_MAC" = "no" ] && [ "$XPLATFORM_MINGW" = "no" ] && [ "$XPLATFORM_QNX" = "no" ]; then
if [ "$CFG_XCB" = "no" ] && [ "$CFG_EGLFS" = "no" ] && [ "$CFG_DIRECTFB" = "no" ]; then
if [ "$QPA_PLATFORM_GUARD" = "yes" ] &&
( [ "$ORIG_CFG_XCB" = "auto" ] || [ "$ORIG_CFG_EGLFS" = "auto" ] || [ "$ORIG_CFG_DIRECTFB" = "auto" ] ); then
echo "No QPA platform plugin enabled!"
echo " If you really want to build without a QPA platform plugin you must pass"
- echo " -no-xcb, -no-eglfs and -no-directfb to configure. Doing this will"
- echo " produce a Qt that cannot run GUI applications."
+ echo " -no-qpa-platform-guard to configure. Doing this will"
+ echo " produce a Qt that can not run GUI applications."
echo " The dependencies needed for xcb to build are listed in"
echo " src/plugins/platforms/xcb/README"
exit 1
@@ -5636,6 +5706,8 @@ cat >>"$outpath/src/corelib/global/qconfig.h.new" << EOF
EOF
fi
+echo "#define QT_QPA_DEFAULT_PLATFORM_NAME \"$QT_QPA_DEFAULT_PLATFORM\"" >>"$outpath/src/corelib/global/qconfig.h.new"
+
# avoid unecessary rebuilds by copying only if qconfig.h has changed
if cmp -s "$outpath/src/corelib/global/qconfig.h" "$outpath/src/corelib/global/qconfig.h.new"; then
rm -f "$outpath/src/corelib/global/qconfig.h.new"
diff --git a/dist/changes-5.0.0 b/dist/changes-5.0.0
index 9cef238cff..353c7694d6 100644
--- a/dist/changes-5.0.0
+++ b/dist/changes-5.0.0
@@ -353,6 +353,13 @@ QtCore
QRegularExpressionMatchIterator. They aim to replace QRegExp with a more
powerful and flexible regular expression engine.
+* Certain methods in QRegExp that modified the object's internals are no longer marked
+ const. They were accidentally marked const in Qt 4 but the problem could not be
+ fixed. The following are suggestions to adapt code to this change:
+ - make sure the QRegExp object is not const in the given context
+ - create a copy of the QRegExp object before using it
+ - invert the operation and use QString. E.g., rx.indexIn(string) becomes string.indexOf(rx)
+
* QEvent::AccessibilityPrepare, AccessibilityHelp and AccessibilityDescription removed:
* The enum values simply didn't make sense in the first place and should simply be dropped.
@@ -457,7 +464,7 @@ QTestLib
QtSql
-----
-QSqlTableModel/QSqlRelationalTableModel
+QSqlQueryModel/QSqlTableModel/QSqlRelationalTableModel
* The dataChanged() signal is now emitted for changes made to an inserted
record that has not yet been committed. Previously, dataChanged() was
@@ -492,6 +499,10 @@ removed and only if there are no other changed rows.
QSqlTableModel::indexInQuery() as example of how to implement in a
subclass.
+* QSqlQueryMode::setQuery() emits fewer signals. The modelAboutToBeReset()
+and modelReset() signals suffice to inform views that they must reinterrogate
+the model.
+
* QSqlTableModel::selectRow(): This is a new method that refreshes a single
row in the model from the database.
@@ -627,6 +638,26 @@ Qt for Windows CE
cleared). Any QPointers tracking a widget will NOT be cleared before the
QWidget destructor destroys the children for the widget being tracked.
+- QUrl
+
+ * QUrl has been changed to operate only on percent-encoded
+ forms. Fully-decoded forms, where the percent character stands for itself,
+ are no longer possible. For that reason, the getters and setters with
+ "encoded" in the name are deprecated, except for QUrl::toEncoded() and
+ QUrl::fromEncoded().
+
+ QUrl now operates in a mode where it decodes as much as it can of the
+ percent-encoding sequences. In addition, the setter methods possess a mode
+ in which a '%' character not part of a percent-encoding sequence will cause
+ the parser to correct the input. Therefore, most software will not require
+ changes to adapt, since the getter methods will continue returning the
+ components in their most-decoded form as they did before and the setter
+ methods will accept input as they did before..
+
+ The most notable difference is when dealing with
+ QUrl::toString(). Previously, this function would return percent characters
+ in the URL by themselves. Now, it will return "%25", like
+ QUrl::toEncoded().
- QVariant
diff --git a/doc/global/qt-cpp-ignore.qdocconf b/doc/global/qt-cpp-ignore.qdocconf
new file mode 100644
index 0000000000..9dbb7d980e
--- /dev/null
+++ b/doc/global/qt-cpp-ignore.qdocconf
@@ -0,0 +1,54 @@
+Cpp.ignoretokens = QT_ASCII_CAST_WARN \
+ QT_ASCII_CAST_WARN_CONSTRUCTOR \
+ QT_BEGIN_HEADER \
+ QT_BOOTSTRAPPED \
+ QT_DESIGNER_STATIC \
+ QT_END_HEADER \
+ QT_FASTCALL \
+ Q_COMPAT_EXPORT \
+ Q_CORE_EXPORT \
+ Q_CORE_EXPORT_INLINE \
+ Q_EXPORT \
+ Q_EXPORT_PLUGIN \
+ Q_EXPORT_PLUGIN2 \
+ Q_AUTOTEST_EXPORT \
+ Q_GUI_EXPORT \
+ Q_GUI_EXPORT_INLINE \
+ Q_INLINE_TEMPLATE \
+ Q_NETWORK_EXPORT \
+ Q_OPENGL_EXPORT \
+ Q_OPENVG_EXPORT \
+ Q_OUTOFLINE_TEMPLATE \
+ Q_SQL_EXPORT \
+ Q_SVG_EXPORT \
+ Q_SCRIPT_EXPORT \
+ Q_SCRIPTTOOLS_EXPORT \
+ Q_XML_EXPORT \
+ Q_XMLPATTERNS_EXPORT \
+ QDBUS_EXPORT \
+ Q_DBUS_EXPORT \
+ QT_BEGIN_NAMESPACE \
+ QT_BEGIN_INCLUDE_NAMESPACE \
+ QT_END_NAMESPACE \
+ QT_END_INCLUDE_NAMESPACE \
+ Q_GADGET \
+ Q_INVOKABLE \
+ Q_DECL_CONSTEXPR
+Cpp.ignoredirectives = Q_DECLARE_INTERFACE \
+ Q_DECLARE_METATYPE \
+ Q_DECLARE_OPERATORS_FOR_FLAGS \
+ Q_DECLARE_PRIVATE \
+ Q_DECLARE_PUBLIC \
+ Q_DECLARE_SHARED \
+ Q_DECLARE_TR_FUNCTIONS \
+ Q_DECLARE_TYPEINFO \
+ Q_DISABLE_COPY \
+ QT_FORWARD_DECLARE_CLASS \
+ Q_DUMMY_COMPARISON_OPERATOR \
+ Q_ENUMS \
+ Q_FLAGS \
+ Q_INTERFACES \
+ __attribute__ \
+ Q_PRIVATE_PROPERTY \
+ Q_DECLARE_PRIVATE_D \
+ Q_CLASSINFO
diff --git a/doc/global/style/offline.css b/doc/global/style/offline.css
new file mode 100644
index 0000000000..1b430ab904
--- /dev/null
+++ b/doc/global/style/offline.css
@@ -0,0 +1,622 @@
+body{
+font: normal 400 14px/1.2 Arial;
+margin-top:85px;
+font-family: Arial, Helvetica;
+color:#313131;
+text-align:justify;
+margin-left:5px;
+margin-right:5px;
+}
+
+img{
+-moz-box-shadow: 3px 3px 3px #ccc;
+-webkit-box-shadow: 3px 3px 3px #ccc;
+box-shadow: 3px 3px 3px #ccc;
+border:#8E8D8D 2px solid;
+margin-left:0px;
+max-width: 800px;
+height: auto
+}
+
+b{
+font-weight:600;
+}
+
+.content{}
+
+.descr{
+margin-top:35px;
+/*max-width: 75%;*/
+margin-left:5px;
+text-align:justify;
+min-height:700px;
+vertical-align:top;
+}
+
+.name{
+max-width: 75%;
+font-weight:100;
+}
+
+tt{
+text-align:left;}
+
+/*
+-----------
+links
+-----------
+*/
+
+a:link{
+color: #2C418D;
+text-decoration: none;
+text-align:left;
+}
+
+a:hover{
+color: #869CD1;
+text-decoration:underline;
+text-align:left;
+}
+
+a:visited{
+color: #869CD1;
+text-decoration: none;
+text-align:left;
+}
+
+a:visited:hover{
+text-decoration:underline;
+text-align:left;
+}
+
+a[href*="http://"], a[href*="ftp://"],a[href*="https://"]
+{
+text-decoration: none;
+background-image:url(../images/ico_out.png);
+background-repeat:no-repeat;
+background-position:left;
+padding-left:20px;
+text-align:left;
+}
+
+.flags{
+text-decoration:none;
+text-height:24px;
+}
+
+/*
+-------------------------------
+NOTE styles
+-------------------------------
+*/
+.notetitle, .tiptitle, .fastpathtitle{
+font-weight:bold;
+}
+
+.attentiontitle,.cautiontitle,.dangertitle,.importanttitle,.remembertitle,.restrictiontitle{
+font-weight:bold;
+}
+
+.note,.tip,.fastpath{
+background: #F2F2F2 url(../images/ico_note.png);
+background-repeat: no-repeat;
+background-position: top left;
+padding:5px;
+padding-left:40px;
+padding-bottom:10px;
+border:#999 1px dotted;
+color:#666666;
+margin:5px;
+}
+
+.attention,.caution,.danger,.important,.remember,.restriction{
+background: #F2F2F2 url(../images/ico_note_attention.png);
+background-repeat:no-repeat;
+background-position:top left;
+padding:5px;
+padding-left:40px;
+padding-bottom:10px;
+border:#999 1px dotted;
+color:#666666;
+margin:5px;
+}
+
+/*
+-------------------------------
+Top navigation
+-------------------------------
+*/
+
+.header{
+
+height:1px;
+padding:0px;
+margin:0px;
+}
+
+.qtref{
+display: block;
+position: relative;
+top: -76px;
+height:15px;
+z-index: 1;
+font-size:11px;
+padding-right:10px;
+float:right;
+}
+
+.naviNextPrevious{
+display: block;
+position: relative;
+text-align: right;
+top: -53px;
+float:right;
+height:20px;
+z-index:1;
+padding-right:10px;
+padding-top:2px;
+vertical-align:top;
+margin:0px;
+}
+
+
+.naviNextPrevious > a:first-child{
+background-image:url(../images/btn_prev.png);
+background-repeat:no-repeat;
+background-position:left;
+padding-left:20px;
+height:20px;
+padding-left:20px;
+}
+
+.naviNextPrevious > a:last-child{
+background-image:url(../images/btn_next.png);
+background-repeat:no-repeat;
+background-position:right;
+padding-right:20px;
+height:20px;
+margin-left:30px;
+}
+
+.breadcrumb{
+display: block;
+position: relative;
+top:-20px;
+/*border-top:2px solid #ffffff;*/
+border-bottom: 1px solid #cecece;
+background-color:#F2F2F2;
+z-index:1;
+height:20px;
+padding:0px;
+margin:0px;
+padding-left:10px;
+padding-top:2px;
+margin-left:-5px;
+margin-right:-5px;
+}
+
+.breadcrumb ul{
+ margin:0px;
+ padding:0px;
+}
+
+.breadcrumb ul li{
+background-color:#F2F2F2;
+list-style-type:none;
+padding:0;
+margin:0;
+height:20px;
+}
+
+.breadcrumb li{
+float:left;
+}
+
+.breadcrumb .first {
+background:url(../images/home.png);
+background-position:left;
+background-repeat:no-repeat;
+padding-left:20px;
+}
+
+
+.breadcrumb li a{
+color:#2C418D;
+display:block;
+text-decoration:none;
+background:url(../images/arrow.png);
+background-repeat:no-repeat;
+background-position:right;
+padding-right:25px;
+padding-left:10px;
+}
+
+.breadcrumb li a:hover{
+color:#909090;
+display:block;
+text-decoration:none;
+background:url(../images/arrow.png);
+background-repeat:no-repeat;
+background-position:right;
+padding-right:20px;
+padding-left:10px;
+}
+
+
+/* table of content
+no display
+*/
+
+/*
+-----------
+headers
+-----------
+*/
+
+
+@media screen{
+.title{
+color:#313131;
+font-size: 18px;
+font-weight: normal;
+left: 0;
+padding-bottom: 20px;
+padding-left: 10px;
+padding-top: 20px;
+position: absolute;
+right: 0;
+top: 0;
+background-color:#E6E6E6;
+border-bottom: 1px #CCC solid;
+border-top: 2px #CCC solid;
+font-weight:bold;
+margin-left:0px;
+margin-right:0px;
+}
+}
+
+h1 {
+margin: 0;
+}
+
+h2, p.h2 {
+font: 500 16px/1.2 Arial;
+font-weight:100;
+background-color:#F2F3F4;
+padding:4px;
+margin-bottom:30px;
+margin-top:30px;
+border-top:#E0E0DE 1px solid;
+border-bottom: #E0E0DE 1px solid;
+max-width: 99%;
+}
+
+h3{
+
+font: 500 14px/1.2 Arial;
+font-weight:100;
+text-decoration:underline;
+margin-bottom:30px;
+margin-top:30px;
+}
+
+h3.fn,span.fn{
+border-width: 1px;
+border-style: solid;
+border-color: #E6E6E6;
+-moz-border-radius: 7px 7px 7px 7px;
+-webkit-border-radius: 7px 7px 7px 7px;
+border-radius: 7px 7px 7px 7px;
+background-color: #F6F6F6;
+word-spacing: 3px;
+padding: 5px 5px;
+text-decoration:none;
+font-weight:bold;
+max-width:75%;
+font-size:14px;
+margin:0px;
+margin-top:30px;
+
+}
+
+.name{
+color:#1A1A1A;
+}
+.type{
+color:#808080;
+}
+
+
+
+@media print {
+.title {
+color:#0066CB;
+font-family:Arial, Helvetica;
+font-size: 32px;
+font-weight: normal;
+left: 0;
+position: absolute;
+right: 0;
+top: 0;
+}
+}
+
+
+/*
+-----------------
+table styles
+-----------------
+*/
+.table img {
+border:none;
+margin-left:0px;
+-moz-box-shadow:0px 0px 0px #fff;
+-webkit-box-shadow: 0px 0px 0px #fff;
+box-shadow: 0px 0px 0px #fff;
+}
+
+/* table with border alternative colours*/
+
+ table,pre{
+-moz-border-radius: 7px 7px 7px 7px;
+-webkit-border-radius: 7px 7px 7px 7px;
+ border-radius: 7px 7px 7px 7px;
+background-color: #F6F6F6;
+border: 1px solid #E6E6E6;
+border-collapse: separate;
+font-size: 12px;
+line-height: 1.2;
+margin-bottom: 25px;
+margin-left: 15px;
+font-size: 12px;
+line-height: 1.2;
+margin-bottom: 25px;
+margin-left: 15px;
+}
+
+
+table th{
+text-align:left;
+padding-left:20px;
+}
+
+table td {
+padding: 3px 15px 3px 20px;
+border-bottom:#CCC dotted 1px;
+}
+table p { margin:0px;}
+
+table tr.even {
+background-color: white;
+color: #66666E;
+}
+
+table tr.odd {
+background-color: #F6F6F6;
+color: #66666E;
+}
+
+
+table thead {
+text-align:left;
+padding-left:20px;
+background-color:#e1e0e0;
+border-left:none;
+border-right:none;
+}
+
+table thead th {
+padding-top:5px;
+padding-left:10px;
+padding-bottom:5px;
+border-bottom: 2px solid #D1D1D1;
+padding-right:10px;
+}
+
+
+/* table bodless & white*/
+
+.borderless {
+border-radius: 0px 0px 0px 0px;
+background-color: #fff;
+border: 1px solid #fff;
+}
+
+.borderless tr {
+background-color: #FFF;
+color: #66666E;
+}
+
+.borderless td {
+border:none;
+border-bottom:#fff dotted 1px;
+}
+
+/*
+-----------
+List
+-----------
+*/
+
+ul{
+padding-bottom:2px;
+}
+
+li {
+margin-bottom: 10px;
+padding-left: 8px;
+list-style:outside;
+list-style-type:square;
+text-align:left;
+}
+
+
+ol{
+margin:10px;
+padding:0;
+}
+
+ol > li{
+margin-left: 30px;
+padding-left:8px;
+list-style:decimal;
+}
+
+.centerAlign{
+text-align: left;
+}
+
+.cpp{
+display: block;
+margin: 10;
+overflow: hidden;
+overflow-x: hidden;
+overflow-y: hidden;
+padding: 20px 0 20px 0;
+}
+
+.footer{
+margin-top: 50px;
+padding-left:5px;
+margin-bottom: 10px;
+font-size:10px;
+border-top: 1px solid #999;
+padding-top:11px;
+}
+
+.footerNavi{
+width:auto;
+text-align:right;
+margin-top:50px;
+z-index:1;
+}
+
+.memItemLeft{
+padding-right: 3px;
+}
+
+.memItemRight{
+padding: 3px 15px 3px 0;
+}
+
+.qml{
+display: block;
+margin: 10;
+overflow: hidden;
+overflow-x: hidden;
+overflow-y: hidden;
+padding: 20px 0 20px 0;
+}
+
+.qmldefault{
+padding-left: 5px;
+float: right;
+color: red;
+}
+
+.qmlreadonly{
+padding-left: 5px;
+float: right;
+color: #254117;
+}
+
+.rightAlign{
+padding: 3px 5px 3px 10px;
+text-align: right;
+}
+
+/*
+-----------
+Content table
+-----------
+*/
+
+@media print{
+.toc {
+float: right;
+padding-bottom: 10px;
+padding-top: 50px;
+width: 100%;
+background-image:url(../images/bgrContent.png);
+background-position:top;
+background-repeat:no-repeat;
+}
+}
+
+@media screen{
+.toc{
+clear:both;
+float:right;
+vertical-align:top;
+-moz-border-radius: 7px 7px 7px 7px;
+-webkit-border-radius: 7px 7px 7px 7px;
+border-radius: 7px 7px 7px 7px;
+ background:#FFF url(../images/bgrContent.png);
+background-position:top;
+background-repeat:repeat-x;
+border: 1px solid #E6E6E6;
+padding-left:5px;
+padding-bottom:10px;
+height: auto;
+width: 200px;
+text-align:left;
+z-index:2;
+margin-left:20px;
+margin-right:20px;
+margin-top:0px;
+padding-top:0px;
+}
+}
+
+.toc h3{
+text-decoration:none;
+}
+
+.toc h3{font: 500 14px/1.2 Arial;
+font-weight:100;
+padding:0px;
+margin:0px;
+padding-top:5px;
+padding-left:5px;
+}
+
+
+.toc ul{
+width:160px;
+padding-left:10px;
+padding-right:5px;
+padding-bottom:10px;
+padding-top:10px;
+}
+
+.toc ul li{
+margin-left:20px;
+list-style-image:url(../images/blu_dot.png);
+list-style:outside;
+
+}
+
+
+.toc ul li a:link{
+color: #2C418D;
+text-decoration: none;
+}
+
+.toc ul li a:hover{
+color: #869CD1;
+text-decoration:underline;
+
+}
+
+.toc ul li a:visited{
+color: #869CD1;
+font-weight: bold;
+}
+
+.level1{
+border:none;}
+
+.clearfix{
+clear:both;}
+
diff --git a/doc/src/snippets/code/doc_src_examples_textfinder.pro b/doc/src/snippets/code/doc_src_examples_textfinder.pro
index 10616b40a0..ae070f4ac2 100644
--- a/doc/src/snippets/code/doc_src_examples_textfinder.pro
+++ b/doc/src/snippets/code/doc_src_examples_textfinder.pro
@@ -1,43 +1,3 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
-** the names of its contributors may be used to endorse or promote
-** products derived from this software without specific prior written
-** permission.
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
#! [0]
CONFIG += uitools
HEADERS = textfinder.h
diff --git a/doc/src/snippets/code/doc_src_qplugin.pro b/doc/src/snippets/code/doc_src_qplugin.pro
deleted file mode 100644
index e5e5311e5d..0000000000
--- a/doc/src/snippets/code/doc_src_qplugin.pro
+++ /dev/null
@@ -1,44 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
-** the names of its contributors may be used to endorse or promote
-** products derived from this software without specific prior written
-** permission.
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#! [3]
-TEMPLATE = app
-QTPLUGIN += qjpeg qgif # image formats
-#! [3]
diff --git a/doc/src/snippets/code/doc_src_qtgui.pro b/doc/src/snippets/code/doc_src_qtgui.pro
index a4fbc67aeb..51bb6c74ff 100644
--- a/doc/src/snippets/code/doc_src_qtgui.pro
+++ b/doc/src/snippets/code/doc_src_qtgui.pro
@@ -1,43 +1,3 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
-** the names of its contributors may be used to endorse or promote
-** products derived from this software without specific prior written
-** permission.
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
#! [0]
#include <QtGui>
#! [0]
diff --git a/doc/src/snippets/code/doc_src_qtnetwork.pro b/doc/src/snippets/code/doc_src_qtnetwork.pro
index 897229ebc7..a100943e58 100644
--- a/doc/src/snippets/code/doc_src_qtnetwork.pro
+++ b/doc/src/snippets/code/doc_src_qtnetwork.pro
@@ -1,43 +1,3 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
-** the names of its contributors may be used to endorse or promote
-** products derived from this software without specific prior written
-** permission.
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
#! [0]
QT += network
#! [0]
diff --git a/doc/src/snippets/code/doc_src_qtsql.pro b/doc/src/snippets/code/doc_src_qtsql.pro
deleted file mode 100644
index 4cf55433a8..0000000000
--- a/doc/src/snippets/code/doc_src_qtsql.pro
+++ /dev/null
@@ -1,43 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
-** the names of its contributors may be used to endorse or promote
-** products derived from this software without specific prior written
-** permission.
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#! [1]
-QT += sql
-#! [1]
diff --git a/doc/src/snippets/code/doc_src_qtxml.pro b/doc/src/snippets/code/doc_src_qtxml.pro
deleted file mode 100644
index b0a38e3432..0000000000
--- a/doc/src/snippets/code/doc_src_qtxml.pro
+++ /dev/null
@@ -1,43 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
-** the names of its contributors may be used to endorse or promote
-** products derived from this software without specific prior written
-** permission.
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#! [1]
-QT += xml
-#! [1]
diff --git a/examples/dbus/complexpingpong/complexping.cpp b/examples/dbus/complexpingpong/complexping.cpp
index aa39290f8b..97bc5e6103 100644
--- a/examples/dbus/complexpingpong/complexping.cpp
+++ b/examples/dbus/complexpingpong/complexping.cpp
@@ -60,7 +60,7 @@ void Ping::start(const QString &name, const QString &oldValue, const QString &ne
qstdin.open(stdin, QIODevice::ReadOnly);
// find our remote
- iface = new QDBusInterface(SERVICE_NAME, "/", "com.trolltech.QtDBus.ComplexPong.Pong",
+ iface = new QDBusInterface(SERVICE_NAME, "/", "org.example.QtDBus.ComplexPong.Pong",
QDBusConnection::sessionBus(), this);
if (!iface->isValid()) {
fprintf(stderr, "%s\n",
diff --git a/examples/dbus/complexpingpong/complexpong.h b/examples/dbus/complexpingpong/complexpong.h
index e458f9e37f..94a3083bd8 100644
--- a/examples/dbus/complexpingpong/complexpong.h
+++ b/examples/dbus/complexpingpong/complexpong.h
@@ -48,7 +48,7 @@
class Pong: public QDBusAbstractAdaptor
{
Q_OBJECT
- Q_CLASSINFO("D-Bus Interface", "com.trolltech.QtDBus.ComplexPong.Pong")
+ Q_CLASSINFO("D-Bus Interface", "org.example.QtDBus.ComplexPong.Pong")
Q_PROPERTY(QString value READ value WRITE setValue)
public:
QString m_value;
diff --git a/examples/dbus/complexpingpong/ping-common.h b/examples/dbus/complexpingpong/ping-common.h
index 987c8b6d96..0cde67302f 100644
--- a/examples/dbus/complexpingpong/ping-common.h
+++ b/examples/dbus/complexpingpong/ping-common.h
@@ -38,4 +38,4 @@
**
****************************************************************************/
-#define SERVICE_NAME "com.trolltech.QtDBus.PingExample"
+#define SERVICE_NAME "org.example.QtDBus.PingExample"
diff --git a/examples/dbus/dbus-chat/chat.cpp b/examples/dbus/dbus-chat/chat.cpp
index f5d834fea4..beeccb0622 100644
--- a/examples/dbus/dbus-chat/chat.cpp
+++ b/examples/dbus/dbus-chat/chat.cpp
@@ -65,7 +65,7 @@ ChatMainWindow::ChatMainWindow()
com::trolltech::chat *iface;
iface = new com::trolltech::chat(QString(), QString(), QDBusConnection::sessionBus(), this);
//connect(iface, SIGNAL(message(QString,QString)), this, SLOT(messageSlot(QString,QString)));
- QDBusConnection::sessionBus().connect(QString(), QString(), "com.trolltech.chat", "message", this, SLOT(messageSlot(QString,QString)));
+ QDBusConnection::sessionBus().connect(QString(), QString(), "org.example.chat", "message", this, SLOT(messageSlot(QString,QString)));
connect(iface, SIGNAL(action(QString,QString)), this, SLOT(actionSlot(QString,QString)));
NicknameDialog dialog;
@@ -115,7 +115,7 @@ void ChatMainWindow::textChangedSlot(const QString &newText)
void ChatMainWindow::sendClickedSlot()
{
//emit message(m_nickname, messageLineEdit->text());
- QDBusMessage msg = QDBusMessage::createSignal("/", "com.trolltech.chat", "message");
+ QDBusMessage msg = QDBusMessage::createSignal("/", "org.example.chat", "message");
msg << m_nickname << messageLineEdit->text();
QDBusConnection::sessionBus().send(msg);
messageLineEdit->setText(QString());
diff --git a/examples/dbus/dbus-chat/chat_adaptor.cpp b/examples/dbus/dbus-chat/chat_adaptor.cpp
index e088dffaa4..c3a5600390 100644
--- a/examples/dbus/dbus-chat/chat_adaptor.cpp
+++ b/examples/dbus/dbus-chat/chat_adaptor.cpp
@@ -38,7 +38,7 @@
**
**
** This file was generated by qdbusxml2cpp version 0.7
-** Command line was: qdbusxml2cpp -i chat_adaptor.h -a :chat_adaptor.cpp com.trolltech.chat.xml
+** Command line was: qdbusxml2cpp -i chat_adaptor.h -a :chat_adaptor.cpp org.example.chat.xml
**
** qdbusxml2cpp is Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
**
diff --git a/examples/dbus/dbus-chat/chat_adaptor.h b/examples/dbus/dbus-chat/chat_adaptor.h
index e682665cce..2cb576724e 100644
--- a/examples/dbus/dbus-chat/chat_adaptor.h
+++ b/examples/dbus/dbus-chat/chat_adaptor.h
@@ -38,7 +38,7 @@
**
**
** This file was generated by qdbusxml2cpp version 0.7
-** Command line was: qdbusxml2cpp -a chat_adaptor.h: com.trolltech.chat.xml
+** Command line was: qdbusxml2cpp -a chat_adaptor.h: org.example.chat.xml
**
** qdbusxml2cpp is Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
**
@@ -64,14 +64,14 @@ class QVariant;
QT_END_NAMESPACE
/*
- * Adaptor class for interface com.trolltech.chat
+ * Adaptor class for interface org.example.chat
*/
class ChatAdaptor: public QDBusAbstractAdaptor
{
Q_OBJECT
- Q_CLASSINFO("D-Bus Interface", "com.trolltech.chat")
+ Q_CLASSINFO("D-Bus Interface", "org.example.chat")
Q_CLASSINFO("D-Bus Introspection", ""
-" <interface name=\"com.trolltech.chat\">\n"
+" <interface name=\"org.example.chat\">\n"
" <signal name=\"message\">\n"
" <arg direction=\"out\" type=\"s\" name=\"nickname\"/>\n"
" <arg direction=\"out\" type=\"s\" name=\"text\"/>\n"
diff --git a/examples/dbus/dbus-chat/chat_interface.cpp b/examples/dbus/dbus-chat/chat_interface.cpp
index 8c35e537ed..eb2258d5d4 100644
--- a/examples/dbus/dbus-chat/chat_interface.cpp
+++ b/examples/dbus/dbus-chat/chat_interface.cpp
@@ -38,7 +38,7 @@
**
**
** This file was generated by qdbusxml2cpp version 0.7
-** Command line was: qdbusxml2cpp -i chat_interface.h -p :chat_interface.cpp com.trolltech.chat.xml
+** Command line was: qdbusxml2cpp -i chat_interface.h -p :chat_interface.cpp org.example.chat.xml
**
** qdbusxml2cpp is Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
**
diff --git a/examples/dbus/dbus-chat/chat_interface.h b/examples/dbus/dbus-chat/chat_interface.h
index 3ef00df2d4..ee01a79e4c 100644
--- a/examples/dbus/dbus-chat/chat_interface.h
+++ b/examples/dbus/dbus-chat/chat_interface.h
@@ -38,7 +38,7 @@
**
**
** This file was generated by qdbusxml2cpp version 0.7
-** Command line was: qdbusxml2cpp -p chat_interface.h: com.trolltech.chat.xml
+** Command line was: qdbusxml2cpp -p chat_interface.h: org.example.chat.xml
**
** qdbusxml2cpp is Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
**
@@ -60,14 +60,14 @@
#include <QtDBus/QtDBus>
/*
- * Proxy class for interface com.trolltech.chat
+ * Proxy class for interface org.example.chat
*/
class ComTrolltechChatInterface: public QDBusAbstractInterface
{
Q_OBJECT
public:
static inline const char *staticInterfaceName()
- { return "com.trolltech.chat"; }
+ { return "org.example.chat"; }
public:
ComTrolltechChatInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0);
diff --git a/examples/dbus/dbus-chat/com.trolltech.chat.xml b/examples/dbus/dbus-chat/com.trolltech.chat.xml
index 618c8c4dcc..acb6dc1d57 100644
--- a/examples/dbus/dbus-chat/com.trolltech.chat.xml
+++ b/examples/dbus/dbus-chat/com.trolltech.chat.xml
@@ -1,7 +1,7 @@
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
- <interface name="com.trolltech.chat">
+ <interface name="org.example.chat">
<signal name="message">
<arg name="nickname" type="s" direction="out"/>
<arg name="text" type="s" direction="out"/>
diff --git a/examples/dbus/dbus-chat/dbus-chat.pro b/examples/dbus/dbus-chat/dbus-chat.pro
index 29b1f56826..2dc17fe667 100644
--- a/examples/dbus/dbus-chat/dbus-chat.pro
+++ b/examples/dbus/dbus-chat/dbus-chat.pro
@@ -5,8 +5,8 @@ HEADERS += chat.h chat_adaptor.h chat_interface.h
SOURCES += chat.cpp chat_adaptor.cpp chat_interface.cpp
FORMS += chatmainwindow.ui chatsetnickname.ui
-#DBUS_ADAPTORS += com.trolltech.chat.xml
-#DBUS_INTERFACES += com.trolltech.chat.xml
+#DBUS_ADAPTORS += org.example.chat.xml
+#DBUS_INTERFACES += org.example.chat.xml
# install
target.path = $$[QT_INSTALL_EXAMPLES]/qtbase/dbus/chat
diff --git a/examples/dbus/pingpong/ping-common.h b/examples/dbus/pingpong/ping-common.h
index 987c8b6d96..0cde67302f 100644
--- a/examples/dbus/pingpong/ping-common.h
+++ b/examples/dbus/pingpong/ping-common.h
@@ -38,4 +38,4 @@
**
****************************************************************************/
-#define SERVICE_NAME "com.trolltech.QtDBus.PingExample"
+#define SERVICE_NAME "org.example.QtDBus.PingExample"
diff --git a/examples/dbus/remotecontrolledcar/car/car.xml b/examples/dbus/remotecontrolledcar/car/car.xml
index 641c6982d4..6d8c9d19f2 100644
--- a/examples/dbus/remotecontrolledcar/car/car.xml
+++ b/examples/dbus/remotecontrolledcar/car/car.xml
@@ -1,7 +1,7 @@
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node name="/com/trollech/examples/car">
- <interface name="com.trolltech.Examples.CarInterface">
+ <interface name="org.example.Examples.CarInterface">
<method name="accelerate"/>
<method name="decelerate"/>
<method name="turnLeft"/>
diff --git a/examples/dbus/remotecontrolledcar/car/car_adaptor.cpp b/examples/dbus/remotecontrolledcar/car/car_adaptor.cpp
index c7e62829be..e70b5bc873 100644
--- a/examples/dbus/remotecontrolledcar/car/car_adaptor.cpp
+++ b/examples/dbus/remotecontrolledcar/car/car_adaptor.cpp
@@ -74,25 +74,25 @@ CarInterfaceAdaptor::~CarInterfaceAdaptor()
void CarInterfaceAdaptor::accelerate()
{
- // handle method call com.trolltech.Examples.CarInterface.accelerate
+ // handle method call org.example.Examples.CarInterface.accelerate
QMetaObject::invokeMethod(parent(), "accelerate");
}
void CarInterfaceAdaptor::decelerate()
{
- // handle method call com.trolltech.Examples.CarInterface.decelerate
+ // handle method call org.example.Examples.CarInterface.decelerate
QMetaObject::invokeMethod(parent(), "decelerate");
}
void CarInterfaceAdaptor::turnLeft()
{
- // handle method call com.trolltech.Examples.CarInterface.turnLeft
+ // handle method call org.example.Examples.CarInterface.turnLeft
QMetaObject::invokeMethod(parent(), "turnLeft");
}
void CarInterfaceAdaptor::turnRight()
{
- // handle method call com.trolltech.Examples.CarInterface.turnRight
+ // handle method call org.example.Examples.CarInterface.turnRight
QMetaObject::invokeMethod(parent(), "turnRight");
}
diff --git a/examples/dbus/remotecontrolledcar/car/car_adaptor.h b/examples/dbus/remotecontrolledcar/car/car_adaptor.h
index 3c2c1dd124..c7542ae811 100644
--- a/examples/dbus/remotecontrolledcar/car/car_adaptor.h
+++ b/examples/dbus/remotecontrolledcar/car/car_adaptor.h
@@ -64,14 +64,14 @@ class QVariant;
QT_END_NAMESPACE
/*
- * Adaptor class for interface com.trolltech.Examples.CarInterface
+ * Adaptor class for interface org.example.Examples.CarInterface
*/
class CarInterfaceAdaptor: public QDBusAbstractAdaptor
{
Q_OBJECT
- Q_CLASSINFO("D-Bus Interface", "com.trolltech.Examples.CarInterface")
+ Q_CLASSINFO("D-Bus Interface", "org.example.Examples.CarInterface")
Q_CLASSINFO("D-Bus Introspection", ""
-" <interface name=\"com.trolltech.Examples.CarInterface\">\n"
+" <interface name=\"org.example.Examples.CarInterface\">\n"
" <method name=\"accelerate\"/>\n"
" <method name=\"decelerate\"/>\n"
" <method name=\"turnLeft\"/>\n"
diff --git a/examples/dbus/remotecontrolledcar/car/main.cpp b/examples/dbus/remotecontrolledcar/car/main.cpp
index 99dccbae0c..7bb4aa1720 100644
--- a/examples/dbus/remotecontrolledcar/car/main.cpp
+++ b/examples/dbus/remotecontrolledcar/car/main.cpp
@@ -66,7 +66,7 @@ int main(int argc, char *argv[])
new CarInterfaceAdaptor(car);
QDBusConnection connection = QDBusConnection::sessionBus();
connection.registerObject("/Car", car);
- connection.registerService("com.trolltech.CarExample");
+ connection.registerService("org.example.CarExample");
return app.exec();
}
diff --git a/examples/dbus/remotecontrolledcar/controller/car.xml b/examples/dbus/remotecontrolledcar/controller/car.xml
index 641c6982d4..6d8c9d19f2 100644
--- a/examples/dbus/remotecontrolledcar/controller/car.xml
+++ b/examples/dbus/remotecontrolledcar/controller/car.xml
@@ -1,7 +1,7 @@
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node name="/com/trollech/examples/car">
- <interface name="com.trolltech.Examples.CarInterface">
+ <interface name="org.example.Examples.CarInterface">
<method name="accelerate"/>
<method name="decelerate"/>
<method name="turnLeft"/>
diff --git a/examples/dbus/remotecontrolledcar/controller/car_interface.h b/examples/dbus/remotecontrolledcar/controller/car_interface.h
index fadd127460..8d624b3746 100644
--- a/examples/dbus/remotecontrolledcar/controller/car_interface.h
+++ b/examples/dbus/remotecontrolledcar/controller/car_interface.h
@@ -60,14 +60,14 @@
#include <QtDBus/QtDBus>
/*
- * Proxy class for interface com.trolltech.Examples.CarInterface
+ * Proxy class for interface org.example.Examples.CarInterface
*/
class ComTrolltechExamplesCarInterfaceInterface: public QDBusAbstractInterface
{
Q_OBJECT
public:
static inline const char *staticInterfaceName()
- { return "com.trolltech.Examples.CarInterface"; }
+ { return "org.example.Examples.CarInterface"; }
public:
ComTrolltechExamplesCarInterfaceInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0);
diff --git a/examples/dbus/remotecontrolledcar/controller/controller.cpp b/examples/dbus/remotecontrolledcar/controller/controller.cpp
index 77a6883b11..fb829da17c 100644
--- a/examples/dbus/remotecontrolledcar/controller/controller.cpp
+++ b/examples/dbus/remotecontrolledcar/controller/controller.cpp
@@ -47,7 +47,7 @@ Controller::Controller(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
- car = new com::trolltech::Examples::CarInterface("com.trolltech.CarExample", "/Car",
+ car = new com::trolltech::Examples::CarInterface("org.example.CarExample", "/Car",
QDBusConnection::sessionBus(), this);
startTimer(1000);
}
diff --git a/examples/dialogs/findfiles/window.cpp b/examples/dialogs/findfiles/window.cpp
index 7cf0079ffe..6b89436dc8 100644
--- a/examples/dialogs/findfiles/window.cpp
+++ b/examples/dialogs/findfiles/window.cpp
@@ -225,7 +225,7 @@ void Window::createFilesTable()
QStringList labels;
labels << tr("Filename") << tr("Size");
filesTable->setHorizontalHeaderLabels(labels);
- filesTable->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch);
+ filesTable->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
filesTable->verticalHeader()->hide();
filesTable->setShowGrid(false);
diff --git a/examples/graphicsview/elasticnodes/graphwidget.cpp b/examples/graphicsview/elasticnodes/graphwidget.cpp
index 4909a42292..36005b85f4 100644
--- a/examples/graphicsview/elasticnodes/graphwidget.cpp
+++ b/examples/graphicsview/elasticnodes/graphwidget.cpp
@@ -199,7 +199,7 @@ void GraphWidget::drawBackground(QPainter *painter, const QRectF &rect)
QLinearGradient gradient(sceneRect.topLeft(), sceneRect.bottomRight());
gradient.setColorAt(0, Qt::white);
gradient.setColorAt(1, Qt::lightGray);
- painter->fillRect(rect.intersect(sceneRect), gradient);
+ painter->fillRect(rect.intersected(sceneRect), gradient);
painter->setBrush(Qt::NoBrush);
painter->drawRect(sceneRect);
diff --git a/examples/itemviews/chart/pieview.cpp b/examples/itemviews/chart/pieview.cpp
index dcf3aca3fb..b60d7ed879 100644
--- a/examples/itemviews/chart/pieview.cpp
+++ b/examples/itemviews/chart/pieview.cpp
@@ -478,7 +478,7 @@ void PieView::setSelection(const QRect &rect, QItemSelectionModel::SelectionFlag
for (int column = 0; column < columns; ++column) {
QModelIndex index = model()->index(row, column, rootIndex());
QRegion region = itemRegion(index);
- if (!region.intersect(contentsRect).isEmpty())
+ if (region.intersects(contentsRect))
indexes.append(index);
}
}
diff --git a/examples/itemviews/fetchmore/filelistmodel.cpp b/examples/itemviews/fetchmore/filelistmodel.cpp
index 42146f8edc..d9678191d9 100644
--- a/examples/itemviews/fetchmore/filelistmodel.cpp
+++ b/examples/itemviews/fetchmore/filelistmodel.cpp
@@ -107,9 +107,10 @@ void FileListModel::setDirPath(const QString &path)
{
QDir dir(path);
+ beginResetModel();
fileList = dir.entryList();
fileCount = 0;
- reset();
+ endResetModel();
}
//![0]
diff --git a/examples/itemviews/interview/main.cpp b/examples/itemviews/interview/main.cpp
index 92239c9bdb..fa059cdb53 100644
--- a/examples/itemviews/interview/main.cpp
+++ b/examples/itemviews/interview/main.cpp
@@ -61,8 +61,8 @@ int main(int argc, char *argv[])
QTableView *table = new QTableView;
table->setModel(data);
table->setSelectionModel(selections);
- table->horizontalHeader()->setMovable(true);
- table->verticalHeader()->setMovable(true);
+ table->horizontalHeader()->setSectionsMovable(true);
+ table->verticalHeader()->setSectionsMovable(true);
// Set StaticContents to enable minimal repaints on resizes.
table->viewport()->setAttribute(Qt::WA_StaticContents);
page.addWidget(table);
diff --git a/examples/itemviews/pixelator/imagemodel.cpp b/examples/itemviews/pixelator/imagemodel.cpp
index 5b64fb26e2..efbf2d35bc 100644
--- a/examples/itemviews/pixelator/imagemodel.cpp
+++ b/examples/itemviews/pixelator/imagemodel.cpp
@@ -52,8 +52,9 @@ ImageModel::ImageModel(QObject *parent)
//! [1]
void ImageModel::setImage(const QImage &image)
{
+ beginResetModel();
modelImage = image;
- reset();
+ endResetModel();
}
//! [1]
diff --git a/examples/mainwindows/mdi/mainwindow.cpp b/examples/mainwindows/mdi/mainwindow.cpp
index 7f7bd84fec..6ba15aa224 100644
--- a/examples/mainwindows/mdi/mainwindow.cpp
+++ b/examples/mainwindows/mdi/mainwindow.cpp
@@ -117,6 +117,7 @@ void MainWindow::saveAs()
statusBar()->showMessage(tr("File saved"), 2000);
}
+#ifndef QT_NO_CLIPBOARD
void MainWindow::cut()
{
if (activeMdiChild())
@@ -134,6 +135,7 @@ void MainWindow::paste()
if (activeMdiChild())
activeMdiChild()->paste();
}
+#endif
void MainWindow::about()
{
@@ -147,7 +149,9 @@ void MainWindow::updateMenus()
bool hasMdiChild = (activeMdiChild() != 0);
saveAct->setEnabled(hasMdiChild);
saveAsAct->setEnabled(hasMdiChild);
+#ifndef QT_NO_CLIPBOARD
pasteAct->setEnabled(hasMdiChild);
+#endif
closeAct->setEnabled(hasMdiChild);
closeAllAct->setEnabled(hasMdiChild);
tileAct->setEnabled(hasMdiChild);
@@ -156,10 +160,12 @@ void MainWindow::updateMenus()
previousAct->setEnabled(hasMdiChild);
separatorAct->setVisible(hasMdiChild);
+#ifndef QT_NO_CLIPBOARD
bool hasSelection = (activeMdiChild() &&
activeMdiChild()->textCursor().hasSelection());
cutAct->setEnabled(hasSelection);
copyAct->setEnabled(hasSelection);
+#endif
}
void MainWindow::updateWindowMenu()
@@ -202,10 +208,12 @@ MdiChild *MainWindow::createMdiChild()
MdiChild *child = new MdiChild;
mdiArea->addSubWindow(child);
+#ifndef QT_NO_CLIPBOARD
connect(child, SIGNAL(copyAvailable(bool)),
cutAct, SLOT(setEnabled(bool)));
connect(child, SIGNAL(copyAvailable(bool)),
copyAct, SLOT(setEnabled(bool)));
+#endif
return child;
}
@@ -239,6 +247,7 @@ void MainWindow::createActions()
connect(exitAct, SIGNAL(triggered()), qApp, SLOT(closeAllWindows()));
//! [0]
+#ifndef QT_NO_CLIPBOARD
cutAct = new QAction(QIcon(":/images/cut.png"), tr("Cu&t"), this);
cutAct->setShortcuts(QKeySequence::Cut);
cutAct->setStatusTip(tr("Cut the current selection's contents to the "
@@ -256,6 +265,7 @@ void MainWindow::createActions()
pasteAct->setStatusTip(tr("Paste the clipboard's contents into the current "
"selection"));
connect(pasteAct, SIGNAL(triggered()), this, SLOT(paste()));
+#endif
closeAct = new QAction(tr("Cl&ose"), this);
closeAct->setStatusTip(tr("Close the active window"));
@@ -313,9 +323,11 @@ void MainWindow::createMenus()
fileMenu->addAction(exitAct);
editMenu = menuBar()->addMenu(tr("&Edit"));
+#ifndef QT_NO_CLIPBOARD
editMenu->addAction(cutAct);
editMenu->addAction(copyAct);
editMenu->addAction(pasteAct);
+#endif
windowMenu = menuBar()->addMenu(tr("&Window"));
updateWindowMenu();
@@ -335,10 +347,12 @@ void MainWindow::createToolBars()
fileToolBar->addAction(openAct);
fileToolBar->addAction(saveAct);
+#ifndef QT_NO_CLIPBOARD
editToolBar = addToolBar(tr("Edit"));
editToolBar->addAction(cutAct);
editToolBar->addAction(copyAct);
editToolBar->addAction(pasteAct);
+#endif
}
void MainWindow::createStatusBar()
diff --git a/examples/mainwindows/mdi/mainwindow.h b/examples/mainwindows/mdi/mainwindow.h
index 00f29e702a..1652ca9749 100644
--- a/examples/mainwindows/mdi/mainwindow.h
+++ b/examples/mainwindows/mdi/mainwindow.h
@@ -67,9 +67,11 @@ private slots:
void open();
void save();
void saveAs();
+#ifndef QT_NO_CLIPBOARD
void cut();
void copy();
void paste();
+#endif
void about();
void updateMenus();
void updateWindowMenu();
@@ -101,9 +103,11 @@ private:
QAction *saveAct;
QAction *saveAsAct;
QAction *exitAct;
+#ifndef QT_NO_CLIPBOARD
QAction *cutAct;
QAction *copyAct;
QAction *pasteAct;
+#endif
QAction *closeAct;
QAction *closeAllAct;
QAction *tileAct;
diff --git a/examples/opengl/hellowindow/hellowindow.cpp b/examples/opengl/hellowindow/hellowindow.cpp
index 489d715166..380ddcc702 100644
--- a/examples/opengl/hellowindow/hellowindow.cpp
+++ b/examples/opengl/hellowindow/hellowindow.cpp
@@ -72,16 +72,21 @@ HelloWindow::HelloWindow(Renderer *renderer)
create();
- QTimer *timer = new QTimer(this);
- connect(timer, SIGNAL(timeout()), this, SLOT(render()));
- timer->start(10);
-
connect(this, SIGNAL(needRender(QSurface *, const QColor &, const QSize &)),
renderer, SLOT(render(QSurface *, const QColor &, const QSize &)));
updateColor();
}
+void HelloWindow::exposeEvent(QExposeEvent *event)
+{
+ render();
+
+ QTimer *timer = new QTimer(this);
+ connect(timer, SIGNAL(timeout()), this, SLOT(render()));
+ timer->start(10);
+}
+
void HelloWindow::mousePressEvent(QMouseEvent *)
{
updateColor();
diff --git a/examples/opengl/hellowindow/hellowindow.h b/examples/opengl/hellowindow/hellowindow.h
index 91267a8ba1..8f294b5ae3 100644
--- a/examples/opengl/hellowindow/hellowindow.h
+++ b/examples/opengl/hellowindow/hellowindow.h
@@ -92,6 +92,8 @@ public:
void updateColor();
+ void exposeEvent(QExposeEvent *event);
+
signals:
void needRender(QSurface *surface, const QColor &color, const QSize &viewSize);
diff --git a/examples/sql/masterdetail/mainwindow.cpp b/examples/sql/masterdetail/mainwindow.cpp
index 0eb8bb4548..4e7abfcbf5 100644
--- a/examples/sql/masterdetail/mainwindow.cpp
+++ b/examples/sql/masterdetail/mainwindow.cpp
@@ -410,7 +410,7 @@ void MainWindow::updateHeader(QModelIndex, int, int)
void MainWindow::adjustHeader()
{
albumView->hideColumn(0);
- albumView->horizontalHeader()->setResizeMode(1, QHeaderView::Stretch);
+ albumView->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);
albumView->resizeColumnToContents(2);
albumView->resizeColumnToContents(3);
}
diff --git a/examples/tools/completer/mainwindow.cpp b/examples/tools/completer/mainwindow.cpp
index bc80bc939f..4d989c3d61 100644
--- a/examples/tools/completer/mainwindow.cpp
+++ b/examples/tools/completer/mainwindow.cpp
@@ -242,8 +242,8 @@ void MainWindow::changeModel()
treeView->setRootIsDecorated(false);
treeView->header()->hide();
treeView->header()->setStretchLastSection(false);
- treeView->header()->setResizeMode(0, QHeaderView::Stretch);
- treeView->header()->setResizeMode(1, QHeaderView::ResizeToContents);
+ treeView->header()->setSectionResizeMode(0, QHeaderView::Stretch);
+ treeView->header()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
contentsLabel->setText(tr("Enter name of your country"));
}
break;
diff --git a/examples/tools/plugandpaint/mainwindow.cpp b/examples/tools/plugandpaint/mainwindow.cpp
index 472e10120d..c33c5be518 100644
--- a/examples/tools/plugandpaint/mainwindow.cpp
+++ b/examples/tools/plugandpaint/mainwindow.cpp
@@ -116,10 +116,10 @@ void MainWindow::brushColor()
void MainWindow::brushWidth()
{
bool ok;
- const int newWidth = QInputDialog::getInteger(this, tr("Plug & Paint"),
- tr("Select brush width:"),
- paintArea->brushWidth(),
- 1, 50, 1, &ok);
+ const int newWidth = QInputDialog::getInt(this, tr("Plug & Paint"),
+ tr("Select brush width:"),
+ paintArea->brushWidth(),
+ 1, 50, 1, &ok);
if (ok)
paintArea->setBrushWidth(newWidth);
}
diff --git a/examples/tools/plugandpaintplugins/extrafilters/extrafiltersplugin.cpp b/examples/tools/plugandpaintplugins/extrafilters/extrafiltersplugin.cpp
index 186f364b77..f7f5310ea9 100644
--- a/examples/tools/plugandpaintplugins/extrafilters/extrafiltersplugin.cpp
+++ b/examples/tools/plugandpaintplugins/extrafilters/extrafiltersplugin.cpp
@@ -73,7 +73,7 @@ QImage ExtraFiltersPlugin::filterImage(const QString &filter,
}
} else if (filter == tr("Smudge...")) {
bool ok;
- int numIters = QInputDialog::getInteger(parent, tr("Smudge Filter"),
+ int numIters = QInputDialog::getInt(parent, tr("Smudge Filter"),
tr("Enter number of iterations:"),
5, 1, 20, 1, &ok);
if (ok) {
@@ -102,7 +102,7 @@ QImage ExtraFiltersPlugin::filterImage(const QString &filter,
}
} else if (filter == tr("Threshold...")) {
bool ok;
- int threshold = QInputDialog::getInteger(parent, tr("Threshold Filter"),
+ int threshold = QInputDialog::getInt(parent, tr("Threshold Filter"),
tr("Enter threshold:"),
10, 1, 256, 1, &ok);
if (ok) {
diff --git a/examples/tools/settingseditor/locationdialog.cpp b/examples/tools/settingseditor/locationdialog.cpp
index e1ec636202..192aaab1b0 100644
--- a/examples/tools/settingseditor/locationdialog.cpp
+++ b/examples/tools/settingseditor/locationdialog.cpp
@@ -89,7 +89,7 @@ LocationDialog::LocationDialog(QWidget *parent)
locationsTable->setEditTriggers(QAbstractItemView::NoEditTriggers);
locationsTable->setColumnCount(2);
locationsTable->setHorizontalHeaderLabels(labels);
- locationsTable->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch);
+ locationsTable->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
locationsTable->horizontalHeader()->resizeSection(1, 180);
buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok
diff --git a/examples/tools/settingseditor/settingstree.cpp b/examples/tools/settingseditor/settingstree.cpp
index b5b3457651..4966ff98d9 100644
--- a/examples/tools/settingseditor/settingstree.cpp
+++ b/examples/tools/settingseditor/settingstree.cpp
@@ -51,8 +51,8 @@ SettingsTree::SettingsTree(QWidget *parent)
QStringList labels;
labels << tr("Setting") << tr("Type") << tr("Value");
setHeaderLabels(labels);
- header()->setResizeMode(0, QHeaderView::Stretch);
- header()->setResizeMode(2, QHeaderView::Stretch);
+ header()->setSectionResizeMode(0, QHeaderView::Stretch);
+ header()->setSectionResizeMode(2, QHeaderView::Stretch);
settings = 0;
refreshTimer.setInterval(2000);
diff --git a/examples/widgets/charactermap/mainwindow.cpp b/examples/widgets/charactermap/mainwindow.cpp
index 44eb30708d..fbe0df616c 100644
--- a/examples/widgets/charactermap/mainwindow.cpp
+++ b/examples/widgets/charactermap/mainwindow.cpp
@@ -70,11 +70,13 @@ MainWindow::MainWindow()
//! [2]
lineEdit = new QLineEdit;
+#ifndef QT_NO_CLIPBOARD
QPushButton *clipboardButton = new QPushButton(tr("&To clipboard"));
//! [2]
//! [3]
clipboard = QApplication::clipboard();
+#endif
//! [3]
//! [4]
@@ -91,7 +93,10 @@ MainWindow::MainWindow()
//! [4] //! [5]
connect(characterWidget, SIGNAL(characterSelected(QString)),
this, SLOT(insertCharacter(QString)));
+
+#ifndef QT_NO_CLIPBOARD
connect(clipboardButton, SIGNAL(clicked()), this, SLOT(updateClipboard()));
+#endif
//! [5]
connect(fontMerging, SIGNAL(toggled(bool)), characterWidget, SLOT(updateFontMerging(bool)));
@@ -110,7 +115,9 @@ MainWindow::MainWindow()
QHBoxLayout *lineLayout = new QHBoxLayout;
lineLayout->addWidget(lineEdit, 1);
lineLayout->addSpacing(12);
+#ifndef QT_NO_CLIPBOARD
lineLayout->addWidget(clipboardButton);
+#endif
QVBoxLayout *centralLayout = new QVBoxLayout;
centralLayout->addLayout(controlsLayout);
@@ -185,6 +192,7 @@ void MainWindow::insertCharacter(const QString &character)
//! [9]
//! [10]
+#ifndef QT_NO_CLIPBOARD
void MainWindow::updateClipboard()
{
//! [11]
@@ -192,4 +200,5 @@ void MainWindow::updateClipboard()
//! [11]
clipboard->setText(lineEdit->text(), QClipboard::Selection);
}
+#endif
//! [10]
diff --git a/examples/widgets/charactermap/mainwindow.h b/examples/widgets/charactermap/mainwindow.h
index 478df1dc06..37109827ab 100644
--- a/examples/widgets/charactermap/mainwindow.h
+++ b/examples/widgets/charactermap/mainwindow.h
@@ -66,11 +66,15 @@ public slots:
void findStyles(const QFont &font);
void findSizes(const QFont &font);
void insertCharacter(const QString &character);
+#ifndef QT_NO_CLIPBOARD
void updateClipboard();
+#endif
private:
CharacterWidget *characterWidget;
+#ifndef QT_NO_CLIPBOARD
QClipboard *clipboard;
+#endif
QComboBox *styleCombo;
QComboBox *sizeCombo;
QFontComboBox *fontCombo;
diff --git a/examples/widgets/icons/mainwindow.cpp b/examples/widgets/icons/mainwindow.cpp
index da4458e9a9..00f5a21854 100644
--- a/examples/widgets/icons/mainwindow.cpp
+++ b/examples/widgets/icons/mainwindow.cpp
@@ -285,9 +285,9 @@ void MainWindow::createImagesGroupBox()
imagesTable->horizontalHeader()->setDefaultSectionSize(90);
imagesTable->setColumnCount(3);
imagesTable->setHorizontalHeaderLabels(labels);
- imagesTable->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch);
- imagesTable->horizontalHeader()->setResizeMode(1, QHeaderView::Fixed);
- imagesTable->horizontalHeader()->setResizeMode(2, QHeaderView::Fixed);
+ imagesTable->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
+ imagesTable->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Fixed);
+ imagesTable->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Fixed);
imagesTable->verticalHeader()->hide();
//! [23]
diff --git a/examples/widgets/scribble/mainwindow.cpp b/examples/widgets/scribble/mainwindow.cpp
index 00bf9884c9..6db7b39b4c 100644
--- a/examples/widgets/scribble/mainwindow.cpp
+++ b/examples/widgets/scribble/mainwindow.cpp
@@ -107,10 +107,10 @@ void MainWindow::penWidth()
//! [9] //! [10]
{
bool ok;
- int newWidth = QInputDialog::getInteger(this, tr("Scribble"),
- tr("Select pen width:"),
- scribbleArea->penWidth(),
- 1, 50, 1, &ok);
+ int newWidth = QInputDialog::getInt(this, tr("Scribble"),
+ tr("Select pen width:"),
+ scribbleArea->penWidth(),
+ 1, 50, 1, &ok);
if (ok)
scribbleArea->setPenWidth(newWidth);
}
diff --git a/mkspecs/cmake/Qt5BasicConfig.cmake.in b/mkspecs/cmake/Qt5BasicConfig.cmake.in
index a04d2b4d4e..f8e092f8b4 100644
--- a/mkspecs/cmake/Qt5BasicConfig.cmake.in
+++ b/mkspecs/cmake/Qt5BasicConfig.cmake.in
@@ -17,12 +17,27 @@ string(TOUPPER "$${CMAKE_MODULE_NAME}" _CMAKE_MODULE_NAME_UPPER)
set(Qt5$${CMAKE_MODULE_NAME}_DEFINITIONS -DQT_\${_CMAKE_MODULE_NAME_UPPER}_LIB)
set(Qt5$${CMAKE_MODULE_NAME}_COMPILE_DEFINITIONS QT_\${_CMAKE_MODULE_NAME_UPPER}_LIB)
-set(_Qt5_MODULE_DEPENDENCIES \"$${CMAKE_MODULE_DEPS}\")
+set(_Qt5$${CMAKE_MODULE_NAME}_MODULE_DEPENDENCIES \"$${CMAKE_MODULE_DEPS}\")
-foreach(_module_dep ${_Qt5_MODULE_DEPENDENCIES})
+set(_Qt5$${CMAKE_MODULE_NAME}_FIND_DEPENDENCIES_REQUIRED)
+if (Qt5$${CMAKE_MODULE_NAME}_FIND_REQUIRED)
+ set(_Qt5$${CMAKE_MODULE_NAME}_FIND_DEPENDENCIES_REQUIRED REQUIRED)
+endif()
+set(_Qt5$${CMAKE_MODULE_NAME}_FIND_DEPENDENCIES_QUIET)
+if (Qt5$${CMAKE_MODULE_NAME}_FIND_QUIETLY)
+ set(_Qt5$${CMAKE_MODULE_NAME}_DEPENDENCIES_FIND_QUIET QUIET)
+endif()
+
+foreach(_module_dep ${_Qt5$${CMAKE_MODULE_NAME}_MODULE_DEPENDENCIES})
if (NOT Qt5${_module_dep}_FOUND)
- find_package(Qt5${_module_dep} REQUIRED)
+ find_package(Qt5${_module_dep} ${_Qt5$${CMAKE_MODULE_NAME}_DEPENDENCIES_FIND_QUIET} ${_Qt5$${CMAKE_MODULE_NAME}_FIND_DEPENDENCIES_REQUIRED})
endif()
+
+ if (NOT Qt5${_module_dep}_FOUND)
+ set(Qt5$${CMAKE_MODULE_NAME}_FOUND False)
+ return()
+ endif()
+
list(APPEND Qt5$${CMAKE_MODULE_NAME}_INCLUDE_DIRS ${Qt5${_module_dep}_INCLUDE_DIRS})
list(APPEND Qt5$${CMAKE_MODULE_NAME}_DEFINITIONS ${Qt5${_module_dep}_DEFINITIONS})
list(APPEND Qt5$${CMAKE_MODULE_NAME}_COMPILE_DEFINITIONS ${Qt5${_module_dep}_COMPILE_DEFINITIONS})
@@ -35,7 +50,7 @@ if (Qt5$${CMAKE_MODULE_NAME}_EXECUTABLE_COMPILE_FLAGS)
list(REMOVE_DUPLICATES Qt5$${CMAKE_MODULE_NAME}_EXECUTABLE_COMPILE_FLAGS)
endif()
-set(Qt5$${CMAKE_MODULE_NAME}_LIB_DEPENDENCIES "$${CMAKE_QT5_MODULE_DEPS}")
+set(Qt5$${CMAKE_MODULE_NAME}_LIB_DEPENDENCIES \"$${CMAKE_QT5_MODULE_DEPS}\")
!!IF !isEmpty(CMAKE_STATIC_TYPE)
# For static builds, we also list the dependencies of
diff --git a/mkspecs/common/gcc-base-ios.conf b/mkspecs/common/gcc-base-ios.conf
new file mode 100644
index 0000000000..68ec777f85
--- /dev/null
+++ b/mkspecs/common/gcc-base-ios.conf
@@ -0,0 +1,33 @@
+#
+# Base qmake configuration for GCC on iOS
+#
+# Before making changes to this file, please read the comment in
+# gcc-base.conf, to make sure the change goes in the right place.
+#
+# To verify that your change has the desired effect on the final configuration
+# you can use the manual test in tests/manual/mkspecs.
+#
+
+include(gcc-base.conf)
+
+QMAKE_COMPILER_DEFINES += __APPLE__ __GNUC__=4
+
+QMAKE_CFLAGS_DWARF2 += -gdwarf-2
+
+QMAKE_CXXFLAGS_DWARF2 += $$QMAKE_CFLAGS_DWARF2
+
+QMAKE_OBJECTIVE_CFLAGS = $$QMAKE_CFLAGS
+QMAKE_OBJECTIVE_CFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON
+QMAKE_OBJECTIVE_CFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF
+QMAKE_OBJECTIVE_CFLAGS_DEBUG = $$QMAKE_CFLAGS_DEBUG
+QMAKE_OBJECTIVE_CFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE
+QMAKE_OBJECTIVE_CFLAGS_HIDESYMS = $$QMAKE_CXXFLAGS_HIDESYMS
+
+QMAKE_LFLAGS += -headerpad_max_install_names
+QMAKE_LFLAGS_SHLIB += -single_module -dynamiclib
+QMAKE_LFLAGS_PLUGIN += $$QMAKE_LFLAGS_SHLIB
+QMAKE_LFLAGS_INCREMENTAL += -undefined suppress -flat_namespace
+QMAKE_LFLAGS_SONAME += -install_name$${LITERAL_WHITESPACE}@executable_path/
+QMAKE_LFLAGS_VERSION += -current_version$${LITERAL_WHITESPACE}
+QMAKE_LFLAGS_COMPAT_VERSION += -compatibility_version$${LITERAL_WHITESPACE}
+
diff --git a/mkspecs/common/gcc-base.conf b/mkspecs/common/gcc-base.conf
index 28e3b87b5d..4a8419aa78 100644
--- a/mkspecs/common/gcc-base.conf
+++ b/mkspecs/common/gcc-base.conf
@@ -7,6 +7,7 @@
#
# Platform-specific options shared by these compilers are put into:
#
+# - gcc-base-ios.conf
# - gcc-base-macx.conf
# - gcc-base-unix.conf
#
diff --git a/mkspecs/common/ios.conf b/mkspecs/common/ios.conf
new file mode 100644
index 0000000000..5f28a5c5b2
--- /dev/null
+++ b/mkspecs/common/ios.conf
@@ -0,0 +1,21 @@
+#
+# qmake common configuration for iOS
+#
+
+MAKEFILE_GENERATOR = UNIX
+TEMPLATE = app
+CONFIG += qt ios warn_on release reduce_exports incremental global_init_link_order lib_version_first plugin_no_soname link_prl
+QT += core gui opengl
+QMAKE_INCREMENTAL_STYLE = sublib
+
+# Qt can't build iOS app bundle :(
+CONFIG -= app_bundle
+
+# Not deploying to Mac OSX
+QMAKE_MACOSX_DEPLOYMENT_TARGET =
+
+# Add iOS common folder to include path
+INCLUDEPATH += $$PWD/ios
+
+# iOS defines
+DEFINES += DARWIN_NO_CARBON Q_OS_IOS QT_NO_CORESERVICES QT_NO_PRINTER QT_NO_PRINTDIALOG
diff --git a/src/plugins/platforms/openkode/shaders/frag.glslf b/mkspecs/common/ios/GLES/gl.h
index f657f4f926..c074eb29b1 100644
--- a/src/plugins/platforms/openkode/shaders/frag.glslf
+++ b/mkspecs/common/ios/GLES/gl.h
@@ -3,7 +3,7 @@
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/
**
-** This file is part of the plugins of the Qt Toolkit.
+** This file is part of the qmake spec of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
@@ -39,11 +39,5 @@
**
****************************************************************************/
-uniform sampler2D tex_samp;
-
-varying vec2 texcoord_var;
-
-void main(void)
-{
- gl_FragColor = texture2D(tex_samp, texcoord_var);
-}
+#include <OpenGLES/ES1/gl.h>
+#include <OpenGLES/ES1/glext.h>
diff --git a/mkspecs/common/ios/GLES2/gl2.h b/mkspecs/common/ios/GLES2/gl2.h
new file mode 100644
index 0000000000..07e3abded1
--- /dev/null
+++ b/mkspecs/common/ios/GLES2/gl2.h
@@ -0,0 +1,43 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the qmake spec of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <OpenGLES/ES2/gl.h>
+#include <OpenGLES/ES2/glext.h>
diff --git a/mkspecs/common/ios/arch.conf b/mkspecs/common/ios/arch.conf
new file mode 100644
index 0000000000..4ad96874fe
--- /dev/null
+++ b/mkspecs/common/ios/arch.conf
@@ -0,0 +1,84 @@
+#
+# Helper to set CPU architecture flags for iOS configurations
+#
+# Depends on:
+#
+# QMAKE_IPHONEOS_DEPLOYMENT_TARGET - set in mkspecs/common/ios/versions.conf
+#
+# Note:
+#
+# Must be included after load(qt_config) in mkspec for auto-detection based
+# on GL/ES version (GL/ES 2.x implies armv7 on iOS).
+#
+
+# Target architecture for iOS devices (armv6, armv7 or leave blank for default)
+QMAKE_IOS_TARGET_ARCH =
+
+###########################################################################
+
+# Device?
+!*simulator* {
+ # Let mkspec specify archictecture
+ *armv6*: QMAKE_IOS_TARGET_ARCH = armv6
+ else:*armv7*: QMAKE_IOS_TARGET_ARCH = armv7
+
+ # ARMv7 architecture device (see below) is required for OpenGL/ES 2.x
+ isEmpty(QMAKE_IOS_TARGET_ARCH):contains(QT_CONFIG, opengles2): QMAKE_IOS_TARGET_ARCH = armv7
+
+ # No target architecture specified?
+ isEmpty(QMAKE_IOS_TARGET_ARCH) {
+ # iOS versions < 4.3 can be armv6 or armv7, so need armv6 for max. compatibility,
+ # assume that building for OpenGL/ES 1.x is targeting armv6
+ lessThan(QMAKE_IPHONEOS_DEPLOYMENT_TARGET, "4.3")|contains(QT_CONFIG, opengles1) {
+ QMAKE_IOS_TARGET_ARCH = armv6
+ } else: QMAKE_IOS_TARGET_ARCH = armv7
+ }
+
+ # Samsung S5PC100, Apple A4, A5, A5X
+ equals(QMAKE_IOS_TARGET_ARCH, "armv7") {
+ # iOS CPU architecture (armv7)
+ QMAKE_IOS_ARM_ARCH = __ARM_ARCH_7__
+
+ # Thumb2 instructions
+ QMAKE_IOS_ARM_FLAGS = -mthumb
+ QMAKE_IOS_ARM_ARCH += __MARM_THUMB__
+
+ # NEON instructions
+ *-g++*: QMAKE_IOS_ARM_FLAGS += -mfloat-abi=softfp -mfpu=neon
+ QMAKE_IOS_ARM_ARCH += __ARM_NEON__
+ } else {
+ # Samsung S5L8900
+ if(equals(QMAKE_IOS_TARGET_ARCH, "armv6")) {
+ # iOS CPU architecture (armv6)
+ QMAKE_IOS_ARM_ARCH = __ARM_ARCH_6__
+
+ # ARM instructions
+ QMAKE_IOS_ARM_FLAGS = -marm -mcpu=arm1176jzf-s
+ !*clang*: QMAKE_IOS_ARM_FLAGS += -march=armv6
+ } else {
+ # Unsupported architecture
+ error("Invalid iOS target $${QMAKE_IOS_TARGET_ARCH}! Edit mkspecs/common/ios/arch.conf to specify target architecture.")
+ }
+ }
+# Simulator is i386 only
+} else: QMAKE_IOS_TARGET_ARCH = i386
+
+# iOS architecture build flags
+QMAKE_IOS_ARCH_FLAGS = -arch $$QMAKE_IOS_TARGET_ARCH
+QMAKE_CFLAGS += $$QMAKE_IOS_ARCH_FLAGS
+QMAKE_CXXFLAGS += $$QMAKE_IOS_ARCH_FLAGS
+QMAKE_OBJECTIVE_CFLAGS += $$QMAKE_IOS_ARCH_FLAGS
+QMAKE_LFLAGS += $$QMAKE_IOS_ARCH_FLAGS
+QMAKE_IOS_TARGET_ARCH =
+QMAKE_IOS_ARCH_FLAGS =
+
+# Architecture specific defines/flags
+!*simulator* {
+ DEFINES += $$QMAKE_IOS_ARM_ARCH
+ QMAKE_IOS_ARM_ARCH =
+
+ QMAKE_CFLAGS += $$QMAKE_IOS_ARM_FLAGS
+ QMAKE_CXXFLAGS += $$QMAKE_IOS_ARM_FLAGS
+ QMAKE_OBJECTIVE_CFLAGS += $$QMAKE_IOS_ARM_FLAGS
+ QMAKE_IOS_ARM_FLAGS =
+}
diff --git a/mkspecs/common/ios/clang.conf b/mkspecs/common/ios/clang.conf
new file mode 100644
index 0000000000..e5c9b338c1
--- /dev/null
+++ b/mkspecs/common/ios/clang.conf
@@ -0,0 +1,47 @@
+#
+# compiler settings for iOS clang compilers
+#
+# Depends on:
+#
+# QMAKE_IOS_XCODE_VERSION - set in mkspecs/common/ios/versions.conf
+#
+
+# iOS build flags
+QMAKE_IOS_CFLAGS = -fvisibility=hidden -fpascal-strings -fmessage-length=0
+QMAKE_IOS_CFLAGS += -Wno-trigraphs -Wreturn-type -Wparentheses -Wswitch -Wno-unused-parameter -Wunused-variable -Wunused-value -Wno-shorten-64-to-32 -Wno-sign-conversion
+QMAKE_IOS_CXXFLAGS = -fvisibility-inlines-hidden
+QMAKE_IOS_OBJ_CFLAGS = -Wno-arc-abi -Wc++0x-extensions
+
+# Device or simulator specific flags
+*simulator* {
+ QMAKE_IOS_CFLAGS += -fexceptions -fasm-blocks
+ QMAKE_IOS_OBJ_CFLAGS += -fobjc-abi-version=2 -fobjc-legacy-dispatch
+}
+
+# Compiler version-specific flags
+!lessThan(QMAKE_IOS_XCODE_VERSION, "4.3") {
+ # Clang 3.1 flags (will be used for later versions too)
+ QMAKE_IOS_CFLAGS += -Wno-missing-field-initializers -Wno-missing-prototypes -Wno-implicit-atomic-properties -Wformat -Wno-missing-braces -Wno-unused-function -Wno-unused-label -Wuninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-sign-compare -Wpointer-sign -Wno-newline-eof -Wdeprecated-declarations -Winvalid-offsetof -Wno-conversion
+ QMAKE_IOS_CXXFLAGS += -Wno-non-virtual-dtor -Wno-overloaded-virtual -Wno-exit-time-destructors -Wc++11-extensions
+ QMAKE_IOS_OBJ_CFLAGS += -Wno-deprecated-implementations -Wprotocol -Wno-selector -Wno-strict-selector-match -Wno-undeclared-selector
+
+ # Warn about unsupported (later) Xcode versions
+ !lessThan(QMAKE_IOS_XCODE_VERSION, "4.4"): warning("The version of Xcode installed on this system is not recognised - custom compiler settings may be necessary")
+} else {
+ if (!lessThan(QMAKE_IOS_XCODE_VERSION, "4.2")) {
+ # Clang 3.0 flags
+ QMAKE_IOS_CFLAGS += -fdiagnostics-print-source-range-info -fdiagnostics-show-category=id -fdiagnostics-parseable-fixits
+ } else {
+ # Older Clang versions are not supported
+ error("Unsupported Xcode version $${QMAKE_IOS_XCODE_VERSION}")
+ }
+}
+
+# Set build flags
+QMAKE_CFLAGS += $$QMAKE_IOS_CFLAGS
+QMAKE_CXXFLAGS += $$QMAKE_IOS_CFLAGS $$QMAKE_IOS_CXXFLAGS
+QMAKE_OBJECTIVE_CFLAGS += $$QMAKE_IOS_CFLAGS $$QMAKE_IOS_CXXFLAGS $$QMAKE_IOS_OBJ_CFLAGS
+
+QMAKE_IOS_CFLAGS =
+QMAKE_IOS_CXXFLAGS =
+QMAKE_IOS_OBJ_CFLAGS =
diff --git a/mkspecs/common/ios/g++.conf b/mkspecs/common/ios/g++.conf
new file mode 100644
index 0000000000..8a1e0b20c0
--- /dev/null
+++ b/mkspecs/common/ios/g++.conf
@@ -0,0 +1,21 @@
+#
+# compiler settings for iOS g++ compilers
+#
+
+# iOS build flags
+QMAKE_IOS_CFLAGS = -fvisibility=hidden -fexceptions -fmessage-length=0
+QMAKE_IOS_CFLAGS += -Wno-trigraphs -Wreturn-type -Wunused-variable
+QMAKE_IOS_CXXFLAGS = -fvisibility-inlines-hidden
+
+# Device or simulator specific flags
+!*simulator*: QMAKE_IOS_OBJ_CFLAGS =
+else: QMAKE_IOS_OBJ_CFLAGS = -fobjc-abi-version=2 -fobjc-legacy-dispatch
+
+# Set build flags
+QMAKE_CFLAGS += $$QMAKE_IOS_CFLAGS
+QMAKE_CXXFLAGS += $$QMAKE_IOS_CFLAGS $$QMAKE_IOS_CXXFLAGS
+QMAKE_OBJECTIVE_CFLAGS += $$QMAKE_IOS_CFLAGS $$QMAKE_IOS_CXXFLAGS $$QMAKE_IOS_OBJ_CFLAGS
+
+QMAKE_IOS_CFLAGS =
+QMAKE_IOS_CXXFLAGS =
+QMAKE_IOS_OBJ_CFLAGS =
diff --git a/mkspecs/common/ios/llvm.conf b/mkspecs/common/ios/llvm.conf
new file mode 100644
index 0000000000..fa2e519dd9
--- /dev/null
+++ b/mkspecs/common/ios/llvm.conf
@@ -0,0 +1,31 @@
+#
+# compiler settings for iOS llvm-g++ compilers
+#
+# Depends on:
+#
+# QMAKE_IOS_XCODE_VERSION - set in mkspecs/common/ios/versions.conf
+#
+
+# iOS build flags
+QMAKE_IOS_CFLAGS = -fvisibility=hidden -fpascal-strings -fmessage-length=0
+QMAKE_IOS_CFLAGS += -Wno-trigraphs -Wreturn-type -Wunused-variable
+QMAKE_IOS_CXXFLAGS = -fvisibility-inlines-hidden
+
+# Device or simulator specific flags
+!*simulator*: QMAKE_IOS_OBJ_CFLAGS =
+else: QMAKE_IOS_OBJ_CFLAGS = -fobjc-abi-version=2 -fobjc-legacy-dispatch
+
+# Compiler version specific flags
+!lessThan(QMAKE_IOS_XCODE_VERSION, "4.3") {
+ # Xcode 4.3+ specific flags
+ QMAKE_IOS_CFLAGS += -Wuninitialized
+}
+
+# Set build flags
+QMAKE_CFLAGS += $$QMAKE_IOS_CFLAGS
+QMAKE_CXXFLAGS += $$QMAKE_IOS_CFLAGS $$QMAKE_IOS_CXXFLAGS
+QMAKE_OBJECTIVE_CFLAGS += $$QMAKE_IOS_CFLAGS $$QMAKE_IOS_CXXFLAGS $$QMAKE_IOS_OBJ_CFLAGS
+
+QMAKE_IOS_CFLAGS =
+QMAKE_IOS_CXXFLAGS =
+QMAKE_IOS_OBJ_CFLAGS =
diff --git a/mkspecs/common/ios/qmake.conf b/mkspecs/common/ios/qmake.conf
new file mode 100644
index 0000000000..8ee2575fb4
--- /dev/null
+++ b/mkspecs/common/ios/qmake.conf
@@ -0,0 +1,66 @@
+#
+# Common build settings for all iOS configurations
+#
+# Depends on:
+#
+# QMAKE_IOS_XCODE_VERSION - set in mkspecs/common/ios/versions.conf
+# QMAKE_IOS_SDK_VERSION - set in mkspecs/common/ios/versions.conf
+# QMAKE_IOSSIMULATOR_SDK_VERSION - set in mkspecs/common/ios/versions.conf
+#
+
+# iOS SDK device type
+!*simulator*: QMAKE_IOS_DEVICE_TYPE = iPhoneOS
+else {
+ QMAKE_IOS_DEVICE_TYPE = iPhoneSimulator
+
+ # Use simulator SDK version
+ QMAKE_IOS_SDK_VERSION = $$QMAKE_IOS_SIMULATOR_SDK_VERSION
+ QMAKE_IOS_SIMULATOR_SDK_VERSION =
+}
+
+!lessThan(QMAKE_IOS_XCODE_VERSION, "4.3") {
+ # Xcode 4.3+ is stored in /Applications
+ QMAKE_IOS_XCODE_PATH = /Applications/Xcode.app/Contents
+} else: QMAKE_IOS_XCODE_PATH =
+
+# iOS platform /Developer path
+QMAKE_IOS_DEV_PATH = $$QMAKE_IOS_XCODE_PATH/Developer/Platforms/$${QMAKE_IOS_DEVICE_TYPE}.platform/Developer
+QMAKE_IOS_XCODE_PATH =
+
+# iOS platform SDK path
+QMAKE_IOS_SDK = $$QMAKE_IOS_DEV_PATH/SDKs/$${QMAKE_IOS_DEVICE_TYPE}$${QMAKE_IOS_SDK_VERSION}.sdk
+QMAKE_IOS_DEV_PATH =
+QMAKE_IOS_DEVICE_TYPE =
+
+QMAKE_CFLAGS += -isysroot $$QMAKE_IOS_SDK
+QMAKE_CXXFLAGS += -isysroot $$QMAKE_IOS_SDK
+QMAKE_OBJECTIVE_CFLAGS += -isysroot $$QMAKE_IOS_SDK
+QMAKE_LFLAGS += -Wl,-syslibroot,$$QMAKE_IOS_SDK
+QMAKE_IOS_SDK =
+
+# Basic iOS frameworks needed for any GUI app
+QMAKE_LFLAGS += -framework Foundation -framework UIKit -framework QuartzCore -lz
+
+# OpenGL ES1
+QMAKE_INCDIR_OPENGL_ES1 = $$QMAKE_IOS_SDK/System/Library/Frameworks/OpenGLES.framework/Headers
+QMAKE_LIBDIR_OPENGL_ES1 =
+QMAKE_LIBS_OPENGL_ES1 = -framework OpenGLES
+
+# OpenGL ES2
+QMAKE_INCDIR_OPENGL_ES2 = $$QMAKE_IOS_SDK/System/Library/Frameworks/OpenGLES.framework/Headers
+QMAKE_LIBDIR_OPENGL_ES2 =
+QMAKE_LIBS_OPENGL_ES2 = -framework OpenGLES
+
+# No desktop OpenGL
+QMAKE_INCDIR_OPENGL =
+QMAKE_LIBS_OPENGL =
+QMAKE_LIBS_OPENGL_QT =
+
+# Compiler-specific flags
+!*-g++* {
+ # Objective-C/C++ precompile flags
+ QMAKE_OBJCFLAGS_PRECOMPILE = -x objective-c-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
+ QMAKE_OBJCFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
+ QMAKE_OBJCXXFLAGS_PRECOMPILE = -x objective-c++-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
+ QMAKE_OBJCXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
+}
diff --git a/src/plugins/platforms/openvglite/qgraphicssystem_vglite.h b/mkspecs/common/ios/qplatformdefs.h
index 46faf7cd2c..d25d99320a 100644
--- a/src/plugins/platforms/openvglite/qgraphicssystem_vglite.h
+++ b/mkspecs/common/ios/qplatformdefs.h
@@ -3,7 +3,7 @@
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/
**
-** This file is part of the plugins of the Qt Toolkit.
+** This file is part of the qmake spec of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
@@ -39,55 +39,62 @@
**
****************************************************************************/
-#ifndef QGRAPHICSSYSTEM_VGLITE_H
-#define QGRAPHICSSYSTEM_VGLITE_H
+#ifndef QPLATFORMDEFS_H
+#define QPLATFORMDEFS_H
-#include <QtGui/private/qgraphicssystem_p.h>
-#include <QtGui/private/qegl_p.h>
-#include <QtGui/qimage.h>
+// Get Qt defines/settings
-QT_BEGIN_NAMESPACE
+#include "qglobal.h"
-class QVGLiteWindowSurface;
+// Set any POSIX/XOPEN defines at the top of this file to turn on specific APIs
-class QVGLiteGraphicsSystem : public QGraphicsSystem,
- public QGraphicsSystemScreen
-{
-public:
- QVGLiteGraphicsSystem();
- ~QVGLiteGraphicsSystem();
+#include <unistd.h>
- QPlatformPixmap *createPlatformPixmap(QPlatformPixmap::PixelType type) const;
- QWindowSurface *createWindowSurface(QWidget *widget) const;
- QList<QGraphicsSystemScreen *> screens() const { return mScreens; }
- QRect geometry() const { return QRect(0, 0, w, h); }
- int depth() const { return d; }
- QImage::Format format() const { return screenFormat; }
- QSize physicalSize() const { return QSize(physWidth, physHeight); }
+// We are hot - unistd.h should have turned on the specific APIs we requested
-private:
- friend class QVGLiteWindowSurface;
- int w;
- int h;
- int d;
+#include <pthread.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <grp.h>
+#include <pwd.h>
+#include <signal.h>
+#define QT_NO_LIBRARY_UNLOAD
- int dw;
- int dh;
-
- int physWidth;
- int physHeight;
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/ipc.h>
+#include <sys/time.h>
+#include <sys/shm.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <netinet/in.h>
+#ifndef QT_NO_IPV6IFNAME
+#include <net/if.h>
+#endif
- mutable QVGLiteWindowSurface *surface;
- QEglContext *context;
- EGLSurface rootWindow;
- QImage::Format screenFormat;
- bool preservedSwap;
+#include "../../common/posix/qplatformdefs.h"
- QList<QGraphicsSystemScreen *> mScreens;
-};
+#undef QT_OPEN_LARGEFILE
+#undef QT_SOCKLEN_T
+#undef QT_SIGNAL_IGNORE
-QT_END_NAMESPACE
+#define QT_OPEN_LARGEFILE 0
+#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4)
+#define QT_SOCKLEN_T socklen_t
+#else
+#define QT_SOCKLEN_T int
#endif
+
+#define QT_SIGNAL_IGNORE (void (*)(int))1
+
+#define QT_SNPRINTF ::snprintf
+#define QT_VSNPRINTF ::vsnprintf
+
+#define QT_GUI_DRAG_DISTANCE 12
+#define QT_GUI_DOUBLE_CLICK_DISTANCE 12
+
+#endif // QPLATFORMDEFS_H
diff --git a/mkspecs/common/ios/versions.conf b/mkspecs/common/ios/versions.conf
new file mode 100644
index 0000000000..b755068769
--- /dev/null
+++ b/mkspecs/common/ios/versions.conf
@@ -0,0 +1,184 @@
+#
+# Helper to set build tool & SDK versions for iOS configurations
+#
+# This file sets up the following configuration variables:
+#
+# QMAKE_IOS_XCODE_VERSION - version number of Xcode being used
+# QMAKE_IOS_SDK_VERSION - version number of iOS device SDK
+# QMAKE_IOS_SIMULATOR_SDK_VERSION - version number of iOS simulator SDK
+#
+# Used in:
+#
+# mkspecs/common/ios/clang.conf
+# mkspecs/common/ios/llvm.conf
+# mkspecs/common/ios/qmake.conf
+# mkspecs/unsupported/macx-iosdevice-clang-legacy/qmake.conf
+# mkspecs/unsupported/macx-iosdevice-clang/qmake.conf
+# mkspecs/unsupported/macx-iosdevice-llvm-legacy/qmake.conf
+# mkspecs/unsupported/macx-iosdevice-llvm/qmake.conf
+# mkspecs/unsupported/macx-iosdevice-g++-legacy/qmake.conf
+# mkspecs/unsupported/macx-iossimulator-llvm-legacy/qmake.conf
+# mkspecs/unsupported/macx-iossimulator-llvm/qmake.conf
+# mkspecs/unsupported/macx-iossimulator-g++-legacy/qmake.conf
+#
+
+#
+# IMPORTANT:
+#
+# Xcode versions <= 4.2.x must be installed in /Developer.
+# Xcode versions >= 4.3.x must be installed in /Applications
+#
+# Xcode versions >= 4.10 & < 5.0 and versions >= 10.0 are not supported due to
+# the way the version checks are done here. As Apple (so far) has not used
+# minor version numbers greater than 3 for Xcode, and the Xcode major version
+# has only changed three times in the period 2003-2012, this is viewed as an
+# acceptable limitation.
+#
+
+#
+# Edit values below to match iOS build environment, or leave blank for
+# autodetection (slower!)
+#
+
+# Xcode version used for cross-compiling
+QMAKE_IOS_XCODE_VERSION =
+
+# iOS SDK version used for cross-compiling for iOS devices
+QMAKE_IOS_SDK_VERSION =
+
+# iOS SDK version used for cross-compiling for the iOS simulator
+QMAKE_IOS_SIMULATOR_SDK_VERSION =
+
+#
+# Do not edit values below here if using a pre-built SDK
+#
+
+# Minimum iOS version required on deployment target (if not specified, will
+# default to minimum version that guarantees ARMv7 & OpenGL/ES 2.x).
+#
+# No part of Qt or any known plugin uses features that require iOS versions
+# later than 4.0.
+QMAKE_IPHONEOS_DEPLOYMENT_TARGET = 4.0
+
+###########################################################################
+
+# No Xcode version specified?
+isEmpty(QMAKE_IOS_XCODE_VERSION) {
+ # Get version string from installed Xcode
+ exists(/Applications/Xcode.app/Contents/Developer) {
+ QMAKE_IOS_XCODE_INFO = $$system(/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -version)
+ } else: QMAKE_IOS_XCODE_INFO = $$system(/Developer/usr/bin/xcodebuild -version)
+
+ # Extract Xcode version number from output
+ QMAKE_IOS_XCODE_VERSION = $$member(QMAKE_IOS_XCODE_INFO, 1)
+ QMAKE_IOS_XCODE_INFO =
+}
+
+# Make sure Xcode version is valid
+!lessThan(QMAKE_IOS_XCODE_VERSION, "4.3") {
+ # Xcode 4.3+ is stored in /Applications
+ QMAKE_IOS_PLATFORM_PATH = /Applications/Xcode.app/Contents/Developer/Platforms
+
+ # Make sure Xcode path is valid
+ !exists($$QMAKE_IOS_PLATFORM_PATH): error("Xcode is not installed in /Applications/Xcode.app! Edit mkspecs/common/ios/versions.conf to specify version installed.")
+} else {
+ # Older Xcode versions are stored in /Developer
+ QMAKE_IOS_PLATFORM_PATH = /Developer/Platforms
+
+ # Make sure Xcode path is valid
+ !exists($$QMAKE_IOS_PLATFORM_PATH): error("Xcode is not installed in /Developer! Edit mkspecs/common/ios/versions.conf to specify version installed.")
+}
+
+# iOS 4.3 is the preferred version as it is the earliest version that is armv7/gles2 only
+QMAKE_IPHONEOS_PREFERRED_TARGET = 4.3
+
+# Building for iOS device?
+!*simulator* {
+ # No iOS SDK version specified?
+ isEmpty(QMAKE_IOS_SDK_VERSION) {
+ # Get version string from installed Xcode
+ !lessThan(QMAKE_IOS_XCODE_VERSION, "4.3") {
+ QMAKE_IOS_SDK_INFO = $$system(/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -showsdks)
+ } else: QMAKE_IOS_SDK_INFO = $$system(/Developer/usr/bin/xcodebuild -showsdks)
+
+ # Get names of installed device SDKs
+ QMAKE_IOS_SDK_INFO = $$find(QMAKE_IOS_SDK_INFO, ^iphoneos)
+ for(v, QMAKE_IOS_SDK_INFO): {
+ # Extract SDK version number from output
+ v = $$replace(v,iphoneos,)
+
+ # Use latest SDK version
+ greaterThan(v, $$QMAKE_IOS_SDK_VERSION): QMAKE_IOS_SDK_VERSION = $$v
+ }
+ QMAKE_IOS_SDK_INFO =
+ }
+
+ # Make sure iOS SDK version is valid
+ !exists($$QMAKE_IOS_PLATFORM_PATH/iPhoneOS.platform/Developer/SDKs/iPhoneOS$${QMAKE_IOS_SDK_VERSION}.sdk) {
+ error("iOS $$QMAKE_IOS_SDK_VERSION SDK not found! Edit mkspecs/common/ios/versions.conf to specify version installed.")
+ }
+
+ # No deployment target specified?
+ isEmpty(QMAKE_IPHONEOS_DEPLOYMENT_TARGET) {
+ # Use SDK version for iOS versions < preferred
+ lessThan(QMAKE_IOS_SDK_VERSION, $$QMAKE_IPHONEOS_PREFERRED_TARGET) {
+ QMAKE_IPHONEOS_DEPLOYMENT_TARGET = $$QMAKE_IOS_SDK_VERSION
+ } else: QMAKE_IPHONEOS_DEPLOYMENT_TARGET = $$QMAKE_IPHONEOS_PREFERRED_TARGET
+ }
+
+ # Make sure iOS SDK version is >= iOS target version
+ !lessThan(QMAKE_IPHONEOS_DEPLOYMENT_TARGET, $$QMAKE_IOS_SDK_VERSION) {
+ error("Target iOS version is greater that iOS SDK version $$QMAKE_IOS_SDK_VERSION! Edit mkspecs/common/ios/versions.conf to specify target iOS version.")
+ }
+# Building for iOS simulator
+} else {
+ # No iOS simulator SDK version specified?
+ isEmpty(QMAKE_IOS_SIMULATOR_SDK_VERSION) {
+ # Get version string from installed Xcode
+ !lessThan(QMAKE_IOS_XCODE_VERSION, "4.3") {
+ QMAKE_IOS_SDK_INFO = $$system(/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -showsdks)
+ } else: QMAKE_IOS_SDK_INFO = $$system(/Developer/usr/bin/xcodebuild -showsdks)
+
+ # Get names of installed device SDKs
+ QMAKE_IOS_SDK_INFO = $$find(QMAKE_IOS_SDK_INFO, ^iphonesimulator)
+ for(v, QMAKE_IOS_SDK_INFO): {
+ # Extract SDK version number from output
+ v = $$replace(v,iphonesimulator,)
+
+ # Use latest SDK version
+ greaterThan(v, $$QMAKE_IOS_SIMULATOR_SDK_VERSION): QMAKE_IOS_SIMULATOR_SDK_VERSION = $$v
+ }
+ QMAKE_IOS_SDK_INFO =
+ }
+
+ # Make sure iOS simulator SDK version is valid
+ !exists($$QMAKE_IOS_PLATFORM_PATH/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator$${QMAKE_IOS_SIMULATOR_SDK_VERSION}.sdk) {
+ error("iOS $$QMAKE_IOS_SIMULATOR_SDK_VERSION simulator SDK not found! Edit mkspecs/common/ios/versions.conf to specify version installed.")
+ }
+
+ # No deployment target specified?
+ isEmpty(QMAKE_IPHONEOS_DEPLOYMENT_TARGET) {
+ # Use SDK version for iOS versions < preferred
+ lessThan(QMAKE_IOS_SIMULATOR_SDK_VERSION, $$QMAKE_IPHONEOS_PREFERRED_TARGET) {
+ QMAKE_IPHONEOS_DEPLOYMENT_TARGET = $$QMAKE_IOS_SIMULATOR_SDK_VERSION
+ } else: QMAKE_IPHONEOS_DEPLOYMENT_TARGET = $$QMAKE_IPHONEOS_PREFERRED_TARGET
+ }
+
+ # Make sure iOS simulator SDK version is >= iOS target version
+ !lessThan(QMAKE_IPHONEOS_DEPLOYMENT_TARGET, $$QMAKE_IOS_SIMULATOR_SDK_VERSION) {
+ error("Target iOS version is greater that iOS simulator SDK version $$QMAKE_IOS_SIMULATOR_SDK_VERSION! Edit mkspecs/common/ios/versions.conf to specify target iOS version.")
+ }
+}
+
+QMAKE_IPHONEOS_PREFERRED_TARGET =
+QMAKE_IOS_PLATFORM_PATH =
+
+# Set deployment target
+QMAKE_IOS_VERSION_FLAGS = -miphoneos-version-min=$$QMAKE_IPHONEOS_DEPLOYMENT_TARGET
+
+# Set build flags
+QMAKE_CFLAGS += $$QMAKE_IOS_VERSION_FLAGS
+QMAKE_CXXFLAGS += $$QMAKE_IOS_VERSION_FLAGS
+QMAKE_OBJECTIVE_CFLAGS += $$QMAKE_IOS_VERSION_FLAGS
+QMAKE_LFLAGS += $$QMAKE_IOS_VERSION_FLAGS
+QMAKE_IOS_VERSION_FLAGS =
diff --git a/mkspecs/common/qcc-base-qnx-armv7le.conf b/mkspecs/common/qcc-base-qnx-armv7le.conf
new file mode 100644
index 0000000000..8270a27625
--- /dev/null
+++ b/mkspecs/common/qcc-base-qnx-armv7le.conf
@@ -0,0 +1,25 @@
+#
+# qmake configuration for qnx-qcc armv7 targets
+#
+
+MAKEFILE_GENERATOR = UNIX
+TARGET_PLATFORM = unix
+TEMPLATE = app
+CONFIG += qt warn_on release link_prl
+QT += core gui
+
+include(g++-unix.conf)
+include(unix.conf)
+
+QMAKE_CC = qcc -Vgcc_ntoarmv7le
+QNX_CPUDIR = armle-v7
+
+include(qcc-base-qnx.conf)
+
+QMAKE_AR = ntoarmv7-ar cqs
+QMAKE_OBJCOPY = ntoarmv7-objcopy
+QMAKE_RANLIB = ntoarmv7-ranlib
+
+QMAKE_STRIP = ntoarmv7-strip
+
+load(qt_config)
diff --git a/mkspecs/common/qcc-base-qnx-x86.conf b/mkspecs/common/qcc-base-qnx-x86.conf
new file mode 100644
index 0000000000..5e88ba8b54
--- /dev/null
+++ b/mkspecs/common/qcc-base-qnx-x86.conf
@@ -0,0 +1,25 @@
+#
+# qmake configuration for qnx-qcc x86 targets
+#
+
+MAKEFILE_GENERATOR = UNIX
+TARGET_PLATFORM = unix
+TEMPLATE = app
+CONFIG += qt warn_on release link_prl
+QT += core gui
+
+include(g++-unix.conf)
+include(unix.conf)
+
+QMAKE_CC = qcc -Vgcc_ntox86
+QNX_CPUDIR = x86
+
+include(qcc-base-qnx.conf)
+
+QMAKE_AR = ntox86-ar cqs
+QMAKE_OBJCOPY = ntox86-objcopy
+QMAKE_RANLIB = ntox86-ranlib
+
+QMAKE_STRIP = ntox86-strip
+
+load(qt_config)
diff --git a/mkspecs/common/qcc-base-qnx.conf b/mkspecs/common/qcc-base-qnx.conf
index ec0d27873d..d7c2f9f340 100644
--- a/mkspecs/common/qcc-base-qnx.conf
+++ b/mkspecs/common/qcc-base-qnx.conf
@@ -6,6 +6,9 @@ include(qcc-base.conf)
CONFIG += qnx
+#Choose qnx QPA Plugin as default
+QT_QPA_DEFAULT_PLATFORM = qnx
+
QMAKE_LFLAGS_SHLIB += -shared
QMAKE_LFLAGS_PLUGIN += $$QMAKE_LFLAGS_SHLIB
QMAKE_LFLAGS_SONAME += -Wl,-soname,
@@ -27,6 +30,7 @@ QMAKE_LIBS_NETWORK = -lsocket
# OpenGL libraries have a dependency on libEGL
QMAKE_LIBS_OPENGL_ES1 = -lGLES_CM -lEGL
QMAKE_LIBS_OPENGL_ES2 = -lGLESv2 -lEGL
+QMAKE_LIBS_EGL = -lEGL
# When using this mkspec to build Qt apps (ie - not Qt itself) we want to build
# against the NDK's target directory which is referenced by the QNX_TARGET environment
diff --git a/mkspecs/devices/linux-archos-gen8-g++/qmake.conf b/mkspecs/devices/linux-archos-gen8-g++/qmake.conf
new file mode 100644
index 0000000000..5e1fe8aea7
--- /dev/null
+++ b/mkspecs/devices/linux-archos-gen8-g++/qmake.conf
@@ -0,0 +1,63 @@
+#
+# qmake configuration for the Archos gen8 tablets (70 and 101)
+# with the SDE (Software Developer Edition) firmware
+# http://www.archos.com/support/support_tech/updates_dev.html
+#
+# OpenEmbedded platform build system for Qt5 available at:
+# http://github.com/KDAB/OpenEmbedded-Archos
+
+MAKEFILE_GENERATOR = UNIX
+TARGET_PLATFORM = unix
+TEMPLATE = app
+CONFIG += qt warn_on release incremental link_prl gdb_dwarf_index
+QT += core gui
+QMAKE_INCREMENTAL_STYLE = sublib
+
+include(../../common/linux.conf)
+include(../../common/gcc-base-unix.conf)
+include(../../common/g++-unix.conf)
+
+load(device_config)
+
+QT_QPA_DEFAULT_PLATFORM = eglfs
+
+isEmpty(CROSS_COMPILE) {
+ CROSS_COMPILE = arm-angstrom-linux-gnueabi-
+}
+
+# modifications to g++.conf
+QMAKE_CC = $${CROSS_COMPILE}gcc
+QMAKE_CXX = $${CROSS_COMPILE}g++
+QMAKE_LINK = $${QMAKE_CXX}
+QMAKE_LINK_SHLIB = $${QMAKE_CXX}
+
+# modifications to linux.conf
+QMAKE_AR = $${CROSS_COMPILE}ar cqs
+QMAKE_OBJCOPY = $${CROSS_COMPILE}objcopy
+QMAKE_STRIP = $${CROSS_COMPILE}strip
+
+COMPILER_FLAGS = -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp
+
+#modifications to gcc-base.conf
+QMAKE_CFLAGS += $${COMPILER_FLAGS}
+QMAKE_CXXFLAGS += $${COMPILER_FLAGS}
+QMAKE_CXXFLAGS_RELEASE += -O3
+
+QMAKE_LIBS += -lrt -lpthread -ldl
+
+# Extra stuff (OpenGL, DirectFB, ...)
+QMAKE_INCDIR_EGL = $$[QT_SYSROOT]/usr/include
+QMAKE_LIBDIR_EGL = $$[QT_SYSROOT]/usr/lib
+QMAKE_INCDIR_OPENGL_ES2 = $${QMAKE_INCDIR_EGL}
+QMAKE_LIBDIR_OPENGL_ES2 = $${QMAKE_LIBDIR_EGL}
+QMAKE_INCDIR_OPENVG = $${QMAKE_INCDIR_EGL}
+QMAKE_LIBDIR_OPENVG = $${QMAKE_LIBDIR_EGL}
+
+QMAKE_LIBS_EGL = -lEGL -lIMGegl -lsrv_um
+QMAKE_LIBS_OPENGL_ES2 = -lGLESv2 $${QMAKE_LIBS_EGL}
+QMAKE_LIBS_OPENVG = -lOpenVG $${QMAKE_LIBS_EGL}
+
+# Sanity check
+deviceSanityCheckCompiler()
+
+load(qt_config)
diff --git a/mkspecs/freebsd-g++40/qplatformdefs.h b/mkspecs/devices/linux-archos-gen8-g++/qplatformdefs.h
index e708ea78a7..9e6b0f5bcc 100644
--- a/mkspecs/freebsd-g++40/qplatformdefs.h
+++ b/mkspecs/devices/linux-archos-gen8-g++/qplatformdefs.h
@@ -39,4 +39,4 @@
**
****************************************************************************/
-#include "../freebsd-g++/qplatformdefs.h"
+#include "../../linux-g++/qplatformdefs.h"
diff --git a/mkspecs/devices/linux-arm-amlogic-8726M-g++/qeglfshooks_8726m.cpp b/mkspecs/devices/linux-arm-amlogic-8726M-g++/qeglfshooks_8726m.cpp
index 6655c50573..9fa05a4bf4 100644
--- a/mkspecs/devices/linux-arm-amlogic-8726M-g++/qeglfshooks_8726m.cpp
+++ b/mkspecs/devices/linux-arm-amlogic-8726M-g++/qeglfshooks_8726m.cpp
@@ -48,6 +48,8 @@
#include <fcntl.h>
#include <linux/fb.h>
+QT_BEGIN_NAMESPACE
+
class QEglFS8726MHooks : public QEglFSHooks
{
public:
@@ -90,3 +92,4 @@ void QEglFS8726MHooks::destroyNativeWindow(EGLNativeWindowType window)
QEglFS8726MHooks eglFS8726MHooks;
QEglFSHooks *platformHooks = &eglFS8726MHooks;
+QT_END_NAMESPACE
diff --git a/mkspecs/devices/linux-arm-amlogic-8726M-g++/qmake.conf b/mkspecs/devices/linux-arm-amlogic-8726M-g++/qmake.conf
index 7525397a65..fb22fb4e97 100644
--- a/mkspecs/devices/linux-arm-amlogic-8726M-g++/qmake.conf
+++ b/mkspecs/devices/linux-arm-amlogic-8726M-g++/qmake.conf
@@ -33,4 +33,6 @@ deviceSanityCheckCompiler()
EGLFS_PLATFORM_HOOKS_SOURCES = $$PWD/qeglfshooks_8726m.cpp
+QT_QPA_DEFAULT_PLATFORM = eglfs
+
load(qt_config)
diff --git a/mkspecs/devices/linux-arm-trident-pnx8473-g++/qmake.conf b/mkspecs/devices/linux-arm-trident-pnx8473-g++/qmake.conf
index fbe6ed100b..ffc0965af0 100644
--- a/mkspecs/devices/linux-arm-trident-pnx8473-g++/qmake.conf
+++ b/mkspecs/devices/linux-arm-trident-pnx8473-g++/qmake.conf
@@ -63,4 +63,6 @@ QMAKE_LIBDIR_OPENGL_ES2 = $${TRIDENT_SHINER_SDK_LIBDIR_EGL_OPENGL_ES2}
QMAKE_LIBS_EGL = -lEGL -lIMGegl -lsrv_um -lusc
QMAKE_LIBS_OPENGL_ES2 = $$QMAKE_LIBS_EGL -lGLESv2 -lGLES_CM
+QT_QPA_DEFAULT_PLATFORM = eglfs
+
load(qt_config)
diff --git a/mkspecs/devices/linux-beagleboard-g++/qmake.conf b/mkspecs/devices/linux-beagleboard-g++/qmake.conf
new file mode 100644
index 0000000000..df3f4d343b
--- /dev/null
+++ b/mkspecs/devices/linux-beagleboard-g++/qmake.conf
@@ -0,0 +1,59 @@
+#
+# qmake configuration for the BeagleBoard and BeagleBoard xM boards
+# http://beagleboard.org/
+
+MAKEFILE_GENERATOR = UNIX
+TARGET_PLATFORM = unix
+TEMPLATE = app
+CONFIG += qt warn_on release incremental link_prl gdb_dwarf_index
+QT += core gui
+QMAKE_INCREMENTAL_STYLE = sublib
+
+include(../../common/linux.conf)
+include(../../common/gcc-base-unix.conf)
+include(../../common/g++-unix.conf)
+
+load(device_config)
+
+QT_QPA_DEFAULT_PLATFORM = eglfs
+
+isEmpty(CROSS_COMPILE) {
+ CROSS_COMPILE = arm-angstrom-linux-gnueabi-
+}
+
+# modifications to g++.conf
+QMAKE_CC = $${CROSS_COMPILE}gcc
+QMAKE_CXX = $${CROSS_COMPILE}g++
+QMAKE_LINK = $${QMAKE_CXX}
+QMAKE_LINK_SHLIB = $${QMAKE_CXX}
+
+# modifications to linux.conf
+QMAKE_AR = $${CROSS_COMPILE}ar cqs
+QMAKE_OBJCOPY = $${CROSS_COMPILE}objcopy
+QMAKE_STRIP = $${CROSS_COMPILE}strip
+
+COMPILER_FLAGS = -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp
+
+#modifications to gcc-base.conf
+QMAKE_CFLAGS += $${COMPILER_FLAGS}
+QMAKE_CXXFLAGS += $${COMPILER_FLAGS}
+QMAKE_CXXFLAGS_RELEASE += -O3
+
+QMAKE_LIBS += -lrt -lpthread -ldl
+
+# Extra stuff (OpenGL, DirectFB, ...)
+QMAKE_INCDIR_EGL = $$[QT_SYSROOT]/usr/include
+QMAKE_LIBDIR_EGL = $$[QT_SYSROOT]/usr/lib
+QMAKE_INCDIR_OPENGL_ES2 = $${QMAKE_INCDIR_EGL}
+QMAKE_LIBDIR_OPENGL_ES2 = $${QMAKE_LIBDIR_EGL}
+QMAKE_INCDIR_OPENVG = $${QMAKE_INCDIR_EGL}
+QMAKE_LIBDIR_OPENVG = $${QMAKE_LIBDIR_EGL}
+
+QMAKE_LIBS_EGL = -lEGL -lIMGegl -lsrv_um
+QMAKE_LIBS_OPENGL_ES2 = -lGLESv2 $${QMAKE_LIBS_EGL}
+QMAKE_LIBS_OPENVG = -lOpenVG $${QMAKE_LIBS_EGL}
+
+# Sanity check
+deviceSanityCheckCompiler()
+
+load(qt_config)
diff --git a/mkspecs/devices/linux-beagleboard-g++/qplatformdefs.h b/mkspecs/devices/linux-beagleboard-g++/qplatformdefs.h
new file mode 100644
index 0000000000..9e6b0f5bcc
--- /dev/null
+++ b/mkspecs/devices/linux-beagleboard-g++/qplatformdefs.h
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the qmake spec of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "../../linux-g++/qplatformdefs.h"
diff --git a/mkspecs/devices/linux-mipsel-broadcom-97425-g++/qdirectfbeglhooks_bcm97425.cpp b/mkspecs/devices/linux-mipsel-broadcom-97425-g++/qdirectfbeglhooks_bcm97425.cpp
index 16aee0c4f7..07967f762d 100644
--- a/mkspecs/devices/linux-mipsel-broadcom-97425-g++/qdirectfbeglhooks_bcm97425.cpp
+++ b/mkspecs/devices/linux-mipsel-broadcom-97425-g++/qdirectfbeglhooks_bcm97425.cpp
@@ -44,6 +44,8 @@
#include "default_directfb.h"
+QT_BEGIN_NAMESPACE
+
// Exported to the directfb plugin
QDirectFBEGLHooks platform_hook;
static void *dbpl_handle;
@@ -69,3 +71,4 @@ bool QDirectFBEGLHooks::hasCapability(QPlatformIntegration::Capability cap) cons
}
}
+QT_END_NAMESPACE
diff --git a/mkspecs/devices/linux-mipsel-broadcom-97425-g++/qmake.conf b/mkspecs/devices/linux-mipsel-broadcom-97425-g++/qmake.conf
index e69a3cee4b..fa25cdd97d 100644
--- a/mkspecs/devices/linux-mipsel-broadcom-97425-g++/qmake.conf
+++ b/mkspecs/devices/linux-mipsel-broadcom-97425-g++/qmake.conf
@@ -64,4 +64,6 @@ DIRECTFB_PLATFORM_HOOKS_INCLUDEPATH = $${BRCM_ROCKFORD_PATH}/middleware/platform
DIRECTFB_PLATFORM_HOOKS_LIBS = -ldbpl
DIRECTFB_PLATFORM_HOOKS_LIBDIR = $${BRCM_ROCKFORD_PATH}/middleware/platform/directfb/lib_$${BRCM_PLATFORM}_$${BRCM_BUILD_TYPE}
+QT_QPA_DEFAULT_PLATFORM = directfbegl
+
load(qt_config)
diff --git a/mkspecs/devices/linux-n9-g++/qmake.conf b/mkspecs/devices/linux-n9-g++/qmake.conf
new file mode 100644
index 0000000000..f26db53830
--- /dev/null
+++ b/mkspecs/devices/linux-n9-g++/qmake.conf
@@ -0,0 +1,34 @@
+#
+# qmake configuration for building Qt5 for the Nokia N9
+# http://wiki.qt-project.org/Devices/N9
+
+MAKEFILE_GENERATOR = UNIX
+TARGET_PLATFORM = unix
+TEMPLATE = app
+CONFIG += qt warn_on release incremental link_prl gdb_dwarf_index
+QT += core gui
+QMAKE_INCREMENTAL_STYLE = sublib
+
+include(../../common/linux.conf)
+include(../../common/gcc-base-unix.conf)
+include(../../common/g++-unix.conf)
+
+load(device_config)
+
+# modifications to g++.conf
+QMAKE_CC = $${CROSS_COMPILE}gcc
+QMAKE_CXX = $${CROSS_COMPILE}g++
+QMAKE_LINK = $${QMAKE_CXX}
+QMAKE_LINK_SHLIB = $${QMAKE_CXX}
+
+# modifications to linux.conf
+QMAKE_AR = $${CROSS_COMPILE}ar cqs
+QMAKE_OBJCOPY = $${CROSS_COMPILE}objcopy
+QMAKE_STRIP = $${CROSS_COMPILE}strip
+
+QMAKE_CFLAGS_RELEASE += -O2 -mfloat-abi=hard -mfpu=neon -march=armv7-a -mcpu=cortex-a8
+QMAKE_CXXFLAGS_RELEASE += $$QMAKE_CFLAGS_RELEASE
+
+QT_QPA_DEFAULT_PLATFORM = xcb
+
+load(qt_config)
diff --git a/mkspecs/devices/linux-n9-g++/qplatformdefs.h b/mkspecs/devices/linux-n9-g++/qplatformdefs.h
new file mode 100644
index 0000000000..9e6b0f5bcc
--- /dev/null
+++ b/mkspecs/devices/linux-n9-g++/qplatformdefs.h
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the qmake spec of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "../../linux-g++/qplatformdefs.h"
diff --git a/mkspecs/devices/linux-rasp-pi-g++/qeglfshooks_pi.cpp b/mkspecs/devices/linux-rasp-pi-g++/qeglfshooks_pi.cpp
index 21052a5b63..cdd01dc3fa 100644
--- a/mkspecs/devices/linux-rasp-pi-g++/qeglfshooks_pi.cpp
+++ b/mkspecs/devices/linux-rasp-pi-g++/qeglfshooks_pi.cpp
@@ -52,6 +52,8 @@
#include <linux/fb.h>
#endif
+QT_BEGIN_NAMESPACE
+
static DISPMANX_DISPLAY_HANDLE_T dispman_display = 0;
static DISPMANX_UPDATE_HANDLE_T dispman_update = 0;
@@ -167,3 +169,5 @@ bool QEglFSPiHooks::hasCapability(QPlatformIntegration::Capability cap) const
QEglFSPiHooks eglFSPiHooks;
QEglFSHooks *platformHooks = &eglFSPiHooks;
+
+QT_END_NAMESPACE
diff --git a/mkspecs/devices/linux-rasp-pi-g++/qmake.conf b/mkspecs/devices/linux-rasp-pi-g++/qmake.conf
index 4c75e0b0b2..079c07830e 100644
--- a/mkspecs/devices/linux-rasp-pi-g++/qmake.conf
+++ b/mkspecs/devices/linux-rasp-pi-g++/qmake.conf
@@ -53,4 +53,6 @@ EGLFS_PLATFORM_HOOKS_SOURCES = $$PWD/qeglfshooks_pi.cpp
# Sanity check
deviceSanityCheckCompiler()
+QT_QPA_DEFAULT_PLATFORM = eglfs
+
load(qt_config)
diff --git a/mkspecs/devices/linux-rasp-pi-g++/qplatformdefs.h b/mkspecs/devices/linux-rasp-pi-g++/qplatformdefs.h
index 62cbb049dd..9e6b0f5bcc 100644
--- a/mkspecs/devices/linux-rasp-pi-g++/qplatformdefs.h
+++ b/mkspecs/devices/linux-rasp-pi-g++/qplatformdefs.h
@@ -40,5 +40,3 @@
****************************************************************************/
#include "../../linux-g++/qplatformdefs.h"
-
-#define QT_QPA_DEFAULT_PLATFORM_NAME "eglfs"
diff --git a/mkspecs/devices/linux-sh4-stmicro-ST7108-g++/qmake.conf b/mkspecs/devices/linux-sh4-stmicro-ST7108-g++/qmake.conf
index ba8ab28026..52c15982c3 100644
--- a/mkspecs/devices/linux-sh4-stmicro-ST7108-g++/qmake.conf
+++ b/mkspecs/devices/linux-sh4-stmicro-ST7108-g++/qmake.conf
@@ -32,4 +32,6 @@ deviceSanityCheckCompiler()
QMAKE_LIBS_EGL += -lMali
+QT_QPA_DEFAULT_PLATFORM = eglfs
+
load(qt_config)
diff --git a/mkspecs/devices/linux-sh4-stmicro-ST7540-g++/qmake.conf b/mkspecs/devices/linux-sh4-stmicro-ST7540-g++/qmake.conf
index 9a99a82ee3..e020a9585c 100644
--- a/mkspecs/devices/linux-sh4-stmicro-ST7540-g++/qmake.conf
+++ b/mkspecs/devices/linux-sh4-stmicro-ST7540-g++/qmake.conf
@@ -43,5 +43,7 @@ QMAKE_INCDIR_OPENGL_ES2 += $$QMAKE_INCDIR_EGL
QMAKE_LIBDIR_OPENGL_ES2 += $$QMAKE_LIBDIR_EGL
QMAKE_LIBS_OPENGL_ES2 += $$QMAKE_LIBS_EGL
+QT_QPA_DEFAULT_PLATFORM = eglfs
+
load(qt_config)
diff --git a/mkspecs/features/create_cmake.prf b/mkspecs/features/create_cmake.prf
index b8809a236b..120c96746d 100644
--- a/mkspecs/features/create_cmake.prf
+++ b/mkspecs/features/create_cmake.prf
@@ -113,8 +113,22 @@ macx {
CMAKE_DEBUG_TYPE =
CMAKE_RELEASE_TYPE =
-debug_and_release|debug:CMAKE_DEBUG_TYPE = debug
-debug_and_release|release:CMAKE_RELEASE_TYPE = release
+# Requirements:
+# * If Qt is configured with -debug, we're creating debug libraries and not
+# release libraries, regardless of whether we're on a platform where
+# debug_and_release is true.
+# * If Qt is configured with -release, we're creating release libraries and not
+# debug libraries, regardless of whether we're on a platform where
+# debug_and_release is true.
+# * If Qt is configured with neither -debug nor -release, and we are on a
+# platform where debug_and_release is true, we're creating both
+# debug and release libraries.
+# * If Qt is configured with -debug on a platform where debug_and_release is
+# true, and 'make release' is subsequently invoked, CMake is only aware of
+# the debug libraries at build time.
+
+if (build_all|CONFIG(debug, debug|release)):CMAKE_DEBUG_TYPE = debug
+if (build_all|CONFIG(release, debug|release)):CMAKE_RELEASE_TYPE = release
INSTALLS += cmake_qt5_module_files
diff --git a/mkspecs/features/declarative_debug.prf b/mkspecs/features/declarative_debug.prf
index 9125fcf33f..94c94cfb57 100644
--- a/mkspecs/features/declarative_debug.prf
+++ b/mkspecs/features/declarative_debug.prf
@@ -1,2 +1,2 @@
DEFINES += QT_DECLARATIVE_DEBUG
-warning("CONFIG+=declarative_debug is deprecated. Use qml_debug instead!")
+warning("CONFIG+=declarative_debug is deprecated. Use qml_debug or quick1_debug instead!")
diff --git a/mkspecs/features/device_config.prf b/mkspecs/features/device_config.prf
index 90bf9150e9..020b3ad7bb 100644
--- a/mkspecs/features/device_config.prf
+++ b/mkspecs/features/device_config.prf
@@ -22,6 +22,11 @@ isEmpty(DEVICE_PRI) {
exists($$DEVICE_PRI):include($$DEVICE_PRI)
+isEmpty(CROSS_COMPILE) {
+ #this variable can be persisted via qmake -set CROSS_COMPILE /foo
+ CROSS_COMPILE = $$[CROSS_COMPILE]
+}
+
unset(DEVICE_PRI)
unset(DIR)
diff --git a/mkspecs/features/qt.prf b/mkspecs/features/qt.prf
index fb67251600..c69941357a 100644
--- a/mkspecs/features/qt.prf
+++ b/mkspecs/features/qt.prf
@@ -1,32 +1,5 @@
CONFIG *= moc thread
-# Temporary fixes to avoid QDeclarative -> QQml breakage:
-
-# Projects depending on declarative will now get the full set of
-# -DOldSymbol=NewSymbol definitions added to their configuration
-# so that the old symbol names still compile. All code previously
-# in the declarative library is now in the qml library.
-contains(QT, qmldevtools):!contains(QT, declarative) {
- QT += declarative
-}
-contains(QT, qmldevtools-private):!contains(QT, declarative-private) {
- QT += declarative-private
-}
-
-contains(QT, quick):!contains(QT, declarative) {
- QT += declarative
-}
-contains(QT, quick-private):!contains(QT, declarative-private) {
- QT += declarative-private
-}
-
-contains(QT, declarative):!contains(QT, qml) {
- QT += qml
-}
-contains(QT, declarative-private):!contains(QT, qml-private) {
- QT += qml-private
-}
-
#handle defines
win32 {
qt_static:DEFINES += QT_NODLL
diff --git a/mkspecs/features/qt_module_config.prf b/mkspecs/features/qt_module_config.prf
index ac0b635f2f..217572e143 100644
--- a/mkspecs/features/qt_module_config.prf
+++ b/mkspecs/features/qt_module_config.prf
@@ -143,6 +143,7 @@ contains(QT_PRODUCT, OpenSource.*):DEFINES *= QT_OPENSOURCE
DEFINES *= QT_NO_CAST_TO_ASCII QT_ASCII_CAST_WARNINGS
DEFINES *= QT_MOC_COMPAT #we don't need warnings from calling moc code in our generated code
DEFINES *= QT_USE_QSTRINGBUILDER
+DEFINES *= QT_DEPRECATED_WARNINGS
TARGET = $$qtLibraryTarget($$TARGET$$QT_LIBINFIX) #do this towards the end
diff --git a/mkspecs/features/quick1_debug.prf b/mkspecs/features/quick1_debug.prf
new file mode 100644
index 0000000000..59e45f662f
--- /dev/null
+++ b/mkspecs/features/quick1_debug.prf
@@ -0,0 +1 @@
+DEFINES += QT_DECLARATIVE_DEBUG
diff --git a/mkspecs/freebsd-g++/qplatformdefs.h b/mkspecs/freebsd-g++/qplatformdefs.h
index 4c0d9e091f..90640bf429 100644
--- a/mkspecs/freebsd-g++/qplatformdefs.h
+++ b/mkspecs/freebsd-g++/qplatformdefs.h
@@ -79,30 +79,10 @@
#include "../common/posix/qplatformdefs.h"
#undef QT_OPEN_LARGEFILE
-#undef QT_SOCKLEN_T
#define QT_OPEN_LARGEFILE 0
-#if !defined(__DragonFly__) && (__FreeBSD_version < 400000)
-// FreeBSD 1.0 - 3.5.1
-#define QT_SOCKLEN_T int
-#else
-// FreeBSD 4.0 and better
-#define QT_SOCKLEN_T socklen_t
-#endif
-
#define QT_SNPRINTF ::snprintf
#define QT_VSNPRINTF ::vsnprintf
-// Older FreeBSD versions may still use the a.out format instead of ELF.
-// From the FreeBSD man pages:
-// In previous implementations, it was necessary to prepend an
-// underscore to all external symbols in order to gain symbol
-// compatibility with object code compiled from the C language.
-// This is still the case when using the (obsolete) -aout option to
-// the C language compiler.
-#ifndef __ELF__
-#define QT_AOUT_UNDERSCORE
-#endif
-
#endif // QPLATFORMDEFS_H
diff --git a/mkspecs/freebsd-g++34/qmake.conf b/mkspecs/freebsd-g++34/qmake.conf
deleted file mode 100644
index ee597de6c5..0000000000
--- a/mkspecs/freebsd-g++34/qmake.conf
+++ /dev/null
@@ -1,84 +0,0 @@
-#
-# qmake configuration for freebsd-g++34 (using g++34 from ports/lang/gcc34)
-#
-
-MAKEFILE_GENERATOR = UNIX
-TARGET_PLATFORM = unix
-TEMPLATE = app
-CONFIG += qt warn_on release link_prl
-QT += core gui
-
-QMAKE_CC = gcc34
-QMAKE_LEX = flex
-QMAKE_LEXFLAGS =
-QMAKE_YACC = yacc
-QMAKE_YACCFLAGS = -d
-QMAKE_CFLAGS = -pipe
-QMAKE_CFLAGS_DEPS = -M
-QMAKE_CFLAGS_WARN_ON = -Wall -W
-QMAKE_CFLAGS_WARN_OFF = -w
-QMAKE_CFLAGS_RELEASE = -O2
-QMAKE_CFLAGS_DEBUG = -g
-QMAKE_CFLAGS_SHLIB = -fPIC
-QMAKE_CFLAGS_STATIC_LIB = $$QMAKE_CFLAGS_SHLIB
-QMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
-QMAKE_CFLAGS_THREAD = -pthread -D_THREAD_SAFE
-
-QMAKE_CXX = g++34
-QMAKE_CXXFLAGS = $$QMAKE_CFLAGS
-QMAKE_CXXFLAGS_DEPS = $$QMAKE_CFLAGS_DEPS
-QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON
-QMAKE_CXXFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF
-QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE
-QMAKE_CXXFLAGS_DEBUG = $$QMAKE_CFLAGS_DEBUG
-QMAKE_CXXFLAGS_SHLIB = $$QMAKE_CFLAGS_SHLIB
-QMAKE_CXXFLAGS_STATIC_LIB = $$QMAKE_CFLAGS_STATIC_LIB
-QMAKE_CXXFLAGS_YACC = $$QMAKE_CFLAGS_YACC
-QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD
-
-# Addon software goes into /usr/local on the BSDs, by default we will look there
-QMAKE_INCDIR = /usr/local/include
-QMAKE_LIBDIR = /usr/local/lib
-QMAKE_INCDIR_X11 = /usr/X11R6/include
-QMAKE_LIBDIR_X11 = /usr/X11R6/lib
-QMAKE_INCDIR_QT = $$[QT_INSTALL_HEADERS]
-QMAKE_LIBDIR_QT = $$[QT_INSTALL_LIBS]
-QMAKE_INCDIR_OPENGL = /usr/X11R6/include
-QMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
-
-QMAKE_LINK = g++34
-QMAKE_LINK_SHLIB = g++34
-QMAKE_LINK_C = gcc34
-QMAKE_LINK_C_SHLIB = gcc34
-QMAKE_LFLAGS =
-QMAKE_LFLAGS_RELEASE =
-QMAKE_LFLAGS_DEBUG =
-QMAKE_LFLAGS_SHLIB = -shared
-QMAKE_LFLAGS_PLUGIN = $$QMAKE_LFLAGS_SHLIB
-QMAKE_LFLAGS_SONAME = -Wl,-soname,
-QMAKE_LFLAGS_THREAD = -pthread
-QMAKE_LFLAGS_RPATH = -Wl,-rpath,
-
-QMAKE_LIBS =
-QMAKE_LIBS_DYNLOAD =
-QMAKE_LIBS_X11 = -lXext -lX11 -lm
-QMAKE_LIBS_X11SM = -lSM -lICE
-QMAKE_LIBS_OPENGL = -lGL
-QMAKE_LIBS_OPENGL_QT = -lGL
-QMAKE_LIBS_THREAD =
-
-QMAKE_AR = ar cqs
-QMAKE_OBJCOPY = objcopy
-QMAKE_RANLIB =
-
-QMAKE_TAR = tar -cf
-QMAKE_GZIP = gzip -9f
-
-QMAKE_COPY = cp -f
-QMAKE_MOVE = mv -f
-QMAKE_DEL_FILE = rm -f
-QMAKE_DEL_DIR = rmdir
-QMAKE_CHK_DIR_EXISTS = test -d
-QMAKE_MKDIR = mkdir -p
-include(../common/unix.conf)
-load(qt_config)
diff --git a/mkspecs/freebsd-g++40/qmake.conf b/mkspecs/freebsd-g++40/qmake.conf
deleted file mode 100644
index 331c267b9e..0000000000
--- a/mkspecs/freebsd-g++40/qmake.conf
+++ /dev/null
@@ -1,84 +0,0 @@
-#
-# qmake configuration for freebsd-g++40 (using g++40 from ports/lang/gcc40)
-#
-
-MAKEFILE_GENERATOR = UNIX
-TARGET_PLATFORM = unix
-TEMPLATE = app
-CONFIG += qt warn_on release link_prl gdb_dwarf_index
-QT += core gui
-
-QMAKE_CC = gcc40
-QMAKE_LEX = flex
-QMAKE_LEXFLAGS =
-QMAKE_YACC = yacc
-QMAKE_YACCFLAGS = -d
-QMAKE_CFLAGS = -pipe
-QMAKE_CFLAGS_DEPS = -M
-QMAKE_CFLAGS_WARN_ON = -Wall -W
-QMAKE_CFLAGS_WARN_OFF = -w
-QMAKE_CFLAGS_RELEASE = -O2
-QMAKE_CFLAGS_DEBUG = -g
-QMAKE_CFLAGS_SHLIB = -fPIC
-QMAKE_CFLAGS_STATIC_LIB = $$QMAKE_CFLAGS_SHLIB
-QMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
-QMAKE_CFLAGS_THREAD = -pthread -D_THREAD_SAFE
-
-QMAKE_CXX = g++40
-QMAKE_CXXFLAGS = $$QMAKE_CFLAGS
-QMAKE_CXXFLAGS_DEPS = $$QMAKE_CFLAGS_DEPS
-QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON
-QMAKE_CXXFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF
-QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE
-QMAKE_CXXFLAGS_DEBUG = $$QMAKE_CFLAGS_DEBUG
-QMAKE_CXXFLAGS_SHLIB = $$QMAKE_CFLAGS_SHLIB
-QMAKE_CXXFLAGS_STATIC_LIB = $$QMAKE_CFLAGS_STATIC_LIB
-QMAKE_CXXFLAGS_YACC = $$QMAKE_CFLAGS_YACC
-QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD
-
-# Addon software goes into /usr/local on the BSDs, by default we will look there
-QMAKE_INCDIR = /usr/local/include
-QMAKE_LIBDIR = /usr/local/lib
-QMAKE_INCDIR_X11 = /usr/X11R6/include
-QMAKE_LIBDIR_X11 = /usr/X11R6/lib
-QMAKE_INCDIR_QT = $$[QT_INSTALL_HEADERS]
-QMAKE_LIBDIR_QT = $$[QT_INSTALL_LIBS]
-QMAKE_INCDIR_OPENGL = /usr/X11R6/include
-QMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
-
-QMAKE_LINK = g++40
-QMAKE_LINK_SHLIB = g++40
-QMAKE_LINK_C = gcc40
-QMAKE_LINK_C_SHLIB = gcc40
-QMAKE_LFLAGS =
-QMAKE_LFLAGS_RELEASE =
-QMAKE_LFLAGS_DEBUG =
-QMAKE_LFLAGS_SHLIB = -shared
-QMAKE_LFLAGS_PLUGIN = $$QMAKE_LFLAGS_SHLIB
-QMAKE_LFLAGS_SONAME = -Wl,-soname,
-QMAKE_LFLAGS_THREAD = -pthread
-QMAKE_LFLAGS_RPATH = -Wl,-rpath,
-
-QMAKE_LIBS =
-QMAKE_LIBS_DYNLOAD =
-QMAKE_LIBS_X11 = -lXext -lX11 -lm
-QMAKE_LIBS_X11SM = -lSM -lICE
-QMAKE_LIBS_OPENGL = -lGL
-QMAKE_LIBS_OPENGL_QT = -lGL
-QMAKE_LIBS_THREAD =
-
-QMAKE_AR = ar cqs
-QMAKE_OBJCOPY = objcopy
-QMAKE_RANLIB =
-
-QMAKE_TAR = tar -cf
-QMAKE_GZIP = gzip -9f
-
-QMAKE_COPY = cp -f
-QMAKE_MOVE = mv -f
-QMAKE_DEL_FILE = rm -f
-QMAKE_DEL_DIR = rmdir
-QMAKE_CHK_DIR_EXISTS = test -d
-QMAKE_MKDIR = mkdir -p
-include(../common/unix.conf)
-load(qt_config)
diff --git a/mkspecs/freebsd-g++46/qmake.conf b/mkspecs/freebsd-g++46/qmake.conf
new file mode 100644
index 0000000000..faa79f8e69
--- /dev/null
+++ b/mkspecs/freebsd-g++46/qmake.conf
@@ -0,0 +1,61 @@
+#
+# qmake configuration for freebsd-g++46 (using g++46 from ports/lang/gcc)
+#
+
+MAKEFILE_GENERATOR = UNIX
+TARGET_PLATFORM = unix
+TEMPLATE = app
+CONFIG += qt warn_on release link_prl gdb_dwarf_index
+QT += core gui
+
+QMAKE_CFLAGS_THREAD = -pthread -D_THREAD_SAFE
+
+QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD
+
+# Addon software goes into /usr/local on the BSDs, by default we will look there
+QMAKE_INCDIR = /usr/local/include
+QMAKE_LIBDIR = /usr/local/lib
+QMAKE_INCDIR_X11 = /usr/X11R6/include
+QMAKE_LIBDIR_X11 = /usr/X11R6/lib
+QMAKE_INCDIR_QT = $$[QT_INSTALL_HEADERS]
+QMAKE_LIBDIR_QT = $$[QT_INSTALL_LIBS]
+QMAKE_INCDIR_OPENGL = /usr/X11R6/include
+QMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
+
+QMAKE_LFLAGS_THREAD = -pthread
+
+QMAKE_LIBS =
+QMAKE_LIBS_DYNLOAD =
+QMAKE_LIBS_X11 = -lXext -lX11 -lm
+QMAKE_LIBS_X11SM = -lSM -lICE
+QMAKE_LIBS_OPENGL = -lGL
+QMAKE_LIBS_OPENGL_QT = -lGL
+QMAKE_LIBS_THREAD =
+
+QMAKE_AR = ar cqs
+QMAKE_OBJCOPY = objcopy
+QMAKE_RANLIB =
+
+QMAKE_TAR = tar -cf
+QMAKE_GZIP = gzip -9f
+
+QMAKE_COPY = cp -f
+QMAKE_MOVE = mv -f
+QMAKE_DEL_FILE = rm -f
+QMAKE_DEL_DIR = rmdir
+QMAKE_CHK_DIR_EXISTS = test -d
+QMAKE_MKDIR = mkdir -p
+include(../common/unix.conf)
+include(../common/gcc-base-unix.conf)
+include(../common/g++-unix.conf)
+
+# Redefined here because g++-base.conf sets QMAKE_CC and QMAKE_CXX
+# to gcc and g++, respectively.
+QMAKE_CC = gcc46
+QMAKE_CXX = g++46
+QMAKE_LINK_C = $$QMAKE_CC
+QMAKE_LINK_C_SHLIB = $$QMAKE_CC
+QMAKE_LINK = $$QMAKE_CXX
+QMAKE_LINK_SHLIB = $$QMAKE_CXX
+
+load(qt_config)
diff --git a/mkspecs/freebsd-g++34/qplatformdefs.h b/mkspecs/freebsd-g++46/qplatformdefs.h
index e708ea78a7..e708ea78a7 100644
--- a/mkspecs/freebsd-g++34/qplatformdefs.h
+++ b/mkspecs/freebsd-g++46/qplatformdefs.h
diff --git a/mkspecs/unsupported/blackberry-armv7le-qcc/qmake.conf b/mkspecs/unsupported/blackberry-armv7le-qcc/qmake.conf
index 4e72667c5d..efb585b6a5 100644
--- a/mkspecs/unsupported/blackberry-armv7le-qcc/qmake.conf
+++ b/mkspecs/unsupported/blackberry-armv7le-qcc/qmake.conf
@@ -1,5 +1,5 @@
#
-# qmake configuration for blackberry x86 systems
+# qmake configuration for blackberry armv7le systems
#
DEFINES += Q_OS_BLACKBERRY
@@ -9,4 +9,4 @@ LIBS += -lbps
# Blackberry also has support for stack smashing protection in its libc
QMAKE_CFLAGS += -fstack-protector -fstack-protector-all
-include(../qnx-armv7le-qcc/qmake.conf)
+include(../../common/qcc-base-qnx-armv7le.conf)
diff --git a/mkspecs/unsupported/blackberry-x86-qcc/qmake.conf b/mkspecs/unsupported/blackberry-x86-qcc/qmake.conf
index 60b67f801e..3fd84c13a6 100644
--- a/mkspecs/unsupported/blackberry-x86-qcc/qmake.conf
+++ b/mkspecs/unsupported/blackberry-x86-qcc/qmake.conf
@@ -9,4 +9,4 @@ LIBS += -lbps
# Blackberry also has support for stack smashing protection in its libc
QMAKE_CFLAGS += -fstack-protector -fstack-protector-all
-include(../qnx-x86-qcc/qmake.conf)
+include(../../common/qcc-base-qnx-x86.conf)
diff --git a/mkspecs/unsupported/integrity-ghs/qplatformdefs.h b/mkspecs/unsupported/integrity-ghs/qplatformdefs.h
index 87459d874e..4df7dea1d7 100644
--- a/mkspecs/unsupported/integrity-ghs/qplatformdefs.h
+++ b/mkspecs/unsupported/integrity-ghs/qplatformdefs.h
@@ -170,6 +170,10 @@
#define QT_VSNPRINTF ::vsnprintf
#endif
+// INTEGRITY doesn't enable the declaration in _POSIX_SOURCE mode,
+// because strdup() is not part of strict Posix; declare it here
+extern "C" char *strdup(const char *src);
+
#ifndef MAXNAMLEN
# define MAXNAMLEN NAME_MAX
#endif
diff --git a/mkspecs/unsupported/macx-iosdevice-clang-legacy/qmake.conf b/mkspecs/unsupported/macx-iosdevice-clang-legacy/qmake.conf
new file mode 100644
index 0000000000..ff8e0b6aa9
--- /dev/null
+++ b/mkspecs/unsupported/macx-iosdevice-clang-legacy/qmake.conf
@@ -0,0 +1,35 @@
+#
+# qmake configuration for ios-device-clang
+#
+# Depends on:
+#
+# QMAKE_IOS_XCODE_VERSION - set in mkspecs/common/ios/versions.conf
+#
+
+include(../../common/mac.conf)
+include(../../common/gcc-base-ios.conf)
+include(../../common/clang.conf)
+include(../../common/ios.conf)
+include(../../common/ios/versions.conf)
+include(../../common/ios/clang.conf)
+include(../../common/ios/qmake.conf)
+
+# Version check
+!lessThan(QMAKE_IOS_XCODE_VERSION, "4.3"): error("This mkspec requires Xcode 4.2.x or earlier")
+
+# iOS build tools
+QMAKE_CC = /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang
+QMAKE_CXX = /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang++
+QMAKE_FIX_RPATH = /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/install_name_tool -id
+QMAKE_AR = /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ar cq
+QMAKE_RANLIB = /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ranlib -s
+QMAKE_LINK = $$QMAKE_CXX
+QMAKE_LINK_SHLIB = $$QMAKE_CXX
+
+# Check that compiler is valid
+!exists($$QMAKE_CXX): error("The version of Xcode installed on this system does not include the clang compiler")
+
+load(qt_config)
+
+# Include after config is loaded to allow autodetection on GL/ES version
+include(../../common/ios/arch.conf)
diff --git a/mkspecs/unsupported/macx-iosdevice-clang-legacy/qplatformdefs.h b/mkspecs/unsupported/macx-iosdevice-clang-legacy/qplatformdefs.h
new file mode 100644
index 0000000000..89621ea21d
--- /dev/null
+++ b/mkspecs/unsupported/macx-iosdevice-clang-legacy/qplatformdefs.h
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the qmake spec of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "../../common/ios/qplatformdefs.h"
diff --git a/mkspecs/unsupported/macx-iosdevice-clang/qmake.conf b/mkspecs/unsupported/macx-iosdevice-clang/qmake.conf
new file mode 100644
index 0000000000..777b5ab6e2
--- /dev/null
+++ b/mkspecs/unsupported/macx-iosdevice-clang/qmake.conf
@@ -0,0 +1,35 @@
+#
+# qmake configuration for ios-device-clang
+#
+# Depends on:
+#
+# QMAKE_IOS_XCODE_VERSION - set in mkspecs/common/ios/versions.conf
+#
+
+include(../../common/mac.conf)
+include(../../common/gcc-base-ios.conf)
+include(../../common/clang.conf)
+include(../../common/ios.conf)
+include(../../common/ios/versions.conf)
+include(../../common/ios/clang.conf)
+include(../../common/ios/qmake.conf)
+
+# Version check
+lessThan(QMAKE_IOS_XCODE_VERSION, "4.3"): error("This mkspec requires Xcode 4.3 or later")
+
+# iOS build tools
+QMAKE_CC = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
+QMAKE_CXX = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++
+QMAKE_FIX_RPATH = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/install_name_tool -id
+QMAKE_AR = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar cq
+QMAKE_RANLIB = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib -s
+QMAKE_LINK = $$QMAKE_CXX
+QMAKE_LINK_SHLIB = $$QMAKE_CXX
+
+# Check that compiler is valid
+!exists($$QMAKE_CXX): error("The version of Xcode installed on this system does not include the clang compiler")
+
+load(qt_config)
+
+# Include after config is loaded to allow autodetection on GL/ES version
+include(../../common/ios/arch.conf)
diff --git a/mkspecs/unsupported/macx-iosdevice-clang/qplatformdefs.h b/mkspecs/unsupported/macx-iosdevice-clang/qplatformdefs.h
new file mode 100644
index 0000000000..89621ea21d
--- /dev/null
+++ b/mkspecs/unsupported/macx-iosdevice-clang/qplatformdefs.h
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the qmake spec of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "../../common/ios/qplatformdefs.h"
diff --git a/mkspecs/unsupported/macx-iosdevice-g++-legacy/qmake.conf b/mkspecs/unsupported/macx-iosdevice-g++-legacy/qmake.conf
new file mode 100644
index 0000000000..5fcfb4a51d
--- /dev/null
+++ b/mkspecs/unsupported/macx-iosdevice-g++-legacy/qmake.conf
@@ -0,0 +1,35 @@
+#
+# qmake configuration for ios-device-g++
+#
+# Depends on:
+#
+# QMAKE_IOS_XCODE_VERSION - set in mkspecs/common/ios/versions.conf
+#
+
+include(../../common/mac.conf)
+include(../../common/gcc-base-ios.conf)
+include(../../common/g++-macx.conf)
+include(../../common/ios.conf)
+include(../../common/ios/versions.conf)
+include(../../common/ios/g++.conf)
+include(../../common/ios/qmake.conf)
+
+# Version check (g++ was discontinued at version 4.2, but user may have added it themselves)
+!lessThan(QMAKE_IOS_XCODE_VERSION, "4.3"): error("This mkspec requires Xcode 4.2.x or earlier")
+
+# iOS build tools
+QMAKE_CC = /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2
+QMAKE_CXX = /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/g++-4.2
+QMAKE_FIX_RPATH = /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/install_name_tool -id
+QMAKE_AR = /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ar cq
+QMAKE_RANLIB = /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ranlib -s
+QMAKE_LINK = $$QMAKE_CXX
+QMAKE_LINK_SHLIB = $$QMAKE_CXX
+
+# Check that compiler is valid
+!exists($$QMAKE_CXX): error("The version of Xcode installed on this system does not include the g++ 4.2 compiler")
+
+load(qt_config)
+
+# Include after config is loaded to allow autodetection on GL/ES version
+include(../../common/ios/arch.conf)
diff --git a/mkspecs/unsupported/macx-iosdevice-g++-legacy/qplatformdefs.h b/mkspecs/unsupported/macx-iosdevice-g++-legacy/qplatformdefs.h
new file mode 100644
index 0000000000..89621ea21d
--- /dev/null
+++ b/mkspecs/unsupported/macx-iosdevice-g++-legacy/qplatformdefs.h
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the qmake spec of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "../../common/ios/qplatformdefs.h"
diff --git a/mkspecs/unsupported/macx-iosdevice-g++/qmake.conf b/mkspecs/unsupported/macx-iosdevice-g++/qmake.conf
new file mode 100644
index 0000000000..2a29335334
--- /dev/null
+++ b/mkspecs/unsupported/macx-iosdevice-g++/qmake.conf
@@ -0,0 +1,35 @@
+#
+# qmake configuration for ios-device-g++
+#
+# Depends on:
+#
+# QMAKE_IOS_XCODE_VERSION - set in mkspecs/common/ios/versions.conf
+#
+
+include(../../common/mac.conf)
+include(../../common/gcc-base-ios.conf)
+include(../../common/g++-macx.conf)
+include(../../common/ios.conf)
+include(../../common/ios/versions.conf)
+include(../../common/ios/g++.conf)
+include(../../common/ios/qmake.conf)
+
+# Version check (g++ was discontinued at version 4.2, but user may have added it themselves)
+lessThan(QMAKE_IOS_XCODE_VERSION, "4.3"): error("This mkspec requires Xcode 4.3 or later")
+
+# iOS build tools
+QMAKE_CC = /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2
+QMAKE_CXX = /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/g++-4.2
+QMAKE_FIX_RPATH = /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/install_name_tool -id
+QMAKE_AR = /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ar cq
+QMAKE_RANLIB = /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ranlib -s
+QMAKE_LINK = $$QMAKE_CXX
+QMAKE_LINK_SHLIB = $$QMAKE_CXX
+
+# Check that compiler is valid
+!exists($$QMAKE_CXX): error("The version of Xcode installed on this system does not include the g++ 4.2 compiler")
+
+load(qt_config)
+
+# Include after config is loaded to allow autodetection on GL/ES version
+include(../../common/ios/arch.conf)
diff --git a/mkspecs/unsupported/macx-iosdevice-g++/qplatformdefs.h b/mkspecs/unsupported/macx-iosdevice-g++/qplatformdefs.h
new file mode 100644
index 0000000000..89621ea21d
--- /dev/null
+++ b/mkspecs/unsupported/macx-iosdevice-g++/qplatformdefs.h
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the qmake spec of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "../../common/ios/qplatformdefs.h"
diff --git a/mkspecs/unsupported/macx-iosdevice-llvm-legacy/qmake.conf b/mkspecs/unsupported/macx-iosdevice-llvm-legacy/qmake.conf
new file mode 100644
index 0000000000..4554843610
--- /dev/null
+++ b/mkspecs/unsupported/macx-iosdevice-llvm-legacy/qmake.conf
@@ -0,0 +1,35 @@
+#
+# qmake configuration for ios-device-llvm
+#
+# Depends on:
+#
+# QMAKE_IOS_XCODE_VERSION - set in mkspecs/common/ios/versions.conf
+#
+
+include(../../common/mac.conf)
+include(../../common/gcc-base-ios.conf)
+include(../../common/llvm.conf)
+include(../../common/ios.conf)
+include(../../common/ios/versions.conf)
+include(../../common/ios/llvm.conf)
+include(../../common/ios/qmake.conf)
+
+# Version check
+!lessThan(QMAKE_IOS_XCODE_VERSION, "4.3"): error("This mkspec requires Xcode 4.2.x or earlier")
+
+# iOS build tools
+QMAKE_CC = /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-gcc-4.2
+QMAKE_CXX = /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-g++-4.2
+QMAKE_FIX_RPATH = /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/install_name_tool -id
+QMAKE_AR = /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ar cq
+QMAKE_RANLIB = /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ranlib -s
+QMAKE_LINK = $$QMAKE_CXX
+QMAKE_LINK_SHLIB = $$QMAKE_CXX
+
+# Check that compiler is valid
+!exists($$QMAKE_CXX): error("The version of Xcode installed on this system does not include the llvm-g++ 4.2 compiler")
+
+load(qt_config)
+
+# Include after config is loaded to allow autodetection on GL/ES version
+include(../../common/ios/arch.conf)
diff --git a/mkspecs/unsupported/macx-iosdevice-llvm-legacy/qplatformdefs.h b/mkspecs/unsupported/macx-iosdevice-llvm-legacy/qplatformdefs.h
new file mode 100644
index 0000000000..89621ea21d
--- /dev/null
+++ b/mkspecs/unsupported/macx-iosdevice-llvm-legacy/qplatformdefs.h
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the qmake spec of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "../../common/ios/qplatformdefs.h"
diff --git a/mkspecs/unsupported/macx-iosdevice-llvm/qmake.conf b/mkspecs/unsupported/macx-iosdevice-llvm/qmake.conf
new file mode 100644
index 0000000000..335c68fd42
--- /dev/null
+++ b/mkspecs/unsupported/macx-iosdevice-llvm/qmake.conf
@@ -0,0 +1,35 @@
+#
+# qmake configuration for ios-device-llvm
+#
+# Depends on:
+#
+# QMAKE_IOS_XCODE_VERSION - set in mkspecs/common/ios/versions.conf
+#
+
+include(../../common/mac.conf)
+include(../../common/gcc-base-ios.conf)
+include(../../common/llvm.conf)
+include(../../common/ios.conf)
+include(../../common/ios/versions.conf)
+include(../../common/ios/llvm.conf)
+include(../../common/ios/qmake.conf)
+
+# Version check
+lessThan(QMAKE_IOS_XCODE_VERSION, "4.3"): error("This mkspec requires Xcode 4.3 or later")
+
+# iOS build tools
+QMAKE_CC = /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-gcc-4.2
+QMAKE_CXX = /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-g++-4.2
+QMAKE_FIX_RPATH = /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/install_name_tool -id
+QMAKE_AR = /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ar cq
+QMAKE_RANLIB = /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ranlib -s
+QMAKE_LINK = $$QMAKE_CXX
+QMAKE_LINK_SHLIB = $$QMAKE_CXX
+
+# Check that compiler is valid
+!exists($$QMAKE_CXX): error("The version of Xcode installed on this system does not include the llvm-g++ 4.2 compiler")
+
+load(qt_config)
+
+# Include after config is loaded to allow autodetection on GL/ES version
+include(../../common/ios/arch.conf)
diff --git a/mkspecs/unsupported/macx-iosdevice-llvm/qplatformdefs.h b/mkspecs/unsupported/macx-iosdevice-llvm/qplatformdefs.h
new file mode 100644
index 0000000000..89621ea21d
--- /dev/null
+++ b/mkspecs/unsupported/macx-iosdevice-llvm/qplatformdefs.h
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the qmake spec of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "../../common/ios/qplatformdefs.h"
diff --git a/mkspecs/unsupported/macx-iossimulator-clang-legacy/qmake.conf b/mkspecs/unsupported/macx-iossimulator-clang-legacy/qmake.conf
new file mode 100644
index 0000000000..b042766a39
--- /dev/null
+++ b/mkspecs/unsupported/macx-iossimulator-clang-legacy/qmake.conf
@@ -0,0 +1,6 @@
+#
+# qmake configuration for ios-simulator-clang
+#
+
+# All differences between device and simulator are handled in iOS include files
+include(../macx-iosdevice-clang-legacy/qmake.conf)
diff --git a/mkspecs/unsupported/macx-iossimulator-clang-legacy/qplatformdefs.h b/mkspecs/unsupported/macx-iossimulator-clang-legacy/qplatformdefs.h
new file mode 100644
index 0000000000..89621ea21d
--- /dev/null
+++ b/mkspecs/unsupported/macx-iossimulator-clang-legacy/qplatformdefs.h
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the qmake spec of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "../../common/ios/qplatformdefs.h"
diff --git a/mkspecs/unsupported/macx-iossimulator-clang/qmake.conf b/mkspecs/unsupported/macx-iossimulator-clang/qmake.conf
new file mode 100644
index 0000000000..11301cb72f
--- /dev/null
+++ b/mkspecs/unsupported/macx-iossimulator-clang/qmake.conf
@@ -0,0 +1,6 @@
+#
+# qmake configuration for ios-simulator-clang
+#
+
+# All differences between device and simulator are handled in iOS include files
+include(../macx-iosdevice-clang/qmake.conf)
diff --git a/mkspecs/unsupported/macx-iossimulator-clang/qplatformdefs.h b/mkspecs/unsupported/macx-iossimulator-clang/qplatformdefs.h
new file mode 100644
index 0000000000..89621ea21d
--- /dev/null
+++ b/mkspecs/unsupported/macx-iossimulator-clang/qplatformdefs.h
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the qmake spec of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "../../common/ios/qplatformdefs.h"
diff --git a/mkspecs/unsupported/macx-iossimulator-g++-legacy/qmake.conf b/mkspecs/unsupported/macx-iossimulator-g++-legacy/qmake.conf
new file mode 100644
index 0000000000..abc695231e
--- /dev/null
+++ b/mkspecs/unsupported/macx-iossimulator-g++-legacy/qmake.conf
@@ -0,0 +1,33 @@
+#
+# qmake configuration for ios-simulator-g++
+#
+# Depends on:
+#
+# QMAKE_IOS_XCODE_VERSION - set in mkspecs/common/ios/versions.conf
+#
+
+include(../../common/mac.conf)
+include(../../common/gcc-base-ios.conf)
+include(../../common/g++-macx.conf)
+include(../../common/ios.conf)
+include(../../common/ios/versions.conf)
+include(../../common/ios/arch.conf)
+include(../../common/ios/g++.conf)
+include(../../common/ios/qmake.conf)
+
+# Version check (g++ was discontinued at version 4.2)
+!lessThan(QMAKE_IOS_XCODE_VERSION, "4.2"): error("This mkspec requires Xcode 4.1.x or earlier")
+
+# iOS build tools
+QMAKE_CC = /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2
+QMAKE_CXX = /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/g++-4.2
+QMAKE_FIX_RPATH = /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/install_name_tool -id
+QMAKE_AR = /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/ar cq
+QMAKE_RANLIB = /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/ranlib -s
+QMAKE_LINK = $$QMAKE_CXX
+QMAKE_LINK_SHLIB = $$QMAKE_CXX
+
+# Check that compiler is valid
+!exists($$QMAKE_CXX): error("The version of Xcode installed on this system does not include the g++ 4.2 compiler")
+
+load(qt_config)
diff --git a/mkspecs/unsupported/macx-iossimulator-g++-legacy/qplatformdefs.h b/mkspecs/unsupported/macx-iossimulator-g++-legacy/qplatformdefs.h
new file mode 100644
index 0000000000..89621ea21d
--- /dev/null
+++ b/mkspecs/unsupported/macx-iossimulator-g++-legacy/qplatformdefs.h
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the qmake spec of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "../../common/ios/qplatformdefs.h"
diff --git a/mkspecs/unsupported/macx-iossimulator-g++/qmake.conf b/mkspecs/unsupported/macx-iossimulator-g++/qmake.conf
new file mode 100644
index 0000000000..99848be410
--- /dev/null
+++ b/mkspecs/unsupported/macx-iossimulator-g++/qmake.conf
@@ -0,0 +1,33 @@
+#
+# qmake configuration for ios-simulator-g++
+#
+# Depends on:
+#
+# QMAKE_IOS_XCODE_VERSION - set in mkspecs/common/ios/versions.conf
+#
+
+include(../../common/mac.conf)
+include(../../common/gcc-base-ios.conf)
+include(../../common/g++-macx.conf)
+include(../../common/ios.conf)
+include(../../common/ios/versions.conf)
+include(../../common/ios/arch.conf)
+include(../../common/ios/g++.conf)
+include(../../common/ios/qmake.conf)
+
+# Version check (g++ was discontinued at version 4.2, but user may have added it themselves)
+lessThan(QMAKE_IOS_XCODE_VERSION, "4.3"): error("This mkspec requires Xcode 4.3 or later")
+
+# iOS build tools
+QMAKE_CC = /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2
+QMAKE_CXX = /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/g++-4.2
+QMAKE_FIX_RPATH = /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/install_name_tool -id
+QMAKE_AR = /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/ar cq
+QMAKE_RANLIB = /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/ranlib -s
+QMAKE_LINK = $$QMAKE_CXX
+QMAKE_LINK_SHLIB = $$QMAKE_CXX
+
+# Check that compiler is valid
+!exists($$QMAKE_CXX): error("The version of Xcode installed on this system does not include the g++ 4.2 compiler")
+
+load(qt_config)
diff --git a/mkspecs/unsupported/macx-iossimulator-g++/qplatformdefs.h b/mkspecs/unsupported/macx-iossimulator-g++/qplatformdefs.h
new file mode 100644
index 0000000000..89621ea21d
--- /dev/null
+++ b/mkspecs/unsupported/macx-iossimulator-g++/qplatformdefs.h
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the qmake spec of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "../../common/ios/qplatformdefs.h"
diff --git a/mkspecs/unsupported/macx-iossimulator-llvm-legacy/qmake.conf b/mkspecs/unsupported/macx-iossimulator-llvm-legacy/qmake.conf
new file mode 100644
index 0000000000..95d530cc18
--- /dev/null
+++ b/mkspecs/unsupported/macx-iossimulator-llvm-legacy/qmake.conf
@@ -0,0 +1,33 @@
+#
+# qmake configuration for ios-simulator-llvm
+#
+# Depends on:
+#
+# QMAKE_IOS_XCODE_VERSION - set in mkspecs/common/ios/versions.conf
+#
+
+include(../../common/mac.conf)
+include(../../common/gcc-base-ios.conf)
+include(../../common/llvm.conf)
+include(../../common/ios.conf)
+include(../../common/ios/versions.conf)
+include(../../common/ios/arch.conf)
+include(../../common/ios/llvm.conf)
+include(../../common/ios/qmake.conf)
+
+# Version check
+!lessThan(QMAKE_IOS_XCODE_VERSION, "4.3"): error("This mkspec requires Xcode 4.2.x or earlier")
+
+# iOS build tools
+QMAKE_CC = /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/llvm-gcc-4.2
+QMAKE_CXX = /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/llvm-g++-4.2
+QMAKE_FIX_RPATH = /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/install_name_tool -id
+QMAKE_AR = /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/ar cq
+QMAKE_RANLIB = /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/ranlib -s
+QMAKE_LINK = $$QMAKE_CXX
+QMAKE_LINK_SHLIB = $$QMAKE_CXX
+
+# Check that compiler is valid
+!exists($$QMAKE_CXX): error("The version of Xcode installed on this system does not include the llvm-g++ 4.2 compiler")
+
+load(qt_config)
diff --git a/mkspecs/unsupported/macx-iossimulator-llvm-legacy/qplatformdefs.h b/mkspecs/unsupported/macx-iossimulator-llvm-legacy/qplatformdefs.h
new file mode 100644
index 0000000000..89621ea21d
--- /dev/null
+++ b/mkspecs/unsupported/macx-iossimulator-llvm-legacy/qplatformdefs.h
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the qmake spec of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "../../common/ios/qplatformdefs.h"
diff --git a/mkspecs/unsupported/macx-iossimulator-llvm/qmake.conf b/mkspecs/unsupported/macx-iossimulator-llvm/qmake.conf
new file mode 100644
index 0000000000..7e3d4b5710
--- /dev/null
+++ b/mkspecs/unsupported/macx-iossimulator-llvm/qmake.conf
@@ -0,0 +1,33 @@
+#
+# qmake configuration for ios-simulator-llvm
+#
+# Depends on:
+#
+# QMAKE_IOS_XCODE_VERSION - set in mkspecs/common/ios/versions.conf
+#
+
+include(../../common/mac.conf)
+include(../../common/gcc-base-ios.conf)
+include(../../common/llvm.conf)
+include(../../common/ios.conf)
+include(../../common/ios/versions.conf)
+include(../../common/ios/arch.conf)
+include(../../common/ios/llvm.conf)
+include(../../common/ios/qmake.conf)
+
+# Version check
+lessThan(QMAKE_IOS_XCODE_VERSION, "4.3"): error("This mkspec requires Xcode 4.3 or later")
+
+# iOS build tools
+QMAKE_CC = /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/llvm-gcc-4.2
+QMAKE_CXX = /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/llvm-g++-4.2
+QMAKE_FIX_RPATH = /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/install_name_tool -id
+QMAKE_AR = /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/ar cq
+QMAKE_RANLIB = /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/ranlib -s
+QMAKE_LINK = $$QMAKE_CXX
+QMAKE_LINK_SHLIB = $$QMAKE_CXX
+
+# Check that compiler is valid
+!exists($$QMAKE_CXX): error("The version of Xcode installed on this system does not include the llvm-g++ 4.2 compiler")
+
+load(qt_config)
diff --git a/mkspecs/unsupported/macx-iossimulator-llvm/qplatformdefs.h b/mkspecs/unsupported/macx-iossimulator-llvm/qplatformdefs.h
new file mode 100644
index 0000000000..89621ea21d
--- /dev/null
+++ b/mkspecs/unsupported/macx-iossimulator-llvm/qplatformdefs.h
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the qmake spec of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "../../common/ios/qplatformdefs.h"
diff --git a/mkspecs/unsupported/qnx-armv7le-qcc/qmake.conf b/mkspecs/unsupported/qnx-armv7le-qcc/qmake.conf
index ac6da27061..37c66cd178 100644
--- a/mkspecs/unsupported/qnx-armv7le-qcc/qmake.conf
+++ b/mkspecs/unsupported/qnx-armv7le-qcc/qmake.conf
@@ -2,24 +2,6 @@
# qmake configuration for qnx-qcc armv7 targets
#
-MAKEFILE_GENERATOR = UNIX
-TARGET_PLATFORM = unix
-TEMPLATE = app
-CONFIG += qt warn_on release link_prl
-QT += core gui
+include(../../common/qcc-base-qnx-armv7le.conf)
-include(../../common/g++-unix.conf)
-include(../../common/unix.conf)
-
-QMAKE_CC = qcc -Vgcc_ntoarmv7le
-QNX_CPUDIR = armle-v7
-
-include(../../common/qcc-base-qnx.conf)
-
-QMAKE_AR = ntoarmv7-ar cqs
-QMAKE_OBJCOPY = ntoarmv7-objcopy
-QMAKE_RANLIB = ntoarmv7-ranlib
-
-QMAKE_STRIP = ntoarmv7-strip
-
-load(qt_config)
+DEFINES += QT_NO_CLIPBOARD
diff --git a/mkspecs/unsupported/qnx-x86-qcc/qmake.conf b/mkspecs/unsupported/qnx-x86-qcc/qmake.conf
index fef8d443c1..cf588bae1c 100644
--- a/mkspecs/unsupported/qnx-x86-qcc/qmake.conf
+++ b/mkspecs/unsupported/qnx-x86-qcc/qmake.conf
@@ -2,24 +2,6 @@
# qmake configuration for qnx-qcc x86 targets
#
-MAKEFILE_GENERATOR = UNIX
-TARGET_PLATFORM = unix
-TEMPLATE = app
-CONFIG += qt warn_on release link_prl
-QT += core gui
+include(../../common/qcc-base-qnx-x86.conf)
-include(../../common/g++-unix.conf)
-include(../../common/unix.conf)
-
-QMAKE_CC = qcc -Vgcc_ntox86
-QNX_CPUDIR = x86
-
-include(../../common/qcc-base-qnx.conf)
-
-QMAKE_AR = ntox86-ar cqs
-QMAKE_OBJCOPY = ntox86-objcopy
-QMAKE_RANLIB = ntox86-ranlib
-
-QMAKE_STRIP = ntox86-strip
-
-load(qt_config)
+DEFINES += QT_NO_CLIPBOARD
diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp
index 1904b8f6c6..d37089ee35 100644
--- a/qmake/generators/makefile.cpp
+++ b/qmake/generators/makefile.cpp
@@ -3251,7 +3251,8 @@ MakefileGenerator::writePkgConfigFile()
} else {
pkgConfiglibDir = "-L${libdir}";
pkgConfiglibName = "-l" + lname.left(lname.length()-Option::libtool_ext.length());
- pkgConfiglibName += project->first("TARGET_VERSION_EXT");
+ if (project->isActiveConfig("shared"))
+ pkgConfiglibName += project->first("TARGET_VERSION_EXT");
}
t << pkgConfiglibDir << " " << pkgConfiglibName << " " << endl;
diff --git a/qmake/generators/win32/msbuild_objectmodel.cpp b/qmake/generators/win32/msbuild_objectmodel.cpp
index 3410c296ce..235e7ff634 100644
--- a/qmake/generators/win32/msbuild_objectmodel.cpp
+++ b/qmake/generators/win32/msbuild_objectmodel.cpp
@@ -660,6 +660,13 @@ void VCXProjectWriter::write(XmlOutput &xml, VCProject &tool)
<< valueTagT(ts);
}
+ const triState generateManifest = tool.SingleProjects.at(i).Configuration.linker.GenerateManifest;
+ if (generateManifest != unset) {
+ xml << tag("GenerateManifest")
+ << attrTag("Condition", QString("'$(Configuration)|$(Platform)'=='%1'").arg(tool.SingleProjects.at(i).Configuration.Name))
+ << valueTagT(generateManifest);
+ }
+
if ( tool.SingleProjects.at(i).Configuration.preBuild.ExcludedFromBuild != unset )
{
xml << tag("PreBuildEventUseInBuild")
diff --git a/qmake/generators/win32/msvc_objectmodel.cpp b/qmake/generators/win32/msvc_objectmodel.cpp
index e0f55a64c9..b474dac7a5 100644
--- a/qmake/generators/win32/msvc_objectmodel.cpp
+++ b/qmake/generators/win32/msvc_objectmodel.cpp
@@ -2185,7 +2185,6 @@ bool VCFilter::addExtraCompiler(const VCFilterFile &info)
QString tmp_cmd_name = Project->project->variables()[extraCompilerName + ".name"].join(" ");
QStringList tmp_dep = Project->project->variables()[extraCompilerName + ".depends"];
QString tmp_dep_cmd = Project->project->variables()[extraCompilerName + ".depend_command"].join(" ");
- QStringList vars = Project->project->variables()[extraCompilerName + ".variables"];
QStringList configs = Project->project->variables()[extraCompilerName + ".CONFIG"];
bool combined = configs.indexOf("combine") != -1;
diff --git a/qmake/generators/win32/msvc_vcproj.cpp b/qmake/generators/win32/msvc_vcproj.cpp
index c2482b58a8..951784ec28 100644
--- a/qmake/generators/win32/msvc_vcproj.cpp
+++ b/qmake/generators/win32/msvc_vcproj.cpp
@@ -476,10 +476,13 @@ void VcprojGenerator::writeSubDirs(QTextStream &t)
// and to be able to extract all the dependencies
Option::QMAKE_MODE old_mode = Option::qmake_mode;
Option::qmake_mode = Option::QMAKE_GENERATE_NOTHING;
+ QString old_output_dir = Option::output_dir;
+ Option::output_dir = QFileInfo(fileFixify(dir, qmake_getpwd(), Option::output_dir)).canonicalFilePath();
VcprojGenerator tmp_vcproj;
tmp_vcproj.setNoIO(true);
tmp_vcproj.setProjectFile(&tmp_proj);
Option::qmake_mode = old_mode;
+ Option::output_dir = old_output_dir;
if(Option::debug_level) {
debug_msg(1, "Dumping all variables:");
QHash<QString, QStringList> &vars = tmp_proj.variables();
diff --git a/qmake/generators/win32/winmakefile.cpp b/qmake/generators/win32/winmakefile.cpp
index 9d983ffc66..895c331b21 100644
--- a/qmake/generators/win32/winmakefile.cpp
+++ b/qmake/generators/win32/winmakefile.cpp
@@ -420,6 +420,8 @@ void Win32MakefileGenerator::processRcFileVar()
productName = project->values("TARGET").first();
QString originalName = project->values("TARGET").first() + project->values("TARGET_EXT").first();
+ int rcLang = project->intValue("RC_LANG", 1033); // default: English(USA)
+ int rcCodePage = project->intValue("RC_CODEPAGE", 1200); // default: Unicode
ts << "# if defined(UNDER_CE)" << endl;
ts << "# include <winbase.h>" << endl;
@@ -445,7 +447,9 @@ void Win32MakefileGenerator::processRcFileVar()
ts << "\tBEGIN" << endl;
ts << "\t\tBLOCK \"StringFileInfo\"" << endl;
ts << "\t\tBEGIN" << endl;
- ts << "\t\t\tBLOCK \"040904B0\"" << endl;
+ ts << "\t\t\tBLOCK \""
+ << QString("%1%2").arg(rcLang, 4, 16, QLatin1Char('0')).arg(rcCodePage, 4, 16, QLatin1Char('0'))
+ << "\"" << endl;
ts << "\t\t\tBEGIN" << endl;
ts << "\t\t\t\tVALUE \"CompanyName\", \"" << companyName << "\\0\"" << endl;
ts << "\t\t\t\tVALUE \"FileDescription\", \"" << description << "\\0\"" << endl;
@@ -457,6 +461,12 @@ void Win32MakefileGenerator::processRcFileVar()
ts << "\t\tEND" << endl;
ts << "\t\tBLOCK \"VarFileInfo\"" << endl;
ts << "\t\tBEGIN" << endl;
+ ts << "\t\t\tVALUE \"Translation\", "
+ << QString("0x%1").arg(rcLang, 4, 16, QLatin1Char('0'))
+ << ", " << QString("%1").arg(rcCodePage, 4) << endl;
+ ts << "\t\tEND" << endl;
+ ts << "\t\tBLOCK \"VarFileInfo\"" << endl;
+ ts << "\t\tBEGIN" << endl;
ts << "\t\t\tVALUE \"Translation\", 0x409, 1200" << endl;
ts << "\t\tEND" << endl;
ts << "\tEND" << endl;
diff --git a/qmake/project.cpp b/qmake/project.cpp
index c491e9b1b7..9716237f90 100644
--- a/qmake/project.cpp
+++ b/qmake/project.cpp
@@ -2085,7 +2085,7 @@ QMakeProject::doProjectExpand(QString func, QList<QStringList> args_list,
dirs.append("");
}
- const QRegExp regex(r, Qt::CaseSensitive, QRegExp::Wildcard);
+ QRegExp regex(r, Qt::CaseSensitive, QRegExp::Wildcard);
for(int d = 0; d < dirs.count(); d++) {
QString dir = dirs[d];
if (!dir.isEmpty() && !dir.endsWith(QLatin1Char('/')))
diff --git a/qmake/project.h b/qmake/project.h
index 979f1480bd..ccdc1b63f1 100644
--- a/qmake/project.h
+++ b/qmake/project.h
@@ -156,6 +156,7 @@ public:
bool isEmpty(const QString &v); // With compat mapping, but no magic variables
QStringList &values(const QString &v); // With compat mapping and magic variables
QString first(const QString &v); // ditto
+ int intValue(const QString &v, int defaultValue = 0); // ditto
QHash<QString, QStringList> &variables(); // No compat mapping and magic, obviously
bool isRecursive() const { return recursive; }
@@ -189,6 +190,18 @@ inline QString QMakeProject::first(const QString &v)
return vals.first();
}
+inline int QMakeProject::intValue(const QString &v, int defaultValue)
+{
+ const QString str = first(v);
+ if (!str.isEmpty()) {
+ bool ok;
+ int i = str.toInt(&ok);
+ if (ok)
+ return i;
+ }
+ return defaultValue;
+}
+
inline QHash<QString, QStringList> &QMakeProject::variables()
{ return vars; }
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp b/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp
index e630ec3808..f6900325bc 100644
--- a/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp
+++ b/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp
@@ -1302,52 +1302,30 @@ HB_Bool HB_OpenTypePosition(HB_ShaperItem *item, int availableGlyphs, HB_Bool do
glyphs[i] = face->buffer->in_string[i].gindex;
attributes[i] = face->tmpAttributes[face->buffer->in_string[i].cluster];
if (i && face->buffer->in_string[i].cluster == face->buffer->in_string[i-1].cluster)
- attributes[i].clusterStart = false; //FIXME - Shouldn't we otherwise set this to true, rather than leaving it?
+ attributes[i].clusterStart = false;
}
item->num_glyphs = face->buffer->in_length;
if (doLogClusters && face->glyphs_substituted) {
// we can't do this for indic, as we pass the stuf in syllables and it's easier to do it in the shaper.
- // #### the reconstruction of the logclusters currently does not work if the original string
- // contains surrogate pairs
-
unsigned short *logClusters = item->log_clusters;
int clusterStart = 0;
- int oldIntermediateIndex = 0;
-
- // This code makes a mapping, logClusters, between the original utf16 string (item->string) and the final
- // set of glyphs (in_string).
- //
- // The code sets the value of logClusters[i] to the index of in_string containing the glyph that will render
- // item->string[i].
- //
- // This is complicated slightly because in_string[i].cluster is an index to an intermediate
- // array of glyphs - the array that we were passed as the original value of item->glyphs.
- // To map from the original string to the intermediate array of glyphs we have tmpLogClusters.
- //
- // So we have three groups of indexes:
- //
- // i,clusterStart = index to in_length, the final set of glyphs. Also an index to attributes
- // intermediateIndex = index to the glyphs originally passed in.
- // stringIndex = index to item->string, the original string.
-
- int stringIndex = 0;
- // Iterate over the final set of glyphs...
+ int oldCi = 0;
+ // #### the reconstruction of the logclusters currently does not work if the original string
+ // contains surrogate pairs
for (unsigned int i = 0; i < face->buffer->in_length; ++i) {
- // Get the index into the intermediate string for the start of the cluster of chars
- int intermediateIndex = face->buffer->in_string[i].cluster;
- if (intermediateIndex != oldIntermediateIndex) {
- // We have found the end of the cluster of chars in the intermediate string
- while (face->tmpLogClusters[stringIndex] < intermediateIndex) {
- logClusters[stringIndex++] = clusterStart;
- }
+ int ci = face->buffer->in_string[i].cluster;
+ // DEBUG(" ci[%d] = %d mark=%d, cmb=%d, cs=%d",
+ // i, ci, glyphAttributes[i].mark, glyphAttributes[i].combiningClass, glyphAttributes[i].clusterStart);
+ if (!attributes[i].mark && attributes[i].clusterStart && ci != oldCi) {
+ for (int j = oldCi; j < ci; j++)
+ logClusters[j] = clusterStart;
clusterStart = i;
- oldIntermediateIndex = intermediateIndex;
+ oldCi = ci;
}
}
- while (stringIndex < face->length) {
- logClusters[stringIndex++] = clusterStart;
- }
+ for (int j = oldCi; j < face->length; j++)
+ logClusters[j] = clusterStart;
}
// calulate the advances for the shaped glyphs
diff --git a/src/3rdparty/libjpeg/jinclude.h b/src/3rdparty/libjpeg/jinclude.h
index a61939daaa..464b84d6d3 100644
--- a/src/3rdparty/libjpeg/jinclude.h
+++ b/src/3rdparty/libjpeg/jinclude.h
@@ -20,7 +20,7 @@
#include "jconfig.h" /* auto configuration options */
#define JCONFIG_INCLUDED /* so that jpeglib.h doesn't do it again */
-#ifdef _MSC_VER
+#if defined(_MSC_VER) && !defined (_CRT_SECURE_NO_DEPRECATE)
# define _CRT_SECURE_NO_DEPRECATE
#endif
diff --git a/src/3rdparty/libpng/ANNOUNCE b/src/3rdparty/libpng/ANNOUNCE
index 4a3b01888c..dbc2ed1730 100644
--- a/src/3rdparty/libpng/ANNOUNCE
+++ b/src/3rdparty/libpng/ANNOUNCE
@@ -1,5 +1,5 @@
-Libpng 1.5.1 - February 3, 2011
+Libpng 1.5.10 - March 29, 2012
This is a public release of libpng, intended for use in production codes.
@@ -8,89 +8,57 @@ Files available for download:
Source files with LF line endings (for Unix/Linux) and with a
"configure" script
- libpng-1.5.1.tar.xz (LZMA-compressed, recommended)
- libpng-1.5.1.tar.gz
- libpng-1.5.1.tar.bz2
+ libpng-1.5.10.tar.xz (LZMA-compressed, recommended)
+ libpng-1.5.10.tar.gz
+ libpng-1.5.10.tar.bz2
Source files with CRLF line endings (for Windows), without the
"configure" script
- lpng151.7z (LZMA-compressed, recommended)
- lpng151.zip
+ lpng1510.7z (LZMA-compressed, recommended)
+ lpng1510.zip
Other information:
- libpng-1.5.1-README.txt
- libpng-1.5.1-LICENSE.txt
+ libpng-1.5.10-README.txt
+ libpng-1.5.10-LICENSE.txt
-Changes since the last public release (1.5.0):
+Changes since the last public release (1.5.9):
- Added description of png_set_crc_action() to the manual.
- Added a note in the manual that the type of the iCCP profile was changed
- from png_charpp to png_bytepp in png_get_iCCP(). Similarly,
- it was changed from png_charpp to png_const_bytepp in png_set_iCCP().
- Ensure that png_rgb_to_gray ignores palette mapped images, if libpng
- internally happens to call it with one.
- Fixed the failure to handle palette mapped images correctly.
- Fixed a bug in handling of interlaced images (bero at arklinux.org).
- Updated CMakeLists.txt (Clifford Yapp)
- Fixed typecasting of some png_debug() statements (Cosmin)
- Updated documentation of png_set|get_tRNS() (Thomas Klausner).
- Mentioned in the documentation that applications must #include "zlib.h"
- if they need access to anything in zlib.h, and that a number of
- macros such as png_memset() are no longer accessible by applications.
- Corrected pngvalid gamma test "sample" function to access all of the color
- samples of each pixel, instead of sampling the red channel three times.
- Changed variable names index, div, exp, and gamma to char_index, divisor,
- exp_b10, and gamma_val, respectively, to avoid "shadow" warnings.
- Prevent png_push_crc_skip() from hanging while reading an unknown chunk
- or an over-large compressed zTXt chunk with the progressive reader.
- Eliminated more GCC "shadow" warnings.
- Revised png_fixed() in png.c to avoid compiler warning about reaching the
- end without returning anything.
- In the manual, describe the png_get_IHDR() arguments in the correct order.
- Added const_png_structp and const_png_infop types, and used them in
- prototypes for most png_get_*() functions.
- Added png_get_io_chunk_type() and deprecated png_get_io_chunk_name()
- Added synopses for the IO_STATE functions and other missing synopses
- to the manual. Removed the synopses from libpngpf.3 because they
- were out of date and no longer useful. Better information can be
- obtained by reading the prototypes and comments in pngpriv.h
- Attempted to fix cpp on Solaris with S. Studio 12 cc, fix build
- Added a make macro DFNCPP that is a CPP that will accept the tokens in
- a .dfn file and adds configure stuff to test for such a CPP. ./configure
- should fail if one is not available.
- Corrected const_png_ in png.h to png_const_ to avoid polluting the namespace.
- Added png_get_current_row_number and png_get_current_pass_number for the
- benefit of the user transform callback.
- Added png_process_data_pause and png_process_data_skip for the benefit of
- progressive readers that need to stop data processing or want to optimize
- skipping of unread data (e.g. if the reader marks a chunk to be skipped.)
- Enhanced pngvalid, corrected an error in gray_to_rgb, corrected doc error.
- pngvalid contains tests of transforms, which tests are currently disabled
- because they are incompletely tested. gray_to_rgb was failing to expand
- the bit depth for smaller bit depth images; this seems to be a long
- standing error and resulted, apparently, in invalid output. The
- documentation did not accurately describe what libpng really does when
- converting RGB to gray.
- Fixed incorrect examples of callback prototypes in the manual, that were
- introduced in libpng-1.0.0.
- In addition the order of the png_get_uint macros with respect to the
- relevant function definitions has been reversed. This helps the
- preprocessing of the symbol files be more robust. Furthermore, the
- symbol file preprocessing now uses -DPNG_NO_USE_READ_MACROS even when
- the library may actually be built with PNG_USE_READ_MACROS; this stops
- the read macros interfering with the symbol file format.
- Made the manual, synopses, and function prototypes use the function
- argument names file_gamma, int_file_gamma, and srgb_intent consistently.
- Changed PNG_UNUSED from "param=param;" to "(void)param;".
- Added transform tests to pngvalid and simplified the arguments.
- Added a request in the manual that applications do not use "png_" or
- "PNG_" to begin any of their own symbols.
+ Removed two useless #ifdef directives from pngread.c and one from pngrutil.c
+ Always put the CMAKE_LIBRARY in "lib" (removed special WIN32 case).
+ Removed empty vstudio/pngstest directory (Clifford Yapp).
+ Eliminated redundant png_push_read_tEXt|zTXt|iTXt|unknown code from
+ pngpread.c and use the sequential png_handle_tEXt, etc., in pngrutil.c;
+ now that png_ptr->buffer is inaccessible to applications, the special
+ handling is no longer useful.
+ Fixed bug with png_handle_hIST with odd chunk length (Frank Busse).
+ Added PNG_SAFE_LIMITS feature to pnglibconf.dfa and code in pngconf.h
+ to reset the user limits to safe ones if PNG_SAFE_LIMITS is defined.
+ To enable, use "CPPFLAGS=-DPNG_SAFE_LIMITS_SUPPORTED" on the configure
+ command or put "#define PNG_SAFE_LIMITS_SUPPORTED" in pnglibconf.h.
+ Revised the SAFE_LIMITS feature to be the same as the feature in libpng16.
+ Added information about the new limits in the manual.
+ Updated Makefile.in
+ Removed unused "current_text" members of png_struct and the png_free()
+ of png_ptr->current_text from pngread.c
+ Fixed PNG_LIBPNG_BUILD_BASE_TYPE definition.
+ Fixed CMF optimization of non-IDAT compressed chunks, which was added at
+ libpng-1.5.4. It sometimes produced too small of a window.
+ Reject all iCCP chunks after the first, even if the first one is invalid.
+ Added palette-index checking. Issue a png_benign_error() if an invalid
+ index is found.
+ Revised example.c to put text strings in a temporary character array
+ instead of directly assigning string constants to png_textp members.
+ This avoids compiler warnings when -Wwrite-strings is enabled.
+ Prevent PNG_EXPAND+PNG_SHIFT doing the shift twice.
+ Revised png_set_text_2() to avoid potential memory corruption (fixes
+ CVE-2011-3048).
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
(subscription required; visit
https://lists.sourceforge.net/lists/listinfo/png-mng-implement
-to subscribe) or to glennrp at users.sourceforge.net
+to subscribe)
+or to glennrp at users.sourceforge.net
Glenn R-P
diff --git a/src/3rdparty/libpng/CHANGES b/src/3rdparty/libpng/CHANGES
index fa5f2aae79..70af8273e7 100644
--- a/src/3rdparty/libpng/CHANGES
+++ b/src/3rdparty/libpng/CHANGES
@@ -1,5 +1,4 @@
#if 0
-libpng_changes(){ /*
CHANGES - changes for libpng
Version 0.2
@@ -15,7 +14,7 @@ Version 0.3
fixed some bugs in writer
interfaced with zlib 0.5
added K&R support
- added check for 64 KB blocks for 16 bit machines
+ added check for 64 KB blocks for 16-bit machines
Version 0.4
cleaned up code and commented code
@@ -74,7 +73,7 @@ Version 0.82 [September, 1995]
Version 0.85 [December, 1995]
added more medium model code (almost everything's a far)
added i/o, error, and memory callback functions
- fixed some bugs (16 bit, 4 bit interlaced, etc.)
+ fixed some bugs (16-bit, 4-bit interlaced, etc.)
added first run progressive reader (barely tested)
Version 0.86 [January, 1996]
@@ -180,7 +179,7 @@ Version 0.96 [May, 1997]
Fixed serious bug with < 8bpp images introduced in 0.95
Fixed 256-color transparency bug (Greg Roelofs)
Fixed up documentation (Greg Roelofs, Laszlo Nyul)
- Fixed "error" in pngconf.h for Linux setjmp() behaviour
+ Fixed "error" in pngconf.h for Linux setjmp() behavior
Fixed DOS medium model support (Tim Wegner)
Fixed png_check_keyword() for case with error in static string text
Added read of CRC after IEND chunk for embedded PNGs (Laszlo Nyul)
@@ -197,18 +196,20 @@ Version 0.97 [January, 1998]
Added more typecasts. 65536L becomes (png_uint_32)65536L, etc. (Glenn R-P)
Minor corrections in libpng.txt
Added simple sRGB support (Glenn R-P)
- Easier conditional compiling, e.g. define PNG_READ/WRITE_NOT_FULLY_SUPPORTED;
+ Easier conditional compiling, e.g.,
+ define PNG_READ/WRITE_NOT_FULLY_SUPPORTED;
all configurable options can be selected from command-line instead
of having to edit pngconf.h (Glenn R-P)
Fixed memory leak in pngwrite.c (free info_ptr->text) (Glenn R-P)
Added more conditions for png_do_background, to avoid changing
black pixels to background when a background is supplied and
no pixels are transparent
- Repaired PNG_NO_STDIO behaviour
- Tested NODIV support and made it default behaviour (Greg Roelofs)
+ Repaired PNG_NO_STDIO behavior
+ Tested NODIV support and made it default behavior (Greg Roelofs)
Added "-m" option and PNGTEST_DEBUG_MEMORY to pngtest (John Bowler)
Regularized version numbering scheme and bumped shared-library major
- version number to 2 to avoid problems with libpng 0.89 apps (Greg Roelofs)
+ version number to 2 to avoid problems with libpng 0.89 apps
+ (Greg Roelofs)
Version 0.98 [January, 1998]
Cleaned up some typos in libpng.txt and in code documentation
@@ -1778,7 +1779,7 @@ Version 1.2.13beta1 [October 2, 2006]
Removed AC_FUNC_MALLOC from configure.ac
Work around Intel-Mac compiler bug by setting PNG_NO_MMX_CODE in pngconf.h
Change "logical" to "bitwise" throughout documentation.
- Detect and fix attempt to write wrong iCCP profile length.
+ Detect and fix attempt to write wrong iCCP profile length (CVE-2006-7244)
Version 1.0.21, 1.2.13 [November 14, 2006]
Fix potential buffer overflow in sPLT chunk handler.
@@ -2361,7 +2362,7 @@ Version 1.4.0beta72 [August 1, 2009]
Version 1.4.0beta73 [August 1, 2009]
Reject attempt to write iCCP chunk with negative embedded profile length
- (JD Chen)
+ (JD Chen) (CVE-2009-5063).
Version 1.4.0beta74 [August 8, 2009]
Changed png_ptr and info_ptr member "trans" to "trans_alpha".
@@ -2935,7 +2936,7 @@ Version 1.5.0beta36 [July 29, 2010]
PNG_INTERLACE transform and to get the number of rows in the current
pass.
A new test program, pngvalid.c, validates the gamma code.
- Errors in the 16 bit gamma correction (overflows) have been corrected.
+ Errors in the 16-bit gamma correction (overflows) have been corrected.
cHRM chunk testing is done consistently (previously the floating point
API bypassed it, because the test really didn't work on FP, now the test
is performed on the actual values to be stored in the PNG file so it
@@ -3149,8 +3150,8 @@ version 1.5.1beta01 [January 8, 2011]
in version 1.5.0beta36 but is not noted in the CHANGES. Similarly,
it was changed from png_charpp to png_const_bytepp in png_set_iCCP().
Ensure that png_rgb_to_gray ignores palette mapped images, if libpng
- internally happens to call it with one.
- Fixed a failure to handle palette mapped images correctly.
+ internally happens to call it with one, and fixed a failure to handle
+ palette mapped images correctly. This fixes CVE-2690.
Version 1.5.1beta02 [January 14, 2011]
Fixed a bug in handling of interlaced images (bero at arklinux.org).
@@ -3208,9 +3209,9 @@ Version 1.5.1beta09 [January 24, 2011]
pngvalid contains tests of transforms, which tests are currently disabled
because they are incompletely tested. gray_to_rgb was failing to expand
the bit depth for smaller bit depth images; this seems to be a long
- standing error and resulted, apparently, in invalid output. The
- documentation did not accurately describe what libpng really does when
- converting RGB to gray.
+ standing error and resulted, apparently, in invalid output
+ (CVE-2011-0408, CERT VU#643140). The documentation did not accurately
+ describe what libpng really does when converting RGB to gray.
Version 1.5.1beta10 [January 27, 2010]
Fixed incorrect examples of callback prototypes in the manual, that were
@@ -3227,7 +3228,7 @@ Version 1.5.1beta10 [January 27, 2010]
Version 1.5.1beta11 [January 28, 2011]
Changed PNG_UNUSED from "param=param;" to "{if(param){}}".
Corrected local variable type in new API png_process_data_skip()
- The type was self-evidently incorrect but only causes problems on 64 bit
+ The type was self-evidently incorrect but only causes problems on 64-bit
architectures.
Added transform tests to pngvalid and simplified the arguments.
@@ -3242,6 +3243,617 @@ Version 1.5.1rc02 [January 31, 2011]
Version 1.5.1 [February 3, 2011]
No changes.
+Version 1.5.2beta01 [February 13, 2011]
+ More -Wshadow fixes for older gcc compilers. Older gcc versions apparently
+ check formal parameters names in function declarations (as well as
+ definitions) to see if they match a name in the global namespace.
+ Revised PNG_EXPORTA macro to not use an empty parameter, to accommodate the
+ old VisualC++ preprocessor.
+ Turned on interlace handling in png_read_png().
+ Fixed gcc pendantic warnings.
+ Handle longjmp in Cygwin.
+ Fixed png_get_current_row_number() in the interlaced case.
+ Cleaned up ALPHA flags and transformations.
+ Implemented expansion to 16 bits.
+
+Version 1.5.2beta02 [February 19, 2011]
+ Fixed mistake in the descriptions of user read_transform and write_transform
+ function prototypes in the manual. The row_info struct is png_row_infop.
+ Reverted png_get_current_row_number() to previous (1.5.2beta01) behavior.
+ Corrected png_get_current_row_number documentation
+ Fixed the read/write row callback documentation.
+ This documents the current behavior, where the callback is called after
+ every row with information pertaining to the next row.
+
+Version 1.5.2beta03 [March 3, 2011]
+ Fixed scripts/makefile.vcwin32
+ Updated contrib/pngsuite/README to add the word "modify".
+ Define PNG_ALLOCATED to blank when _MSC_VER<1300.
+
+Version 1.5.2rc01 [March 19, 2011]
+ Define remaining attributes to blank when MSC_VER<1300.
+ ifdef out mask arrays in pngread.c when interlacing is not supported.
+
+Version 1.5.2rc02 [March 22, 2011]
+ Added a hint to try CPP=/bin/cpp if "cpp -E" fails in scripts/pnglibconf.mak
+ and in contrib/pngminim/*/makefile, eg., on SunOS 5.10, and removed "strip"
+ from the makefiles.
+ Fixed a bug (present since libpng-1.0.7) that makes png_handle_sPLT() fail
+ to compile when PNG_NO_POINTER_INDEXING is defined (Chubanov Kirill)
+
+Version 1.5.2rc03 [March 24, 2011]
+ Don't include standard header files in png.h while building the symbol table,
+ to avoid cpp failure on SunOS (introduced PNG_BUILDING_SYMBOL_TABLE macro).
+
+Version 1.5.2 [March 31, 2011]
+ No changes.
+
+Version 1.5.3beta01 [April 1, 2011]
+ Re-initialize the zlib compressor before compressing non-IDAT chunks.
+ Added API functions (png_set_text_compression_level() and four others) to
+ set parameters for zlib compression of non-IDAT chunks.
+
+Version 1.5.3beta02 [April 3, 2011]
+ Updated scripts/symbols.def with new API functions.
+ Only compile the new zlib re-initializing code when text or iCCP is
+ supported, using PNG_WRITE_COMPRESSED_TEXT_SUPPORTED macro.
+ Improved the optimization of the zlib CMF byte (see libpng-1.2.6beta03).
+ Optimize the zlib CMF byte in non-IDAT compressed chunks
+
+Version 1.5.3beta03 [April 16, 2011]
+ Fixed gcc -ansi -pedantic compile. A strict ANSI system does not have
+ snprintf, and the "__STRICT_ANSI__" detects that condition more reliably
+ than __STDC__ (John Bowler).
+ Removed the PNG_PTR_NORETURN attribute because it too dangerous. It tells
+ the compiler that a user supplied callback (the error handler) does not
+ return, yet there is no guarantee in practice that the application code
+ will correctly implement the error handler because the compiler only
+ issues a warning if there is a mistake (John Bowler).
+ Removed the no-longer-used PNG_DEPSTRUCT macro.
+ Updated the zlib version to 1.2.5 in the VStudio project.
+ Fixed 64-bit builds where png_uint_32 is smaller than png_size_t in
+ pngwutil.c (John Bowler).
+ Fixed bug with stripping the filler or alpha channel when writing, that
+ was introduced in libpng-1.5.2beta01 (bug report by Andrew Church).
+
+Version 1.5.3beta04 [April 27, 2011]
+ Updated pngtest.png with the new zlib CMF optimization.
+ Cleaned up conditional compilation code and of background/gamma handling
+ Internal changes only except a new option to avoid compiling the
+ png_build_grayscale_palette API (which is not used at all internally.)
+ The main change is to move the transform tests (READ_TRANSFORMS,
+ WRITE_TRANSFORMS) up one level to the caller of the APIs. This avoids
+ calls to spurious functions if all transforms are disabled and slightly
+ simplifies those functions. Pngvalid modified to handle this.
+ A minor change is to stop the strip_16 and expand_16 interfaces from
+ disabling each other; this allows the future alpha premultiplication
+ code to use 16-bit intermediate values while still producing 8-bit output.
+ png_do_background and png_do_gamma have been simplified to take a single
+ pointer to the png_struct rather than pointers to every item required
+ from the png_struct. This makes no practical difference to the internal
+ code.
+ A serious bug in the pngvalid internal routine 'standard_display_init' has
+ been fixed - this failed to initialize the red channel and accidentally
+ initialized the alpha channel twice.
+ Changed png_struct jmp_buf member name from png_jmpbuf to tmp_jmpbuf to
+ avoid a possible clash with the png_jmpbuf macro on some platforms.
+
+Version 1.5.3beta05 [May 6, 2011]
+ Added the "_POSIX_SOURCE" feature test macro to ensure libpng sees the
+ correct API. _POSIX_SOURCE is defined in pngpriv.h, pngtest.c and
+ pngvalid.c to ensure that POSIX conformant systems disable non-POSIX APIs.
+ Removed png_snprintf and added formatted warning messages. This change adds
+ internal APIs to allow png_warning messages to have parameters without
+ requiring the host OS to implement snprintf. As a side effect the
+ dependency of the tIME-supporting RFC1132 code on stdio is removed and
+ PNG_NO_WARNINGS does actually work now.
+ Pass "" instead of '\0' to png_default_error() in png_err(). This mistake
+ was introduced in libpng-1.2.20beta01. This fixes CVE-2011-2691.
+ Added PNG_WRITE_OPTIMIZE_CMF_SUPPORTED macro to make the zlib "CMF" byte
+ optimization configureable.
+ IDAT compression failed if preceded by a compressed text chunk (bug
+ introduced in libpng-1.5.3beta01-02). This was because the attempt to
+ reset the zlib stream in png_write_IDAT happened after the first IDAT
+ chunk had been deflated - much too late. In this change internal
+ functions were added to claim/release the z_stream and, hopefully, make
+ the code more robust. Also deflateEnd checking is added - previously
+ libpng would ignore an error at the end of the stream.
+
+Version 1.5.3beta06 [May 8, 2011]
+ Removed the -D_ALL_SOURCE from definitions for AIX in CMakeLists.txt
+ Implemented premultiplied alpha support: png_set_alpha_mode API
+
+Version 1.5.3beta07 [May 11, 2011]
+ Added expand_16 support to the high level interface.
+ Added named value and 'flag' gamma support to png_set_gamma. Made a minor
+ change from the previous (unreleased) ABI/API to hide the exact value used
+ for Macs - it's not a good idea to embed this in the ABI!
+ Moved macro definitions for PNG_HAVE_IHDR, PNG_HAVE_PLTE, and PNG_AFTER_IDAT
+ from pngpriv.h to png.h because they must be visible to applications
+ that call png_set_unknown_chunks().
+ Check for up->location !PNG_AFTER_IDAT when writing unknown chunks
+ before IDAT.
+
+Version 1.5.3beta08 [May 16, 2011]
+ Improved "pngvalid --speed" to exclude more of pngvalid from the time.
+ Documented png_set_alpha_mode(), other changes in libpng.3/libpng-manual.txt
+ The cHRM chunk now sets the defaults for png_set_rgb_to_gray() (when negative
+ parameters are supplied by the caller), while in the absence of cHRM
+ sRGB/Rec 709 values are still used. This introduced a divide-by-zero
+ bug in png_handle_cHRM().
+ The bKGD chunk no longer overwrites the background value set by
+ png_set_background(), allowing the latter to be used before the file
+ header is read. It never performed any useful function to override
+ the default anyway.
+ Added memory overwrite and palette image checks to pngvalid.c
+ Previously palette image code was poorly checked. Since the transformation
+ code has a special palette path in most cases this was a severe weakness.
+ Minor cleanup and some extra checking in pngrutil.c and pngrtran.c. When
+ expanding an indexed image, always expand to RGBA if transparency is
+ present.
+
+Version 1.5.3beta09 [May 17, 2011]
+ Reversed earlier 1.5.3 change of transformation order; move png_expand_16
+ back where it was. The change doesn't work because it requires 16-bit
+ gamma tables when the code only generates 8-bit ones. This fails
+ silently; the libpng code just doesn't do any gamma correction. Moving
+ the tests back leaves the old, inaccurate, 8-bit gamma calculations, but
+ these are clearly better than none!
+
+Version 1.5.3beta10 [May 20, 2011]
+
+ png_set_background() and png_expand_16() did not work together correctly.
+ This problem is present in 1.5.2; if png_set_background is called with
+ need_expand false and the matching 16 bit color libpng erroneously just
+ treats it as an 8-bit color because of where png_do_expand_16 is in the
+ transform list. This simple fix reduces the supplied colour to 8-bits,
+ so it gets smashed, but this is better than the current behavior.
+ Added tests for expand16, more fixes for palette image tests to pngvalid.
+ Corrects the code for palette image tests and disables attempts to
+ validate palette colors.
+
+Version 1.5.3rc01 [June 3, 2011]
+ No changes.
+
+Version 1.5.3rc02 [June 8, 2011]
+ Fixed uninitialized memory read in png_format_buffer() (Bug report by
+ Frank Busse, CVE-2011-2501, related to CVE-2004-0421).
+
+Version 1.5.3beta11 [June 11, 2011]
+ Fixed png_handle_sCAL which is broken in 1.5. This fixes CVE 2011-2692.
+ Added sCAL to pngtest.png
+ Revised documentation about png_set_user_limits() to say that it also affects
+ png writing.
+ Revised handling of png_set_user_limits() so that it can increase the
+ limit beyond the PNG_USER_WIDTH|HEIGHT_MAX; previously it could only
+ reduce it.
+ Make the 16-to-8 scaling accurate. Dividing by 256 with no rounding is
+ wrong (high by one) 25% of the time. Dividing by 257 with rounding is
+ wrong in 128 out of 65536 cases. Getting the right answer all the time
+ without division is easy.
+ Added "_SUPPORTED" to the PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION macro.
+ Added projects/owatcom, an IDE project for OpenWatcom to replace
+ scripts/makefile.watcom. This project works with OpenWatcom 1.9. The
+ IDE autogenerates appropriate makefiles (libpng.mk) for batch processing.
+ The project is configurable, unlike the Visual Studio project, so long
+ as the developer has an awk.
+ Changed png_set_gAMA to limit the gamma value range so that the inverse
+ of the stored value cannot overflow the fixed point representation,
+ and changed other things OpenWatcom warns about.
+ Revised pngvalid.c to test PNG_ALPHA_MODE_SUPPORTED correctly. This allows
+ pngvalid to build when ALPHA_MODE is not supported, which is required if
+ it is to build on libpng 1.4.
+ Removed string/memory macros that are no longer used and are not
+ necessarily fully supportable, particularly png_strncpy and png_snprintf.
+ Added log option to pngvalid.c and attempted to improve gamma messages.
+
+Version 1.5.3 [omitted]
+ People found the presence of a beta release following an rc release
+ to be confusing; therefore we bump the version to libpng-1.5.4beta01
+ and there will be no libpng-1.5.3 release.
+
+Version 1.5.4beta01 [June 14, 2011]
+ Made it possible to undefine PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED
+ to get the same (inaccurate) output as libpng-1.5.2 and earlier.
+ Moved definitions of PNG_HAVE_IHDR, PNG_AFTER_IDAT, and PNG_HAVE_PLTE
+ outside of an unknown-chunk block in png.h because they are also
+ needed for other uses.
+
+Version 1.5.4beta02 [June 14, 2011]
+ Fixed and clarified LEGACY 16-to-8 scaling code.
+ Added png_set_chop_16() API, to match inaccurate results from previous
+ libpng versions.
+ Removed the ACCURATE and LEGACY options (they are no longer useable)
+ Use the old scaling method for background if png_set_chop_16() was
+ called.
+ Made png_set_chop_16() API removeable by disabling PNG_CHOP_16_TO_8_SUPPORTED
+
+Version 1.5.4beta03 [June 15, 2011]
+ Fixed a problem in png_do_expand_palette() exposed by optimization in
+ 1.5.3beta06
+ Also removed a spurious and confusing "trans" member ("trans") from png_info.
+ The palette expand optimization prevented expansion to an intermediate RGBA
+ form if tRNS was present but alpha was marked to be stripped; this exposed
+ a check for tRNS in png_do_expand_palette() which is inconsistent with the
+ code elsewhere in libpng.
+ Correction to the expand_16 code; removed extra instance of
+ png_set_scale_16_to_8 from pngpriv.h
+
+Version 1.5.4beta04 [June 16, 2011]
+ Added a missing "#ifdef PNG_READ_BACKGROUND_SUPPORTED/#endif" in pngrtran.c
+ Added PNG_TRANSFORM_CHOP_16 to the high-level read transforms.
+ Made PNG_READ_16_TO_8_ACCURATE_SCALE configurable again. If this is
+ not enabled, png_set_strip_16() and png_do_scale_16_to_8() aren't built.
+ Revised contrib/visupng, gregbook, and pngminim to demonstrate chop_16_to_8
+
+Version 1.5.4beta05 [June 16, 2011]
+ Renamed png_set_strip_16() to png_set_scale_16() and renamed
+ png_set_chop_16() to png_set_strip(16) in an attempt to minimize the
+ behavior changes between libpng14 and libpng15.
+
+Version 1.5.4beta06 [June 18, 2011]
+ Fixed new bug that was causing both strip_16 and scale_16 to be applied.
+
+Version 1.5.4beta07 [June 19, 2011]
+ Fixed pngvalid, simplified macros, added checking for 0 in sCAL.
+ The ACCURATE scale macro is no longer defined in 1.5 - call the
+ png_scale_16_to_8 API. Made sure that PNG_READ_16_TO_8 is still defined
+ if the png_strip_16_to_8 API is present. png_check_fp_number now
+ maintains some state so that positive, negative and zero values are
+ identified. sCAL uses these to be strictly spec conformant.
+
+Version 1.5.4beta08 [June 23, 2011]
+ Fixed pngvalid if ACCURATE_SCALE is defined.
+ Updated scripts/pnglibconf.h.prebuilt.
+
+Version 1.5.4rc01 [June 30, 2011]
+ Define PNG_ALLOCATED to "restrict" only if MSC_VER >= 1400.
+
+Version 1.5.4 [July 7, 2011]
+ No changes.
+
+Version 1.5.5beta01 [July 13, 2011]
+ Fixed some typos and made other minor changes in the manual.
+ Updated contrib/pngminus/makefile.std (Samuli Souminen)
+
+Version 1.5.5beta02 [July 14, 2011]
+ Revised Makefile.am and Makefile.in to look in the right directory for
+ pnglibconf.h.prebuilt
+
+Version 1.5.5beta03 [July 27, 2011]
+ Enabled compilation with g++ compiler. This compiler does not recognize
+ the file extension, so it always compiles with C++ rules. Made minor
+ changes to pngrutil.c to cast results where C++ expects it but C does not.
+ Minor editing of libpng.3 and libpng-manual.txt.
+
+Version 1.5.5beta04 [July 29, 2011]
+ Revised CMakeLists.txt (Clifford Yapp)
+ Updated commentary about the png_rgb_to_gray() default coefficients
+ in the manual and in pngrtran.c
+
+Version 1.5.5beta05 [August 17, 2011]
+ Prevent unexpected API exports from non-libpng DLLs on Windows. The "_DLL"
+ is removed from the test of whether a DLL is being built (this erroneously
+ caused the libpng APIs to be marked as DLL exports in static builds under
+ Microsoft Visual Studio). Almost all of the libpng building configuration
+ is moved from pngconf.h to pngpriv.h, but PNG_DLL_EXPORT remains in
+ pngconf.h, though, so that it is colocated with the import definition (it
+ is no longer used anywhere in the installed headers). The VStudio project
+ definitions have been cleaned up: "_USRDLL" has been removed from the
+ static library builds (this was incorrect), and PNG_USE_DLL has been added
+ to pngvalid to test the functionality (pngtest does not supply it,
+ deliberately). The spurious "_EXPORTS" has been removed from the
+ libpng build (all these errors were a result of copy/paste between project
+ configurations.)
+ Added new types and internal functions for CIE RGB end point handling to
+ pngpriv.h (functions yet to be implemented).
+
+Version 1.5.5beta06 [August 26, 2011]
+ Ensure the CMAKE_LIBRARY_OUTPUT_DIRECTORY is set in CMakeLists.txt
+ (Clifford Yap)
+ Fixes to rgb_to_gray and cHRM XYZ APIs (John Bowler):
+ The rgb_to_gray code had errors when combined with gamma correction.
+ Some pixels were treated as true grey when they weren't and such pixels
+ and true grey ones were not gamma corrected (the original value of the
+ red component was used instead). APIs to get and set cHRM using color
+ space end points have been added and the rgb_to_gray code that defaults
+ based on cHRM, and the divide-by-zero bug in png_handle_cHRM (CERT
+ VU#477046, CVE-2011-3328, introduced in 1.5.4) have been corrected.
+ A considerable number of tests has been added to pngvalid for the
+ rgb_to_gray transform.
+ Arithmetic errors in rgb_to_gray whereby the calculated gray value was
+ truncated to the bit depth rather than rounded have been fixed except in
+ the 8-bit non-gamma-corrected case (where consistency seems more important
+ than correctness.) The code still has considerable inaccuracies in the
+ 8-bit case because 8-bit linear arithmetic is used.
+
+Version 1.5.5beta07 [September 7, 2011]
+ Added "$(ARCH)" option to makefile.darwin
+ Added SunOS support to configure.ac and Makefile.am
+ Changed png_chunk_benign_error() to png_warning() in png.c, in
+ png_XYZ_from_xy_checked().
+
+Version 1.5.5beta08 [September 10, 2011]
+ Fixed 64-bit compilation errors (gcc). The errors fixed relate
+ to conditions where types that are 32 bits in the GCC 32-bit
+ world (uLong and png_size_t) become 64 bits in the 64-bit
+ world. This produces potential truncation errors which the
+ compiler correctly flags.
+ Relocated new HAVE_SOLARIS_LD definition in configure.ac
+ Constant changes for 64-bit compatibility (removal of L suffixes). The
+ 16-bit cases still use "L" as we don't have a 16-bit test system.
+
+Version 1.5.5rc01 [September 15, 2011]
+ Removed "L" suffixes in pngpriv.h
+
+Version 1.5.5 [September 22, 2011]
+ No changes.
+
+Version 1.5.6beta01 [September 22, 2011]
+ Fixed some 64-bit type conversion warnings in pngrtran.c
+ Moved row_info from png_struct to a local variable.
+ The various interlace mask arrays have been made into arrays of
+ bytes and made PNG_CONST and static (previously some arrays were
+ marked PNG_CONST and some weren't).
+ Additional checks have been added to the transform code to validate the
+ pixel depths after the transforms on both read and write.
+ Removed some redundant code from pngwrite.c, in png_destroy_write_struct().
+ Changed chunk reading/writing code to use png_uint_32 instead of png_byte[4].
+ This removes the need to allocate temporary strings for chunk names on
+ the stack in the read/write code. Unknown chunk handling still uses the
+ string form because this is exposed in the API.
+
+Version 1.5.6beta02 [September 26, 2011]
+ Added a note in the manual the png_read_update_info() must be called only
+ once with a particular info_ptr.
+ Fixed a typo in the definition of the new PNG_STRING_FROM_CHUNK(s,c) macro.
+
+Version 1.5.6beta03 [September 28, 2011]
+ Revised test-pngtest.sh to report FAIL when pngtest fails.
+ Added "--strict" option to pngtest, to report FAIL when the failure is
+ only because the resulting valid files are different.
+ Revised CMakeLists.txt to work with mingw and removed some material from
+ CMakeLists.txt that is no longer useful in libpng-1.5.
+
+Version 1.5.6beta04 [October 5, 2011]
+ Fixed typo in Makefile.in and Makefile.am ("-M Wl" should be "-M -Wl")."
+
+Version 1.5.6beta05 [October 12, 2011]
+ Speed up png_combine_row() for interlaced images. This reduces the generality
+ of the code, allowing it to be optimized for Adam7 interlace. The masks
+ passed to png_combine_row() are now generated internally, avoiding
+ some code duplication and localizing the interlace handling somewhat.
+ Align png_struct::row_buf - previously it was always unaligned, caused by
+ a bug in the code that attempted to align it; the code needs to subtract
+ one from the pointer to take account of the filter byte prepended to
+ each row.
+ Optimized png_combine_row() when rows are aligned. This gains a small
+ percentage for 16-bit and 32-bit pixels in the typical case where the
+ output row buffers are appropriately aligned. The optimization was not
+ previously possible because the png_struct buffer was always misaligned.
+ Fixed bug in png_write_chunk_header() debug print, introduced in 1.5.6beta01.
+
+Version 1.5.6beta06 [October 17, 2011]
+ Removed two redundant tests for unitialized row.
+ Fixed a relatively harmless memory overwrite in compressed text writing
+ with a 1 byte zlib buffer.
+ Add ability to call png_read_update_info multiple times to pngvalid.c.
+ Fixes for multiple calls to png_read_update_info. These fixes attend to
+ most of the errors revealed in pngvalid, however doing the gamma work
+ twice results in inaccuracies that can't be easily fixed. There is now
+ a warning in the code if this is going to happen.
+ Turned on multiple png_read_update_info in pngvalid transform tests.
+ Prevent libpng from overwriting unused bits at the end of the image when
+ it is not byte aligned, while reading. Prior to libpng-1.5.6 libpng would
+ overwrite the partial byte at the end of each row if the row width was not
+ an exact multiple of 8 bits and the image is not interlaced.
+
+Version 1.5.6beta07 [October 21, 2011]
+ Made png_ptr->prev_row an aligned pointer into png_ptr->big_prev_row
+ (Mans Rullgard).
+
+Version 1.5.6rc01 [October 26, 2011]
+ Changed misleading "Missing PLTE before cHRM" warning to "Out of place cHRM"
+
+Version 1.5.6rc02 [October 27, 2011]
+ Added LSR() macro to defend against buggy compilers that evaluate non-taken
+ code branches and complain about out-of-range shifts.
+
+Version 1.5.6rc03 [October 28, 2011]
+ Renamed the LSR() macro to PNG_LSR() and added PNG_LSL() macro.
+ Fixed compiler warnings with Intel and MSYS compilers. The logical shift
+ fix for Microsoft Visual C is required by other compilers, so this
+ enables that fix for all compilers when using compile-time constants.
+ Under MSYS 'byte' is a name declared in a system header file, so we
+ changed the name of a local variable to avoid the warnings that result.
+ Added #define PNG_ALIGN_TYPE PNG_ALIGN_NONE to contrib/pngminim/*/pngusr.h
+
+Version 1.5.6 [November 3, 2011]
+ No changes.
+
+Version 1.5.7beta01 [November 4, 2011]
+ Added support for ARM processor (Mans Rullgard)
+ Fixed bug in pngvalid on early allocation failure; fixed type cast in
+ pngmem.c; pngvalid would attempt to call png_error() if the allocation
+ of a png_struct or png_info failed. This would probably have led to a
+ crash. The pngmem.c implementation of png_malloc() included a cast
+ to png_size_t which would fail on large allocations on 16-bit systems.
+ Fix for the preprocessor of the Intel C compiler. The preprocessor
+ splits adjacent @ signs with a space; this changes the concatentation
+ token from @-@-@ to PNG_JOIN; that should work with all compiler
+ preprocessors.
+ Paeth filter speed improvements from work by Siarhei Siamashka. This
+ changes the 'Paeth' reconstruction function to improve the GCC code
+ generation on x86. The changes are only part of the suggested ones;
+ just the changes that definitely improve speed and remain simple.
+ The changes also slightly increase the clarity of the code.
+
+Version 1.5.7beta02 [November 11, 2011]
+ Check compression_type parameter in png_get_iCCP and remove spurious
+ casts. The compression_type parameter is always assigned to, so must
+ be non-NULL. The cast of the profile length potentially truncated the
+ value unnecessarily on a 16-bit int system, so the cast of the (byte)
+ compression type to (int) is specified by ANSI-C anyway.
+ Fixed FP division by zero in pngvalid.c; the 'test_pixel' code left
+ the sBIT fields in the test pixel as 0, which resulted in a floating
+ point division by zero which was irrelevant but causes systems where
+ FP exceptions cause a crash. Added code to pngvalid to turn on FP
+ exceptions if the appropriate glibc support is there to ensure this is
+ tested in the future.
+ Updated scripts/pnglibconf.mak and scripts/makefile.std to handle the
+ new PNG_JOIN macro.
+ Added versioning to pnglibconf.h comments.
+ Simplified read/write API initial version; basic read/write tested on
+ a variety of images, limited documentation (in the header file.)
+ Installed more accurate linear to sRGB conversion tables. The slightly
+ modified tables reduce the number of 16-bit values that
+ convert to an off-by-one 8-bit value. The "makesRGB.c" code that was used
+ to generate the tables is now in a contrib/sRGBtables sub-directory.
+
+Version 1.5.7beta03 [November 17, 2011]
+ Removed PNG_CONST from the sRGB table declarations in pngpriv.h and png.c
+ Added run-time detection of NEON support.
+ Added contrib/libtests; includes simplified API test and timing test and
+ a color conversion utility for rapid checking of failed 'pngstest' results.
+ Multiple transform bug fixes plus a work-round for double gamma correction.
+ libpng does not support more than one transform that requires linear data
+ at once - if this is tried typically the results is double gamma
+ correction. Since the simplified APIs can need rgb to gray combined with
+ a compose operation it is necessary to do one of these outside the main
+ libpng transform code. This check-in also contains fixes to various bugs
+ in the simplified APIs themselves and to some bugs in compose and rgb to
+ gray (on palette) itself.
+ Fixes for C++ compilation using g++ When libpng source is compiled
+ using g++. The compiler imposes C++ rules on the C source; thus it
+ is desireable to make the source work with either C or C++ rules
+ without throwing away useful error information. This change adds
+ png_voidcast to allow C semantic (void*) cases or the corresponding
+ C++ static_cast operation, as appropriate.
+ Added --noexecstack to assembler file compilation. GCC does not set
+ this on assembler compilation, even though it does on C compilation.
+ This creates security issues if assembler code is enabled; the
+ work-around is to set it by default in the flags for $(CCAS)
+ Work around compilers that don't support declaration of const data. Some
+ compilers fault 'extern const' data declarations (because the data is
+ not initialized); this turns on const-ness only for compilers where
+ this is known to work.
+
+Version 1.5.7beta04 [November 17, 2011]
+ Since the gcc driver does not recognize the --noexecstack flag, we must
+ use the -Wa prefix to have it passed through to the assembler.
+ Also removed a duplicate setting of this flag.
+ Added files that were omitted from the libpng-1.5.7beta03 zip distribution.
+
+Version 1.5.7beta05 [November 25, 2011]
+ Removed "zTXt" from warning in generic chunk decompression function.
+ Validate time settings passed to pngset() and png_convert_to_rfc1123()
+ (Frank Busse).
+ Added MINGW support to CMakeLists.txt
+ Reject invalid compression flag or method when reading the iTXt chunk.
+ Backed out 'simplified' API changes. The API seems too complex and there
+ is a lack of consensus or enthusiasm for the proposals. The API also
+ reveals significant bugs inside libpng (double gamma correction and the
+ known bug of being unable to retrieve a corrected palette). It seems
+ better to wait until the bugs, at least, are corrected.
+ Moved pngvalid.c into contrib/libtests
+ Rebuilt Makefile.in, configure, etc., with autoconf-2.68
+
+Version 1.5.7rc01 [December 1, 2011]
+ Replaced an "#if" with "#ifdef" in pngrtran.c
+ Revised #if PNG_DO_BC block in png.c (use #ifdef and add #else)
+
+Version 1.5.7rc02 [December 5, 2011]
+ Revised project files and contrib/pngvalid/pngvalid.c to account for
+ the relocation of pngvalid into contrib/libtests.
+ Revised pngconf.h to use " __declspec(restrict)" only when MSC_VER >= 1400,
+ as in libpng-1.5.4.
+ Put CRLF line endings in the owatcom project files.
+
+Version 1.5.7rc03 [December 7, 2011]
+ Updated CMakeLists.txt to account for the relocation of pngvalid.c
+
+Version 1.5.7 [December 15, 2011]
+ Minor fixes to pngvalid.c for gcc 4.6.2 compatibility to remove warnings
+ reported by earlier versions.
+
+Version 1.5.8beta01 [January 15, 2011]
+ Removed '#include config.h"' from contrib/libtests/pngvalid.c. It's not
+ needed and causes trouble for VPATH building.
+ Moved AC_MSG_CHECKING([if libraries can be versioned]) later to the proper
+ location in configure.ac (Gilles Espinasse).
+ Fix bug in pngerror.c: some long warnings were being improperly truncated
+ (CVE-2011-3464, bug introduced in libpng-1.5.3beta05).
+
+Version 1.5.8rc01 [January 21, 2012]
+ No changes.
+
+Version 1.5.8rc02 [January 25, 2012]
+ Fixed Min/GW uninstall to remove libpng.dll.a
+ Conditionalize the install rules for MINGW and CYGWIN in CMakeLists.txt
+
+Version 1.5.8 [February 1, 2012]
+ No changes.
+
+Version 1.5.9beta01 [February 3, 2012]
+ Rebuilt configure scripts in the tar distributions.
+
+Version 1.5.9beta02 [February 16, 2012]
+ Removed two unused definitions from scripts/pnglibconf.h.prebuilt
+ Removed some unused arrays (with #ifdef) from png_read_push_finish_row().
+ Removed tests for no-longer-used *_EMPTY_PLTE_SUPPORTED from pngstruct.h
+
+Version 1.5.9rc01 [February 17, 2012]
+ Fixed CVE-2011-3026 buffer overrun bug. This bug was introduced when
+ iCCP chunk support was added at libpng-1.0.6. Deal more correctly with the
+ test on iCCP chunk length. Also removed spurious casts that may hide
+ problems on 16-bit systems.
+
+Version 1.5.9 [February 18, 2012]
+ No changes.
+
+Version 1.5.10beta01 [February 24, 2012]
+ Removed two useless #ifdef directives from pngread.c and one from pngrutil.c
+ Always put the CMAKE_LIBRARY in "lib" (removed special WIN32 case).
+ Removed empty vstudio/pngstest directory (Clifford Yapp).
+ Eliminated redundant png_push_read_tEXt|zTXt|iTXt|unknown code from
+ pngpread.c and use the sequential png_handle_tEXt, etc., in pngrutil.c;
+ now that png_ptr->buffer is inaccessible to applications, the special
+ handling is no longer useful.
+ Fixed bug with png_handle_hIST with odd chunk length (Frank Busse).
+ Added PNG_SAFE_LIMITS feature to pnglibconf.dfa and code in pngconf.h
+ to reset the user limits to safe ones if PNG_SAFE_LIMITS is defined.
+ To enable, use "CPPFLAGS=-DPNG_SAFE_LIMITS_SUPPORTED" on the configure
+ command or put "#define PNG_SAFE_LIMITS_SUPPORTED" in pnglibconf.h.
+ Revised the SAFE_LIMITS feature to be the same as the feature in libpng16.
+ Added information about the new limits in the manual.
+
+Version 1.5.10beta02 [February 27, 2012]
+ Updated Makefile.in
+
+Version 1.5.10beta03 [March 6, 2012]
+ Removed unused "current_text" members of png_struct and the png_free()
+ of png_ptr->current_text from pngread.c
+ Added palette-index checking. Issue a png_warning() if an invalid index is
+ found.
+
+Version 1.5.10beta04 [March 10, 2012]
+ Fixed PNG_LIBPNG_BUILD_BASE_TYPE definition.
+ Fixed CMF optimization of non-IDAT compressed chunks, which was added at
+ libpng-1.5.4. It sometimes produced too small of a window.
+
+Version 1.5.10beta05 [March 10, 2012]
+ Reject all iCCP chunks after the first, even if the first one is invalid.
+ Issue a png_benign_error() instead of png_warning() about bad palette index.
+ Fixed an off-by-one error in the palette index checking function.
+ Revised example.c to put text strings in a temporary character array
+ instead of directly assigning string constants to png_textp members.
+ This avoids compiler warnings when -Wwrite-strings is enabled.
+
+Version 1.5.10 [March 29, 2012]
+ Prevent PNG_EXPAND+PNG_SHIFT doing the shift twice.
+ Revised png_set_text_2() to avoid potential memory corruption (fixes
+ CVE-2011-3048).
+
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
(subscription required; visit
https://lists.sourceforge.net/lists/listinfo/png-mng-implement
@@ -3249,5 +3861,4 @@ to subscribe)
or to glennrp at users.sourceforge.net
Glenn R-P
-*/ }
#endif
diff --git a/src/3rdparty/libpng/CMakeLists.txt b/src/3rdparty/libpng/CMakeLists.txt
deleted file mode 100644
index 2ee5bf3384..0000000000
--- a/src/3rdparty/libpng/CMakeLists.txt
+++ /dev/null
@@ -1,406 +0,0 @@
-cmake_minimum_required(VERSION 2.4.4)
-set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
-
-if(UNIX AND NOT DEFINED CMAKE_BUILD_TYPE)
- if(CMAKE_MAJOR_VERSION EQUAL 2 AND CMAKE_MINOR_VERSION EQUAL 4)
- # workaround CMake 2.4.x bug
- set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING
- "Choose the type of build, options are:
- None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used)
- Debug
- Release
- RelWithDebInfo
- MinSizeRel.")
- else()
- set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING
- "Choose the type of build, options are:
- None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used)
- Debug
- Release
- RelWithDebInfo
- MinSizeRel.")
- endif()
-endif()
-
-project(libpng C)
-enable_testing()
-
-# Copyright (C) 2007-2011 Glenn Randers-Pehrson
-
-# This code is released under the libpng license.
-# For conditions of distribution and use, see the disclaimer
-# and license in png.h
-
-set(PNGLIB_MAJOR 1)
-set(PNGLIB_MINOR 5)
-set(PNGLIB_RELEASE 1)
-set(PNGLIB_NAME libpng${PNGLIB_MAJOR}${PNGLIB_MINOR})
-set(PNGLIB_VERSION ${PNGLIB_MAJOR}.${PNGLIB_MINOR}.${PNGLIB_RELEASE})
-
-# needed packages
-find_package(ZLIB REQUIRED)
-include_directories(${ZLIB_INCLUDE_DIR})
-
-if(NOT WIN32)
- find_library(M_LIBRARY
- NAMES m
- PATHS /usr/lib /usr/local/lib
- )
- if(NOT M_LIBRARY)
- message(STATUS
- "math library 'libm' not found - floating point support disabled")
- endif()
-else()
- # not needed on windows
- set(M_LIBRARY "")
-endif()
-
-# COMMAND LINE OPTIONS
-if(DEFINED PNG_SHARED)
- option(PNG_SHARED "Build shared lib" ${PNG_SHARED})
-else()
- option(PNG_SHARED "Build shared lib" ON)
-endif()
-if(DEFINED PNG_STATIC)
- option(PNG_STATIC "Build static lib" ${PNG_STATIC})
-else()
- option(PNG_STATIC "Build static lib" ON)
-endif()
-
-if(MINGW)
- option(PNG_TESTS "Build pngtest" NO)
-else()
- option(PNG_TESTS "Build pngtest" YES)
-endif()
-
-option(PNG_NO_CONSOLE_IO "FIXME" YES)
-option(PNG_NO_STDIO "FIXME" YES)
-option(PNG_DEBUG "Build with debug output" NO)
-option(PNGARG "FIXME" YES)
-#TODO:
-# PNG_CONSOLE_IO_SUPPORTED
-
-# maybe needs improving, but currently I don't know when we can enable what :)
-set(png_asm_tmp "OFF")
-if(NOT WIN32)
- find_program(uname_executable NAMES uname PATHS /bin /usr/bin /usr/local/bin)
- if(uname_executable)
- exec_program(${uname_executable}
- ARGS --machine OUTPUT_VARIABLE uname_output)
- if("uname_output" MATCHES "^.*i[1-9]86.*$")
- set(png_asm_tmp "ON")
- else("uname_output" MATCHES "^.*i[1-9]86.*$")
- set(png_asm_tmp "OFF")
- endif("uname_output" MATCHES "^.*i[1-9]86.*$")
- endif(uname_executable)
-else()
- # this env var is normally only set on win64
- set(TEXT "ProgramFiles(x86)")
- if("$ENV{${TEXT}}" STREQUAL "")
- set(png_asm_tmp "ON")
- endif("$ENV{${TEXT}}" STREQUAL "")
-endif()
-
-# SET LIBNAME
-set(PNG_LIB_NAME png${PNGLIB_MAJOR}${PNGLIB_MINOR})
-
-# to distinguish between debug and release lib
-set(CMAKE_DEBUG_POSTFIX "d")
-
-# Use the prebuilt pnglibconf.h file from the scripts folder
-configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt
- ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h)
-include_directories(${CMAKE_CURRENT_BINARY_DIR})
-
-# OUR SOURCES
-set(libpng_public_hdrs
- png.h
- pngconf.h
- ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h
-)
-set(libpng_sources
- ${libpng_public_hdrs}
- pngdebug.h
- pnginfo.h
- pngpriv.h
- pngstruct.h
- png.c
- pngerror.c
- pngget.c
- pngmem.c
- pngpread.c
- pngread.c
- pngrio.c
- pngrtran.c
- pngrutil.c
- pngset.c
- pngtrans.c
- pngwio.c
- pngwrite.c
- pngwtran.c
- pngwutil.c
-)
-set(pngtest_sources
- pngtest.c
-)
-# SOME NEEDED DEFINITIONS
-
-add_definitions(-DPNG_CONFIGURE_LIBPNG)
-
-if(_AIX)
- add_definitions(-D_ALL_SOURCE)
-endif(_AIX)
-
-if(MSVC)
- add_definitions(-DPNG_NO_MODULEDEF -D_CRT_SECURE_NO_DEPRECATE)
-endif(MSVC)
-
-if(PNG_SHARED OR NOT MSVC)
- #if building msvc static this has NOT to be defined
- add_definitions(-DZLIB_DLL)
-endif()
-
-
-if(PNG_CONSOLE_IO_SUPPORTED)
- add_definitions(-DPNG_CONSOLE_IO_SUPPORTED)
-endif()
-
-if(PNG_NO_CONSOLE_IO)
- add_definitions(-DPNG_NO_CONSOLE_IO)
-endif()
-
-if(PNG_NO_STDIO)
- add_definitions(-DPNG_NO_STDIO)
-endif()
-
-if(PNG_DEBUG)
- add_definitions(-DPNG_DEBUG)
-endif()
-
-if(NOT M_LIBRARY AND NOT WIN32)
- add_definitions(-DPNG_NO_FLOATING_POINT_SUPPORTED)
-endif()
-
-# NOW BUILD OUR TARGET
-include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${ZLIB_INCLUDE_DIR})
-
-if(PNG_SHARED)
- add_library(${PNG_LIB_NAME} SHARED ${libpng_sources})
- if(MSVC)
- # msvc does not append 'lib' - do it here to have consistent name
- set_target_properties(${PNG_LIB_NAME} PROPERTIES PREFIX "lib")
- set_target_properties(${PNG_LIB_NAME} PROPERTIES IMPORT_PREFIX "lib")
- endif()
- target_link_libraries(${PNG_LIB_NAME} ${ZLIB_LIBRARY} ${M_LIBRARY})
-endif()
-
-if(PNG_STATIC)
-# does not work without changing name
- set(PNG_LIB_NAME_STATIC ${PNG_LIB_NAME}_static)
- add_library(${PNG_LIB_NAME_STATIC} STATIC ${libpng_sources})
- if(MSVC)
- # msvc does not append 'lib' - do it here to have consistent name
- set_target_properties(${PNG_LIB_NAME_STATIC} PROPERTIES PREFIX "lib")
- endif()
- target_link_libraries(${PNG_LIB_NAME_STATIC} ${ZLIB_LIBRARY} ${M_LIBRARY})
-endif()
-
-
-if(PNG_SHARED AND WIN32)
- set_target_properties(${PNG_LIB_NAME} PROPERTIES DEFINE_SYMBOL PNG_BUILD_DLL)
-endif()
-
-if(PNG_TESTS AND PNG_SHARED)
- # does not work with msvc due to png_lib_ver issue
- add_executable(pngtest ${pngtest_sources})
- target_link_libraries(pngtest ${PNG_LIB_NAME})
- add_test(pngtest ./pngtest ${CMAKE_CURRENT_SOURCE_DIR}/pngtest.png)
-endif()
-
-#
-# Set a variable with CMake code which:
-# Creates a symlink from src to dest (if possible) or alternatively
-# copies if different.
-macro(_png_generate_symlink_code CODE SRC DEST)
- if(WIN32 AND NOT CYGWIN)
- set(_png_gsc_message "Copying ${SRC} to ${DEST} if needed")
- set(_png_gsc_operation "copy_if_different")
- else()
- set(_png_gsc_message "Symlinking ${SRC} to ${DEST}")
- set(_png_gsc_operation "create_symlink")
- endif()
-
- set(${CODE} "
- message(STATUS \"${_png_gsc_message}\")
- execute_process(COMMAND \${CMAKE_COMMAND} -E ${_png_gsc_operation}
- \"${SRC}\" \"${DEST}\")
- ")
-endmacro()
-
-# CREATE PKGCONFIG FILES
-# we use the same files like ./configure, so we have to set its vars
-if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
- set(CMAKE_INSTALL_LIBDIR lib)
-endif(NOT DEFINED CMAKE_INSTALL_LIBDIR)
-set(prefix ${CMAKE_INSTALL_PREFIX})
-set(exec_prefix ${CMAKE_INSTALL_PREFIX})
-set(libdir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
-set(includedir ${CMAKE_INSTALL_PREFIX}/include)
-set(LIBS "-lz -lm")
-configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng.pc.in
- ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc @ONLY)
-_png_generate_symlink_code(PNG_PC_INSTALL_CODE
- ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc
- ${CMAKE_CURRENT_BINARY_DIR}/libpng.pc)
-install(CODE ${PNG_PC_INSTALL_CODE})
-
-configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng-config.in
- ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config @ONLY)
-_png_generate_symlink_code(PNG_CONFIG_INSTALL_CODE
- ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
- ${CMAKE_CURRENT_BINARY_DIR}/libpng-config)
-install(CODE ${PNG_CONFIG_INSTALL_CODE})
-
-# SET UP LINKS
-if(PNG_SHARED)
- set_target_properties(${PNG_LIB_NAME} PROPERTIES
-# VERSION 15.${PNGLIB_RELEASE}.1.5.1
- VERSION 15.${PNGLIB_RELEASE}.0
- SOVERSION 15
- CLEAN_DIRECT_OUTPUT 1)
-endif()
-if(PNG_STATIC)
- # MSVC doesn't use a different file extension for shared vs. static
- # libs. We are able to change OUTPUT_NAME to remove the _static
- # for all other platforms.
- if(NOT MSVC)
- set_target_properties(${PNG_LIB_NAME_STATIC} PROPERTIES
- OUTPUT_NAME ${PNG_LIB_NAME}
- CLEAN_DIRECT_OUTPUT 1)
- endif()
-endif()
-
-# If CMake > 2.4.x, we set a variable used below to export
-# targets to an export file.
-# TODO: Use VERSION_GREATER after our cmake_minimum_required >= 2.6.2
-if(CMAKE_MAJOR_VERSION GREATER 1 AND CMAKE_MINOR_VERSION GREATER 4)
- set(PNG_EXPORT_RULE EXPORT libpng)
-elseif(CMAKE_MAJOR_VERSION GREATER 2) # future proof
- set(PNG_EXPORT_RULE EXPORT libpng)
-endif()
-
-# INSTALL
-if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
- if(PNG_SHARED)
- install(TARGETS ${PNG_LIB_NAME}
- ${PNG_EXPORT_RULE}
- RUNTIME DESTINATION bin
- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
- ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
-
- # Create a symlink for libpng.dll.a => libpng15.dll.a on Cygwin
- if(CYGWIN)
- _png_generate_symlink_code(PNG_SHARED_IMPLIB_INSTALL_CODE
- ${PNGLIB_NAME}${CMAKE_IMPORT_LIBRARY_SUFFIX}
- libpng${CMAKE_IMPORT_LIBRARY_SUFFIX})
- install(CODE ${PNG_SHARED_IMPLIB_INSTALL_CODE})
- install(FILES
- ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_IMPORT_LIBRARY_SUFFIX}
- DESTINATION ${CMAKE_INSTALL_LIBDIR})
- endif()
-
- if(NOT WIN32)
- IF(CMAKE_LIBRARY_OUTPUT_DIRECTORY)
- _png_generate_symlink_code(PNG_SHARED_INSTALL_CODE
- ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${PNGLIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}
- ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libpng${CMAKE_SHARED_LIBRARY_SUFFIX})
- install(CODE ${PNG_SHARED_INSTALL_CODE})
- install(FILES
- ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libpng${CMAKE_SHARED_LIBRARY_SUFFIX}
- DESTINATION ${CMAKE_INSTALL_LIBDIR})
- ELSE(CMAKE_LIBRARY_OUTPUT_DIRECTORY)
- _png_generate_symlink_code(PNG_SHARED_INSTALL_CODE
- ${PNGLIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}
- libpng${CMAKE_SHARED_LIBRARY_SUFFIX})
- install(CODE ${PNG_SHARED_INSTALL_CODE})
- install(FILES
- ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_SHARED_LIBRARY_SUFFIX}
- DESTINATION ${CMAKE_INSTALL_LIBDIR})
- ENDIF(CMAKE_LIBRARY_OUTPUT_DIRECTORY)
- endif()
- endif()
-
- if(PNG_STATIC)
- install(TARGETS ${PNG_LIB_NAME_STATIC}
- ${PNG_EXPORT_RULE}
- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
- ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
- if(NOT WIN32 OR CYGWIN)
- IF(CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
- _png_generate_symlink_code(PNG_STATIC_INSTALL_CODE
-${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/${PNGLIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX}
- ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/libpng${CMAKE_STATIC_LIBRARY_SUFFIX})
- install(CODE ${PNG_STATIC_INSTALL_CODE})
- install(FILES
- ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/libpng${CMAKE_STATIC_LIBRARY_SUFFIX}
- DESTINATION ${CMAKE_INSTALL_LIBDIR})
- ELSE(CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
- _png_generate_symlink_code(PNG_STATIC_INSTALL_CODE
- ${PNGLIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX}
- libpng${CMAKE_STATIC_LIBRARY_SUFFIX})
- install(CODE ${PNG_STATIC_INSTALL_CODE})
- install(FILES
- ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_STATIC_LIBRARY_SUFFIX}
- DESTINATION ${CMAKE_INSTALL_LIBDIR})
- ENDIF(CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
- endif()
- endif()
-endif()
-
-if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL )
- install(FILES ${libpng_public_hdrs} DESTINATION include)
- install(FILES ${libpng_public_hdrs} DESTINATION include/${PNGLIB_NAME})
-endif()
-if(NOT SKIP_INSTALL_EXECUTABLES AND NOT SKIP_INSTALL_ALL )
- install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config DESTINATION bin)
- install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
- DESTINATION bin)
-endif()
-if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
- # Install man pages
- if(NOT PNG_MAN_DIR)
- set(PNG_MAN_DIR "share/man")
- endif()
- install(FILES libpng.3 libpngpf.3 DESTINATION ${PNG_MAN_DIR}/man3)
- install(FILES png.5 DESTINATION ${PNG_MAN_DIR}/man5)
- # Install pkg-config files
- install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng.pc
- DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
- install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config
- DESTINATION bin)
- install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc
- DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
- install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
- DESTINATION bin)
-endif()
-
-# On versions of CMake that support it, create an export file CMake
-# users can include() to import our targets
-if(PNG_EXPORT_RULE AND NOT SKIP_INSTALL_EXPORT AND NOT SKIP_INSTALL_ALL )
- install(EXPORT libpng DESTINATION lib/libpng FILE lib${PNG_LIB_NAME}.cmake)
-endif()
-
-# what's with libpng-$VER%.txt and all the extra files?
-
-
-# UNINSTALL
-# do we need this?
-
-
-# DIST
-# do we need this?
-
-# to create msvc import lib for mingw compiled shared lib
-# pexports libpng.dll > libpng.def
-# lib /def:libpng.def /machine:x86
-
diff --git a/src/3rdparty/libpng/INSTALL b/src/3rdparty/libpng/INSTALL
index 353bfff326..e6979c6fb0 100644
--- a/src/3rdparty/libpng/INSTALL
+++ b/src/3rdparty/libpng/INSTALL
@@ -133,3 +133,23 @@ run "make install".
Further information can be found in the README and libpng-manual.txt
files, in the individual makefiles, in png.h, and the manual pages
libpng.3 and png.5.
+
+Using the ./configure script -- 16 December 2002.
+=================================================
+
+The ./configure script should work compatibly with what scripts/makefile.*
+did, however there are some options you might need to add to configure
+explicitly, which previously was done semi-automatically (if you didn't edit
+scripts/makefile.* yourself, that is)
+
+CFLAGS="-Wall -O -funroll-loops \
+-malign-loops=2 -malign-functions=2" ./configure --prefix=/usr/include \
+--with-pkgconfigdir=/usr/lib/pkgconfig --includedir=/usr/include
+
+You can alternatively specify --includedir=/usr/include, /usr/local/include,
+/usr/include/libpng%NN%, or whatever.
+
+If you find that the configure script is out-of-date or is not supporting
+your platform properly, try running autogen.sh to regenerate "configure",
+"Makefile.in", and the other configuration files. Then try configure again.
+
diff --git a/src/3rdparty/libpng/LICENSE b/src/3rdparty/libpng/LICENSE
index b28f15c74f..b72d1258e3 100644
--- a/src/3rdparty/libpng/LICENSE
+++ b/src/3rdparty/libpng/LICENSE
@@ -10,7 +10,7 @@ this sentence.
This code is released under the libpng license.
-libpng versions 1.2.6, August 15, 2004, through 1.5.1, February 3, 2011, are
+libpng versions 1.2.6, August 15, 2004, through 1.5.10, March 29, 2012, are
Copyright (c) 2004, 2006-2011 Glenn Randers-Pehrson, and are
distributed according to the same disclaimer and license as libpng-1.2.5
with the following individual added to the list of Contributing Authors
@@ -108,4 +108,4 @@ certification mark of the Open Source Initiative.
Glenn Randers-Pehrson
glennrp at users.sourceforge.net
-February 3, 2011
+March 29, 2012
diff --git a/src/3rdparty/libpng/README b/src/3rdparty/libpng/README
index 9dd6745f0a..e821ee4c87 100644
--- a/src/3rdparty/libpng/README
+++ b/src/3rdparty/libpng/README
@@ -1,4 +1,4 @@
-README for libpng version 1.5.1 - February 3, 2011 (shared library 15.0)
+README for libpng version 1.5.10 - March 29, 2012 (shared library 15.0)
See the note about version numbers near the top of png.h
See INSTALL for instructions on how to install libpng.
@@ -114,19 +114,16 @@ given in previous versions of this document. He and Andreas will
read mail addressed to the png-implement list, however.
Please do not send general questions about PNG. Send them to
-the (png-list at ccrc.wustl.edu, subscription required, write to
-majordomo at ccrc.wustl.edu with "subscribe png-list" in your message).
-On the other hand,
-please do not send libpng questions to that address, send them to me
-or to the png-implement list. I'll
-get them in the end anyway. If you have a question about something
+png-mng-misc at lists.sf.net (subscription required; visit
+https://lists.sourceforge.net/lists/listinfo/png-mng-misc to
+subscribe). If you have a question about something
in the PNG specification that is related to using libpng, send it
to me. Send me any questions that start with "I was using libpng,
and ...". If in doubt, send questions to me. I'll bounce them
to others, if necessary.
Please do not send suggestions on how to change PNG. We have
-been discussing PNG for nine years now, and it is official and
+been discussing PNG for sixteen years now, and it is official and
finished. If you have suggestions for libpng, however, I'll
gladly listen. Even if your suggestion is not used immediately,
it may be used later.
diff --git a/src/3rdparty/libpng/TODO b/src/3rdparty/libpng/TODO
deleted file mode 100644
index 6e1f028bd7..0000000000
--- a/src/3rdparty/libpng/TODO
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
-TODO - list of things to do for libpng:
-
-Final bug fixes.
-Better C++ wrapper/full C++ implementation?
-Fix problem with C++ and EXTERN "C".
-cHRM transformation.
-Remove setjmp/longjmp usage in favor of returning error codes.
-Add "grayscale->palette" transformation and "palette->grayscale" detection.
-Improved dithering.
-Multi-lingual error and warning message support.
-Complete sRGB transformation (presently it simply uses gamma=0.45455).
-Man pages for function calls.
-Better documentation.
-Better filter selection
- (counting huffman bits/precompression? filter inertia? filter costs?).
-Histogram creation.
-Text conversion between different code pages (Latin-1 -> Mac and DOS).
-Avoid building gamma tables whenever possible.
-Use greater precision when changing to linear gamma for compositing against
- background and doing rgb-to-gray transformation.
-Investigate pre-incremented loop counters and other loop constructions.
-Add interpolated method of handling interlacing.
-Switch to the simpler zlib (zlib/libpng) license if legally possible.
-Extend pngvalid.c to validate more of the libpng transformations.
-
-*/
diff --git a/src/3rdparty/libpng/config.guess b/src/3rdparty/libpng/config.guess
deleted file mode 100644
index dc84c68ef7..0000000000
--- a/src/3rdparty/libpng/config.guess
+++ /dev/null
@@ -1,1501 +0,0 @@
-#! /bin/sh
-# Attempt to guess a canonical system name.
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-# Free Software Foundation, Inc.
-
-timestamp='2009-11-20'
-
-# This file is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Originally written by Per Bothner. Please send patches (context
-# diff format) to <config-patches@gnu.org> and include a ChangeLog
-# entry.
-#
-# This script attempts to guess a canonical system name similar to
-# config.sub. If it succeeds, it prints the system name on stdout, and
-# exits with 0. Otherwise, it exits with 1.
-#
-# You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION]
-
-Output the configuration name of the system \`$me' is run on.
-
-Operation modes:
- -h, --help print this help, then exit
- -t, --time-stamp print date of last modification, then exit
- -v, --version print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.guess ($timestamp)
-
-Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions. There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
- case $1 in
- --time-stamp | --time* | -t )
- echo "$timestamp" ; exit ;;
- --version | -v )
- echo "$version" ; exit ;;
- --help | --h* | -h )
- echo "$usage"; exit ;;
- -- ) # Stop option processing
- shift; break ;;
- - ) # Use stdin as input.
- break ;;
- -* )
- echo "$me: invalid option $1$help" >&2
- exit 1 ;;
- * )
- break ;;
- esac
-done
-
-if test $# != 0; then
- echo "$me: too many arguments$help" >&2
- exit 1
-fi
-
-trap 'exit 1' 1 2 15
-
-# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
-# compiler to aid in system detection is discouraged as it requires
-# temporary files to be created and, as you can see below, it is a
-# headache to deal with in a portable fashion.
-
-# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-# use `HOST_CC' if defined, but it is deprecated.
-
-# Portable tmp directory creation inspired by the Autoconf team.
-
-set_cc_for_build='
-trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
-trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
-: ${TMPDIR=/tmp} ;
- { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
-dummy=$tmp/dummy ;
-tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
-case $CC_FOR_BUILD,$HOST_CC,$CC in
- ,,) echo "int x;" > $dummy.c ;
- for c in cc gcc c89 c99 ; do
- if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
- CC_FOR_BUILD="$c"; break ;
- fi ;
- done ;
- if test x"$CC_FOR_BUILD" = x ; then
- CC_FOR_BUILD=no_compiler_found ;
- fi
- ;;
- ,,*) CC_FOR_BUILD=$CC ;;
- ,*,*) CC_FOR_BUILD=$HOST_CC ;;
-esac ; set_cc_for_build= ;'
-
-# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi@noc.rutgers.edu 1994-08-24)
-if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
- PATH=$PATH:/.attbin ; export PATH
-fi
-
-UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
-UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
-UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
-
-# Note: order is significant - the case branches are not exclusive.
-
-case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
- *:NetBSD:*:*)
- # NetBSD (nbsd) targets should (where applicable) match one or
- # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
- # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
- # switched to ELF, *-*-netbsd* would select the old
- # object file format. This provides both forward
- # compatibility and a consistent mechanism for selecting the
- # object file format.
- #
- # Note: NetBSD doesn't particularly care about the vendor
- # portion of the name. We always set it to "unknown".
- sysctl="sysctl -n hw.machine_arch"
- UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
- /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
- case "${UNAME_MACHINE_ARCH}" in
- armeb) machine=armeb-unknown ;;
- arm*) machine=arm-unknown ;;
- sh3el) machine=shl-unknown ;;
- sh3eb) machine=sh-unknown ;;
- sh5el) machine=sh5le-unknown ;;
- *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
- esac
- # The Operating System including object format, if it has switched
- # to ELF recently, or will in the future.
- case "${UNAME_MACHINE_ARCH}" in
- arm*|i386|m68k|ns32k|sh3*|sparc|vax)
- eval $set_cc_for_build
- if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
- | grep -q __ELF__
- then
- # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
- # Return netbsd for either. FIX?
- os=netbsd
- else
- os=netbsdelf
- fi
- ;;
- *)
- os=netbsd
- ;;
- esac
- # The OS release
- # Debian GNU/NetBSD machines have a different userland, and
- # thus, need a distinct triplet. However, they do not need
- # kernel version information, so it can be replaced with a
- # suitable tag, in the style of linux-gnu.
- case "${UNAME_VERSION}" in
- Debian*)
- release='-gnu'
- ;;
- *)
- release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
- ;;
- esac
- # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
- # contains redundant information, the shorter form:
- # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
- echo "${machine}-${os}${release}"
- exit ;;
- *:OpenBSD:*:*)
- UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
- echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
- exit ;;
- *:ekkoBSD:*:*)
- echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
- exit ;;
- *:SolidBSD:*:*)
- echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
- exit ;;
- macppc:MirBSD:*:*)
- echo powerpc-unknown-mirbsd${UNAME_RELEASE}
- exit ;;
- *:MirBSD:*:*)
- echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
- exit ;;
- alpha:OSF1:*:*)
- case $UNAME_RELEASE in
- *4.0)
- UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
- ;;
- *5.*)
- UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
- ;;
- esac
- # According to Compaq, /usr/sbin/psrinfo has been available on
- # OSF/1 and Tru64 systems produced since 1995. I hope that
- # covers most systems running today. This code pipes the CPU
- # types through head -n 1, so we only detect the type of CPU 0.
- ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
- case "$ALPHA_CPU_TYPE" in
- "EV4 (21064)")
- UNAME_MACHINE="alpha" ;;
- "EV4.5 (21064)")
- UNAME_MACHINE="alpha" ;;
- "LCA4 (21066/21068)")
- UNAME_MACHINE="alpha" ;;
- "EV5 (21164)")
- UNAME_MACHINE="alphaev5" ;;
- "EV5.6 (21164A)")
- UNAME_MACHINE="alphaev56" ;;
- "EV5.6 (21164PC)")
- UNAME_MACHINE="alphapca56" ;;
- "EV5.7 (21164PC)")
- UNAME_MACHINE="alphapca57" ;;
- "EV6 (21264)")
- UNAME_MACHINE="alphaev6" ;;
- "EV6.7 (21264A)")
- UNAME_MACHINE="alphaev67" ;;
- "EV6.8CB (21264C)")
- UNAME_MACHINE="alphaev68" ;;
- "EV6.8AL (21264B)")
- UNAME_MACHINE="alphaev68" ;;
- "EV6.8CX (21264D)")
- UNAME_MACHINE="alphaev68" ;;
- "EV6.9A (21264/EV69A)")
- UNAME_MACHINE="alphaev69" ;;
- "EV7 (21364)")
- UNAME_MACHINE="alphaev7" ;;
- "EV7.9 (21364A)")
- UNAME_MACHINE="alphaev79" ;;
- esac
- # A Pn.n version is a patched version.
- # A Vn.n version is a released version.
- # A Tn.n version is a released field test version.
- # A Xn.n version is an unreleased experimental baselevel.
- # 1.2 uses "1.2" for uname -r.
- echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
- exit ;;
- Alpha\ *:Windows_NT*:*)
- # How do we know it's Interix rather than the generic POSIX subsystem?
- # Should we change UNAME_MACHINE based on the output of uname instead
- # of the specific Alpha model?
- echo alpha-pc-interix
- exit ;;
- 21064:Windows_NT:50:3)
- echo alpha-dec-winnt3.5
- exit ;;
- Amiga*:UNIX_System_V:4.0:*)
- echo m68k-unknown-sysv4
- exit ;;
- *:[Aa]miga[Oo][Ss]:*:*)
- echo ${UNAME_MACHINE}-unknown-amigaos
- exit ;;
- *:[Mm]orph[Oo][Ss]:*:*)
- echo ${UNAME_MACHINE}-unknown-morphos
- exit ;;
- *:OS/390:*:*)
- echo i370-ibm-openedition
- exit ;;
- *:z/VM:*:*)
- echo s390-ibm-zvmoe
- exit ;;
- *:OS400:*:*)
- echo powerpc-ibm-os400
- exit ;;
- arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
- echo arm-acorn-riscix${UNAME_RELEASE}
- exit ;;
- arm:riscos:*:*|arm:RISCOS:*:*)
- echo arm-unknown-riscos
- exit ;;
- SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
- echo hppa1.1-hitachi-hiuxmpp
- exit ;;
- Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
- # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
- if test "`(/bin/universe) 2>/dev/null`" = att ; then
- echo pyramid-pyramid-sysv3
- else
- echo pyramid-pyramid-bsd
- fi
- exit ;;
- NILE*:*:*:dcosx)
- echo pyramid-pyramid-svr4
- exit ;;
- DRS?6000:unix:4.0:6*)
- echo sparc-icl-nx6
- exit ;;
- DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
- case `/usr/bin/uname -p` in
- sparc) echo sparc-icl-nx7; exit ;;
- esac ;;
- s390x:SunOS:*:*)
- echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- sun4H:SunOS:5.*:*)
- echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
- echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
- echo i386-pc-auroraux${UNAME_RELEASE}
- exit ;;
- i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
- eval $set_cc_for_build
- SUN_ARCH="i386"
- # If there is a compiler, see if it is configured for 64-bit objects.
- # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
- # This test works for both compilers.
- if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
- if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
- (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
- grep IS_64BIT_ARCH >/dev/null
- then
- SUN_ARCH="x86_64"
- fi
- fi
- echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- sun4*:SunOS:6*:*)
- # According to config.sub, this is the proper way to canonicalize
- # SunOS6. Hard to guess exactly what SunOS6 will be like, but
- # it's likely to be more like Solaris than SunOS4.
- echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- sun4*:SunOS:*:*)
- case "`/usr/bin/arch -k`" in
- Series*|S4*)
- UNAME_RELEASE=`uname -v`
- ;;
- esac
- # Japanese Language versions have a version number like `4.1.3-JL'.
- echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
- exit ;;
- sun3*:SunOS:*:*)
- echo m68k-sun-sunos${UNAME_RELEASE}
- exit ;;
- sun*:*:4.2BSD:*)
- UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
- test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
- case "`/bin/arch`" in
- sun3)
- echo m68k-sun-sunos${UNAME_RELEASE}
- ;;
- sun4)
- echo sparc-sun-sunos${UNAME_RELEASE}
- ;;
- esac
- exit ;;
- aushp:SunOS:*:*)
- echo sparc-auspex-sunos${UNAME_RELEASE}
- exit ;;
- # The situation for MiNT is a little confusing. The machine name
- # can be virtually everything (everything which is not
- # "atarist" or "atariste" at least should have a processor
- # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
- # to the lowercase version "mint" (or "freemint"). Finally
- # the system name "TOS" denotes a system which is actually not
- # MiNT. But MiNT is downward compatible to TOS, so this should
- # be no problem.
- atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
- echo m68k-atari-mint${UNAME_RELEASE}
- exit ;;
- atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
- echo m68k-atari-mint${UNAME_RELEASE}
- exit ;;
- *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
- echo m68k-atari-mint${UNAME_RELEASE}
- exit ;;
- milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
- echo m68k-milan-mint${UNAME_RELEASE}
- exit ;;
- hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
- echo m68k-hades-mint${UNAME_RELEASE}
- exit ;;
- *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
- echo m68k-unknown-mint${UNAME_RELEASE}
- exit ;;
- m68k:machten:*:*)
- echo m68k-apple-machten${UNAME_RELEASE}
- exit ;;
- powerpc:machten:*:*)
- echo powerpc-apple-machten${UNAME_RELEASE}
- exit ;;
- RISC*:Mach:*:*)
- echo mips-dec-mach_bsd4.3
- exit ;;
- RISC*:ULTRIX:*:*)
- echo mips-dec-ultrix${UNAME_RELEASE}
- exit ;;
- VAX*:ULTRIX*:*:*)
- echo vax-dec-ultrix${UNAME_RELEASE}
- exit ;;
- 2020:CLIX:*:* | 2430:CLIX:*:*)
- echo clipper-intergraph-clix${UNAME_RELEASE}
- exit ;;
- mips:*:*:UMIPS | mips:*:*:RISCos)
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
-#ifdef __cplusplus
-#include <stdio.h> /* for printf() prototype */
- int main (int argc, char *argv[]) {
-#else
- int main (argc, argv) int argc; char *argv[]; {
-#endif
- #if defined (host_mips) && defined (MIPSEB)
- #if defined (SYSTYPE_SYSV)
- printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
- #endif
- #if defined (SYSTYPE_SVR4)
- printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
- #endif
- #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
- printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
- #endif
- #endif
- exit (-1);
- }
-EOF
- $CC_FOR_BUILD -o $dummy $dummy.c &&
- dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
- SYSTEM_NAME=`$dummy $dummyarg` &&
- { echo "$SYSTEM_NAME"; exit; }
- echo mips-mips-riscos${UNAME_RELEASE}
- exit ;;
- Motorola:PowerMAX_OS:*:*)
- echo powerpc-motorola-powermax
- exit ;;
- Motorola:*:4.3:PL8-*)
- echo powerpc-harris-powermax
- exit ;;
- Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
- echo powerpc-harris-powermax
- exit ;;
- Night_Hawk:Power_UNIX:*:*)
- echo powerpc-harris-powerunix
- exit ;;
- m88k:CX/UX:7*:*)
- echo m88k-harris-cxux7
- exit ;;
- m88k:*:4*:R4*)
- echo m88k-motorola-sysv4
- exit ;;
- m88k:*:3*:R3*)
- echo m88k-motorola-sysv3
- exit ;;
- AViiON:dgux:*:*)
- # DG/UX returns AViiON for all architectures
- UNAME_PROCESSOR=`/usr/bin/uname -p`
- if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
- then
- if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
- [ ${TARGET_BINARY_INTERFACE}x = x ]
- then
- echo m88k-dg-dgux${UNAME_RELEASE}
- else
- echo m88k-dg-dguxbcs${UNAME_RELEASE}
- fi
- else
- echo i586-dg-dgux${UNAME_RELEASE}
- fi
- exit ;;
- M88*:DolphinOS:*:*) # DolphinOS (SVR3)
- echo m88k-dolphin-sysv3
- exit ;;
- M88*:*:R3*:*)
- # Delta 88k system running SVR3
- echo m88k-motorola-sysv3
- exit ;;
- XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
- echo m88k-tektronix-sysv3
- exit ;;
- Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
- echo m68k-tektronix-bsd
- exit ;;
- *:IRIX*:*:*)
- echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
- exit ;;
- ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
- echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
- exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
- i*86:AIX:*:*)
- echo i386-ibm-aix
- exit ;;
- ia64:AIX:*:*)
- if [ -x /usr/bin/oslevel ] ; then
- IBM_REV=`/usr/bin/oslevel`
- else
- IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
- fi
- echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
- exit ;;
- *:AIX:2:3)
- if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
- #include <sys/systemcfg.h>
-
- main()
- {
- if (!__power_pc())
- exit(1);
- puts("powerpc-ibm-aix3.2.5");
- exit(0);
- }
-EOF
- if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
- then
- echo "$SYSTEM_NAME"
- else
- echo rs6000-ibm-aix3.2.5
- fi
- elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
- echo rs6000-ibm-aix3.2.4
- else
- echo rs6000-ibm-aix3.2
- fi
- exit ;;
- *:AIX:*:[456])
- IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
- if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
- IBM_ARCH=rs6000
- else
- IBM_ARCH=powerpc
- fi
- if [ -x /usr/bin/oslevel ] ; then
- IBM_REV=`/usr/bin/oslevel`
- else
- IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
- fi
- echo ${IBM_ARCH}-ibm-aix${IBM_REV}
- exit ;;
- *:AIX:*:*)
- echo rs6000-ibm-aix
- exit ;;
- ibmrt:4.4BSD:*|romp-ibm:BSD:*)
- echo romp-ibm-bsd4.4
- exit ;;
- ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
- echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
- exit ;; # report: romp-ibm BSD 4.3
- *:BOSX:*:*)
- echo rs6000-bull-bosx
- exit ;;
- DPX/2?00:B.O.S.:*:*)
- echo m68k-bull-sysv3
- exit ;;
- 9000/[34]??:4.3bsd:1.*:*)
- echo m68k-hp-bsd
- exit ;;
- hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
- echo m68k-hp-bsd4.4
- exit ;;
- 9000/[34678]??:HP-UX:*:*)
- HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
- case "${UNAME_MACHINE}" in
- 9000/31? ) HP_ARCH=m68000 ;;
- 9000/[34]?? ) HP_ARCH=m68k ;;
- 9000/[678][0-9][0-9])
- if [ -x /usr/bin/getconf ]; then
- sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
- sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
- case "${sc_cpu_version}" in
- 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
- 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
- 532) # CPU_PA_RISC2_0
- case "${sc_kernel_bits}" in
- 32) HP_ARCH="hppa2.0n" ;;
- 64) HP_ARCH="hppa2.0w" ;;
- '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
- esac ;;
- esac
- fi
- if [ "${HP_ARCH}" = "" ]; then
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
-
- #define _HPUX_SOURCE
- #include <stdlib.h>
- #include <unistd.h>
-
- int main ()
- {
- #if defined(_SC_KERNEL_BITS)
- long bits = sysconf(_SC_KERNEL_BITS);
- #endif
- long cpu = sysconf (_SC_CPU_VERSION);
-
- switch (cpu)
- {
- case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
- case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
- case CPU_PA_RISC2_0:
- #if defined(_SC_KERNEL_BITS)
- switch (bits)
- {
- case 64: puts ("hppa2.0w"); break;
- case 32: puts ("hppa2.0n"); break;
- default: puts ("hppa2.0"); break;
- } break;
- #else /* !defined(_SC_KERNEL_BITS) */
- puts ("hppa2.0"); break;
- #endif
- default: puts ("hppa1.0"); break;
- }
- exit (0);
- }
-EOF
- (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
- test -z "$HP_ARCH" && HP_ARCH=hppa
- fi ;;
- esac
- if [ ${HP_ARCH} = "hppa2.0w" ]
- then
- eval $set_cc_for_build
-
- # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
- # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
- # generating 64-bit code. GNU and HP use different nomenclature:
- #
- # $ CC_FOR_BUILD=cc ./config.guess
- # => hppa2.0w-hp-hpux11.23
- # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
- # => hppa64-hp-hpux11.23
-
- if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
- grep -q __LP64__
- then
- HP_ARCH="hppa2.0w"
- else
- HP_ARCH="hppa64"
- fi
- fi
- echo ${HP_ARCH}-hp-hpux${HPUX_REV}
- exit ;;
- ia64:HP-UX:*:*)
- HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
- echo ia64-hp-hpux${HPUX_REV}
- exit ;;
- 3050*:HI-UX:*:*)
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
- #include <unistd.h>
- int
- main ()
- {
- long cpu = sysconf (_SC_CPU_VERSION);
- /* The order matters, because CPU_IS_HP_MC68K erroneously returns
- true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
- results, however. */
- if (CPU_IS_PA_RISC (cpu))
- {
- switch (cpu)
- {
- case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
- case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
- case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
- default: puts ("hppa-hitachi-hiuxwe2"); break;
- }
- }
- else if (CPU_IS_HP_MC68K (cpu))
- puts ("m68k-hitachi-hiuxwe2");
- else puts ("unknown-hitachi-hiuxwe2");
- exit (0);
- }
-EOF
- $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
- { echo "$SYSTEM_NAME"; exit; }
- echo unknown-hitachi-hiuxwe2
- exit ;;
- 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
- echo hppa1.1-hp-bsd
- exit ;;
- 9000/8??:4.3bsd:*:*)
- echo hppa1.0-hp-bsd
- exit ;;
- *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
- echo hppa1.0-hp-mpeix
- exit ;;
- hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
- echo hppa1.1-hp-osf
- exit ;;
- hp8??:OSF1:*:*)
- echo hppa1.0-hp-osf
- exit ;;
- i*86:OSF1:*:*)
- if [ -x /usr/sbin/sysversion ] ; then
- echo ${UNAME_MACHINE}-unknown-osf1mk
- else
- echo ${UNAME_MACHINE}-unknown-osf1
- fi
- exit ;;
- parisc*:Lites*:*:*)
- echo hppa1.1-hp-lites
- exit ;;
- C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
- echo c1-convex-bsd
- exit ;;
- C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
- if getsysinfo -f scalar_acc
- then echo c32-convex-bsd
- else echo c2-convex-bsd
- fi
- exit ;;
- C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
- echo c34-convex-bsd
- exit ;;
- C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
- echo c38-convex-bsd
- exit ;;
- C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
- echo c4-convex-bsd
- exit ;;
- CRAY*Y-MP:*:*:*)
- echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*[A-Z]90:*:*:*)
- echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
- | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
- -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
- -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*TS:*:*:*)
- echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*T3E:*:*:*)
- echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*SV1:*:*:*)
- echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- *:UNICOS/mp:*:*)
- echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
- FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
- FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
- echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
- exit ;;
- 5000:UNIX_System_V:4.*:*)
- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
- FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
- echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
- exit ;;
- i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
- echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
- exit ;;
- sparc*:BSD/OS:*:*)
- echo sparc-unknown-bsdi${UNAME_RELEASE}
- exit ;;
- *:BSD/OS:*:*)
- echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
- exit ;;
- *:FreeBSD:*:*)
- case ${UNAME_MACHINE} in
- pc98)
- echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
- amd64)
- echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
- *)
- echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
- esac
- exit ;;
- i*:CYGWIN*:*)
- echo ${UNAME_MACHINE}-pc-cygwin
- exit ;;
- *:MINGW*:*)
- echo ${UNAME_MACHINE}-pc-mingw32
- exit ;;
- i*:windows32*:*)
- # uname -m includes "-pc" on this system.
- echo ${UNAME_MACHINE}-mingw32
- exit ;;
- i*:PW*:*)
- echo ${UNAME_MACHINE}-pc-pw32
- exit ;;
- *:Interix*:*)
- case ${UNAME_MACHINE} in
- x86)
- echo i586-pc-interix${UNAME_RELEASE}
- exit ;;
- authenticamd | genuineintel | EM64T)
- echo x86_64-unknown-interix${UNAME_RELEASE}
- exit ;;
- IA64)
- echo ia64-unknown-interix${UNAME_RELEASE}
- exit ;;
- esac ;;
- [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
- echo i${UNAME_MACHINE}-pc-mks
- exit ;;
- 8664:Windows_NT:*)
- echo x86_64-pc-mks
- exit ;;
- i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
- # How do we know it's Interix rather than the generic POSIX subsystem?
- # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
- # UNAME_MACHINE based on the output of uname instead of i386?
- echo i586-pc-interix
- exit ;;
- i*:UWIN*:*)
- echo ${UNAME_MACHINE}-pc-uwin
- exit ;;
- amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
- echo x86_64-unknown-cygwin
- exit ;;
- p*:CYGWIN*:*)
- echo powerpcle-unknown-cygwin
- exit ;;
- prep*:SunOS:5.*:*)
- echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- *:GNU:*:*)
- # the GNU system
- echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
- exit ;;
- *:GNU/*:*:*)
- # other systems with GNU libc and userland
- echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
- exit ;;
- i*86:Minix:*:*)
- echo ${UNAME_MACHINE}-pc-minix
- exit ;;
- alpha:Linux:*:*)
- case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
- EV5) UNAME_MACHINE=alphaev5 ;;
- EV56) UNAME_MACHINE=alphaev56 ;;
- PCA56) UNAME_MACHINE=alphapca56 ;;
- PCA57) UNAME_MACHINE=alphapca56 ;;
- EV6) UNAME_MACHINE=alphaev6 ;;
- EV67) UNAME_MACHINE=alphaev67 ;;
- EV68*) UNAME_MACHINE=alphaev68 ;;
- esac
- objdump --private-headers /bin/sh | grep -q ld.so.1
- if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
- echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
- exit ;;
- arm*:Linux:*:*)
- eval $set_cc_for_build
- if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
- | grep -q __ARM_EABI__
- then
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- else
- echo ${UNAME_MACHINE}-unknown-linux-gnueabi
- fi
- exit ;;
- avr32*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit ;;
- cris:Linux:*:*)
- echo cris-axis-linux-gnu
- exit ;;
- crisv32:Linux:*:*)
- echo crisv32-axis-linux-gnu
- exit ;;
- frv:Linux:*:*)
- echo frv-unknown-linux-gnu
- exit ;;
- i*86:Linux:*:*)
- LIBC=gnu
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
- #ifdef __dietlibc__
- LIBC=dietlibc
- #endif
-EOF
- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
- echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
- exit ;;
- ia64:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit ;;
- m32r*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit ;;
- m68*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit ;;
- mips:Linux:*:* | mips64:Linux:*:*)
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
- #undef CPU
- #undef ${UNAME_MACHINE}
- #undef ${UNAME_MACHINE}el
- #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
- CPU=${UNAME_MACHINE}el
- #else
- #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
- CPU=${UNAME_MACHINE}
- #else
- CPU=
- #endif
- #endif
-EOF
- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
- test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
- ;;
- or32:Linux:*:*)
- echo or32-unknown-linux-gnu
- exit ;;
- padre:Linux:*:*)
- echo sparc-unknown-linux-gnu
- exit ;;
- parisc64:Linux:*:* | hppa64:Linux:*:*)
- echo hppa64-unknown-linux-gnu
- exit ;;
- parisc:Linux:*:* | hppa:Linux:*:*)
- # Look for CPU level
- case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
- PA7*) echo hppa1.1-unknown-linux-gnu ;;
- PA8*) echo hppa2.0-unknown-linux-gnu ;;
- *) echo hppa-unknown-linux-gnu ;;
- esac
- exit ;;
- ppc64:Linux:*:*)
- echo powerpc64-unknown-linux-gnu
- exit ;;
- ppc:Linux:*:*)
- echo powerpc-unknown-linux-gnu
- exit ;;
- s390:Linux:*:* | s390x:Linux:*:*)
- echo ${UNAME_MACHINE}-ibm-linux
- exit ;;
- sh64*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit ;;
- sh*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit ;;
- sparc:Linux:*:* | sparc64:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit ;;
- vax:Linux:*:*)
- echo ${UNAME_MACHINE}-dec-linux-gnu
- exit ;;
- x86_64:Linux:*:*)
- echo x86_64-unknown-linux-gnu
- exit ;;
- xtensa*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit ;;
- i*86:DYNIX/ptx:4*:*)
- # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
- # earlier versions are messed up and put the nodename in both
- # sysname and nodename.
- echo i386-sequent-sysv4
- exit ;;
- i*86:UNIX_SV:4.2MP:2.*)
- # Unixware is an offshoot of SVR4, but it has its own version
- # number series starting with 2...
- # I am not positive that other SVR4 systems won't match this,
- # I just have to hope. -- rms.
- # Use sysv4.2uw... so that sysv4* matches it.
- echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
- exit ;;
- i*86:OS/2:*:*)
- # If we were able to find `uname', then EMX Unix compatibility
- # is probably installed.
- echo ${UNAME_MACHINE}-pc-os2-emx
- exit ;;
- i*86:XTS-300:*:STOP)
- echo ${UNAME_MACHINE}-unknown-stop
- exit ;;
- i*86:atheos:*:*)
- echo ${UNAME_MACHINE}-unknown-atheos
- exit ;;
- i*86:syllable:*:*)
- echo ${UNAME_MACHINE}-pc-syllable
- exit ;;
- i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
- echo i386-unknown-lynxos${UNAME_RELEASE}
- exit ;;
- i*86:*DOS:*:*)
- echo ${UNAME_MACHINE}-pc-msdosdjgpp
- exit ;;
- i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
- UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
- if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
- echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
- else
- echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
- fi
- exit ;;
- i*86:*:5:[678]*)
- # UnixWare 7.x, OpenUNIX and OpenServer 6.
- case `/bin/uname -X | grep "^Machine"` in
- *486*) UNAME_MACHINE=i486 ;;
- *Pentium) UNAME_MACHINE=i586 ;;
- *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
- esac
- echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
- exit ;;
- i*86:*:3.2:*)
- if test -f /usr/options/cb.name; then
- UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
- echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
- elif /bin/uname -X 2>/dev/null >/dev/null ; then
- UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
- (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
- (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
- && UNAME_MACHINE=i586
- (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
- && UNAME_MACHINE=i686
- (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
- && UNAME_MACHINE=i686
- echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
- else
- echo ${UNAME_MACHINE}-pc-sysv32
- fi
- exit ;;
- pc:*:*:*)
- # Left here for compatibility:
- # uname -m prints for DJGPP always 'pc', but it prints nothing about
- # the processor, so we play safe by assuming i586.
- # Note: whatever this is, it MUST be the same as what config.sub
- # prints for the "djgpp" host, or else GDB configury will decide that
- # this is a cross-build.
- echo i586-pc-msdosdjgpp
- exit ;;
- Intel:Mach:3*:*)
- echo i386-pc-mach3
- exit ;;
- paragon:*:*:*)
- echo i860-intel-osf1
- exit ;;
- i860:*:4.*:*) # i860-SVR4
- if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
- echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
- else # Add other i860-SVR4 vendors below as they are discovered.
- echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
- fi
- exit ;;
- mini*:CTIX:SYS*5:*)
- # "miniframe"
- echo m68010-convergent-sysv
- exit ;;
- mc68k:UNIX:SYSTEM5:3.51m)
- echo m68k-convergent-sysv
- exit ;;
- M680?0:D-NIX:5.3:*)
- echo m68k-diab-dnix
- exit ;;
- M68*:*:R3V[5678]*:*)
- test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
- 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
- OS_REL=''
- test -r /etc/.relid \
- && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
- /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
- && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
- 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && { echo i486-ncr-sysv4; exit; } ;;
- NCR*:*:4.2:* | MPRAS*:*:4.2:*)
- OS_REL='.3'
- test -r /etc/.relid \
- && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
- /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
- && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
- /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
- && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
- m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
- echo m68k-unknown-lynxos${UNAME_RELEASE}
- exit ;;
- mc68030:UNIX_System_V:4.*:*)
- echo m68k-atari-sysv4
- exit ;;
- TSUNAMI:LynxOS:2.*:*)
- echo sparc-unknown-lynxos${UNAME_RELEASE}
- exit ;;
- rs6000:LynxOS:2.*:*)
- echo rs6000-unknown-lynxos${UNAME_RELEASE}
- exit ;;
- PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
- echo powerpc-unknown-lynxos${UNAME_RELEASE}
- exit ;;
- SM[BE]S:UNIX_SV:*:*)
- echo mips-dde-sysv${UNAME_RELEASE}
- exit ;;
- RM*:ReliantUNIX-*:*:*)
- echo mips-sni-sysv4
- exit ;;
- RM*:SINIX-*:*:*)
- echo mips-sni-sysv4
- exit ;;
- *:SINIX-*:*:*)
- if uname -p 2>/dev/null >/dev/null ; then
- UNAME_MACHINE=`(uname -p) 2>/dev/null`
- echo ${UNAME_MACHINE}-sni-sysv4
- else
- echo ns32k-sni-sysv
- fi
- exit ;;
- PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
- # says <Richard.M.Bartel@ccMail.Census.GOV>
- echo i586-unisys-sysv4
- exit ;;
- *:UNIX_System_V:4*:FTX*)
- # From Gerald Hewes <hewes@openmarket.com>.
- # How about differentiating between stratus architectures? -djm
- echo hppa1.1-stratus-sysv4
- exit ;;
- *:*:*:FTX*)
- # From seanf@swdc.stratus.com.
- echo i860-stratus-sysv4
- exit ;;
- i*86:VOS:*:*)
- # From Paul.Green@stratus.com.
- echo ${UNAME_MACHINE}-stratus-vos
- exit ;;
- *:VOS:*:*)
- # From Paul.Green@stratus.com.
- echo hppa1.1-stratus-vos
- exit ;;
- mc68*:A/UX:*:*)
- echo m68k-apple-aux${UNAME_RELEASE}
- exit ;;
- news*:NEWS-OS:6*:*)
- echo mips-sony-newsos6
- exit ;;
- R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
- if [ -d /usr/nec ]; then
- echo mips-nec-sysv${UNAME_RELEASE}
- else
- echo mips-unknown-sysv${UNAME_RELEASE}
- fi
- exit ;;
- BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
- echo powerpc-be-beos
- exit ;;
- BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
- echo powerpc-apple-beos
- exit ;;
- BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
- echo i586-pc-beos
- exit ;;
- BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
- echo i586-pc-haiku
- exit ;;
- SX-4:SUPER-UX:*:*)
- echo sx4-nec-superux${UNAME_RELEASE}
- exit ;;
- SX-5:SUPER-UX:*:*)
- echo sx5-nec-superux${UNAME_RELEASE}
- exit ;;
- SX-6:SUPER-UX:*:*)
- echo sx6-nec-superux${UNAME_RELEASE}
- exit ;;
- SX-7:SUPER-UX:*:*)
- echo sx7-nec-superux${UNAME_RELEASE}
- exit ;;
- SX-8:SUPER-UX:*:*)
- echo sx8-nec-superux${UNAME_RELEASE}
- exit ;;
- SX-8R:SUPER-UX:*:*)
- echo sx8r-nec-superux${UNAME_RELEASE}
- exit ;;
- Power*:Rhapsody:*:*)
- echo powerpc-apple-rhapsody${UNAME_RELEASE}
- exit ;;
- *:Rhapsody:*:*)
- echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
- exit ;;
- *:Darwin:*:*)
- UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
- case $UNAME_PROCESSOR in
- i386)
- eval $set_cc_for_build
- if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
- if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
- (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
- grep IS_64BIT_ARCH >/dev/null
- then
- UNAME_PROCESSOR="x86_64"
- fi
- fi ;;
- unknown) UNAME_PROCESSOR=powerpc ;;
- esac
- echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
- exit ;;
- *:procnto*:*:* | *:QNX:[0123456789]*:*)
- UNAME_PROCESSOR=`uname -p`
- if test "$UNAME_PROCESSOR" = "x86"; then
- UNAME_PROCESSOR=i386
- UNAME_MACHINE=pc
- fi
- echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
- exit ;;
- *:QNX:*:4*)
- echo i386-pc-qnx
- exit ;;
- NSE-?:NONSTOP_KERNEL:*:*)
- echo nse-tandem-nsk${UNAME_RELEASE}
- exit ;;
- NSR-?:NONSTOP_KERNEL:*:*)
- echo nsr-tandem-nsk${UNAME_RELEASE}
- exit ;;
- *:NonStop-UX:*:*)
- echo mips-compaq-nonstopux
- exit ;;
- BS2000:POSIX*:*:*)
- echo bs2000-siemens-sysv
- exit ;;
- DS/*:UNIX_System_V:*:*)
- echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
- exit ;;
- *:Plan9:*:*)
- # "uname -m" is not consistent, so use $cputype instead. 386
- # is converted to i386 for consistency with other x86
- # operating systems.
- if test "$cputype" = "386"; then
- UNAME_MACHINE=i386
- else
- UNAME_MACHINE="$cputype"
- fi
- echo ${UNAME_MACHINE}-unknown-plan9
- exit ;;
- *:TOPS-10:*:*)
- echo pdp10-unknown-tops10
- exit ;;
- *:TENEX:*:*)
- echo pdp10-unknown-tenex
- exit ;;
- KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
- echo pdp10-dec-tops20
- exit ;;
- XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
- echo pdp10-xkl-tops20
- exit ;;
- *:TOPS-20:*:*)
- echo pdp10-unknown-tops20
- exit ;;
- *:ITS:*:*)
- echo pdp10-unknown-its
- exit ;;
- SEI:*:*:SEIUX)
- echo mips-sei-seiux${UNAME_RELEASE}
- exit ;;
- *:DragonFly:*:*)
- echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
- exit ;;
- *:*VMS:*:*)
- UNAME_MACHINE=`(uname -p) 2>/dev/null`
- case "${UNAME_MACHINE}" in
- A*) echo alpha-dec-vms ; exit ;;
- I*) echo ia64-dec-vms ; exit ;;
- V*) echo vax-dec-vms ; exit ;;
- esac ;;
- *:XENIX:*:SysV)
- echo i386-pc-xenix
- exit ;;
- i*86:skyos:*:*)
- echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
- exit ;;
- i*86:rdos:*:*)
- echo ${UNAME_MACHINE}-pc-rdos
- exit ;;
- i*86:AROS:*:*)
- echo ${UNAME_MACHINE}-pc-aros
- exit ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
- /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
- I don't know.... */
- printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
- printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
- "4"
-#else
- ""
-#endif
- ); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
- printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
- printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
- int version;
- version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
- if (version < 4)
- printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
- else
- printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
- exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
- printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
- printf ("ns32k-encore-mach\n"); exit (0);
-#else
- printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
- printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
- printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
- printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
- struct utsname un;
-
- uname(&un);
-
- if (strncmp(un.version, "V2", 2) == 0) {
- printf ("i386-sequent-ptx2\n"); exit (0);
- }
- if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
- printf ("i386-sequent-ptx1\n"); exit (0);
- }
- printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-# include <sys/param.h>
-# if defined (BSD)
-# if BSD == 43
- printf ("vax-dec-bsd4.3\n"); exit (0);
-# else
-# if BSD == 199006
- printf ("vax-dec-bsd4.3reno\n"); exit (0);
-# else
- printf ("vax-dec-bsd\n"); exit (0);
-# endif
-# endif
-# else
- printf ("vax-dec-bsd\n"); exit (0);
-# endif
-# else
- printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
- printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
- exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
- { echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
- case `getsysinfo -f cpu_type` in
- c1*)
- echo c1-convex-bsd
- exit ;;
- c2*)
- if getsysinfo -f scalar_acc
- then echo c32-convex-bsd
- else echo c2-convex-bsd
- fi
- exit ;;
- c34*)
- echo c34-convex-bsd
- exit ;;
- c38*)
- echo c38-convex-bsd
- exit ;;
- c4*)
- echo c4-convex-bsd
- exit ;;
- esac
-fi
-
-cat >&2 <<EOF
-$0: unable to guess system type
-
-This script, last modified $timestamp, has failed to recognize
-the operating system you are using. It is advised that you
-download the most up to date version of the config scripts from
-
- http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
-and
- http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
-If the version you run ($0) is already up to date, please
-send the following data and any information you think might be
-pertinent to <config-patches@gnu.org> in order to provide the needed
-information to handle your system.
-
-config.guess timestamp = $timestamp
-
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
-/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
-
-hostinfo = `(hostinfo) 2>/dev/null`
-/bin/universe = `(/bin/universe) 2>/dev/null`
-/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
-/bin/arch = `(/bin/arch) 2>/dev/null`
-/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
-
-UNAME_MACHINE = ${UNAME_MACHINE}
-UNAME_RELEASE = ${UNAME_RELEASE}
-UNAME_SYSTEM = ${UNAME_SYSTEM}
-UNAME_VERSION = ${UNAME_VERSION}
-EOF
-
-exit 1
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/src/3rdparty/libpng/config.h.in b/src/3rdparty/libpng/config.h.in
deleted file mode 100644
index fb2349568c..0000000000
--- a/src/3rdparty/libpng/config.h.in
+++ /dev/null
@@ -1,86 +0,0 @@
-/* config.h.in. Generated from configure.ac by autoheader. */
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#undef HAVE_DLFCN_H
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
-/* Define to 1 if you have the `m' library (-lm). */
-#undef HAVE_LIBM
-
-/* Define to 1 if you have the `z' library (-lz). */
-#undef HAVE_LIBZ
-
-/* Define to 1 if you have the <malloc.h> header file. */
-#undef HAVE_MALLOC_H
-
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
-/* Define to 1 if you have the `memset' function. */
-#undef HAVE_MEMSET
-
-/* Define to 1 if you have the `pow' function. */
-#undef HAVE_POW
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#undef HAVE_STDINT_H
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#undef HAVE_STDLIB_H
-
-/* Define to 1 if you have the <strings.h> header file. */
-#undef HAVE_STRINGS_H
-
-/* Define to 1 if you have the <string.h> header file. */
-#undef HAVE_STRING_H
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#undef HAVE_SYS_STAT_H
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#undef HAVE_SYS_TYPES_H
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#undef HAVE_UNISTD_H
-
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
- */
-#undef LT_OBJDIR
-
-/* Name of package */
-#undef PACKAGE
-
-/* Define to the address where bug reports for this package should be sent. */
-#undef PACKAGE_BUGREPORT
-
-/* Define to the full name of this package. */
-#undef PACKAGE_NAME
-
-/* Define to the full name and version of this package. */
-#undef PACKAGE_STRING
-
-/* Define to the one symbol short name of this package. */
-#undef PACKAGE_TARNAME
-
-/* Define to the home page for this package. */
-#undef PACKAGE_URL
-
-/* Define to the version of this package. */
-#undef PACKAGE_VERSION
-
-/* Define to 1 if you have the ANSI C header files. */
-#undef STDC_HEADERS
-
-/* Define to 1 if your <sys/time.h> declares `struct tm'. */
-#undef TM_IN_SYS_TIME
-
-/* Version number of package */
-#undef VERSION
-
-/* Define to empty if `const' does not conform to ANSI C. */
-#undef const
-
-/* Define to `unsigned int' if <sys/types.h> does not define. */
-#undef size_t
diff --git a/src/3rdparty/libpng/config.sub b/src/3rdparty/libpng/config.sub
deleted file mode 100644
index 2a55a50751..0000000000
--- a/src/3rdparty/libpng/config.sub
+++ /dev/null
@@ -1,1705 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script.
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-# Free Software Foundation, Inc.
-
-timestamp='2009-11-20'
-
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine. It does not imply ALL GNU software can.
-#
-# This file is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Please send patches to <config-patches@gnu.org>. Submit a context
-# diff and a properly formatted GNU ChangeLog entry.
-#
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support. The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
- $0 [OPTION] ALIAS
-
-Canonicalize a configuration name.
-
-Operation modes:
- -h, --help print this help, then exit
- -t, --time-stamp print date of last modification, then exit
- -v, --version print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.sub ($timestamp)
-
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions. There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
- case $1 in
- --time-stamp | --time* | -t )
- echo "$timestamp" ; exit ;;
- --version | -v )
- echo "$version" ; exit ;;
- --help | --h* | -h )
- echo "$usage"; exit ;;
- -- ) # Stop option processing
- shift; break ;;
- - ) # Use stdin as input.
- break ;;
- -* )
- echo "$me: invalid option $1$help"
- exit 1 ;;
-
- *local*)
- # First pass through any local machine types.
- echo $1
- exit ;;
-
- * )
- break ;;
- esac
-done
-
-case $# in
- 0) echo "$me: missing argument$help" >&2
- exit 1;;
- 1) ;;
- *) echo "$me: too many arguments$help" >&2
- exit 1;;
-esac
-
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
- nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
- uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
- kopensolaris*-gnu* | \
- storm-chaos* | os2-emx* | rtmk-nova*)
- os=-$maybe_os
- basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
- ;;
- *)
- basic_machine=`echo $1 | sed 's/-[^-]*$//'`
- if [ $basic_machine != $1 ]
- then os=`echo $1 | sed 's/.*-/-/'`
- else os=; fi
- ;;
-esac
-
-### Let's recognize common machines as not being operating systems so
-### that things like config.sub decstation-3100 work. We also
-### recognize some manufacturers as not being operating systems, so we
-### can provide default operating systems below.
-case $os in
- -sun*os*)
- # Prevent following clause from handling this invalid input.
- ;;
- -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
- -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
- -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
- -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
- -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
- -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
- -apple | -axis | -knuth | -cray | -microblaze)
- os=
- basic_machine=$1
- ;;
- -bluegene*)
- os=-cnk
- ;;
- -sim | -cisco | -oki | -wec | -winbond)
- os=
- basic_machine=$1
- ;;
- -scout)
- ;;
- -wrs)
- os=-vxworks
- basic_machine=$1
- ;;
- -chorusos*)
- os=-chorusos
- basic_machine=$1
- ;;
- -chorusrdb)
- os=-chorusrdb
- basic_machine=$1
- ;;
- -hiux*)
- os=-hiuxwe2
- ;;
- -sco6)
- os=-sco5v6
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco5)
- os=-sco3.2v5
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco4)
- os=-sco3.2v4
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco3.2.[4-9]*)
- os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco3.2v[4-9]*)
- # Don't forget version if it is 3.2v4 or newer.
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco5v6*)
- # Don't forget version if it is 3.2v4 or newer.
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco*)
- os=-sco3.2v2
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -udk*)
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -isc)
- os=-isc2.2
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -clix*)
- basic_machine=clipper-intergraph
- ;;
- -isc*)
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -lynx*)
- os=-lynxos
- ;;
- -ptx*)
- basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
- ;;
- -windowsnt*)
- os=`echo $os | sed -e 's/windowsnt/winnt/'`
- ;;
- -psos*)
- os=-psos
- ;;
- -mint | -mint[0-9]*)
- basic_machine=m68k-atari
- os=-mint
- ;;
-esac
-
-# Decode aliases for certain CPU-COMPANY combinations.
-case $basic_machine in
- # Recognize the basic CPU types without company name.
- # Some are omitted here because they have special meanings below.
- 1750a | 580 \
- | a29k \
- | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
- | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
- | am33_2.0 \
- | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
- | bfin \
- | c4x | clipper \
- | d10v | d30v | dlx | dsp16xx \
- | fido | fr30 | frv \
- | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
- | i370 | i860 | i960 | ia64 \
- | ip2k | iq2000 \
- | lm32 \
- | m32c | m32r | m32rle | m68000 | m68k | m88k \
- | maxq | mb | microblaze | mcore | mep | metag \
- | mips | mipsbe | mipseb | mipsel | mipsle \
- | mips16 \
- | mips64 | mips64el \
- | mips64octeon | mips64octeonel \
- | mips64orion | mips64orionel \
- | mips64r5900 | mips64r5900el \
- | mips64vr | mips64vrel \
- | mips64vr4100 | mips64vr4100el \
- | mips64vr4300 | mips64vr4300el \
- | mips64vr5000 | mips64vr5000el \
- | mips64vr5900 | mips64vr5900el \
- | mipsisa32 | mipsisa32el \
- | mipsisa32r2 | mipsisa32r2el \
- | mipsisa64 | mipsisa64el \
- | mipsisa64r2 | mipsisa64r2el \
- | mipsisa64sb1 | mipsisa64sb1el \
- | mipsisa64sr71k | mipsisa64sr71kel \
- | mipstx39 | mipstx39el \
- | mn10200 | mn10300 \
- | moxie \
- | mt \
- | msp430 \
- | nios | nios2 \
- | ns16k | ns32k \
- | or32 \
- | pdp10 | pdp11 | pj | pjl \
- | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
- | pyramid \
- | rx \
- | score \
- | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
- | sh64 | sh64le \
- | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
- | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
- | spu | strongarm \
- | tahoe | thumb | tic4x | tic80 | tron \
- | ubicom32 \
- | v850 | v850e \
- | we32k \
- | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
- | z8k | z80)
- basic_machine=$basic_machine-unknown
- ;;
- m6811 | m68hc11 | m6812 | m68hc12 | picochip)
- # Motorola 68HC11/12.
- basic_machine=$basic_machine-unknown
- os=-none
- ;;
- m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
- ;;
- ms1)
- basic_machine=mt-unknown
- ;;
-
- # We use `pc' rather than `unknown'
- # because (1) that's what they normally are, and
- # (2) the word "unknown" tends to confuse beginning users.
- i*86 | x86_64)
- basic_machine=$basic_machine-pc
- ;;
- # Object if more than one company name word.
- *-*-*)
- echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
- exit 1
- ;;
- # Recognize the basic CPU types with company name.
- 580-* \
- | a29k-* \
- | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
- | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
- | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
- | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
- | avr-* | avr32-* \
- | bfin-* | bs2000-* \
- | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
- | clipper-* | craynv-* | cydra-* \
- | d10v-* | d30v-* | dlx-* \
- | elxsi-* \
- | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
- | h8300-* | h8500-* \
- | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
- | i*86-* | i860-* | i960-* | ia64-* \
- | ip2k-* | iq2000-* \
- | lm32-* \
- | m32c-* | m32r-* | m32rle-* \
- | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
- | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
- | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
- | mips16-* \
- | mips64-* | mips64el-* \
- | mips64octeon-* | mips64octeonel-* \
- | mips64orion-* | mips64orionel-* \
- | mips64r5900-* | mips64r5900el-* \
- | mips64vr-* | mips64vrel-* \
- | mips64vr4100-* | mips64vr4100el-* \
- | mips64vr4300-* | mips64vr4300el-* \
- | mips64vr5000-* | mips64vr5000el-* \
- | mips64vr5900-* | mips64vr5900el-* \
- | mipsisa32-* | mipsisa32el-* \
- | mipsisa32r2-* | mipsisa32r2el-* \
- | mipsisa64-* | mipsisa64el-* \
- | mipsisa64r2-* | mipsisa64r2el-* \
- | mipsisa64sb1-* | mipsisa64sb1el-* \
- | mipsisa64sr71k-* | mipsisa64sr71kel-* \
- | mipstx39-* | mipstx39el-* \
- | mmix-* \
- | mt-* \
- | msp430-* \
- | nios-* | nios2-* \
- | none-* | np1-* | ns16k-* | ns32k-* \
- | orion-* \
- | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
- | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
- | pyramid-* \
- | romp-* | rs6000-* | rx-* \
- | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
- | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
- | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
- | sparclite-* \
- | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
- | tahoe-* | thumb-* \
- | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \
- | tron-* \
- | ubicom32-* \
- | v850-* | v850e-* | vax-* \
- | we32k-* \
- | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
- | xstormy16-* | xtensa*-* \
- | ymp-* \
- | z8k-* | z80-*)
- ;;
- # Recognize the basic CPU types without company name, with glob match.
- xtensa*)
- basic_machine=$basic_machine-unknown
- ;;
- # Recognize the various machine names and aliases which stand
- # for a CPU type and a company and sometimes even an OS.
- 386bsd)
- basic_machine=i386-unknown
- os=-bsd
- ;;
- 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
- basic_machine=m68000-att
- ;;
- 3b*)
- basic_machine=we32k-att
- ;;
- a29khif)
- basic_machine=a29k-amd
- os=-udi
- ;;
- abacus)
- basic_machine=abacus-unknown
- ;;
- adobe68k)
- basic_machine=m68010-adobe
- os=-scout
- ;;
- alliant | fx80)
- basic_machine=fx80-alliant
- ;;
- altos | altos3068)
- basic_machine=m68k-altos
- ;;
- am29k)
- basic_machine=a29k-none
- os=-bsd
- ;;
- amd64)
- basic_machine=x86_64-pc
- ;;
- amd64-*)
- basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- amdahl)
- basic_machine=580-amdahl
- os=-sysv
- ;;
- amiga | amiga-*)
- basic_machine=m68k-unknown
- ;;
- amigaos | amigados)
- basic_machine=m68k-unknown
- os=-amigaos
- ;;
- amigaunix | amix)
- basic_machine=m68k-unknown
- os=-sysv4
- ;;
- apollo68)
- basic_machine=m68k-apollo
- os=-sysv
- ;;
- apollo68bsd)
- basic_machine=m68k-apollo
- os=-bsd
- ;;
- aros)
- basic_machine=i386-pc
- os=-aros
- ;;
- aux)
- basic_machine=m68k-apple
- os=-aux
- ;;
- balance)
- basic_machine=ns32k-sequent
- os=-dynix
- ;;
- blackfin)
- basic_machine=bfin-unknown
- os=-linux
- ;;
- blackfin-*)
- basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
- os=-linux
- ;;
- bluegene*)
- basic_machine=powerpc-ibm
- os=-cnk
- ;;
- c90)
- basic_machine=c90-cray
- os=-unicos
- ;;
- cegcc)
- basic_machine=arm-unknown
- os=-cegcc
- ;;
- convex-c1)
- basic_machine=c1-convex
- os=-bsd
- ;;
- convex-c2)
- basic_machine=c2-convex
- os=-bsd
- ;;
- convex-c32)
- basic_machine=c32-convex
- os=-bsd
- ;;
- convex-c34)
- basic_machine=c34-convex
- os=-bsd
- ;;
- convex-c38)
- basic_machine=c38-convex
- os=-bsd
- ;;
- cray | j90)
- basic_machine=j90-cray
- os=-unicos
- ;;
- craynv)
- basic_machine=craynv-cray
- os=-unicosmp
- ;;
- cr16)
- basic_machine=cr16-unknown
- os=-elf
- ;;
- crds | unos)
- basic_machine=m68k-crds
- ;;
- crisv32 | crisv32-* | etraxfs*)
- basic_machine=crisv32-axis
- ;;
- cris | cris-* | etrax*)
- basic_machine=cris-axis
- ;;
- crx)
- basic_machine=crx-unknown
- os=-elf
- ;;
- da30 | da30-*)
- basic_machine=m68k-da30
- ;;
- decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
- basic_machine=mips-dec
- ;;
- decsystem10* | dec10*)
- basic_machine=pdp10-dec
- os=-tops10
- ;;
- decsystem20* | dec20*)
- basic_machine=pdp10-dec
- os=-tops20
- ;;
- delta | 3300 | motorola-3300 | motorola-delta \
- | 3300-motorola | delta-motorola)
- basic_machine=m68k-motorola
- ;;
- delta88)
- basic_machine=m88k-motorola
- os=-sysv3
- ;;
- dicos)
- basic_machine=i686-pc
- os=-dicos
- ;;
- djgpp)
- basic_machine=i586-pc
- os=-msdosdjgpp
- ;;
- dpx20 | dpx20-*)
- basic_machine=rs6000-bull
- os=-bosx
- ;;
- dpx2* | dpx2*-bull)
- basic_machine=m68k-bull
- os=-sysv3
- ;;
- ebmon29k)
- basic_machine=a29k-amd
- os=-ebmon
- ;;
- elxsi)
- basic_machine=elxsi-elxsi
- os=-bsd
- ;;
- encore | umax | mmax)
- basic_machine=ns32k-encore
- ;;
- es1800 | OSE68k | ose68k | ose | OSE)
- basic_machine=m68k-ericsson
- os=-ose
- ;;
- fx2800)
- basic_machine=i860-alliant
- ;;
- genix)
- basic_machine=ns32k-ns
- ;;
- gmicro)
- basic_machine=tron-gmicro
- os=-sysv
- ;;
- go32)
- basic_machine=i386-pc
- os=-go32
- ;;
- h3050r* | hiux*)
- basic_machine=hppa1.1-hitachi
- os=-hiuxwe2
- ;;
- h8300hms)
- basic_machine=h8300-hitachi
- os=-hms
- ;;
- h8300xray)
- basic_machine=h8300-hitachi
- os=-xray
- ;;
- h8500hms)
- basic_machine=h8500-hitachi
- os=-hms
- ;;
- harris)
- basic_machine=m88k-harris
- os=-sysv3
- ;;
- hp300-*)
- basic_machine=m68k-hp
- ;;
- hp300bsd)
- basic_machine=m68k-hp
- os=-bsd
- ;;
- hp300hpux)
- basic_machine=m68k-hp
- os=-hpux
- ;;
- hp3k9[0-9][0-9] | hp9[0-9][0-9])
- basic_machine=hppa1.0-hp
- ;;
- hp9k2[0-9][0-9] | hp9k31[0-9])
- basic_machine=m68000-hp
- ;;
- hp9k3[2-9][0-9])
- basic_machine=m68k-hp
- ;;
- hp9k6[0-9][0-9] | hp6[0-9][0-9])
- basic_machine=hppa1.0-hp
- ;;
- hp9k7[0-79][0-9] | hp7[0-79][0-9])
- basic_machine=hppa1.1-hp
- ;;
- hp9k78[0-9] | hp78[0-9])
- # FIXME: really hppa2.0-hp
- basic_machine=hppa1.1-hp
- ;;
- hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
- # FIXME: really hppa2.0-hp
- basic_machine=hppa1.1-hp
- ;;
- hp9k8[0-9][13679] | hp8[0-9][13679])
- basic_machine=hppa1.1-hp
- ;;
- hp9k8[0-9][0-9] | hp8[0-9][0-9])
- basic_machine=hppa1.0-hp
- ;;
- hppa-next)
- os=-nextstep3
- ;;
- hppaosf)
- basic_machine=hppa1.1-hp
- os=-osf
- ;;
- hppro)
- basic_machine=hppa1.1-hp
- os=-proelf
- ;;
- i370-ibm* | ibm*)
- basic_machine=i370-ibm
- ;;
-# I'm not sure what "Sysv32" means. Should this be sysv3.2?
- i*86v32)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-sysv32
- ;;
- i*86v4*)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-sysv4
- ;;
- i*86v)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-sysv
- ;;
- i*86sol2)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-solaris2
- ;;
- i386mach)
- basic_machine=i386-mach
- os=-mach
- ;;
- i386-vsta | vsta)
- basic_machine=i386-unknown
- os=-vsta
- ;;
- iris | iris4d)
- basic_machine=mips-sgi
- case $os in
- -irix*)
- ;;
- *)
- os=-irix4
- ;;
- esac
- ;;
- isi68 | isi)
- basic_machine=m68k-isi
- os=-sysv
- ;;
- m68knommu)
- basic_machine=m68k-unknown
- os=-linux
- ;;
- m68knommu-*)
- basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
- os=-linux
- ;;
- m88k-omron*)
- basic_machine=m88k-omron
- ;;
- magnum | m3230)
- basic_machine=mips-mips
- os=-sysv
- ;;
- merlin)
- basic_machine=ns32k-utek
- os=-sysv
- ;;
- microblaze)
- basic_machine=microblaze-xilinx
- ;;
- mingw32)
- basic_machine=i386-pc
- os=-mingw32
- ;;
- mingw32ce)
- basic_machine=arm-unknown
- os=-mingw32ce
- ;;
- miniframe)
- basic_machine=m68000-convergent
- ;;
- *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
- basic_machine=m68k-atari
- os=-mint
- ;;
- mips3*-*)
- basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
- ;;
- mips3*)
- basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
- ;;
- monitor)
- basic_machine=m68k-rom68k
- os=-coff
- ;;
- morphos)
- basic_machine=powerpc-unknown
- os=-morphos
- ;;
- msdos)
- basic_machine=i386-pc
- os=-msdos
- ;;
- ms1-*)
- basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
- ;;
- mvs)
- basic_machine=i370-ibm
- os=-mvs
- ;;
- ncr3000)
- basic_machine=i486-ncr
- os=-sysv4
- ;;
- netbsd386)
- basic_machine=i386-unknown
- os=-netbsd
- ;;
- netwinder)
- basic_machine=armv4l-rebel
- os=-linux
- ;;
- news | news700 | news800 | news900)
- basic_machine=m68k-sony
- os=-newsos
- ;;
- news1000)
- basic_machine=m68030-sony
- os=-newsos
- ;;
- news-3600 | risc-news)
- basic_machine=mips-sony
- os=-newsos
- ;;
- necv70)
- basic_machine=v70-nec
- os=-sysv
- ;;
- next | m*-next )
- basic_machine=m68k-next
- case $os in
- -nextstep* )
- ;;
- -ns2*)
- os=-nextstep2
- ;;
- *)
- os=-nextstep3
- ;;
- esac
- ;;
- nh3000)
- basic_machine=m68k-harris
- os=-cxux
- ;;
- nh[45]000)
- basic_machine=m88k-harris
- os=-cxux
- ;;
- nindy960)
- basic_machine=i960-intel
- os=-nindy
- ;;
- mon960)
- basic_machine=i960-intel
- os=-mon960
- ;;
- nonstopux)
- basic_machine=mips-compaq
- os=-nonstopux
- ;;
- np1)
- basic_machine=np1-gould
- ;;
- nsr-tandem)
- basic_machine=nsr-tandem
- ;;
- op50n-* | op60c-*)
- basic_machine=hppa1.1-oki
- os=-proelf
- ;;
- openrisc | openrisc-*)
- basic_machine=or32-unknown
- ;;
- os400)
- basic_machine=powerpc-ibm
- os=-os400
- ;;
- OSE68000 | ose68000)
- basic_machine=m68000-ericsson
- os=-ose
- ;;
- os68k)
- basic_machine=m68k-none
- os=-os68k
- ;;
- pa-hitachi)
- basic_machine=hppa1.1-hitachi
- os=-hiuxwe2
- ;;
- paragon)
- basic_machine=i860-intel
- os=-osf
- ;;
- parisc)
- basic_machine=hppa-unknown
- os=-linux
- ;;
- parisc-*)
- basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
- os=-linux
- ;;
- pbd)
- basic_machine=sparc-tti
- ;;
- pbb)
- basic_machine=m68k-tti
- ;;
- pc532 | pc532-*)
- basic_machine=ns32k-pc532
- ;;
- pc98)
- basic_machine=i386-pc
- ;;
- pc98-*)
- basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pentium | p5 | k5 | k6 | nexgen | viac3)
- basic_machine=i586-pc
- ;;
- pentiumpro | p6 | 6x86 | athlon | athlon_*)
- basic_machine=i686-pc
- ;;
- pentiumii | pentium2 | pentiumiii | pentium3)
- basic_machine=i686-pc
- ;;
- pentium4)
- basic_machine=i786-pc
- ;;
- pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
- basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pentiumpro-* | p6-* | 6x86-* | athlon-*)
- basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
- basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pentium4-*)
- basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pn)
- basic_machine=pn-gould
- ;;
- power) basic_machine=power-ibm
- ;;
- ppc) basic_machine=powerpc-unknown
- ;;
- ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- ppcle | powerpclittle | ppc-le | powerpc-little)
- basic_machine=powerpcle-unknown
- ;;
- ppcle-* | powerpclittle-*)
- basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- ppc64) basic_machine=powerpc64-unknown
- ;;
- ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- ppc64le | powerpc64little | ppc64-le | powerpc64-little)
- basic_machine=powerpc64le-unknown
- ;;
- ppc64le-* | powerpc64little-*)
- basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- ps2)
- basic_machine=i386-ibm
- ;;
- pw32)
- basic_machine=i586-unknown
- os=-pw32
- ;;
- rdos)
- basic_machine=i386-pc
- os=-rdos
- ;;
- rom68k)
- basic_machine=m68k-rom68k
- os=-coff
- ;;
- rm[46]00)
- basic_machine=mips-siemens
- ;;
- rtpc | rtpc-*)
- basic_machine=romp-ibm
- ;;
- s390 | s390-*)
- basic_machine=s390-ibm
- ;;
- s390x | s390x-*)
- basic_machine=s390x-ibm
- ;;
- sa29200)
- basic_machine=a29k-amd
- os=-udi
- ;;
- sb1)
- basic_machine=mipsisa64sb1-unknown
- ;;
- sb1el)
- basic_machine=mipsisa64sb1el-unknown
- ;;
- sde)
- basic_machine=mipsisa32-sde
- os=-elf
- ;;
- sei)
- basic_machine=mips-sei
- os=-seiux
- ;;
- sequent)
- basic_machine=i386-sequent
- ;;
- sh)
- basic_machine=sh-hitachi
- os=-hms
- ;;
- sh5el)
- basic_machine=sh5le-unknown
- ;;
- sh64)
- basic_machine=sh64-unknown
- ;;
- sparclite-wrs | simso-wrs)
- basic_machine=sparclite-wrs
- os=-vxworks
- ;;
- sps7)
- basic_machine=m68k-bull
- os=-sysv2
- ;;
- spur)
- basic_machine=spur-unknown
- ;;
- st2000)
- basic_machine=m68k-tandem
- ;;
- stratus)
- basic_machine=i860-stratus
- os=-sysv4
- ;;
- sun2)
- basic_machine=m68000-sun
- ;;
- sun2os3)
- basic_machine=m68000-sun
- os=-sunos3
- ;;
- sun2os4)
- basic_machine=m68000-sun
- os=-sunos4
- ;;
- sun3os3)
- basic_machine=m68k-sun
- os=-sunos3
- ;;
- sun3os4)
- basic_machine=m68k-sun
- os=-sunos4
- ;;
- sun4os3)
- basic_machine=sparc-sun
- os=-sunos3
- ;;
- sun4os4)
- basic_machine=sparc-sun
- os=-sunos4
- ;;
- sun4sol2)
- basic_machine=sparc-sun
- os=-solaris2
- ;;
- sun3 | sun3-*)
- basic_machine=m68k-sun
- ;;
- sun4)
- basic_machine=sparc-sun
- ;;
- sun386 | sun386i | roadrunner)
- basic_machine=i386-sun
- ;;
- sv1)
- basic_machine=sv1-cray
- os=-unicos
- ;;
- symmetry)
- basic_machine=i386-sequent
- os=-dynix
- ;;
- t3e)
- basic_machine=alphaev5-cray
- os=-unicos
- ;;
- t90)
- basic_machine=t90-cray
- os=-unicos
- ;;
- tic54x | c54x*)
- basic_machine=tic54x-unknown
- os=-coff
- ;;
- tic55x | c55x*)
- basic_machine=tic55x-unknown
- os=-coff
- ;;
- tic6x | c6x*)
- basic_machine=tic6x-unknown
- os=-coff
- ;;
- tile*)
- basic_machine=tile-unknown
- os=-linux-gnu
- ;;
- tx39)
- basic_machine=mipstx39-unknown
- ;;
- tx39el)
- basic_machine=mipstx39el-unknown
- ;;
- toad1)
- basic_machine=pdp10-xkl
- os=-tops20
- ;;
- tower | tower-32)
- basic_machine=m68k-ncr
- ;;
- tpf)
- basic_machine=s390x-ibm
- os=-tpf
- ;;
- udi29k)
- basic_machine=a29k-amd
- os=-udi
- ;;
- ultra3)
- basic_machine=a29k-nyu
- os=-sym1
- ;;
- v810 | necv810)
- basic_machine=v810-nec
- os=-none
- ;;
- vaxv)
- basic_machine=vax-dec
- os=-sysv
- ;;
- vms)
- basic_machine=vax-dec
- os=-vms
- ;;
- vpp*|vx|vx-*)
- basic_machine=f301-fujitsu
- ;;
- vxworks960)
- basic_machine=i960-wrs
- os=-vxworks
- ;;
- vxworks68)
- basic_machine=m68k-wrs
- os=-vxworks
- ;;
- vxworks29k)
- basic_machine=a29k-wrs
- os=-vxworks
- ;;
- w65*)
- basic_machine=w65-wdc
- os=-none
- ;;
- w89k-*)
- basic_machine=hppa1.1-winbond
- os=-proelf
- ;;
- xbox)
- basic_machine=i686-pc
- os=-mingw32
- ;;
- xps | xps100)
- basic_machine=xps100-honeywell
- ;;
- ymp)
- basic_machine=ymp-cray
- os=-unicos
- ;;
- z8k-*-coff)
- basic_machine=z8k-unknown
- os=-sim
- ;;
- z80-*-coff)
- basic_machine=z80-unknown
- os=-sim
- ;;
- none)
- basic_machine=none-none
- os=-none
- ;;
-
-# Here we handle the default manufacturer of certain CPU types. It is in
-# some cases the only manufacturer, in others, it is the most popular.
- w89k)
- basic_machine=hppa1.1-winbond
- ;;
- op50n)
- basic_machine=hppa1.1-oki
- ;;
- op60c)
- basic_machine=hppa1.1-oki
- ;;
- romp)
- basic_machine=romp-ibm
- ;;
- mmix)
- basic_machine=mmix-knuth
- ;;
- rs6000)
- basic_machine=rs6000-ibm
- ;;
- vax)
- basic_machine=vax-dec
- ;;
- pdp10)
- # there are many clones, so DEC is not a safe bet
- basic_machine=pdp10-unknown
- ;;
- pdp11)
- basic_machine=pdp11-dec
- ;;
- we32k)
- basic_machine=we32k-att
- ;;
- sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
- basic_machine=sh-unknown
- ;;
- sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
- basic_machine=sparc-sun
- ;;
- cydra)
- basic_machine=cydra-cydrome
- ;;
- orion)
- basic_machine=orion-highlevel
- ;;
- orion105)
- basic_machine=clipper-highlevel
- ;;
- mac | mpw | mac-mpw)
- basic_machine=m68k-apple
- ;;
- pmac | pmac-mpw)
- basic_machine=powerpc-apple
- ;;
- *-unknown)
- # Make sure to match an already-canonicalized machine name.
- ;;
- *)
- echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
- exit 1
- ;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
- *-digital*)
- basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
- ;;
- *-commodore*)
- basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
- ;;
- *)
- ;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if [ x"$os" != x"" ]
-then
-case $os in
- # First match some system type aliases
- # that might get confused with valid system types.
- # -solaris* is a basic system type, with this one exception.
- -auroraux)
- os=-auroraux
- ;;
- -solaris1 | -solaris1.*)
- os=`echo $os | sed -e 's|solaris1|sunos4|'`
- ;;
- -solaris)
- os=-solaris2
- ;;
- -svr4*)
- os=-sysv4
- ;;
- -unixware*)
- os=-sysv4.2uw
- ;;
- -gnu/linux*)
- os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
- ;;
- # First accept the basic system types.
- # The portable systems comes first.
- # Each alternative MUST END IN A *, to match a version number.
- # -sysv* is not here because it comes later, after sysvr4.
- -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
- | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
- | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
- | -sym* | -kopensolaris* \
- | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
- | -aos* | -aros* \
- | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
- | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
- | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
- | -openbsd* | -solidbsd* \
- | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
- | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
- | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
- | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
- | -chorusos* | -chorusrdb* | -cegcc* \
- | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
- | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
- | -uxpv* | -beos* | -mpeix* | -udk* \
- | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
- | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
- | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
- | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
- | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
- | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
- | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
- # Remember, each alternative MUST END IN *, to match a version number.
- ;;
- -qnx*)
- case $basic_machine in
- x86-* | i*86-*)
- ;;
- *)
- os=-nto$os
- ;;
- esac
- ;;
- -nto-qnx*)
- ;;
- -nto*)
- os=`echo $os | sed -e 's|nto|nto-qnx|'`
- ;;
- -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
- | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
- | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
- ;;
- -mac*)
- os=`echo $os | sed -e 's|mac|macos|'`
- ;;
- -linux-dietlibc)
- os=-linux-dietlibc
- ;;
- -linux*)
- os=`echo $os | sed -e 's|linux|linux-gnu|'`
- ;;
- -sunos5*)
- os=`echo $os | sed -e 's|sunos5|solaris2|'`
- ;;
- -sunos6*)
- os=`echo $os | sed -e 's|sunos6|solaris3|'`
- ;;
- -opened*)
- os=-openedition
- ;;
- -os400*)
- os=-os400
- ;;
- -wince*)
- os=-wince
- ;;
- -osfrose*)
- os=-osfrose
- ;;
- -osf*)
- os=-osf
- ;;
- -utek*)
- os=-bsd
- ;;
- -dynix*)
- os=-bsd
- ;;
- -acis*)
- os=-aos
- ;;
- -atheos*)
- os=-atheos
- ;;
- -syllable*)
- os=-syllable
- ;;
- -386bsd)
- os=-bsd
- ;;
- -ctix* | -uts*)
- os=-sysv
- ;;
- -nova*)
- os=-rtmk-nova
- ;;
- -ns2 )
- os=-nextstep2
- ;;
- -nsk*)
- os=-nsk
- ;;
- # Preserve the version number of sinix5.
- -sinix5.*)
- os=`echo $os | sed -e 's|sinix|sysv|'`
- ;;
- -sinix*)
- os=-sysv4
- ;;
- -tpf*)
- os=-tpf
- ;;
- -triton*)
- os=-sysv3
- ;;
- -oss*)
- os=-sysv3
- ;;
- -svr4)
- os=-sysv4
- ;;
- -svr3)
- os=-sysv3
- ;;
- -sysvr4)
- os=-sysv4
- ;;
- # This must come after -sysvr4.
- -sysv*)
- ;;
- -ose*)
- os=-ose
- ;;
- -es1800*)
- os=-ose
- ;;
- -xenix)
- os=-xenix
- ;;
- -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
- os=-mint
- ;;
- -aros*)
- os=-aros
- ;;
- -kaos*)
- os=-kaos
- ;;
- -zvmoe)
- os=-zvmoe
- ;;
- -dicos*)
- os=-dicos
- ;;
- -none)
- ;;
- *)
- # Get rid of the `-' at the beginning of $os.
- os=`echo $os | sed 's/[^-]*-//'`
- echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
- exit 1
- ;;
-esac
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system. Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-case $basic_machine in
- score-*)
- os=-elf
- ;;
- spu-*)
- os=-elf
- ;;
- *-acorn)
- os=-riscix1.2
- ;;
- arm*-rebel)
- os=-linux
- ;;
- arm*-semi)
- os=-aout
- ;;
- c4x-* | tic4x-*)
- os=-coff
- ;;
- # This must come before the *-dec entry.
- pdp10-*)
- os=-tops20
- ;;
- pdp11-*)
- os=-none
- ;;
- *-dec | vax-*)
- os=-ultrix4.2
- ;;
- m68*-apollo)
- os=-domain
- ;;
- i386-sun)
- os=-sunos4.0.2
- ;;
- m68000-sun)
- os=-sunos3
- # This also exists in the configure program, but was not the
- # default.
- # os=-sunos4
- ;;
- m68*-cisco)
- os=-aout
- ;;
- mep-*)
- os=-elf
- ;;
- mips*-cisco)
- os=-elf
- ;;
- mips*-*)
- os=-elf
- ;;
- or32-*)
- os=-coff
- ;;
- *-tti) # must be before sparc entry or we get the wrong os.
- os=-sysv3
- ;;
- sparc-* | *-sun)
- os=-sunos4.1.1
- ;;
- *-be)
- os=-beos
- ;;
- *-haiku)
- os=-haiku
- ;;
- *-ibm)
- os=-aix
- ;;
- *-knuth)
- os=-mmixware
- ;;
- *-wec)
- os=-proelf
- ;;
- *-winbond)
- os=-proelf
- ;;
- *-oki)
- os=-proelf
- ;;
- *-hp)
- os=-hpux
- ;;
- *-hitachi)
- os=-hiux
- ;;
- i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
- os=-sysv
- ;;
- *-cbm)
- os=-amigaos
- ;;
- *-dg)
- os=-dgux
- ;;
- *-dolphin)
- os=-sysv3
- ;;
- m68k-ccur)
- os=-rtu
- ;;
- m88k-omron*)
- os=-luna
- ;;
- *-next )
- os=-nextstep
- ;;
- *-sequent)
- os=-ptx
- ;;
- *-crds)
- os=-unos
- ;;
- *-ns)
- os=-genix
- ;;
- i370-*)
- os=-mvs
- ;;
- *-next)
- os=-nextstep3
- ;;
- *-gould)
- os=-sysv
- ;;
- *-highlevel)
- os=-bsd
- ;;
- *-encore)
- os=-bsd
- ;;
- *-sgi)
- os=-irix
- ;;
- *-siemens)
- os=-sysv4
- ;;
- *-masscomp)
- os=-rtu
- ;;
- f30[01]-fujitsu | f700-fujitsu)
- os=-uxpv
- ;;
- *-rom68k)
- os=-coff
- ;;
- *-*bug)
- os=-coff
- ;;
- *-apple)
- os=-macos
- ;;
- *-atari*)
- os=-mint
- ;;
- *)
- os=-none
- ;;
-esac
-fi
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer. We pick the logical manufacturer.
-vendor=unknown
-case $basic_machine in
- *-unknown)
- case $os in
- -riscix*)
- vendor=acorn
- ;;
- -sunos*)
- vendor=sun
- ;;
- -cnk*|-aix*)
- vendor=ibm
- ;;
- -beos*)
- vendor=be
- ;;
- -hpux*)
- vendor=hp
- ;;
- -mpeix*)
- vendor=hp
- ;;
- -hiux*)
- vendor=hitachi
- ;;
- -unos*)
- vendor=crds
- ;;
- -dgux*)
- vendor=dg
- ;;
- -luna*)
- vendor=omron
- ;;
- -genix*)
- vendor=ns
- ;;
- -mvs* | -opened*)
- vendor=ibm
- ;;
- -os400*)
- vendor=ibm
- ;;
- -ptx*)
- vendor=sequent
- ;;
- -tpf*)
- vendor=ibm
- ;;
- -vxsim* | -vxworks* | -windiss*)
- vendor=wrs
- ;;
- -aux*)
- vendor=apple
- ;;
- -hms*)
- vendor=hitachi
- ;;
- -mpw* | -macos*)
- vendor=apple
- ;;
- -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
- vendor=atari
- ;;
- -vos*)
- vendor=stratus
- ;;
- esac
- basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
- ;;
-esac
-
-echo $basic_machine$os
-exit
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/src/3rdparty/libpng/configure.ac b/src/3rdparty/libpng/configure.ac
deleted file mode 100644
index ff277a4d66..0000000000
--- a/src/3rdparty/libpng/configure.ac
+++ /dev/null
@@ -1,167 +0,0 @@
-# configure.ac
-
-dnl Process this file with autoconf to produce a configure script.
-dnl
-dnl Minor upgrades (compatible ABI): increment the package version
-dnl (third field in two places below) and set the PNGLIB_RELEASE
-dnl variable.
-dnl
-dnl Major upgrades (incompatible ABI): increment the package major
-dnl version (second field, or first if desired), set the minor
-dnl to 0, set PNGLIB_MAJOR below *and* follow the instructions in
-dnl Makefile.am to upgrade the package name.
-
-dnl This is here to prevent earlier autoconf from being used, it
-dnl should not be necessary to regenerate configure if the time
-dnl stamps are correct
-AC_PREREQ(2.59)
-
-dnl Version number stuff here:
-
-AC_INIT([libpng], [1.5.1], [png-mng-implement@lists.sourceforge.net])
-AM_INIT_AUTOMAKE
-dnl stop configure from automagically running automake
-AM_MAINTAINER_MODE
-
-PNGLIB_VERSION=1.5.1
-PNGLIB_MAJOR=1
-PNGLIB_MINOR=5
-PNGLIB_RELEASE=1
-
-dnl End of version number stuff
-
-AC_CONFIG_SRCDIR([pngget.c])
-AM_CONFIG_HEADER(config.h)
-
-# Checks for programs.
-AC_LANG([C])
-AC_PROG_CC
-AC_PROG_LD
-AC_PROG_CPP
-AC_CHECK_TOOL(SED, sed, :)
-AC_CHECK_TOOL(AWK, awk, :)
-AC_PROG_INSTALL
-AC_PROG_LN_S
-AC_PROG_MAKE_SET
-LT_INIT([win32-dll])
-
-# On Solaris 10 and 12 CPP gets set to cc -E, however this still
-# does some input parsing. We need strict ANSI-C style tokenization,
-# check this:
-AC_REQUIRE_CPP
-AC_MSG_CHECKING([for a C preprocessor that does not parse its input])
-AC_TRY_CPP([1.5.0 16BIT],
- [DFNCPP="$CPP"],
- [DFNCPP=""
- sav_CPP="$CPP"
- for CPP in "${CC-cc} -E" "${CC-cc} -E -traditional-cpp" "/lib/cpp" "cpp"; do
- AC_TRY_CPP([1.5.0 16BIT],
- [DFNCPP="$CPP"]
- [break],,)
- done
- CPP="$sav_CPP"])
-if test -n "$DFNCPP"; then
- AC_MSG_RESULT([$DFNCPP])
- AC_SUBST(DFNCPP)
-else
- AC_MSG_FAILURE([not found], 1)
-fi
-
-# Checks for header files.
-AC_HEADER_STDC
-AC_CHECK_HEADERS([malloc.h stdlib.h string.h strings.h])
-
-# Checks for typedefs, structures, and compiler characteristics.
-AC_C_CONST
-AC_TYPE_SIZE_T
-AC_STRUCT_TM
-
-# Checks for library functions.
-AC_FUNC_STRTOD
-AC_CHECK_FUNCS([memset], , AC_ERROR([memset not found in libc]))
-AC_CHECK_FUNCS([pow], , AC_CHECK_LIB(m, pow, , AC_ERROR([cannot find pow])) )
-AC_ARG_WITH(zlib-prefix,
- AC_HELP_STRING([--with-zlib-prefix],
- [prefix that may have been used in installed zlib]),
- [ZPREFIX=${withval}],
- [ZPREFIX='z_'])
-AC_CHECK_LIB(z, zlibVersion, ,
- AC_CHECK_LIB(z, ${ZPREFIX}zlibVersion, ,
- AC_ERROR([zlib not installed])))
-
-
-LIBPNG_DEFINES=-DPNG_CONFIGURE_LIBPNG
-LIBPNG_DEFINES=$LIBPNG_DEFINES
-AC_SUBST(LIBPNG_DEFINES)
-
-AC_MSG_CHECKING([if libraries can be versioned])
-# Special case for PE/COFF platforms: ld reports
-# support for version-script, but doesn't actually
-# DO anything with it.
-case $host in
-*cygwin* | *mingw32* | *interix* )
- have_ld_version_script=no
- AC_MSG_RESULT(no)
-;;
-* )
-GLD=`$LD --help < /dev/null 2>/dev/null | grep version-script`
-if test "$GLD"; then
- have_ld_version_script=yes
- AC_MSG_RESULT(yes)
-else
- have_ld_version_script=no
- AC_MSG_RESULT(no)
- AC_MSG_WARN(*** You have not enabled versioned symbols.)
-fi
-;;
-esac
-
-AM_CONDITIONAL(HAVE_LD_VERSION_SCRIPT, test "$have_ld_version_script" = "yes")
-
-if test "$have_ld_version_script" = "yes"; then
- AC_MSG_CHECKING([for symbol prefix])
- SYMBOL_PREFIX=`echo "PREFIX=__USER_LABEL_PREFIX__" \
- | ${CPP-${CC-gcc} -E} - 2>&1 \
- | ${EGREP-grep} "^PREFIX=" \
- | ${SED-sed} "s:^PREFIX=::"`
- AC_SUBST(SYMBOL_PREFIX)
- AC_MSG_RESULT($SYMBOL_PREFIX)
-fi
-
-# Substitutions for .in files
-AC_SUBST(PNGLIB_VERSION)
-AC_SUBST(PNGLIB_MAJOR)
-AC_SUBST(PNGLIB_MINOR)
-AC_SUBST(PNGLIB_RELEASE)
-
-# Additional arguments (and substitutions)
-# Allow the pkg-config directory to be set
-AC_ARG_WITH(pkgconfigdir,
- AC_HELP_STRING([--with-pkgconfigdir],
- [Use the specified pkgconfig dir (default is libdir/pkgconfig)]),
- [pkgconfigdir=${withval}],
- [pkgconfigdir='${libdir}/pkgconfig'])
-
-AC_SUBST([pkgconfigdir])
-AC_MSG_NOTICE([pkgconfig directory is ${pkgconfigdir}])
-
-# Make the *-config binary config scripts optional
-AC_ARG_WITH(binconfigs,
- AC_HELP_STRING([--with-binconfigs],
- [Generate shell libpng-config scripts as well as pkg-config data]
- [@<:@default=yes@:>@]),
- [if test "${withval}" = no; then
- binconfigs=
- AC_MSG_NOTICE([libpng-config scripts will not be built])
- else
- binconfigs='${binconfigs}'
- fi],
- [binconfigs='${binconfigs}'])
-AC_SUBST([binconfigs])
-
-# Config files, substituting as above
-AC_CONFIG_FILES([Makefile libpng.pc:libpng.pc.in])
-AC_CONFIG_FILES([libpng-config:libpng-config.in],
- [chmod +x libpng-config])
-
-AC_OUTPUT
diff --git a/src/3rdparty/libpng/example.c b/src/3rdparty/libpng/example.c
deleted file mode 100644
index cd3682f014..0000000000
--- a/src/3rdparty/libpng/example.c
+++ /dev/null
@@ -1,843 +0,0 @@
-
-#if 0 /* in case someone actually tries to compile this */
-
-/* example.c - an example of using libpng
- * Last changed in libpng 1.5.0 [January 6, 2011]
- * This file has been placed in the public domain by the authors.
- * Maintained 1998-2011 Glenn Randers-Pehrson
- * Maintained 1996, 1997 Andreas Dilger)
- * Written 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
- */
-
-/* This is an example of how to use libpng to read and write PNG files.
- * The file libpng-manual.txt is much more verbose then this. If you have not
- * read it, do so first. This was designed to be a starting point of an
- * implementation. This is not officially part of libpng, is hereby placed
- * in the public domain, and therefore does not require a copyright notice.
- *
- * This file does not currently compile, because it is missing certain
- * parts, like allocating memory to hold an image. You will have to
- * supply these parts to get it to compile. For an example of a minimal
- * working PNG reader/writer, see pngtest.c, included in this distribution;
- * see also the programs in the contrib directory.
- */
-
-#include "png.h"
-
- /* The png_jmpbuf() macro, used in error handling, became available in
- * libpng version 1.0.6. If you want to be able to run your code with older
- * versions of libpng, you must define the macro yourself (but only if it
- * is not already defined by libpng!).
- */
-
-#ifndef png_jmpbuf
-# define png_jmpbuf(png_ptr) ((png_ptr)->png_jmpbuf)
-#endif
-
-/* Check to see if a file is a PNG file using png_sig_cmp(). png_sig_cmp()
- * returns zero if the image is a PNG and nonzero if it isn't a PNG.
- *
- * The function check_if_png() shown here, but not used, returns nonzero (true)
- * if the file can be opened and is a PNG, 0 (false) otherwise.
- *
- * If this call is successful, and you are going to keep the file open,
- * you should call png_set_sig_bytes(png_ptr, PNG_BYTES_TO_CHECK); once
- * you have created the png_ptr, so that libpng knows your application
- * has read that many bytes from the start of the file. Make sure you
- * don't call png_set_sig_bytes() with more than 8 bytes read or give it
- * an incorrect number of bytes read, or you will either have read too
- * many bytes (your fault), or you are telling libpng to read the wrong
- * number of magic bytes (also your fault).
- *
- * Many applications already read the first 2 or 4 bytes from the start
- * of the image to determine the file type, so it would be easiest just
- * to pass the bytes to png_sig_cmp() or even skip that if you know
- * you have a PNG file, and call png_set_sig_bytes().
- */
-#define PNG_BYTES_TO_CHECK 4
-int check_if_png(char *file_name, FILE **fp)
-{
- char buf[PNG_BYTES_TO_CHECK];
-
- /* Open the prospective PNG file. */
- if ((*fp = fopen(file_name, "rb")) == NULL)
- return 0;
-
- /* Read in some of the signature bytes */
- if (fread(buf, 1, PNG_BYTES_TO_CHECK, *fp) != PNG_BYTES_TO_CHECK)
- return 0;
-
- /* Compare the first PNG_BYTES_TO_CHECK bytes of the signature.
- Return nonzero (true) if they match */
-
- return(!png_sig_cmp(buf, (png_size_t)0, PNG_BYTES_TO_CHECK));
-}
-
-/* Read a PNG file. You may want to return an error code if the read
- * fails (depending upon the failure). There are two "prototypes" given
- * here - one where we are given the filename, and we need to open the
- * file, and the other where we are given an open file (possibly with
- * some or all of the magic bytes read - see comments above).
- */
-#ifdef open_file /* prototype 1 */
-void read_png(char *file_name) /* We need to open the file */
-{
- png_structp png_ptr;
- png_infop info_ptr;
- unsigned int sig_read = 0;
- png_uint_32 width, height;
- int bit_depth, color_type, interlace_type;
- FILE *fp;
-
- if ((fp = fopen(file_name, "rb")) == NULL)
- return (ERROR);
-
-#else no_open_file /* prototype 2 */
-void read_png(FILE *fp, unsigned int sig_read) /* File is already open */
-{
- png_structp png_ptr;
- png_infop info_ptr;
- png_uint_32 width, height;
- int bit_depth, color_type, interlace_type;
-#endif no_open_file /* Only use one prototype! */
-
- /* Create and initialize the png_struct with the desired error handler
- * functions. If you want to use the default stderr and longjump method,
- * you can supply NULL for the last three parameters. We also supply the
- * the compiler header file version, so that we know if the application
- * was compiled with a compatible version of the library. REQUIRED
- */
- png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,
- png_voidp user_error_ptr, user_error_fn, user_warning_fn);
-
- if (png_ptr == NULL)
- {
- fclose(fp);
- return (ERROR);
- }
-
- /* Allocate/initialize the memory for image information. REQUIRED. */
- info_ptr = png_create_info_struct(png_ptr);
- if (info_ptr == NULL)
- {
- fclose(fp);
- png_destroy_read_struct(&png_ptr, NULL, NULL);
- return (ERROR);
- }
-
- /* Set error handling if you are using the setjmp/longjmp method (this is
- * the normal method of doing things with libpng). REQUIRED unless you
- * set up your own error handlers in the png_create_read_struct() earlier.
- */
-
- if (setjmp(png_jmpbuf(png_ptr)))
- {
- /* Free all of the memory associated with the png_ptr and info_ptr */
- png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
- fclose(fp);
- /* If we get here, we had a problem reading the file */
- return (ERROR);
- }
-
- /* One of the following I/O initialization methods is REQUIRED */
-#ifdef streams /* PNG file I/O method 1 */
- /* Set up the input control if you are using standard C streams */
- png_init_io(png_ptr, fp);
-
-#else no_streams /* PNG file I/O method 2 */
- /* If you are using replacement read functions, instead of calling
- * png_init_io() here you would call:
- */
- png_set_read_fn(png_ptr, (void *)user_io_ptr, user_read_fn);
- /* where user_io_ptr is a structure you want available to the callbacks */
-#endif no_streams /* Use only one I/O method! */
-
- /* If we have already read some of the signature */
- png_set_sig_bytes(png_ptr, sig_read);
-
-#ifdef hilevel
- /*
- * If you have enough memory to read in the entire image at once,
- * and you need to specify only transforms that can be controlled
- * with one of the PNG_TRANSFORM_* bits (this presently excludes
- * quantizing, filling, setting background, and doing gamma
- * adjustment), then you can read the entire image (including
- * pixels) into the info structure with this call:
- */
- png_read_png(png_ptr, info_ptr, png_transforms, NULL);
-
-#else
- /* OK, you're doing it the hard way, with the lower-level functions */
-
- /* The call to png_read_info() gives us all of the information from the
- * PNG file before the first IDAT (image data chunk). REQUIRED
- */
- png_read_info(png_ptr, info_ptr);
-
- png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type,
- &interlace_type, NULL, NULL);
-
- /* Set up the data transformations you want. Note that these are all
- * optional. Only call them if you want/need them. Many of the
- * transformations only work on specific types of images, and many
- * are mutually exclusive.
- */
-
- /* Tell libpng to strip 16 bit/color files down to 8 bits/color */
- png_set_strip_16(png_ptr);
-
- /* Strip alpha bytes from the input data without combining with the
- * background (not recommended).
- */
- png_set_strip_alpha(png_ptr);
-
- /* Extract multiple pixels with bit depths of 1, 2, and 4 from a single
- * byte into separate bytes (useful for paletted and grayscale images).
- */
- png_set_packing(png_ptr);
-
- /* Change the order of packed pixels to least significant bit first
- * (not useful if you are using png_set_packing). */
- png_set_packswap(png_ptr);
-
- /* Expand paletted colors into true RGB triplets */
- if (color_type == PNG_COLOR_TYPE_PALETTE)
- png_set_palette_to_rgb(png_ptr);
-
- /* Expand grayscale images to the full 8 bits from 1, 2, or 4 bits/pixel */
- if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
- png_set_expand_gray_1_2_4_to_8(png_ptr);
-
- /* Expand paletted or RGB images with transparency to full alpha channels
- * so the data will be available as RGBA quartets.
- */
- if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
- png_set_tRNS_to_alpha(png_ptr);
-
- /* Set the background color to draw transparent and alpha images over.
- * It is possible to set the red, green, and blue components directly
- * for paletted images instead of supplying a palette index. Note that
- * even if the PNG file supplies a background, you are not required to
- * use it - you should use the (solid) application background if it has one.
- */
-
- png_color_16 my_background, *image_background;
-
- if (png_get_bKGD(png_ptr, info_ptr, &image_background))
- png_set_background(png_ptr, image_background,
- PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
- else
- png_set_background(png_ptr, &my_background,
- PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0);
-
- /* Some suggestions as to how to get a screen gamma value
- *
- * Note that screen gamma is the display_exponent, which includes
- * the CRT_exponent and any correction for viewing conditions
- */
- if (/* We have a user-defined screen gamma value */)
- {
- screen_gamma = user-defined screen_gamma;
- }
- /* This is one way that applications share the same screen gamma value */
- else if ((gamma_str = getenv("SCREEN_GAMMA")) != NULL)
- {
- screen_gamma = atof(gamma_str);
- }
- /* If we don't have another value */
- else
- {
- screen_gamma = 2.2; /* A good guess for a PC monitor in a dimly
- lit room */
- screen_gamma = 1.7 or 1.0; /* A good guess for Mac systems */
- }
-
- /* Tell libpng to handle the gamma conversion for you. The final call
- * is a good guess for PC generated images, but it should be configurable
- * by the user at run time by the user. It is strongly suggested that
- * your application support gamma correction.
- */
-
- int intent;
-
- if (png_get_sRGB(png_ptr, info_ptr, &intent))
- png_set_gamma(png_ptr, screen_gamma, 0.45455);
- else
- {
- double image_gamma;
- if (png_get_gAMA(png_ptr, info_ptr, &image_gamma))
- png_set_gamma(png_ptr, screen_gamma, image_gamma);
- else
- png_set_gamma(png_ptr, screen_gamma, 0.45455);
- }
-
-#ifdef PNG_READ_QUANTIZE_SUPPORTED
- /* Quantize RGB files down to 8 bit palette or reduce palettes
- * to the number of colors available on your screen.
- */
- if (color_type & PNG_COLOR_MASK_COLOR)
- {
- int num_palette;
- png_colorp palette;
-
- /* This reduces the image to the application supplied palette */
- if (/* We have our own palette */)
- {
- /* An array of colors to which the image should be quantized */
- png_color std_color_cube[MAX_SCREEN_COLORS];
-
- png_set_quantize(png_ptr, std_color_cube, MAX_SCREEN_COLORS,
- MAX_SCREEN_COLORS, NULL, 0);
- }
- /* This reduces the image to the palette supplied in the file */
- else if (png_get_PLTE(png_ptr, info_ptr, &palette, &num_palette))
- {
- png_uint_16p histogram = NULL;
-
- png_get_hIST(png_ptr, info_ptr, &histogram);
-
- png_set_quantize(png_ptr, palette, num_palette,
- max_screen_colors, histogram, 0);
- }
- }
-#endif /* PNG_READ_QUANTIZE_SUPPORTED */
-
- /* Invert monochrome files to have 0 as white and 1 as black */
- png_set_invert_mono(png_ptr);
-
- /* If you want to shift the pixel values from the range [0,255] or
- * [0,65535] to the original [0,7] or [0,31], or whatever range the
- * colors were originally in:
- */
- if (png_get_valid(png_ptr, info_ptr, PNG_INFO_sBIT))
- {
- png_color_8p sig_bit_p;
-
- png_get_sBIT(png_ptr, info_ptr, &sig_bit_p);
- png_set_shift(png_ptr, sig_bit_p);
- }
-
- /* Flip the RGB pixels to BGR (or RGBA to BGRA) */
- if (color_type & PNG_COLOR_MASK_COLOR)
- png_set_bgr(png_ptr);
-
- /* Swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR) */
- png_set_swap_alpha(png_ptr);
-
- /* Swap bytes of 16 bit files to least significant byte first */
- png_set_swap(png_ptr);
-
- /* Add filler (or alpha) byte (before/after each RGB triplet) */
- png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER);
-
- /* Turn on interlace handling. REQUIRED if you are not using
- * png_read_image(). To see how to handle interlacing passes,
- * see the png_read_row() method below:
- */
- number_passes = png_set_interlace_handling(png_ptr);
-
- /* Optional call to gamma correct and add the background to the palette
- * and update info structure. REQUIRED if you are expecting libpng to
- * update the palette for you (ie you selected such a transform above).
- */
- png_read_update_info(png_ptr, info_ptr);
-
- /* Allocate the memory to hold the image using the fields of info_ptr. */
-
- /* The easiest way to read the image: */
- png_bytep row_pointers[height];
-
- /* Clear the pointer array */
- for (row = 0; row < height; row++)
- row_pointers[row] = NULL;
-
- for (row = 0; row < height; row++)
- row_pointers[row] = png_malloc(png_ptr, png_get_rowbytes(png_ptr,
- info_ptr));
-
- /* Now it's time to read the image. One of these methods is REQUIRED */
-#ifdef entire /* Read the entire image in one go */
- png_read_image(png_ptr, row_pointers);
-
-#else no_entire /* Read the image one or more scanlines at a time */
- /* The other way to read images - deal with interlacing: */
-
- for (pass = 0; pass < number_passes; pass++)
- {
-#ifdef single /* Read the image a single row at a time */
- for (y = 0; y < height; y++)
- {
- png_read_rows(png_ptr, &row_pointers[y], NULL, 1);
- }
-
-#else no_single /* Read the image several rows at a time */
- for (y = 0; y < height; y += number_of_rows)
- {
-#ifdef sparkle /* Read the image using the "sparkle" effect. */
- png_read_rows(png_ptr, &row_pointers[y], NULL,
- number_of_rows);
-#else no_sparkle /* Read the image using the "rectangle" effect */
- png_read_rows(png_ptr, NULL, &row_pointers[y],
- number_of_rows);
-#endif no_sparkle /* Use only one of these two methods */
- }
-
- /* If you want to display the image after every pass, do so here */
-#endif no_single /* Use only one of these two methods */
- }
-#endif no_entire /* Use only one of these two methods */
-
- /* Read rest of file, and get additional chunks in info_ptr - REQUIRED */
- png_read_end(png_ptr, info_ptr);
-#endif hilevel
-
- /* At this point you have read the entire image */
-
- /* Clean up after the read, and free any memory allocated - REQUIRED */
- png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
-
- /* Close the file */
- fclose(fp);
-
- /* That's it */
- return (OK);
-}
-
-/* Progressively read a file */
-
-int
-initialize_png_reader(png_structp *png_ptr, png_infop *info_ptr)
-{
- /* Create and initialize the png_struct with the desired error handler
- * functions. If you want to use the default stderr and longjump method,
- * you can supply NULL for the last three parameters. We also check that
- * the library version is compatible in case we are using dynamically
- * linked libraries.
- */
- *png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,
- png_voidp user_error_ptr, user_error_fn, user_warning_fn);
-
- if (*png_ptr == NULL)
- {
- *info_ptr = NULL;
- return (ERROR);
- }
-
- *info_ptr = png_create_info_struct(png_ptr);
-
- if (*info_ptr == NULL)
- {
- png_destroy_read_struct(png_ptr, info_ptr, NULL);
- return (ERROR);
- }
-
- if (setjmp(png_jmpbuf((*png_ptr))))
- {
- png_destroy_read_struct(png_ptr, info_ptr, NULL);
- return (ERROR);
- }
-
- /* This one's new. You will need to provide all three
- * function callbacks, even if you aren't using them all.
- * If you aren't using all functions, you can specify NULL
- * parameters. Even when all three functions are NULL,
- * you need to call png_set_progressive_read_fn().
- * These functions shouldn't be dependent on global or
- * static variables if you are decoding several images
- * simultaneously. You should store stream specific data
- * in a separate struct, given as the second parameter,
- * and retrieve the pointer from inside the callbacks using
- * the function png_get_progressive_ptr(png_ptr).
- */
- png_set_progressive_read_fn(*png_ptr, (void *)stream_data,
- info_callback, row_callback, end_callback);
-
- return (OK);
-}
-
-int
-process_data(png_structp *png_ptr, png_infop *info_ptr,
- png_bytep buffer, png_uint_32 length)
-{
- if (setjmp(png_jmpbuf((*png_ptr))))
- {
- /* Free the png_ptr and info_ptr memory on error */
- png_destroy_read_struct(png_ptr, info_ptr, NULL);
- return (ERROR);
- }
-
- /* This one's new also. Simply give it chunks of data as
- * they arrive from the data stream (in order, of course).
- * On segmented machines, don't give it any more than 64K.
- * The library seems to run fine with sizes of 4K, although
- * you can give it much less if necessary (I assume you can
- * give it chunks of 1 byte, but I haven't tried with less
- * than 256 bytes yet). When this function returns, you may
- * want to display any rows that were generated in the row
- * callback, if you aren't already displaying them there.
- */
- png_process_data(*png_ptr, *info_ptr, buffer, length);
- return (OK);
-}
-
-info_callback(png_structp png_ptr, png_infop info)
-{
- /* Do any setup here, including setting any of the transformations
- * mentioned in the Reading PNG files section. For now, you _must_
- * call either png_start_read_image() or png_read_update_info()
- * after all the transformations are set (even if you don't set
- * any). You may start getting rows before png_process_data()
- * returns, so this is your last chance to prepare for that.
- */
-}
-
-row_callback(png_structp png_ptr, png_bytep new_row,
- png_uint_32 row_num, int pass)
-{
- /*
- * This function is called for every row in the image. If the
- * image is interlaced, and you turned on the interlace handler,
- * this function will be called for every row in every pass.
- *
- * In this function you will receive a pointer to new row data from
- * libpng called new_row that is to replace a corresponding row (of
- * the same data format) in a buffer allocated by your application.
- *
- * The new row data pointer "new_row" may be NULL, indicating there is
- * no new data to be replaced (in cases of interlace loading).
- *
- * If new_row is not NULL then you need to call
- * png_progressive_combine_row() to replace the corresponding row as
- * shown below:
- */
-
- /* Get pointer to corresponding row in our
- * PNG read buffer.
- */
- png_bytep old_row = ((png_bytep *)our_data)[row_num];
-
- /* If both rows are allocated then copy the new row
- * data to the corresponding row data.
- */
- if ((old_row != NULL) && (new_row != NULL))
- png_progressive_combine_row(png_ptr, old_row, new_row);
-
- /*
- * The rows and passes are called in order, so you don't really
- * need the row_num and pass, but I'm supplying them because it
- * may make your life easier.
- *
- * For the non-NULL rows of interlaced images, you must call
- * png_progressive_combine_row() passing in the new row and the
- * old row, as demonstrated above. You can call this function for
- * NULL rows (it will just return) and for non-interlaced images
- * (it just does the png_memcpy for you) if it will make the code
- * easier. Thus, you can just do this for all cases:
- */
-
- png_progressive_combine_row(png_ptr, old_row, new_row);
-
- /* where old_row is what was displayed for previous rows. Note
- * that the first pass (pass == 0 really) will completely cover
- * the old row, so the rows do not have to be initialized. After
- * the first pass (and only for interlaced images), you will have
- * to pass the current row as new_row, and the function will combine
- * the old row and the new row.
- */
-}
-
-end_callback(png_structp png_ptr, png_infop info)
-{
- /* This function is called when the whole image has been read,
- * including any chunks after the image (up to and including
- * the IEND). You will usually have the same info chunk as you
- * had in the header, although some data may have been added
- * to the comments and time fields.
- *
- * Most people won't do much here, perhaps setting a flag that
- * marks the image as finished.
- */
-}
-
-/* Write a png file */
-void write_png(char *file_name /* , ... other image information ... */)
-{
- FILE *fp;
- png_structp png_ptr;
- png_infop info_ptr;
- png_colorp palette;
-
- /* Open the file */
- fp = fopen(file_name, "wb");
- if (fp == NULL)
- return (ERROR);
-
- /* Create and initialize the png_struct with the desired error handler
- * functions. If you want to use the default stderr and longjump method,
- * you can supply NULL for the last three parameters. We also check that
- * the library version is compatible with the one used at compile time,
- * in case we are using dynamically linked libraries. REQUIRED.
- */
- png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,
- png_voidp user_error_ptr, user_error_fn, user_warning_fn);
-
- if (png_ptr == NULL)
- {
- fclose(fp);
- return (ERROR);
- }
-
- /* Allocate/initialize the image information data. REQUIRED */
- info_ptr = png_create_info_struct(png_ptr);
- if (info_ptr == NULL)
- {
- fclose(fp);
- png_destroy_write_struct(&png_ptr, NULL);
- return (ERROR);
- }
-
- /* Set error handling. REQUIRED if you aren't supplying your own
- * error handling functions in the png_create_write_struct() call.
- */
- if (setjmp(png_jmpbuf(png_ptr)))
- {
- /* If we get here, we had a problem writing the file */
- fclose(fp);
- png_destroy_write_struct(&png_ptr, &info_ptr);
- return (ERROR);
- }
-
- /* One of the following I/O initialization functions is REQUIRED */
-
-#ifdef streams /* I/O initialization method 1 */
- /* Set up the output control if you are using standard C streams */
- png_init_io(png_ptr, fp);
-
-#else no_streams /* I/O initialization method 2 */
- /* If you are using replacement write functions, instead of calling
- * png_init_io() here you would call
- */
- png_set_write_fn(png_ptr, (void *)user_io_ptr, user_write_fn,
- user_IO_flush_function);
- /* where user_io_ptr is a structure you want available to the callbacks */
-#endif no_streams /* Only use one initialization method */
-
-#ifdef hilevel
- /* This is the easy way. Use it if you already have all the
- * image info living in the structure. You could "|" many
- * PNG_TRANSFORM flags into the png_transforms integer here.
- */
- png_write_png(png_ptr, info_ptr, png_transforms, NULL);
-
-#else
- /* This is the hard way */
-
- /* Set the image information here. Width and height are up to 2^31,
- * bit_depth is one of 1, 2, 4, 8, or 16, but valid values also depend on
- * the color_type selected. color_type is one of PNG_COLOR_TYPE_GRAY,
- * PNG_COLOR_TYPE_GRAY_ALPHA, PNG_COLOR_TYPE_PALETTE, PNG_COLOR_TYPE_RGB,
- * or PNG_COLOR_TYPE_RGB_ALPHA. interlace is either PNG_INTERLACE_NONE or
- * PNG_INTERLACE_ADAM7, and the compression_type and filter_type MUST
- * currently be PNG_COMPRESSION_TYPE_BASE and PNG_FILTER_TYPE_BASE. REQUIRED
- */
- png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, PNG_COLOR_TYPE_???,
- PNG_INTERLACE_????, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
-
- /* Set the palette if there is one. REQUIRED for indexed-color images */
- palette = (png_colorp)png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH
- * png_sizeof(png_color));
- /* ... Set palette colors ... */
- png_set_PLTE(png_ptr, info_ptr, palette, PNG_MAX_PALETTE_LENGTH);
- /* You must not free palette here, because png_set_PLTE only makes a link to
- * the palette that you malloced. Wait until you are about to destroy
- * the png structure.
- */
-
- /* Optional significant bit (sBIT) chunk */
- png_color_8 sig_bit;
-
- /* If we are dealing with a grayscale image then */
- sig_bit.gray = true_bit_depth;
-
- /* Otherwise, if we are dealing with a color image then */
- sig_bit.red = true_red_bit_depth;
- sig_bit.green = true_green_bit_depth;
- sig_bit.blue = true_blue_bit_depth;
-
- /* If the image has an alpha channel then */
- sig_bit.alpha = true_alpha_bit_depth;
-
- png_set_sBIT(png_ptr, info_ptr, &sig_bit);
-
-
- /* Optional gamma chunk is strongly suggested if you have any guess
- * as to the correct gamma of the image.
- */
- png_set_gAMA(png_ptr, info_ptr, gamma);
-
- /* Optionally write comments into the image */
- text_ptr[0].key = "Title";
- text_ptr[0].text = "Mona Lisa";
- text_ptr[0].compression = PNG_TEXT_COMPRESSION_NONE;
- text_ptr[0].itxt_length = 0;
- text_ptr[0].lang = NULL;
- text_ptr[0].lang_key = NULL;
- text_ptr[1].key = "Author";
- text_ptr[1].text = "Leonardo DaVinci";
- text_ptr[1].compression = PNG_TEXT_COMPRESSION_NONE;
- text_ptr[1].itxt_length = 0;
- text_ptr[1].lang = NULL;
- text_ptr[1].lang_key = NULL;
- text_ptr[2].key = "Description";
- text_ptr[2].text = "<long text>";
- text_ptr[2].compression = PNG_TEXT_COMPRESSION_zTXt;
- text_ptr[2].itxt_length = 0;
- text_ptr[2].lang = NULL;
- text_ptr[2].lang_key = NULL;
- png_set_text(png_ptr, info_ptr, text_ptr, 3);
-
- /* Other optional chunks like cHRM, bKGD, tRNS, tIME, oFFs, pHYs */
-
- /* Note that if sRGB is present the gAMA and cHRM chunks must be ignored
- * on read and, if your application chooses to write them, they must
- * be written in accordance with the sRGB profile
- */
-
- /* Write the file header information. REQUIRED */
- png_write_info(png_ptr, info_ptr);
-
- /* If you want, you can write the info in two steps, in case you need to
- * write your private chunk ahead of PLTE:
- *
- * png_write_info_before_PLTE(write_ptr, write_info_ptr);
- * write_my_chunk();
- * png_write_info(png_ptr, info_ptr);
- *
- * However, given the level of known- and unknown-chunk support in 1.2.0
- * and up, this should no longer be necessary.
- */
-
- /* Once we write out the header, the compression type on the text
- * chunks gets changed to PNG_TEXT_COMPRESSION_NONE_WR or
- * PNG_TEXT_COMPRESSION_zTXt_WR, so it doesn't get written out again
- * at the end.
- */
-
- /* Set up the transformations you want. Note that these are
- * all optional. Only call them if you want them.
- */
-
- /* Invert monochrome pixels */
- png_set_invert_mono(png_ptr);
-
- /* Shift the pixels up to a legal bit depth and fill in
- * as appropriate to correctly scale the image.
- */
- png_set_shift(png_ptr, &sig_bit);
-
- /* Pack pixels into bytes */
- png_set_packing(png_ptr);
-
- /* Swap location of alpha bytes from ARGB to RGBA */
- png_set_swap_alpha(png_ptr);
-
- /* Get rid of filler (OR ALPHA) bytes, pack XRGB/RGBX/ARGB/RGBA into
- * RGB (4 channels -> 3 channels). The second parameter is not used.
- */
- png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE);
-
- /* Flip BGR pixels to RGB */
- png_set_bgr(png_ptr);
-
- /* Swap bytes of 16-bit files to most significant byte first */
- png_set_swap(png_ptr);
-
- /* Swap bits of 1, 2, 4 bit packed pixel formats */
- png_set_packswap(png_ptr);
-
- /* Turn on interlace handling if you are not using png_write_image() */
- if (interlacing)
- number_passes = png_set_interlace_handling(png_ptr);
-
- else
- number_passes = 1;
-
- /* The easiest way to write the image (you may have a different memory
- * layout, however, so choose what fits your needs best). You need to
- * use the first method if you aren't handling interlacing yourself.
- */
- png_uint_32 k, height, width;
- png_byte image[height][width*bytes_per_pixel];
- png_bytep row_pointers[height];
-
- if (height > PNG_UINT_32_MAX/png_sizeof(png_bytep))
- png_error (png_ptr, "Image is too tall to process in memory");
-
- for (k = 0; k < height; k++)
- row_pointers[k] = image + k*width*bytes_per_pixel;
-
- /* One of the following output methods is REQUIRED */
-
-#ifdef entire /* Write out the entire image data in one call */
- png_write_image(png_ptr, row_pointers);
-
- /* The other way to write the image - deal with interlacing */
-
-#else no_entire /* Write out the image data by one or more scanlines */
-
- /* The number of passes is either 1 for non-interlaced images,
- * or 7 for interlaced images.
- */
- for (pass = 0; pass < number_passes; pass++)
- {
- /* Write a few rows at a time. */
- png_write_rows(png_ptr, &row_pointers[first_row], number_of_rows);
-
- /* If you are only writing one row at a time, this works */
- for (y = 0; y < height; y++)
- png_write_rows(png_ptr, &row_pointers[y], 1);
- }
-#endif no_entire /* Use only one output method */
-
- /* You can write optional chunks like tEXt, zTXt, and tIME at the end
- * as well. Shouldn't be necessary in 1.2.0 and up as all the public
- * chunks are supported and you can use png_set_unknown_chunks() to
- * register unknown chunks into the info structure to be written out.
- */
-
- /* It is REQUIRED to call this to finish writing the rest of the file */
- png_write_end(png_ptr, info_ptr);
-#endif hilevel
-
- /* If you png_malloced a palette, free it here (don't free info_ptr->palette,
- * as recommended in versions 1.0.5m and earlier of this example; if
- * libpng mallocs info_ptr->palette, libpng will free it). If you
- * allocated it with malloc() instead of png_malloc(), use free() instead
- * of png_free().
- */
- png_free(png_ptr, palette);
- palette = NULL;
-
- /* Similarly, if you png_malloced any data that you passed in with
- * png_set_something(), such as a hist or trans array, free it here,
- * when you can be sure that libpng is through with it.
- */
- png_free(png_ptr, trans);
- trans = NULL;
- /* Whenever you use png_free() it is a good idea to set the pointer to
- * NULL in case your application inadvertently tries to png_free() it
- * again. When png_free() sees a NULL it returns without action, thus
- * avoiding the double-free security problem.
- */
-
- /* Clean up after the write, and free any memory allocated */
- png_destroy_write_struct(&png_ptr, &info_ptr);
-
- /* Close the file */
- fclose(fp);
-
- /* That's it */
- return (OK);
-}
-
-#endif /* if 0 */
diff --git a/src/3rdparty/libpng/libpng-manual.txt b/src/3rdparty/libpng/libpng-manual.txt
index 77adf7aec8..d55e80a009 100644
--- a/src/3rdparty/libpng/libpng-manual.txt
+++ b/src/3rdparty/libpng/libpng-manual.txt
@@ -1,6 +1,6 @@
libpng-manual.txt - A description on how to use and modify libpng
- libpng version 1.5.1 - February 3, 2011
+ libpng version 1.5.10 - March 29, 2012
Updated and distributed by Glenn Randers-Pehrson
<glennrp at users.sourceforge.net>
Copyright (c) 1998-2011 Glenn Randers-Pehrson
@@ -11,7 +11,7 @@ libpng-manual.txt - A description on how to use and modify libpng
Based on:
- libpng versions 0.97, January 1998, through 1.5.1 - February 3, 2011
+ libpng versions 0.97, January 1998, through 1.5.10 - March 29, 2012
Updated and distributed by Glenn Randers-Pehrson
Copyright (c) 1998-2011 Glenn Randers-Pehrson
@@ -107,7 +107,8 @@ PNG file. At one time, the fields of png_info were intended to be
directly accessible to the user. However, this tended to cause problems
with applications using dynamically loaded libraries, and as a result
a set of interface functions for png_info (the png_get_*() and png_set_*()
-functions) was developed.
+functions) was developed, and direct access to the png_info fields was
+deprecated..
The png_struct structure is the object used by the library to decode a
single image. As of 1.5.0 this structure is also not exposed.
@@ -116,14 +117,23 @@ Almost all libpng APIs require a pointer to a png_struct as the first argument.
Many (in particular the png_set and png_get APIs) also require a pointer
to png_info as the second argument. Some application visible macros
defined in png.h designed for basic data access (reading and writing
-integers in the PNG format) break this rule, but it's almost always safe
-to assume that a (png_struct*) has to be passed to call an API function.
+integers in the PNG format) don't take a png_info pointer, but it's almost
+always safe to assume that a (png_struct*) has to be passed to call an API
+function.
+
+You can have more than one png_info structure associated with an image,
+as illustrated in pngtest.c, one for information valid prior to the
+IDAT chunks and another (called "end_info" below) for things after them.
The png.h header file is an invaluable reference for programming with libpng.
And while I'm on the topic, make sure you include the libpng header file:
#include <png.h>
+and also (as of libpng-1.5.0) the zlib header file, if you need it:
+
+#include <zlib.h>
+
Types
The png.h header file defines a number of integral types used by the
@@ -137,9 +147,9 @@ the value by multiplying by 100,000. As of libpng 1.5.0 a convenience
macro PNG_FP_1 is defined in png.h along with a type (png_fixed_point)
which is simply (png_int_32).
-All APIs that take (double) arguments also have an matching API that
+All APIs that take (double) arguments also have a matching API that
takes the corresponding fixed point integer arguments. The fixed point
-API has the same name as the floating point one with _fixed appended.
+API has the same name as the floating point one with "_fixed" appended.
The actual range of values permitted in the APIs is frequently less than
the full range of (png_fixed_point) (-21474 to +21474). When APIs require
a non-negative argument the type is recorded as png_uint_32 above. Consult
@@ -157,6 +167,10 @@ preprocessing directives of the form:
#ifdef PNG_feature_SUPPORTED
declare-function
#endif
+ ...
+ #ifdef PNG_feature_SUPPORTED
+ use-function
+ #endif
The library can be built without support for these APIs, although a
standard build will have all implemented APIs. Application programs
@@ -165,7 +179,7 @@ portability. From libpng 1.5.0 the feature macros set during the build
of libpng are recorded in the header file "pnglibconf.h" and this file
is always included by png.h.
-If you don't need to change the library configuration from the default skip to
+If you don't need to change the library configuration from the default, skip to
the next section ("Reading").
Notice that some of the makefiles in the 'scripts' directory and (in 1.5.0) all
@@ -197,24 +211,25 @@ A variety of methods exist to build libpng. Not all of these support
reconfiguration of pnglibconf.h. To reconfigure pnglibconf.h it must either be
rebuilt from scripts/pnglibconf.dfa using awk or it must be edited by hand.
-Hand editing is achieved by copying scripts/pnglibconf.h.prebuilt and changing
-the lines defining the supported features, paying very close attention to the
-'option' information in scripts/pnglibconf.dfa that describes those features and
-their requirements. This is easy to get wrong.
+Hand editing is achieved by copying scripts/pnglibconf.h.prebuilt to
+pnglibconf.h and changing the lines defining the supported features, paying
+very close attention to the 'option' information in scripts/pnglibconf.dfa
+that describes those features and their requirements. This is easy to get
+wrong.
B. Configuration using DFA_XTRA
Rebuilding from pnglibconf.dfa is easy if a functioning 'awk', or a later
variant such as 'nawk' or 'gawk', is available. The configure build will
automatically find an appropriate awk and build pnglibconf.h.
-scripts/pnglibconf.mak contains a set of make rules for doing the same thing if
-configure is not used, and many of the makefiles in the scripts directory use
-this approach.
+The scripts/pnglibconf.mak file contains a set of make rules for doing the
+same thing if configure is not used, and many of the makefiles in the scripts
+directory use this approach.
-When rebuilding simply write new file containing changed options and set
+When rebuilding simply write a new file containing changed options and set
DFA_XTRA to the name of this file. This causes the build to append the new file
-to the end of scripts/pnglibconf.dfa. pngusr.dfa should contain lines of the
-following forms:
+to the end of scripts/pnglibconf.dfa. The pngusr.dfa file should contain lines
+of the following forms:
everything = off
@@ -238,12 +253,16 @@ source code. Most of these values have performance implications for the library
but most of them have no visible effect on the API. Some can also be overridden
from the API.
+This method of building a customized pnglibconf.h is illustrated in
+contrib/pngminim/*. See the "$(PNGCONF):" target in the makefile and
+pngusr.dfa in these directories.
+
C. Configuration using PNG_USR_CONFIG
If -DPNG_USR_CONFIG is added to the CFLAGS when pnglibconf.h is built the file
pngusr.h will automatically be included before the options in
-scripts/pnglibconf.dfa are processed. pngusr.h should contain only macro
-definitions turning features on or off or setting settings.
+scripts/pnglibconf.dfa are processed. Your pngusr.h file should contain only
+macro definitions turning features on or off or setting settings.
Apart from the global setting "everything = off" all the options listed above
can be set using macros in pngusr.h:
@@ -274,6 +293,9 @@ examine the intermediate file pnglibconf.dfn to find the full set of
dependency information for each setting and option. Simply locate the
feature in the file and read the C comments that precede it.
+This method is also illustrated in the contrib/pngminim/* makefiles and
+pngusr.h.
+
III. Reading
We'll now walk you through the possible functions to call when reading
@@ -348,21 +370,12 @@ create the structure, so your application should check for that.
return (ERROR);
}
- png_infop end_info = png_create_info_struct(png_ptr);
-
- if (!end_info)
- {
- png_destroy_read_struct(&png_ptr, &info_ptr,
- (png_infopp)NULL);
- return (ERROR);
- }
-
If you want to use your own memory allocation routines,
use a libpng that was built with PNG_USER_MEM_SUPPORTED defined, and use
png_create_read_struct_2() instead of png_create_read_struct():
png_structp png_ptr = png_create_read_struct_2
- (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr,
+ (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr,
user_error_fn, user_warning_fn, (png_voidp)
user_mem_ptr, user_malloc_fn, user_free_fn);
@@ -374,7 +387,7 @@ handling and memory alloc/free functions.
When libpng encounters an error, it expects to longjmp back
to your routine. Therefore, you will need to call setjmp and pass
your png_jmpbuf(png_ptr). If you read the file from different
-routines, you will need to update the jmpbuf field every time you enter
+routines, you will need to update the longjmp buffer every time you enter
a new routine that will call a png_*() function.
See your documentation of setjmp/longjmp for your compiler for more
@@ -392,6 +405,9 @@ free any memory.
return (ERROR);
}
+Pass (png_infopp)NULL instead of &end_info if you didn't create
+an end_info structure.
+
If you would rather avoid the complexity of setjmp/longjmp issues,
you can compile libpng with PNG_NO_SETJMP, in which case
errors will result in a call to PNG_ABORT() which defaults to abort().
@@ -513,6 +529,19 @@ To inform libpng about your function, use
png_set_read_status_fn(png_ptr, read_row_callback);
+When this function is called the row has already been completely processed and
+the 'row' and 'pass' refer to the next row to be handled. For the
+non-interlaced case the row that was just handled is simply one less than the
+passed in row number, and pass will always be 0. For the interlaced case the
+same applies unless the row value is 0, in which case the row just handled was
+the last one from one of the preceding passes. Because interlacing may skip a
+pass you cannot be sure that the preceding pass is just 'pass-1', if you really
+need to know what the last pass is record (row,pass) from the callback and use
+the last recorded value each time.
+
+As with the user transform you can find the output row using the
+PNG_ROW_FROM_PASS_ROW macro.
+
Unknown-chunk handling
Now you get to set the way the library processes unknown chunks in the
@@ -550,6 +579,8 @@ according to the "keep" directive. If a chunk is named in successive
instances of png_set_keep_unknown_chunks(), the final instance will
take precedence. The IHDR and IEND chunks should not be named in
chunk_list; if they are, libpng will process them normally anyway.
+If you know that your application will never make use of some particular
+chunks, use PNG_HANDLE_CHUNK_NEVER (or 1) as demonstrated below.
Here is an example of the usage of png_set_keep_unknown_chunks(),
where the private "vpAg" chunk will later be processed by a user chunk
@@ -590,7 +621,7 @@ large as 2^31-1 (0x7fffffff), or about 2.147 billion rows and columns.
Since very few applications really need to process such large images,
we have imposed an arbitrary 1-million limit on rows and columns.
Larger images will be rejected immediately with a png_error() call. If
-you wish to override this limit, you can use
+you wish to change this limit, you can use
png_set_user_limits(png_ptr, width_max, height_max);
@@ -600,6 +631,10 @@ anyway because of potential buffer overflow conditions).
You should put this statement after you create the PNG structure and
before calling png_read_info(), png_read_png(), or png_process_data().
+
+When writing a PNG datastream, put this statement before calling
+png_write_info() or png_write_png().
+
If you need to retrieve the limits that are being applied, use
width_max = png_get_user_width_max(png_ptr);
@@ -630,6 +665,242 @@ and you can retrieve the limit with
Any chunks that would cause either of these limits to be exceeded will
be ignored.
+Information about your system
+
+If you intend to display the PNG or to incorporate it in other image data you
+need to tell libpng information about your display or drawing surface so that
+libpng can convert the values in the image to match the display.
+
+From libpng-1.5.4 this information can be set before reading the PNG file
+header. In earlier versions png_set_gamma() existed but behaved incorrectly if
+called before the PNG file header had been read and png_set_alpha_mode() did not
+exist.
+
+If you need to support versions prior to libpng-1.5.4 test the version number
+as illustrated below using "PNG_LIBPNG_VER >= 10504" and follow the procedures
+described in the appropriate manual page.
+
+You give libpng the encoding expected by your system expressed as a 'gamma'
+value. You can also specify a default encoding for the PNG file in
+case the required information is missing from the file. By default libpng
+assumes that the PNG data matches your system, to keep this default call:
+
+ png_set_gamma(png_ptr, screen_gamma, 1/screen_gamma/*file gamma*/);
+
+or you can use the fixed point equivalent:
+
+ png_set_gamma_fixed(png_ptr, PNG_FP_1*screen_gamma, PNG_FP_1/screen_gamma);
+
+If you don't know the gamma for your system it is probably 2.2 - a good
+approximation to the IEC standard for display systems (sRGB). If images are
+too contrasty or washed out you got the value wrong - check your system
+documentation!
+
+Many systems permit the system gamma to be changed via a lookup table in the
+display driver, a few systems, including older Macs, change the response by
+default. As of 1.5.4 three special values are available to handle common
+situations:
+
+ PNG_DEFAULT_sRGB: Indicates that the system conforms to the IEC 61966-2-1
+ standard. This matches almost all systems.
+ PNG_GAMMA_MAC_18: Indicates that the system is an older (pre Mac OS 10.6)
+ Apple Macintosh system with the default settings.
+ PNG_GAMMA_LINEAR: Just the fixed point value for 1.0 - indicates that the
+ system expects data with no gamma encoding.
+
+You would use the linear (unencoded) value if you need to process the pixel
+values further because this avoids the need to decode and reencode each
+component value whenever arithmetic is performed. A lot of graphics software
+uses linear values for this reason, often with higher precision component values
+to preserve overall accuracy.
+
+The second thing you may need to tell libpng about is how your system handles
+alpha channel information. Some, but not all, PNG files contain an alpha
+channel. To display these files correctly you need to compose the data onto a
+suitable background, as described in the PNG specification.
+
+Libpng only supports composing onto a single color (using png_set_background;
+see below). Otherwise you must do the composition yourself and, in this case,
+you may need to call png_set_alpha_mode:
+
+#if PNG_LIBPNG_VER >= 10504
+ png_set_alpha_mode(png_ptr, mode, screen_gamma);
+#else
+ png_set_gamma(png_ptr, screen_gamma, 1.0/screen_gamma);
+#endif
+
+The screen_gamma value is the same as the argument to png_set_gamma; however,
+how it affects the output depends on the mode. png_set_alpha_mode() sets the
+file gamma default to 1/screen_gamma, so normally you don't need to call
+png_set_gamma. If you need different defaults call png_set_gamma() before
+png_set_alpha_mode() - if you call it after it will override the settings made
+by png_set_alpha_mode().
+
+The mode is as follows:
+
+ PNG_ALPHA_PNG: The data is encoded according to the PNG specification. Red,
+green and blue, or gray, components are gamma encoded color
+values and are not premultiplied by the alpha value. The
+alpha value is a linear measure of the contribution of the
+pixel to the corresponding final output pixel.
+
+You should normally use this format if you intend to perform
+color correction on the color values; most, maybe all, color
+correction software has no handling for the alpha channel and,
+anyway, the math to handle pre-multiplied component values is
+unnecessarily complex.
+
+Before you do any arithmetic on the component values you need
+to remove the gamma encoding and multiply out the alpha
+channel. See the PNG specification for more detail. It is
+important to note that when an image with an alpha channel is
+scaled, linear encoded, pre-multiplied component values must
+be used!
+
+The remaining modes assume you don't need to do any further color correction or
+that if you do, your color correction software knows all about alpha (it
+probably doesn't!)
+
+ PNG_ALPHA_STANDARD: The data libpng produces
+is encoded in the standard way
+assumed by most correctly written graphics software.
+The gamma encoding will be removed by libpng and the
+linear component values will be pre-multiplied by the
+alpha channel.
+
+With this format the final image must be re-encoded to
+match the display gamma before the image is displayed.
+If your system doesn't do that, yet still seems to
+perform arithmetic on the pixels without decoding them,
+it is broken - check out the modes below.
+
+With PNG_ALPHA_STANDARD libpng always produces linear
+component values, whatever screen_gamma you supply. The
+screen_gamma value is, however, used as a default for
+the file gamma if the PNG file has no gamma information.
+
+If you call png_set_gamma() after png_set_alpha_mode() you
+will override the linear encoding. Instead the
+pre-multiplied pixel values will be gamma encoded but
+the alpha channel will still be linear. This may
+actually match the requirements of some broken software,
+but it is unlikely.
+
+While linear 8-bit data is often used it has
+insufficient precision for any image with a reasonable
+dynamic range. To avoid problems, and if your software
+supports it, use png_set_expand_16() to force all
+components to 16 bits.
+
+ PNG_ALPHA_OPTIMIZED: This mode is the same
+as PNG_ALPHA_STANDARD except that
+completely opaque pixels are gamma encoded according to
+the screen_gamma value. Pixels with alpha less than 1.0
+will still have linear components.
+
+Use this format if you have control over your
+compositing software and do don't do other arithmetic
+(such as scaling) on the data you get from libpng. Your
+compositing software can simply copy opaque pixels to
+the output but still has linear values for the
+non-opaque pixels.
+
+In normal compositing, where the alpha channel encodes
+partial pixel coverage (as opposed to broad area
+translucency), the inaccuracies of the 8-bit
+representation of non-opaque pixels are irrelevant.
+
+You can also try this format if your software is broken;
+it might look better.
+
+ PNG_ALPHA_BROKEN: This is PNG_ALPHA_STANDARD;
+however, all component values,
+including the alpha channel are gamma encoded. This is
+an appropriate format to try if your software, or more
+likely hardware, is totally broken, i.e., if it performs
+linear arithmetic directly on gamma encoded values.
+
+In most cases of broken software or hardware the bug in the final display
+manifests as a subtle halo around composited parts of the image. You may not
+even perceive this as a halo; the composited part of the image may simply appear
+separate from the background, as though it had been cut out of paper and pasted
+on afterward.
+
+If you don't have to deal with bugs in software or hardware, or if you can fix
+them, there are three recommended ways of using png_set_alpha_mode():
+
+ png_set_alpha_mode(png_ptr, PNG_ALPHA_PNG,
+ screen_gamma);
+
+You can do color correction on the result (libpng does not currently
+support color correction internally). When you handle the alpha channel
+you need to undo the gamma encoding and multiply out the alpha.
+
+ png_set_alpha_mode(png_ptr, PNG_ALPHA_STANDARD,
+ screen_gamma);
+ png_set_expand_16(png_ptr);
+
+If you are using the high level interface, don't call png_set_expand_16();
+instead pass PNG_TRANSFORM_EXPAND_16 to the interface.
+
+With this mode you can't do color correction, but you can do arithmetic,
+including composition and scaling, on the data without further processing.
+
+ png_set_alpha_mode(png_ptr, PNG_ALPHA_OPTIMIZED,
+ screen_gamma);
+
+You can avoid the expansion to 16-bit components with this mode, but you
+lose the ability to scale the image or perform other linear arithmetic.
+All you can do is compose the result onto a matching output. Since this
+mode is libpng-specific you also need to write your own composition
+software.
+
+If you don't need, or can't handle, the alpha channel you can call
+png_set_background() to remove it by compositing against a fixed color. Don't
+call png_set_strip_alpha() to do this - it will leave spurious pixel values in
+transparent parts of this image.
+
+ png_set_background(png_ptr, &background_color,
+ PNG_BACKGROUND_GAMMA_SCREEN, 0, 1);
+
+The background_color is an RGB or grayscale value according to the data format
+libpng will produce for you. Because you don't yet know the format of the PNG
+file, if you call png_set_background at this point you must arrange for the
+format produced by libpng to always have 8-bit or 16-bit components and then
+store the color as an 8-bit or 16-bit color as appropriate. The color contains
+separate gray and RGB component values, so you can let libpng produce gray or
+RGB output according to the input format, but low bit depth grayscale images
+must always be converted to at least 8-bit format. (Even though low bit depth
+grayscale images can't have an alpha channel they can have a transparent
+color!)
+
+You set the transforms you need later, either as flags to the high level
+interface or libpng API calls for the low level interface. For reference the
+settings and API calls required are:
+
+8-bit values:
+ PNG_TRANSFORM_SCALE_16 | PNG_EXPAND
+ png_set_expand(png_ptr); png_set_scale_16(png_ptr);
+
+ If you must get exactly the same inaccurate results
+ produced by default in versions prior to libpng-1.5.4,
+ use PNG_TRANSFORM_STRIP_16 and png_set_strip_16(png_ptr)
+ instead.
+
+16-bit values:
+ PNG_TRANSFORM_EXPAND_16
+ png_set_expand_16(png_ptr);
+
+In either case palette image data will be expanded to RGB. If you just want
+color data you can add PNG_TRANSFORM_GRAY_TO_RGB or png_set_gray_to_rgb(png_ptr)
+to the list.
+
+Calling png_set_background before the PNG file header is read will not work
+prior to libpng-1.5.4. Because the failure may result in unexpected warnings or
+errors it is therefore much safer to call png_set_background after the head has
+been read. Unfortunately this means that prior to libpng-1.5.4 it cannot be
+used with the high level interface.
+
The high-level read interface
At this point there are two ways to proceed; through the high-level
@@ -639,8 +910,10 @@ the entire image into memory, and (b) the input transformations
you want to do are limited to the following set:
PNG_TRANSFORM_IDENTITY No transformation
- PNG_TRANSFORM_STRIP_16 Strip 16-bit samples to
- 8 bits
+ PNG_TRANSFORM_SCALE_16 Strip 16-bit samples to
+ 8-bit accurately
+ PNG_TRANSFORM_STRIP_16 Chop 16-bit samples to
+ 8-bit less accurately
PNG_TRANSFORM_STRIP_ALPHA Discard the alpha channel
PNG_TRANSFORM_PACKING Expand 1, 2 and 4-bit
samples to bytes
@@ -659,6 +932,7 @@ you want to do are limited to the following set:
PNG_TRANSFORM_SWAP_ENDIAN Byte-swap 16-bit samples
PNG_TRANSFORM_GRAY_TO_RGB Expand grayscale samples
to RGB (or GA to RGBA)
+ PNG_TRANSFORM_EXPAND_16 Expand samples to 16 bits
(This excludes setting a background color, doing gamma transformation,
quantizing, and setting filler.) If this is the case, simply do this:
@@ -727,6 +1001,22 @@ call to png_read_info().
This will process all chunks up to but not including the image data.
+This also copies some of the data from the PNG file into the decode structure
+for use in later transformations. Important information copied in is:
+
+1) The PNG file gamma from the gAMA chunk. This overwrites the default value
+provided by an earlier call to png_set_gamma or png_set_alpha_mode.
+
+2) Prior to libpng-1.5.4 the background color from a bKGd chunk. This
+damages the information provided by an earlier call to png_set_background
+resulting in unexpected behavior. Libpng-1.5.4 no longer does this.
+
+3) The number of significant bits in each component value. Libpng uses this to
+optimize gamma handling by reducing the internal lookup table sizes.
+
+4) The transparent color information from a tRNS chunk. This can be modified by
+a later call to png_set_tRNS.
+
Querying the info structure
Functions are used to get the information from the info_ptr once it
@@ -857,6 +1147,28 @@ pointer into the info_ptr is returned for any complex types.
int_file_gamma - 100,000 times the gamma at which the
file is written
+ png_get_cHRM(png_ptr, info_ptr, &white_x, &white_y, &red_x, &red_y,
+ &green_x, &green_y, &blue_x, &blue_y)
+ png_get_cHRM_XYZ(png_ptr, info_ptr, &red_X, &red_Y, &red_Z, &green_X,
+ &green_Y, &green_Z, &blue_X, &blue_Y, &blue_Z)
+ png_get_cHRM_fixed(png_ptr, info_ptr, &int_white_x, &int_white_y,
+ &int_red_x, &int_red_y, &int_green_x, &int_green_y,
+ &int_blue_x, &int_blue_y)
+ png_get_cHRM_XYZ_fixed(png_ptr, info_ptr, &int_red_X, &int_red_Y,
+ &int_red_Z, &int_green_X, &int_green_Y, &int_green_Z,
+ &int_blue_X, &int_blue_Y, &int_blue_Z)
+
+ {white,red,green,blue}_{x,y}
+ A color space encoding specified using the chromaticities
+ of the end points and the white point. (PNG_INFO_cHRM)
+
+ {red,green,blue}_{X,Y,Z}
+ A color space encoding specified using the encoding end
+ points - the CIE tristimulus specification of the intended
+ color of the red, green and blue channels in the PNG RGB
+ data. The white point is simply the sum of the three end
+ points. (PNG_INFO_cHRM)
+
png_get_sRGB(png_ptr, info_ptr, &srgb_intent);
file_srgb_intent - the rendering intent (PNG_INFO_sRGB)
@@ -915,7 +1227,8 @@ pointer into the info_ptr is returned for any complex types.
png_get_bKGD(png_ptr, info_ptr, &background);
- background - background color (PNG_VALID_bKGD)
+ background - background color (of type
+ png_color_16p) (PNG_VALID_bKGD)
valid 16-bit red, green and blue
values, regardless of color_type
@@ -952,8 +1265,13 @@ pointer into the info_ptr is returned for any complex types.
(empty string for unknown).
Note that the itxt_length, lang, and lang_key
- members of the text_ptr structure only exist
- when the library is built with iTXt chunk support.
+ members of the text_ptr structure only exist when the
+ library is built with iTXt chunk support. Prior to
+ libpng-1.4.0 the library was built by default without
+ iTXt support. Also note that when iTXt is supported,
+ they contain NULL pointers when the "compression"
+ field contains PNG_TEXT_COMPRESSION_NONE or
+ PNG_TEXT_COMPRESSION_zTXt.
num_text - number of comments (same as
num_comments; you can put NULL here
@@ -978,10 +1296,10 @@ pointer into the info_ptr is returned for any complex types.
&unit_type);
offset_x - positive offset from the left edge
- of the screen
+ of the screen (can be negative)
offset_y - positive offset from the top edge
- of the screen
+ of the screen (can be negative)
unit_type - PNG_OFFSET_PIXEL, PNG_OFFSET_MICROMETER
@@ -1013,6 +1331,7 @@ pointer into the info_ptr is returned for any complex types.
unit - physical scale units (an integer)
width - width of a pixel in physical scale units
+ (expressed as a string)
height - height of a pixel in physical scale units
(width and height are strings like "2.54")
@@ -1035,6 +1354,12 @@ pointer into the info_ptr is returned for any complex types.
chunks were read from the PNG file or inserted with the
png_set_unknown_chunks() function.
+ The value of "location" is a bitwise "or" of
+
+ PNG_HAVE_IHDR (0x01)
+ PNG_HAVE_PLTE (0x02)
+ PNG_AFTER_IDAT (0x08)
+
The data from the pHYs chunk can be retrieved in several convenient
forms:
@@ -1069,7 +1394,7 @@ forms:
72 dpi is stored as 0.28346 pixels/meter, and
when this is retrieved it is 71.9988 dpi, so
be sure to round the returned value appropriately
- if you want to display a reasonable-looking result.
+ if you want to display a reasonable-looking result.
The data from the oFFs chunk can be retrieved in several convenient
forms:
@@ -1090,7 +1415,7 @@ forms:
converted to microns and back without some loss
of precision.
-For more information, see the png_info definition in png.h and the
+For more information, see the
PNG specification for chunk contents. Be careful with trusting
rowbytes, as some of the transformations could increase the space
needed to hold a row (expand, filler, gray_to_rgb, etc.).
@@ -1125,17 +1450,20 @@ to handle any special transformations of the image data. The various
ways to transform the data will be described in the order that they
should occur. This is important, as some of these change the color
type and/or bit depth of the data, and some others only work on
-certain color types and bit depths. Even though each transformation
-checks to see if it has data that it can do something with, you should
-make sure to only enable a transformation if it will be valid for the
-data. For example, don't swap red and blue on grayscale data.
+certain color types and bit depths.
+
+Transformations you request are ignored if they don't have any meaning for a
+particular input data format. However some transformations can have an effect
+as a result of a previous transformation. If you specify a contradictory set of
+transformations, for example both adding and removing the alpha channel, you
+cannot predict the final result.
-The colors used for the background and transparency values should be
-supplied in the same format/depth as the current image data. They
-are stored in the same format/depth as the image data in a bKGD or tRNS
-chunk, so this is what libpng expects for this data. The colors are
-transformed to keep in sync with the image data when an application
-calls the png_read_update_info() routine (see below).
+The color used for the transparency values should be supplied in the same
+format/depth as the current image data. It is stored in the same format/depth
+as the image data in a tRNS chunk, so this is what libpng expects for this data.
+
+The color used for the background value depends on the need_expand argument as
+described below.
Data will be decoded into the supplied row buffers packed into bytes
unless the library has been told to transform it into another format.
@@ -1145,12 +1473,12 @@ byte, unless png_set_packing() is called. 8-bit RGB data will be stored
in RGB RGB RGB format unless png_set_filler() or png_set_add_alpha()
is called to insert filler bytes, either before or after each RGB triplet.
16-bit RGB data will be returned RRGGBB RRGGBB, with the most significant
-byte of the color value first, unless png_set_strip_16() is called to
+byte of the color value first, unless png_set_scale_16() is called to
transform it to regular RGB RGB triplets, or png_set_filler() or
png_set_add alpha() is called to insert filler bytes, either before or
after each RRGGBB triplet. Similarly, 8-bit or 16-bit grayscale data can
-be modified with
-png_set_filler(), png_set_add_alpha(), or png_set_strip_16().
+be modified with png_set_filler(), png_set_add_alpha(), png_set_strip_16(),
+or png_set_scale_16().
The following code transforms grayscale images of less than 8 to 8 bits,
changes paletted images to RGB, and adds a full alpha channel if there is
@@ -1161,13 +1489,13 @@ viewing application that wishes to treat all images in the same way.
if (color_type == PNG_COLOR_TYPE_PALETTE)
png_set_palette_to_rgb(png_ptr);
- if (color_type == PNG_COLOR_TYPE_GRAY &&
- bit_depth < 8) png_set_expand_gray_1_2_4_to_8(png_ptr);
-
if (png_get_valid(png_ptr, info_ptr,
PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png_ptr);
-These three functions are actually aliases for png_set_expand(), added
+ if (color_type == PNG_COLOR_TYPE_GRAY &&
+ bit_depth < 8) png_set_expand_gray_1_2_4_to_8(png_ptr);
+
+The first two functions are actually aliases for png_set_expand(), added
in libpng version 1.0.4, with the function names expanded to improve code
readability. In some future version they may actually do different
things.
@@ -1175,56 +1503,91 @@ things.
As of libpng version 1.2.9, png_set_expand_gray_1_2_4_to_8() was
added. It expands the sample depth without changing tRNS to alpha.
-As of libpng version 1.5.1, not all possible expansions are supported.
+As of libpng version 1.5.2, png_set_expand_16() was added. It behaves as
+png_set_expand(); however, the resultant channels have 16 bits rather than 8.
+Use this when the output color or gray channels are made linear to avoid fairly
+severe accuracy loss.
+
+ if (bit_depth < 16)
+ png_set_expand_16(png_ptr);
+
+PNG can have files with 16 bits per channel. If you only can handle
+8 bits per channel, this will strip the pixels down to 8-bit.
+
+ if (bit_depth == 16)
+#if PNG_LIBPNG_VER >= 10504
+ png_set_scale_16(png_ptr);
+#else
+ png_set_strip_16(png_ptr);
+#endif
+
+(The more accurate "png_set_scale_16()" API became available in libpng version
+1.5.4).
+
+If you need to process the alpha channel on the image separately from the image
+data (for example if you convert it to a bitmap mask) it is possible to have
+libpng strip the channel leaving just RGB or gray data:
+
+ if (color_type & PNG_COLOR_MASK_ALPHA)
+ png_set_strip_alpha(png_ptr);
+
+If you strip the alpha channel you need to find some other way of dealing with
+the information. If, instead, you want to convert the image to an opaque
+version with no alpha channel use png_set_background; see below.
+
+As of libpng version 1.5.2, almost all useful expansions are supported, the
+major ommissions are conversion of grayscale to indexed images (which can be
+done trivially in the application) and conversion of indexed to grayscale (which
+can be done by a trivial manipulation of the palette.)
In the following table, the 01 means grayscale with depth<8, 31 means
indexed with depth<8, other numerals represent the color type, "T" means
the tRNS chunk is present, A means an alpha channel is present, and O
means tRNS or alpha is present but all pixels in the image are opaque.
- FROM 01 31 0 0T 0O 2 2T 2O 3 3T 3O 4A 4O 6A 6O
+ FROM 01 31 0 0T 0O 2 2T 2O 3 3T 3O 4A 4O 6A 6O
TO
- 01 -
- 31 -
- 0 1 -
- 0T -
- 0O -
- 2 GX -
- 2T -
- 2O -
- 3 1 -
- 3T -
- 3O -
- 4A T -
- 4O -
- 6A GX TX TX -
- 6O GX TX -
+ 01 - [G] - - - - - - - - - - - - -
+ 31 [Q] Q [Q] [Q] [Q] Q Q Q Q Q Q [Q] [Q] Q Q
+ 0 1 G + . . G G G G G G B B GB GB
+ 0T lt Gt t + . Gt G G Gt G G Bt Bt GBt GBt
+ 0O lt Gt t . + Gt Gt G Gt Gt G Bt Bt GBt GBt
+ 2 C P C C C + . . C - - CB CB B B
+ 2T Ct - Ct C C t + t - - - CBt CBt Bt Bt
+ 2O Ct - Ct C C t t + - - - CBt CBt Bt Bt
+ 3 [Q] p [Q] [Q] [Q] Q Q Q + . . [Q] [Q] Q Q
+ 3T [Qt] p [Qt][Q] [Q] Qt Qt Qt t + t [Qt][Qt] Qt Qt
+ 3O [Qt] p [Qt][Q] [Q] Qt Qt Qt t t + [Qt][Qt] Qt Qt
+ 4A lA G A T T GA GT GT GA GT GT + BA G GBA
+ 4O lA GBA A T T GA GT GT GA GT GT BA + GBA G
+ 6A CA PA CA C C A T tT PA P P C CBA + BA
+ 6O CA PBA CA C C A tT T PA P P CBA C BA +
Within the matrix,
+ "+" identifies entries where 'from' and 'to' are the same.
"-" means the transformation is not supported.
+ "." means nothing is necessary (a tRNS chunk can just be ignored).
+ "t" means the transformation is obtained by png_set_tRNS.
+ "A" means the transformation is obtained by png_set_add_alpha().
"X" means the transformation is obtained by png_set_expand().
"1" means the transformation is obtained by
- png_set_expand_gray_1_2_4_to_8
- "G" means the transformation is obtained by
- png_set_gray_to_rgb().
+ png_set_expand_gray_1_2_4_to_8() (and by png_set_expand() if there
+ is no transparency in the original or the final format).
+ "C" means the transformation is obtained by png_set_gray_to_rgb().
+ "G" means the transformation is obtained by png_set_rgb_to_gray().
"P" means the transformation is obtained by
png_set_expand_palette_to_rgb().
- "T" means the transformation is obtained by
- png_set_tRNS_to_alpha().
-
-PNG can have files with 16 bits per channel. If you only can handle
-8 bits per channel, this will strip the pixels down to 8 bit.
-
- if (bit_depth == 16)
- png_set_strip_16(png_ptr);
-
-If, for some reason, you don't need the alpha channel on an image,
-and you want to remove it rather than combining it with the background
-(but the image author certainly had in mind that you *would* combine
-it with the background, so that's what you should probably do):
-
- if (color_type & PNG_COLOR_MASK_ALPHA)
- png_set_strip_alpha(png_ptr);
+ "p" means the transformation is obtained by png_set_packing().
+ "Q" means the transformation is obtained by png_set_quantize().
+ "T" means the transformation is obtained by png_set_tRNS_to_alpha().
+ "B" means the transformation is obtained by png_set_background(), or
+ png_strip_alpha().
+
+When an entry has multiple transforms listed all are required to cause the
+right overall transformation. When two transforms are separated by a comma
+either will do the job. When transforms are enclosed in [] the transform should
+do the job but this is currently unimplemented - a different format will result
+if the suggested transformations are used.
In PNG files, the alpha channel in an image
is the level of opacity. If you need the alpha channel in an image to
@@ -1303,8 +1666,8 @@ with alpha.
if (color_type == PNG_COLOR_TYPE_RGB ||
color_type == PNG_COLOR_TYPE_RGB_ALPHA)
- png_set_rgb_to_gray_fixed(png_ptr, error_action,
- int red_weight, int green_weight);
+ png_set_rgb_to_gray(png_ptr, error_action, double red_weight,
+ double green_weight);
error_action = 1: silently do the conversion
@@ -1317,122 +1680,98 @@ with alpha.
image has any pixel where
red != green or red != blue
- red_weight: weight of red component times 100000
+ red_weight: weight of red component
- green_weight: weight of green component times 100000
+ green_weight: weight of green component
If either weight is negative, default
- weights (21268, 71514) are used.
+ weights are used.
+
+In the corresponding fixed point API the red_weight and green_weight values are
+simply scaled by 100,000:
+
+ png_set_rgb_to_gray(png_ptr, error_action, png_fixed_point red_weight,
+ png_fixed_point green_weight);
If you have set error_action = 1 or 2, you can
later check whether the image really was gray, after processing
the image rows, with the png_get_rgb_to_gray_status(png_ptr) function.
It will return a png_byte that is zero if the image was gray or
-1 if there were any non-gray pixels. bKGD and sBIT data
+1 if there were any non-gray pixels. Background and sBIT data
will be silently converted to grayscale, using the green channel
-data, regardless of the error_action setting.
+data for sBIT, regardless of the error_action setting.
-With red_weight+green_weight<=100000,
-the normalized graylevel is computed:
+The default values come from the PNG file cHRM chunk if present; otherwise, the
+defaults correspond to the ITU-R recommendation 709, and also the sRGB color
+space, as recommended in the Charles Poynton's Colour FAQ,
+<http://www.poynton.com/>, in section 9:
- int rw = red_weight * 65536;
- int gw = green_weight * 65536;
- int bw = 65536 - (rw + gw);
- gray = (rw*red + gw*green + bw*blue)/65536;
+ <http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC9>
-The default values approximate those recommended in the Charles
-Poynton's Color FAQ, <http://www.inforamp.net/~poynton/>
-Copyright (c) 1998-01-04 Charles Poynton <poynton at inforamp.net>
+ Y = 0.2126 * R + 0.7152 * G + 0.0722 * B
+
+Previous versions of this document, 1998 through 2002, recommended a slightly
+different formula:
Y = 0.212671 * R + 0.715160 * G + 0.072169 * B
-Libpng approximates this with integers scaled by 32768:
+Libpng uses an integer approximation:
Y = (6968 * R + 23434 * G + 2366 * B)/32768
The calculation is done in a linear colorspace, if the image gamma
can be determined.
-If you have a grayscale and you are using png_set_expand_depth(),
-png_set_expand(), or png_set_gray_to_rgb to change to truecolor or to
-a higher bit-depth, you must either supply the background color as a gray
-value at the original file bit-depth (need_expand = 1) or else supply the
-background color as an RGB triplet at the final, expanded bit depth
-(need_expand = 0). Similarly, if you are reading a paletted image, you
-must either supply the background color as a palette index (need_expand = 1)
-or as an RGB triplet that may or may not be in the palette (need_expand = 0).
+The png_set_background() function has been described already; it tells libpng to
+composite images with alpha or simple transparency against the supplied
+background color. For compatibility with versions of libpng earlier than
+libpng-1.5.4 it is recommended that you call the function after reading the file
+header, even if you don't want to use the color in a bKGD chunk, if one exists.
+
+If the PNG file contains a bKGD chunk (PNG_INFO_bKGD valid),
+you may use this color, or supply another color more suitable for
+the current display (e.g., the background color from a web page). You
+need to tell libpng how the color is represented, both the format of the
+component values in the color (the number of bits) and the gamma encoding of the
+color. The function takes two arguments, background_gamma_mode and need_expand
+to convey this information, however only two combinations are likely to be
+useful:
png_color_16 my_background;
png_color_16p image_background;
if (png_get_bKGD(png_ptr, info_ptr, &image_background))
png_set_background(png_ptr, image_background,
- PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
+ PNG_BACKGROUND_GAMMA_FILE, 1/*needs to be expanded*/, 1);
else
png_set_background(png_ptr, &my_background,
- PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0);
-
-The png_set_background() function tells libpng to composite images
-with alpha or simple transparency against the supplied background
-color. If the PNG file contains a bKGD chunk (PNG_INFO_bKGD valid),
-you may use this color, or supply another color more suitable for
-the current display (e.g., the background color from a web page). You
-need to tell libpng whether the color is in the gamma space of the
-display (PNG_BACKGROUND_GAMMA_SCREEN for colors you supply), the file
-(PNG_BACKGROUND_GAMMA_FILE for colors from the bKGD chunk), or one
-that is neither of these gammas (PNG_BACKGROUND_GAMMA_UNIQUE - I don't
-know why anyone would use this, but it's here).
-
-To properly display PNG images on any kind of system, the application needs
-to know what the display gamma is. Ideally, the user will know this, and
-the application will allow them to set it. One method of allowing the user
-to set the display gamma separately for each system is to check for a
-SCREEN_GAMMA or DISPLAY_GAMMA environment variable, which will hopefully be
-correctly set.
-
-Note that display_gamma is the overall gamma correction required to produce
-pleasing results, which depends on the lighting conditions in the surrounding
-environment. In a dim or brightly lit room, no compensation other than
-the physical gamma exponent of the monitor is needed, while in a dark room
-a slightly smaller exponent is better.
-
- double gamma, screen_gamma;
-
- if (/* We have a user-defined screen
- gamma value */)
- {
- screen_gamma = user_defined_screen_gamma;
- }
-
- /* One way that applications can share the same
- screen gamma value */
- else if ((gamma_str = getenv("SCREEN_GAMMA"))
- != NULL)
- {
- screen_gamma = (double)atof(gamma_str);
- }
-
- /* If we don't have another value */
- else
- {
- screen_gamma = 2.2; /* A good guess for a
- PC monitor in a bright office or a dim room */
-
- screen_gamma = 2.0; /* A good guess for a
- PC monitor in a dark room */
-
- screen_gamma = 1.7 or 1.0; /* A good
- guess for Mac systems */
- }
-
-The functions png_set_gamma() and its fixed point equivalent
-png_set_gamma_fixed() handle gamma transformations of the data.
-Pass both the file gamma and the current screen_gamma. If the file does
-not have a gamma value, you can pass one anyway if you have an idea what
-it is (usually 0.45455 is a good guess for GIF images on PCs). Note
-that file gammas are inverted from screen gammas. See the discussions
-on gamma in the PNG specification for an excellent description of what
-gamma is, and why all applications should support it. It is strongly
-recommended that PNG viewers support gamma correction.
+ PNG_BACKGROUND_GAMMA_SCREEN, 0/*do not expand*/, 1);
+
+The second call was described above - my_background is in the format of the
+final, display, output produced by libpng. Because you now know the format of
+the PNG it is possible to avoid the need to choose either 8-bit or 16-bit
+output and to retain palette images (the palette colors will be modified
+appropriately and the tRNS chunk removed.) However, if you are doing this,
+take great care not to ask for transformations without checking first that
+they apply!
+
+In the first call the background color has the original bit depth and color type
+of the PNG file. So, for palette images the color is supplied as a palette
+index and for low bit greyscale images the color is a reduced bit value in
+image_background->gray.
+
+If you didn't call png_set_gamma() before reading the file header, for example
+if you need your code to remain compatible with older versions of libpng prior
+to libpng-1.5.4, this is the place to call it.
+
+Do not call it if you called png_set_alpha_mode(); doing so will damage the
+settings put in place by png_set_alpha_mode(). (If png_set_alpha_mode() is
+supported then you can certainly do png_set_gamma() before reading the PNG
+header.)
+
+This API unconditionally sets the screen and file gamma values, so it will
+override the value in the PNG file unless it is called before the PNG file
+reading starts. For this reason you must always call it with the PNG file
+value when you call it in this position:
if (png_get_gAMA(png_ptr, info_ptr, &file_gamma))
png_set_gamma(png_ptr, screen_gamma, file_gamma);
@@ -1445,9 +1784,9 @@ file has more entries then will fit on your screen, png_set_quantize()
will do that. Note that this is a simple match quantization that merely
finds the closest color available. This should work fairly well with
optimized palettes, but fairly badly with linear color cubes. If you
-pass a palette that is larger then maximum_colors, the file will
+pass a palette that is larger than maximum_colors, the file will
reduce the number of colors in the palette so it will fit into
-maximum_colors. If there is a histogram, it will use it to make
+maximum_colors. If there is a histogram, libpng will use it to make
more intelligent choices when reducing the palette. If there is no
histogram, it may not do as good a job.
@@ -1488,7 +1827,7 @@ This function can also be used to invert grayscale and gray-alpha images:
color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
png_set_invert_mono(png_ptr);
-PNG files store 16 bit pixels in network byte order (big-endian,
+PNG files store 16-bit pixels in network byte order (big-endian,
ie. most significant bits first). This code changes the storage to the
other way (little-endian, i.e. least significant bits first, the
way PCs store them):
@@ -1511,7 +1850,7 @@ with
You must supply the function
- void read_transform_fn(png_structp png_ptr, row_info_ptr
+ void read_transform_fn(png_structp png_ptr, png_row_infop
row_info, png_bytep data)
See pngtest.c for a working example. Your function will be called
@@ -1519,7 +1858,7 @@ after all of the other transformations have been processed. Take care with
interlaced images if you do the interlace yourself - the width of the row is the
width in 'row_info', not the overall image width.
-If supported libpng provides two information routines that you can use to find
+If supported, libpng provides two information routines that you can use to find
where you are in processing the image:
png_get_current_pass_number(png_structp png_ptr);
@@ -1530,6 +1869,14 @@ supported if user transforms are supported, secondly they may well return
unexpected results unless the row is actually being processed at the moment they
are called.
+With interlaced
+images the value returned is the row in the input sub-image image. Use
+PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to
+find the output pixel (x,y) given an interlaced sub-image pixel (row,col,pass).
+
+The discussion of interlace handling above contains more information on how to
+use these values.
+
You can also set up a pointer to a user structure for use by your
callback function, and you can inform libpng that your transform
function will change the number of channels or bit depth with the
@@ -1555,13 +1902,16 @@ of the interlaced image.
After setting the transformations, libpng can update your png_info
structure to reflect any transformations you've requested with this
-call. This is most useful to update the info structure's rowbytes
-field so you can use it to allocate your image memory. This function
-will also update your palette with the correct screen_gamma and
-background if these have been given with the calls above.
+call.
png_read_update_info(png_ptr, info_ptr);
+This is most useful to update the info structure's rowbytes
+field so you can use it to allocate your image memory. This function
+will also update your palette with the correct screen_gamma and
+background if these have been given with the calls above. You may
+only call png_read_update_info() once with a particular info_ptr.
+
After you call png_read_update_info(), you can allocate any
memory you need to hold the image. The row data is simply
raw byte data for all forms of images. As the actual allocation
@@ -1570,7 +1920,7 @@ are allocating one large chunk, you will need to build an
array of pointers to each row, as it will be needed for some
of the functions below.
-Remember: Before you call png_read_update_info(), the png_get_
+Remember: Before you call png_read_update_info(), the png_get_*()
functions return the values corresponding to the original PNG image.
After you call png_read_update_info the values refer to the image
that libpng will output. Consequently you must call all the png_set_
@@ -1762,7 +2112,7 @@ to load the whole file into memory when it is interlaced.
libpng includes a test program, pngvalid, that illustrates reading and
writing of interlaced images. If you can't get interlacing to work in your
-code and don't want to leave it to libpng (the recommended approach) see
+code and don't want to leave it to libpng (the recommended approach), see
how pngvalid.c does it.
Finishing a sequential read
@@ -1772,15 +2122,39 @@ low-level interface, you can finish reading the file. If you are
interested in comments or time, which may be stored either before or
after the image data, you should pass the separate png_info struct if
you want to keep the comments from before and after the image
-separate. If you are not interested, you can pass NULL.
+separate.
+
+ png_infop end_info = png_create_info_struct(png_ptr);
+
+ if (!end_info)
+ {
+ png_destroy_read_struct(&png_ptr, &info_ptr,
+ (png_infopp)NULL);
+ return (ERROR);
+ }
png_read_end(png_ptr, end_info);
+If you are not interested, you should still call png_read_end()
+but you can pass NULL, avoiding the need to create an end_info structure.
+
+ png_read_end(png_ptr, (png_infop)NULL);
+
+If you don't call png_read_end(), then your file pointer will be
+left pointing to the first chunk after the last IDAT, which is probably
+not what you want if you expect to read something beyond the end of
+the PNG datastream.
+
When you are done, you can free all memory allocated by libpng like this:
png_destroy_read_struct(&png_ptr, &info_ptr,
&end_info);
+or, if you didn't create an end_info structure,
+
+ png_destroy_read_struct(&png_ptr, &info_ptr,
+ (png_infopp)NULL);
+
It is also possible to individually free the info_ptr members that
point to libpng-allocated storage with the following function:
@@ -2183,6 +2557,20 @@ To inform libpng about your function, use
png_set_write_status_fn(png_ptr, write_row_callback);
+When this function is called the row has already been completely processed and
+it has also been written out. The 'row' and 'pass' refer to the next row to be
+handled. For the
+non-interlaced case the row that was just handled is simply one less than the
+passed in row number, and pass will always be 0. For the interlaced case the
+same applies unless the row value is 0, in which case the row just handled was
+the last one from one of the preceding passes. Because interlacing may skip a
+pass you cannot be sure that the preceding pass is just 'pass-1', if you really
+need to know what the last pass is record (row,pass) from the callback and use
+the last recorded value each time.
+
+As with the user transform you can find the output row using the
+PNG_ROW_FROM_PASS_ROW macro.
+
You now have the option of modifying how the compression library will
run. The following functions are mainly for testing, but may be useful
in some cases, like if you need to write PNG files extremely fast and
@@ -2227,11 +2615,13 @@ which changes how much time zlib spends on trying to compress the image
data. See the Compression Library (zlib.h and algorithm.txt, distributed
with zlib) for details on the compression levels.
- /* set the zlib compression level */
+ #include zlib.h
+
+ /* Set the zlib compression level */
png_set_compression_level(png_ptr,
Z_BEST_COMPRESSION);
- /* set other zlib parameters */
+ /* Set other zlib parameters for compressing IDAT */
png_set_compression_mem_level(png_ptr, 8);
png_set_compression_strategy(png_ptr,
Z_DEFAULT_STRATEGY);
@@ -2239,7 +2629,15 @@ with zlib) for details on the compression levels.
png_set_compression_method(png_ptr, 8);
png_set_compression_buffer_size(png_ptr, 8192)
-extern PNG_EXPORT(void,png_set_zbuf_size)
+ /* Set zlib parameters for text compression
+ * If you don't call these, the parameters
+ * fall back on those defined for IDAT chunks
+ */
+ png_set_text_compression_mem_level(png_ptr, 8);
+ png_set_text_compression_strategy(png_ptr,
+ Z_DEFAULT_STRATEGY);
+ png_set_text_compression_window_bits(png_ptr, 15);
+ png_set_text_compression_method(png_ptr, 8);
Setting the contents of info for output
@@ -2327,6 +2725,28 @@ width, height, bit_depth, and color_type must be the same in each call.
int_file_gamma - 100,000 times the gamma at which
the image was created
+ png_set_cHRM(png_ptr, info_ptr, white_x, white_y, red_x, red_y,
+ green_x, green_y, blue_x, blue_y)
+ png_set_cHRM_XYZ(png_ptr, info_ptr, red_X, red_Y, red_Z, green_X,
+ green_Y, green_Z, blue_X, blue_Y, blue_Z)
+ png_set_cHRM_fixed(png_ptr, info_ptr, int_white_x, int_white_y,
+ int_red_x, int_red_y, int_green_x, int_green_y,
+ int_blue_x, int_blue_y)
+ png_set_cHRM_XYZ_fixed(png_ptr, info_ptr, int_red_X, int_red_Y,
+ int_red_Z, int_green_X, int_green_Y, int_green_Z,
+ int_blue_X, int_blue_Y, int_blue_Z)
+
+ {white,red,green,blue}_{x,y}
+ A color space encoding specified using the chromaticities
+ of the end points and the white point.
+
+ {red,green,blue}_{X,Y,Z}
+ A color space encoding specified using the encoding end
+ points - the CIE tristimulus specification of the intended
+ color of the red, green and blue channels in the PNG RGB
+ data. The white point is simply the sum of the three end
+ points.
+
png_set_sRGB(png_ptr, info_ptr, srgb_intent);
srgb_intent - the rendering intent
@@ -2387,14 +2807,14 @@ width, height, bit_depth, and color_type must be the same in each call.
trans_alpha - array of alpha (transparency)
entries for palette (PNG_INFO_tRNS)
+ num_trans - number of transparent entries
+ (PNG_INFO_tRNS)
+
trans_color - graylevel or color sample values
(in order red, green, blue) of the
single transparent color for
non-paletted images (PNG_INFO_tRNS)
- num_trans - number of transparent entries
- (PNG_INFO_tRNS)
-
png_set_hIST(png_ptr, info_ptr, hist);
hist - histogram of palette (array of
@@ -2407,7 +2827,8 @@ width, height, bit_depth, and color_type must be the same in each call.
png_set_bKGD(png_ptr, info_ptr, background);
- background - background color (PNG_VALID_bKGD)
+ background - background color (of type
+ png_color_16p) (PNG_VALID_bKGD)
png_set_text(png_ptr, info_ptr, text_ptr, num_text);
@@ -2431,9 +2852,15 @@ width, height, bit_depth, and color_type must be the same in each call.
empty for unknown).
text_ptr[i].translated_keyword - keyword in UTF-8 (NULL
or empty for unknown).
+
Note that the itxt_length, lang, and lang_key
- members of the text_ptr structure only exist
- when the library is built with iTXt chunk support.
+ members of the text_ptr structure only exist when the
+ library is built with iTXt chunk support. Prior to
+ libpng-1.4.0 the library was built by default without
+ iTXt support. Also note that when iTXt is supported,
+ they contain NULL pointers when the "compression"
+ field contains PNG_TEXT_COMPRESSION_NONE or
+ PNG_TEXT_COMPRESSION_zTXt.
num_text - number of comments
@@ -2483,6 +2910,7 @@ width, height, bit_depth, and color_type must be the same in each call.
unit - physical scale units (an integer)
width - width of a pixel in physical scale units
+ expressed as a string
height - height of a pixel in physical scale units
(width and height are strings like "2.54")
@@ -2524,7 +2952,7 @@ Because tEXt and zTXt chunks don't have a language field, if you
specify PNG_TEXT_COMPRESSION_NONE or PNG_TEXT_COMPRESSION_zTXt
any language code or translated keyword will not be written out.
-Until text gets around 1000 bytes, it is not worth compressing it.
+Until text gets around a few hundred bytes, it is not worth compressing it.
After the text has been written out to the file, the compression type
is set to PNG_TEXT_COMPRESSION_NONE_WR or PNG_TEXT_COMPRESSION_zTXt_WR,
so that it isn't written out again at the end (in case you are calling
@@ -2745,7 +3173,7 @@ is required by PNG.
png_set_shift(png_ptr, &sig_bit);
-PNG files store 16 bit pixels in network byte order (big-endian,
+PNG files store 16-bit pixels in network byte order (big-endian,
ie. most significant bits first). This code would be used if they are
supplied the other way (little-endian, i.e. least significant bits
first, the way PCs store them):
@@ -2779,8 +3207,8 @@ with
You must supply the function
- void write_transform_fn(png_structp png_ptr ptr,
- row_info_ptr row_info, png_bytep data)
+ void write_transform_fn(png_structp png_ptr, png_row_infop
+ row_info, png_bytep data)
See pngtest.c for a working example. Your function will be called
before any of the other transformations are processed. If supported
@@ -2788,9 +3216,15 @@ libpng also supplies an information routine that may be called from
your callback:
png_get_current_row_number(png_ptr);
+ png_get_current_pass_number(png_ptr);
-This returns the current row passed to the transform. Even with interlaced
-images the value returned is the row in the final output image.
+This returns the current row passed to the transform. With interlaced
+images the value returned is the row in the input sub-image image. Use
+PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to
+find the output pixel (x,y) given an interlaced sub-image pixel (row,col,pass).
+
+The discussion of interlace handling above contains more information on how to
+use these values.
You can also set up a pointer to a user structure for use by your
callback function.
@@ -3128,7 +3562,8 @@ However, there are some uncertainties about the status of local variables
after a longjmp, so the user may want to be careful about doing anything
after setjmp returns non-zero besides returning itself. Consult your
compiler documentation for more details. For an alternative approach, you
-may wish to use the "cexcept" facility (see http://cexcept.sourceforge.net).
+may wish to use the "cexcept" facility (see http://cexcept.sourceforge.net),
+which is illustrated in pngvalid.c and in contrib/visupng.
Custom chunks
@@ -3146,8 +3581,11 @@ and look at how other chunks were designed, so you can do things
similarly. Second, check out the sections of libpng that read and
write chunks. Try to find a chunk that is similar to yours and use
it as a template. More details can be found in the comments inside
-the code. It is best to handle unknown chunks in a generic method,
-via callback functions, instead of by modifying libpng functions.
+the code. It is best to handle private or unknown chunks in a generic method,
+via callback functions, instead of by modifying libpng functions. This
+is illustrated in pngtest.c, which uses a callback function to handle a
+private "vpAg" chunk and the new "sTER" chunk, which are both unknown to
+libpng.
If you wish to write your own transformation for the data, look through
the part of the code that does the transformations, and check out some of
@@ -3155,7 +3593,7 @@ the simpler ones to get an idea of how they work. Try to find a similar
transformation to the one you want to add and copy off of it. More details
can be found in the comments inside the code itself.
-Configuring for 16 bit platforms
+Configuring for 16-bit platforms
You will want to look into zconf.h to tell zlib (and thus libpng) that
it cannot allocate more then 64K at a time. Even if you can, the memory
@@ -3175,8 +3613,8 @@ defined, and FAR gets defined to far in pngconf.h, and you should be
all set. Everything in the library (except for zlib's structure) is
expecting far data. You must use the typedefs with the p or pp on
the end for pointers (or at least look at them and be careful). Make
-note that the rows of data are defined as png_bytepp, which is an
-unsigned char far * far *.
+note that the rows of data are defined as png_bytepp, which is
+an "unsigned char far * far *".
Configuring for gui/windowing platforms:
@@ -3194,7 +3632,10 @@ or delete an include, this is the place to do it.
The includes that are not needed outside libpng are placed in pngpriv.h,
which is only used by the routines inside libpng itself.
The files in libpng proper only include pngpriv.h and png.h, which
-in turn includes pngconf.h.
+in turn includes pngconf.h and, as of libpng-1.5.0, pnglibconf.h.
+As of libpng-1.5.0, pngpriv.h also includes three other private header
+files, pngstruct.h, pnginfo.h, and pngdebug.h, which contain material
+that previously appeared in the public headers.
Configuring zlib:
@@ -3210,6 +3651,7 @@ specify no compression (Z_NO_COMPRESSION = 0), but this would create
files larger than just storing the raw bitmap. You can specify the
compression level by calling:
+ #include zlib.h
png_set_compression_level(png_ptr, level);
Another useful one is to reduce the memory level used by the library.
@@ -3220,12 +3662,14 @@ other things, lower levels will result in sections of incompressible
data being emitted in smaller stored blocks, with a correspondingly
larger relative overhead of up to 15% in the worst case.
+ #include zlib.h
png_set_compression_mem_level(png_ptr, level);
The other functions are for configuring zlib. They are not recommended
for normal use and may result in writing an invalid PNG file. See
zlib.h for more information on what these mean.
+ #include zlib.h
png_set_compression_strategy(png_ptr,
strategy);
@@ -3233,8 +3677,28 @@ zlib.h for more information on what these mean.
window_bits);
png_set_compression_method(png_ptr, method);
+
png_set_compression_buffer_size(png_ptr, size);
+As of libpng version 1.5.4, additional APIs became
+available to set these separately for non-IDAT
+compressed chunks such as zTXt, iTXt, and iCCP:
+
+ #include zlib.h
+ #if PNG_LIBPNG_VER <= 10504
+ png_set_text_compression_level(png_ptr, level);
+
+ png_set_text_compression_mem_level(png_ptr, level);
+
+ png_set_text_compression_strategy(png_ptr,
+ strategy);
+
+ png_set_text_compression_window_bits(png_ptr,
+ window_bits);
+
+ png_set_text_compression_method(png_ptr, method);
+ #endif
+
Controlling row filtering
If you want to control whether libpng uses filtering or not, which
@@ -3340,8 +3804,8 @@ capability, which you'll still have).
All the reading and writing specific code are in separate files, so the
linker should only grab the files it needs. However, if you want to
make sure, or if you are building a stand alone library, all the
-reading files start with pngr and all the writing files start with
-pngw. The files that don't match either (like png.c, pngtrans.c, etc.)
+reading files start with "pngr" and all the writing files start with "pngw".
+The files that don't match either (like png.c, pngtrans.c, etc.)
are used for both reading and writing, and always need to be included.
The progressive reader is in pngpread.c
@@ -3460,6 +3924,9 @@ The number libpng_vn is constructed from the major version, minor
version with leading zero, and release number with leading zero,
(e.g., libpng_vn for version 1.0.7 is 10007).
+Note that this function does not take a png_ptr, so you can call it
+before you've created one.
+
You can also check which version of png.h you used when compiling your
application:
@@ -3623,12 +4090,12 @@ and memset(), respectively.
The function png_set_gray_1_2_4_to_8() was removed. It has been
deprecated since libpng-1.0.18 and 1.2.9, when it was replaced with
png_set_expand_gray_1_2_4_to_8() because the former function also
-expanded palette images.
+expanded any tRNS chunk to an alpha channel.
Macros for png_get_uint_16, png_get_uint_32, and png_get_int_32
were added and are used by default instead of the corresponding
functions. Unfortunately,
-from libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the
+from libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the
function) incorrectly returned a value of type png_uint_32.
We changed the prototype for png_malloc() from
@@ -3658,7 +4125,8 @@ The png_zalloc() function no longer zeroes out the memory that it
allocates.
Support for dithering was disabled by default in libpng-1.4.0, because
-been well tested and doesn't actually "dither". The code was not
+it has not been well tested and doesn't actually "dither".
+The code was not
removed, however, and could be enabled by building libpng with
PNG_READ_DITHER_SUPPORTED defined. In libpng-1.4.2, this support
was reenabled, but the function was renamed png_set_quantize() to
@@ -3671,9 +4139,19 @@ We removed the trailing '.' from the warning and error messages.
X. Changes to Libpng from version 1.4.x to 1.5.x
-From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the
+From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the
function) incorrectly returned a value of type png_uint_32.
+Checking for invalid palette index on read or write was added at libpng
+1.5.10. When an invalid index is found, libpng issues a benign error.
+This is enabled by default but can be disabled in each png_ptr with
+
+ png_set_check_for_invalid_index(png_ptr, allowed);
+
+ allowed - one of
+ 0: disable
+ 1: enable
+
A. Changes that affect users of libpng
There are no substantial API changes between the non-deprecated parts of
@@ -3695,10 +4173,9 @@ In png_get_iCCP, the type of "profile" was changed from png_charpp
to png_bytepp, and in png_set_iCCP, from png_charp to png_const_bytep.
There are changes of form in png.h, including new and changed macros to
-declare
-parts of the API. Some API functions with arguments that are pointers to
-data not modified within the function have been corrected to declare
-these arguments with PNG_CONST.
+declare parts of the API. Some API functions with arguments that are
+pointers to data not modified within the function have been corrected to
+declare these arguments with PNG_CONST.
Much of the internal use of C macros to control the library build has also
changed and some of this is visible in the exported header files, in
@@ -3708,7 +4185,8 @@ application code. (It is extremely rare for an application to do this.)
Any program that compiled against libpng 1.4 and did not use deprecated
features or access internal library structures should compile and work
-against libpng 1.5.
+against libpng 1.5, except for the change in the prototype for
+png_get_iCCP() and png_set_iCCP() API functions mentioned above.
libpng 1.5.0 adds PNG_ PASS macros to help in the reading and writing of
interlaced images. The macros return the number of rows and columns in
@@ -3716,10 +4194,10 @@ each pass and information that can be used to de-interlace and (if
absolutely necessary) interlace an image.
libpng 1.5.0 adds an API png_longjmp(png_ptr, value). This API calls
-the application provided png_longjmp_ptr on the internal, but application
-initialized, jmpbuf. It is provided as a convenience to avoid the need
-to use the png_jmpbuf macro, which had the unnecessary side effect of
-resetting the internal png_longjmp_ptr value.
+the application-provided png_longjmp_ptr on the internal, but application
+initialized, longjmp buffer. It is provided as a convenience to avoid
+the need to use the png_jmpbuf macro, which had the unnecessary side
+effect of resetting the internal png_longjmp_ptr value.
libpng 1.5.0 includes a complete fixed point API. By default this is
present along with the corresponding floating point API. In general the
@@ -3762,7 +4240,7 @@ reset by pngusr.h or by explicit settings on the compiler command line.
These settings may produce compiler warnings or errors in 1.5.0 because
of macro redefinition.
-From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the
+From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the
function) incorrectly returned a value of type png_uint_32. libpng 1.5.0
is consistent with the implementation in 1.4.5 and 1.2.x (where the macro
did not exist.)
@@ -3771,14 +4249,47 @@ Applications can now choose whether to use these macros or to call the
corresponding function by defining PNG_USE_READ_MACROS or
PNG_NO_USE_READ_MACROS before including png.h. Notice that this is
only supported from 1.5.0 -defining PNG_NO_USE_READ_MACROS prior to 1.5.0
- will lead to a link failure.
+will lead to a link failure.
+
+Prior to libpng-1.5.4, the zlib compressor used the same set of parameters
+when compressing the IDAT data and textual data such as zTXt and iCCP.
+In libpng-1.5.4 we reinitialized the zlib stream for each type of data.
+We added five png_set_text_*() functions for setting the parameters to
+use with textual data.
+
+Prior to libpng-1.5.4, the PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED
+option was off by default, and slightly inaccurate scaling occurred.
+This option can no longer be turned off, and the choice of accurate
+or inaccurate 16-to-8 scaling is by using the new png_set_scale_16_to_8()
+API for accurate scaling or the old png_set_strip_16_to_8() API for simple
+chopping.
+
+Prior to libpng-1.5.4, the png_set_user_limits() function could only be
+used to reduce the width and height limits from the value of
+PNG_USER_WIDTH_MAX and PNG_USER_HEIGHT_MAX, although this document said
+that it could be used to override them. Now this function will reduce or
+increase the limits.
+
+Starting in libpng-1.5.10, the user limits can be set en masse with the
+configuration option PNG_SAFE_LIMITS_SUPPORTED. If this option is enabled,
+a set of "safe" limits is applied in pngpriv.h. These can be overridden by
+application calls to png_set_user_limits(), png_set_user_chunk_cache_max(),
+and/or png_set_user_malloc_max() that increase or decrease the limits. Also,
+in libpng-1.5.10 the default width and height limits were increased
+from 1,000,000 to 0x7ffffff (i.e., made unlimited). Therefore, the
+limits are now
+ default safe
+ png_user_width_max 0x7fffffff 1,000,000
+ png_user_height_max 0x7fffffff 1,000,000
+ png_user_chunk_cache_max 0 (unlimited) 128
+ png_user_chunk_malloc_max 0 (unlimited) 8,000,000
B. Changes to the build and configuration of libpng
Details of internal changes to the library code can be found in the CHANGES
-file. These will be of no concern to the vast majority of library users or
-builders, however the few who configure libpng to a non-default feature
-set may need to change how this is done.
+file and in the GIT repository logs. These will be of no concern to the vast
+majority of library users or builders, however the few who configure libpng
+to a non-default feature set may need to change how this is done.
There should be no need for library builders to alter build scripts if
these use the distributed build support - configure or the makefiles -
@@ -3787,14 +4298,14 @@ to build pnglibconf.h where the corresponding makefile does not do so.
Building libpng with a non-default configuration has changed completely.
The old method using pngusr.h should still work correctly even though the
-way pngusr.h is used in the build has been changed, however library
+way pngusr.h is used in the build has been changed; however, library
builders will probably want to examine the changes to take advantage of
new capabilities and to simplify their build system.
B.1 Specific changes to library configuration capabilities
The library now supports a complete fixed point implementation and can
-thus be used on systems which have no floating point support or very
+thus be used on systems that have no floating point support or very
limited or slow support. Previously gamma correction, an essential part
of complete PNG support, required reasonably fast floating point.
@@ -3810,14 +4321,14 @@ pnglibconf.h
As part of this the mechanism used to choose procedure call standards on
those systems that allow a choice has been changed. At present this only
affects certain Microsoft (DOS, Windows) and IBM (OS/2) operating systems
-running on Intel processors. As before PNGAPI is defined where required
+running on Intel processors. As before, PNGAPI is defined where required
to control the exported API functions; however, two new macros, PNGCBAPI
and PNGCAPI, are used instead for callback functions (PNGCBAPI) and
(PNGCAPI) for functions that must match a C library prototype (currently
only png_longjmp_ptr, which must match the C longjmp function.) The new
approach is documented in pngconf.h
-Despite these changes libpng 1.5.0 only supports the native C function
+Despite these changes, libpng 1.5.0 only supports the native C function
calling standard on those platforms tested so far (__cdecl on Microsoft
Windows). This is because the support requirements for alternative
calling conventions seem to no longer exist. Developers who find it
@@ -3850,8 +4361,10 @@ if the feature is supported or:
/*#undef PNG_feature_SUPPORTED*/
if it is not. Library code consistently checks for the 'SUPPORTED' macro.
-It does not, and should not, check for the 'NO' macro which will not
-normally be defined even if the feature is not supported.
+It does not, and libpng applications should not, check for the 'NO' macro
+which will not normally be defined even if the feature is not supported.
+The 'NO' macros are only used internally for setting or not setting the
+corresponding 'SUPPORTED' macros.
Compatibility with the old names is provided as follows:
@@ -3908,10 +4421,10 @@ application built without PNG_USER_CONFIG defined would see the
unmodified, default, libpng API and thus would probably fail to link.
These mechanisms still work in the configure build and in any makefile
-build that builds pnglibconf.h although the feature selection macros
+build that builds pnglibconf.h, although the feature selection macros
have changed somewhat as described above. In 1.5.0, however, pngusr.h is
processed only once, when the exported header file pnglibconf.h is built.
-pngconf.h no longer includes pngusr.h, therefore it is ignored after the
+pngconf.h no longer includes pngusr.h, therefore pngusr.h is ignored after the
build of pnglibconf.h and it is never included in an application build.
The rarely used alternative of adding a list of feature macros to the
@@ -3925,7 +4438,7 @@ scripts/pnglibconf.dfa. This requires the program awk. Brian Kernighan
and all known later implementations (often called by subtly different
names - nawk and gawk for example) are adequate to build pnglibconf.h.
The Sun Microsystems (now Oracle) program 'awk' is an earlier version
-and does not work, this may also apply to other systems that have a
+and does not work; this may also apply to other systems that have a
functioning awk called 'nawk'.
Configuration options are now documented in scripts/pnglibconf.dfa. This
@@ -3967,8 +4480,8 @@ the libpng bug tracker at
We also accept patches built from the tar or zip distributions, and
simple verbal discriptions of bug fixes, reported either to the
-SourceForge bug tracker or to the png-mng-implement at lists.sf.net
-mailing list.
+SourceForge bug tracker, to the png-mng-implement at lists.sf.net
+mailing list, or directly to glennrp.
XIII. Coding style
@@ -4056,8 +4569,8 @@ above the comment that says
/* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */
To avoid polluting the global namespace, the names of all exported
-functions and variables begin with "png_", and all publicly visible C
-preprocessor macros begin with "PNG_". We request that applications that
+functions and variables begin with "png_", and all publicly visible C
+preprocessor macros begin with "PNG". We request that applications that
use libpng *not* begin any of their own symbols with either of these strings.
We put a space after each comma and after each semicolon
@@ -4073,6 +4586,9 @@ left parenthesis that follows it:
We prefer #ifdef and #ifndef to #if defined() and if !defined()
when there is only one macro being tested.
+We prefer to express integers that are used as bit masks in hex format,
+with an even number of lower-case hex digits (e.g., 0x00, 0xff, 0x0100).
+
We do not use the TAB character for indentation in the C sources.
Lines do not exceed 80 characters.
@@ -4081,13 +4597,13 @@ Other rules can be inferred by inspecting the libpng source.
XIV. Y2K Compliance in libpng
-February 3, 2011
+March 29, 2012
Since the PNG Development group is an ad-hoc body, we can't make
an official declaration.
This is your unofficial assurance that libpng from version 0.71 and
-upward through 1.5.1 are Y2K compliant. It is my belief that earlier
+upward through 1.5.10 are Y2K compliant. It is my belief that earlier
versions were also Y2K compliant.
Libpng only has three year fields. One is a 2-byte unsigned integer that
diff --git a/src/3rdparty/libpng/libpng.3 b/src/3rdparty/libpng/libpng.3
deleted file mode 100644
index ecc42777bf..0000000000
--- a/src/3rdparty/libpng/libpng.3
+++ /dev/null
@@ -1,5376 +0,0 @@
-.TH LIBPNG 3 "February 3, 2011"
-.SH NAME
-libpng \- Portable Network Graphics (PNG) Reference Library 1.5.1
-.SH SYNOPSIS
-\fI\fB
-
-\fB#include <png.h>\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_access_version_number \fI(void\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_benign_error (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fIerror\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_build_grayscale_palette (int \fP\fIbit_depth\fP\fB, png_colorp \fIpalette\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_voidp png_calloc (png_structp \fP\fIpng_ptr\fP\fB, png_alloc_size_t \fIsize\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_chunk_benign_error (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fIerror\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_chunk_error (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fIerror\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_chunk_warning (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fImessage\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_convert_from_struct_tm (png_timep \fP\fIptime\fP\fB, struct tm FAR * \fIttime\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_convert_from_time_t (png_timep \fP\fIptime\fP\fB, time_t \fIttime\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_charp png_convert_to_rfc1123 (png_structp \fP\fIpng_ptr\fP\fB, png_timep \fIptime\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_infop png_create_info_struct (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_structp png_create_read_struct (png_const_charp \fP\fIuser_png_ver\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fIwarn_fn\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_structp png_create_read_struct_2 (png_const_charp \fP\fIuser_png_ver\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fP\fIwarn_fn\fP\fB, png_voidp \fP\fImem_ptr\fP\fB, png_malloc_ptr \fP\fImalloc_fn\fP\fB, png_free_ptr \fIfree_fn\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_structp png_create_write_struct (png_const_charp \fP\fIuser_png_ver\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fIwarn_fn\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_structp png_create_write_struct_2 (png_const_charp \fP\fIuser_png_ver\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fP\fIwarn_fn\fP\fB, png_voidp \fP\fImem_ptr\fP\fB, png_malloc_ptr \fP\fImalloc_fn\fP\fB, png_free_ptr \fIfree_fn\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_data_freer (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fIfreer\fP\fB, png_uint_32 \fImask)\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_destroy_info_struct (png_structp \fP\fIpng_ptr\fP\fB, png_infopp \fIinfo_ptr_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_destroy_read_struct (png_structpp \fP\fIpng_ptr_ptr\fP\fB, png_infopp \fP\fIinfo_ptr_ptr\fP\fB, png_infopp \fIend_info_ptr_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_destroy_write_struct (png_structpp \fP\fIpng_ptr_ptr\fP\fB, png_infopp \fIinfo_ptr_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_err (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_error (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fIerror\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_free (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fIptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_free_chunk_list (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_free_default (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fIptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_free_data (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fInum\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_byte png_get_bit_depth (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_bKGD (png_const_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_color_16p \fI*background\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_byte png_get_channels (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_cHRM (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, double \fP\fI*white_x\fP\fB, double \fP\fI*white_y\fP\fB, double \fP\fI*red_x\fP\fB, double \fP\fI*red_y\fP\fB, double \fP\fI*green_x\fP\fB, double \fP\fI*green_y\fP\fB, double \fP\fI*blue_x\fP\fB, double \fI*blue_y\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_cHRM_fixed (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*white_x\fP\fB, png_uint_32 \fP\fI*white_y\fP\fB, png_uint_32 \fP\fI*red_x\fP\fB, png_uint_32 \fP\fI*red_y\fP\fB, png_uint_32 \fP\fI*green_x\fP\fB, png_uint_32 \fP\fI*green_y\fP\fB, png_uint_32 \fP\fI*blue_x\fP\fB, png_uint_32 \fI*blue_y\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_chunk_cache_max (png_const_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fI\fB
-
-\fBpng_alloc_size_t png_get_chunk_malloc_max (png_const_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_byte png_get_color_type (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_compression_buffer_size (png_const_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_byte png_get_compression_type (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_byte png_get_copyright (png_const_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_current_row_number \fI(png_const_structp\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_byte png_get_current_pass_number \fI(png_const_structp\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_voidp png_get_error_ptr (png_const_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_byte png_get_filter_type (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_gAMA (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, double \fI*file_gamma\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_gAMA_fixed (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fI*int_file_gamma\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_byte png_get_header_ver (png_const_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_byte png_get_header_version (png_const_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_hIST (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_16p \fI*hist\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_iCCP (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_charpp \fP\fIname\fP\fB, int \fP\fI*compression_type\fP\fB, png_bytepp \fP\fIprofile\fP\fB, png_uint_32 \fI*proflen\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_IHDR (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*width\fP\fB, png_uint_32 \fP\fI*height\fP\fB, int \fP\fI*bit_depth\fP\fB, int \fP\fI*color_type\fP\fB, int \fP\fI*interlace_type\fP\fB, int \fP\fI*compression_type\fP\fB, int \fI*filter_type\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_image_height (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_image_width (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_int_32 png_get_int_32 (png_bytep \fIbuf\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_byte png_get_interlace_type (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_const_bytep png_get_io_chunk_name (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_io_chunk_type (png_const_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_voidp png_get_io_ptr (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_io_state (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_byte png_get_libpng_ver (png_const_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_voidp png_get_mem_ptr (png_const_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_oFFs (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*offset_x\fP\fB, png_uint_32 \fP\fI*offset_y\fP\fB, int \fI*unit_type\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_pCAL (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_charp \fP\fI*purpose\fP\fB, png_int_32 \fP\fI*X0\fP\fB, png_int_32 \fP\fI*X1\fP\fB, int \fP\fI*type\fP\fB, int \fP\fI*nparams\fP\fB, png_charp \fP\fI*units\fP\fB, png_charpp \fI*params\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_pHYs (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*res_x\fP\fB, png_uint_32 \fP\fI*res_y\fP\fB, int \fI*unit_type\fP\fB);\fP
-
-\fI\fB
-
-\fBfloat png_get_pixel_aspect_ratio (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_pHYs_dpi (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*res_x\fP\fB, png_uint_32 \fP\fI*res_y\fP\fB, int \fI*unit_type\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_fixed_point png_get_pixel_aspect_ratio_fixed (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_pixels_per_inch (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_pixels_per_meter (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_voidp png_get_progressive_ptr (png_const_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_PLTE (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_colorp \fP\fI*palette\fP\fB, int \fI*num_palette\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_byte png_get_rgb_to_gray_status (png_const_structp \fIpng_ptr)
-
-\fBpng_uint_32 png_get_rowbytes (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_bytepp png_get_rows (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_sBIT (png_const_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_color_8p \fI*sig_bit\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_get_sCAL (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, int* \fP\fIunit\fP\fB, double* \fP\fIwidth\fP\fB, double* \fIheight\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_get_sCAL_fixed (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, int* \fP\fIunit\fP\fB, png_fixed_pointp \fP\fIwidth\fP\fB, png_fixed_pointp \fIheight\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_get_sCAL_s (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, int* \fP\fIunit\fP\fB, png_charpp \fP\fIwidth\fP\fB, png_charpp \fIheight\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_bytep png_get_signature (png_const_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_sPLT (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_spalette_p \fI*splt_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_sRGB (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, int \fI*file_srgb_intent\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_text (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_textp \fP\fI*text_ptr\fP\fB, int \fI*num_text\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_tIME (png_const_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_timep \fI*mod_time\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_tRNS (png_const_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_bytep \fP\fI*trans_alpha\fP\fB, int \fP\fI*num_trans\fP\fB, png_color_16p \fI*trans_color\fP\fB);\fP
-
-\fI\fB
-
-\fB/* This function is really an inline macro. \fI*/
-
-\fBpng_uint_16 png_get_uint_16 (png_bytep \fIbuf\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_uint_31 (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fIbuf\fP\fB);\fP
-
-\fI\fB
-
-\fB/* This function is really an inline macro. \fI*/
-
-\fBpng_uint_32 png_get_uint_32 (png_bytep \fIbuf\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_unknown_chunks (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_unknown_chunkpp \fIunknowns\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_voidp png_get_user_chunk_ptr (png_const_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_user_height_max (png_const_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_voidp png_get_user_transform_ptr (png_const_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_user_width_max (png_const_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_valid (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIflag\fP\fB);\fP
-
-\fI\fB
-
-\fBfloat png_get_x_offset_inches (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_fixed_point png_get_x_offset_inches_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_int_32 png_get_x_offset_microns (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_int_32 png_get_x_offset_pixels (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_x_pixels_per_inch (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_x_pixels_per_meter (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBfloat png_get_y_offset_inches (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_fixed_point png_get_y_offset_inches_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_int_32 png_get_y_offset_microns (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_int_32 png_get_y_offset_pixels (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_y_pixels_per_inch (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_get_y_pixels_per_meter (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBint png_handle_as_unknown (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fIchunk_name\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_info_init_3 (png_infopp \fP\fIinfo_ptr\fP\fB, png_size_t \fIpng_info_struct_size\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_init_io (png_structp \fP\fIpng_ptr\fP\fB, FILE \fI*fp\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_longjmp (png_structp \fP\fIpng_ptr\fP\fB, int \fIval\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_voidp png_malloc (png_structp \fP\fIpng_ptr\fP\fB, png_alloc_size_t \fIsize\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_voidp png_malloc_default (png_structp \fP\fIpng_ptr\fP\fB, png_alloc_size_t \fIsize\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_voidp png_malloc_warn (png_structp \fP\fIpng_ptr\fP\fB, png_alloc_size_t \fIsize\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_permit_mng_features (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fImng_features_permitted\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_process_data (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_bytep \fP\fIbuffer\fP\fB, png_size_t \fIbuffer_size\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_size_t png_process_data_pause \fP\fI(png_structp\fP\fB, int \fIsave\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_process_data_skip \fI(png_structp\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_progressive_combine_row (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIold_row\fP\fB, png_bytep \fInew_row\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_read_end (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_read_image (png_structp \fP\fIpng_ptr\fP\fB, png_bytepp \fIimage\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_read_info (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_read_png (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fItransforms\fP\fB, png_voidp \fIparams\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_read_row (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIrow\fP\fB, png_bytep \fIdisplay_row\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_read_rows (png_structp \fP\fIpng_ptr\fP\fB, png_bytepp \fP\fIrow\fP\fB, png_bytepp \fP\fIdisplay_row\fP\fB, png_uint_32 \fInum_rows\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_read_update_info (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBint png_reset_zstream (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_save_int_32 (png_bytep \fP\fIbuf\fP\fB, png_int_32 \fIi\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_save_uint_16 (png_bytep \fP\fIbuf\fP\fB, unsigned int \fIi\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_save_uint_32 (png_bytep \fP\fIbuf\fP\fB, png_uint_32 \fIi\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_add_alpha (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIfiller\fP\fB, int \fIflags\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_background (png_structp \fP\fIpng_ptr\fP\fB, png_color_16p \fP\fIbackground_color\fP\fB, int \fP\fIbackground_gamma_code\fP\fB, int \fP\fIneed_expand\fP\fB, double \fIbackground_gamma\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_background_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_color_16p \fP\fIbackground_color\fP\fB, int \fP\fIbackground_gamma_code\fP\fB, int \fP\fIneed_expand\fP\fB, png_uint_32 \fIbackground_gamma\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_benign_errors (png_structp \fP\fIpng_ptr\fP\fB, int \fIallowed\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_bgr (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_bKGD (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_color_16p \fIbackground\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_cHRM (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, double \fP\fIwhite_x\fP\fB, double \fP\fIwhite_y\fP\fB, double \fP\fIred_x\fP\fB, double \fP\fIred_y\fP\fB, double \fP\fIgreen_x\fP\fB, double \fP\fIgreen_y\fP\fB, double \fP\fIblue_x\fP\fB, double \fIblue_y\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_cHRM_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fIwhite_x\fP\fB, png_uint_32 \fP\fIwhite_y\fP\fB, png_uint_32 \fP\fIred_x\fP\fB, png_uint_32 \fP\fIred_y\fP\fB, png_uint_32 \fP\fIgreen_x\fP\fB, png_uint_32 \fP\fIgreen_y\fP\fB, png_uint_32 \fP\fIblue_x\fP\fB, png_uint_32 \fIblue_y\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_chunk_cache_max (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIuser_chunk_cache_max\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_compression_level (png_structp \fP\fIpng_ptr\fP\fB, int \fIlevel\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_compression_mem_level (png_structp \fP\fIpng_ptr\fP\fB, int \fImem_level\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_compression_method (png_structp \fP\fIpng_ptr\fP\fB, int \fImethod\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_compression_strategy (png_structp \fP\fIpng_ptr\fP\fB, int \fIstrategy\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_compression_window_bits (png_structp \fP\fIpng_ptr\fP\fB, int \fIwindow_bits\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_crc_action (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIcrit_action\fP\fB, int \fIancil_action\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_error_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fIwarning_fn\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_expand (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_expand_gray_1_2_4_to_8 (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_filler (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIfiller\fP\fB, int \fIflags\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_filter (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fImethod\fP\fB, int \fIfilters\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_filter_heuristics (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIheuristic_method\fP\fB, int \fP\fInum_weights\fP\fB, png_doublep \fP\fIfilter_weights\fP\fB, png_doublep \fIfilter_costs\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_filter_heuristics_fixed (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIheuristic_method\fP\fB, int \fP\fInum_weights\fP\fB, png_fixed_point_p \fP\fIfilter_weights\fP\fB, png_fixed_point_p \fIfilter_costs\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_flush (png_structp \fP\fIpng_ptr\fP\fB, int \fInrows\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_gamma (png_structp \fP\fIpng_ptr\fP\fB, double \fP\fIscreen_gamma\fP\fB, double \fIdefault_file_gamma\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_gamma_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIscreen_gamma\fP\fB, png_uint_32 \fIdefault_file_gamma\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_gAMA (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, double \fIfile_gamma\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_gAMA_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIfile_gamma\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_gray_1_2_4_to_8 (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_gray_to_rgb (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_hIST (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_16p \fIhist\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_iCCP (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_const_charp \fP\fIname\fP\fB, int \fP\fIcompression_type\fP\fB, png_const_bytep \fP\fIprofile\fP\fB, png_uint_32 \fIproflen\fP\fB);\fP
-
-\fI\fB
-
-\fBint png_set_interlace_handling (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_invalid (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fImask\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_invert_alpha (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_invert_mono (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_IHDR (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fIwidth\fP\fB, png_uint_32 \fP\fIheight\fP\fB, int \fP\fIbit_depth\fP\fB, int \fP\fIcolor_type\fP\fB, int \fP\fIinterlace_type\fP\fB, int \fP\fIcompression_type\fP\fB, int \fIfilter_type\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_keep_unknown_chunks (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIkeep\fP\fB, png_bytep \fP\fIchunk_list\fP\fB, int \fInum_chunks\fP\fB);\fP
-
-\fI\fB
-
-\fBjmp_buf* png_set_longjmp_fn (png_structp \fP\fIpng_ptr\fP\fB, png_longjmp_ptr \fP\fIlongjmp_fn\fP\fB, size_t \fIjmp_buf_size\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_chunk_malloc_max (png_structp \fP\fIpng_ptr\fP\fB, png_alloc_size_t \fIuser_chunk_cache_max\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_compression_buffer_size (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIsize\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_mem_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fImem_ptr\fP\fB, png_malloc_ptr \fP\fImalloc_fn\fP\fB, png_free_ptr \fIfree_fn\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_oFFs (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fIoffset_x\fP\fB, png_uint_32 \fP\fIoffset_y\fP\fB, int \fIunit_type\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_packing (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_packswap (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_palette_to_rgb (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_pCAL (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_charp \fP\fIpurpose\fP\fB, png_int_32 \fP\fIX0\fP\fB, png_int_32 \fP\fIX1\fP\fB, int \fP\fItype\fP\fB, int \fP\fInparams\fP\fB, png_charp \fP\fIunits\fP\fB, png_charpp \fIparams\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_pHYs (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fIres_x\fP\fB, png_uint_32 \fP\fIres_y\fP\fB, int \fIunit_type\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_progressive_read_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIprogressive_ptr\fP\fB, png_progressive_info_ptr \fP\fIinfo_fn\fP\fB, png_progressive_row_ptr \fP\fIrow_fn\fP\fB, png_progressive_end_ptr \fIend_fn\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_PLTE (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_colorp \fP\fIpalette\fP\fB, int \fInum_palette\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_quantize (png_structp \fP\fIpng_ptr\fP\fB, png_colorp \fP\fIpalette\fP\fB, int \fP\fInum_palette\fP\fB, int \fP\fImaximum_colors\fP\fB, png_uint_16p \fP\fIhistogram\fP\fB, int \fIfull_quantize\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_read_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIio_ptr\fP\fB, png_rw_ptr \fIread_data_fn\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_read_status_fn (png_structp \fP\fIpng_ptr\fP\fB, png_read_status_ptr \fIread_row_fn\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_read_user_chunk_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIuser_chunk_ptr\fP\fB, png_user_chunk_ptr \fIread_user_chunk_fn\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_read_user_transform_fn (png_structp \fP\fIpng_ptr\fP\fB, png_user_transform_ptr \fIread_user_transform_fn\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_rgb_to_gray (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIerror_action\fP\fB, double \fP\fIred\fP\fB, double \fIgreen\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_rgb_to_gray_fixed (png_structp \fP\fIpng_ptr\fP\fB, int error_action png_uint_32 \fP\fIred\fP\fB, png_uint_32 \fIgreen\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_rows (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_bytepp \fIrow_pointers\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_sBIT (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_color_8p \fIsig_bit\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_sCAL (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fIunit\fP\fB, double \fP\fIwidth\fP\fB, double \fIheight\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_sCAL_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fIunit\fP\fB, png_fixed_point \fP\fIwidth\fP\fB, png_fixed_point \fIheight\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_sCAL_s (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fIunit\fP\fB, png_charp \fP\fIwidth\fP\fB, png_charp \fIheight\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_shift (png_structp \fP\fIpng_ptr\fP\fB, png_color_8p \fItrue_bits\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_sig_bytes (png_structp \fP\fIpng_ptr\fP\fB, int \fInum_bytes\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_sPLT (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_spalette_p \fP\fIsplt_ptr\fP\fB, int \fInum_spalettes\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_sRGB (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fIsrgb_intent\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_sRGB_gAMA_and_cHRM (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fIsrgb_intent\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_strip_16 (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_strip_alpha (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_strip_error_numbers (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIstrip_mode\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_swap (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_swap_alpha (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_text (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_textp \fP\fItext_ptr\fP\fB, int \fInum_text\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_tIME (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_timep \fImod_time\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_tRNS (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_bytep \fP\fItrans_alpha\fP\fB, int \fP\fInum_trans\fP\fB, png_color_16p \fItrans_color\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_tRNS_to_alpha (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBpng_uint_32 png_set_unknown_chunks (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_unknown_chunkp \fP\fIunknowns\fP\fB, int \fP\fInum\fP\fB, int \fIlocation\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_unknown_chunk_location (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fIchunk\fP\fB, int \fIlocation\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_user_limits (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIuser_width_max\fP\fB, png_uint_32 \fIuser_height_max\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_user_transform_info (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIuser_transform_ptr\fP\fB, int \fP\fIuser_transform_depth\fP\fB, int \fIuser_transform_channels\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_write_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIio_ptr\fP\fB, png_rw_ptr \fP\fIwrite_data_fn\fP\fB, png_flush_ptr \fIoutput_flush_fn\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_write_status_fn (png_structp \fP\fIpng_ptr\fP\fB, png_write_status_ptr \fIwrite_row_fn\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_set_write_user_transform_fn (png_structp \fP\fIpng_ptr\fP\fB, png_user_transform_ptr \fIwrite_user_transform_fn\fP\fB);\fP
-
-\fI\fB
-
-\fBint png_sig_cmp (png_bytep \fP\fIsig\fP\fB, png_size_t \fP\fIstart\fP\fB, png_size_t \fInum_to_check\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_start_read_image (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_warning (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fImessage\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_write_chunk (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIchunk_name\fP\fB, png_bytep \fP\fIdata\fP\fB, png_size_t \fIlength\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_write_chunk_data (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIdata\fP\fB, png_size_t \fIlength\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_write_chunk_end (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_write_chunk_start (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIchunk_name\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_write_end (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_write_flush (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_write_image (png_structp \fP\fIpng_ptr\fP\fB, png_bytepp \fIimage\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_write_info (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_write_info_before_PLTE (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_write_png (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fItransforms\fP\fB, png_voidp \fIparams\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_write_row (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fIrow\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_write_rows (png_structp \fP\fIpng_ptr\fP\fB, png_bytepp \fP\fIrow\fP\fB, png_uint_32 \fInum_rows\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_write_sig (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
-\fBvoidpf png_zalloc (voidpf \fP\fIpng_ptr\fP\fB, uInt \fP\fIitems\fP\fB, uInt \fIsize\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_zfree (voidpf \fP\fIpng_ptr\fP\fB, voidpf \fIptr\fP\fB);\fP
-
-\fI\fB
-
-.SH DESCRIPTION
-The
-.I libpng
-library supports encoding, decoding, and various manipulations of
-the Portable Network Graphics (PNG) format image files. It uses the
-.IR zlib(3)
-compression library.
-Following is a copy of the libpng-manual.txt file that accompanies libpng.
-.SH LIBPNG.TXT
-libpng-manual.txt - A description on how to use and modify libpng
-
- libpng version 1.5.1 - February 3, 2011
- Updated and distributed by Glenn Randers-Pehrson
- <glennrp at users.sourceforge.net>
- Copyright (c) 1998-2011 Glenn Randers-Pehrson
-
- This document is released under the libpng license.
- For conditions of distribution and use, see the disclaimer
- and license in png.h
-
- Based on:
-
- libpng versions 0.97, January 1998, through 1.5.1 - February 3, 2011
- Updated and distributed by Glenn Randers-Pehrson
- Copyright (c) 1998-2011 Glenn Randers-Pehrson
-
- libpng 1.0 beta 6 version 0.96 May 28, 1997
- Updated and distributed by Andreas Dilger
- Copyright (c) 1996, 1997 Andreas Dilger
-
- libpng 1.0 beta 2 - version 0.88 January 26, 1996
- For conditions of distribution and use, see copyright
- notice in png.h. Copyright (c) 1995, 1996 Guy Eric
- Schalnat, Group 42, Inc.
-
- Updated/rewritten per request in the libpng FAQ
- Copyright (c) 1995, 1996 Frank J. T. Wojcik
- December 18, 1995 & January 20, 1996
-
-.SH I. Introduction
-
-This file describes how to use and modify the PNG reference library
-(known as libpng) for your own use. There are five sections to this
-file: introduction, structures, reading, writing, and modification and
-configuration notes for various special platforms. In addition to this
-file, example.c is a good starting point for using the library, as
-it is heavily commented and should include everything most people
-will need. We assume that libpng is already installed; see the
-INSTALL file for instructions on how to install libpng.
-
-For examples of libpng usage, see the files "example.c", "pngtest.c",
-and the files in the "contrib" directory, all of which are included in
-the libpng distribution.
-
-Libpng was written as a companion to the PNG specification, as a way
-of reducing the amount of time and effort it takes to support the PNG
-file format in application programs.
-
-The PNG specification (second edition), November 2003, is available as
-a W3C Recommendation and as an ISO Standard (ISO/IEC 15948:2003 (E)) at
-<http://www.w3.org/TR/2003/REC-PNG-20031110/
-The W3C and ISO documents have identical technical content.
-
-The PNG-1.2 specification is available at
-<http://www.libpng.org/pub/png/documents/>. It is technically equivalent
-to the PNG specification (second edition) but has some additional material.
-
-The PNG-1.0 specification is available
-as RFC 2083 <http://www.libpng.org/pub/png/documents/> and as a
-W3C Recommendation <http://www.w3.org/TR/REC.png.html>.
-
-Some additional chunks are described in the special-purpose public chunks
-documents at <http://www.libpng.org/pub/png/documents/>.
-
-Other information
-about PNG, and the latest version of libpng, can be found at the PNG home
-page, <http://www.libpng.org/pub/png/>.
-
-Most users will not have to modify the library significantly; advanced
-users may want to modify it more. All attempts were made to make it as
-complete as possible, while keeping the code easy to understand.
-Currently, this library only supports C. Support for other languages
-is being considered.
-
-Libpng has been designed to handle multiple sessions at one time,
-to be easily modifiable, to be portable to the vast majority of
-machines (ANSI, K&R, 16-, 32-, and 64-bit) available, and to be easy
-to use. The ultimate goal of libpng is to promote the acceptance of
-the PNG file format in whatever way possible. While there is still
-work to be done (see the TODO file), libpng should cover the
-majority of the needs of its users.
-
-Libpng uses zlib for its compression and decompression of PNG files.
-Further information about zlib, and the latest version of zlib, can
-be found at the zlib home page, <http://www.info-zip.org/pub/infozip/zlib/>.
-The zlib compression utility is a general purpose utility that is
-useful for more than PNG files, and can be used without libpng.
-See the documentation delivered with zlib for more details.
-You can usually find the source files for the zlib utility wherever you
-find the libpng source files.
-
-Libpng is thread safe, provided the threads are using different
-instances of the structures. Each thread should have its own
-png_struct and png_info instances, and thus its own image.
-Libpng does not protect itself against two threads using the
-same instance of a structure.
-
-.SH II. Structures
-
-There are two main structures that are important to libpng, png_struct
-and png_info. Both are internal structures that are no longer exposed
-in the libpng interface (as of libpng 1.5.0).
-
-The png_info structure is designed to provide information about the
-PNG file. At one time, the fields of png_info were intended to be
-directly accessible to the user. However, this tended to cause problems
-with applications using dynamically loaded libraries, and as a result
-a set of interface functions for png_info (the png_get_*() and png_set_*()
-functions) was developed.
-
-The png_struct structure is the object used by the library to decode a
-single image. As of 1.5.0 this structure is also not exposed.
-
-Almost all libpng APIs require a pointer to a png_struct as the first argument.
-Many (in particular the png_set and png_get APIs) also require a pointer
-to png_info as the second argument. Some application visible macros
-defined in png.h designed for basic data access (reading and writing
-integers in the PNG format) break this rule, but it's almost always safe
-to assume that a (png_struct*) has to be passed to call an API function.
-
-The png.h header file is an invaluable reference for programming with libpng.
-And while I'm on the topic, make sure you include the libpng header file:
-
-#include <png.h>
-
-.SS Types
-
-The png.h header file defines a number of integral types used by the
-APIs. Most of these are fairly obvious; for example types corresponding
-to integers of particular sizes and types for passing color values.
-
-One exception is how non-integral numbers are handled. For application
-convenience most APIs that take such numbers have C (double) arguments,
-however internally PNG, and libpng, use 32 bit signed integers and encode
-the value by multiplying by 100,000. As of libpng 1.5.0 a convenience
-macro PNG_FP_1 is defined in png.h along with a type (png_fixed_point)
-which is simply (png_int_32).
-
-All APIs that take (double) arguments also have an matching API that
-takes the corresponding fixed point integer arguments. The fixed point
-API has the same name as the floating point one with _fixed appended.
-The actual range of values permitted in the APIs is frequently less than
-the full range of (png_fixed_point) (-21474 to +21474). When APIs require
-a non-negative argument the type is recorded as png_uint_32 above. Consult
-the header file and the text below for more information.
-
-Special care must be take with sCAL chunk handling because the chunk itself
-uses non-integral values encoded as strings containing decimal floating point
-numbers. See the comments in the header file.
-
-.SS Configuration
-
-The main header file function declarations are frequently protected by C
-preprocessing directives of the form:
-
- #ifdef PNG_feature_SUPPORTED
- declare-function
- #endif
-
-The library can be built without support for these APIs, although a
-standard build will have all implemented APIs. Application programs
-should check the feature macros before using an API for maximum
-portability. From libpng 1.5.0 the feature macros set during the build
-of libpng are recorded in the header file "pnglibconf.h" and this file
-is always included by png.h.
-
-If you don't need to change the library configuration from the default skip to
-the next section ("Reading").
-
-Notice that some of the makefiles in the 'scripts' directory and (in 1.5.0) all
-of the build project files in the 'projects' directory simply copy
-scripts/pnglibconf.h.prebuilt to pnglibconf.h. This means that these build
-systems do not permit easy auto-configuration of the library - they only
-support the default configuration.
-
-The easiest way to make minor changes to the libpng configuration when
-auto-configuration is supported is to add definitions to the command line
-using (typically) CPPFLAGS. For example:
-
-CPPFLAGS=-DPNG_NO_FLOATING_ARITHMETIC
-
-will change the internal libpng math implementation for gamma correction and
-other arithmetic calculations to fixed point, avoiding the need for fast
-floating point support. The result can be seen in the generated pnglibconf.h -
-make sure it contains the changed feature macro setting.
-
-If you need to make more extensive configuration changes - more than one or two
-feature macro settings - you can either add -DPNG_USER_CONFIG to the build
-command line and put a list of feature macro settings in pngusr.h or you can set
-DFA_XTRA (a makefile variable) to a file containing the same information in the
-form of 'option' settings.
-
-A. Changing pnglibconf.h
-
-A variety of methods exist to build libpng. Not all of these support
-reconfiguration of pnglibconf.h. To reconfigure pnglibconf.h it must either be
-rebuilt from scripts/pnglibconf.dfa using awk or it must be edited by hand.
-
-Hand editing is achieved by copying scripts/pnglibconf.h.prebuilt and changing
-the lines defining the supported features, paying very close attention to the
-'option' information in scripts/pnglibconf.dfa that describes those features and
-their requirements. This is easy to get wrong.
-
-B. Configuration using DFA_XTRA
-
-Rebuilding from pnglibconf.dfa is easy if a functioning 'awk', or a later
-variant such as 'nawk' or 'gawk', is available. The configure build will
-automatically find an appropriate awk and build pnglibconf.h.
-scripts/pnglibconf.mak contains a set of make rules for doing the same thing if
-configure is not used, and many of the makefiles in the scripts directory use
-this approach.
-
-When rebuilding simply write new file containing changed options and set
-DFA_XTRA to the name of this file. This causes the build to append the new file
-to the end of scripts/pnglibconf.dfa. pngusr.dfa should contain lines of the
-following forms:
-
-everything = off
-
-This turns all optional features off. Include it at the start of pngusr.dfa to
-make it easier to build a minimal configuration. You will need to turn at least
-some features on afterward to enable either reading or writing code, or both.
-
-option feature on
-option feature off
-
-Enable or disable a single feature. This will automatically enable other
-features required by a feature that is turned on or disable other features that
-require a feature which is turned off. Conflicting settings will cause an error
-message to be emitted by awk.
-
-setting feature default value
-
-Changes the default value of setting 'feature' to 'value'. There are a small
-number of settings listed at the top of pnglibconf.h, they are documented in the
-source code. Most of these values have performance implications for the library
-but most of them have no visible effect on the API. Some can also be overridden
-from the API.
-
-C. Configuration using PNG_USR_CONFIG
-
-If -DPNG_USR_CONFIG is added to the CFLAGS when pnglibconf.h is built the file
-pngusr.h will automatically be included before the options in
-scripts/pnglibconf.dfa are processed. pngusr.h should contain only macro
-definitions turning features on or off or setting settings.
-
-Apart from the global setting "everything = off" all the options listed above
-can be set using macros in pngusr.h:
-
-#define PNG_feature_SUPPORTED
-
-is equivalent to:
-
-option feature on
-
-#define PNG_NO_feature
-
-is equivalent to:
-
-option feature off
-
-#define PNG_feature value
-
-is equivalent to:
-
-setting feature default value
-
-Notice that in both cases, pngusr.dfa and pngusr.h, the contents of the
-pngusr file you supply override the contents of scripts/pnglibconf.dfa
-
-If confusing or incomprehensible behavior results it is possible to
-examine the intermediate file pnglibconf.dfn to find the full set of
-dependency information for each setting and option. Simply locate the
-feature in the file and read the C comments that precede it.
-
-.SH III. Reading
-
-We'll now walk you through the possible functions to call when reading
-in a PNG file sequentially, briefly explaining the syntax and purpose
-of each one. See example.c and png.h for more detail. While
-progressive reading is covered in the next section, you will still
-need some of the functions discussed in this section to read a PNG
-file.
-
-.SS Setup
-
-You will want to do the I/O initialization(*) before you get into libpng,
-so if it doesn't work, you don't have much to undo. Of course, you
-will also want to insure that you are, in fact, dealing with a PNG
-file. Libpng provides a simple check to see if a file is a PNG file.
-To use it, pass in the first 1 to 8 bytes of the file to the function
-png_sig_cmp(), and it will return 0 (false) if the bytes match the
-corresponding bytes of the PNG signature, or nonzero (true) otherwise.
-Of course, the more bytes you pass in, the greater the accuracy of the
-prediction.
-
-If you are intending to keep the file pointer open for use in libpng,
-you must ensure you don't read more than 8 bytes from the beginning
-of the file, and you also have to make a call to png_set_sig_bytes_read()
-with the number of bytes you read from the beginning. Libpng will
-then only check the bytes (if any) that your program didn't read.
-
-(*): If you are not using the standard I/O functions, you will need
-to replace them with custom functions. See the discussion under
-Customizing libpng.
-
-
- FILE *fp = fopen(file_name, "rb");
- if (!fp)
- {
- return (ERROR);
- }
-
- fread(header, 1, number, fp);
- is_png = !png_sig_cmp(header, 0, number);
-
- if (!is_png)
- {
- return (NOT_PNG);
- }
-
-
-Next, png_struct and png_info need to be allocated and initialized. In
-order to ensure that the size of these structures is correct even with a
-dynamically linked libpng, there are functions to initialize and
-allocate the structures. We also pass the library version, optional
-pointers to error handling functions, and a pointer to a data struct for
-use by the error functions, if necessary (the pointer and functions can
-be NULL if the default error handlers are to be used). See the section
-on Changes to Libpng below regarding the old initialization functions.
-The structure allocation functions quietly return NULL if they fail to
-create the structure, so your application should check for that.
-
- png_structp png_ptr = png_create_read_struct
- (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr,
- user_error_fn, user_warning_fn);
-
- if (!png_ptr)
- return (ERROR);
-
- png_infop info_ptr = png_create_info_struct(png_ptr);
-
- if (!info_ptr)
- {
- png_destroy_read_struct(&png_ptr,
- (png_infopp)NULL, (png_infopp)NULL);
- return (ERROR);
- }
-
- png_infop end_info = png_create_info_struct(png_ptr);
-
- if (!end_info)
- {
- png_destroy_read_struct(&png_ptr, &info_ptr,
- (png_infopp)NULL);
- return (ERROR);
- }
-
-If you want to use your own memory allocation routines,
-use a libpng that was built with PNG_USER_MEM_SUPPORTED defined, and use
-png_create_read_struct_2() instead of png_create_read_struct():
-
- png_structp png_ptr = png_create_read_struct_2
- (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr,
- user_error_fn, user_warning_fn, (png_voidp)
- user_mem_ptr, user_malloc_fn, user_free_fn);
-
-The error handling routines passed to png_create_read_struct()
-and the memory alloc/free routines passed to png_create_struct_2()
-are only necessary if you are not using the libpng supplied error
-handling and memory alloc/free functions.
-
-When libpng encounters an error, it expects to longjmp back
-to your routine. Therefore, you will need to call setjmp and pass
-your png_jmpbuf(png_ptr). If you read the file from different
-routines, you will need to update the jmpbuf field every time you enter
-a new routine that will call a png_*() function.
-
-See your documentation of setjmp/longjmp for your compiler for more
-information on setjmp/longjmp. See the discussion on libpng error
-handling in the Customizing Libpng section below for more information
-on the libpng error handling. If an error occurs, and libpng longjmp's
-back to your setjmp, you will want to call png_destroy_read_struct() to
-free any memory.
-
- if (setjmp(png_jmpbuf(png_ptr)))
- {
- png_destroy_read_struct(&png_ptr, &info_ptr,
- &end_info);
- fclose(fp);
- return (ERROR);
- }
-
-If you would rather avoid the complexity of setjmp/longjmp issues,
-you can compile libpng with PNG_NO_SETJMP, in which case
-errors will result in a call to PNG_ABORT() which defaults to abort().
-
-You can #define PNG_ABORT() to a function that does something
-more useful than abort(), as long as your function does not
-return.
-
-Now you need to set up the input code. The default for libpng is to
-use the C function fread(). If you use this, you will need to pass a
-valid FILE * in the function png_init_io(). Be sure that the file is
-opened in binary mode. If you wish to handle reading data in another
-way, you need not call the png_init_io() function, but you must then
-implement the libpng I/O methods discussed in the Customizing Libpng
-section below.
-
- png_init_io(png_ptr, fp);
-
-If you had previously opened the file and read any of the signature from
-the beginning in order to see if this was a PNG file, you need to let
-libpng know that there are some bytes missing from the start of the file.
-
- png_set_sig_bytes(png_ptr, number);
-
-You can change the zlib compression buffer size to be used while
-reading compressed data with
-
- png_set_compression_buffer_size(png_ptr, buffer_size);
-
-where the default size is 8192 bytes. Note that the buffer size
-is changed immediately and the buffer is reallocated immediately,
-instead of setting a flag to be acted upon later.
-
-If you want CRC errors to be handled in a different manner than
-the default, use
-
- png_set_crc_action(png_ptr, crit_action, ancil_action);
-
-The values for png_set_crc_action() say how libpng is to handle CRC errors in
-ancillary and critical chunks, and whether to use the data contained
-therein. Note that it is impossible to "discard" data in a critical
-chunk.
-
-Choices for (int) crit_action are
- PNG_CRC_DEFAULT 0 error/quit
- PNG_CRC_ERROR_QUIT 1 error/quit
- PNG_CRC_WARN_USE 3 warn/use data
- PNG_CRC_QUIET_USE 4 quiet/use data
- PNG_CRC_NO_CHANGE 5 use the current value
-
-Choices for (int) ancil_action are
- PNG_CRC_DEFAULT 0 error/quit
- PNG_CRC_ERROR_QUIT 1 error/quit
- PNG_CRC_WARN_DISCARD 2 warn/discard data
- PNG_CRC_WARN_USE 3 warn/use data
- PNG_CRC_QUIET_USE 4 quiet/use data
- PNG_CRC_NO_CHANGE 5 use the current value
-
-.SS Setting up callback code
-
-You can set up a callback function to handle any unknown chunks in the
-input stream. You must supply the function
-
- read_chunk_callback(png_structp png_ptr,
- png_unknown_chunkp chunk);
- {
- /* The unknown chunk structure contains your
- chunk data, along with similar data for any other
- unknown chunks: */
-
- png_byte name[5];
- png_byte *data;
- png_size_t size;
-
- /* Note that libpng has already taken care of
- the CRC handling */
-
- /* put your code here. Search for your chunk in the
- unknown chunk structure, process it, and return one
- of the following: */
-
- return (-n); /* chunk had an error */
- return (0); /* did not recognize */
- return (n); /* success */
- }
-
-(You can give your function another name that you like instead of
-"read_chunk_callback")
-
-To inform libpng about your function, use
-
- png_set_read_user_chunk_fn(png_ptr, user_chunk_ptr,
- read_chunk_callback);
-
-This names not only the callback function, but also a user pointer that
-you can retrieve with
-
- png_get_user_chunk_ptr(png_ptr);
-
-If you call the png_set_read_user_chunk_fn() function, then all unknown
-chunks will be saved when read, in case your callback function will need
-one or more of them. This behavior can be changed with the
-png_set_keep_unknown_chunks() function, described below.
-
-At this point, you can set up a callback function that will be
-called after each row has been read, which you can use to control
-a progress meter or the like. It's demonstrated in pngtest.c.
-You must supply a function
-
- void read_row_callback(png_structp png_ptr,
- png_uint_32 row, int pass);
- {
- /* put your code here */
- }
-
-(You can give it another name that you like instead of "read_row_callback")
-
-To inform libpng about your function, use
-
- png_set_read_status_fn(png_ptr, read_row_callback);
-
-.SS Unknown-chunk handling
-
-Now you get to set the way the library processes unknown chunks in the
-input PNG stream. Both known and unknown chunks will be read. Normal
-behavior is that known chunks will be parsed into information in
-various info_ptr members while unknown chunks will be discarded. This
-behavior can be wasteful if your application will never use some known
-chunk types. To change this, you can call:
-
- png_set_keep_unknown_chunks(png_ptr, keep,
- chunk_list, num_chunks);
- keep - 0: default unknown chunk handling
- 1: ignore; do not keep
- 2: keep only if safe-to-copy
- 3: keep even if unsafe-to-copy
-
- You can use these definitions:
- PNG_HANDLE_CHUNK_AS_DEFAULT 0
- PNG_HANDLE_CHUNK_NEVER 1
- PNG_HANDLE_CHUNK_IF_SAFE 2
- PNG_HANDLE_CHUNK_ALWAYS 3
-
- chunk_list - list of chunks affected (a byte string,
- five bytes per chunk, NULL or '\0' if
- num_chunks is 0)
-
- num_chunks - number of chunks affected; if 0, all
- unknown chunks are affected. If nonzero,
- only the chunks in the list are affected
-
-Unknown chunks declared in this way will be saved as raw data onto a
-list of png_unknown_chunk structures. If a chunk that is normally
-known to libpng is named in the list, it will be handled as unknown,
-according to the "keep" directive. If a chunk is named in successive
-instances of png_set_keep_unknown_chunks(), the final instance will
-take precedence. The IHDR and IEND chunks should not be named in
-chunk_list; if they are, libpng will process them normally anyway.
-
-Here is an example of the usage of png_set_keep_unknown_chunks(),
-where the private "vpAg" chunk will later be processed by a user chunk
-callback function:
-
- png_byte vpAg[5]={118, 112, 65, 103, (png_byte) '\0'};
-
- #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
- png_byte unused_chunks[]=
- {
- 104, 73, 83, 84, (png_byte) '\0', /* hIST */
- 105, 84, 88, 116, (png_byte) '\0', /* iTXt */
- 112, 67, 65, 76, (png_byte) '\0', /* pCAL */
- 115, 67, 65, 76, (png_byte) '\0', /* sCAL */
- 115, 80, 76, 84, (png_byte) '\0', /* sPLT */
- 116, 73, 77, 69, (png_byte) '\0', /* tIME */
- };
- #endif
-
- ...
-
- #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
- /* ignore all unknown chunks: */
- png_set_keep_unknown_chunks(read_ptr, 1, NULL, 0);
-
- /* except for vpAg: */
- png_set_keep_unknown_chunks(read_ptr, 2, vpAg, 1);
-
- /* also ignore unused known chunks: */
- png_set_keep_unknown_chunks(read_ptr, 1, unused_chunks,
- (int)sizeof(unused_chunks)/5);
- #endif
-
-.SS User limits
-
-The PNG specification allows the width and height of an image to be as
-large as 2^31-1 (0x7fffffff), or about 2.147 billion rows and columns.
-Since very few applications really need to process such large images,
-we have imposed an arbitrary 1-million limit on rows and columns.
-Larger images will be rejected immediately with a png_error() call. If
-you wish to override this limit, you can use
-
- png_set_user_limits(png_ptr, width_max, height_max);
-
-to set your own limits, or use width_max = height_max = 0x7fffffffL
-to allow all valid dimensions (libpng may reject some very large images
-anyway because of potential buffer overflow conditions).
-
-You should put this statement after you create the PNG structure and
-before calling png_read_info(), png_read_png(), or png_process_data().
-If you need to retrieve the limits that are being applied, use
-
- width_max = png_get_user_width_max(png_ptr);
- height_max = png_get_user_height_max(png_ptr);
-
-The PNG specification sets no limit on the number of ancillary chunks
-allowed in a PNG datastream. You can impose a limit on the total number
-of sPLT, tEXt, iTXt, zTXt, and unknown chunks that will be stored, with
-
- png_set_chunk_cache_max(png_ptr, user_chunk_cache_max);
-
-where 0x7fffffffL means unlimited. You can retrieve this limit with
-
- chunk_cache_max = png_get_chunk_cache_max(png_ptr);
-
-This limit also applies to the number of buffers that can be allocated
-by png_decompress_chunk() while decompressing iTXt, zTXt, and iCCP chunks.
-
-You can also set a limit on the amount of memory that a compressed chunk
-other than IDAT can occupy, with
-
- png_set_chunk_malloc_max(png_ptr, user_chunk_malloc_max);
-
-and you can retrieve the limit with
-
- chunk_malloc_max = png_get_chunk_malloc_max(png_ptr);
-
-Any chunks that would cause either of these limits to be exceeded will
-be ignored.
-
-.SS The high-level read interface
-
-At this point there are two ways to proceed; through the high-level
-read interface, or through a sequence of low-level read operations.
-You can use the high-level interface if (a) you are willing to read
-the entire image into memory, and (b) the input transformations
-you want to do are limited to the following set:
-
- PNG_TRANSFORM_IDENTITY No transformation
- PNG_TRANSFORM_STRIP_16 Strip 16-bit samples to
- 8 bits
- PNG_TRANSFORM_STRIP_ALPHA Discard the alpha channel
- PNG_TRANSFORM_PACKING Expand 1, 2 and 4-bit
- samples to bytes
- PNG_TRANSFORM_PACKSWAP Change order of packed
- pixels to LSB first
- PNG_TRANSFORM_EXPAND Perform set_expand()
- PNG_TRANSFORM_INVERT_MONO Invert monochrome images
- PNG_TRANSFORM_SHIFT Normalize pixels to the
- sBIT depth
- PNG_TRANSFORM_BGR Flip RGB to BGR, RGBA
- to BGRA
- PNG_TRANSFORM_SWAP_ALPHA Flip RGBA to ARGB or GA
- to AG
- PNG_TRANSFORM_INVERT_ALPHA Change alpha from opacity
- to transparency
- PNG_TRANSFORM_SWAP_ENDIAN Byte-swap 16-bit samples
- PNG_TRANSFORM_GRAY_TO_RGB Expand grayscale samples
- to RGB (or GA to RGBA)
-
-(This excludes setting a background color, doing gamma transformation,
-quantizing, and setting filler.) If this is the case, simply do this:
-
- png_read_png(png_ptr, info_ptr, png_transforms, NULL)
-
-where png_transforms is an integer containing the bitwise OR of some
-set of transformation flags. This call is equivalent to png_read_info(),
-followed the set of transformations indicated by the transform mask,
-then png_read_image(), and finally png_read_end().
-
-(The final parameter of this call is not yet used. Someday it might point
-to transformation parameters required by some future input transform.)
-
-You must use png_transforms and not call any png_set_transform() functions
-when you use png_read_png().
-
-After you have called png_read_png(), you can retrieve the image data
-with
-
- row_pointers = png_get_rows(png_ptr, info_ptr);
-
-where row_pointers is an array of pointers to the pixel data for each row:
-
- png_bytep row_pointers[height];
-
-If you know your image size and pixel size ahead of time, you can allocate
-row_pointers prior to calling png_read_png() with
-
- if (height > PNG_UINT_32_MAX/png_sizeof(png_byte))
- png_error (png_ptr,
- "Image is too tall to process in memory");
-
- if (width > PNG_UINT_32_MAX/pixel_size)
- png_error (png_ptr,
- "Image is too wide to process in memory");
-
- row_pointers = png_malloc(png_ptr,
- height*png_sizeof(png_bytep));
-
- for (int i=0; i<height, i++)
- row_pointers[i]=NULL; /* security precaution */
-
- for (int i=0; i<height, i++)
- row_pointers[i]=png_malloc(png_ptr,
- width*pixel_size);
-
- png_set_rows(png_ptr, info_ptr, &row_pointers);
-
-Alternatively you could allocate your image in one big block and define
-row_pointers[i] to point into the proper places in your block.
-
-If you use png_set_rows(), the application is responsible for freeing
-row_pointers (and row_pointers[i], if they were separately allocated).
-
-If you don't allocate row_pointers ahead of time, png_read_png() will
-do it, and it'll be free'ed by libpng when you call png_destroy_*().
-
-.SS The low-level read interface
-
-If you are going the low-level route, you are now ready to read all
-the file information up to the actual image data. You do this with a
-call to png_read_info().
-
- png_read_info(png_ptr, info_ptr);
-
-This will process all chunks up to but not including the image data.
-
-.SS Querying the info structure
-
-Functions are used to get the information from the info_ptr once it
-has been read. Note that these fields may not be completely filled
-in until png_read_end() has read the chunk data following the image.
-
- png_get_IHDR(png_ptr, info_ptr, &width, &height,
- &bit_depth, &color_type, &interlace_type,
- &compression_type, &filter_method);
-
- width - holds the width of the image
- in pixels (up to 2^31).
-
- height - holds the height of the image
- in pixels (up to 2^31).
-
- bit_depth - holds the bit depth of one of the
- image channels. (valid values are
- 1, 2, 4, 8, 16 and depend also on
- the color_type. See also
- significant bits (sBIT) below).
-
- color_type - describes which color/alpha channels
- are present.
- PNG_COLOR_TYPE_GRAY
- (bit depths 1, 2, 4, 8, 16)
- PNG_COLOR_TYPE_GRAY_ALPHA
- (bit depths 8, 16)
- PNG_COLOR_TYPE_PALETTE
- (bit depths 1, 2, 4, 8)
- PNG_COLOR_TYPE_RGB
- (bit_depths 8, 16)
- PNG_COLOR_TYPE_RGB_ALPHA
- (bit_depths 8, 16)
-
- PNG_COLOR_MASK_PALETTE
- PNG_COLOR_MASK_COLOR
- PNG_COLOR_MASK_ALPHA
-
- interlace_type - (PNG_INTERLACE_NONE or
- PNG_INTERLACE_ADAM7)
-
- compression_type - (must be PNG_COMPRESSION_TYPE_BASE
- for PNG 1.0)
-
- filter_method - (must be PNG_FILTER_TYPE_BASE
- for PNG 1.0, and can also be
- PNG_INTRAPIXEL_DIFFERENCING if
- the PNG datastream is embedded in
- a MNG-1.0 datastream)
-
- Any or all of interlace_type, compression_type, or
- filter_method can be NULL if you are
- not interested in their values.
-
- Note that png_get_IHDR() returns 32-bit data into
- the application's width and height variables.
- This is an unsafe situation if these are 16-bit
- variables. In such situations, the
- png_get_image_width() and png_get_image_height()
- functions described below are safer.
-
- width = png_get_image_width(png_ptr,
- info_ptr);
-
- height = png_get_image_height(png_ptr,
- info_ptr);
-
- bit_depth = png_get_bit_depth(png_ptr,
- info_ptr);
-
- color_type = png_get_color_type(png_ptr,
- info_ptr);
-
- interlace_type = png_get_interlace_type(png_ptr,
- info_ptr);
-
- compression_type = png_get_compression_type(png_ptr,
- info_ptr);
-
- filter_method = png_get_filter_type(png_ptr,
- info_ptr);
-
- channels = png_get_channels(png_ptr, info_ptr);
-
- channels - number of channels of info for the
- color type (valid values are 1 (GRAY,
- PALETTE), 2 (GRAY_ALPHA), 3 (RGB),
- 4 (RGB_ALPHA or RGB + filler byte))
-
- rowbytes = png_get_rowbytes(png_ptr, info_ptr);
-
- rowbytes - number of bytes needed to hold a row
-
- signature = png_get_signature(png_ptr, info_ptr);
-
- signature - holds the signature read from the
- file (if any). The data is kept in
- the same offset it would be if the
- whole signature were read (i.e. if an
- application had already read in 4
- bytes of signature before starting
- libpng, the remaining 4 bytes would
- be in signature[4] through signature[7]
- (see png_set_sig_bytes())).
-
-These are also important, but their validity depends on whether the chunk
-has been read. The png_get_valid(png_ptr, info_ptr, PNG_INFO_<chunk>) and
-png_get_<chunk>(png_ptr, info_ptr, ...) functions return non-zero if the
-data has been read, or zero if it is missing. The parameters to the
-png_get_<chunk> are set directly if they are simple data types, or a
-pointer into the info_ptr is returned for any complex types.
-
- png_get_PLTE(png_ptr, info_ptr, &palette,
- &num_palette);
-
- palette - the palette for the file
- (array of png_color)
-
- num_palette - number of entries in the palette
-
- png_get_gAMA(png_ptr, info_ptr, &file_gamma);
- png_get_gAMA_fixed(png_ptr, info_ptr, &int_file_gamma);
-
- file_gamma - the gamma at which the file is
- written (PNG_INFO_gAMA)
-
- int_file_gamma - 100,000 times the gamma at which the
- file is written
-
- png_get_sRGB(png_ptr, info_ptr, &srgb_intent);
-
- file_srgb_intent - the rendering intent (PNG_INFO_sRGB)
- The presence of the sRGB chunk
- means that the pixel data is in the
- sRGB color space. This chunk also
- implies specific values of gAMA and
- cHRM.
-
- png_get_iCCP(png_ptr, info_ptr, &name,
- &compression_type, &profile, &proflen);
-
- name - The profile name.
-
- compression_type - The compression type; always
- PNG_COMPRESSION_TYPE_BASE for PNG 1.0.
- You may give NULL to this argument to
- ignore it.
-
- profile - International Color Consortium color
- profile data. May contain NULs.
-
- proflen - length of profile data in bytes.
-
- png_get_sBIT(png_ptr, info_ptr, &sig_bit);
-
- sig_bit - the number of significant bits for
- (PNG_INFO_sBIT) each of the gray,
- red, green, and blue channels,
- whichever are appropriate for the
- given color type (png_color_16)
-
- png_get_tRNS(png_ptr, info_ptr, &trans_alpha,
- &num_trans, &trans_color);
-
- trans_alpha - array of alpha (transparency)
- entries for palette (PNG_INFO_tRNS)
-
- num_trans - number of transparent entries
- (PNG_INFO_tRNS)
-
- trans_color - graylevel or color sample values of
- the single transparent color for
- non-paletted images (PNG_INFO_tRNS)
-
- png_get_hIST(png_ptr, info_ptr, &hist);
- (PNG_INFO_hIST)
-
- hist - histogram of palette (array of
- png_uint_16)
-
- png_get_tIME(png_ptr, info_ptr, &mod_time);
-
- mod_time - time image was last modified
- (PNG_VALID_tIME)
-
- png_get_bKGD(png_ptr, info_ptr, &background);
-
- background - background color (PNG_VALID_bKGD)
- valid 16-bit red, green and blue
- values, regardless of color_type
-
- num_comments = png_get_text(png_ptr, info_ptr,
- &text_ptr, &num_text);
-
- num_comments - number of comments
-
- text_ptr - array of png_text holding image
- comments
-
- text_ptr[i].compression - type of compression used
- on "text" PNG_TEXT_COMPRESSION_NONE
- PNG_TEXT_COMPRESSION_zTXt
- PNG_ITXT_COMPRESSION_NONE
- PNG_ITXT_COMPRESSION_zTXt
-
- text_ptr[i].key - keyword for comment. Must contain
- 1-79 characters.
-
- text_ptr[i].text - text comments for current
- keyword. Can be empty.
-
- text_ptr[i].text_length - length of text string,
- after decompression, 0 for iTXt
-
- text_ptr[i].itxt_length - length of itxt string,
- after decompression, 0 for tEXt/zTXt
-
- text_ptr[i].lang - language of comment (empty
- string for unknown).
-
- text_ptr[i].lang_key - keyword in UTF-8
- (empty string for unknown).
-
- Note that the itxt_length, lang, and lang_key
- members of the text_ptr structure only exist
- when the library is built with iTXt chunk support.
-
- num_text - number of comments (same as
- num_comments; you can put NULL here
- to avoid the duplication)
-
- Note while png_set_text() will accept text, language,
- and translated keywords that can be NULL pointers, the
- structure returned by png_get_text will always contain
- regular zero-terminated C strings. They might be
- empty strings but they will never be NULL pointers.
-
- num_spalettes = png_get_sPLT(png_ptr, info_ptr,
- &palette_ptr);
-
- num_spalettes - number of sPLT chunks read.
-
- palette_ptr - array of palette structures holding
- contents of one or more sPLT chunks
- read.
-
- png_get_oFFs(png_ptr, info_ptr, &offset_x, &offset_y,
- &unit_type);
-
- offset_x - positive offset from the left edge
- of the screen
-
- offset_y - positive offset from the top edge
- of the screen
-
- unit_type - PNG_OFFSET_PIXEL, PNG_OFFSET_MICROMETER
-
- png_get_pHYs(png_ptr, info_ptr, &res_x, &res_y,
- &unit_type);
-
- res_x - pixels/unit physical resolution in
- x direction
-
- res_y - pixels/unit physical resolution in
- x direction
-
- unit_type - PNG_RESOLUTION_UNKNOWN,
- PNG_RESOLUTION_METER
-
- png_get_sCAL(png_ptr, info_ptr, &unit, &width,
- &height)
-
- unit - physical scale units (an integer)
-
- width - width of a pixel in physical scale units
-
- height - height of a pixel in physical scale units
- (width and height are doubles)
-
- png_get_sCAL_s(png_ptr, info_ptr, &unit, &width,
- &height)
-
- unit - physical scale units (an integer)
-
- width - width of a pixel in physical scale units
-
- height - height of a pixel in physical scale units
- (width and height are strings like "2.54")
-
- num_unknown_chunks = png_get_unknown_chunks(png_ptr,
- info_ptr, &unknowns)
-
- unknowns - array of png_unknown_chunk
- structures holding unknown chunks
-
- unknowns[i].name - name of unknown chunk
-
- unknowns[i].data - data of unknown chunk
-
- unknowns[i].size - size of unknown chunk's data
-
- unknowns[i].location - position of chunk in file
-
- The value of "i" corresponds to the order in which the
- chunks were read from the PNG file or inserted with the
- png_set_unknown_chunks() function.
-
-The data from the pHYs chunk can be retrieved in several convenient
-forms:
-
- res_x = png_get_x_pixels_per_meter(png_ptr,
- info_ptr)
-
- res_y = png_get_y_pixels_per_meter(png_ptr,
- info_ptr)
-
- res_x_and_y = png_get_pixels_per_meter(png_ptr,
- info_ptr)
-
- res_x = png_get_x_pixels_per_inch(png_ptr,
- info_ptr)
-
- res_y = png_get_y_pixels_per_inch(png_ptr,
- info_ptr)
-
- res_x_and_y = png_get_pixels_per_inch(png_ptr,
- info_ptr)
-
- aspect_ratio = png_get_pixel_aspect_ratio(png_ptr,
- info_ptr)
-
- Each of these returns 0 [signifying "unknown"] if
- the data is not present or if res_x is 0;
- res_x_and_y is 0 if res_x != res_y
-
- Note that because of the way the resolutions are
- stored internally, the inch conversions won't
- come out to exactly even number. For example,
- 72 dpi is stored as 0.28346 pixels/meter, and
- when this is retrieved it is 71.9988 dpi, so
- be sure to round the returned value appropriately
- if you want to display a reasonable-looking result.
-
-The data from the oFFs chunk can be retrieved in several convenient
-forms:
-
- x_offset = png_get_x_offset_microns(png_ptr, info_ptr);
-
- y_offset = png_get_y_offset_microns(png_ptr, info_ptr);
-
- x_offset = png_get_x_offset_inches(png_ptr, info_ptr);
-
- y_offset = png_get_y_offset_inches(png_ptr, info_ptr);
-
- Each of these returns 0 [signifying "unknown" if both
- x and y are 0] if the data is not present or if the
- chunk is present but the unit is the pixel. The
- remark about inexact inch conversions applies here
- as well, because a value in inches can't always be
- converted to microns and back without some loss
- of precision.
-
-For more information, see the png_info definition in png.h and the
-PNG specification for chunk contents. Be careful with trusting
-rowbytes, as some of the transformations could increase the space
-needed to hold a row (expand, filler, gray_to_rgb, etc.).
-See png_read_update_info(), below.
-
-A quick word about text_ptr and num_text. PNG stores comments in
-keyword/text pairs, one pair per chunk, with no limit on the number
-of text chunks, and a 2^31 byte limit on their size. While there are
-suggested keywords, there is no requirement to restrict the use to these
-strings. It is strongly suggested that keywords and text be sensible
-to humans (that's the point), so don't use abbreviations. Non-printing
-symbols are not allowed. See the PNG specification for more details.
-There is also no requirement to have text after the keyword.
-
-Keywords should be limited to 79 Latin-1 characters without leading or
-trailing spaces, but non-consecutive spaces are allowed within the
-keyword. It is possible to have the same keyword any number of times.
-The text_ptr is an array of png_text structures, each holding a
-pointer to a language string, a pointer to a keyword and a pointer to
-a text string. The text string, language code, and translated
-keyword may be empty or NULL pointers. The keyword/text
-pairs are put into the array in the order that they are received.
-However, some or all of the text chunks may be after the image, so, to
-make sure you have read all the text chunks, don't mess with these
-until after you read the stuff after the image. This will be
-mentioned again below in the discussion that goes with png_read_end().
-
-.SS Input transformations
-
-After you've read the header information, you can set up the library
-to handle any special transformations of the image data. The various
-ways to transform the data will be described in the order that they
-should occur. This is important, as some of these change the color
-type and/or bit depth of the data, and some others only work on
-certain color types and bit depths. Even though each transformation
-checks to see if it has data that it can do something with, you should
-make sure to only enable a transformation if it will be valid for the
-data. For example, don't swap red and blue on grayscale data.
-
-The colors used for the background and transparency values should be
-supplied in the same format/depth as the current image data. They
-are stored in the same format/depth as the image data in a bKGD or tRNS
-chunk, so this is what libpng expects for this data. The colors are
-transformed to keep in sync with the image data when an application
-calls the png_read_update_info() routine (see below).
-
-Data will be decoded into the supplied row buffers packed into bytes
-unless the library has been told to transform it into another format.
-For example, 4 bit/pixel paletted or grayscale data will be returned
-2 pixels/byte with the leftmost pixel in the high-order bits of the
-byte, unless png_set_packing() is called. 8-bit RGB data will be stored
-in RGB RGB RGB format unless png_set_filler() or png_set_add_alpha()
-is called to insert filler bytes, either before or after each RGB triplet.
-16-bit RGB data will be returned RRGGBB RRGGBB, with the most significant
-byte of the color value first, unless png_set_strip_16() is called to
-transform it to regular RGB RGB triplets, or png_set_filler() or
-png_set_add alpha() is called to insert filler bytes, either before or
-after each RRGGBB triplet. Similarly, 8-bit or 16-bit grayscale data can
-be modified with
-png_set_filler(), png_set_add_alpha(), or png_set_strip_16().
-
-The following code transforms grayscale images of less than 8 to 8 bits,
-changes paletted images to RGB, and adds a full alpha channel if there is
-transparency information in a tRNS chunk. This is most useful on
-grayscale images with bit depths of 2 or 4 or if there is a multiple-image
-viewing application that wishes to treat all images in the same way.
-
- if (color_type == PNG_COLOR_TYPE_PALETTE)
- png_set_palette_to_rgb(png_ptr);
-
- if (color_type == PNG_COLOR_TYPE_GRAY &&
- bit_depth < 8) png_set_expand_gray_1_2_4_to_8(png_ptr);
-
- if (png_get_valid(png_ptr, info_ptr,
- PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png_ptr);
-
-These three functions are actually aliases for png_set_expand(), added
-in libpng version 1.0.4, with the function names expanded to improve code
-readability. In some future version they may actually do different
-things.
-
-As of libpng version 1.2.9, png_set_expand_gray_1_2_4_to_8() was
-added. It expands the sample depth without changing tRNS to alpha.
-
-As of libpng version 1.5.1, not all possible expansions are supported.
-
-In the following table, the 01 means grayscale with depth<8, 31 means
-indexed with depth<8, other numerals represent the color type, "T" means
-the tRNS chunk is present, A means an alpha channel is present, and O
-means tRNS or alpha is present but all pixels in the image are opaque.
-
- FROM 01 31 0 0T 0O 2 2T 2O 3 3T 3O 4A 4O 6A 6O
- TO
- 01 -
- 31 -
- 0 1 -
- 0T -
- 0O -
- 2 GX -
- 2T -
- 2O -
- 3 1 -
- 3T -
- 3O -
- 4A T -
- 4O -
- 6A GX TX TX -
- 6O GX TX -
-
-Within the matrix,
- "-" means the transformation is not supported.
- "X" means the transformation is obtained by png_set_expand().
- "1" means the transformation is obtained by
- png_set_expand_gray_1_2_4_to_8
- "G" means the transformation is obtained by
- png_set_gray_to_rgb().
- "P" means the transformation is obtained by
- png_set_expand_palette_to_rgb().
- "T" means the transformation is obtained by
- png_set_tRNS_to_alpha().
-
-PNG can have files with 16 bits per channel. If you only can handle
-8 bits per channel, this will strip the pixels down to 8 bit.
-
- if (bit_depth == 16)
- png_set_strip_16(png_ptr);
-
-If, for some reason, you don't need the alpha channel on an image,
-and you want to remove it rather than combining it with the background
-(but the image author certainly had in mind that you *would* combine
-it with the background, so that's what you should probably do):
-
- if (color_type & PNG_COLOR_MASK_ALPHA)
- png_set_strip_alpha(png_ptr);
-
-In PNG files, the alpha channel in an image
-is the level of opacity. If you need the alpha channel in an image to
-be the level of transparency instead of opacity, you can invert the
-alpha channel (or the tRNS chunk data) after it's read, so that 0 is
-fully opaque and 255 (in 8-bit or paletted images) or 65535 (in 16-bit
-images) is fully transparent, with
-
- png_set_invert_alpha(png_ptr);
-
-PNG files pack pixels of bit depths 1, 2, and 4 into bytes as small as
-they can, resulting in, for example, 8 pixels per byte for 1 bit
-files. This code expands to 1 pixel per byte without changing the
-values of the pixels:
-
- if (bit_depth < 8)
- png_set_packing(png_ptr);
-
-PNG files have possible bit depths of 1, 2, 4, 8, and 16. All pixels
-stored in a PNG image have been "scaled" or "shifted" up to the next
-higher possible bit depth (e.g. from 5 bits/sample in the range [0,31]
-to 8 bits/sample in the range [0, 255]). However, it is also possible
-to convert the PNG pixel data back to the original bit depth of the
-image. This call reduces the pixels back down to the original bit depth:
-
- png_color_8p sig_bit;
-
- if (png_get_sBIT(png_ptr, info_ptr, &sig_bit))
- png_set_shift(png_ptr, sig_bit);
-
-PNG files store 3-color pixels in red, green, blue order. This code
-changes the storage of the pixels to blue, green, red:
-
- if (color_type == PNG_COLOR_TYPE_RGB ||
- color_type == PNG_COLOR_TYPE_RGB_ALPHA)
- png_set_bgr(png_ptr);
-
-PNG files store RGB pixels packed into 3 or 6 bytes. This code expands them
-into 4 or 8 bytes for windowing systems that need them in this format:
-
- if (color_type == PNG_COLOR_TYPE_RGB)
- png_set_filler(png_ptr, filler, PNG_FILLER_BEFORE);
-
-where "filler" is the 8 or 16-bit number to fill with, and the location is
-either PNG_FILLER_BEFORE or PNG_FILLER_AFTER, depending upon whether
-you want the filler before the RGB or after. This transformation
-does not affect images that already have full alpha channels. To add an
-opaque alpha channel, use filler=0xff or 0xffff and PNG_FILLER_AFTER which
-will generate RGBA pixels.
-
-Note that png_set_filler() does not change the color type. If you want
-to do that, you can add a true alpha channel with
-
- if (color_type == PNG_COLOR_TYPE_RGB ||
- color_type == PNG_COLOR_TYPE_GRAY)
- png_set_add_alpha(png_ptr, filler, PNG_FILLER_AFTER);
-
-where "filler" contains the alpha value to assign to each pixel.
-This function was added in libpng-1.2.7.
-
-If you are reading an image with an alpha channel, and you need the
-data as ARGB instead of the normal PNG format RGBA:
-
- if (color_type == PNG_COLOR_TYPE_RGB_ALPHA)
- png_set_swap_alpha(png_ptr);
-
-For some uses, you may want a grayscale image to be represented as
-RGB. This code will do that conversion:
-
- if (color_type == PNG_COLOR_TYPE_GRAY ||
- color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
- png_set_gray_to_rgb(png_ptr);
-
-Conversely, you can convert an RGB or RGBA image to grayscale or grayscale
-with alpha.
-
- if (color_type == PNG_COLOR_TYPE_RGB ||
- color_type == PNG_COLOR_TYPE_RGB_ALPHA)
- png_set_rgb_to_gray_fixed(png_ptr, error_action,
- int red_weight, int green_weight);
-
- error_action = 1: silently do the conversion
-
- error_action = 2: issue a warning if the original
- image has any pixel where
- red != green or red != blue
-
- error_action = 3: issue an error and abort the
- conversion if the original
- image has any pixel where
- red != green or red != blue
-
- red_weight: weight of red component times 100000
-
- green_weight: weight of green component times 100000
- If either weight is negative, default
- weights (21268, 71514) are used.
-
-If you have set error_action = 1 or 2, you can
-later check whether the image really was gray, after processing
-the image rows, with the png_get_rgb_to_gray_status(png_ptr) function.
-It will return a png_byte that is zero if the image was gray or
-1 if there were any non-gray pixels. bKGD and sBIT data
-will be silently converted to grayscale, using the green channel
-data, regardless of the error_action setting.
-
-With red_weight+green_weight<=100000,
-the normalized graylevel is computed:
-
- int rw = red_weight * 65536;
- int gw = green_weight * 65536;
- int bw = 65536 - (rw + gw);
- gray = (rw*red + gw*green + bw*blue)/65536;
-
-The default values approximate those recommended in the Charles
-Poynton's Color FAQ, <http://www.inforamp.net/~poynton/>
-Copyright (c) 1998-01-04 Charles Poynton <poynton at inforamp.net>
-
- Y = 0.212671 * R + 0.715160 * G + 0.072169 * B
-
-Libpng approximates this with integers scaled by 32768:
-
- Y = (6968 * R + 23434 * G + 2366 * B)/32768
-
-The calculation is done in a linear colorspace, if the image gamma
-can be determined.
-
-If you have a grayscale and you are using png_set_expand_depth(),
-png_set_expand(), or png_set_gray_to_rgb to change to truecolor or to
-a higher bit-depth, you must either supply the background color as a gray
-value at the original file bit-depth (need_expand = 1) or else supply the
-background color as an RGB triplet at the final, expanded bit depth
-(need_expand = 0). Similarly, if you are reading a paletted image, you
-must either supply the background color as a palette index (need_expand = 1)
-or as an RGB triplet that may or may not be in the palette (need_expand = 0).
-
- png_color_16 my_background;
- png_color_16p image_background;
-
- if (png_get_bKGD(png_ptr, info_ptr, &image_background))
- png_set_background(png_ptr, image_background,
- PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
- else
- png_set_background(png_ptr, &my_background,
- PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0);
-
-The png_set_background() function tells libpng to composite images
-with alpha or simple transparency against the supplied background
-color. If the PNG file contains a bKGD chunk (PNG_INFO_bKGD valid),
-you may use this color, or supply another color more suitable for
-the current display (e.g., the background color from a web page). You
-need to tell libpng whether the color is in the gamma space of the
-display (PNG_BACKGROUND_GAMMA_SCREEN for colors you supply), the file
-(PNG_BACKGROUND_GAMMA_FILE for colors from the bKGD chunk), or one
-that is neither of these gammas (PNG_BACKGROUND_GAMMA_UNIQUE - I don't
-know why anyone would use this, but it's here).
-
-To properly display PNG images on any kind of system, the application needs
-to know what the display gamma is. Ideally, the user will know this, and
-the application will allow them to set it. One method of allowing the user
-to set the display gamma separately for each system is to check for a
-SCREEN_GAMMA or DISPLAY_GAMMA environment variable, which will hopefully be
-correctly set.
-
-Note that display_gamma is the overall gamma correction required to produce
-pleasing results, which depends on the lighting conditions in the surrounding
-environment. In a dim or brightly lit room, no compensation other than
-the physical gamma exponent of the monitor is needed, while in a dark room
-a slightly smaller exponent is better.
-
- double gamma, screen_gamma;
-
- if (/* We have a user-defined screen
- gamma value */)
- {
- screen_gamma = user_defined_screen_gamma;
- }
-
- /* One way that applications can share the same
- screen gamma value */
- else if ((gamma_str = getenv("SCREEN_GAMMA"))
- != NULL)
- {
- screen_gamma = (double)atof(gamma_str);
- }
-
- /* If we don't have another value */
- else
- {
- screen_gamma = 2.2; /* A good guess for a
- PC monitor in a bright office or a dim room */
-
- screen_gamma = 2.0; /* A good guess for a
- PC monitor in a dark room */
-
- screen_gamma = 1.7 or 1.0; /* A good
- guess for Mac systems */
- }
-
-The functions png_set_gamma() and its fixed point equivalent
-png_set_gamma_fixed() handle gamma transformations of the data.
-Pass both the file gamma and the current screen_gamma. If the file does
-not have a gamma value, you can pass one anyway if you have an idea what
-it is (usually 0.45455 is a good guess for GIF images on PCs). Note
-that file gammas are inverted from screen gammas. See the discussions
-on gamma in the PNG specification for an excellent description of what
-gamma is, and why all applications should support it. It is strongly
-recommended that PNG viewers support gamma correction.
-
- if (png_get_gAMA(png_ptr, info_ptr, &file_gamma))
- png_set_gamma(png_ptr, screen_gamma, file_gamma);
-
- else
- png_set_gamma(png_ptr, screen_gamma, 0.45455);
-
-If you need to reduce an RGB file to a paletted file, or if a paletted
-file has more entries then will fit on your screen, png_set_quantize()
-will do that. Note that this is a simple match quantization that merely
-finds the closest color available. This should work fairly well with
-optimized palettes, but fairly badly with linear color cubes. If you
-pass a palette that is larger then maximum_colors, the file will
-reduce the number of colors in the palette so it will fit into
-maximum_colors. If there is a histogram, it will use it to make
-more intelligent choices when reducing the palette. If there is no
-histogram, it may not do as good a job.
-
- if (color_type & PNG_COLOR_MASK_COLOR)
- {
- if (png_get_valid(png_ptr, info_ptr,
- PNG_INFO_PLTE))
- {
- png_uint_16p histogram = NULL;
-
- png_get_hIST(png_ptr, info_ptr,
- &histogram);
- png_set_quantize(png_ptr, palette, num_palette,
- max_screen_colors, histogram, 1);
- }
-
- else
- {
- png_color std_color_cube[MAX_SCREEN_COLORS] =
- { ... colors ... };
-
- png_set_quantize(png_ptr, std_color_cube,
- MAX_SCREEN_COLORS, MAX_SCREEN_COLORS,
- NULL,0);
- }
- }
-
-PNG files describe monochrome as black being zero and white being one.
-The following code will reverse this (make black be one and white be
-zero):
-
- if (bit_depth == 1 && color_type == PNG_COLOR_TYPE_GRAY)
- png_set_invert_mono(png_ptr);
-
-This function can also be used to invert grayscale and gray-alpha images:
-
- if (color_type == PNG_COLOR_TYPE_GRAY ||
- color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
- png_set_invert_mono(png_ptr);
-
-PNG files store 16 bit pixels in network byte order (big-endian,
-ie. most significant bits first). This code changes the storage to the
-other way (little-endian, i.e. least significant bits first, the
-way PCs store them):
-
- if (bit_depth == 16)
- png_set_swap(png_ptr);
-
-If you are using packed-pixel images (1, 2, or 4 bits/pixel), and you
-need to change the order the pixels are packed into bytes, you can use:
-
- if (bit_depth < 8)
- png_set_packswap(png_ptr);
-
-Finally, you can write your own transformation function if none of
-the existing ones meets your needs. This is done by setting a callback
-with
-
- png_set_read_user_transform_fn(png_ptr,
- read_transform_fn);
-
-You must supply the function
-
- void read_transform_fn(png_structp png_ptr, row_info_ptr
- row_info, png_bytep data)
-
-See pngtest.c for a working example. Your function will be called
-after all of the other transformations have been processed. Take care with
-interlaced images if you do the interlace yourself - the width of the row is the
-width in 'row_info', not the overall image width.
-
-If supported libpng provides two information routines that you can use to find
-where you are in processing the image:
-
- png_get_current_pass_number(png_structp png_ptr);
- png_get_current_row_number(png_structp png_ptr);
-
-Don't try using these outside a transform callback - firstly they are only
-supported if user transforms are supported, secondly they may well return
-unexpected results unless the row is actually being processed at the moment they
-are called.
-
-You can also set up a pointer to a user structure for use by your
-callback function, and you can inform libpng that your transform
-function will change the number of channels or bit depth with the
-function
-
- png_set_user_transform_info(png_ptr, user_ptr,
- user_depth, user_channels);
-
-The user's application, not libpng, is responsible for allocating and
-freeing any memory required for the user structure.
-
-You can retrieve the pointer via the function
-png_get_user_transform_ptr(). For example:
-
- voidp read_user_transform_ptr =
- png_get_user_transform_ptr(png_ptr);
-
-The last thing to handle is interlacing; this is covered in detail below,
-but you must call the function here if you want libpng to handle expansion
-of the interlaced image.
-
- number_of_passes = png_set_interlace_handling(png_ptr);
-
-After setting the transformations, libpng can update your png_info
-structure to reflect any transformations you've requested with this
-call. This is most useful to update the info structure's rowbytes
-field so you can use it to allocate your image memory. This function
-will also update your palette with the correct screen_gamma and
-background if these have been given with the calls above.
-
- png_read_update_info(png_ptr, info_ptr);
-
-After you call png_read_update_info(), you can allocate any
-memory you need to hold the image. The row data is simply
-raw byte data for all forms of images. As the actual allocation
-varies among applications, no example will be given. If you
-are allocating one large chunk, you will need to build an
-array of pointers to each row, as it will be needed for some
-of the functions below.
-
-Remember: Before you call png_read_update_info(), the png_get_
-functions return the values corresponding to the original PNG image.
-After you call png_read_update_info the values refer to the image
-that libpng will output. Consequently you must call all the png_set_
-functions before you call png_read_update_info(). This is particularly
-important for png_set_interlace_handling() - if you are going to call
-png_read_update_info() you must call png_set_interlace_handling() before
-it unless you want to receive interlaced output.
-
-.SS Reading image data
-
-After you've allocated memory, you can read the image data.
-The simplest way to do this is in one function call. If you are
-allocating enough memory to hold the whole image, you can just
-call png_read_image() and libpng will read in all the image data
-and put it in the memory area supplied. You will need to pass in
-an array of pointers to each row.
-
-This function automatically handles interlacing, so you don't
-need to call png_set_interlace_handling() (unless you call
-png_read_update_info()) or call this function multiple times, or any
-of that other stuff necessary with png_read_rows().
-
- png_read_image(png_ptr, row_pointers);
-
-where row_pointers is:
-
- png_bytep row_pointers[height];
-
-You can point to void or char or whatever you use for pixels.
-
-If you don't want to read in the whole image at once, you can
-use png_read_rows() instead. If there is no interlacing (check
-interlace_type == PNG_INTERLACE_NONE), this is simple:
-
- png_read_rows(png_ptr, row_pointers, NULL,
- number_of_rows);
-
-where row_pointers is the same as in the png_read_image() call.
-
-If you are doing this just one row at a time, you can do this with
-a single row_pointer instead of an array of row_pointers:
-
- png_bytep row_pointer = row;
- png_read_row(png_ptr, row_pointer, NULL);
-
-If the file is interlaced (interlace_type != 0 in the IHDR chunk), things
-get somewhat harder. The only current (PNG Specification version 1.2)
-interlacing type for PNG is (interlace_type == PNG_INTERLACE_ADAM7);
-a somewhat complicated 2D interlace scheme, known as Adam7, that
-breaks down an image into seven smaller images of varying size, based
-on an 8x8 grid. This number is defined (from libpng 1.5) as
-PNG_INTERLACE_ADAM7_PASSES in png.h
-
-libpng can fill out those images or it can give them to you "as is".
-It is almost always better to have libpng handle the interlacing for you.
-If you want the images filled out, there are two ways to do that. The one
-mentioned in the PNG specification is to expand each pixel to cover
-those pixels that have not been read yet (the "rectangle" method).
-This results in a blocky image for the first pass, which gradually
-smooths out as more pixels are read. The other method is the "sparkle"
-method, where pixels are drawn only in their final locations, with the
-rest of the image remaining whatever colors they were initialized to
-before the start of the read. The first method usually looks better,
-but tends to be slower, as there are more pixels to put in the rows.
-
-If, as is likely, you want libpng to expand the images, call this before
-calling png_start_read_image() or png_read_update_info():
-
- if (interlace_type == PNG_INTERLACE_ADAM7)
- number_of_passes
- = png_set_interlace_handling(png_ptr);
-
-This will return the number of passes needed. Currently, this is seven,
-but may change if another interlace type is added. This function can be
-called even if the file is not interlaced, where it will return one pass.
-You then need to read the whole image 'number_of_passes' times. Each time
-will distribute the pixels from the current pass to the correct place in
-the output image, so you need to supply the same rows to png_read_rows in
-each pass.
-
-If you are not going to display the image after each pass, but are
-going to wait until the entire image is read in, use the sparkle
-effect. This effect is faster and the end result of either method
-is exactly the same. If you are planning on displaying the image
-after each pass, the "rectangle" effect is generally considered the
-better looking one.
-
-If you only want the "sparkle" effect, just call png_read_rows() as
-normal, with the third parameter NULL. Make sure you make pass over
-the image number_of_passes times, and you don't change the data in the
-rows between calls. You can change the locations of the data, just
-not the data. Each pass only writes the pixels appropriate for that
-pass, and assumes the data from previous passes is still valid.
-
- png_read_rows(png_ptr, row_pointers, NULL,
- number_of_rows);
-
-If you only want the first effect (the rectangles), do the same as
-before except pass the row buffer in the third parameter, and leave
-the second parameter NULL.
-
- png_read_rows(png_ptr, NULL, row_pointers,
- number_of_rows);
-
-If you don't want libpng to handle the interlacing details, just call
-png_read_rows() PNG_INTERLACE_ADAM7_PASSES times to read in all the images.
-Each of the images is a valid image by itself, however you will almost
-certainly need to distribute the pixels from each sub-image to the
-correct place. This is where everything gets very tricky.
-
-If you want to retrieve the separate images you must pass the correct
-number of rows to each successive call of png_read_rows(). The calculation
-gets pretty complicated for small images, where some sub-images may
-not even exist because either their width or height ends up zero.
-libpng provides two macros to help you in 1.5 and later versions:
-
- png_uint_32 width = PNG_PASS_COLS(image_width, pass_number);
- png_uint_32 height = PNG_PASS_ROWS(image_height, pass_number);
-
-Respectively these tell you the width and height of the sub-image
-corresponding to the numbered pass. 'pass' is in in the range 0 to 6 -
-this can be confusing because the specification refers to the same passes
-as 1 to 7! Be careful, you must check both the width and height before
-calling png_read_rows() and not call it for that pass if either is zero.
-
-You can, of course, read each sub-image row by row. If you want to
-produce optimal code to make a pixel-by-pixel transformation of an
-interlaced image this is the best approach; read each row of each pass,
-transform it, and write it out to a new interlaced image.
-
-If you want to de-interlace the image yourself libpng provides further
-macros to help that tell you where to place the pixels in the output image.
-Because the interlacing scheme is rectangular - sub-image pixels are always
-arranged on a rectangular grid - all you need to know for each pass is the
-starting column and row in the output image of the first pixel plus the
-spacing between each pixel. As of libpng 1.5 there are four macros to
-retrieve this information:
-
- png_uint_32 x = PNG_PASS_START_COL(pass);
- png_uint_32 y = PNG_PASS_START_ROW(pass);
- png_uint_32 xStep = 1U << PNG_PASS_COL_SHIFT(pass);
- png_uint_32 yStep = 1U << PNG_PASS_ROW_SHIFT(pass);
-
-These allow you to write the obvious loop:
-
- png_uint_32 input_y = 0;
- png_uint_32 output_y = PNG_PASS_START_ROW(pass);
-
- while (output_y < output_image_height)
- {
- png_uint_32 input_x = 0;
- png_uint_32 output_x = PNG_PASS_START_COL(pass);
-
- while (output_x < output_image_width)
- {
- image[output_y][output_x] =
- subimage[pass][input_y][input_x++];
-
- output_x += xStep;
- }
-
- ++input_y;
- output_y += yStep;
- }
-
-Notice that the steps between successive output rows and columns are
-returned as shifts. This is possible because the pixels in the subimages
-are always a power of 2 apart - 1, 2, 4 or 8 pixels - in the original
-image. In practice you may need to directly calculate the output coordinate
-given an input coordinate. libpng provides two further macros for this
-purpose:
-
- png_uint_32 output_x = PNG_COL_FROM_PASS_COL(input_x, pass);
- png_uint_32 output_y = PNG_ROW_FROM_PASS_ROW(input_y, pass);
-
-Finally a pair of macros are provided to tell you if a particular image
-row or column appears in a given pass:
-
- int col_in_pass = PNG_COL_IN_INTERLACE_PASS(output_x, pass);
- int row_in_pass = PNG_ROW_IN_INTERLACE_PASS(output_y, pass);
-
-Bear in mind that you will probably also need to check the width and height
-of the pass in addition to the above to be sure the pass even exists!
-
-With any luck you are convinced by now that you don't want to do your own
-interlace handling. In reality normally the only good reason for doing this
-is if you are processing PNG files on a pixel-by-pixel basis and don't want
-to load the whole file into memory when it is interlaced.
-
-libpng includes a test program, pngvalid, that illustrates reading and
-writing of interlaced images. If you can't get interlacing to work in your
-code and don't want to leave it to libpng (the recommended approach) see
-how pngvalid.c does it.
-
-.SS Finishing a sequential read
-
-After you are finished reading the image through the
-low-level interface, you can finish reading the file. If you are
-interested in comments or time, which may be stored either before or
-after the image data, you should pass the separate png_info struct if
-you want to keep the comments from before and after the image
-separate. If you are not interested, you can pass NULL.
-
- png_read_end(png_ptr, end_info);
-
-When you are done, you can free all memory allocated by libpng like this:
-
- png_destroy_read_struct(&png_ptr, &info_ptr,
- &end_info);
-
-It is also possible to individually free the info_ptr members that
-point to libpng-allocated storage with the following function:
-
- png_free_data(png_ptr, info_ptr, mask, seq)
-
- mask - identifies data to be freed, a mask
- containing the bitwise OR of one or
- more of
- PNG_FREE_PLTE, PNG_FREE_TRNS,
- PNG_FREE_HIST, PNG_FREE_ICCP,
- PNG_FREE_PCAL, PNG_FREE_ROWS,
- PNG_FREE_SCAL, PNG_FREE_SPLT,
- PNG_FREE_TEXT, PNG_FREE_UNKN,
- or simply PNG_FREE_ALL
-
- seq - sequence number of item to be freed
- (-1 for all items)
-
-This function may be safely called when the relevant storage has
-already been freed, or has not yet been allocated, or was allocated
-by the user and not by libpng, and will in those cases do nothing.
-The "seq" parameter is ignored if only one item of the selected data
-type, such as PLTE, is allowed. If "seq" is not -1, and multiple items
-are allowed for the data type identified in the mask, such as text or
-sPLT, only the n'th item in the structure is freed, where n is "seq".
-
-The default behavior is only to free data that was allocated internally
-by libpng. This can be changed, so that libpng will not free the data,
-or so that it will free data that was allocated by the user with png_malloc()
-or png_zalloc() and passed in via a png_set_*() function, with
-
- png_data_freer(png_ptr, info_ptr, freer, mask)
-
- freer - one of
- PNG_DESTROY_WILL_FREE_DATA
- PNG_SET_WILL_FREE_DATA
- PNG_USER_WILL_FREE_DATA
-
- mask - which data elements are affected
- same choices as in png_free_data()
-
-This function only affects data that has already been allocated.
-You can call this function after reading the PNG data but before calling
-any png_set_*() functions, to control whether the user or the png_set_*()
-function is responsible for freeing any existing data that might be present,
-and again after the png_set_*() functions to control whether the user
-or png_destroy_*() is supposed to free the data. When the user assumes
-responsibility for libpng-allocated data, the application must use
-png_free() to free it, and when the user transfers responsibility to libpng
-for data that the user has allocated, the user must have used png_malloc()
-or png_zalloc() to allocate it.
-
-If you allocated your row_pointers in a single block, as suggested above in
-the description of the high level read interface, you must not transfer
-responsibility for freeing it to the png_set_rows or png_read_destroy function,
-because they would also try to free the individual row_pointers[i].
-
-If you allocated text_ptr.text, text_ptr.lang, and text_ptr.translated_keyword
-separately, do not transfer responsibility for freeing text_ptr to libpng,
-because when libpng fills a png_text structure it combines these members with
-the key member, and png_free_data() will free only text_ptr.key. Similarly,
-if you transfer responsibility for free'ing text_ptr from libpng to your
-application, your application must not separately free those members.
-
-The png_free_data() function will turn off the "valid" flag for anything
-it frees. If you need to turn the flag off for a chunk that was freed by
-your application instead of by libpng, you can use
-
- png_set_invalid(png_ptr, info_ptr, mask);
-
- mask - identifies the chunks to be made invalid,
- containing the bitwise OR of one or
- more of
- PNG_INFO_gAMA, PNG_INFO_sBIT,
- PNG_INFO_cHRM, PNG_INFO_PLTE,
- PNG_INFO_tRNS, PNG_INFO_bKGD,
- PNG_INFO_hIST, PNG_INFO_pHYs,
- PNG_INFO_oFFs, PNG_INFO_tIME,
- PNG_INFO_pCAL, PNG_INFO_sRGB,
- PNG_INFO_iCCP, PNG_INFO_sPLT,
- PNG_INFO_sCAL, PNG_INFO_IDAT
-
-For a more compact example of reading a PNG image, see the file example.c.
-
-.SS Reading PNG files progressively
-
-The progressive reader is slightly different then the non-progressive
-reader. Instead of calling png_read_info(), png_read_rows(), and
-png_read_end(), you make one call to png_process_data(), which calls
-callbacks when it has the info, a row, or the end of the image. You
-set up these callbacks with png_set_progressive_read_fn(). You don't
-have to worry about the input/output functions of libpng, as you are
-giving the library the data directly in png_process_data(). I will
-assume that you have read the section on reading PNG files above,
-so I will only highlight the differences (although I will show
-all of the code).
-
-png_structp png_ptr;
-png_infop info_ptr;
-
- /* An example code fragment of how you would
- initialize the progressive reader in your
- application. */
- int
- initialize_png_reader()
- {
- png_ptr = png_create_read_struct
- (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr,
- user_error_fn, user_warning_fn);
-
- if (!png_ptr)
- return (ERROR);
-
- info_ptr = png_create_info_struct(png_ptr);
-
- if (!info_ptr)
- {
- png_destroy_read_struct(&png_ptr,
- (png_infopp)NULL, (png_infopp)NULL);
- return (ERROR);
- }
-
- if (setjmp(png_jmpbuf(png_ptr)))
- {
- png_destroy_read_struct(&png_ptr, &info_ptr,
- (png_infopp)NULL);
- return (ERROR);
- }
-
- /* This one's new. You can provide functions
- to be called when the header info is valid,
- when each row is completed, and when the image
- is finished. If you aren't using all functions,
- you can specify NULL parameters. Even when all
- three functions are NULL, you need to call
- png_set_progressive_read_fn(). You can use
- any struct as the user_ptr (cast to a void pointer
- for the function call), and retrieve the pointer
- from inside the callbacks using the function
-
- png_get_progressive_ptr(png_ptr);
-
- which will return a void pointer, which you have
- to cast appropriately.
- */
- png_set_progressive_read_fn(png_ptr, (void *)user_ptr,
- info_callback, row_callback, end_callback);
-
- return 0;
- }
-
- /* A code fragment that you call as you receive blocks
- of data */
- int
- process_data(png_bytep buffer, png_uint_32 length)
- {
- if (setjmp(png_jmpbuf(png_ptr)))
- {
- png_destroy_read_struct(&png_ptr, &info_ptr,
- (png_infopp)NULL);
- return (ERROR);
- }
-
- /* This one's new also. Simply give it a chunk
- of data from the file stream (in order, of
- course). On machines with segmented memory
- models machines, don't give it any more than
- 64K. The library seems to run fine with sizes
- of 4K. Although you can give it much less if
- necessary (I assume you can give it chunks of
- 1 byte, I haven't tried less then 256 bytes
- yet). When this function returns, you may
- want to display any rows that were generated
- in the row callback if you don't already do
- so there.
- */
- png_process_data(png_ptr, info_ptr, buffer, length);
-
- /* At this point you can call png_process_data_skip if
- you want to handle data the library will skip yourself;
- it simply returns the number of bytes to skip (and stops
- libpng skipping that number of bytes on the next
- png_process_data call).
- return 0;
- }
-
- /* This function is called (as set by
- png_set_progressive_read_fn() above) when enough data
- has been supplied so all of the header has been
- read.
- */
- void
- info_callback(png_structp png_ptr, png_infop info)
- {
- /* Do any setup here, including setting any of
- the transformations mentioned in the Reading
- PNG files section. For now, you _must_ call
- either png_start_read_image() or
- png_read_update_info() after all the
- transformations are set (even if you don't set
- any). You may start getting rows before
- png_process_data() returns, so this is your
- last chance to prepare for that.
-
- This is where you turn on interlace handling,
- assuming you don't want to do it yourself.
-
- If you need to you can stop the processing of
- your original input data at this point by calling
- png_process_data_pause. This returns the number
- of unprocessed bytes from the last png_process_data
- call - it is up to you to ensure that the next call
- sees these bytes again. If you don't want to bother
- with this you can get libpng to cache the unread
- bytes by setting the 'save' parameter (see png.h) but
- then libpng will have to copy the data internally.
- */
- }
-
- /* This function is called when each row of image
- data is complete */
- void
- row_callback(png_structp png_ptr, png_bytep new_row,
- png_uint_32 row_num, int pass)
- {
- /* If the image is interlaced, and you turned
- on the interlace handler, this function will
- be called for every row in every pass. Some
- of these rows will not be changed from the
- previous pass. When the row is not changed,
- the new_row variable will be NULL. The rows
- and passes are called in order, so you don't
- really need the row_num and pass, but I'm
- supplying them because it may make your life
- easier.
-
- If you did not turn on interlace handling then
- the callback is called for each row of each
- sub-image when the image is interlaced. In this
- case 'row_num' is the row in the sub-image, not
- the row in the output image as it is in all other
- cases.
-
- For the non-NULL rows of interlaced images when
- you have switched on libpng interlace handling,
- you must call png_progressive_combine_row()
- passing in the row and the old row. You can
- call this function for NULL rows (it will just
- return) and for non-interlaced images (it just
- does the memcpy for you) if it will make the
- code easier. Thus, you can just do this for
- all cases if you switch on interlace handling;
- */
-
- png_progressive_combine_row(png_ptr, old_row,
- new_row);
-
- /* where old_row is what was displayed for
- previously for the row. Note that the first
- pass (pass == 0, really) will completely cover
- the old row, so the rows do not have to be
- initialized. After the first pass (and only
- for interlaced images), you will have to pass
- the current row, and the function will combine
- the old row and the new row.
-
- You can also call png_process_data_pause in this
- callback - see above.
- */
- }
-
- void
- end_callback(png_structp png_ptr, png_infop info)
- {
- /* This function is called after the whole image
- has been read, including any chunks after the
- image (up to and including the IEND). You
- will usually have the same info chunk as you
- had in the header, although some data may have
- been added to the comments and time fields.
-
- Most people won't do much here, perhaps setting
- a flag that marks the image as finished.
- */
- }
-
-
-
-.SH IV. Writing
-
-Much of this is very similar to reading. However, everything of
-importance is repeated here, so you won't have to constantly look
-back up in the reading section to understand writing.
-
-.SS Setup
-
-You will want to do the I/O initialization before you get into libpng,
-so if it doesn't work, you don't have anything to undo. If you are not
-using the standard I/O functions, you will need to replace them with
-custom writing functions. See the discussion under Customizing libpng.
-
- FILE *fp = fopen(file_name, "wb");
-
- if (!fp)
- return (ERROR);
-
-Next, png_struct and png_info need to be allocated and initialized.
-As these can be both relatively large, you may not want to store these
-on the stack, unless you have stack space to spare. Of course, you
-will want to check if they return NULL. If you are also reading,
-you won't want to name your read structure and your write structure
-both "png_ptr"; you can call them anything you like, such as
-"read_ptr" and "write_ptr". Look at pngtest.c, for example.
-
- png_structp png_ptr = png_create_write_struct
- (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr,
- user_error_fn, user_warning_fn);
-
- if (!png_ptr)
- return (ERROR);
-
- png_infop info_ptr = png_create_info_struct(png_ptr);
- if (!info_ptr)
- {
- png_destroy_write_struct(&png_ptr,
- (png_infopp)NULL);
- return (ERROR);
- }
-
-If you want to use your own memory allocation routines,
-define PNG_USER_MEM_SUPPORTED and use
-png_create_write_struct_2() instead of png_create_write_struct():
-
- png_structp png_ptr = png_create_write_struct_2
- (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr,
- user_error_fn, user_warning_fn, (png_voidp)
- user_mem_ptr, user_malloc_fn, user_free_fn);
-
-After you have these structures, you will need to set up the
-error handling. When libpng encounters an error, it expects to
-longjmp() back to your routine. Therefore, you will need to call
-setjmp() and pass the png_jmpbuf(png_ptr). If you
-write the file from different routines, you will need to update
-the png_jmpbuf(png_ptr) every time you enter a new routine that will
-call a png_*() function. See your documentation of setjmp/longjmp
-for your compiler for more information on setjmp/longjmp. See
-the discussion on libpng error handling in the Customizing Libpng
-section below for more information on the libpng error handling.
-
- if (setjmp(png_jmpbuf(png_ptr)))
- {
- png_destroy_write_struct(&png_ptr, &info_ptr);
- fclose(fp);
- return (ERROR);
- }
- ...
- return;
-
-If you would rather avoid the complexity of setjmp/longjmp issues,
-you can compile libpng with PNG_NO_SETJMP, in which case
-errors will result in a call to PNG_ABORT() which defaults to abort().
-
-You can #define PNG_ABORT() to a function that does something
-more useful than abort(), as long as your function does not
-return.
-
-Now you need to set up the output code. The default for libpng is to
-use the C function fwrite(). If you use this, you will need to pass a
-valid FILE * in the function png_init_io(). Be sure that the file is
-opened in binary mode. Again, if you wish to handle writing data in
-another way, see the discussion on libpng I/O handling in the Customizing
-Libpng section below.
-
- png_init_io(png_ptr, fp);
-
-If you are embedding your PNG into a datastream such as MNG, and don't
-want libpng to write the 8-byte signature, or if you have already
-written the signature in your application, use
-
- png_set_sig_bytes(png_ptr, 8);
-
-to inform libpng that it should not write a signature.
-
-.SS Write callbacks
-
-At this point, you can set up a callback function that will be
-called after each row has been written, which you can use to control
-a progress meter or the like. It's demonstrated in pngtest.c.
-You must supply a function
-
- void write_row_callback(png_structp png_ptr, png_uint_32 row,
- int pass);
- {
- /* put your code here */
- }
-
-(You can give it another name that you like instead of "write_row_callback")
-
-To inform libpng about your function, use
-
- png_set_write_status_fn(png_ptr, write_row_callback);
-
-You now have the option of modifying how the compression library will
-run. The following functions are mainly for testing, but may be useful
-in some cases, like if you need to write PNG files extremely fast and
-are willing to give up some compression, or if you want to get the
-maximum possible compression at the expense of slower writing. If you
-have no special needs in this area, let the library do what it wants by
-not calling this function at all, as it has been tuned to deliver a good
-speed/compression ratio. The second parameter to png_set_filter() is
-the filter method, for which the only valid values are 0 (as of the
-July 1999 PNG specification, version 1.2) or 64 (if you are writing
-a PNG datastream that is to be embedded in a MNG datastream). The third
-parameter is a flag that indicates which filter type(s) are to be tested
-for each scanline. See the PNG specification for details on the specific
-filter types.
-
-
- /* turn on or off filtering, and/or choose
- specific filters. You can use either a single
- PNG_FILTER_VALUE_NAME or the bitwise OR of one
- or more PNG_FILTER_NAME masks.
- */
- png_set_filter(png_ptr, 0,
- PNG_FILTER_NONE | PNG_FILTER_VALUE_NONE |
- PNG_FILTER_SUB | PNG_FILTER_VALUE_SUB |
- PNG_FILTER_UP | PNG_FILTER_VALUE_UP |
- PNG_FILTER_AVG | PNG_FILTER_VALUE_AVG |
- PNG_FILTER_PAETH | PNG_FILTER_VALUE_PAETH|
- PNG_ALL_FILTERS);
-
-If an application wants to start and stop using particular filters during
-compression, it should start out with all of the filters (to ensure that
-the previous row of pixels will be stored in case it's needed later),
-and then add and remove them after the start of compression.
-
-If you are writing a PNG datastream that is to be embedded in a MNG
-datastream, the second parameter can be either 0 or 64.
-
-The png_set_compression_*() functions interface to the zlib compression
-library, and should mostly be ignored unless you really know what you are
-doing. The only generally useful call is png_set_compression_level()
-which changes how much time zlib spends on trying to compress the image
-data. See the Compression Library (zlib.h and algorithm.txt, distributed
-with zlib) for details on the compression levels.
-
- /* set the zlib compression level */
- png_set_compression_level(png_ptr,
- Z_BEST_COMPRESSION);
-
- /* set other zlib parameters */
- png_set_compression_mem_level(png_ptr, 8);
- png_set_compression_strategy(png_ptr,
- Z_DEFAULT_STRATEGY);
- png_set_compression_window_bits(png_ptr, 15);
- png_set_compression_method(png_ptr, 8);
- png_set_compression_buffer_size(png_ptr, 8192)
-
-extern PNG_EXPORT(void,png_set_zbuf_size)
-
-.SS Setting the contents of info for output
-
-You now need to fill in the png_info structure with all the data you
-wish to write before the actual image. Note that the only thing you
-are allowed to write after the image is the text chunks and the time
-chunk (as of PNG Specification 1.2, anyway). See png_write_end() and
-the latest PNG specification for more information on that. If you
-wish to write them before the image, fill them in now, and flag that
-data as being valid. If you want to wait until after the data, don't
-fill them until png_write_end(). For all the fields in png_info and
-their data types, see png.h. For explanations of what the fields
-contain, see the PNG specification.
-
-Some of the more important parts of the png_info are:
-
- png_set_IHDR(png_ptr, info_ptr, width, height,
- bit_depth, color_type, interlace_type,
- compression_type, filter_method)
-
- width - holds the width of the image
- in pixels (up to 2^31).
-
- height - holds the height of the image
- in pixels (up to 2^31).
-
- bit_depth - holds the bit depth of one of the
- image channels.
- (valid values are 1, 2, 4, 8, 16
- and depend also on the
- color_type. See also significant
- bits (sBIT) below).
-
- color_type - describes which color/alpha
- channels are present.
- PNG_COLOR_TYPE_GRAY
- (bit depths 1, 2, 4, 8, 16)
- PNG_COLOR_TYPE_GRAY_ALPHA
- (bit depths 8, 16)
- PNG_COLOR_TYPE_PALETTE
- (bit depths 1, 2, 4, 8)
- PNG_COLOR_TYPE_RGB
- (bit_depths 8, 16)
- PNG_COLOR_TYPE_RGB_ALPHA
- (bit_depths 8, 16)
-
- PNG_COLOR_MASK_PALETTE
- PNG_COLOR_MASK_COLOR
- PNG_COLOR_MASK_ALPHA
-
- interlace_type - PNG_INTERLACE_NONE or
- PNG_INTERLACE_ADAM7
-
- compression_type - (must be
- PNG_COMPRESSION_TYPE_DEFAULT)
-
- filter_method - (must be PNG_FILTER_TYPE_DEFAULT
- or, if you are writing a PNG to
- be embedded in a MNG datastream,
- can also be
- PNG_INTRAPIXEL_DIFFERENCING)
-
-If you call png_set_IHDR(), the call must appear before any of the
-other png_set_*() functions, because they might require access to some of
-the IHDR settings. The remaining png_set_*() functions can be called
-in any order.
-
-If you wish, you can reset the compression_type, interlace_type, or
-filter_method later by calling png_set_IHDR() again; if you do this, the
-width, height, bit_depth, and color_type must be the same in each call.
-
- png_set_PLTE(png_ptr, info_ptr, palette,
- num_palette);
-
- palette - the palette for the file
- (array of png_color)
- num_palette - number of entries in the palette
-
- png_set_gAMA(png_ptr, info_ptr, file_gamma);
- png_set_gAMA_fixed(png_ptr, info_ptr, int_file_gamma);
-
- file_gamma - the gamma at which the image was
- created (PNG_INFO_gAMA)
-
- int_file_gamma - 100,000 times the gamma at which
- the image was created
-
- png_set_sRGB(png_ptr, info_ptr, srgb_intent);
-
- srgb_intent - the rendering intent
- (PNG_INFO_sRGB) The presence of
- the sRGB chunk means that the pixel
- data is in the sRGB color space.
- This chunk also implies specific
- values of gAMA and cHRM. Rendering
- intent is the CSS-1 property that
- has been defined by the International
- Color Consortium
- (http://www.color.org).
- It can be one of
- PNG_sRGB_INTENT_SATURATION,
- PNG_sRGB_INTENT_PERCEPTUAL,
- PNG_sRGB_INTENT_ABSOLUTE, or
- PNG_sRGB_INTENT_RELATIVE.
-
-
- png_set_sRGB_gAMA_and_cHRM(png_ptr, info_ptr,
- srgb_intent);
-
- srgb_intent - the rendering intent
- (PNG_INFO_sRGB) The presence of the
- sRGB chunk means that the pixel
- data is in the sRGB color space.
- This function also causes gAMA and
- cHRM chunks with the specific values
- that are consistent with sRGB to be
- written.
-
- png_set_iCCP(png_ptr, info_ptr, name, compression_type,
- profile, proflen);
-
- name - The profile name.
-
- compression_type - The compression type; always
- PNG_COMPRESSION_TYPE_BASE for PNG 1.0.
- You may give NULL to this argument to
- ignore it.
-
- profile - International Color Consortium color
- profile data. May contain NULs.
-
- proflen - length of profile data in bytes.
-
- png_set_sBIT(png_ptr, info_ptr, sig_bit);
-
- sig_bit - the number of significant bits for
- (PNG_INFO_sBIT) each of the gray, red,
- green, and blue channels, whichever are
- appropriate for the given color type
- (png_color_16)
-
- png_set_tRNS(png_ptr, info_ptr, trans_alpha,
- num_trans, trans_color);
-
- trans_alpha - array of alpha (transparency)
- entries for palette (PNG_INFO_tRNS)
-
- trans_color - graylevel or color sample values
- (in order red, green, blue) of the
- single transparent color for
- non-paletted images (PNG_INFO_tRNS)
-
- num_trans - number of transparent entries
- (PNG_INFO_tRNS)
-
- png_set_hIST(png_ptr, info_ptr, hist);
-
- hist - histogram of palette (array of
- png_uint_16) (PNG_INFO_hIST)
-
- png_set_tIME(png_ptr, info_ptr, mod_time);
-
- mod_time - time image was last modified
- (PNG_VALID_tIME)
-
- png_set_bKGD(png_ptr, info_ptr, background);
-
- background - background color (PNG_VALID_bKGD)
-
- png_set_text(png_ptr, info_ptr, text_ptr, num_text);
-
- text_ptr - array of png_text holding image
- comments
-
- text_ptr[i].compression - type of compression used
- on "text" PNG_TEXT_COMPRESSION_NONE
- PNG_TEXT_COMPRESSION_zTXt
- PNG_ITXT_COMPRESSION_NONE
- PNG_ITXT_COMPRESSION_zTXt
- text_ptr[i].key - keyword for comment. Must contain
- 1-79 characters.
- text_ptr[i].text - text comments for current
- keyword. Can be NULL or empty.
- text_ptr[i].text_length - length of text string,
- after decompression, 0 for iTXt
- text_ptr[i].itxt_length - length of itxt string,
- after decompression, 0 for tEXt/zTXt
- text_ptr[i].lang - language of comment (NULL or
- empty for unknown).
- text_ptr[i].translated_keyword - keyword in UTF-8 (NULL
- or empty for unknown).
- Note that the itxt_length, lang, and lang_key
- members of the text_ptr structure only exist
- when the library is built with iTXt chunk support.
-
- num_text - number of comments
-
- png_set_sPLT(png_ptr, info_ptr, &palette_ptr,
- num_spalettes);
-
- palette_ptr - array of png_sPLT_struct structures
- to be added to the list of palettes
- in the info structure.
- num_spalettes - number of palette structures to be
- added.
-
- png_set_oFFs(png_ptr, info_ptr, offset_x, offset_y,
- unit_type);
-
- offset_x - positive offset from the left
- edge of the screen
-
- offset_y - positive offset from the top
- edge of the screen
-
- unit_type - PNG_OFFSET_PIXEL, PNG_OFFSET_MICROMETER
-
- png_set_pHYs(png_ptr, info_ptr, res_x, res_y,
- unit_type);
-
- res_x - pixels/unit physical resolution
- in x direction
-
- res_y - pixels/unit physical resolution
- in y direction
-
- unit_type - PNG_RESOLUTION_UNKNOWN,
- PNG_RESOLUTION_METER
-
- png_set_sCAL(png_ptr, info_ptr, unit, width, height)
-
- unit - physical scale units (an integer)
-
- width - width of a pixel in physical scale units
-
- height - height of a pixel in physical scale units
- (width and height are doubles)
-
- png_set_sCAL_s(png_ptr, info_ptr, unit, width, height)
-
- unit - physical scale units (an integer)
-
- width - width of a pixel in physical scale units
-
- height - height of a pixel in physical scale units
- (width and height are strings like "2.54")
-
- png_set_unknown_chunks(png_ptr, info_ptr, &unknowns,
- num_unknowns)
-
- unknowns - array of png_unknown_chunk
- structures holding unknown chunks
- unknowns[i].name - name of unknown chunk
- unknowns[i].data - data of unknown chunk
- unknowns[i].size - size of unknown chunk's data
- unknowns[i].location - position to write chunk in file
- 0: do not write chunk
- PNG_HAVE_IHDR: before PLTE
- PNG_HAVE_PLTE: before IDAT
- PNG_AFTER_IDAT: after IDAT
-
-The "location" member is set automatically according to
-what part of the output file has already been written.
-You can change its value after calling png_set_unknown_chunks()
-as demonstrated in pngtest.c. Within each of the "locations",
-the chunks are sequenced according to their position in the
-structure (that is, the value of "i", which is the order in which
-the chunk was either read from the input file or defined with
-png_set_unknown_chunks).
-
-A quick word about text and num_text. text is an array of png_text
-structures. num_text is the number of valid structures in the array.
-Each png_text structure holds a language code, a keyword, a text value,
-and a compression type.
-
-The compression types have the same valid numbers as the compression
-types of the image data. Currently, the only valid number is zero.
-However, you can store text either compressed or uncompressed, unlike
-images, which always have to be compressed. So if you don't want the
-text compressed, set the compression type to PNG_TEXT_COMPRESSION_NONE.
-Because tEXt and zTXt chunks don't have a language field, if you
-specify PNG_TEXT_COMPRESSION_NONE or PNG_TEXT_COMPRESSION_zTXt
-any language code or translated keyword will not be written out.
-
-Until text gets around 1000 bytes, it is not worth compressing it.
-After the text has been written out to the file, the compression type
-is set to PNG_TEXT_COMPRESSION_NONE_WR or PNG_TEXT_COMPRESSION_zTXt_WR,
-so that it isn't written out again at the end (in case you are calling
-png_write_end() with the same struct).
-
-The keywords that are given in the PNG Specification are:
-
- Title Short (one line) title or
- caption for image
-
- Author Name of image's creator
-
- Description Description of image (possibly long)
-
- Copyright Copyright notice
-
- Creation Time Time of original image creation
- (usually RFC 1123 format, see below)
-
- Software Software used to create the image
-
- Disclaimer Legal disclaimer
-
- Warning Warning of nature of content
-
- Source Device used to create the image
-
- Comment Miscellaneous comment; conversion
- from other image format
-
-The keyword-text pairs work like this. Keywords should be short
-simple descriptions of what the comment is about. Some typical
-keywords are found in the PNG specification, as is some recommendations
-on keywords. You can repeat keywords in a file. You can even write
-some text before the image and some after. For example, you may want
-to put a description of the image before the image, but leave the
-disclaimer until after, so viewers working over modem connections
-don't have to wait for the disclaimer to go over the modem before
-they start seeing the image. Finally, keywords should be full
-words, not abbreviations. Keywords and text are in the ISO 8859-1
-(Latin-1) character set (a superset of regular ASCII) and can not
-contain NUL characters, and should not contain control or other
-unprintable characters. To make the comments widely readable, stick
-with basic ASCII, and avoid machine specific character set extensions
-like the IBM-PC character set. The keyword must be present, but
-you can leave off the text string on non-compressed pairs.
-Compressed pairs must have a text string, as only the text string
-is compressed anyway, so the compression would be meaningless.
-
-PNG supports modification time via the png_time structure. Two
-conversion routines are provided, png_convert_from_time_t() for
-time_t and png_convert_from_struct_tm() for struct tm. The
-time_t routine uses gmtime(). You don't have to use either of
-these, but if you wish to fill in the png_time structure directly,
-you should provide the time in universal time (GMT) if possible
-instead of your local time. Note that the year number is the full
-year (e.g. 1998, rather than 98 - PNG is year 2000 compliant!), and
-that months start with 1.
-
-If you want to store the time of the original image creation, you should
-use a plain tEXt chunk with the "Creation Time" keyword. This is
-necessary because the "creation time" of a PNG image is somewhat vague,
-depending on whether you mean the PNG file, the time the image was
-created in a non-PNG format, a still photo from which the image was
-scanned, or possibly the subject matter itself. In order to facilitate
-machine-readable dates, it is recommended that the "Creation Time"
-tEXt chunk use RFC 1123 format dates (e.g. "22 May 1997 18:07:10 GMT"),
-although this isn't a requirement. Unlike the tIME chunk, the
-"Creation Time" tEXt chunk is not expected to be automatically changed
-by the software. To facilitate the use of RFC 1123 dates, a function
-png_convert_to_rfc1123(png_timep) is provided to convert from PNG
-time to an RFC 1123 format string.
-
-.SS Writing unknown chunks
-
-You can use the png_set_unknown_chunks function to queue up chunks
-for writing. You give it a chunk name, raw data, and a size; that's
-all there is to it. The chunks will be written by the next following
-png_write_info_before_PLTE, png_write_info, or png_write_end function.
-Any chunks previously read into the info structure's unknown-chunk
-list will also be written out in a sequence that satisfies the PNG
-specification's ordering rules.
-
-.SS The high-level write interface
-
-At this point there are two ways to proceed; through the high-level
-write interface, or through a sequence of low-level write operations.
-You can use the high-level interface if your image data is present
-in the info structure. All defined output
-transformations are permitted, enabled by the following masks.
-
- PNG_TRANSFORM_IDENTITY No transformation
- PNG_TRANSFORM_PACKING Pack 1, 2 and 4-bit samples
- PNG_TRANSFORM_PACKSWAP Change order of packed
- pixels to LSB first
- PNG_TRANSFORM_INVERT_MONO Invert monochrome images
- PNG_TRANSFORM_SHIFT Normalize pixels to the
- sBIT depth
- PNG_TRANSFORM_BGR Flip RGB to BGR, RGBA
- to BGRA
- PNG_TRANSFORM_SWAP_ALPHA Flip RGBA to ARGB or GA
- to AG
- PNG_TRANSFORM_INVERT_ALPHA Change alpha from opacity
- to transparency
- PNG_TRANSFORM_SWAP_ENDIAN Byte-swap 16-bit samples
- PNG_TRANSFORM_STRIP_FILLER Strip out filler
- bytes (deprecated).
- PNG_TRANSFORM_STRIP_FILLER_BEFORE Strip out leading
- filler bytes
- PNG_TRANSFORM_STRIP_FILLER_AFTER Strip out trailing
- filler bytes
-
-If you have valid image data in the info structure (you can use
-png_set_rows() to put image data in the info structure), simply do this:
-
- png_write_png(png_ptr, info_ptr, png_transforms, NULL)
-
-where png_transforms is an integer containing the bitwise OR of some set of
-transformation flags. This call is equivalent to png_write_info(),
-followed the set of transformations indicated by the transform mask,
-then png_write_image(), and finally png_write_end().
-
-(The final parameter of this call is not yet used. Someday it might point
-to transformation parameters required by some future output transform.)
-
-You must use png_transforms and not call any png_set_transform() functions
-when you use png_write_png().
-
-.SS The low-level write interface
-
-If you are going the low-level route instead, you are now ready to
-write all the file information up to the actual image data. You do
-this with a call to png_write_info().
-
- png_write_info(png_ptr, info_ptr);
-
-Note that there is one transformation you may need to do before
-png_write_info(). In PNG files, the alpha channel in an image is the
-level of opacity. If your data is supplied as a level of transparency,
-you can invert the alpha channel before you write it, so that 0 is
-fully transparent and 255 (in 8-bit or paletted images) or 65535
-(in 16-bit images) is fully opaque, with
-
- png_set_invert_alpha(png_ptr);
-
-This must appear before png_write_info() instead of later with the
-other transformations because in the case of paletted images the tRNS
-chunk data has to be inverted before the tRNS chunk is written. If
-your image is not a paletted image, the tRNS data (which in such cases
-represents a single color to be rendered as transparent) won't need to
-be changed, and you can safely do this transformation after your
-png_write_info() call.
-
-If you need to write a private chunk that you want to appear before
-the PLTE chunk when PLTE is present, you can write the PNG info in
-two steps, and insert code to write your own chunk between them:
-
- png_write_info_before_PLTE(png_ptr, info_ptr);
- png_set_unknown_chunks(png_ptr, info_ptr, ...);
- png_write_info(png_ptr, info_ptr);
-
-After you've written the file information, you can set up the library
-to handle any special transformations of the image data. The various
-ways to transform the data will be described in the order that they
-should occur. This is important, as some of these change the color
-type and/or bit depth of the data, and some others only work on
-certain color types and bit depths. Even though each transformation
-checks to see if it has data that it can do something with, you should
-make sure to only enable a transformation if it will be valid for the
-data. For example, don't swap red and blue on grayscale data.
-
-PNG files store RGB pixels packed into 3 or 6 bytes. This code tells
-the library to strip input data that has 4 or 8 bytes per pixel down
-to 3 or 6 bytes (or strip 2 or 4-byte grayscale+filler data to 1 or 2
-bytes per pixel).
-
- png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE);
-
-where the 0 is unused, and the location is either PNG_FILLER_BEFORE or
-PNG_FILLER_AFTER, depending upon whether the filler byte in the pixel
-is stored XRGB or RGBX.
-
-PNG files pack pixels of bit depths 1, 2, and 4 into bytes as small as
-they can, resulting in, for example, 8 pixels per byte for 1 bit files.
-If the data is supplied at 1 pixel per byte, use this code, which will
-correctly pack the pixels into a single byte:
-
- png_set_packing(png_ptr);
-
-PNG files reduce possible bit depths to 1, 2, 4, 8, and 16. If your
-data is of another bit depth, you can write an sBIT chunk into the
-file so that decoders can recover the original data if desired.
-
- /* Set the true bit depth of the image data */
- if (color_type & PNG_COLOR_MASK_COLOR)
- {
- sig_bit.red = true_bit_depth;
- sig_bit.green = true_bit_depth;
- sig_bit.blue = true_bit_depth;
- }
-
- else
- {
- sig_bit.gray = true_bit_depth;
- }
-
- if (color_type & PNG_COLOR_MASK_ALPHA)
- {
- sig_bit.alpha = true_bit_depth;
- }
-
- png_set_sBIT(png_ptr, info_ptr, &sig_bit);
-
-If the data is stored in the row buffer in a bit depth other than
-one supported by PNG (e.g. 3 bit data in the range 0-7 for a 4-bit PNG),
-this will scale the values to appear to be the correct bit depth as
-is required by PNG.
-
- png_set_shift(png_ptr, &sig_bit);
-
-PNG files store 16 bit pixels in network byte order (big-endian,
-ie. most significant bits first). This code would be used if they are
-supplied the other way (little-endian, i.e. least significant bits
-first, the way PCs store them):
-
- if (bit_depth > 8)
- png_set_swap(png_ptr);
-
-If you are using packed-pixel images (1, 2, or 4 bits/pixel), and you
-need to change the order the pixels are packed into bytes, you can use:
-
- if (bit_depth < 8)
- png_set_packswap(png_ptr);
-
-PNG files store 3 color pixels in red, green, blue order. This code
-would be used if they are supplied as blue, green, red:
-
- png_set_bgr(png_ptr);
-
-PNG files describe monochrome as black being zero and white being
-one. This code would be used if the pixels are supplied with this reversed
-(black being one and white being zero):
-
- png_set_invert_mono(png_ptr);
-
-Finally, you can write your own transformation function if none of
-the existing ones meets your needs. This is done by setting a callback
-with
-
- png_set_write_user_transform_fn(png_ptr,
- write_transform_fn);
-
-You must supply the function
-
- void write_transform_fn(png_structp png_ptr ptr,
- row_info_ptr row_info, png_bytep data)
-
-See pngtest.c for a working example. Your function will be called
-before any of the other transformations are processed. If supported
-libpng also supplies an information routine that may be called from
-your callback:
-
- png_get_current_row_number(png_ptr);
-
-This returns the current row passed to the transform. Even with interlaced
-images the value returned is the row in the final output image.
-
-You can also set up a pointer to a user structure for use by your
-callback function.
-
- png_set_user_transform_info(png_ptr, user_ptr, 0, 0);
-
-The user_channels and user_depth parameters of this function are ignored
-when writing; you can set them to zero as shown.
-
-You can retrieve the pointer via the function png_get_user_transform_ptr().
-For example:
-
- voidp write_user_transform_ptr =
- png_get_user_transform_ptr(png_ptr);
-
-It is possible to have libpng flush any pending output, either manually,
-or automatically after a certain number of lines have been written. To
-flush the output stream a single time call:
-
- png_write_flush(png_ptr);
-
-and to have libpng flush the output stream periodically after a certain
-number of scanlines have been written, call:
-
- png_set_flush(png_ptr, nrows);
-
-Note that the distance between rows is from the last time png_write_flush()
-was called, or the first row of the image if it has never been called.
-So if you write 50 lines, and then png_set_flush 25, it will flush the
-output on the next scanline, and every 25 lines thereafter, unless
-png_write_flush() is called before 25 more lines have been written.
-If nrows is too small (less than about 10 lines for a 640 pixel wide
-RGB image) the image compression may decrease noticeably (although this
-may be acceptable for real-time applications). Infrequent flushing will
-only degrade the compression performance by a few percent over images
-that do not use flushing.
-
-.SS Writing the image data
-
-That's it for the transformations. Now you can write the image data.
-The simplest way to do this is in one function call. If you have the
-whole image in memory, you can just call png_write_image() and libpng
-will write the image. You will need to pass in an array of pointers to
-each row. This function automatically handles interlacing, so you don't
-need to call png_set_interlace_handling() or call this function multiple
-times, or any of that other stuff necessary with png_write_rows().
-
- png_write_image(png_ptr, row_pointers);
-
-where row_pointers is:
-
- png_byte *row_pointers[height];
-
-You can point to void or char or whatever you use for pixels.
-
-If you don't want to write the whole image at once, you can
-use png_write_rows() instead. If the file is not interlaced,
-this is simple:
-
- png_write_rows(png_ptr, row_pointers,
- number_of_rows);
-
-row_pointers is the same as in the png_write_image() call.
-
-If you are just writing one row at a time, you can do this with
-a single row_pointer instead of an array of row_pointers:
-
- png_bytep row_pointer = row;
-
- png_write_row(png_ptr, row_pointer);
-
-When the file is interlaced, things can get a good deal more complicated.
-The only currently (as of the PNG Specification version 1.2, dated July
-1999) defined interlacing scheme for PNG files is the "Adam7" interlace
-scheme, that breaks down an image into seven smaller images of varying
-size. libpng will build these images for you, or you can do them
-yourself. If you want to build them yourself, see the PNG specification
-for details of which pixels to write when.
-
-If you don't want libpng to handle the interlacing details, just
-use png_set_interlace_handling() and call png_write_rows() the
-correct number of times to write all the sub-images
-(png_set_interlace_handling() returns the number of sub-images.)
-
-If you want libpng to build the sub-images, call this before you start
-writing any rows:
-
- number_of_passes = png_set_interlace_handling(png_ptr);
-
-This will return the number of passes needed. Currently, this is seven,
-but may change if another interlace type is added.
-
-Then write the complete image number_of_passes times.
-
- png_write_rows(png_ptr, row_pointers, number_of_rows);
-
-Think carefully before you write an interlaced image. Typically code that
-reads such images reads all the image data into memory, uncompressed, before
-doing any processing. Only code that can display an image on the fly can
-take advantage of the interlacing and even then the image has to be exactly
-the correct size for the output device, because scaling an image requires
-adjacent pixels and these are not available until all the passes have been
-read.
-
-If you do write an interlaced image you will hardly ever need to handle
-the interlacing yourself. Call png_set_interlace_handling() and use the
-approach described above.
-
-The only time it is conceivable that you will really need to write an
-interlaced image pass-by-pass is when you have read one pass by pass and
-made some pixel-by-pixel transformation to it, as described in the read
-code above. In this case use the PNG_PASS_ROWS and PNG_PASS_COLS macros
-to determine the size of each sub-image in turn and simply write the rows
-you obtained from the read code.
-
-.SS Finishing a sequential write
-
-After you are finished writing the image, you should finish writing
-the file. If you are interested in writing comments or time, you should
-pass an appropriately filled png_info pointer. If you are not interested,
-you can pass NULL.
-
- png_write_end(png_ptr, info_ptr);
-
-When you are done, you can free all memory used by libpng like this:
-
- png_destroy_write_struct(&png_ptr, &info_ptr);
-
-It is also possible to individually free the info_ptr members that
-point to libpng-allocated storage with the following function:
-
- png_free_data(png_ptr, info_ptr, mask, seq)
-
- mask - identifies data to be freed, a mask
- containing the bitwise OR of one or
- more of
- PNG_FREE_PLTE, PNG_FREE_TRNS,
- PNG_FREE_HIST, PNG_FREE_ICCP,
- PNG_FREE_PCAL, PNG_FREE_ROWS,
- PNG_FREE_SCAL, PNG_FREE_SPLT,
- PNG_FREE_TEXT, PNG_FREE_UNKN,
- or simply PNG_FREE_ALL
-
- seq - sequence number of item to be freed
- (-1 for all items)
-
-This function may be safely called when the relevant storage has
-already been freed, or has not yet been allocated, or was allocated
-by the user and not by libpng, and will in those cases do nothing.
-The "seq" parameter is ignored if only one item of the selected data
-type, such as PLTE, is allowed. If "seq" is not -1, and multiple items
-are allowed for the data type identified in the mask, such as text or
-sPLT, only the n'th item in the structure is freed, where n is "seq".
-
-If you allocated data such as a palette that you passed in to libpng
-with png_set_*, you must not free it until just before the call to
-png_destroy_write_struct().
-
-The default behavior is only to free data that was allocated internally
-by libpng. This can be changed, so that libpng will not free the data,
-or so that it will free data that was allocated by the user with png_malloc()
-or png_zalloc() and passed in via a png_set_*() function, with
-
- png_data_freer(png_ptr, info_ptr, freer, mask)
-
- freer - one of
- PNG_DESTROY_WILL_FREE_DATA
- PNG_SET_WILL_FREE_DATA
- PNG_USER_WILL_FREE_DATA
-
- mask - which data elements are affected
- same choices as in png_free_data()
-
-For example, to transfer responsibility for some data from a read structure
-to a write structure, you could use
-
- png_data_freer(read_ptr, read_info_ptr,
- PNG_USER_WILL_FREE_DATA,
- PNG_FREE_PLTE|PNG_FREE_tRNS|PNG_FREE_hIST)
-
- png_data_freer(write_ptr, write_info_ptr,
- PNG_DESTROY_WILL_FREE_DATA,
- PNG_FREE_PLTE|PNG_FREE_tRNS|PNG_FREE_hIST)
-
-thereby briefly reassigning responsibility for freeing to the user but
-immediately afterwards reassigning it once more to the write_destroy
-function. Having done this, it would then be safe to destroy the read
-structure and continue to use the PLTE, tRNS, and hIST data in the write
-structure.
-
-This function only affects data that has already been allocated.
-You can call this function before calling after the png_set_*() functions
-to control whether the user or png_destroy_*() is supposed to free the data.
-When the user assumes responsibility for libpng-allocated data, the
-application must use
-png_free() to free it, and when the user transfers responsibility to libpng
-for data that the user has allocated, the user must have used png_malloc()
-or png_zalloc() to allocate it.
-
-If you allocated text_ptr.text, text_ptr.lang, and text_ptr.translated_keyword
-separately, do not transfer responsibility for freeing text_ptr to libpng,
-because when libpng fills a png_text structure it combines these members with
-the key member, and png_free_data() will free only text_ptr.key. Similarly,
-if you transfer responsibility for free'ing text_ptr from libpng to your
-application, your application must not separately free those members.
-For a more compact example of writing a PNG image, see the file example.c.
-
-.SH V. Modifying/Customizing libpng:
-
-There are two issues here. The first is changing how libpng does
-standard things like memory allocation, input/output, and error handling.
-The second deals with more complicated things like adding new chunks,
-adding new transformations, and generally changing how libpng works.
-Both of those are compile-time issues; that is, they are generally
-determined at the time the code is written, and there is rarely a need
-to provide the user with a means of changing them.
-
-Memory allocation, input/output, and error handling
-
-All of the memory allocation, input/output, and error handling in libpng
-goes through callbacks that are user-settable. The default routines are
-in pngmem.c, pngrio.c, pngwio.c, and pngerror.c, respectively. To change
-these functions, call the appropriate png_set_*_fn() function.
-
-Memory allocation is done through the functions png_malloc(), png_calloc(),
-and png_free(). These currently just call the standard C functions.
-png_calloc() calls png_malloc() and then clears the newly
-allocated memory to zero. There is limited support for certain systems
-with segmented memory architectures and the types of pointers declared by
-png.h match this; you will have to use appropriate pointers in your
-application. Since it is
-unlikely that the method of handling memory allocation on a platform
-will change between applications, these functions must be modified in
-the library at compile time. If you prefer to use a different method
-of allocating and freeing data, you can use png_create_read_struct_2() or
-png_create_write_struct_2() to register your own functions as described
-above. These functions also provide a void pointer that can be retrieved
-via
-
- mem_ptr=png_get_mem_ptr(png_ptr);
-
-Your replacement memory functions must have prototypes as follows:
-
- png_voidp malloc_fn(png_structp png_ptr,
- png_alloc_size_t size);
-
- void free_fn(png_structp png_ptr, png_voidp ptr);
-
-Your malloc_fn() must return NULL in case of failure. The png_malloc()
-function will normally call png_error() if it receives a NULL from the
-system memory allocator or from your replacement malloc_fn().
-
-Your free_fn() will never be called with a NULL ptr, since libpng's
-png_free() checks for NULL before calling free_fn().
-
-Input/Output in libpng is done through png_read() and png_write(),
-which currently just call fread() and fwrite(). The FILE * is stored in
-png_struct and is initialized via png_init_io(). If you wish to change
-the method of I/O, the library supplies callbacks that you can set
-through the function png_set_read_fn() and png_set_write_fn() at run
-time, instead of calling the png_init_io() function. These functions
-also provide a void pointer that can be retrieved via the function
-png_get_io_ptr(). For example:
-
- png_set_read_fn(png_structp read_ptr,
- voidp read_io_ptr, png_rw_ptr read_data_fn)
-
- png_set_write_fn(png_structp write_ptr,
- voidp write_io_ptr, png_rw_ptr write_data_fn,
- png_flush_ptr output_flush_fn);
-
- voidp read_io_ptr = png_get_io_ptr(read_ptr);
- voidp write_io_ptr = png_get_io_ptr(write_ptr);
-
-The replacement I/O functions must have prototypes as follows:
-
- void user_read_data(png_structp png_ptr,
- png_bytep data, png_size_t length);
-
- void user_write_data(png_structp png_ptr,
- png_bytep data, png_size_t length);
-
- void user_flush_data(png_structp png_ptr);
-
-The user_read_data() function is responsible for detecting and
-handling end-of-data errors.
-
-Supplying NULL for the read, write, or flush functions sets them back
-to using the default C stream functions, which expect the io_ptr to
-point to a standard *FILE structure. It is probably a mistake
-to use NULL for one of write_data_fn and output_flush_fn but not both
-of them, unless you have built libpng with PNG_NO_WRITE_FLUSH defined.
-It is an error to read from a write stream, and vice versa.
-
-Error handling in libpng is done through png_error() and png_warning().
-Errors handled through png_error() are fatal, meaning that png_error()
-should never return to its caller. Currently, this is handled via
-setjmp() and longjmp() (unless you have compiled libpng with
-PNG_NO_SETJMP, in which case it is handled via PNG_ABORT()),
-but you could change this to do things like exit() if you should wish,
-as long as your function does not return.
-
-On non-fatal errors, png_warning() is called
-to print a warning message, and then control returns to the calling code.
-By default png_error() and png_warning() print a message on stderr via
-fprintf() unless the library is compiled with PNG_NO_CONSOLE_IO defined
-(because you don't want the messages) or PNG_NO_STDIO defined (because
-fprintf() isn't available). If you wish to change the behavior of the error
-functions, you will need to set up your own message callbacks. These
-functions are normally supplied at the time that the png_struct is created.
-It is also possible to redirect errors and warnings to your own replacement
-functions after png_create_*_struct() has been called by calling:
-
- png_set_error_fn(png_structp png_ptr,
- png_voidp error_ptr, png_error_ptr error_fn,
- png_error_ptr warning_fn);
-
- png_voidp error_ptr = png_get_error_ptr(png_ptr);
-
-If NULL is supplied for either error_fn or warning_fn, then the libpng
-default function will be used, calling fprintf() and/or longjmp() if a
-problem is encountered. The replacement error functions should have
-parameters as follows:
-
- void user_error_fn(png_structp png_ptr,
- png_const_charp error_msg);
-
- void user_warning_fn(png_structp png_ptr,
- png_const_charp warning_msg);
-
-The motivation behind using setjmp() and longjmp() is the C++ throw and
-catch exception handling methods. This makes the code much easier to write,
-as there is no need to check every return code of every function call.
-However, there are some uncertainties about the status of local variables
-after a longjmp, so the user may want to be careful about doing anything
-after setjmp returns non-zero besides returning itself. Consult your
-compiler documentation for more details. For an alternative approach, you
-may wish to use the "cexcept" facility (see http://cexcept.sourceforge.net).
-
-.SS Custom chunks
-
-If you need to read or write custom chunks, you may need to get deeper
-into the libpng code. The library now has mechanisms for storing
-and writing chunks of unknown type; you can even declare callbacks
-for custom chunks. However, this may not be good enough if the
-library code itself needs to know about interactions between your
-chunk and existing `intrinsic' chunks.
-
-If you need to write a new intrinsic chunk, first read the PNG
-specification. Acquire a first level of understanding of how it works.
-Pay particular attention to the sections that describe chunk names,
-and look at how other chunks were designed, so you can do things
-similarly. Second, check out the sections of libpng that read and
-write chunks. Try to find a chunk that is similar to yours and use
-it as a template. More details can be found in the comments inside
-the code. It is best to handle unknown chunks in a generic method,
-via callback functions, instead of by modifying libpng functions.
-
-If you wish to write your own transformation for the data, look through
-the part of the code that does the transformations, and check out some of
-the simpler ones to get an idea of how they work. Try to find a similar
-transformation to the one you want to add and copy off of it. More details
-can be found in the comments inside the code itself.
-
-.SS Configuring for 16 bit platforms
-
-You will want to look into zconf.h to tell zlib (and thus libpng) that
-it cannot allocate more then 64K at a time. Even if you can, the memory
-won't be accessible. So limit zlib and libpng to 64K by defining MAXSEG_64K.
-
-.SS Configuring for DOS
-
-For DOS users who only have access to the lower 640K, you will
-have to limit zlib's memory usage via a png_set_compression_mem_level()
-call. See zlib.h or zconf.h in the zlib library for more information.
-
-.SS Configuring for Medium Model
-
-Libpng's support for medium model has been tested on most of the popular
-compilers. Make sure MAXSEG_64K gets defined, USE_FAR_KEYWORD gets
-defined, and FAR gets defined to far in pngconf.h, and you should be
-all set. Everything in the library (except for zlib's structure) is
-expecting far data. You must use the typedefs with the p or pp on
-the end for pointers (or at least look at them and be careful). Make
-note that the rows of data are defined as png_bytepp, which is an
-unsigned char far * far *.
-
-.SS Configuring for gui/windowing platforms:
-
-You will need to write new error and warning functions that use the GUI
-interface, as described previously, and set them to be the error and
-warning functions at the time that png_create_*_struct() is called,
-in order to have them available during the structure initialization.
-They can be changed later via png_set_error_fn(). On some compilers,
-you may also have to change the memory allocators (png_malloc, etc.).
-
-.SS Configuring for compiler xxx:
-
-All includes for libpng are in pngconf.h. If you need to add, change
-or delete an include, this is the place to do it.
-The includes that are not needed outside libpng are placed in pngpriv.h,
-which is only used by the routines inside libpng itself.
-The files in libpng proper only include pngpriv.h and png.h, which
-in turn includes pngconf.h.
-
-.SS Configuring zlib:
-
-There are special functions to configure the compression. Perhaps the
-most useful one changes the compression level, which currently uses
-input compression values in the range 0 - 9. The library normally
-uses the default compression level (Z_DEFAULT_COMPRESSION = 6). Tests
-have shown that for a large majority of images, compression values in
-the range 3-6 compress nearly as well as higher levels, and do so much
-faster. For online applications it may be desirable to have maximum speed
-(Z_BEST_SPEED = 1). With versions of zlib after v0.99, you can also
-specify no compression (Z_NO_COMPRESSION = 0), but this would create
-files larger than just storing the raw bitmap. You can specify the
-compression level by calling:
-
- png_set_compression_level(png_ptr, level);
-
-Another useful one is to reduce the memory level used by the library.
-The memory level defaults to 8, but it can be lowered if you are
-short on memory (running DOS, for example, where you only have 640K).
-Note that the memory level does have an effect on compression; among
-other things, lower levels will result in sections of incompressible
-data being emitted in smaller stored blocks, with a correspondingly
-larger relative overhead of up to 15% in the worst case.
-
- png_set_compression_mem_level(png_ptr, level);
-
-The other functions are for configuring zlib. They are not recommended
-for normal use and may result in writing an invalid PNG file. See
-zlib.h for more information on what these mean.
-
- png_set_compression_strategy(png_ptr,
- strategy);
-
- png_set_compression_window_bits(png_ptr,
- window_bits);
-
- png_set_compression_method(png_ptr, method);
- png_set_compression_buffer_size(png_ptr, size);
-
-.SS Controlling row filtering
-
-If you want to control whether libpng uses filtering or not, which
-filters are used, and how it goes about picking row filters, you
-can call one of these functions. The selection and configuration
-of row filters can have a significant impact on the size and
-encoding speed and a somewhat lesser impact on the decoding speed
-of an image. Filtering is enabled by default for RGB and grayscale
-images (with and without alpha), but not for paletted images nor
-for any images with bit depths less than 8 bits/pixel.
-
-The 'method' parameter sets the main filtering method, which is
-currently only '0' in the PNG 1.2 specification. The 'filters'
-parameter sets which filter(s), if any, should be used for each
-scanline. Possible values are PNG_ALL_FILTERS and PNG_NO_FILTERS
-to turn filtering on and off, respectively.
-
-Individual filter types are PNG_FILTER_NONE, PNG_FILTER_SUB,
-PNG_FILTER_UP, PNG_FILTER_AVG, PNG_FILTER_PAETH, which can be bitwise
-ORed together with '|' to specify one or more filters to use.
-These filters are described in more detail in the PNG specification.
-If you intend to change the filter type during the course of writing
-the image, you should start with flags set for all of the filters
-you intend to use so that libpng can initialize its internal
-structures appropriately for all of the filter types. (Note that this
-means the first row must always be adaptively filtered, because libpng
-currently does not allocate the filter buffers until png_write_row()
-is called for the first time.)
-
- filters = PNG_FILTER_NONE | PNG_FILTER_SUB
- PNG_FILTER_UP | PNG_FILTER_AVG |
- PNG_FILTER_PAETH | PNG_ALL_FILTERS;
-
- png_set_filter(png_ptr, PNG_FILTER_TYPE_BASE,
- filters);
- The second parameter can also be
- PNG_INTRAPIXEL_DIFFERENCING if you are
- writing a PNG to be embedded in a MNG
- datastream. This parameter must be the
- same as the value of filter_method used
- in png_set_IHDR().
-
-It is also possible to influence how libpng chooses from among the
-available filters. This is done in one or both of two ways - by
-telling it how important it is to keep the same filter for successive
-rows, and by telling it the relative computational costs of the filters.
-
- double weights[3] = {1.5, 1.3, 1.1},
- costs[PNG_FILTER_VALUE_LAST] =
- {1.0, 1.3, 1.3, 1.5, 1.7};
-
- png_set_filter_heuristics(png_ptr,
- PNG_FILTER_HEURISTIC_WEIGHTED, 3,
- weights, costs);
-
-The weights are multiplying factors that indicate to libpng that the
-row filter should be the same for successive rows unless another row filter
-is that many times better than the previous filter. In the above example,
-if the previous 3 filters were SUB, SUB, NONE, the SUB filter could have a
-"sum of absolute differences" 1.5 x 1.3 times higher than other filters
-and still be chosen, while the NONE filter could have a sum 1.1 times
-higher than other filters and still be chosen. Unspecified weights are
-taken to be 1.0, and the specified weights should probably be declining
-like those above in order to emphasize recent filters over older filters.
-
-The filter costs specify for each filter type a relative decoding cost
-to be considered when selecting row filters. This means that filters
-with higher costs are less likely to be chosen over filters with lower
-costs, unless their "sum of absolute differences" is that much smaller.
-The costs do not necessarily reflect the exact computational speeds of
-the various filters, since this would unduly influence the final image
-size.
-
-Note that the numbers above were invented purely for this example and
-are given only to help explain the function usage. Little testing has
-been done to find optimum values for either the costs or the weights.
-
-.SS Removing unwanted object code
-
-There are a bunch of #define's in pngconf.h that control what parts of
-libpng are compiled. All the defines end in _SUPPORTED. If you are
-never going to use a capability, you can change the #define to #undef
-before recompiling libpng and save yourself code and data space, or
-you can turn off individual capabilities with defines that begin with
-PNG_NO_.
-
-In libpng-1.5.0 and later, the #define's are in pnglibconf.h instead.
-
-You can also turn all of the transforms and ancillary chunk capabilities
-off en masse with compiler directives that define
-PNG_NO_READ[or WRITE]_TRANSFORMS, or PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS,
-or all four,
-along with directives to turn on any of the capabilities that you do
-want. The PNG_NO_READ[or WRITE]_TRANSFORMS directives disable the extra
-transformations but still leave the library fully capable of reading
-and writing PNG files with all known public chunks. Use of the
-PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS directive produces a library
-that is incapable of reading or writing ancillary chunks. If you are
-not using the progressive reading capability, you can turn that off
-with PNG_NO_PROGRESSIVE_READ (don't confuse this with the INTERLACING
-capability, which you'll still have).
-
-All the reading and writing specific code are in separate files, so the
-linker should only grab the files it needs. However, if you want to
-make sure, or if you are building a stand alone library, all the
-reading files start with pngr and all the writing files start with
-pngw. The files that don't match either (like png.c, pngtrans.c, etc.)
-are used for both reading and writing, and always need to be included.
-The progressive reader is in pngpread.c
-
-If you are creating or distributing a dynamically linked library (a .so
-or DLL file), you should not remove or disable any parts of the library,
-as this will cause applications linked with different versions of the
-library to fail if they call functions not available in your library.
-The size of the library itself should not be an issue, because only
-those sections that are actually used will be loaded into memory.
-
-.SS Requesting debug printout
-
-The macro definition PNG_DEBUG can be used to request debugging
-printout. Set it to an integer value in the range 0 to 3. Higher
-numbers result in increasing amounts of debugging information. The
-information is printed to the "stderr" file, unless another file
-name is specified in the PNG_DEBUG_FILE macro definition.
-
-When PNG_DEBUG > 0, the following functions (macros) become available:
-
- png_debug(level, message)
- png_debug1(level, message, p1)
- png_debug2(level, message, p1, p2)
-
-in which "level" is compared to PNG_DEBUG to decide whether to print
-the message, "message" is the formatted string to be printed,
-and p1 and p2 are parameters that are to be embedded in the string
-according to printf-style formatting directives. For example,
-
- png_debug1(2, "foo=%d\n", foo);
-
-is expanded to
-
- if (PNG_DEBUG > 2)
- fprintf(PNG_DEBUG_FILE, "foo=%d\n", foo);
-
-When PNG_DEBUG is defined but is zero, the macros aren't defined, but you
-can still use PNG_DEBUG to control your own debugging:
-
- #ifdef PNG_DEBUG
- fprintf(stderr, ...
- #endif
-
-When PNG_DEBUG = 1, the macros are defined, but only png_debug statements
-having level = 0 will be printed. There aren't any such statements in
-this version of libpng, but if you insert some they will be printed.
-
-.SH VI. MNG support
-
-The MNG specification (available at http://www.libpng.org/pub/mng) allows
-certain extensions to PNG for PNG images that are embedded in MNG datastreams.
-Libpng can support some of these extensions. To enable them, use the
-png_permit_mng_features() function:
-
- feature_set = png_permit_mng_features(png_ptr, mask)
-
- mask is a png_uint_32 containing the bitwise OR of the
- features you want to enable. These include
- PNG_FLAG_MNG_EMPTY_PLTE
- PNG_FLAG_MNG_FILTER_64
- PNG_ALL_MNG_FEATURES
-
- feature_set is a png_uint_32 that is the bitwise AND of
- your mask with the set of MNG features that is
- supported by the version of libpng that you are using.
-
-It is an error to use this function when reading or writing a standalone
-PNG file with the PNG 8-byte signature. The PNG datastream must be wrapped
-in a MNG datastream. As a minimum, it must have the MNG 8-byte signature
-and the MHDR and MEND chunks. Libpng does not provide support for these
-or any other MNG chunks; your application must provide its own support for
-them. You may wish to consider using libmng (available at
-http://www.libmng.com) instead.
-
-.SH VII. Changes to Libpng from version 0.88
-
-It should be noted that versions of libpng later than 0.96 are not
-distributed by the original libpng author, Guy Schalnat, nor by
-Andreas Dilger, who had taken over from Guy during 1996 and 1997, and
-distributed versions 0.89 through 0.96, but rather by another member
-of the original PNG Group, Glenn Randers-Pehrson. Guy and Andreas are
-still alive and well, but they have moved on to other things.
-
-The old libpng functions png_read_init(), png_write_init(),
-png_info_init(), png_read_destroy(), and png_write_destroy() have been
-moved to PNG_INTERNAL in version 0.95 to discourage their use. These
-functions will be removed from libpng version 1.4.0.
-
-The preferred method of creating and initializing the libpng structures is
-via the png_create_read_struct(), png_create_write_struct(), and
-png_create_info_struct() because they isolate the size of the structures
-from the application, allow version error checking, and also allow the
-use of custom error handling routines during the initialization, which
-the old functions do not. The functions png_read_destroy() and
-png_write_destroy() do not actually free the memory that libpng
-allocated for these structs, but just reset the data structures, so they
-can be used instead of png_destroy_read_struct() and
-png_destroy_write_struct() if you feel there is too much system overhead
-allocating and freeing the png_struct for each image read.
-
-Setting the error callbacks via png_set_message_fn() before
-png_read_init() as was suggested in libpng-0.88 is no longer supported
-because this caused applications that do not use custom error functions
-to fail if the png_ptr was not initialized to zero. It is still possible
-to set the error callbacks AFTER png_read_init(), or to change them with
-png_set_error_fn(), which is essentially the same function, but with a new
-name to force compilation errors with applications that try to use the old
-method.
-
-Starting with version 1.0.7, you can find out which version of the library
-you are using at run-time:
-
- png_uint_32 libpng_vn = png_access_version_number();
-
-The number libpng_vn is constructed from the major version, minor
-version with leading zero, and release number with leading zero,
-(e.g., libpng_vn for version 1.0.7 is 10007).
-
-You can also check which version of png.h you used when compiling your
-application:
-
- png_uint_32 application_vn = PNG_LIBPNG_VER;
-
-.SH VIII. Changes to Libpng from version 1.0.x to 1.2.x
-
-Support for user memory management was enabled by default. To
-accomplish this, the functions png_create_read_struct_2(),
-png_create_write_struct_2(), png_set_mem_fn(), png_get_mem_ptr(),
-png_malloc_default(), and png_free_default() were added.
-
-Support for the iTXt chunk has been enabled by default as of
-version 1.2.41.
-
-Support for certain MNG features was enabled.
-
-Support for numbered error messages was added. However, we never got
-around to actually numbering the error messages. The function
-png_set_strip_error_numbers() was added (Note: the prototype for this
-function was inadvertently removed from png.h in PNG_NO_ASSEMBLER_CODE
-builds of libpng-1.2.15. It was restored in libpng-1.2.36).
-
-The png_malloc_warn() function was added at libpng-1.2.3. This issues
-a png_warning and returns NULL instead of aborting when it fails to
-acquire the requested memory allocation.
-
-Support for setting user limits on image width and height was enabled
-by default. The functions png_set_user_limits(), png_get_user_width_max(),
-and png_get_user_height_max() were added at libpng-1.2.6.
-
-The png_set_add_alpha() function was added at libpng-1.2.7.
-
-The function png_set_expand_gray_1_2_4_to_8() was added at libpng-1.2.9.
-Unlike png_set_gray_1_2_4_to_8(), the new function does not expand the
-tRNS chunk to alpha. The png_set_gray_1_2_4_to_8() function is
-deprecated.
-
-A number of macro definitions in support of runtime selection of
-assembler code features (especially Intel MMX code support) were
-added at libpng-1.2.0:
-
- PNG_ASM_FLAG_MMX_SUPPORT_COMPILED
- PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU
- PNG_ASM_FLAG_MMX_READ_COMBINE_ROW
- PNG_ASM_FLAG_MMX_READ_INTERLACE
- PNG_ASM_FLAG_MMX_READ_FILTER_SUB
- PNG_ASM_FLAG_MMX_READ_FILTER_UP
- PNG_ASM_FLAG_MMX_READ_FILTER_AVG
- PNG_ASM_FLAG_MMX_READ_FILTER_PAETH
- PNG_ASM_FLAGS_INITIALIZED
- PNG_MMX_READ_FLAGS
- PNG_MMX_FLAGS
- PNG_MMX_WRITE_FLAGS
- PNG_MMX_FLAGS
-
-We added the following functions in support of runtime
-selection of assembler code features:
-
- png_get_mmx_flagmask()
- png_set_mmx_thresholds()
- png_get_asm_flags()
- png_get_mmx_bitdepth_threshold()
- png_get_mmx_rowbytes_threshold()
- png_set_asm_flags()
-
-We replaced all of these functions with simple stubs in libpng-1.2.20,
-when the Intel assembler code was removed due to a licensing issue.
-
-These macros are deprecated:
-
- PNG_READ_TRANSFORMS_NOT_SUPPORTED
- PNG_PROGRESSIVE_READ_NOT_SUPPORTED
- PNG_NO_SEQUENTIAL_READ_SUPPORTED
- PNG_WRITE_TRANSFORMS_NOT_SUPPORTED
- PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED
- PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED
-
-They have been replaced, respectively, by:
-
- PNG_NO_READ_TRANSFORMS
- PNG_NO_PROGRESSIVE_READ
- PNG_NO_SEQUENTIAL_READ
- PNG_NO_WRITE_TRANSFORMS
- PNG_NO_READ_ANCILLARY_CHUNKS
- PNG_NO_WRITE_ANCILLARY_CHUNKS
-
-PNG_MAX_UINT was replaced with PNG_UINT_31_MAX. It has been
-deprecated since libpng-1.0.16 and libpng-1.2.6.
-
-The function
- png_check_sig(sig, num)
-was replaced with
- !png_sig_cmp(sig, 0, num)
-It has been deprecated since libpng-0.90.
-
-The function
- png_set_gray_1_2_4_to_8()
-which also expands tRNS to alpha was replaced with
- png_set_expand_gray_1_2_4_to_8()
-which does not. It has been deprecated since libpng-1.0.18 and 1.2.9.
-
-.SH IX. Changes to Libpng from version 1.0.x/1.2.x to 1.4.x
-
-Private libpng prototypes and macro definitions were moved from
-png.h and pngconf.h into a new pngpriv.h header file.
-
-Functions png_set_benign_errors(), png_benign_error(), and
-png_chunk_benign_error() were added.
-
-Support for setting the maximum amount of memory that the application
-will allocate for reading chunks was added, as a security measure.
-The functions png_set_chunk_cache_max() and png_get_chunk_cache_max()
-were added to the library.
-
-We implemented support for I/O states by adding png_ptr member io_state
-and functions png_get_io_chunk_name() and png_get_io_state() in pngget.c
-
-We added PNG_TRANSFORM_GRAY_TO_RGB to the available high-level
-input transforms.
-
-Checking for and reporting of errors in the IHDR chunk is more thorough.
-
-Support for global arrays was removed, to improve thread safety.
-
-Some obsolete/deprecated macros and functions have been removed.
-
-Typecasted NULL definitions such as
- #define png_voidp_NULL (png_voidp)NULL
-were eliminated. If you used these in your application, just use
-NULL instead.
-
-The png_struct and info_struct members "trans" and "trans_values" were
-changed to "trans_alpha" and "trans_color", respectively.
-
-The obsolete, unused pnggccrd.c and pngvcrd.c files and related makefiles
-were removed.
-
-The PNG_1_0_X and PNG_1_2_X macros were eliminated.
-
-The PNG_LEGACY_SUPPORTED macro was eliminated.
-
-Many WIN32_WCE #ifdefs were removed.
-
-The functions png_read_init(info_ptr), png_write_init(info_ptr),
-png_info_init(info_ptr), png_read_destroy(), and png_write_destroy()
-have been removed. They have been deprecated since libpng-0.95.
-
-The png_permit_empty_plte() was removed. It has been deprecated
-since libpng-1.0.9. Use png_permit_mng_features() instead.
-
-We removed the obsolete stub functions png_get_mmx_flagmask(),
-png_set_mmx_thresholds(), png_get_asm_flags(),
-png_get_mmx_bitdepth_threshold(), png_get_mmx_rowbytes_threshold(),
-png_set_asm_flags(), and png_mmx_supported()
-
-We removed the obsolete png_check_sig(), png_memcpy_check(), and
-png_memset_check() functions. Instead use !png_sig_cmp(), memcpy(),
-and memset(), respectively.
-
-The function png_set_gray_1_2_4_to_8() was removed. It has been
-deprecated since libpng-1.0.18 and 1.2.9, when it was replaced with
-png_set_expand_gray_1_2_4_to_8() because the former function also
-expanded palette images.
-
-Macros for png_get_uint_16, png_get_uint_32, and png_get_int_32
-were added and are used by default instead of the corresponding
-functions. Unfortunately,
-from libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the
-function) incorrectly returned a value of type png_uint_32.
-
-We changed the prototype for png_malloc() from
- png_malloc(png_structp png_ptr, png_uint_32 size)
-to
- png_malloc(png_structp png_ptr, png_alloc_size_t size)
-
-This also applies to the prototype for the user replacement malloc_fn().
-
-The png_calloc() function was added and is used in place of
-of "png_malloc(); memset();" except in the case in png_read_png()
-where the array consists of pointers; in this case a "for" loop is used
-after the png_malloc() to set the pointers to NULL, to give robust.
-behavior in case the application runs out of memory part-way through
-the process.
-
-We changed the prototypes of png_get_compression_buffer_size() and
-png_set_compression_buffer_size() to work with png_size_t instead of
-png_uint_32.
-
-Support for numbered error messages was removed by default, since we
-never got around to actually numbering the error messages. The function
-png_set_strip_error_numbers() was removed from the library by default.
-
-The png_zalloc() and png_zfree() functions are no longer exported.
-The png_zalloc() function no longer zeroes out the memory that it
-allocates.
-
-Support for dithering was disabled by default in libpng-1.4.0, because
-been well tested and doesn't actually "dither". The code was not
-removed, however, and could be enabled by building libpng with
-PNG_READ_DITHER_SUPPORTED defined. In libpng-1.4.2, this support
-was reenabled, but the function was renamed png_set_quantize() to
-reflect more accurately what it actually does. At the same time,
-the PNG_DITHER_[RED,GREEN_BLUE]_BITS macros were also renamed to
-PNG_QUANTIZE_[RED,GREEN,BLUE]_BITS, and PNG_READ_DITHER_SUPPORTED
-was renamed to PNG_READ_QUANTIZE_SUPPORTED.
-
-We removed the trailing '.' from the warning and error messages.
-
-.SH X. Changes to Libpng from version 1.4.x to 1.5.x
-
-From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the
-function) incorrectly returned a value of type png_uint_32.
-
-A. Changes that affect users of libpng
-
-There are no substantial API changes between the non-deprecated parts of
-the 1.4.5 API and the 1.5.0 API, however the ability to directly access
-the main libpng control structures, png_struct and png_info, deprecated
-in earlier versions of libpng, has been completely removed from
-libpng 1.5.
-
-We no longer include zlib.h in png.h. Applications that need access
-to information in zlib.h will need to add the '#include "zlib.h"'
-directive. It does not matter whether it is placed prior to or after
-the '"#include png.h"' directive.
-
-We moved the png_strcpy(), png_strncpy(), png_strlen(), png_memcpy(),
-png_memcmp(), png_sprintf, and png_memcpy() macros into a private
-header file (pngpriv.h) that is not accessible to applications.
-
-In png_get_iCCP, the type of "profile" was changed from png_charpp
-to png_bytepp, and in png_set_iCCP, from png_charp to png_const_bytep.
-
-There are changes of form in png.h, including new and changed macros to
-declare
-parts of the API. Some API functions with arguments that are pointers to
-data not modified within the function have been corrected to declare
-these arguments with PNG_CONST.
-
-Much of the internal use of C macros to control the library build has also
-changed and some of this is visible in the exported header files, in
-particular the use of macros to control data and API elements visible
-during application compilation may require significant revision to
-application code. (It is extremely rare for an application to do this.)
-
-Any program that compiled against libpng 1.4 and did not use deprecated
-features or access internal library structures should compile and work
-against libpng 1.5.
-
-libpng 1.5.0 adds PNG_ PASS macros to help in the reading and writing of
-interlaced images. The macros return the number of rows and columns in
-each pass and information that can be used to de-interlace and (if
-absolutely necessary) interlace an image.
-
-libpng 1.5.0 adds an API png_longjmp(png_ptr, value). This API calls
-the application provided png_longjmp_ptr on the internal, but application
-initialized, jmpbuf. It is provided as a convenience to avoid the need
-to use the png_jmpbuf macro, which had the unnecessary side effect of
-resetting the internal png_longjmp_ptr value.
-
-libpng 1.5.0 includes a complete fixed point API. By default this is
-present along with the corresponding floating point API. In general the
-fixed point API is faster and smaller than the floating point one because
-the PNG file format used fixed point, not floating point. This applies
-even if the library uses floating point in internal calculations. A new
-macro, PNG_FLOATING_ARITHMETIC_SUPPORTED, reveals whether the library
-uses floating point arithmetic (the default) or fixed point arithmetic
-internally for performance critical calculations such as gamma correction.
-In some cases, the gamma calculations may produce slightly different
-results. This has changed the results in png_rgb_to_gray and in alpha
-composition (png_set_background for example). This applies even if the
-original image was already linear (gamma == 1.0) and, therefore, it is
-not necessary to linearize the image. This is because libpng has *not*
-been changed to optimize that case correctly, yet.
-
-Fixed point support for the sCAL chunk comes with an important caveat;
-the sCAL specification uses a decimal encoding of floating point values
-and the accuracy of PNG fixed point values is insufficient for
-representation of these values. Consequently a "string" API
-(png_get_sCAL_s and png_set_sCAL_s) is the only reliable way of reading
-arbitrary sCAL chunks in the absence of either the floating point API or
-internal floating point calculations.
-
-Applications no longer need to include the optional distribution header
-file pngusr.h or define the corresponding macros during application
-build in order to see the correct variant of the libpng API. From 1.5.0
-application code can check for the corresponding _SUPPORTED macro:
-
-#ifdef PNG_INCH_CONVERSIONS_SUPPORTED
- /* code that uses the inch conversion APIs. */
-#endif
-
-This macro will only be defined if the inch conversion functions have been
-compiled into libpng. The full set of macros, and whether or not support
-has been compiled in, are available in the header file pnglibconf.h.
-This header file is specific to the libpng build. Notice that prior to
-1.5.0 the _SUPPORTED macros would always have the default definition unless
-reset by pngusr.h or by explicit settings on the compiler command line.
-These settings may produce compiler warnings or errors in 1.5.0 because
-of macro redefinition.
-
-From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the
-function) incorrectly returned a value of type png_uint_32. libpng 1.5.0
-is consistent with the implementation in 1.4.5 and 1.2.x (where the macro
-did not exist.)
-
-Applications can now choose whether to use these macros or to call the
-corresponding function by defining PNG_USE_READ_MACROS or
-PNG_NO_USE_READ_MACROS before including png.h. Notice that this is
-only supported from 1.5.0 -defining PNG_NO_USE_READ_MACROS prior to 1.5.0
- will lead to a link failure.
-
-B. Changes to the build and configuration of libpng
-
-Details of internal changes to the library code can be found in the CHANGES
-file. These will be of no concern to the vast majority of library users or
-builders, however the few who configure libpng to a non-default feature
-set may need to change how this is done.
-
-There should be no need for library builders to alter build scripts if
-these use the distributed build support - configure or the makefiles -
-however users of the makefiles may care to update their build scripts
-to build pnglibconf.h where the corresponding makefile does not do so.
-
-Building libpng with a non-default configuration has changed completely.
-The old method using pngusr.h should still work correctly even though the
-way pngusr.h is used in the build has been changed, however library
-builders will probably want to examine the changes to take advantage of
-new capabilities and to simplify their build system.
-
-B.1 Specific changes to library configuration capabilities
-
-The library now supports a complete fixed point implementation and can
-thus be used on systems which have no floating point support or very
-limited or slow support. Previously gamma correction, an essential part
-of complete PNG support, required reasonably fast floating point.
-
-As part of this the choice of internal implementation has been made
-independent of the choice of fixed versus floating point APIs and all the
-missing fixed point APIs have been implemented.
-
-The exact mechanism used to control attributes of API functions has
-changed. A single set of operating system independent macro definitions
-is used and operating system specific directives are defined in
-pnglibconf.h
-
-As part of this the mechanism used to choose procedure call standards on
-those systems that allow a choice has been changed. At present this only
-affects certain Microsoft (DOS, Windows) and IBM (OS/2) operating systems
-running on Intel processors. As before PNGAPI is defined where required
-to control the exported API functions; however, two new macros, PNGCBAPI
-and PNGCAPI, are used instead for callback functions (PNGCBAPI) and
-(PNGCAPI) for functions that must match a C library prototype (currently
-only png_longjmp_ptr, which must match the C longjmp function.) The new
-approach is documented in pngconf.h
-
-Despite these changes libpng 1.5.0 only supports the native C function
-calling standard on those platforms tested so far (__cdecl on Microsoft
-Windows). This is because the support requirements for alternative
-calling conventions seem to no longer exist. Developers who find it
-necessary to set PNG_API_RULE to 1 should advise the mailing list
-(png-mng-implement) of this and library builders who use Openwatcom and
-therefore set PNG_API_RULE to 2 should also contact the mailing list.
-
-A new test program, pngvalid, is provided in addition to pngtest.
-pngvalid validates the arithmetic accuracy of the gamma correction
-calculations and includes a number of validations of the file format.
-A subset of the full range of tests is run when "make check" is done
-(in the 'configure' build.) pngvalid also allows total allocated memory
-usage to be evaluated and performs additional memory overwrite validation.
-
-Many changes to individual feature macros have been made. The following
-are the changes most likely to be noticed by library builders who
-configure libpng:
-
-1) All feature macros now have consistent naming:
-
-#define PNG_NO_feature turns the feature off
-#define PNG_feature_SUPPORTED turns the feature on
-
-pnglibconf.h contains one line for each feature macro which is either:
-
-#define PNG_feature_SUPPORTED
-
-if the feature is supported or:
-
-/*#undef PNG_feature_SUPPORTED*/
-
-if it is not. Library code consistently checks for the 'SUPPORTED' macro.
-It does not, and should not, check for the 'NO' macro which will not
-normally be defined even if the feature is not supported.
-
-Compatibility with the old names is provided as follows:
-
-PNG_INCH_CONVERSIONS turns on PNG_INCH_CONVERSIONS_SUPPORTED
-
-And the following definitions disable the corresponding feature:
-
-PNG_SETJMP_NOT_SUPPORTED disables SETJMP
-PNG_READ_TRANSFORMS_NOT_SUPPORTED disables READ_TRANSFORMS
-PNG_NO_READ_COMPOSITED_NODIV disables READ_COMPOSITE_NODIV
-PNG_WRITE_TRANSFORMS_NOT_SUPPORTED disables WRITE_TRANSFORMS
-PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED disables READ_ANCILLARY_CHUNKS
-PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED disables WRITE_ANCILLARY_CHUNKS
-
-Library builders should remove use of the above, inconsistent, names.
-
-2) Warning and error message formatting was previously conditional on
-the STDIO feature. The library has been changed to use the
-CONSOLE_IO feature instead. This means that if CONSOLE_IO is disabled
-the library no longer uses the printf(3) functions, even though the
-default read/write implementations use (FILE) style stdio.h functions.
-
-3) Three feature macros now control the fixed/floating point decisions:
-
-PNG_FLOATING_POINT_SUPPORTED enables the floating point APIs
-
-PNG_FIXED_POINT_SUPPORTED enables the fixed point APIs; however, in
-practice these are normally required internally anyway (because the PNG
-file format is fixed point), therefore in most cases PNG_NO_FIXED_POINT
-merely stops the function from being exported.
-
-PNG_FLOATING_ARITHMETIC_SUPPORTED chooses between the internal floating
-point implementation or the fixed point one. Typically the fixed point
-implementation is larger and slower than the floating point implementation
-on a system that supports floating point, however it may be faster on a
-system which lacks floating point hardware and therefore uses a software
-emulation.
-
-4) Added PNG_{READ,WRITE}_INT_FUNCTIONS_SUPPORTED. This allows the
-functions to read and write ints to be disabled independently of
-PNG_USE_READ_MACROS, which allows libpng to be built with the functions
-even though the default is to use the macros - this allows applications
-to choose at app buildtime whether or not to use macros (previously
-impossible because the functions weren't in the default build.)
-
-B.2 Changes to the configuration mechanism
-
-Prior to libpng-1.5.0 library builders who needed to configure libpng
-had either to modify the exported pngconf.h header file to add system
-specific configuration or had to write feature selection macros into
-pngusr.h and cause this to be included into pngconf.h by defining
-PNG_USER_CONFIG. The latter mechanism had the disadvantage that an
-application built without PNG_USER_CONFIG defined would see the
-unmodified, default, libpng API and thus would probably fail to link.
-
-These mechanisms still work in the configure build and in any makefile
-build that builds pnglibconf.h although the feature selection macros
-have changed somewhat as described above. In 1.5.0, however, pngusr.h is
-processed only once, when the exported header file pnglibconf.h is built.
-pngconf.h no longer includes pngusr.h, therefore it is ignored after the
-build of pnglibconf.h and it is never included in an application build.
-
-The rarely used alternative of adding a list of feature macros to the
-CFLAGS setting in the build also still works, however the macros will be
-copied to pnglibconf.h and this may produce macro redefinition warnings
-when the individual C files are compiled.
-
-All configuration now only works if pnglibconf.h is built from
-scripts/pnglibconf.dfa. This requires the program awk. Brian Kernighan
-(the original author of awk) maintains C source code of that awk and this
-and all known later implementations (often called by subtly different
-names - nawk and gawk for example) are adequate to build pnglibconf.h.
-The Sun Microsystems (now Oracle) program 'awk' is an earlier version
-and does not work, this may also apply to other systems that have a
-functioning awk called 'nawk'.
-
-Configuration options are now documented in scripts/pnglibconf.dfa. This
-file also includes dependency information that ensures a configuration is
-consistent; that is, if a feature is switched off dependent features are
-also removed. As a recommended alternative to using feature macros in
-pngusr.h a system builder may also define equivalent options in pngusr.dfa
-(or, indeed, any file) and add that to the configuration by setting
-DFA_XTRA to the file name. The makefiles in contrib/pngminim illustrate
-how to do this, and a case where pngusr.h is still required.
-
-.SH XI. Detecting libpng
-
-The png_get_io_ptr() function has been present since libpng-0.88, has never
-changed, and is unaffected by conditional compilation macros. It is the
-best choice for use in configure scripts for detecting the presence of any
-libpng version since 0.88. In an autoconf "configure.in" you could use
-
- AC_CHECK_LIB(png, png_get_io_ptr, ...
-
-.SH XII. Source code repository
-
-Since about February 2009, version 1.2.34, libpng has been under "git" source
-control. The git repository was built from old libpng-x.y.z.tar.gz files
-going back to version 0.70. You can access the git repository (read only)
-at
-
- git://libpng.git.sourceforge.net/gitroot/libpng
-
-or you can browse it via "gitweb" at
-
- http://libpng.git.sourceforge.net/git/gitweb.cgi?p=libpng
-
-Patches can be sent to glennrp at users.sourceforge.net or to
-png-mng-implement at lists.sourceforge.net or you can upload them to
-the libpng bug tracker at
-
- http://libpng.sourceforge.net
-
-We also accept patches built from the tar or zip distributions, and
-simple verbal discriptions of bug fixes, reported either to the
-SourceForge bug tracker or to the png-mng-implement at lists.sf.net
-mailing list.
-
-.SH XIII. Coding style
-
-Our coding style is similar to the "Allman" style, with curly
-braces on separate lines:
-
- if (condition)
- {
- action;
- }
-
- else if (another condition)
- {
- another action;
- }
-
-The braces can be omitted from simple one-line actions:
-
- if (condition)
- return (0);
-
-We use 3-space indentation, except for continued statements which
-are usually indented the same as the first line of the statement
-plus four more spaces.
-
-For macro definitions we use 2-space indentation, always leaving the "#"
-in the first column.
-
- #ifndef PNG_NO_FEATURE
- # ifndef PNG_FEATURE_SUPPORTED
- # define PNG_FEATURE_SUPPORTED
- # endif
- #endif
-
-Comments appear with the leading "/*" at the same indentation as
-the statement that follows the comment:
-
- /* Single-line comment */
- statement;
-
- /* This is a multiple-line
- * comment.
- */
- statement;
-
-Very short comments can be placed after the end of the statement
-to which they pertain:
-
- statement; /* comment */
-
-We don't use C++ style ("//") comments. We have, however,
-used them in the past in some now-abandoned MMX assembler
-code.
-
-Functions and their curly braces are not indented, and
-exported functions are marked with PNGAPI:
-
- /* This is a public function that is visible to
- * application programmers. It does thus-and-so.
- */
- void PNGAPI
- png_exported_function(png_ptr, png_info, foo)
- {
- body;
- }
-
-The prototypes for all exported functions appear in png.h,
-above the comment that says
-
- /* Maintainer: Put new public prototypes here ... */
-
-We mark all non-exported functions with "/* PRIVATE */"":
-
- void /* PRIVATE */
- png_non_exported_function(png_ptr, png_info, foo)
- {
- body;
- }
-
-The prototypes for non-exported functions (except for those in
-pngtest) appear in
-pngpriv.h
-above the comment that says
-
- /* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */
-
-To avoid polluting the global namespace, the names of all exported
-functions and variables begin with "png_", and all publicly visible C
-preprocessor macros begin with "PNG_". We request that applications that
-use libpng *not* begin any of their own symbols with either of these strings.
-
-We put a space after each comma and after each semicolon
-in "for" statements, and we put spaces before and after each
-C binary operator and after "for" or "while", and before
-"?". We don't put a space between a typecast and the expression
-being cast, nor do we put one between a function name and the
-left parenthesis that follows it:
-
- for (i = 2; i > 0; --i)
- y[i] = a(x) + (int)b;
-
-We prefer #ifdef and #ifndef to #if defined() and if !defined()
-when there is only one macro being tested.
-
-We do not use the TAB character for indentation in the C sources.
-
-Lines do not exceed 80 characters.
-
-Other rules can be inferred by inspecting the libpng source.
-
-.SH XIV. Y2K Compliance in libpng
-
-February 3, 2011
-
-Since the PNG Development group is an ad-hoc body, we can't make
-an official declaration.
-
-This is your unofficial assurance that libpng from version 0.71 and
-upward through 1.5.1 are Y2K compliant. It is my belief that earlier
-versions were also Y2K compliant.
-
-Libpng only has three year fields. One is a 2-byte unsigned integer that
-will hold years up to 65535. The other two hold the date in text
-format, and will hold years up to 9999.
-
-The integer is
- "png_uint_16 year" in png_time_struct.
-
-The strings are
- "png_charp time_buffer" in png_struct and
- "near_time_buffer", which is a local character string in png.c.
-
-There are seven time-related functions:
-
- png_convert_to_rfc_1123() in png.c
- (formerly png_convert_to_rfc_1152() in error)
- png_convert_from_struct_tm() in pngwrite.c, called
- in pngwrite.c
- png_convert_from_time_t() in pngwrite.c
- png_get_tIME() in pngget.c
- png_handle_tIME() in pngrutil.c, called in pngread.c
- png_set_tIME() in pngset.c
- png_write_tIME() in pngwutil.c, called in pngwrite.c
-
-All appear to handle dates properly in a Y2K environment. The
-png_convert_from_time_t() function calls gmtime() to convert from system
-clock time, which returns (year - 1900), which we properly convert to
-the full 4-digit year. There is a possibility that applications using
-libpng are not passing 4-digit years into the png_convert_to_rfc_1123()
-function, or that they are incorrectly passing only a 2-digit year
-instead of "year - 1900" into the png_convert_from_struct_tm() function,
-but this is not under our control. The libpng documentation has always
-stated that it works with 4-digit years, and the APIs have been
-documented as such.
-
-The tIME chunk itself is also Y2K compliant. It uses a 2-byte unsigned
-integer to hold the year, and can hold years as large as 65535.
-
-zlib, upon which libpng depends, is also Y2K compliant. It contains
-no date-related code.
-
-
- Glenn Randers-Pehrson
- libpng maintainer
- PNG Development Group
-
-.SH NOTE
-
-Note about libpng version numbers:
-
-Due to various miscommunications, unforeseen code incompatibilities
-and occasional factors outside the authors' control, version numbering
-on the library has not always been consistent and straightforward.
-The following table summarizes matters since version 0.89c, which was
-the first widely used release:
-
- source png.h png.h shared-lib
- version string int version
- ------- ------ ----- ----------
- 0.89c ("beta 3") 0.89 89 1.0.89
- 0.90 ("beta 4") 0.90 90 0.90
- 0.95 ("beta 5") 0.95 95 0.95
- 0.96 ("beta 6") 0.96 96 0.96
- 0.97b ("beta 7") 1.00.97 97 1.0.1
- 0.97c 0.97 97 2.0.97
- 0.98 0.98 98 2.0.98
- 0.99 0.99 98 2.0.99
- 0.99a-m 0.99 99 2.0.99
- 1.00 1.00 100 2.1.0
- 1.0.0 1.0.0 100 2.1.0
- 1.0.0 (from here on, the 100 2.1.0
- 1.0.1 png.h string is 10001 2.1.0
- 1.0.1a-e identical to the 10002 from here on, the
- 1.0.2 source version) 10002 shared library is 2.V
- 1.0.2a-b 10003 where V is the source
- 1.0.1 10001 code version except as
- 1.0.1a-e 10002 2.1.0.1a-e noted.
- 1.0.2 10002 2.1.0.2
- 1.0.2a-b 10003 2.1.0.2a-b
- 1.0.3 10003 2.1.0.3
- 1.0.3a-d 10004 2.1.0.3a-d
- 1.0.4 10004 2.1.0.4
- 1.0.4a-f 10005 2.1.0.4a-f
- 1.0.5 (+ 2 patches) 10005 2.1.0.5
- 1.0.5a-d 10006 2.1.0.5a-d
- 1.0.5e-r 10100 2.1.0.5e-r
- 1.0.5s-v 10006 2.1.0.5s-v
- 1.0.6 (+ 3 patches) 10006 2.1.0.6
- 1.0.6d-g 10007 2.1.0.6d-g
- 1.0.6h 10007 10.6h
- 1.0.6i 10007 10.6i
- 1.0.6j 10007 2.1.0.6j
- 1.0.7beta11-14 DLLNUM 10007 2.1.0.7beta11-14
- 1.0.7beta15-18 1 10007 2.1.0.7beta15-18
- 1.0.7rc1-2 1 10007 2.1.0.7rc1-2
- 1.0.7 1 10007 2.1.0.7
- 1.0.8beta1-4 1 10008 2.1.0.8beta1-4
- 1.0.8rc1 1 10008 2.1.0.8rc1
- 1.0.8 1 10008 2.1.0.8
- 1.0.9beta1-6 1 10009 2.1.0.9beta1-6
- 1.0.9rc1 1 10009 2.1.0.9rc1
- 1.0.9beta7-10 1 10009 2.1.0.9beta7-10
- 1.0.9rc2 1 10009 2.1.0.9rc2
- 1.0.9 1 10009 2.1.0.9
- 1.0.10beta1 1 10010 2.1.0.10beta1
- 1.0.10rc1 1 10010 2.1.0.10rc1
- 1.0.10 1 10010 2.1.0.10
- 1.0.11beta1-3 1 10011 2.1.0.11beta1-3
- 1.0.11rc1 1 10011 2.1.0.11rc1
- 1.0.11 1 10011 2.1.0.11
- 1.0.12beta1-2 2 10012 2.1.0.12beta1-2
- 1.0.12rc1 2 10012 2.1.0.12rc1
- 1.0.12 2 10012 2.1.0.12
- 1.1.0a-f - 10100 2.1.1.0a-f abandoned
- 1.2.0beta1-2 2 10200 2.1.2.0beta1-2
- 1.2.0beta3-5 3 10200 3.1.2.0beta3-5
- 1.2.0rc1 3 10200 3.1.2.0rc1
- 1.2.0 3 10200 3.1.2.0
- 1.2.1beta-4 3 10201 3.1.2.1beta1-4
- 1.2.1rc1-2 3 10201 3.1.2.1rc1-2
- 1.2.1 3 10201 3.1.2.1
- 1.2.2beta1-6 12 10202 12.so.0.1.2.2beta1-6
- 1.0.13beta1 10 10013 10.so.0.1.0.13beta1
- 1.0.13rc1 10 10013 10.so.0.1.0.13rc1
- 1.2.2rc1 12 10202 12.so.0.1.2.2rc1
- 1.0.13 10 10013 10.so.0.1.0.13
- 1.2.2 12 10202 12.so.0.1.2.2
- 1.2.3rc1-6 12 10203 12.so.0.1.2.3rc1-6
- 1.2.3 12 10203 12.so.0.1.2.3
- 1.2.4beta1-3 13 10204 12.so.0.1.2.4beta1-3
- 1.2.4rc1 13 10204 12.so.0.1.2.4rc1
- 1.0.14 10 10014 10.so.0.1.0.14
- 1.2.4 13 10204 12.so.0.1.2.4
- 1.2.5beta1-2 13 10205 12.so.0.1.2.5beta1-2
- 1.0.15rc1 10 10015 10.so.0.1.0.15rc1
- 1.0.15 10 10015 10.so.0.1.0.15
- 1.2.5 13 10205 12.so.0.1.2.5
- 1.2.6beta1-4 13 10206 12.so.0.1.2.6beta1-4
- 1.2.6rc1-5 13 10206 12.so.0.1.2.6rc1-5
- 1.0.16 10 10016 10.so.0.1.0.16
- 1.2.6 13 10206 12.so.0.1.2.6
- 1.2.7beta1-2 13 10207 12.so.0.1.2.7beta1-2
- 1.0.17rc1 10 10017 12.so.0.1.0.17rc1
- 1.2.7rc1 13 10207 12.so.0.1.2.7rc1
- 1.0.17 10 10017 12.so.0.1.0.17
- 1.2.7 13 10207 12.so.0.1.2.7
- 1.2.8beta1-5 13 10208 12.so.0.1.2.8beta1-5
- 1.0.18rc1-5 10 10018 12.so.0.1.0.18rc1-5
- 1.2.8rc1-5 13 10208 12.so.0.1.2.8rc1-5
- 1.0.18 10 10018 12.so.0.1.0.18
- 1.2.8 13 10208 12.so.0.1.2.8
- 1.2.9beta1-3 13 10209 12.so.0.1.2.9beta1-3
- 1.2.9beta4-11 13 10209 12.so.0.9[.0]
- 1.2.9rc1 13 10209 12.so.0.9[.0]
- 1.2.9 13 10209 12.so.0.9[.0]
- 1.2.10beta1-7 13 10210 12.so.0.10[.0]
- 1.2.10rc1-2 13 10210 12.so.0.10[.0]
- 1.2.10 13 10210 12.so.0.10[.0]
- 1.4.0beta1-6 14 10400 14.so.0.0[.0]
- 1.2.11beta1-4 13 10210 12.so.0.11[.0]
- 1.4.0beta7-8 14 10400 14.so.0.0[.0]
- 1.2.11 13 10211 12.so.0.11[.0]
- 1.2.12 13 10212 12.so.0.12[.0]
- 1.4.0beta9-14 14 10400 14.so.0.0[.0]
- 1.2.13 13 10213 12.so.0.13[.0]
- 1.4.0beta15-36 14 10400 14.so.0.0[.0]
- 1.4.0beta37-87 14 10400 14.so.14.0[.0]
- 1.4.0rc01 14 10400 14.so.14.0[.0]
- 1.4.0beta88-109 14 10400 14.so.14.0[.0]
- 1.4.0rc02-08 14 10400 14.so.14.0[.0]
- 1.4.0 14 10400 14.so.14.0[.0]
- 1.4.1beta01-03 14 10401 14.so.14.1[.0]
- 1.4.1rc01 14 10401 14.so.14.1[.0]
- 1.4.1beta04-12 14 10401 14.so.14.1[.0]
- 1.4.1 14 10401 14.so.14.1[.0]
- 1.4.2 14 10402 14.so.14.2[.0]
- 1.4.3 14 10403 14.so.14.3[.0]
- 1.4.4 14 10404 14.so.14.4[.0]
- 1.5.0beta01-58 15 10500 15.so.15.0[.0]
- 1.5.0rc01-07 15 10500 15.so.15.0[.0]
- 1.5.0 15 10500 15.so.15.0[.0]
- 1.5.1beta01-11 15 10501 15.so.15.1[.0]
- 1.5.1rc01-02 15 10501 15.so.15.1[.0]
- 1.5.1 15 10501 15.so.15.1[.0]
-
-Henceforth the source version will match the shared-library minor
-and patch numbers; the shared-library major version number will be
-used for changes in backward compatibility, as it is intended. The
-PNG_PNGLIB_VER macro, which is not used within libpng but is available
-for applications, is an unsigned integer of the form xyyzz corresponding
-to the source version x.y.z (leading zeros in y and z). Beta versions
-were given the previous public release number plus a letter, until
-version 1.0.6j; from then on they were given the upcoming public
-release number plus "betaNN" or "rcN".
-
-.SH "SEE ALSO"
-.BR "png"(5), " libpngpf"(3), " zlib"(3), " deflate"(5), " " and " zlib"(5)
-
-.LP
-.IR libpng :
-.IP
-http://libpng.sourceforge.net (follow the [DOWNLOAD] link)
-http://www.libpng.org/pub/png
-
-.LP
-.IR zlib :
-.IP
-(generally) at the same location as
-.I libpng
-or at
-.br
-ftp://ftp.info-zip.org/pub/infozip/zlib
-
-.LP
-.IR PNG specification: RFC 2083
-.IP
-(generally) at the same location as
-.I libpng
-or at
-.br
-ftp://ds.internic.net/rfc/rfc2083.txt
-.br
-or (as a W3C Recommendation) at
-.br
-http://www.w3.org/TR/REC-png.html
-
-.LP
-In the case of any inconsistency between the PNG specification
-and this library, the specification takes precedence.
-
-.SH AUTHORS
-This man page: Glenn Randers-Pehrson
-<glennrp at users.sourceforge.net>
-
-The contributing authors would like to thank all those who helped
-with testing, bug fixes, and patience. This wouldn't have been
-possible without all of you.
-
-Thanks to Frank J. T. Wojcik for helping with the documentation.
-
-Libpng version 1.5.1 - February 3, 2011:
-Initially created in 1995 by Guy Eric Schalnat, then of Group 42, Inc.
-Currently maintained by Glenn Randers-Pehrson (glennrp at users.sourceforge.net).
-
-Supported by the PNG development group
-.br
-png-mng-implement at lists.sf.net
-(subscription required; visit
-png-mng-implement at lists.sourceforge.net (subscription required; visit
-https://lists.sourceforge.net/lists/listinfo/png-mng-implement
-to subscribe).
-
-.SH COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
-
-(This copy of the libpng notices is provided for your convenience. In case of
-any discrepancy between this copy and the notices in the file png.h that is
-included in the libpng distribution, the latter shall prevail.)
-
-If you modify libpng you may insert additional notices immediately following
-this sentence.
-
-This code is released under the libpng license.
-
-libpng versions 1.2.6, August 15, 2004, through 1.5.1, February 3, 2011, are
-Copyright (c) 2004,2006-2007 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-1.2.5
-with the following individual added to the list of Contributing Authors
-
- Cosmin Truta
-
-libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
-Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-1.0.6
-with the following individuals added to the list of Contributing Authors
-
- Simon-Pierre Cadieux
- Eric S. Raymond
- Gilles Vollant
-
-and with the following additions to the disclaimer:
-
- There is no warranty against interference with your
- enjoyment of the library or against infringement.
- There is no warranty that our efforts or the library
- will fulfill any of your particular purposes or needs.
- This library is provided with all faults, and the entire
- risk of satisfactory quality, performance, accuracy, and
- effort is with the user.
-
-libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
-Copyright (c) 1998, 1999 Glenn Randers-Pehrson
-Distributed according to the same disclaimer and license as libpng-0.96,
-with the following individuals added to the list of Contributing Authors:
-
- Tom Lane
- Glenn Randers-Pehrson
- Willem van Schaik
-
-libpng versions 0.89, June 1996, through 0.96, May 1997, are
-Copyright (c) 1996, 1997 Andreas Dilger
-Distributed according to the same disclaimer and license as libpng-0.88,
-with the following individuals added to the list of Contributing Authors:
-
- John Bowler
- Kevin Bracey
- Sam Bushell
- Magnus Holmgren
- Greg Roelofs
- Tom Tanner
-
-libpng versions 0.5, May 1995, through 0.88, January 1996, are
-Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
-
-For the purposes of this copyright and license, "Contributing Authors"
-is defined as the following set of individuals:
-
- Andreas Dilger
- Dave Martindale
- Guy Eric Schalnat
- Paul Schmidt
- Tim Wegner
-
-The PNG Reference Library is supplied "AS IS". The Contributing Authors
-and Group 42, Inc. disclaim all warranties, expressed or implied,
-including, without limitation, the warranties of merchantability and of
-fitness for any purpose. The Contributing Authors and Group 42, Inc.
-assume no liability for direct, indirect, incidental, special, exemplary,
-or consequential damages, which may result from the use of the PNG
-Reference Library, even if advised of the possibility of such damage.
-
-Permission is hereby granted to use, copy, modify, and distribute this
-source code, or portions hereof, for any purpose, without fee, subject
-to the following restrictions:
-
-1. The origin of this source code must not be misrepresented.
-
-2. Altered versions must be plainly marked as such and
- must not be misrepresented as being the original source.
-
-3. This Copyright notice may not be removed or altered from
- any source or altered source distribution.
-
-The Contributing Authors and Group 42, Inc. specifically permit, without
-fee, and encourage the use of this source code as a component to
-supporting the PNG file format in commercial products. If you use this
-source code in a product, acknowledgment is not required but would be
-appreciated.
-
-
-A "png_get_copyright" function is available, for convenient use in "about"
-boxes and the like:
-
- printf("%s",png_get_copyright(NULL));
-
-Also, the PNG logo (in PNG format, of course) is supplied in the
-files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
-
-Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a
-certification mark of the Open Source Initiative.
-
-Glenn Randers-Pehrson
-glennrp at users.sourceforge.net
-February 3, 2011
-
-.\" end of man page
-
diff --git a/src/3rdparty/libpng/libpng.pc.in b/src/3rdparty/libpng/libpng.pc.in
deleted file mode 100644
index 3e7e2c58a7..0000000000
--- a/src/3rdparty/libpng/libpng.pc.in
+++ /dev/null
@@ -1,11 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@/libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@
-
-Name: libpng
-Description: Loads and saves PNG files
-Version: @PNGLIB_VERSION@
-Libs: -L${libdir} -lpng@PNGLIB_MAJOR@@PNGLIB_MINOR@
-Libs.private: @LIBS@
-Cflags: -I${includedir}
diff --git a/src/3rdparty/libpng/libpngpf.3 b/src/3rdparty/libpng/libpngpf.3
deleted file mode 100644
index ff6e1641ea..0000000000
--- a/src/3rdparty/libpng/libpngpf.3
+++ /dev/null
@@ -1,30 +0,0 @@
-.TH LIBPNGPF 3 "February 3, 2011"
-.SH NAME
-libpng \- Portable Network Graphics (PNG) Reference Library 1.5.1
-(private functions)
-.SH SYNOPSIS
-\fB#include \fI"pngpriv.h"
-
-\fI\fB
-
-\fBAs of libpng version \fP\fI1.5.1\fP\fB, this section is no longer \fP\fImaintained\fP\fB, now \fIthat
-
-\fBthe private function prototypes are hidden in pngpriv.h and not \fIaccessible
-
-\fBto applications. Look in pngpriv.h for the prototypes and a short \fIdescription
-
-\fBof each \fIfunction.
-
-\fI\fB
-
-.SH DESCRIPTION
-The functions previously listed here are used privately by libpng
-and are not recommended for use by applications. They are
-not "exported" to applications using shared libraries. They
-are listed alphabetically here as an aid to libpng maintainers.
-See pngpriv.h for more information on these functions.
-
-.SH SEE ALSO
-.BR "png"(5), " libpng"(3), " zlib"(3), " deflate"(5), " " and " zlib"(5)
-.SH AUTHOR
-Glenn Randers-Pehrson
diff --git a/src/3rdparty/libpng/png.5 b/src/3rdparty/libpng/png.5
deleted file mode 100644
index 9c5f8d3366..0000000000
--- a/src/3rdparty/libpng/png.5
+++ /dev/null
@@ -1,74 +0,0 @@
-.TH PNG 5 "February 3, 2011"
-.SH NAME
-png \- Portable Network Graphics (PNG) format
-.SH DESCRIPTION
-PNG (Portable Network Graphics) is an extensible file format for the
-lossless, portable, well-compressed storage of raster images. PNG provides
-a patent-free replacement for GIF and can also replace many
-common uses of TIFF. Indexed-color, grayscale, and truecolor images are
-supported, plus an optional alpha channel. Sample depths range from
-1 to 16 bits.
-.br
-
-PNG is designed to work well in online viewing applications, such as the
-World Wide Web, so it is fully streamable with a progressive display
-option. PNG is robust, providing both full file integrity checking and
-fast, simple detection of common transmission errors. Also, PNG can store
-gamma and chromaticity data for improved color matching on heterogeneous
-platforms.
-
-.SH "SEE ALSO"
-.BR "libpng"(3), " libpngpf"(3), " zlib"(3), " deflate"(5), " " and " zlib"(5)
-.LP
-PNG specification (second edition), November 2003:
-.IP
-.br
- <http://www.w3.org/TR/2003/REC-PNG-20031110/
-PNG 1.2 specification, July 1999:
-.IP
-.br
-http://www.libpng.org/pub/png
-.LP
-PNG 1.0 specification, October 1996:
-.IP
-.br
-RFC 2083
-.IP
-.br
-ftp://ds.internic.net/rfc/rfc2083.txt
-.br
-or (as a W3C Recommendation) at
-.br
-http://www.w3.org/TR/REC-png.html
-.SH AUTHORS
-This man page: Glenn Randers-Pehrson
-.LP
-Portable Network Graphics (PNG) Specification (Second Edition)
-Information technology - Computer graphics and image processing -
-Portable Network Graphics (PNG): Functional specification.
-ISO/IEC 15948:2003 (E) (November 10, 2003): David Duce and others.
-.LP
-Portable Network Graphics (PNG) Specification Version 1.2 (July 8, 1999):
-Glenn Randers-Pehrson and others (png-list).
-.LP
-Portable Network Graphics (PNG) Specification Version 1.0 (October 1, 1996):
-Thomas Boutell and others (png-list).
-.LP
-
-
-.SH COPYRIGHT NOTICE
-.LP
-This man page is Copyright (c) 1998-2006 Glenn Randers-Pehrson. See png.h
-for conditions of use and distribution.
-.LP
-The PNG Specification (Second Edition) is
-Copyright (c) 2003 W3C. (MIT, ERCIM, Keio), All Rights Reserved.
-.LP
-The PNG-1.2 specification is copyright (c) 1999 Glenn Randers-Pehrson.
-See the specification for conditions of use and distribution.
-.LP
-The PNG-1.0 specification is copyright (c) 1996 Massachusetts Institute of
-Technology. See the specification for conditions of use and distribution.
-.LP
-.\" end of man page
-
diff --git a/src/3rdparty/libpng/png.c b/src/3rdparty/libpng/png.c
index 764f47c20c..cba18ba915 100644
--- a/src/3rdparty/libpng/png.c
+++ b/src/3rdparty/libpng/png.c
@@ -1,8 +1,8 @@
/* png.c - location for general purpose libpng functions
*
- * Last changed in libpng 1.5.1 [February 3, 2011]
- * Copyright (c) 1998-2011 Glenn Randers-Pehrson
+ * Last changed in libpng 1.5.10 [March 8, 2012]
+ * Copyright (c) 1998-2012 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -14,7 +14,7 @@
#include "pngpriv.h"
/* Generate a compiler error if there is an old png.h in the search path. */
-typedef png_libpng_version_1_5_1 Your_png_h_is_not_version_1_5_1;
+typedef png_libpng_version_1_5_10 Your_png_h_is_not_version_1_5_10;
/* Tells libpng that we have already handled the first "num_bytes" bytes
* of the PNG file signature. If the PNG data is embedded into another
@@ -43,7 +43,7 @@ png_set_sig_bytes(png_structp png_ptr, int num_bytes)
* can simply check the remaining bytes for extra assurance. Returns
* an integer less than, equal to, or greater than zero if sig is found,
* respectively, to be less than, to match, or be greater than the correct
- * PNG signature (this is the same behaviour as strcmp, memcmp, etc).
+ * PNG signature (this is the same behavior as strcmp, memcmp, etc).
*/
int PNGAPI
png_sig_cmp(png_const_bytep sig, png_size_t start, png_size_t num_to_check)
@@ -107,7 +107,8 @@ png_zfree(voidpf png_ptr, voidpf ptr)
void /* PRIVATE */
png_reset_crc(png_structp png_ptr)
{
- png_ptr->crc = crc32(0, Z_NULL, 0);
+ /* The cast is safe because the crc is a 32 bit value. */
+ png_ptr->crc = (png_uint_32)crc32(0, Z_NULL, 0);
}
/* Calculate the CRC over a section of data. We can only pass as
@@ -120,21 +121,103 @@ png_calculate_crc(png_structp png_ptr, png_const_bytep ptr, png_size_t length)
{
int need_crc = 1;
- if (png_ptr->chunk_name[0] & 0x20) /* ancillary */
+ if (PNG_CHUNK_ANCILLIARY(png_ptr->chunk_name))
{
if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) ==
(PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN))
need_crc = 0;
}
- else /* critical */
+ else /* critical */
{
if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE)
need_crc = 0;
}
- if (need_crc)
- png_ptr->crc = crc32(png_ptr->crc, ptr, (uInt)length);
+ /* 'uLong' is defined as unsigned long, this means that on some systems it is
+ * a 64 bit value. crc32, however, returns 32 bits so the following cast is
+ * safe. 'uInt' may be no more than 16 bits, so it is necessary to perform a
+ * loop here.
+ */
+ if (need_crc && length > 0)
+ {
+ uLong crc = png_ptr->crc; /* Should never issue a warning */
+
+ do
+ {
+ uInt safeLength = (uInt)length;
+ if (safeLength == 0)
+ safeLength = (uInt)-1; /* evil, but safe */
+
+ crc = crc32(crc, ptr, safeLength);
+
+ /* The following should never issue compiler warnings, if they do the
+ * target system has characteristics that will probably violate other
+ * assumptions within the libpng code.
+ */
+ ptr += safeLength;
+ length -= safeLength;
+ }
+ while (length > 0);
+
+ /* And the following is always safe because the crc is only 32 bits. */
+ png_ptr->crc = (png_uint_32)crc;
+ }
+}
+
+/* Check a user supplied version number, called from both read and write
+ * functions that create a png_struct
+ */
+int
+png_user_version_check(png_structp png_ptr, png_const_charp user_png_ver)
+{
+ if (user_png_ver)
+ {
+ int i = 0;
+
+ do
+ {
+ if (user_png_ver[i] != png_libpng_ver[i])
+ png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
+ } while (png_libpng_ver[i++]);
+ }
+
+ else
+ png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
+
+ if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH)
+ {
+ /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so
+ * we must recompile any applications that use any older library version.
+ * For versions after libpng 1.0, we will be compatible, so we need
+ * only check the first digit.
+ */
+ if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] ||
+ (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) ||
+ (user_png_ver[0] == '0' && user_png_ver[2] < '9'))
+ {
+#ifdef PNG_WARNINGS_SUPPORTED
+ size_t pos = 0;
+ char m[128];
+
+ pos = png_safecat(m, sizeof m, pos, "Application built with libpng-");
+ pos = png_safecat(m, sizeof m, pos, user_png_ver);
+ pos = png_safecat(m, sizeof m, pos, " but running with ");
+ pos = png_safecat(m, sizeof m, pos, png_libpng_ver);
+
+ png_warning(png_ptr, m);
+#endif
+
+#ifdef PNG_ERROR_NUMBERS_SUPPORTED
+ png_ptr->flags = 0;
+#endif
+
+ return 0;
+ }
+ }
+
+ /* Success return. */
+ return 1;
}
/* Allocate the memory for an info_struct for the application. We don't
@@ -291,12 +374,10 @@ png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask,
/* Free any sCAL entry */
if ((mask & PNG_FREE_SCAL) & info_ptr->free_me)
{
-#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED)
png_free(png_ptr, info_ptr->scal_s_width);
png_free(png_ptr, info_ptr->scal_s_height);
info_ptr->scal_s_width = NULL;
info_ptr->scal_s_height = NULL;
-#endif
info_ptr->valid &= ~PNG_INFO_sCAL;
}
#endif
@@ -489,8 +570,8 @@ png_get_io_ptr(png_structp png_ptr)
/* Initialize the default input/output functions for the PNG file. If you
* use your own read or write routines, you can call either png_set_read_fn()
* or png_set_write_fn() instead of png_init_io(). If you have defined
- * PNG_NO_STDIO, you must use a function of your own because "FILE *" isn't
- * necessarily available.
+ * PNG_NO_STDIO or otherwise disabled PNG_STDIO_SUPPORTED, you must use a
+ * function of your own because "FILE *" isn't necessarily available.
*/
void PNGAPI
png_init_io(png_structp png_ptr, png_FILE_p fp)
@@ -518,28 +599,47 @@ png_convert_to_rfc1123(png_structp png_ptr, png_const_timep ptime)
if (png_ptr == NULL)
return (NULL);
- if (png_ptr->time_buffer == NULL)
+ if (ptime->year > 9999 /* RFC1123 limitation */ ||
+ ptime->month == 0 || ptime->month > 12 ||
+ ptime->day == 0 || ptime->day > 31 ||
+ ptime->hour > 23 || ptime->minute > 59 ||
+ ptime->second > 60)
{
- png_ptr->time_buffer = (png_charp)png_malloc(png_ptr, (png_uint_32)(29*
- png_sizeof(char)));
+ png_warning(png_ptr, "Ignoring invalid time value");
+ return (NULL);
}
-# ifdef USE_FAR_KEYWORD
{
- char near_time_buf[29];
- png_snprintf6(near_time_buf, 29, "%d %s %d %02d:%02d:%02d +0000",
- ptime->day % 32, short_months[(ptime->month - 1) % 12],
- ptime->year, ptime->hour % 24, ptime->minute % 60,
- ptime->second % 61);
- png_memcpy(png_ptr->time_buffer, near_time_buf,
- 29*png_sizeof(char));
+ size_t pos = 0;
+ char number_buf[5]; /* enough for a four-digit year */
+
+# define APPEND_STRING(string)\
+ pos = png_safecat(png_ptr->time_buffer, sizeof png_ptr->time_buffer,\
+ pos, (string))
+# define APPEND_NUMBER(format, value)\
+ APPEND_STRING(PNG_FORMAT_NUMBER(number_buf, format, (value)))
+# define APPEND(ch)\
+ if (pos < (sizeof png_ptr->time_buffer)-1)\
+ png_ptr->time_buffer[pos++] = (ch)
+
+ APPEND_NUMBER(PNG_NUMBER_FORMAT_u, (unsigned)ptime->day);
+ APPEND(' ');
+ APPEND_STRING(short_months[(ptime->month - 1)]);
+ APPEND(' ');
+ APPEND_NUMBER(PNG_NUMBER_FORMAT_u, ptime->year);
+ APPEND(' ');
+ APPEND_NUMBER(PNG_NUMBER_FORMAT_02u, (unsigned)ptime->hour);
+ APPEND(':');
+ APPEND_NUMBER(PNG_NUMBER_FORMAT_02u, (unsigned)ptime->minute);
+ APPEND(':');
+ APPEND_NUMBER(PNG_NUMBER_FORMAT_02u, (unsigned)ptime->second);
+ APPEND_STRING(" +0000"); /* This reliably terminates the buffer */
+
+# undef APPEND
+# undef APPEND_NUMBER
+# undef APPEND_STRING
}
-# else
- png_snprintf6(png_ptr->time_buffer, 29, "%d %s %d %02d:%02d:%02d +0000",
- ptime->day % 32, short_months[(ptime->month - 1) % 12],
- ptime->year, ptime->hour % 24, ptime->minute % 60,
- ptime->second % 61);
-# endif
+
return png_ptr->time_buffer;
}
# endif /* PNG_TIME_RFC1123_SUPPORTED */
@@ -555,13 +655,13 @@ png_get_copyright(png_const_structp png_ptr)
#else
# ifdef __STDC__
return PNG_STRING_NEWLINE \
- "libpng version 1.5.1 - February 3, 2011" PNG_STRING_NEWLINE \
+ "libpng version 1.5.10 - March 29, 2012" PNG_STRING_NEWLINE \
"Copyright (c) 1998-2011 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \
"Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \
"Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \
PNG_STRING_NEWLINE;
# else
- return "libpng version 1.5.1 - February 3, 2011\
+ return "libpng version 1.5.10 - March 29, 2012\
Copyright (c) 1998-2011 Glenn Randers-Pehrson\
Copyright (c) 1996-1997 Andreas Dilger\
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.";
@@ -608,25 +708,43 @@ png_get_header_version(png_const_structp png_ptr)
#endif
}
-#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
-# ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
+#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
int PNGAPI
png_handle_as_unknown(png_structp png_ptr, png_const_bytep chunk_name)
{
/* Check chunk_name and return "keep" value if it's on the list, else 0 */
- int i;
- png_bytep p;
- if (png_ptr == NULL || chunk_name == NULL || png_ptr->num_chunk_list<=0)
- return 0;
+ png_const_bytep p, p_end;
+
+ if (png_ptr == NULL || chunk_name == NULL || png_ptr->num_chunk_list <= 0)
+ return PNG_HANDLE_CHUNK_AS_DEFAULT;
- p = png_ptr->chunk_list + png_ptr->num_chunk_list*5 - 5;
- for (i = png_ptr->num_chunk_list; i; i--, p -= 5)
+ p_end = png_ptr->chunk_list;
+ p = p_end + png_ptr->num_chunk_list*5; /* beyond end */
+
+ /* The code is the fifth byte after each four byte string. Historically this
+ * code was always searched from the end of the list, so it should continue
+ * to do so in case there are duplicated entries.
+ */
+ do /* num_chunk_list > 0, so at least one */
+ {
+ p -= 5;
if (!png_memcmp(chunk_name, p, 4))
- return ((int)*(p + 4));
- return 0;
+ return p[4];
+ }
+ while (p > p_end);
+
+ return PNG_HANDLE_CHUNK_AS_DEFAULT;
}
-# endif
-#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */
+
+int /* PRIVATE */
+png_chunk_unknown_handling(png_structp png_ptr, png_uint_32 chunk_name)
+{
+ png_byte chunk_string[5];
+
+ PNG_CSTRING_FROM_CHUNK(chunk_string, chunk_name);
+ return png_handle_as_unknown(png_ptr, chunk_string);
+}
+#endif
#ifdef PNG_READ_SUPPORTED
/* This function, added to libpng-1.0.6g, is untested. */
@@ -651,18 +769,9 @@ png_access_version_number(void)
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
-# ifdef PNG_SIZE_T
-/* Added at libpng version 1.2.6 */
- PNG_EXTERN png_size_t PNGAPI png_convert_size PNGARG((size_t size));
-png_size_t PNGAPI
-png_convert_size(size_t size)
-{
- if (size > (png_size_t)-1)
- PNG_ABORT(); /* We haven't got access to png_ptr, so no png_error() */
-
- return ((png_size_t)size);
-}
-# endif /* PNG_SIZE_T */
+/* png_convert_size: a PNGAPI but no longer in png.h, so deleted
+ * at libpng 1.5.5!
+ */
/* Added at libpng version 1.2.34 and 1.4.0 (moved from pngset.c) */
# ifdef PNG_CHECK_cHRM_SUPPORTED
@@ -681,6 +790,13 @@ png_check_cHRM_fixed(png_structp png_ptr,
if (png_ptr == NULL)
return 0;
+ /* (x,y,z) values are first limited to 0..100000 (PNG_FP_1), the white
+ * y must also be greater than 0. To test for the upper limit calculate
+ * (PNG_FP_1-y) - x must be <= to this for z to be >= 0 (and the expression
+ * cannot overflow.) At this point we know x and y are >= 0 and (x+y) is
+ * <= PNG_FP_1. The previous test on PNG_MAX_UINT_31 is removed because it
+ * pointless (and it produces compiler warnings!)
+ */
if (white_x < 0 || white_y <= 0 ||
red_x < 0 || red_y < 0 ||
green_x < 0 || green_y < 0 ||
@@ -690,38 +806,26 @@ png_check_cHRM_fixed(png_structp png_ptr,
"Ignoring attempt to set negative chromaticity value");
ret = 0;
}
- if (white_x > (png_fixed_point)PNG_UINT_31_MAX ||
- white_y > (png_fixed_point)PNG_UINT_31_MAX ||
- red_x > (png_fixed_point)PNG_UINT_31_MAX ||
- red_y > (png_fixed_point)PNG_UINT_31_MAX ||
- green_x > (png_fixed_point)PNG_UINT_31_MAX ||
- green_y > (png_fixed_point)PNG_UINT_31_MAX ||
- blue_x > (png_fixed_point)PNG_UINT_31_MAX ||
- blue_y > (png_fixed_point)PNG_UINT_31_MAX )
- {
- png_warning(png_ptr,
- "Ignoring attempt to set chromaticity value exceeding 21474.83");
- ret = 0;
- }
- if (white_x > 100000L - white_y)
+ /* And (x+y) must be <= PNG_FP_1 (so z is >= 0) */
+ if (white_x > PNG_FP_1 - white_y)
{
png_warning(png_ptr, "Invalid cHRM white point");
ret = 0;
}
- if (red_x > 100000L - red_y)
+ if (red_x > PNG_FP_1 - red_y)
{
png_warning(png_ptr, "Invalid cHRM red point");
ret = 0;
}
- if (green_x > 100000L - green_y)
+ if (green_x > PNG_FP_1 - green_y)
{
png_warning(png_ptr, "Invalid cHRM green point");
ret = 0;
}
- if (blue_x > 100000L - blue_y)
+ if (blue_x > PNG_FP_1 - blue_y)
{
png_warning(png_ptr, "Invalid cHRM blue point");
ret = 0;
@@ -741,6 +845,326 @@ png_check_cHRM_fixed(png_structp png_ptr,
}
# endif /* PNG_CHECK_cHRM_SUPPORTED */
+#ifdef PNG_cHRM_SUPPORTED
+/* Added at libpng-1.5.5 to support read and write of true CIEXYZ values for
+ * cHRM, as opposed to using chromaticities. These internal APIs return
+ * non-zero on a parameter error. The X, Y and Z values are required to be
+ * positive and less than 1.0.
+ */
+int png_xy_from_XYZ(png_xy *xy, png_XYZ XYZ)
+{
+ png_int_32 d, dwhite, whiteX, whiteY;
+
+ d = XYZ.redX + XYZ.redY + XYZ.redZ;
+ if (!png_muldiv(&xy->redx, XYZ.redX, PNG_FP_1, d)) return 1;
+ if (!png_muldiv(&xy->redy, XYZ.redY, PNG_FP_1, d)) return 1;
+ dwhite = d;
+ whiteX = XYZ.redX;
+ whiteY = XYZ.redY;
+
+ d = XYZ.greenX + XYZ.greenY + XYZ.greenZ;
+ if (!png_muldiv(&xy->greenx, XYZ.greenX, PNG_FP_1, d)) return 1;
+ if (!png_muldiv(&xy->greeny, XYZ.greenY, PNG_FP_1, d)) return 1;
+ dwhite += d;
+ whiteX += XYZ.greenX;
+ whiteY += XYZ.greenY;
+
+ d = XYZ.blueX + XYZ.blueY + XYZ.blueZ;
+ if (!png_muldiv(&xy->bluex, XYZ.blueX, PNG_FP_1, d)) return 1;
+ if (!png_muldiv(&xy->bluey, XYZ.blueY, PNG_FP_1, d)) return 1;
+ dwhite += d;
+ whiteX += XYZ.blueX;
+ whiteY += XYZ.blueY;
+
+ /* The reference white is simply the same of the end-point (X,Y,Z) vectors,
+ * thus:
+ */
+ if (!png_muldiv(&xy->whitex, whiteX, PNG_FP_1, dwhite)) return 1;
+ if (!png_muldiv(&xy->whitey, whiteY, PNG_FP_1, dwhite)) return 1;
+
+ return 0;
+}
+
+int png_XYZ_from_xy(png_XYZ *XYZ, png_xy xy)
+{
+ png_fixed_point red_inverse, green_inverse, blue_scale;
+ png_fixed_point left, right, denominator;
+
+ /* Check xy and, implicitly, z. Note that wide gamut color spaces typically
+ * have end points with 0 tristimulus values (these are impossible end
+ * points, but they are used to cover the possible colors.)
+ */
+ if (xy.redx < 0 || xy.redx > PNG_FP_1) return 1;
+ if (xy.redy < 0 || xy.redy > PNG_FP_1-xy.redx) return 1;
+ if (xy.greenx < 0 || xy.greenx > PNG_FP_1) return 1;
+ if (xy.greeny < 0 || xy.greeny > PNG_FP_1-xy.greenx) return 1;
+ if (xy.bluex < 0 || xy.bluex > PNG_FP_1) return 1;
+ if (xy.bluey < 0 || xy.bluey > PNG_FP_1-xy.bluex) return 1;
+ if (xy.whitex < 0 || xy.whitex > PNG_FP_1) return 1;
+ if (xy.whitey < 0 || xy.whitey > PNG_FP_1-xy.whitex) return 1;
+
+ /* The reverse calculation is more difficult because the original tristimulus
+ * value had 9 independent values (red,green,blue)x(X,Y,Z) however only 8
+ * derived values were recorded in the cHRM chunk;
+ * (red,green,blue,white)x(x,y). This loses one degree of freedom and
+ * therefore an arbitrary ninth value has to be introduced to undo the
+ * original transformations.
+ *
+ * Think of the original end-points as points in (X,Y,Z) space. The
+ * chromaticity values (c) have the property:
+ *
+ * C
+ * c = ---------
+ * X + Y + Z
+ *
+ * For each c (x,y,z) from the corresponding original C (X,Y,Z). Thus the
+ * three chromaticity values (x,y,z) for each end-point obey the
+ * relationship:
+ *
+ * x + y + z = 1
+ *
+ * This describes the plane in (X,Y,Z) space that intersects each axis at the
+ * value 1.0; call this the chromaticity plane. Thus the chromaticity
+ * calculation has scaled each end-point so that it is on the x+y+z=1 plane
+ * and chromaticity is the intersection of the vector from the origin to the
+ * (X,Y,Z) value with the chromaticity plane.
+ *
+ * To fully invert the chromaticity calculation we would need the three
+ * end-point scale factors, (red-scale, green-scale, blue-scale), but these
+ * were not recorded. Instead we calculated the reference white (X,Y,Z) and
+ * recorded the chromaticity of this. The reference white (X,Y,Z) would have
+ * given all three of the scale factors since:
+ *
+ * color-C = color-c * color-scale
+ * white-C = red-C + green-C + blue-C
+ * = red-c*red-scale + green-c*green-scale + blue-c*blue-scale
+ *
+ * But cHRM records only white-x and white-y, so we have lost the white scale
+ * factor:
+ *
+ * white-C = white-c*white-scale
+ *
+ * To handle this the inverse transformation makes an arbitrary assumption
+ * about white-scale:
+ *
+ * Assume: white-Y = 1.0
+ * Hence: white-scale = 1/white-y
+ * Or: red-Y + green-Y + blue-Y = 1.0
+ *
+ * Notice the last statement of the assumption gives an equation in three of
+ * the nine values we want to calculate. 8 more equations come from the
+ * above routine as summarised at the top above (the chromaticity
+ * calculation):
+ *
+ * Given: color-x = color-X / (color-X + color-Y + color-Z)
+ * Hence: (color-x - 1)*color-X + color.x*color-Y + color.x*color-Z = 0
+ *
+ * This is 9 simultaneous equations in the 9 variables "color-C" and can be
+ * solved by Cramer's rule. Cramer's rule requires calculating 10 9x9 matrix
+ * determinants, however this is not as bad as it seems because only 28 of
+ * the total of 90 terms in the various matrices are non-zero. Nevertheless
+ * Cramer's rule is notoriously numerically unstable because the determinant
+ * calculation involves the difference of large, but similar, numbers. It is
+ * difficult to be sure that the calculation is stable for real world values
+ * and it is certain that it becomes unstable where the end points are close
+ * together.
+ *
+ * So this code uses the perhaps slighly less optimal but more understandable
+ * and totally obvious approach of calculating color-scale.
+ *
+ * This algorithm depends on the precision in white-scale and that is
+ * (1/white-y), so we can immediately see that as white-y approaches 0 the
+ * accuracy inherent in the cHRM chunk drops off substantially.
+ *
+ * libpng arithmetic: a simple invertion of the above equations
+ * ------------------------------------------------------------
+ *
+ * white_scale = 1/white-y
+ * white-X = white-x * white-scale
+ * white-Y = 1.0
+ * white-Z = (1 - white-x - white-y) * white_scale
+ *
+ * white-C = red-C + green-C + blue-C
+ * = red-c*red-scale + green-c*green-scale + blue-c*blue-scale
+ *
+ * This gives us three equations in (red-scale,green-scale,blue-scale) where
+ * all the coefficients are now known:
+ *
+ * red-x*red-scale + green-x*green-scale + blue-x*blue-scale
+ * = white-x/white-y
+ * red-y*red-scale + green-y*green-scale + blue-y*blue-scale = 1
+ * red-z*red-scale + green-z*green-scale + blue-z*blue-scale
+ * = (1 - white-x - white-y)/white-y
+ *
+ * In the last equation color-z is (1 - color-x - color-y) so we can add all
+ * three equations together to get an alternative third:
+ *
+ * red-scale + green-scale + blue-scale = 1/white-y = white-scale
+ *
+ * So now we have a Cramer's rule solution where the determinants are just
+ * 3x3 - far more tractible. Unfortunately 3x3 determinants still involve
+ * multiplication of three coefficients so we can't guarantee to avoid
+ * overflow in the libpng fixed point representation. Using Cramer's rule in
+ * floating point is probably a good choice here, but it's not an option for
+ * fixed point. Instead proceed to simplify the first two equations by
+ * eliminating what is likely to be the largest value, blue-scale:
+ *
+ * blue-scale = white-scale - red-scale - green-scale
+ *
+ * Hence:
+ *
+ * (red-x - blue-x)*red-scale + (green-x - blue-x)*green-scale =
+ * (white-x - blue-x)*white-scale
+ *
+ * (red-y - blue-y)*red-scale + (green-y - blue-y)*green-scale =
+ * 1 - blue-y*white-scale
+ *
+ * And now we can trivially solve for (red-scale,green-scale):
+ *
+ * green-scale =
+ * (white-x - blue-x)*white-scale - (red-x - blue-x)*red-scale
+ * -----------------------------------------------------------
+ * green-x - blue-x
+ *
+ * red-scale =
+ * 1 - blue-y*white-scale - (green-y - blue-y) * green-scale
+ * ---------------------------------------------------------
+ * red-y - blue-y
+ *
+ * Hence:
+ *
+ * red-scale =
+ * ( (green-x - blue-x) * (white-y - blue-y) -
+ * (green-y - blue-y) * (white-x - blue-x) ) / white-y
+ * -------------------------------------------------------------------------
+ * (green-x - blue-x)*(red-y - blue-y)-(green-y - blue-y)*(red-x - blue-x)
+ *
+ * green-scale =
+ * ( (red-y - blue-y) * (white-x - blue-x) -
+ * (red-x - blue-x) * (white-y - blue-y) ) / white-y
+ * -------------------------------------------------------------------------
+ * (green-x - blue-x)*(red-y - blue-y)-(green-y - blue-y)*(red-x - blue-x)
+ *
+ * Accuracy:
+ * The input values have 5 decimal digits of accuracy. The values are all in
+ * the range 0 < value < 1, so simple products are in the same range but may
+ * need up to 10 decimal digits to preserve the original precision and avoid
+ * underflow. Because we are using a 32-bit signed representation we cannot
+ * match this; the best is a little over 9 decimal digits, less than 10.
+ *
+ * The approach used here is to preserve the maximum precision within the
+ * signed representation. Because the red-scale calculation above uses the
+ * difference between two products of values that must be in the range -1..+1
+ * it is sufficient to divide the product by 7; ceil(100,000/32767*2). The
+ * factor is irrelevant in the calculation because it is applied to both
+ * numerator and denominator.
+ *
+ * Note that the values of the differences of the products of the
+ * chromaticities in the above equations tend to be small, for example for
+ * the sRGB chromaticities they are:
+ *
+ * red numerator: -0.04751
+ * green numerator: -0.08788
+ * denominator: -0.2241 (without white-y multiplication)
+ *
+ * The resultant Y coefficients from the chromaticities of some widely used
+ * color space definitions are (to 15 decimal places):
+ *
+ * sRGB
+ * 0.212639005871510 0.715168678767756 0.072192315360734
+ * Kodak ProPhoto
+ * 0.288071128229293 0.711843217810102 0.000085653960605
+ * Adobe RGB
+ * 0.297344975250536 0.627363566255466 0.075291458493998
+ * Adobe Wide Gamut RGB
+ * 0.258728243040113 0.724682314948566 0.016589442011321
+ */
+ /* By the argument, above overflow should be impossible here. The return
+ * value of 2 indicates an internal error to the caller.
+ */
+ if (!png_muldiv(&left, xy.greenx-xy.bluex, xy.redy - xy.bluey, 7)) return 2;
+ if (!png_muldiv(&right, xy.greeny-xy.bluey, xy.redx - xy.bluex, 7)) return 2;
+ denominator = left - right;
+
+ /* Now find the red numerator. */
+ if (!png_muldiv(&left, xy.greenx-xy.bluex, xy.whitey-xy.bluey, 7)) return 2;
+ if (!png_muldiv(&right, xy.greeny-xy.bluey, xy.whitex-xy.bluex, 7)) return 2;
+
+ /* Overflow is possible here and it indicates an extreme set of PNG cHRM
+ * chunk values. This calculation actually returns the reciprocal of the
+ * scale value because this allows us to delay the multiplication of white-y
+ * into the denominator, which tends to produce a small number.
+ */
+ if (!png_muldiv(&red_inverse, xy.whitey, denominator, left-right) ||
+ red_inverse <= xy.whitey /* r+g+b scales = white scale */)
+ return 1;
+
+ /* Similarly for green_inverse: */
+ if (!png_muldiv(&left, xy.redy-xy.bluey, xy.whitex-xy.bluex, 7)) return 2;
+ if (!png_muldiv(&right, xy.redx-xy.bluex, xy.whitey-xy.bluey, 7)) return 2;
+ if (!png_muldiv(&green_inverse, xy.whitey, denominator, left-right) ||
+ green_inverse <= xy.whitey)
+ return 1;
+
+ /* And the blue scale, the checks above guarantee this can't overflow but it
+ * can still produce 0 for extreme cHRM values.
+ */
+ blue_scale = png_reciprocal(xy.whitey) - png_reciprocal(red_inverse) -
+ png_reciprocal(green_inverse);
+ if (blue_scale <= 0) return 1;
+
+
+ /* And fill in the png_XYZ: */
+ if (!png_muldiv(&XYZ->redX, xy.redx, PNG_FP_1, red_inverse)) return 1;
+ if (!png_muldiv(&XYZ->redY, xy.redy, PNG_FP_1, red_inverse)) return 1;
+ if (!png_muldiv(&XYZ->redZ, PNG_FP_1 - xy.redx - xy.redy, PNG_FP_1,
+ red_inverse))
+ return 1;
+
+ if (!png_muldiv(&XYZ->greenX, xy.greenx, PNG_FP_1, green_inverse)) return 1;
+ if (!png_muldiv(&XYZ->greenY, xy.greeny, PNG_FP_1, green_inverse)) return 1;
+ if (!png_muldiv(&XYZ->greenZ, PNG_FP_1 - xy.greenx - xy.greeny, PNG_FP_1,
+ green_inverse))
+ return 1;
+
+ if (!png_muldiv(&XYZ->blueX, xy.bluex, blue_scale, PNG_FP_1)) return 1;
+ if (!png_muldiv(&XYZ->blueY, xy.bluey, blue_scale, PNG_FP_1)) return 1;
+ if (!png_muldiv(&XYZ->blueZ, PNG_FP_1 - xy.bluex - xy.bluey, blue_scale,
+ PNG_FP_1))
+ return 1;
+
+ return 0; /*success*/
+}
+
+int png_XYZ_from_xy_checked(png_structp png_ptr, png_XYZ *XYZ, png_xy xy)
+{
+ switch (png_XYZ_from_xy(XYZ, xy))
+ {
+ case 0: /* success */
+ return 1;
+
+ case 1:
+ /* The chunk may be technically valid, but we got png_fixed_point
+ * overflow while trying to get XYZ values out of it. This is
+ * entirely benign - the cHRM chunk is pretty extreme.
+ */
+ png_warning(png_ptr,
+ "extreme cHRM chunk cannot be converted to tristimulus values");
+ break;
+
+ default:
+ /* libpng is broken; this should be a warning but if it happens we
+ * want error reports so for the moment it is an error.
+ */
+ png_error(png_ptr, "internal error in png_XYZ_from_xy");
+ break;
+ }
+
+ /* ERROR RETURN */
+ return 0;
+}
+#endif
+
void /* PRIVATE */
png_check_IHDR(png_structp png_ptr,
png_uint_32 width, png_uint_32 height, int bit_depth,
@@ -763,7 +1187,7 @@ png_check_IHDR(png_structp png_ptr,
}
# ifdef PNG_SET_USER_LIMITS_SUPPORTED
- if (width > png_ptr->user_width_max || width > PNG_USER_WIDTH_MAX)
+ if (width > png_ptr->user_width_max)
# else
if (width > PNG_USER_WIDTH_MAX)
@@ -774,7 +1198,7 @@ png_check_IHDR(png_structp png_ptr,
}
# ifdef PNG_SET_USER_LIMITS_SUPPORTED
- if (height > png_ptr->user_height_max || height > PNG_USER_HEIGHT_MAX)
+ if (height > png_ptr->user_height_max)
# else
if (height > PNG_USER_HEIGHT_MAX)
# endif
@@ -889,16 +1313,9 @@ png_check_IHDR(png_structp png_ptr,
/* Check an ASCII formated floating point value, see the more detailed
* comments in pngpriv.h
*/
-/* The following is used internally to preserve the 'valid' flag */
+/* The following is used internally to preserve the sticky flags */
#define png_fp_add(state, flags) ((state) |= (flags))
-#define png_fp_set(state, value)\
- ((state) = (value) | ((state) & PNG_FP_WAS_VALID))
-
-/* Internal type codes: bits above the base state! */
-#define PNG_FP_SIGN 0 /* [+-] */
-#define PNG_FP_DOT 4 /* . */
-#define PNG_FP_DIGIT 8 /* [0123456789] */
-#define PNG_FP_E 12 /* [Ee] */
+#define png_fp_set(state, value) ((state) = (value) | ((state) & PNG_FP_STICKY))
int /* PRIVATE */
png_check_fp_number(png_const_charp string, png_size_t size, int *statep,
@@ -911,55 +1328,55 @@ png_check_fp_number(png_const_charp string, png_size_t size, int *statep,
{
int type;
/* First find the type of the next character */
+ switch (string[i])
{
- char ch = string[i];
-
- if (ch >= 48 && ch <= 57)
- type = PNG_FP_DIGIT;
-
- else switch (ch)
- {
- case 43: case 45: type = PNG_FP_SIGN; break;
- case 46: type = PNG_FP_DOT; break;
- case 69: case 101: type = PNG_FP_E; break;
- default: goto PNG_FP_End;
- }
+ case 43: type = PNG_FP_SAW_SIGN; break;
+ case 45: type = PNG_FP_SAW_SIGN + PNG_FP_NEGATIVE; break;
+ case 46: type = PNG_FP_SAW_DOT; break;
+ case 48: type = PNG_FP_SAW_DIGIT; break;
+ case 49: case 50: case 51: case 52:
+ case 53: case 54: case 55: case 56:
+ case 57: type = PNG_FP_SAW_DIGIT + PNG_FP_NONZERO; break;
+ case 69:
+ case 101: type = PNG_FP_SAW_E; break;
+ default: goto PNG_FP_End;
}
/* Now deal with this type according to the current
* state, the type is arranged to not overlap the
* bits of the PNG_FP_STATE.
*/
- switch ((state & PNG_FP_STATE) + type)
+ switch ((state & PNG_FP_STATE) + (type & PNG_FP_SAW_ANY))
{
- case PNG_FP_INTEGER + PNG_FP_SIGN:
+ case PNG_FP_INTEGER + PNG_FP_SAW_SIGN:
if (state & PNG_FP_SAW_ANY)
goto PNG_FP_End; /* not a part of the number */
- png_fp_add(state, PNG_FP_SAW_SIGN);
+ png_fp_add(state, type);
break;
- case PNG_FP_INTEGER + PNG_FP_DOT:
+ case PNG_FP_INTEGER + PNG_FP_SAW_DOT:
/* Ok as trailer, ok as lead of fraction. */
if (state & PNG_FP_SAW_DOT) /* two dots */
goto PNG_FP_End;
else if (state & PNG_FP_SAW_DIGIT) /* trailing dot? */
- png_fp_add(state, PNG_FP_SAW_DOT);
+ png_fp_add(state, type);
else
- png_fp_set(state, PNG_FP_FRACTION | PNG_FP_SAW_DOT);
+ png_fp_set(state, PNG_FP_FRACTION | type);
break;
- case PNG_FP_INTEGER + PNG_FP_DIGIT:
+ case PNG_FP_INTEGER + PNG_FP_SAW_DIGIT:
if (state & PNG_FP_SAW_DOT) /* delayed fraction */
png_fp_set(state, PNG_FP_FRACTION | PNG_FP_SAW_DOT);
- png_fp_add(state, PNG_FP_SAW_DIGIT + PNG_FP_WAS_VALID);
+ png_fp_add(state, type | PNG_FP_WAS_VALID);
break;
- case PNG_FP_INTEGER + PNG_FP_E:
+
+ case PNG_FP_INTEGER + PNG_FP_SAW_E:
if ((state & PNG_FP_SAW_DIGIT) == 0)
goto PNG_FP_End;
@@ -967,17 +1384,17 @@ png_check_fp_number(png_const_charp string, png_size_t size, int *statep,
break;
- /* case PNG_FP_FRACTION + PNG_FP_SIGN:
- goto PNG_FP_End; ** no sign in exponent */
+ /* case PNG_FP_FRACTION + PNG_FP_SAW_SIGN:
+ goto PNG_FP_End; ** no sign in fraction */
- /* case PNG_FP_FRACTION + PNG_FP_DOT:
+ /* case PNG_FP_FRACTION + PNG_FP_SAW_DOT:
goto PNG_FP_End; ** Because SAW_DOT is always set */
- case PNG_FP_FRACTION + PNG_FP_DIGIT:
- png_fp_add(state, PNG_FP_SAW_DIGIT + PNG_FP_WAS_VALID);
+ case PNG_FP_FRACTION + PNG_FP_SAW_DIGIT:
+ png_fp_add(state, type | PNG_FP_WAS_VALID);
break;
- case PNG_FP_FRACTION + PNG_FP_E:
+ case PNG_FP_FRACTION + PNG_FP_SAW_E:
/* This is correct because the trailing '.' on an
* integer is handled above - so we can only get here
* with the sequence ".E" (with no preceding digits).
@@ -989,7 +1406,7 @@ png_check_fp_number(png_const_charp string, png_size_t size, int *statep,
break;
- case PNG_FP_EXPONENT + PNG_FP_SIGN:
+ case PNG_FP_EXPONENT + PNG_FP_SAW_SIGN:
if (state & PNG_FP_SAW_ANY)
goto PNG_FP_End; /* not a part of the number */
@@ -997,15 +1414,15 @@ png_check_fp_number(png_const_charp string, png_size_t size, int *statep,
break;
- /* case PNG_FP_EXPONENT + PNG_FP_DOT:
+ /* case PNG_FP_EXPONENT + PNG_FP_SAW_DOT:
goto PNG_FP_End; */
- case PNG_FP_EXPONENT + PNG_FP_DIGIT:
- png_fp_add(state, PNG_FP_SAW_DIGIT + PNG_FP_WAS_VALID);
+ case PNG_FP_EXPONENT + PNG_FP_SAW_DIGIT:
+ png_fp_add(state, PNG_FP_SAW_DIGIT | PNG_FP_WAS_VALID);
break;
- /* case PNG_FP_EXPONEXT + PNG_FP_E:
+ /* case PNG_FP_EXPONEXT + PNG_FP_SAW_E:
goto PNG_FP_End; */
default: goto PNG_FP_End; /* I.e. break 2 */
@@ -1033,8 +1450,11 @@ png_check_fp_string(png_const_charp string, png_size_t size)
int state=0;
png_size_t char_index=0;
- return png_check_fp_number(string, size, &state, &char_index) &&
- (char_index == size || string[char_index] == 0);
+ if (png_check_fp_number(string, size, &state, &char_index) &&
+ (char_index == size || string[char_index] == 0))
+ return state /* must be non-zero - see above */;
+
+ return 0; /* i.e. fail */
}
#endif /* pCAL or sCAL */
@@ -1047,7 +1467,7 @@ static double
png_pow10(int power)
{
int recip = 0;
- double d = 1;
+ double d = 1.0;
/* Handle negative exponent with a reciprocal at the end because
* 10 is exact whereas .1 is inexact in base 2
@@ -1061,7 +1481,7 @@ png_pow10(int power)
if (power > 0)
{
/* Decompose power bitwise. */
- double mult = 10;
+ double mult = 10.0;
do
{
if (power & 1) d *= mult;
@@ -1102,7 +1522,7 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size,
if (fp < 0)
{
fp = -fp;
- *ascii++ = 45; /* '-' PLUS 1 TOTAL 1*/
+ *ascii++ = 45; /* '-' PLUS 1 TOTAL 1 */
--size;
}
@@ -1180,7 +1600,8 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size,
{
double d;
- fp *= 10;
+ fp *= 10.0;
+
/* Use modf here, not floor and subtract, so that
* the separation is done in one step. At the end
* of the loop don't break the number into parts so
@@ -1193,7 +1614,7 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size,
{
d = floor(fp + .5);
- if (d > 9)
+ if (d > 9.0)
{
/* Rounding up to 10, handle that here. */
if (czero > 0)
@@ -1201,9 +1622,10 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size,
--czero, d = 1;
if (cdigits == 0) --clead;
}
+
else
{
- while (cdigits > 0 && d > 9)
+ while (cdigits > 0 && d > 9.0)
{
int ch = *--ascii;
@@ -1228,7 +1650,7 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size,
* exponent but take into account the leading
* decimal point.
*/
- if (d > 9) /* cdigits == 0 */
+ if (d > 9.0) /* cdigits == 0 */
{
if (exp_b10 == (-1))
{
@@ -1249,18 +1671,19 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size,
++exp_b10;
/* In all cases we output a '1' */
- d = 1;
+ d = 1.0;
}
}
}
fp = 0; /* Guarantees termination below. */
}
- if (d == 0)
+ if (d == 0.0)
{
++czero;
if (cdigits == 0) ++clead;
}
+
else
{
/* Included embedded zeros in the digit count. */
@@ -1288,6 +1711,7 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size,
above */
--exp_b10;
}
+
*ascii++ = (char)(48 + (int)d), ++cdigits;
}
}
@@ -1329,19 +1753,31 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size,
*/
size -= cdigits;
- *ascii++ = 69, --size; /* 'E': PLUS 1 TOTAL 2+precision*/
- if (exp_b10 < 0)
+ *ascii++ = 69, --size; /* 'E': PLUS 1 TOTAL 2+precision */
+
+ /* The following use of an unsigned temporary avoids ambiguities in
+ * the signed arithmetic on exp_b10 and permits GCC at least to do
+ * better optimization.
+ */
{
- *ascii++ = 45, --size; /* '-': PLUS 1 TOTAL 3+precision */
- exp_b10 = -exp_b10;
- }
+ unsigned int uexp_b10;
- cdigits = 0;
+ if (exp_b10 < 0)
+ {
+ *ascii++ = 45, --size; /* '-': PLUS 1 TOTAL 3+precision */
+ uexp_b10 = -exp_b10;
+ }
- while (exp_b10 > 0)
- {
- exponent[cdigits++] = (char)(48 + exp_b10 % 10);
- exp_b10 /= 10;
+ else
+ uexp_b10 = exp_b10;
+
+ cdigits = 0;
+
+ while (uexp_b10 > 0)
+ {
+ exponent[cdigits++] = (char)(48 + uexp_b10 % 10);
+ uexp_b10 /= 10;
+ }
}
/* Need another size check here for the exponent digits, so
@@ -1399,9 +1835,9 @@ png_ascii_from_fixed(png_structp png_ptr, png_charp ascii, png_size_t size,
else
num = fp;
- if (num <= 0x80000000U) /* else overflowed */
+ if (num <= 0x80000000) /* else overflowed */
{
- unsigned int ndigits = 0, first = 16/*flag value*/;
+ unsigned int ndigits = 0, first = 16 /* flag value */;
char digits[10];
while (num)
@@ -1495,7 +1931,7 @@ png_muldiv(png_fixed_point_p res, png_fixed_point a, png_int_32 times,
r /= divisor;
r = floor(r+.5);
- /* A png_fixed_point is a 32 bit integer. */
+ /* A png_fixed_point is a 32-bit integer. */
if (r <= 2147483647. && r >= -2147483648.)
{
*res = (png_fixed_point)r;
@@ -1540,7 +1976,7 @@ png_muldiv(png_fixed_point_p res, png_fixed_point a, png_int_32 times,
if (s32 < D) /* else overflow */
{
- /* s32.s00 is now the 64 bit product, do a standard
+ /* s32.s00 is now the 64-bit product, do a standard
* division, we know that s32 < D, so the maximum
* required shift is 31.
*/
@@ -1683,7 +2119,7 @@ png_reciprocal2(png_fixed_point a, png_fixed_point b)
* 2010: moved from pngset.c) */
/*
* Multiply two 32-bit numbers, V1 and V2, using 32-bit
- * arithmetic, to produce a 64 bit result in the HI/LO words.
+ * arithmetic, to produce a 64-bit result in the HI/LO words.
*
* A B
* x C D
@@ -1727,24 +2163,24 @@ png_64bit_product (long v1, long v2, unsigned long *hi_product,
/* Fixed point gamma.
*
* To calculate gamma this code implements fast log() and exp() calls using only
- * fixed point arithmetic. This code has sufficient precision for either 8 or
- * 16 bit sample values.
+ * fixed point arithmetic. This code has sufficient precision for either 8-bit
+ * or 16-bit sample values.
*
* The tables used here were calculated using simple 'bc' programs, but C double
* precision floating point arithmetic would work fine. The programs are given
* at the head of each table.
*
- * 8 bit log table
+ * 8-bit log table
* This is a table of -log(value/255)/log(2) for 'value' in the range 128 to
- * 255, so it's the base 2 logarithm of a normalized 8 bit floating point
- * mantissa. The numbers are 32 bit fractions.
+ * 255, so it's the base 2 logarithm of a normalized 8-bit floating point
+ * mantissa. The numbers are 32-bit fractions.
*/
static png_uint_32
png_8bit_l2[128] =
{
-# if PNG_DO_BC
+# ifdef PNG_DO_BC
for (i=128;i<256;++i) { .5 - l(i/255)/l(2)*65536*65536; }
-# endif
+# else
4270715492U, 4222494797U, 4174646467U, 4127164793U, 4080044201U, 4033279239U,
3986864580U, 3940795015U, 3895065449U, 3849670902U, 3804606499U, 3759867474U,
3715449162U, 3671346997U, 3627556511U, 3584073329U, 3540893168U, 3498011834U,
@@ -1767,11 +2203,13 @@ png_8bit_l2[128] =
324227938U, 298676034U, 273229066U, 247886176U, 222646516U, 197509248U,
172473545U, 147538590U, 122703574U, 97967701U, 73330182U, 48790236U,
24347096U, 0U
+# endif
+
#if 0
- /* The following are the values for 16 bit tables - these work fine for the 8
- * bit conversions but produce very slightly larger errors in the 16 bit log
- * (about 1.2 as opposed to 0.7 absolute error in the final value). To use
- * these all the shifts below must be adjusted appropriately.
+ /* The following are the values for 16-bit tables - these work fine for the
+ * 8-bit conversions but produce very slightly larger errors in the 16-bit
+ * log (about 1.2 as opposed to 0.7 absolute error in the final value). To
+ * use these all the shifts below must be adjusted appropriately.
*/
65166, 64430, 63700, 62976, 62257, 61543, 60835, 60132, 59434, 58741, 58054,
57371, 56693, 56020, 55352, 54689, 54030, 53375, 52726, 52080, 51439, 50803,
@@ -1788,7 +2226,7 @@ png_8bit_l2[128] =
#endif
};
-static png_int_32
+PNG_STATIC png_int_32
png_log8bit(unsigned int x)
{
unsigned int lg2 = 0;
@@ -1814,11 +2252,11 @@ png_log8bit(unsigned int x)
return (png_int_32)((lg2 << 16) + ((png_8bit_l2[x-128]+32768)>>16));
}
-/* The above gives exact (to 16 binary places) log2 values for 8 bit images,
- * for 16 bit images we use the most significant 8 bits of the 16 bit value to
+/* The above gives exact (to 16 binary places) log2 values for 8-bit images,
+ * for 16-bit images we use the most significant 8 bits of the 16-bit value to
* get an approximation then multiply the approximation by a correction factor
* determined by the remaining up to 8 bits. This requires an additional step
- * in the 16 bit case.
+ * in the 16-bit case.
*
* We want log2(value/65535), we have log2(v'/255), where:
*
@@ -1827,8 +2265,8 @@ png_log8bit(unsigned int x)
*
* So f is value/v', which is equal to (256+v''/v') since v' is in the range 128
* to 255 and v'' is in the range 0 to 255 f will be in the range 256 to less
- * than 258. The final factor also needs to correct for the fact that our 8 bit
- * value is scaled by 255, whereas the 16 bit values must be scaled by 65535.
+ * than 258. The final factor also needs to correct for the fact that our 8-bit
+ * value is scaled by 255, whereas the 16-bit values must be scaled by 65535.
*
* This gives a final formula using a calculated value 'x' which is value/v' and
* scaling by 65536 to match the above table:
@@ -1838,13 +2276,13 @@ png_log8bit(unsigned int x)
* Since these numbers are so close to '1' we can use simple linear
* interpolation between the two end values 256/257 (result -368.61) and 258/257
* (result 367.179). The values used below are scaled by a further 64 to give
- * 16 bit precision in the interpolation:
+ * 16-bit precision in the interpolation:
*
* Start (256): -23591
* Zero (257): 0
* End (258): 23499
*/
-static png_int_32
+PNG_STATIC png_int_32
png_log16bit(png_uint_32 x)
{
unsigned int lg2 = 0;
@@ -1865,7 +2303,7 @@ png_log16bit(png_uint_32 x)
if ((x & 0x8000) == 0)
lg2 += 1, x <<= 1;
- /* Calculate the base logarithm from the top 8 bits as a 28 bit fractional
+ /* Calculate the base logarithm from the top 8 bits as a 28-bit fractional
* value.
*/
lg2 <<= 28;
@@ -1895,34 +2333,35 @@ png_log16bit(png_uint_32 x)
return (png_int_32)((lg2 + 2048) >> 12);
}
-/* The 'exp()' case must invert the above, taking a 20 bit fixed point
- * logarithmic value and returning a 16 or 8 bit number as appropriate. In
+/* The 'exp()' case must invert the above, taking a 20-bit fixed point
+ * logarithmic value and returning a 16 or 8-bit number as appropriate. In
* each case only the low 16 bits are relevant - the fraction - since the
* integer bits (the top 4) simply determine a shift.
*
- * The worst case is the 16 bit distinction between 65535 and 65534, this
- * requires perhaps spurious accuracty in the decoding of the logarithm to
+ * The worst case is the 16-bit distinction between 65535 and 65534, this
+ * requires perhaps spurious accuracy in the decoding of the logarithm to
* distinguish log2(65535/65534.5) - 10^-5 or 17 bits. There is little chance
* of getting this accuracy in practice.
*
* To deal with this the following exp() function works out the exponent of the
- * frational part of the logarithm by using an accurate 32 bit value from the
+ * frational part of the logarithm by using an accurate 32-bit value from the
* top four fractional bits then multiplying in the remaining bits.
*/
static png_uint_32
png_32bit_exp[16] =
{
-# if PNG_DO_BC
+# ifdef PNG_DO_BC
for (i=0;i<16;++i) { .5 + e(-i/16*l(2))*2^32; }
-# endif
- /* NOTE: the first entry is deliberately set to the maximum 32 bit value. */
+# else
+ /* NOTE: the first entry is deliberately set to the maximum 32-bit value. */
4294967295U, 4112874773U, 3938502376U, 3771522796U, 3611622603U, 3458501653U,
3311872529U, 3171459999U, 3037000500U, 2908241642U, 2784941738U, 2666869345U,
2553802834U, 2445529972U, 2341847524U, 2242560872U
+# endif
};
/* Adjustment table; provided to explain the numbers in the code below. */
-#if PNG_DO_BC
+#ifdef PNG_DO_BC
for (i=11;i>=0;--i){ print i, " ", (1 - e(-(2^i)/65536*l(2))) * 2^(32-i), "\n"}
11 44937.64284865548751208448
10 45180.98734845585101160448
@@ -1938,12 +2377,12 @@ for (i=11;i>=0;--i){ print i, " ", (1 - e(-(2^i)/65536*l(2))) * 2^(32-i), "\n"}
0 45425.85339951654943850496
#endif
-static png_uint_32
+PNG_STATIC png_uint_32
png_exp(png_fixed_point x)
{
if (x > 0 && x <= 0xfffff) /* Else overflow or zero (underflow) */
{
- /* Obtain a 4 bit approximation */
+ /* Obtain a 4-bit approximation */
png_uint_32 e = png_32bit_exp[(x >> 12) & 0xf];
/* Incorporate the low 12 bits - these decrease the returned value by
@@ -1986,13 +2425,13 @@ png_exp(png_fixed_point x)
return 0;
}
-static png_byte
+PNG_STATIC png_byte
png_exp8bit(png_fixed_point lg2)
{
- /* Get a 32 bit value: */
+ /* Get a 32-bit value: */
png_uint_32 x = png_exp(lg2);
- /* Convert the 32 bit value to 0..255 by multiplying by 256-1, note that the
+ /* Convert the 32-bit value to 0..255 by multiplying by 256-1, note that the
* second, rounding, step can't overflow because of the first, subtraction,
* step.
*/
@@ -2000,13 +2439,13 @@ png_exp8bit(png_fixed_point lg2)
return (png_byte)((x + 0x7fffffU) >> 24);
}
-static png_uint_16
+PNG_STATIC png_uint_16
png_exp16bit(png_fixed_point lg2)
{
- /* Get a 32 bit value: */
+ /* Get a 32-bit value: */
png_uint_32 x = png_exp(lg2);
- /* Convert the 32 bit value to 0..65535 by multiplying by 65536-1: */
+ /* Convert the 32-bit value to 0..65535 by multiplying by 65536-1: */
x -= x >> 16;
return (png_uint_16)((x + 32767U) >> 16);
}
@@ -2059,9 +2498,9 @@ png_gamma_16bit_correct(unsigned int value, png_fixed_point gamma_val)
}
/* This does the right thing based on the bit_depth field of the
- * png_struct, interpreting values as 8 or 16 bit. While the result
- * is nominally a 16 bit value if bit depth is 8 then the result is
- * 8 bit (as are the arguments.)
+ * png_struct, interpreting values as 8-bit or 16-bit. While the result
+ * is nominally a 16-bit value if bit depth is 8 then the result is
+ * 8-bit (as are the arguments.)
*/
png_uint_16 /* PRIVATE */
png_gamma_correct(png_structp png_ptr, unsigned int value,
@@ -2084,8 +2523,8 @@ png_gamma_significant(png_fixed_point gamma_val)
gamma_val > PNG_FP_1 + PNG_GAMMA_THRESHOLD_FIXED;
}
-/* Internal function to build a single 16 bit table - the table consists of
- * 'num' 256 entry subtables, where 'num' is determined by 'shift' - the amount
+/* Internal function to build a single 16-bit table - the table consists of
+ * 'num' 256-entry subtables, where 'num' is determined by 'shift' - the amount
* to shift the input values right (or 16-number_of_signifiant_bits).
*
* The caller is responsible for ensuring that the table gets cleaned up on
@@ -2111,7 +2550,7 @@ png_build_16bit_table(png_structp png_ptr, png_uint_16pp *ptable,
(png_uint_16p)png_malloc(png_ptr, 256 * png_sizeof(png_uint_16));
/* The 'threshold' test is repeated here because it can arise for one of
- * the 16 bit tables even if the others don't hit it.
+ * the 16-bit tables even if the others don't hit it.
*/
if (png_gamma_significant(gamma_val))
{
@@ -2172,9 +2611,9 @@ png_build_16to8_table(png_structp png_ptr, png_uint_16pp *ptable,
png_uint_16pp table = *ptable =
(png_uint_16pp)png_calloc(png_ptr, num * png_sizeof(png_uint_16p));
- /* 'num' is the number of tables and also the number of low bits of low
- * bits of the input 16 bit value used to select a table. Each table is
- * itself index by the high 8 bits of the value.
+ /* 'num' is the number of tables and also the number of low bits of the
+ * input 16-bit value used to select a table. Each table is itself indexed
+ * by the high 8 bits of the value.
*/
for (i = 0; i < num; i++)
table[i] = (png_uint_16p)png_malloc(png_ptr,
@@ -2183,24 +2622,24 @@ png_build_16to8_table(png_structp png_ptr, png_uint_16pp *ptable,
/* 'gamma_val' is set to the reciprocal of the value calculated above, so
* pow(out,g) is an *input* value. 'last' is the last input value set.
*
- * In the loop 'i' is used to find output values. Since the output is 8
- * bit there are only 256 possible values. The tables are set up to
+ * In the loop 'i' is used to find output values. Since the output is
+ * 8-bit there are only 256 possible values. The tables are set up to
* select the closest possible output value for each input by finding
* the input value at the boundary between each pair of output values
* and filling the table up to that boundary with the lower output
* value.
*
- * The boundary values are 0.5,1.5..253.5,254.5. Since these are 9 bit
- * values the code below uses a 16 bit value in i; the values start at
+ * The boundary values are 0.5,1.5..253.5,254.5. Since these are 9-bit
+ * values the code below uses a 16-bit value in i; the values start at
* 128.5 (for 0.5) and step by 257, for a total of 254 values (the last
* entries are filled with 255). Start i at 128 and fill all 'last'
* table entries <= 'max'
*/
last = 0;
- for (i = 0; i < 255; ++i) /* 8 bit output value */
+ for (i = 0; i < 255; ++i) /* 8-bit output value */
{
/* Find the corresponding maximum input value */
- png_uint_16 out = (png_uint_16)(i * 257U); /* 16 bit output value */
+ png_uint_16 out = (png_uint_16)(i * 257U); /* 16-bit output value */
/* Find the boundary value in 16 bits: */
png_uint_32 bound = png_gamma_16bit_correct(out+128U, gamma_val);
@@ -2223,9 +2662,9 @@ png_build_16to8_table(png_structp png_ptr, png_uint_16pp *ptable,
}
}
-/* Build a single 8 bit table: same as the 16 bit case but much simpler (and
+/* Build a single 8-bit table: same as the 16-bit case but much simpler (and
* typically much faster). Note that libpng currently does no sBIT processing
- * (apparently contrary to the spec) so a 256 entry table is always generated.
+ * (apparently contrary to the spec) so a 256-entry table is always generated.
*/
static void
png_build_8bit_table(png_structp png_ptr, png_bytepp ptable,
@@ -2241,6 +2680,60 @@ png_build_8bit_table(png_structp png_ptr, png_bytepp ptable,
table[i] = (png_byte)i;
}
+/* Used from png_read_destroy and below to release the memory used by the gamma
+ * tables.
+ */
+void /* PRIVATE */
+png_destroy_gamma_table(png_structp png_ptr)
+{
+ png_free(png_ptr, png_ptr->gamma_table);
+ png_ptr->gamma_table = NULL;
+
+ if (png_ptr->gamma_16_table != NULL)
+ {
+ int i;
+ int istop = (1 << (8 - png_ptr->gamma_shift));
+ for (i = 0; i < istop; i++)
+ {
+ png_free(png_ptr, png_ptr->gamma_16_table[i]);
+ }
+ png_free(png_ptr, png_ptr->gamma_16_table);
+ png_ptr->gamma_16_table = NULL;
+ }
+
+#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \
+ defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \
+ defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
+ png_free(png_ptr, png_ptr->gamma_from_1);
+ png_ptr->gamma_from_1 = NULL;
+ png_free(png_ptr, png_ptr->gamma_to_1);
+ png_ptr->gamma_to_1 = NULL;
+
+ if (png_ptr->gamma_16_from_1 != NULL)
+ {
+ int i;
+ int istop = (1 << (8 - png_ptr->gamma_shift));
+ for (i = 0; i < istop; i++)
+ {
+ png_free(png_ptr, png_ptr->gamma_16_from_1[i]);
+ }
+ png_free(png_ptr, png_ptr->gamma_16_from_1);
+ png_ptr->gamma_16_from_1 = NULL;
+ }
+ if (png_ptr->gamma_16_to_1 != NULL)
+ {
+ int i;
+ int istop = (1 << (8 - png_ptr->gamma_shift));
+ for (i = 0; i < istop; i++)
+ {
+ png_free(png_ptr, png_ptr->gamma_16_to_1[i]);
+ }
+ png_free(png_ptr, png_ptr->gamma_16_to_1);
+ png_ptr->gamma_16_to_1 = NULL;
+ }
+#endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */
+}
+
/* We build the 8- or 16-bit gamma tables here. Note that for 16-bit
* tables, we don't make a full table if we are reducing to 8-bit in
* the future. Note also how the gamma_16 tables are segmented so that
@@ -2251,6 +2744,18 @@ png_build_gamma_table(png_structp png_ptr, int bit_depth)
{
png_debug(1, "in png_build_gamma_table");
+ /* Remove any existing table; this copes with multiple calls to
+ * png_read_update_info. The warning is because building the gamma tables
+ * multiple times is a performance hit - it's harmless but the ability to call
+ * png_read_update_info() multiple times is new in 1.5.6 so it seems sensible
+ * to warn if the app introduces such a hit.
+ */
+ if (png_ptr->gamma_table != NULL || png_ptr->gamma_16_table != NULL)
+ {
+ png_warning(png_ptr, "gamma table being rebuilt");
+ png_destroy_gamma_table(png_ptr);
+ }
+
if (bit_depth <= 8)
{
png_build_8bit_table(png_ptr, &png_ptr->gamma_table,
@@ -2258,8 +2763,9 @@ png_build_gamma_table(png_structp png_ptr, int bit_depth)
png_ptr->screen_gamma) : PNG_FP_1);
#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \
+ defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \
defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
- if (png_ptr->transformations & ((PNG_BACKGROUND) | PNG_RGB_TO_GRAY))
+ if (png_ptr->transformations & (PNG_COMPOSE | PNG_RGB_TO_GRAY))
{
png_build_8bit_table(png_ptr, &png_ptr->gamma_to_1,
png_reciprocal(png_ptr->gamma));
@@ -2268,7 +2774,7 @@ png_build_gamma_table(png_structp png_ptr, int bit_depth)
png_ptr->screen_gamma > 0 ? png_reciprocal(png_ptr->screen_gamma) :
png_ptr->gamma/* Probably doing rgb_to_gray */);
}
-#endif /* PNG_READ_BACKGROUND_SUPPORTED || PNG_RGB_TO_GRAY_SUPPORTED */
+#endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */
}
else
{
@@ -2287,14 +2793,14 @@ png_build_gamma_table(png_structp png_ptr, int bit_depth)
else
sig_bit = png_ptr->sig_bit.gray;
- /* 16 bit gamma code uses this equation:
+ /* 16-bit gamma code uses this equation:
*
* ov = table[(iv & 0xff) >> gamma_shift][iv >> 8]
*
* Where 'iv' is the input color value and 'ov' is the output value -
* pow(iv, gamma).
*
- * Thus the gamma table consists of up to 256 256 entry tables. The table
+ * Thus the gamma table consists of up to 256 256-entry tables. The table
* is selected by the (8-gamma_shift) most significant of the low 8 bits of
* the color value then indexed by the upper 8 bits:
*
@@ -2302,7 +2808,7 @@ png_build_gamma_table(png_structp png_ptr, int bit_depth)
*
* So the table 'n' corresponds to all those 'iv' of:
*
- * <all high 8 bit values><n << gamma_shift>..<(n+1 << gamma_shift)-1>
+ * <all high 8-bit values><n << gamma_shift>..<(n+1 << gamma_shift)-1>
*
*/
if (sig_bit > 0 && sig_bit < 16U)
@@ -2311,7 +2817,7 @@ png_build_gamma_table(png_structp png_ptr, int bit_depth)
else
shift = 0; /* keep all 16 bits */
- if (png_ptr->transformations & PNG_16_TO_8)
+ if (png_ptr->transformations & (PNG_16_TO_8 | PNG_SCALE_16_TO_8))
{
/* PNG_MAX_GAMMA_8 is the number of bits to keep - effectively
* the significant bits in the *input* when the output will
@@ -2327,7 +2833,12 @@ png_build_gamma_table(png_structp png_ptr, int bit_depth)
png_ptr->gamma_shift = shift;
#ifdef PNG_16BIT_SUPPORTED
- if (png_ptr->transformations & (PNG_16_TO_8 | PNG_BACKGROUND))
+ /* NOTE: prior to 1.5.4 this test used to include PNG_BACKGROUND (now
+ * PNG_COMPOSE). This effectively smashed the background calculation for
+ * 16-bit output because the 8-bit table assumes the result will be reduced
+ * to 8 bits.
+ */
+ if (png_ptr->transformations & (PNG_16_TO_8 | PNG_SCALE_16_TO_8))
#endif
png_build_16to8_table(png_ptr, &png_ptr->gamma_16_table, shift,
png_ptr->screen_gamma > 0 ? png_product2(png_ptr->gamma,
@@ -2341,8 +2852,9 @@ png_build_gamma_table(png_structp png_ptr, int bit_depth)
#endif
#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \
+ defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \
defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
- if (png_ptr->transformations & (PNG_BACKGROUND | PNG_RGB_TO_GRAY))
+ if (png_ptr->transformations & (PNG_COMPOSE | PNG_RGB_TO_GRAY))
{
png_build_16bit_table(png_ptr, &png_ptr->gamma_16_to_1, shift,
png_reciprocal(png_ptr->gamma));
@@ -2355,7 +2867,7 @@ png_build_gamma_table(png_structp png_ptr, int bit_depth)
png_ptr->screen_gamma > 0 ? png_reciprocal(png_ptr->screen_gamma) :
png_ptr->gamma/* Probably doing rgb_to_gray */);
}
-#endif /* PNG_READ_BACKGROUND_SUPPORTED || PNG_RGB_TO_GRAY_SUPPORTED */
+#endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */
}
}
#endif /* READ_GAMMA */
diff --git a/src/3rdparty/libpng/png.h b/src/3rdparty/libpng/png.h
index 100f56dba2..4e0dee1793 100644
--- a/src/3rdparty/libpng/png.h
+++ b/src/3rdparty/libpng/png.h
@@ -1,8 +1,8 @@
/* png.h - header file for PNG reference library
*
- * libpng version 1.5.1 - February 3, 2011
- * Copyright (c) 1998-2011 Glenn Randers-Pehrson
+ * libpng version 1.5.10 - March 29, 2012
+ * Copyright (c) 1998-2012 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -11,7 +11,7 @@
* Authors and maintainers:
* libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat
* libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger
- * libpng versions 0.97, January 1998, through 1.5.1 - February 3, 2011: Glenn
+ * libpng versions 0.97, January 1998, through 1.5.10 - March 29, 2012: Glenn
* See also "Contributing Authors", below.
*
* Note about libpng version numbers:
@@ -147,6 +147,33 @@
* 1.5.1beta01-11 15 10501 15.so.15.1[.0]
* 1.5.1rc01-02 15 10501 15.so.15.1[.0]
* 1.5.1 15 10501 15.so.15.1[.0]
+ * 1.5.2beta01-03 15 10502 15.so.15.2[.0]
+ * 1.5.2rc01-03 15 10502 15.so.15.2[.0]
+ * 1.5.2 15 10502 15.so.15.2[.0]
+ * 1.5.3beta01-10 15 10503 15.so.15.3[.0]
+ * 1.5.3rc01-02 15 10503 15.so.15.3[.0]
+ * 1.5.3beta11 15 10503 15.so.15.3[.0]
+ * 1.5.3 [omitted]
+ * 1.5.4beta01-08 15 10504 15.so.15.4[.0]
+ * 1.5.4rc01 15 10504 15.so.15.4[.0]
+ * 1.5.4 15 10504 15.so.15.4[.0]
+ * 1.5.5beta01-08 15 10505 15.so.15.5[.0]
+ * 1.5.5rc01 15 10505 15.so.15.5[.0]
+ * 1.5.5 15 10505 15.so.15.5[.0]
+ * 1.5.6beta01-07 15 10506 15.so.15.6[.0]
+ * 1.5.6rc01-03 15 10506 15.so.15.6[.0]
+ * 1.5.6 15 10506 15.so.15.6[.0]
+ * 1.5.7beta01-05 15 10507 15.so.15.7[.0]
+ * 1.5.7rc01-03 15 10507 15.so.15.7[.0]
+ * 1.5.7 15 10507 15.so.15.7[.0]
+ * 1.5.8beta01 15 10508 15.so.15.8[.0]
+ * 1.5.8rc01 15 10508 15.so.15.8[.0]
+ * 1.5.8 15 10508 15.so.15.8[.0]
+ * 1.5.9beta01-02 15 10509 15.so.15.9[.0]
+ * 1.5.9rc01 15 10509 15.so.15.9[.0]
+ * 1.5.9 15 10509 15.so.15.9[.0]
+ * 1.5.10beta01-05 15 10510 15.so.15.10[.0]
+ * 1.5.10 15 10510 15.so.15.10[.0]
*
* Henceforth the source version will match the shared-library major
* and minor numbers; the shared-library major version number will be
@@ -156,7 +183,7 @@
* to the source version x.y.z (leading zeros in y and z). Beta versions
* were given the previous public release number plus a letter, until
* version 1.0.6j; from then on they were given the upcoming public
- * release number plus "betaNN" or "rcN".
+ * release number plus "betaNN" or "rcNN".
*
* Binary incompatibility exists only when applications make direct access
* to the info_ptr or png_ptr members through png.h, and the compiled
@@ -178,8 +205,8 @@
*
* This code is released under the libpng license.
*
- * libpng versions 1.2.6, August 15, 2004, through 1.5.1, February 3, 2011, are
- * Copyright (c) 2004, 2006-2011 Glenn Randers-Pehrson, and are
+ * libpng versions 1.2.6, August 15, 2004, through 1.5.10, March 29, 2012, are
+ * Copyright (c) 2004, 2006-2012 Glenn Randers-Pehrson, and are
* distributed according to the same disclaimer and license as libpng-1.2.5
* with the following individual added to the list of Contributing Authors:
*
@@ -205,7 +232,7 @@
*
* libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
* Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson, and are
- * distributed according to the same disclaimer and license as libpng-0.96,
+ * distributed according to the same disclaimer and license as libpng-0.96,
* with the following individuals added to the list of Contributing Authors:
*
* Tom Lane
@@ -214,7 +241,7 @@
*
* libpng versions 0.89, June 1996, through 0.96, May 1997, are
* Copyright (c) 1996, 1997 Andreas Dilger
- * Distributed according to the same disclaimer and license as libpng-0.88,
+ * Distributed according to the same disclaimer and license as libpng-0.88,
* with the following individuals added to the list of Contributing Authors:
*
* John Bowler
@@ -237,10 +264,10 @@
* Tim Wegner
*
* The PNG Reference Library is supplied "AS IS". The Contributing Authors
- * and Group 42, Inc. disclaim all warranties, expressed or implied,
+ * and Group 42, Inc. disclaim all warranties, expressed or implied,
* including, without limitation, the warranties of merchantability and of
* fitness for any purpose. The Contributing Authors and Group 42, Inc.
- * assume no liability for direct, indirect, incidental, special, exemplary,
+ * assume no liability for direct, indirect, incidental, special, exemplary,
* or consequential damages, which may result from the use of the PNG
* Reference Library, even if advised of the possibility of such damage.
*
@@ -290,25 +317,24 @@
* Y2K compliance in libpng:
* =========================
*
- * February 3, 2011
+ * March 29, 2012
*
* Since the PNG Development group is an ad-hoc body, we can't make
* an official declaration.
*
* This is your unofficial assurance that libpng from version 0.71 and
- * upward through 1.5.1 are Y2K compliant. It is my belief that
+ * upward through 1.5.10 are Y2K compliant. It is my belief that
* earlier versions were also Y2K compliant.
*
- * Libpng only has three year fields. One is a 2-byte unsigned integer
- * that will hold years up to 65535. The other two hold the date in text
+ * Libpng only has two year fields. One is a 2-byte unsigned integer
+ * that will hold years up to 65535. The other holds the date in text
* format, and will hold years up to 9999.
*
* The integer is
* "png_uint_16 year" in png_time_struct.
*
- * The strings are
- * "png_charp time_buffer" in png_struct and
- * "near_time_buffer", which is a local character string in png.c.
+ * The string is
+ * "png_char time_buffer" in png_struct
*
* There are seven time-related functions:
* png.c: png_convert_to_rfc_1123() in png.c
@@ -326,7 +352,7 @@
* the full 4-digit year. There is a possibility that applications using
* libpng are not passing 4-digit years into the png_convert_to_rfc_1123()
* function, or that they are incorrectly passing only a 2-digit year
- * instead of "year - 1900" into the png_convert_from_struct_tm() function,
+ * instead of "year - 1900" into the png_convert_from_struct_tm() function,
* but this is not under our control. The libpng documentation has always
* stated that it works with 4-digit years, and the APIs have been
* documented as such.
@@ -349,12 +375,15 @@
* describes how to use libpng, and the file example.c summarizes it
* with some code on which to build. This file is useful for looking
* at the actual function definitions and structure components.
+ *
+ * If you just need to read a PNG file and don't want to read the documentation
+ * skip to the end of this file and read the section entitled 'simplified API'.
*/
/* Version information for png.h - this should match the version in png.c */
-#define PNG_LIBPNG_VER_STRING "1.5.1"
+#define PNG_LIBPNG_VER_STRING "1.5.10"
#define PNG_HEADER_VERSION_STRING \
- " libpng version 1.5.1 - February 3, 2011\n"
+ " libpng version 1.5.10 - March 29, 2012\n"
#define PNG_LIBPNG_VER_SONUM 15
#define PNG_LIBPNG_VER_DLLNUM 15
@@ -362,7 +391,8 @@
/* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */
#define PNG_LIBPNG_VER_MAJOR 1
#define PNG_LIBPNG_VER_MINOR 5
-#define PNG_LIBPNG_VER_RELEASE 1
+#define PNG_LIBPNG_VER_RELEASE 10
+
/* This should match the numeric part of the final component of
* PNG_LIBPNG_VER_STRING, omitting any leading zero:
*/
@@ -384,7 +414,7 @@
#define PNG_LIBPNG_BUILD_SPECIAL 32 /* Cannot be OR'ed with
PNG_LIBPNG_BUILD_PRIVATE */
-#define PNG_LIBPNG_BUILD_BASE_TYPE PNG_LIBPNG_BUILD_BETA
+#define PNG_LIBPNG_BUILD_BASE_TYPE PNG_LIBPNG_BUILD_STABLE
/* Careful here. At one time, Guy wanted to use 082, but that would be octal.
* We must not include leading zeros.
@@ -392,7 +422,7 @@
* version 1.0.0 was mis-numbered 100 instead of 10000). From
* version 1.0.1 it's xxyyzz, where x=major, y=minor, z=release
*/
-#define PNG_LIBPNG_VER 10501 /* 1.5.1 */
+#define PNG_LIBPNG_VER 10510 /* 1.5.10 */
/* Library configuration: these options cannot be changed after
* the library has been built.
@@ -405,19 +435,24 @@
#endif
#ifndef PNG_VERSION_INFO_ONLY
-/* Standard header files (not needed for the version info) */
-# ifdef PNG_SETJMP_SUPPORTED
-# include <setjmp.h>
+# ifndef PNG_BUILDING_SYMBOL_TABLE
+ /*
+ * Standard header files (not needed for the version info or while
+ * building symbol table -- see scripts/pnglibconf.dfa)
+ */
+# ifdef PNG_SETJMP_SUPPORTED
+# include <setjmp.h>
+# endif
+
+ /* Need the time information for converting tIME chunks, it
+ * defines struct tm:
+ */
+# ifdef PNG_CONVERT_tIME_SUPPORTED
+ /* "time.h" functions are not supported on all operating systems */
+# include <time.h>
+# endif
# endif
-/* Need the time information for converting tIME chunks, it
- * defines struct tm:
- */
-#ifdef PNG_CONVERT_tIME_SUPPORTED
- /* "time.h" functions are not supported on all operating systems */
-# include <time.h>
-#endif
-
/* Machine specific configuration. */
# include "pngconf.h"
#endif
@@ -509,7 +544,7 @@ extern "C" {
/* This triggers a compiler error in png.c, if png.c and png.h
* do not agree upon the version number.
*/
-typedef char* png_libpng_version_1_5_1;
+typedef char* png_libpng_version_1_5_10;
/* Three color definitions. The order of the red, green, and blue, (and the
* exact size) is not important, although the size of the fields need to
@@ -582,13 +617,22 @@ typedef PNG_CONST png_sPLT_t FAR * png_const_sPLT_tp;
typedef png_sPLT_t FAR * FAR * png_sPLT_tpp;
#ifdef PNG_TEXT_SUPPORTED
-/* png_text holds the contents of a text/ztxt/itxt chunk in a PNG file,
+/* png_text holds the contents of a text/ztxt/itxt chunk in a PNG file,
* and whether that contents is compressed or not. The "key" field
- * points to a regular zero-terminated C string. The "text", "lang", and
- * "lang_key" fields can be regular C strings, empty strings, or NULL pointers.
- * However, the * structure returned by png_get_text() will always contain
- * regular zero-terminated C strings (possibly empty), never NULL pointers,
- * so they can be safely used in printf() and other string-handling functions.
+ * points to a regular zero-terminated C string. The "text" fields can be a
+ * regular C string, an empty string, or a NULL pointer.
+ * However, the structure returned by png_get_text() will always contain
+ * the "text" field as a regular zero-terminated C string (possibly
+ * empty), never a NULL pointer, so it can be safely used in printf() and
+ * other string-handling functions. Note that the "itxt_length", "lang", and
+ * "lang_key" members of the structure only exist when the library is built
+ * with iTXt chunk support. Prior to libpng-1.4.0 the library was built by
+ * default without iTXt support. Also note that when iTXt *is* supported,
+ * the "lang" and "lang_key" fields contain NULL pointers when the
+ * "compression" field contains * PNG_TEXT_COMPRESSION_NONE or
+ * PNG_TEXT_COMPRESSION_zTXt. Note that the "compression value" is not the
+ * same as what appears in the PNG tEXt/zTXt/iTXt chunk's "compression flag"
+ * which is always 0 or 1, or its "compression method" which is always 0.
*/
typedef struct png_text_struct
{
@@ -657,12 +701,24 @@ typedef struct png_unknown_chunk_t
/* libpng-using applications should NOT directly modify this byte. */
png_byte location; /* mode of operation at read time */
}
+
+
png_unknown_chunk;
typedef png_unknown_chunk FAR * png_unknown_chunkp;
typedef PNG_CONST png_unknown_chunk FAR * png_const_unknown_chunkp;
typedef png_unknown_chunk FAR * FAR * png_unknown_chunkpp;
#endif
+/* Values for the unknown chunk location byte */
+
+#define PNG_HAVE_IHDR 0x01
+#define PNG_HAVE_PLTE 0x02
+#define PNG_AFTER_IDAT 0x08
+
+/* The complete definition of png_info has, as of libpng-1.5.0,
+ * been moved into a separate header file that is not accessible to
+ * applications. Read libpng-manual.txt or libpng.3 for more info.
+ */
typedef struct png_info_def png_info;
typedef png_info FAR * png_infop;
typedef PNG_CONST png_info FAR * png_const_infop;
@@ -678,6 +734,8 @@ typedef png_info FAR * FAR * png_infopp;
*/
#define PNG_FP_1 100000
#define PNG_FP_HALF 50000
+#define PNG_FP_MAX ((png_fixed_point)0x7fffffffL)
+#define PNG_FP_MIN (-PNG_FP_MAX)
/* These describe the color_type field in png_info. */
/* color type masks */
@@ -765,7 +823,7 @@ typedef png_info FAR * FAR * png_infopp;
#define PNG_INFO_iCCP 0x1000 /* ESR, 1.0.6 */
#define PNG_INFO_sPLT 0x2000 /* ESR, 1.0.6 */
#define PNG_INFO_sCAL 0x4000 /* ESR, 1.0.6 */
-#define PNG_INFO_IDAT 0x8000L /* ESR, 1.0.6 */
+#define PNG_INFO_IDAT 0x8000 /* ESR, 1.0.6 */
/* This is used for the transformation routines, as some of them
* change these values for the row. It also should enable using
@@ -784,6 +842,14 @@ typedef struct png_row_info_struct
typedef png_row_info FAR * png_row_infop;
typedef png_row_info FAR * FAR * png_row_infopp;
+/* The complete definition of png_struct has, as of libpng-1.5.0,
+ * been moved into a separate header file that is not accessible to
+ * applications. Read libpng-manual.txt or libpng.3 for more info.
+ */
+typedef struct png_struct_def png_struct;
+typedef PNG_CONST png_struct FAR * png_const_structp;
+typedef png_struct FAR * png_structp;
+
/* These are the function types for the I/O functions and for the functions
* that allow the user to override the default I/O functions with his or her
* own. The png_error_ptr type should match that of user-supplied warning
@@ -792,61 +858,59 @@ typedef png_row_info FAR * FAR * png_row_infopp;
* modify the buffer it is passed. The 'read' function, on the other hand, is
* expected to return the read data in the buffer.
*/
-typedef struct png_struct_def png_struct;
-typedef PNG_CONST png_struct FAR * png_const_structp;
-typedef png_struct FAR * png_structp;
-
-typedef PNG_CALLBACK(void, *png_error_ptr, (png_structp, png_const_charp), );
-typedef PNG_CALLBACK(void, *png_rw_ptr, (png_structp, png_bytep, png_size_t), );
-typedef PNG_CALLBACK(void, *png_flush_ptr, (png_structp), );
-typedef PNG_CALLBACK(void, *png_read_status_ptr, (png_structp, png_uint_32,
- int), );
-typedef PNG_CALLBACK(void, *png_write_status_ptr, (png_structp, png_uint_32,
- int), );
+typedef PNG_CALLBACK(void, *png_error_ptr, (png_structp, png_const_charp));
+typedef PNG_CALLBACK(void, *png_rw_ptr, (png_structp, png_bytep, png_size_t));
+typedef PNG_CALLBACK(void, *png_flush_ptr, (png_structp));
+typedef PNG_CALLBACK(void, *png_read_status_ptr, (png_structp, png_uint_32,
+ int));
+typedef PNG_CALLBACK(void, *png_write_status_ptr, (png_structp, png_uint_32,
+ int));
#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
-typedef PNG_CALLBACK(void, *png_progressive_info_ptr,
- (png_structp, png_infop), );
-typedef PNG_CALLBACK(void, *png_progressive_end_ptr,
- (png_structp, png_infop), );
-typedef PNG_CALLBACK(void, *png_progressive_row_ptr,
- (png_structp, png_bytep, png_uint_32, int), );
+typedef PNG_CALLBACK(void, *png_progressive_info_ptr, (png_structp, png_infop));
+typedef PNG_CALLBACK(void, *png_progressive_end_ptr, (png_structp, png_infop));
+
+/* The following callback receives png_uint_32 row_number, int pass for the
+ * png_bytep data of the row. When transforming an interlaced image the
+ * row number is the row number within the sub-image of the interlace pass, so
+ * the value will increase to the height of the sub-image (not the full image)
+ * then reset to 0 for the next pass.
+ *
+ * Use PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to
+ * find the output pixel (x,y) given an interlaced sub-image pixel
+ * (row,col,pass). (See below for these macros.)
+ */
+typedef PNG_CALLBACK(void, *png_progressive_row_ptr, (png_structp, png_bytep,
+ png_uint_32, int));
#endif
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
-typedef PNG_CALLBACK(void, *png_user_transform_ptr,
- (png_structp, png_row_infop, png_bytep), );
+typedef PNG_CALLBACK(void, *png_user_transform_ptr, (png_structp, png_row_infop,
+ png_bytep));
#endif
#ifdef PNG_USER_CHUNKS_SUPPORTED
-typedef PNG_CALLBACK(int, *png_user_chunk_ptr, (png_structp,
- png_unknown_chunkp), );
+typedef PNG_CALLBACK(int, *png_user_chunk_ptr, (png_structp,
+ png_unknown_chunkp));
#endif
#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED
-typedef PNG_CALLBACK(void, *png_unknown_chunk_ptr, (png_structp), );
+typedef PNG_CALLBACK(void, *png_unknown_chunk_ptr, (png_structp));
#endif
#ifdef PNG_SETJMP_SUPPORTED
-/* This must match the function definition in <setjmp.h>, and the
- * application must include this before png.h to obtain the definition
- * of jmp_buf. The function is required to be PNG_NORETURN. (Note that
- * PNG_PTR_NORETURN is used here because current versions of the Microsoft
- * C compiler do not support the PNG_NORETURN attribute on a pointer.)
- *
- * If you get a type warning from the compiler when linking against this line
- * then your compiler has 'longjmp' that does not match the requirements of the
- * compiler that built libpng. You will have to write a wrapper function for
- * your compiler's longjmp and call png_set_longjmp_fn directly (not via the
- * png_jmpbuf macro.)
- *
- * If you get a warning here while building the library you will need to make
+/* This must match the function definition in <setjmp.h>, and the application
+ * must include this before png.h to obtain the definition of jmp_buf. The
+ * function is required to be PNG_NORETURN, but this is not checked. If the
+ * function does return the application will crash via an abort() or similar
+ * system level call.
+ *
+ * If you get a warning here while building the library you may need to make
* changes to ensure that pnglibconf.h records the calling convention used by
* your compiler. This may be very difficult - try using a different compiler
* to build the library!
*/
-typedef PNG_FUNCTION(void, (PNGCAPI *png_longjmp_ptr), PNGARG((jmp_buf, int)),
- PNG_PTR_NORETURN);
+PNG_FUNCTION(void, (PNGCAPI *png_longjmp_ptr), PNGARG((jmp_buf, int)), typedef);
#endif
/* Transform masks for the high-level interface */
@@ -868,21 +932,24 @@ typedef PNG_FUNCTION(void, (PNGCAPI *png_longjmp_ptr), PNGARG((jmp_buf, int)),
#define PNG_TRANSFORM_STRIP_FILLER_AFTER 0x1000 /* write only */
/* Added to libpng-1.4.0 */
#define PNG_TRANSFORM_GRAY_TO_RGB 0x2000 /* read only */
+/* Added to libpng-1.5.4 */
+#define PNG_TRANSFORM_EXPAND_16 0x4000 /* read only */
+#define PNG_TRANSFORM_SCALE_16 0x8000 /* read only */
/* Flags for MNG supported features */
#define PNG_FLAG_MNG_EMPTY_PLTE 0x01
#define PNG_FLAG_MNG_FILTER_64 0x04
#define PNG_ALL_MNG_FEATURES 0x05
-/* NOTE: prior to 1.5 these functions had no 'API' style declaration,
+/* NOTE: prior to 1.5 these functions had no 'API' style declaration,
* this allowed the zlib default functions to be used on Windows
* platforms. In 1.5 the zlib default malloc (which just calls malloc and
* ignores the first argument) should be completely compatible with the
* following.
*/
-typedef PNG_CALLBACK(png_voidp, *png_malloc_ptr, (png_structp,
- png_alloc_size_t), );
-typedef PNG_CALLBACK(void, *png_free_ptr, (png_structp, png_voidp), );
+typedef PNG_CALLBACK(png_voidp, *png_malloc_ptr, (png_structp,
+ png_alloc_size_t));
+typedef PNG_CALLBACK(void, *png_free_ptr, (png_structp, png_voidp));
typedef png_struct FAR * FAR * png_structpp;
@@ -928,7 +995,7 @@ PNG_EXPORT(2, void, png_set_sig_bytes, (png_structp png_ptr, int num_bytes));
* signature, and non-zero otherwise. Having num_to_check == 0 or
* start > 7 will always fail (ie return non-zero).
*/
-PNG_EXPORT(3, int, png_sig_cmp, (png_const_bytep sig, png_size_t start,
+PNG_EXPORT(3, int, png_sig_cmp, (png_const_bytep sig, png_size_t start,
png_size_t num_to_check));
/* Simple signature checking function. This is the same as calling
@@ -939,19 +1006,19 @@ PNG_EXPORT(3, int, png_sig_cmp, (png_const_bytep sig, png_size_t start,
/* Allocate and initialize png_ptr struct for reading, and any other memory. */
PNG_EXPORTA(4, png_structp, png_create_read_struct,
(png_const_charp user_png_ver, png_voidp error_ptr,
- png_error_ptr error_fn, png_error_ptr warn_fn),
+ png_error_ptr error_fn, png_error_ptr warn_fn),
PNG_ALLOCATED);
/* Allocate and initialize png_ptr struct for writing, and any other memory */
PNG_EXPORTA(5, png_structp, png_create_write_struct,
(png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn,
- png_error_ptr warn_fn),
+ png_error_ptr warn_fn),
PNG_ALLOCATED);
PNG_EXPORT(6, png_size_t, png_get_compression_buffer_size,
(png_const_structp png_ptr));
-PNG_EXPORT(7, void, png_set_compression_buffer_size, (png_structp png_ptr,
+PNG_EXPORT(7, void, png_set_compression_buffer_size, (png_structp png_ptr,
png_size_t size));
/* Moved from pngconf.h in 1.4.0 and modified to ensure setjmp/longjmp
@@ -965,7 +1032,7 @@ PNG_EXPORT(7, void, png_set_compression_buffer_size, (png_structp png_ptr,
* allocated by the library - the call will return NULL on a mismatch
* indicating an ABI mismatch.
*/
-PNG_EXPORT(8, jmp_buf*, png_set_longjmp_fn, (png_structp png_ptr,
+PNG_EXPORT(8, jmp_buf*, png_set_longjmp_fn, (png_structp png_ptr,
png_longjmp_ptr longjmp_fn, size_t jmp_buf_size));
# define png_jmpbuf(png_ptr) \
(*png_set_longjmp_fn((png_ptr), longjmp, sizeof (jmp_buf)))
@@ -990,13 +1057,13 @@ PNG_EXPORT(10, int, png_reset_zstream, (png_structp png_ptr));
#ifdef PNG_USER_MEM_SUPPORTED
PNG_EXPORTA(11, png_structp, png_create_read_struct_2,
(png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn,
- png_error_ptr warn_fn,
- png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn),
+ png_error_ptr warn_fn,
+ png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn),
PNG_ALLOCATED);
PNG_EXPORTA(12, png_structp, png_create_write_struct_2,
(png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn,
- png_error_ptr warn_fn,
- png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn),
+ png_error_ptr warn_fn,
+ png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn),
PNG_ALLOCATED);
#endif
@@ -1008,7 +1075,7 @@ PNG_EXPORT(14, void, png_write_chunk, (png_structp png_ptr, png_const_bytep
chunk_name, png_const_bytep data, png_size_t length));
/* Write the start of a PNG chunk - length and chunk name. */
-PNG_EXPORT(15, void, png_write_chunk_start, (png_structp png_ptr,
+PNG_EXPORT(15, void, png_write_chunk_start, (png_structp png_ptr,
png_const_bytep chunk_name, png_uint_32 length));
/* Write the data of a PNG chunk started with png_write_chunk_start(). */
@@ -1019,10 +1086,10 @@ PNG_EXPORT(16, void, png_write_chunk_data, (png_structp png_ptr,
PNG_EXPORT(17, void, png_write_chunk_end, (png_structp png_ptr));
/* Allocate and initialize the info structure */
-PNG_EXPORTA(18, png_infop, png_create_info_struct, (png_structp png_ptr),
+PNG_EXPORTA(18, png_infop, png_create_info_struct, (png_structp png_ptr),
PNG_ALLOCATED);
-PNG_EXPORT(19, void, png_info_init_3, (png_infopp info_ptr,
+PNG_EXPORT(19, void, png_info_init_3, (png_infopp info_ptr,
png_size_t png_info_struct_size));
/* Writes all the PNG information before the image. */
@@ -1039,13 +1106,13 @@ PNG_EXPORT(22, void, png_read_info,
#ifdef PNG_TIME_RFC1123_SUPPORTED
PNG_EXPORT(23, png_const_charp, png_convert_to_rfc1123,
- (png_structp png_ptr,
+ (png_structp png_ptr,
png_const_timep ptime));
#endif
#ifdef PNG_CONVERT_tIME_SUPPORTED
/* Convert from a struct tm to png_time */
-PNG_EXPORT(24, void, png_convert_from_struct_tm, (png_timep ptime,
+PNG_EXPORT(24, void, png_convert_from_struct_tm, (png_timep ptime,
PNG_CONST struct tm FAR * ttime));
/* Convert from time_t to png_time. Uses gmtime() */
@@ -1061,6 +1128,13 @@ PNG_EXPORT(28, void, png_set_palette_to_rgb, (png_structp png_ptr));
PNG_EXPORT(29, void, png_set_tRNS_to_alpha, (png_structp png_ptr));
#endif
+#ifdef PNG_READ_EXPAND_16_SUPPORTED
+/* Expand to 16-bit channels, forces conversion of palette to RGB and expansion
+ * of a tRNS chunk if present.
+ */
+PNG_EXPORT(221, void, png_set_expand_16, (png_structp png_ptr));
+#endif
+
#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
/* Use blue, green, red order for pixels. */
PNG_EXPORT(30, void, png_set_bgr, (png_structp png_ptr));
@@ -1073,17 +1147,233 @@ PNG_EXPORT(31, void, png_set_gray_to_rgb, (png_structp png_ptr));
#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
/* Reduce RGB to grayscale. */
+#define PNG_ERROR_ACTION_NONE 1
+#define PNG_ERROR_ACTION_WARN 2
+#define PNG_ERROR_ACTION_ERROR 3
+#define PNG_RGB_TO_GRAY_DEFAULT (-1)/*for red/green coefficients*/
+
PNG_FP_EXPORT(32, void, png_set_rgb_to_gray, (png_structp png_ptr,
int error_action, double red, double green));
-PNG_FIXED_EXPORT(33, void, png_set_rgb_to_gray_fixed, (png_structp png_ptr,
+PNG_FIXED_EXPORT(33, void, png_set_rgb_to_gray_fixed, (png_structp png_ptr,
int error_action, png_fixed_point red, png_fixed_point green));
PNG_EXPORT(34, png_byte, png_get_rgb_to_gray_status, (png_const_structp
png_ptr));
#endif
-PNG_EXPORT(35, void, png_build_grayscale_palette, (int bit_depth,
+#ifdef PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED
+PNG_EXPORT(35, void, png_build_grayscale_palette, (int bit_depth,
png_colorp palette));
+#endif
+
+#ifdef PNG_READ_ALPHA_MODE_SUPPORTED
+/* How the alpha channel is interpreted - this affects how the color channels of
+ * a PNG file are returned when an alpha channel, or tRNS chunk in a palette
+ * file, is present.
+ *
+ * This has no effect on the way pixels are written into a PNG output
+ * datastream. The color samples in a PNG datastream are never premultiplied
+ * with the alpha samples.
+ *
+ * The default is to return data according to the PNG specification: the alpha
+ * channel is a linear measure of the contribution of the pixel to the
+ * corresponding composited pixel. The gamma encoded color channels must be
+ * scaled according to the contribution and to do this it is necessary to undo
+ * the encoding, scale the color values, perform the composition and reencode
+ * the values. This is the 'PNG' mode.
+ *
+ * The alternative is to 'associate' the alpha with the color information by
+ * storing color channel values that have been scaled by the alpha. The
+ * advantage is that the color channels can be resampled (the image can be
+ * scaled) in this form. The disadvantage is that normal practice is to store
+ * linear, not (gamma) encoded, values and this requires 16-bit channels for
+ * still images rather than the 8-bit channels that are just about sufficient if
+ * gamma encoding is used. In addition all non-transparent pixel values,
+ * including completely opaque ones, must be gamma encoded to produce the final
+ * image. This is the 'STANDARD', 'ASSOCIATED' or 'PREMULTIPLIED' mode (the
+ * latter being the two common names for associated alpha color channels.)
+ *
+ * Since it is not necessary to perform arithmetic on opaque color values so
+ * long as they are not to be resampled and are in the final color space it is
+ * possible to optimize the handling of alpha by storing the opaque pixels in
+ * the PNG format (adjusted for the output color space) while storing partially
+ * opaque pixels in the standard, linear, format. The accuracy required for
+ * standard alpha composition is relatively low, because the pixels are
+ * isolated, therefore typically the accuracy loss in storing 8-bit linear
+ * values is acceptable. (This is not true if the alpha channel is used to
+ * simulate transparency over large areas - use 16 bits or the PNG mode in
+ * this case!) This is the 'OPTIMIZED' mode. For this mode a pixel is
+ * treated as opaque only if the alpha value is equal to the maximum value.
+ *
+ * The final choice is to gamma encode the alpha channel as well. This is
+ * broken because, in practice, no implementation that uses this choice
+ * correctly undoes the encoding before handling alpha composition. Use this
+ * choice only if other serious errors in the software or hardware you use
+ * mandate it; the typical serious error is for dark halos to appear around
+ * opaque areas of the composited PNG image because of arithmetic overflow.
+ *
+ * The API function png_set_alpha_mode specifies which of these choices to use
+ * with an enumerated 'mode' value and the gamma of the required output:
+ */
+#define PNG_ALPHA_PNG 0 /* according to the PNG standard */
+#define PNG_ALPHA_STANDARD 1 /* according to Porter/Duff */
+#define PNG_ALPHA_ASSOCIATED 1 /* as above; this is the normal practice */
+#define PNG_ALPHA_PREMULTIPLIED 1 /* as above */
+#define PNG_ALPHA_OPTIMIZED 2 /* 'PNG' for opaque pixels, else 'STANDARD' */
+#define PNG_ALPHA_BROKEN 3 /* the alpha channel is gamma encoded */
+
+PNG_FP_EXPORT(227, void, png_set_alpha_mode, (png_structp png_ptr, int mode,
+ double output_gamma));
+PNG_FIXED_EXPORT(228, void, png_set_alpha_mode_fixed, (png_structp png_ptr,
+ int mode, png_fixed_point output_gamma));
+#endif
+
+#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_ALPHA_MODE_SUPPORTED)
+/* The output_gamma value is a screen gamma in libpng terminology: it expresses
+ * how to decode the output values, not how they are encoded. The values used
+ * correspond to the normal numbers used to describe the overall gamma of a
+ * computer display system; for example 2.2 for an sRGB conformant system. The
+ * values are scaled by 100000 in the _fixed version of the API (so 220000 for
+ * sRGB.)
+ *
+ * The inverse of the value is always used to provide a default for the PNG file
+ * encoding if it has no gAMA chunk and if png_set_gamma() has not been called
+ * to override the PNG gamma information.
+ *
+ * When the ALPHA_OPTIMIZED mode is selected the output gamma is used to encode
+ * opaque pixels however pixels with lower alpha values are not encoded,
+ * regardless of the output gamma setting.
+ *
+ * When the standard Porter Duff handling is requested with mode 1 the output
+ * encoding is set to be linear and the output_gamma value is only relevant
+ * as a default for input data that has no gamma information. The linear output
+ * encoding will be overridden if png_set_gamma() is called - the results may be
+ * highly unexpected!
+ *
+ * The following numbers are derived from the sRGB standard and the research
+ * behind it. sRGB is defined to be approximated by a PNG gAMA chunk value of
+ * 0.45455 (1/2.2) for PNG. The value implicitly includes any viewing
+ * correction required to take account of any differences in the color
+ * environment of the original scene and the intended display environment; the
+ * value expresses how to *decode* the image for display, not how the original
+ * data was *encoded*.
+ *
+ * sRGB provides a peg for the PNG standard by defining a viewing environment.
+ * sRGB itself, and earlier TV standards, actually use a more complex transform
+ * (a linear portion then a gamma 2.4 power law) than PNG can express. (PNG is
+ * limited to simple power laws.) By saying that an image for direct display on
+ * an sRGB conformant system should be stored with a gAMA chunk value of 45455
+ * (11.3.3.2 and 11.3.3.5 of the ISO PNG specification) the PNG specification
+ * makes it possible to derive values for other display systems and
+ * environments.
+ *
+ * The Mac value is deduced from the sRGB based on an assumption that the actual
+ * extra viewing correction used in early Mac display systems was implemented as
+ * a power 1.45 lookup table.
+ *
+ * Any system where a programmable lookup table is used or where the behavior of
+ * the final display device characteristics can be changed requires system
+ * specific code to obtain the current characteristic. However this can be
+ * difficult and most PNG gamma correction only requires an approximate value.
+ *
+ * By default, if png_set_alpha_mode() is not called, libpng assumes that all
+ * values are unencoded, linear, values and that the output device also has a
+ * linear characteristic. This is only very rarely correct - it is invariably
+ * better to call png_set_alpha_mode() with PNG_DEFAULT_sRGB than rely on the
+ * default if you don't know what the right answer is!
+ *
+ * The special value PNG_GAMMA_MAC_18 indicates an older Mac system (pre Mac OS
+ * 10.6) which used a correction table to implement a somewhat lower gamma on an
+ * otherwise sRGB system.
+ *
+ * Both these values are reserved (not simple gamma values) in order to allow
+ * more precise correction internally in the future.
+ *
+ * NOTE: the following values can be passed to either the fixed or floating
+ * point APIs, but the floating point API will also accept floating point
+ * values.
+ */
+#define PNG_DEFAULT_sRGB -1 /* sRGB gamma and color space */
+#define PNG_GAMMA_MAC_18 -2 /* Old Mac '1.8' gamma and color space */
+#define PNG_GAMMA_sRGB 220000 /* Television standards--matches sRGB gamma */
+#define PNG_GAMMA_LINEAR PNG_FP_1 /* Linear */
+#endif
+
+/* The following are examples of calls to png_set_alpha_mode to achieve the
+ * required overall gamma correction and, where necessary, alpha
+ * premultiplication.
+ *
+ * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB);
+ * This is the default libpng handling of the alpha channel - it is not
+ * pre-multiplied into the color components. In addition the call states
+ * that the output is for a sRGB system and causes all PNG files without gAMA
+ * chunks to be assumed to be encoded using sRGB.
+ *
+ * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC);
+ * In this case the output is assumed to be something like an sRGB conformant
+ * display preceeded by a power-law lookup table of power 1.45. This is how
+ * early Mac systems behaved.
+ *
+ * png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_GAMMA_LINEAR);
+ * This is the classic Jim Blinn approach and will work in academic
+ * environments where everything is done by the book. It has the shortcoming
+ * of assuming that input PNG data with no gamma information is linear - this
+ * is unlikely to be correct unless the PNG files where generated locally.
+ * Most of the time the output precision will be so low as to show
+ * significant banding in dark areas of the image.
+ *
+ * png_set_expand_16(pp);
+ * png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_DEFAULT_sRGB);
+ * This is a somewhat more realistic Jim Blinn inspired approach. PNG files
+ * are assumed to have the sRGB encoding if not marked with a gamma value and
+ * the output is always 16 bits per component. This permits accurate scaling
+ * and processing of the data. If you know that your input PNG files were
+ * generated locally you might need to replace PNG_DEFAULT_sRGB with the
+ * correct value for your system.
+ *
+ * png_set_alpha_mode(pp, PNG_ALPHA_OPTIMIZED, PNG_DEFAULT_sRGB);
+ * If you just need to composite the PNG image onto an existing background
+ * and if you control the code that does this you can use the optimization
+ * setting. In this case you just copy completely opaque pixels to the
+ * output. For pixels that are not completely transparent (you just skip
+ * those) you do the composition math using png_composite or png_composite_16
+ * below then encode the resultant 8-bit or 16-bit values to match the output
+ * encoding.
+ *
+ * Other cases
+ * If neither the PNG nor the standard linear encoding work for you because
+ * of the software or hardware you use then you have a big problem. The PNG
+ * case will probably result in halos around the image. The linear encoding
+ * will probably result in a washed out, too bright, image (it's actually too
+ * contrasty.) Try the ALPHA_OPTIMIZED mode above - this will probably
+ * substantially reduce the halos. Alternatively try:
+ *
+ * png_set_alpha_mode(pp, PNG_ALPHA_BROKEN, PNG_DEFAULT_sRGB);
+ * This option will also reduce the halos, but there will be slight dark
+ * halos round the opaque parts of the image where the background is light.
+ * In the OPTIMIZED mode the halos will be light halos where the background
+ * is dark. Take your pick - the halos are unavoidable unless you can get
+ * your hardware/software fixed! (The OPTIMIZED approach is slightly
+ * faster.)
+ *
+ * When the default gamma of PNG files doesn't match the output gamma.
+ * If you have PNG files with no gamma information png_set_alpha_mode allows
+ * you to provide a default gamma, but it also sets the ouput gamma to the
+ * matching value. If you know your PNG files have a gamma that doesn't
+ * match the output you can take advantage of the fact that
+ * png_set_alpha_mode always sets the output gamma but only sets the PNG
+ * default if it is not already set:
+ *
+ * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB);
+ * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC);
+ * The first call sets both the default and the output gamma values, the
+ * second call overrides the output gamma without changing the default. This
+ * is easier than achieving the same effect with png_set_gamma. You must use
+ * PNG_ALPHA_PNG for the first call - internal checking in png_set_alpha will
+ * fire if more than one call to png_set_alpha_mode and png_set_background is
+ * made in the same read operation, however multiple calls with PNG_ALPHA_PNG
+ * are ignored.
+ */
#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
PNG_EXPORT(36, void, png_set_strip_alpha, (png_structp png_ptr));
@@ -1101,14 +1391,14 @@ PNG_EXPORT(38, void, png_set_invert_alpha, (png_structp png_ptr));
#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
/* Add a filler byte to 8-bit Gray or 24-bit RGB images. */
-PNG_EXPORT(39, void, png_set_filler, (png_structp png_ptr, png_uint_32 filler,
+PNG_EXPORT(39, void, png_set_filler, (png_structp png_ptr, png_uint_32 filler,
int flags));
/* The values of the PNG_FILLER_ defines should NOT be changed */
# define PNG_FILLER_BEFORE 0
# define PNG_FILLER_AFTER 1
/* Add an alpha byte to 8-bit Gray or 24-bit RGB images. */
PNG_EXPORT(40, void, png_set_add_alpha,
- (png_structp png_ptr, png_uint_32 filler,
+ (png_structp png_ptr, png_uint_32 filler,
int flags));
#endif /* PNG_READ_FILLER_SUPPORTED || PNG_WRITE_FILLER_SUPPORTED */
@@ -1151,12 +1441,16 @@ PNG_EXPORT(46, void, png_set_invert_mono, (png_structp png_ptr));
#endif
#ifdef PNG_READ_BACKGROUND_SUPPORTED
-/* Handle alpha and tRNS by replacing with a background color. */
-PNG_FP_EXPORT(47, void, png_set_background, (png_structp png_ptr,
- png_const_color_16p background_color, int background_gamma_code,
+/* Handle alpha and tRNS by replacing with a background color. Prior to
+ * libpng-1.5.4 this API must not be called before the PNG file header has been
+ * read. Doing so will result in unexpected behavior and possible warnings or
+ * errors if the PNG file contains a bKGD chunk.
+ */
+PNG_FP_EXPORT(47, void, png_set_background, (png_structp png_ptr,
+ png_const_color_16p background_color, int background_gamma_code,
int need_expand, double background_gamma));
PNG_FIXED_EXPORT(215, void, png_set_background_fixed, (png_structp png_ptr,
- png_const_color_16p background_color, int background_gamma_code,
+ png_const_color_16p background_color, int background_gamma_code,
int need_expand, png_fixed_point background_gamma));
#endif
#ifdef PNG_READ_BACKGROUND_SUPPORTED
@@ -1166,7 +1460,13 @@ PNG_FIXED_EXPORT(215, void, png_set_background_fixed, (png_structp png_ptr,
# define PNG_BACKGROUND_GAMMA_UNIQUE 3
#endif
-#ifdef PNG_READ_16_TO_8_SUPPORTED
+#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
+/* Scale a 16-bit depth file down to 8-bit, accurately. */
+PNG_EXPORT(229, void, png_set_scale_16, (png_structp png_ptr));
+#endif
+
+#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
+#define PNG_READ_16_TO_8 SUPPORTED /* Name prior to 1.5.4 */
/* Strip the second byte of information from a 16-bit depth file. */
PNG_EXPORT(48, void, png_set_strip_16, (png_structp png_ptr));
#endif
@@ -1176,8 +1476,8 @@ PNG_EXPORT(48, void, png_set_strip_16, (png_structp png_ptr));
* available.
*/
PNG_EXPORT(49, void, png_set_quantize,
- (png_structp png_ptr, png_colorp palette,
- int num_palette, int maximum_colors, png_const_uint_16p histogram,
+ (png_structp png_ptr, png_colorp palette,
+ int num_palette, int maximum_colors, png_const_uint_16p histogram,
int full_quantize));
#endif
@@ -1187,12 +1487,22 @@ PNG_EXPORT(49, void, png_set_quantize,
*/
#define PNG_GAMMA_THRESHOLD (PNG_GAMMA_THRESHOLD_FIXED*.00001)
-/* Handle gamma correction. Screen_gamma=(display_exponent) */
+/* Handle gamma correction. Screen_gamma=(display_exponent).
+ * NOTE: this API simply sets the screen and file gamma values. It will
+ * therefore override the value for gamma in a PNG file if it is called after
+ * the file header has been read - use with care - call before reading the PNG
+ * file for best results!
+ *
+ * These routines accept the same gamma values as png_set_alpha_mode (described
+ * above). The PNG_GAMMA_ defines and PNG_DEFAULT_sRGB can be passed to either
+ * API (floating point or fixed.) Notice, however, that the 'file_gamma' value
+ * is the inverse of a 'screen gamma' value.
+ */
PNG_FP_EXPORT(50, void, png_set_gamma,
- (png_structp png_ptr, double screen_gamma,
- double default_file_gamma));
-PNG_FIXED_EXPORT(208, void, png_set_gamma_fixed, (png_structp png_ptr,
- png_fixed_point screen_gamma, png_fixed_point default_file_gamma));
+ (png_structp png_ptr, double screen_gamma,
+ double override_file_gamma));
+PNG_FIXED_EXPORT(208, void, png_set_gamma_fixed, (png_structp png_ptr,
+ png_fixed_point screen_gamma, png_fixed_point override_file_gamma));
#endif
#ifdef PNG_WRITE_FLUSH_SUPPORTED
@@ -1211,13 +1521,13 @@ PNG_EXPORT(54, void, png_read_update_info,
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
/* Read one or more rows of image data. */
-PNG_EXPORT(55, void, png_read_rows, (png_structp png_ptr, png_bytepp row,
+PNG_EXPORT(55, void, png_read_rows, (png_structp png_ptr, png_bytepp row,
png_bytepp display_row, png_uint_32 num_rows));
#endif
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
/* Read a row of data. */
-PNG_EXPORT(56, void, png_read_row, (png_structp png_ptr, png_bytep row,
+PNG_EXPORT(56, void, png_read_row, (png_structp png_ptr, png_bytep row,
png_bytep display_row));
#endif
@@ -1235,7 +1545,7 @@ PNG_EXPORT(58, void, png_write_row,
* of libpng and to allow the 'display_row' array from read_rows to be passed
* unchanged to write_rows.
*/
-PNG_EXPORT(59, void, png_write_rows, (png_structp png_ptr, png_bytepp row,
+PNG_EXPORT(59, void, png_write_rows, (png_structp png_ptr, png_bytepp row,
png_uint_32 num_rows));
/* Write the image data */
@@ -1252,15 +1562,15 @@ PNG_EXPORT(62, void, png_read_end, (png_structp png_ptr, png_infop info_ptr));
#endif
/* Free any memory associated with the png_info_struct */
-PNG_EXPORT(63, void, png_destroy_info_struct, (png_structp png_ptr,
+PNG_EXPORT(63, void, png_destroy_info_struct, (png_structp png_ptr,
png_infopp info_ptr_ptr));
/* Free any memory associated with the png_struct and the png_info_structs */
-PNG_EXPORT(64, void, png_destroy_read_struct, (png_structpp png_ptr_ptr,
+PNG_EXPORT(64, void, png_destroy_read_struct, (png_structpp png_ptr_ptr,
png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr));
/* Free any memory associated with the png_struct and the png_info_structs */
-PNG_EXPORT(65, void, png_destroy_write_struct, (png_structpp png_ptr_ptr,
+PNG_EXPORT(65, void, png_destroy_write_struct, (png_structpp png_ptr_ptr,
png_infopp info_ptr_ptr));
/* Set the libpng method of handling chunk CRC errors */
@@ -1270,7 +1580,7 @@ PNG_EXPORT(66, void, png_set_crc_action,
/* Values for png_set_crc_action() say how to handle CRC errors in
* ancillary and critical chunks, and whether to use the data contained
* therein. Note that it is impossible to "discard" data in a critical
- * chunk. For versions prior to 0.90, the action was always error/quit,
+ * chunk. For versions prior to 0.90, the action was always error/quit,
* whereas in version 0.90 and later, the action for CRC errors in ancillary
* chunks is warn/discard. These values should NOT be changed.
*
@@ -1350,11 +1660,11 @@ PNG_EXPORT(67, void, png_set_filter,
* the weights and costs are set to 1.0, this degenerates the WEIGHTED method
* to the UNWEIGHTED method, but with added encoding time/computation.
*/
-PNG_FP_EXPORT(68, void, png_set_filter_heuristics, (png_structp png_ptr,
- int heuristic_method, int num_weights, png_const_doublep filter_weights,
+PNG_FP_EXPORT(68, void, png_set_filter_heuristics, (png_structp png_ptr,
+ int heuristic_method, int num_weights, png_const_doublep filter_weights,
png_const_doublep filter_costs));
PNG_FIXED_EXPORT(209, void, png_set_filter_heuristics_fixed,
- (png_structp png_ptr,
+ (png_structp png_ptr,
int heuristic_method, int num_weights, png_const_fixed_point_p
filter_weights, png_const_fixed_point_p filter_costs));
#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */
@@ -1367,30 +1677,56 @@ PNG_FIXED_EXPORT(209, void, png_set_filter_heuristics_fixed,
#define PNG_FILTER_HEURISTIC_WEIGHTED 2 /* Experimental feature */
#define PNG_FILTER_HEURISTIC_LAST 3 /* Not a valid value */
+#ifdef PNG_WRITE_SUPPORTED
/* Set the library compression level. Currently, valid values range from
* 0 - 9, corresponding directly to the zlib compression levels 0 - 9
* (0 - no compression, 9 - "maximal" compression). Note that tests have
* shown that zlib compression levels 3-6 usually perform as well as level 9
- * for PNG images, and do considerably fewer caclulations. In the future,
+ * for PNG images, and do considerably fewer caclulations. In the future,
* these values may not correspond directly to the zlib compression levels.
*/
PNG_EXPORT(69, void, png_set_compression_level,
(png_structp png_ptr, int level));
-PNG_EXPORT(70, void, png_set_compression_mem_level, (png_structp png_ptr,
+PNG_EXPORT(70, void, png_set_compression_mem_level, (png_structp png_ptr,
int mem_level));
-PNG_EXPORT(71, void, png_set_compression_strategy, (png_structp png_ptr,
+PNG_EXPORT(71, void, png_set_compression_strategy, (png_structp png_ptr,
int strategy));
-PNG_EXPORT(72, void, png_set_compression_window_bits, (png_structp png_ptr,
+/* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a
+ * smaller value of window_bits if it can do so safely.
+ */
+PNG_EXPORT(72, void, png_set_compression_window_bits, (png_structp png_ptr,
int window_bits));
PNG_EXPORT(73, void, png_set_compression_method, (png_structp png_ptr,
int method));
+#endif
+
+#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED
+/* Also set zlib parameters for compressing non-IDAT chunks */
+PNG_EXPORT(222, void, png_set_text_compression_level,
+ (png_structp png_ptr, int level));
+
+PNG_EXPORT(223, void, png_set_text_compression_mem_level, (png_structp png_ptr,
+ int mem_level));
+
+PNG_EXPORT(224, void, png_set_text_compression_strategy, (png_structp png_ptr,
+ int strategy));
+
+/* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a
+ * smaller value of window_bits if it can do so safely.
+ */
+PNG_EXPORT(225, void, png_set_text_compression_window_bits, (png_structp
+ png_ptr, int window_bits));
+
+PNG_EXPORT(226, void, png_set_text_compression_method, (png_structp png_ptr,
+ int method));
+#endif /* PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED */
/* These next functions are called for input/output, memory, and error
- * handling. They are in the file pngrio.c, pngwio.c, and pngerror.c,
+ * handling. They are in the file pngrio.c, pngwio.c, and pngerror.c,
* and call standard C I/O routines such as fread(), fwrite(), and
* fprintf(). These functions can be made to use other I/O routines
* at run time for those applications that need to handle I/O in a
@@ -1412,7 +1748,7 @@ PNG_EXPORT(74, void, png_init_io, (png_structp png_ptr, png_FILE_p fp));
*/
PNG_EXPORT(75, void, png_set_error_fn,
- (png_structp png_ptr, png_voidp error_ptr,
+ (png_structp png_ptr, png_voidp error_ptr,
png_error_ptr error_fn, png_error_ptr warning_fn));
/* Return the user pointer associated with the error functions */
@@ -1428,43 +1764,43 @@ PNG_EXPORT(76, png_voidp, png_get_error_ptr, (png_const_structp png_ptr));
* default flush function, which uses the standard *FILE structure, will
* be used.
*/
-PNG_EXPORT(77, void, png_set_write_fn, (png_structp png_ptr, png_voidp io_ptr,
+PNG_EXPORT(77, void, png_set_write_fn, (png_structp png_ptr, png_voidp io_ptr,
png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn));
/* Replace the default data input function with a user supplied one. */
-PNG_EXPORT(78, void, png_set_read_fn, (png_structp png_ptr, png_voidp io_ptr,
+PNG_EXPORT(78, void, png_set_read_fn, (png_structp png_ptr, png_voidp io_ptr,
png_rw_ptr read_data_fn));
/* Return the user pointer associated with the I/O functions */
PNG_EXPORT(79, png_voidp, png_get_io_ptr, (png_structp png_ptr));
-PNG_EXPORT(80, void, png_set_read_status_fn, (png_structp png_ptr,
+PNG_EXPORT(80, void, png_set_read_status_fn, (png_structp png_ptr,
png_read_status_ptr read_row_fn));
-PNG_EXPORT(81, void, png_set_write_status_fn, (png_structp png_ptr,
+PNG_EXPORT(81, void, png_set_write_status_fn, (png_structp png_ptr,
png_write_status_ptr write_row_fn));
#ifdef PNG_USER_MEM_SUPPORTED
/* Replace the default memory allocation functions with user supplied one(s). */
-PNG_EXPORT(82, void, png_set_mem_fn, (png_structp png_ptr, png_voidp mem_ptr,
+PNG_EXPORT(82, void, png_set_mem_fn, (png_structp png_ptr, png_voidp mem_ptr,
png_malloc_ptr malloc_fn, png_free_ptr free_fn));
/* Return the user pointer associated with the memory functions */
PNG_EXPORT(83, png_voidp, png_get_mem_ptr, (png_const_structp png_ptr));
#endif
#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
-PNG_EXPORT(84, void, png_set_read_user_transform_fn, (png_structp png_ptr,
+PNG_EXPORT(84, void, png_set_read_user_transform_fn, (png_structp png_ptr,
png_user_transform_ptr read_user_transform_fn));
#endif
#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED
-PNG_EXPORT(85, void, png_set_write_user_transform_fn, (png_structp png_ptr,
+PNG_EXPORT(85, void, png_set_write_user_transform_fn, (png_structp png_ptr,
png_user_transform_ptr write_user_transform_fn));
#endif
#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
-PNG_EXPORT(86, void, png_set_user_transform_info, (png_structp png_ptr,
- png_voidp user_transform_ptr, int user_transform_depth,
+PNG_EXPORT(86, void, png_set_user_transform_info, (png_structp png_ptr,
+ png_voidp user_transform_ptr, int user_transform_depth,
int user_transform_channels));
/* Return the user pointer associated with the user transform functions */
PNG_EXPORT(87, png_voidp, png_get_user_transform_ptr,
@@ -1475,16 +1811,20 @@ PNG_EXPORT(87, png_voidp, png_get_user_transform_ptr,
/* Return information about the row currently being processed. Note that these
* APIs do not fail but will return unexpected results if called outside a user
* transform callback. Also note that when transforming an interlaced image the
- * row number is still the row in the final, de-interlaced, image but the row
- * only contains the data of the current pass - consult png_row_info for the
- * actual width of the row!
+ * row number is the row number within the sub-image of the interlace pass, so
+ * the value will increase to the height of the sub-image (not the full image)
+ * then reset to 0 for the next pass.
+ *
+ * Use PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to
+ * find the output pixel (x,y) given an interlaced sub-image pixel
+ * (row,col,pass). (See below for these macros.)
*/
PNG_EXPORT(217, png_uint_32, png_get_current_row_number, (png_const_structp));
PNG_EXPORT(218, png_byte, png_get_current_pass_number, (png_const_structp));
#endif
#ifdef PNG_USER_CHUNKS_SUPPORTED
-PNG_EXPORT(88, void, png_set_read_user_chunk_fn, (png_structp png_ptr,
+PNG_EXPORT(88, void, png_set_read_user_chunk_fn, (png_structp png_ptr,
png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn));
PNG_EXPORT(89, png_voidp, png_get_user_chunk_ptr, (png_const_structp png_ptr));
#endif
@@ -1493,8 +1833,8 @@ PNG_EXPORT(89, png_voidp, png_get_user_chunk_ptr, (png_const_structp png_ptr));
/* Sets the function callbacks for the push reader, and a pointer to a
* user-defined structure available to the callback functions.
*/
-PNG_EXPORT(90, void, png_set_progressive_read_fn, (png_structp png_ptr,
- png_voidp progressive_ptr, png_progressive_info_ptr info_fn,
+PNG_EXPORT(90, void, png_set_progressive_read_fn, (png_structp png_ptr,
+ png_voidp progressive_ptr, png_progressive_info_ptr info_fn,
png_progressive_row_ptr row_fn, png_progressive_end_ptr end_fn));
/* Returns the user pointer associated with the push read functions */
@@ -1502,7 +1842,7 @@ PNG_EXPORT(91, png_voidp, png_get_progressive_ptr, (png_const_structp png_ptr));
/* Function to be called when data becomes available */
PNG_EXPORT(92, void, png_process_data,
- (png_structp png_ptr, png_infop info_ptr,
+ (png_structp png_ptr, png_infop info_ptr,
png_bytep buffer, png_size_t buffer_size));
/* A function which may be called *only* within png_process_data to stop the
@@ -1522,25 +1862,27 @@ PNG_EXPORT(219, png_size_t, png_process_data_pause, (png_structp, int save));
*/
PNG_EXPORT(220, png_uint_32, png_process_data_skip, (png_structp));
+#ifdef PNG_READ_INTERLACING_SUPPORTED
/* Function that combines rows. 'new_row' is a flag that should come from
* the callback and be non-NULL if anything needs to be done; the library
* stores its own version of the new data internally and ignores the passed
* in value.
*/
-PNG_EXPORT(93, void, png_progressive_combine_row, (png_structp png_ptr,
+PNG_EXPORT(93, void, png_progressive_combine_row, (png_structp png_ptr,
png_bytep old_row, png_const_bytep new_row));
+#endif /* PNG_READ_INTERLACING_SUPPORTED */
#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
PNG_EXPORTA(94, png_voidp, png_malloc,
- (png_structp png_ptr, png_alloc_size_t size),
+ (png_structp png_ptr, png_alloc_size_t size),
PNG_ALLOCATED);
/* Added at libpng version 1.4.0 */
PNG_EXPORTA(95, png_voidp, png_calloc,
- (png_structp png_ptr, png_alloc_size_t size),
+ (png_structp png_ptr, png_alloc_size_t size),
PNG_ALLOCATED);
/* Added at libpng version 1.2.4 */
-PNG_EXPORTA(96, png_voidp, png_malloc_warn, (png_structp png_ptr,
+PNG_EXPORTA(96, png_voidp, png_malloc_warn, (png_structp png_ptr,
png_alloc_size_t size), PNG_ALLOCATED);
/* Frees a pointer allocated by png_malloc() */
@@ -1575,7 +1917,7 @@ PNG_EXPORT(99, void, png_data_freer,
#define PNG_FREE_MUL 0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */
#ifdef PNG_USER_MEM_SUPPORTED
-PNG_EXPORTA(100, png_voidp, png_malloc_default, (png_structp png_ptr,
+PNG_EXPORTA(100, png_voidp, png_malloc_default, (png_structp png_ptr,
png_alloc_size_t size), PNG_ALLOCATED);
PNG_EXPORT(101, void, png_free_default, (png_structp png_ptr, png_voidp ptr));
#endif
@@ -1583,11 +1925,11 @@ PNG_EXPORT(101, void, png_free_default, (png_structp png_ptr, png_voidp ptr));
#ifdef PNG_ERROR_TEXT_SUPPORTED
/* Fatal error in PNG image of libpng - can't continue */
PNG_EXPORTA(102, void, png_error,
- (png_structp png_ptr, png_const_charp error_message),
+ (png_structp png_ptr, png_const_charp error_message),
PNG_NORETURN);
/* The same, but the chunk name is prepended to the error string. */
-PNG_EXPORTA(103, void, png_chunk_error, (png_structp png_ptr,
+PNG_EXPORTA(103, void, png_chunk_error, (png_structp png_ptr,
png_const_charp error_message), PNG_NORETURN);
#else
@@ -1595,24 +1937,26 @@ PNG_EXPORTA(103, void, png_chunk_error, (png_structp png_ptr,
PNG_EXPORTA(104, void, png_err, (png_structp png_ptr), PNG_NORETURN);
#endif
+#ifdef PNG_WARNINGS_SUPPORTED
/* Non-fatal error in libpng. Can continue, but may have a problem. */
-PNG_EXPORT(105, void, png_warning, (png_structp png_ptr,
+PNG_EXPORT(105, void, png_warning, (png_structp png_ptr,
png_const_charp warning_message));
/* Non-fatal error in libpng, chunk name is prepended to message. */
-PNG_EXPORT(106, void, png_chunk_warning, (png_structp png_ptr,
+PNG_EXPORT(106, void, png_chunk_warning, (png_structp png_ptr,
png_const_charp warning_message));
+#endif
#ifdef PNG_BENIGN_ERRORS_SUPPORTED
/* Benign error in libpng. Can continue, but may have a problem.
* User can choose whether to handle as a fatal error or as a warning. */
# undef png_benign_error
-PNG_EXPORT(107, void, png_benign_error, (png_structp png_ptr,
+PNG_EXPORT(107, void, png_benign_error, (png_structp png_ptr,
png_const_charp warning_message));
/* Same, chunk name is prepended to message. */
# undef png_chunk_benign_error
-PNG_EXPORT(108, void, png_chunk_benign_error, (png_structp png_ptr,
+PNG_EXPORT(108, void, png_chunk_benign_error, (png_structp png_ptr,
png_const_charp warning_message));
PNG_EXPORT(109, void, png_set_benign_errors,
@@ -1641,11 +1985,11 @@ PNG_EXPORT(109, void, png_set_benign_errors,
*/
/* Returns "flag" if chunk data is valid in info_ptr. */
PNG_EXPORT(110, png_uint_32, png_get_valid,
- (png_const_structp png_ptr, png_const_infop info_ptr,
+ (png_const_structp png_ptr, png_const_infop info_ptr,
png_uint_32 flag));
/* Returns number of bytes needed to hold a transformed row. */
-PNG_EXPORT(111, png_size_t, png_get_rowbytes, (png_const_structp png_ptr,
+PNG_EXPORT(111, png_size_t, png_get_rowbytes, (png_const_structp png_ptr,
png_const_infop info_ptr));
#ifdef PNG_INFO_IMAGE_SUPPORTED
@@ -1667,11 +2011,11 @@ PNG_EXPORT(114, png_byte, png_get_channels,
#ifdef PNG_EASY_ACCESS_SUPPORTED
/* Returns image width in pixels. */
-PNG_EXPORT(115, png_uint_32, png_get_image_width, (png_const_structp png_ptr,
+PNG_EXPORT(115, png_uint_32, png_get_image_width, (png_const_structp png_ptr,
png_const_infop info_ptr));
/* Returns image height in pixels. */
-PNG_EXPORT(116, png_uint_32, png_get_image_height, (png_const_structp png_ptr,
+PNG_EXPORT(116, png_uint_32, png_get_image_height, (png_const_structp png_ptr,
png_const_infop info_ptr));
/* Returns image bit_depth. */
@@ -1679,19 +2023,19 @@ PNG_EXPORT(117, png_byte, png_get_bit_depth,
(png_const_structp png_ptr, png_const_infop info_ptr));
/* Returns image color_type. */
-PNG_EXPORT(118, png_byte, png_get_color_type, (png_const_structp png_ptr,
+PNG_EXPORT(118, png_byte, png_get_color_type, (png_const_structp png_ptr,
png_const_infop info_ptr));
/* Returns image filter_type. */
-PNG_EXPORT(119, png_byte, png_get_filter_type, (png_const_structp png_ptr,
+PNG_EXPORT(119, png_byte, png_get_filter_type, (png_const_structp png_ptr,
png_const_infop info_ptr));
/* Returns image interlace_type. */
-PNG_EXPORT(120, png_byte, png_get_interlace_type, (png_const_structp png_ptr,
+PNG_EXPORT(120, png_byte, png_get_interlace_type, (png_const_structp png_ptr,
png_const_infop info_ptr));
/* Returns image compression_type. */
-PNG_EXPORT(121, png_byte, png_get_compression_type, (png_const_structp png_ptr,
+PNG_EXPORT(121, png_byte, png_get_compression_type, (png_const_structp png_ptr,
png_const_infop info_ptr));
/* Returns image resolution in pixels per meter, from pHYs chunk data. */
@@ -1705,7 +2049,7 @@ PNG_EXPORT(124, png_uint_32, png_get_y_pixels_per_meter,
/* Returns pixel aspect ratio, computed from pHYs chunk data. */
PNG_FP_EXPORT(125, float, png_get_pixel_aspect_ratio,
(png_const_structp png_ptr, png_const_infop info_ptr));
-PNG_FIXED_EXPORT(210, png_fixed_point, png_get_pixel_aspect_ratio_fixed,
+PNG_FIXED_EXPORT(210, png_fixed_point, png_get_pixel_aspect_ratio_fixed,
(png_const_structp png_ptr, png_const_infop info_ptr));
/* Returns image x, y offset in pixels or microns, from oFFs chunk data. */
@@ -1726,47 +2070,68 @@ PNG_EXPORT(130, png_const_bytep, png_get_signature,
#ifdef PNG_bKGD_SUPPORTED
PNG_EXPORT(131, png_uint_32, png_get_bKGD,
- (png_const_structp png_ptr, png_infop info_ptr,
+ (png_const_structp png_ptr, png_infop info_ptr,
png_color_16p *background));
#endif
#ifdef PNG_bKGD_SUPPORTED
-PNG_EXPORT(132, void, png_set_bKGD, (png_structp png_ptr, png_infop info_ptr,
+PNG_EXPORT(132, void, png_set_bKGD, (png_structp png_ptr, png_infop info_ptr,
png_const_color_16p background));
#endif
#ifdef PNG_cHRM_SUPPORTED
-PNG_FP_EXPORT(133, png_uint_32, png_get_cHRM, (png_const_structp png_ptr,
- png_const_infop info_ptr, double *white_x, double *white_y, double *red_x,
- double *red_y, double *green_x, double *green_y, double *blue_x,
+PNG_FP_EXPORT(133, png_uint_32, png_get_cHRM, (png_const_structp png_ptr,
+ png_const_infop info_ptr, double *white_x, double *white_y, double *red_x,
+ double *red_y, double *green_x, double *green_y, double *blue_x,
double *blue_y));
+PNG_FP_EXPORT(230, png_uint_32, png_get_cHRM_XYZ, (png_structp png_ptr,
+ png_const_infop info_ptr, double *red_X, double *red_Y, double *red_Z,
+ double *green_X, double *green_Y, double *green_Z, double *blue_X,
+ double *blue_Y, double *blue_Z));
#ifdef PNG_FIXED_POINT_SUPPORTED /* Otherwise not implemented */
PNG_FIXED_EXPORT(134, png_uint_32, png_get_cHRM_fixed,
- (png_const_structp png_ptr,
- png_const_infop info_ptr, png_fixed_point *int_white_x,
- png_fixed_point *int_white_y, png_fixed_point *int_red_x,
- png_fixed_point *int_red_y, png_fixed_point *int_green_x,
- png_fixed_point *int_green_y, png_fixed_point *int_blue_x,
+ (png_const_structp png_ptr,
+ png_const_infop info_ptr, png_fixed_point *int_white_x,
+ png_fixed_point *int_white_y, png_fixed_point *int_red_x,
+ png_fixed_point *int_red_y, png_fixed_point *int_green_x,
+ png_fixed_point *int_green_y, png_fixed_point *int_blue_x,
png_fixed_point *int_blue_y));
#endif
+PNG_FIXED_EXPORT(231, png_uint_32, png_get_cHRM_XYZ_fixed,
+ (png_structp png_ptr, png_const_infop info_ptr,
+ png_fixed_point *int_red_X, png_fixed_point *int_red_Y,
+ png_fixed_point *int_red_Z, png_fixed_point *int_green_X,
+ png_fixed_point *int_green_Y, png_fixed_point *int_green_Z,
+ png_fixed_point *int_blue_X, png_fixed_point *int_blue_Y,
+ png_fixed_point *int_blue_Z));
#endif
#ifdef PNG_cHRM_SUPPORTED
PNG_FP_EXPORT(135, void, png_set_cHRM,
- (png_structp png_ptr, png_infop info_ptr,
- double white_x, double white_y, double red_x, double red_y, double green_x,
+ (png_structp png_ptr, png_infop info_ptr,
+ double white_x, double white_y, double red_x, double red_y, double green_x,
double green_y, double blue_x, double blue_y));
-PNG_FIXED_EXPORT(136, void, png_set_cHRM_fixed, (png_structp png_ptr,
- png_infop info_ptr, png_fixed_point int_white_x,
- png_fixed_point int_white_y, png_fixed_point int_red_x,
- png_fixed_point int_red_y, png_fixed_point int_green_x,
- png_fixed_point int_green_y, png_fixed_point int_blue_x,
+PNG_FP_EXPORT(232, void, png_set_cHRM_XYZ, (png_structp png_ptr,
+ png_infop info_ptr, double red_X, double red_Y, double red_Z,
+ double green_X, double green_Y, double green_Z, double blue_X,
+ double blue_Y, double blue_Z));
+PNG_FIXED_EXPORT(136, void, png_set_cHRM_fixed, (png_structp png_ptr,
+ png_infop info_ptr, png_fixed_point int_white_x,
+ png_fixed_point int_white_y, png_fixed_point int_red_x,
+ png_fixed_point int_red_y, png_fixed_point int_green_x,
+ png_fixed_point int_green_y, png_fixed_point int_blue_x,
png_fixed_point int_blue_y));
+PNG_FIXED_EXPORT(233, void, png_set_cHRM_XYZ_fixed, (png_structp png_ptr,
+ png_infop info_ptr, png_fixed_point int_red_X, png_fixed_point int_red_Y,
+ png_fixed_point int_red_Z, png_fixed_point int_green_X,
+ png_fixed_point int_green_Y, png_fixed_point int_green_Z,
+ png_fixed_point int_blue_X, png_fixed_point int_blue_Y,
+ png_fixed_point int_blue_Z));
#endif
#ifdef PNG_gAMA_SUPPORTED
PNG_FP_EXPORT(137, png_uint_32, png_get_gAMA,
- (png_const_structp png_ptr, png_const_infop info_ptr,
+ (png_const_structp png_ptr, png_const_infop info_ptr,
double *file_gamma));
PNG_FIXED_EXPORT(138, png_uint_32, png_get_gAMA_fixed,
(png_const_structp png_ptr, png_const_infop info_ptr,
@@ -1776,13 +2141,13 @@ PNG_FIXED_EXPORT(138, png_uint_32, png_get_gAMA_fixed,
#ifdef PNG_gAMA_SUPPORTED
PNG_FP_EXPORT(139, void, png_set_gAMA, (png_structp png_ptr,
png_infop info_ptr, double file_gamma));
-PNG_FIXED_EXPORT(140, void, png_set_gAMA_fixed, (png_structp png_ptr,
+PNG_FIXED_EXPORT(140, void, png_set_gAMA_fixed, (png_structp png_ptr,
png_infop info_ptr, png_fixed_point int_file_gamma));
#endif
#ifdef PNG_hIST_SUPPORTED
PNG_EXPORT(141, png_uint_32, png_get_hIST,
- (png_const_structp png_ptr, png_const_infop info_ptr,
+ (png_const_structp png_ptr, png_const_infop info_ptr,
png_uint_16p *hist));
#endif
@@ -1792,65 +2157,65 @@ PNG_EXPORT(142, void, png_set_hIST, (png_structp png_ptr,
#endif
PNG_EXPORT(143, png_uint_32, png_get_IHDR,
- (png_structp png_ptr, png_infop info_ptr,
- png_uint_32 *width, png_uint_32 *height, int *bit_depth, int *color_type,
+ (png_structp png_ptr, png_infop info_ptr,
+ png_uint_32 *width, png_uint_32 *height, int *bit_depth, int *color_type,
int *interlace_method, int *compression_method, int *filter_method));
PNG_EXPORT(144, void, png_set_IHDR,
- (png_structp png_ptr, png_infop info_ptr,
- png_uint_32 width, png_uint_32 height, int bit_depth, int color_type,
+ (png_structp png_ptr, png_infop info_ptr,
+ png_uint_32 width, png_uint_32 height, int bit_depth, int color_type,
int interlace_method, int compression_method, int filter_method));
#ifdef PNG_oFFs_SUPPORTED
PNG_EXPORT(145, png_uint_32, png_get_oFFs,
- (png_const_structp png_ptr, png_const_infop info_ptr,
+ (png_const_structp png_ptr, png_const_infop info_ptr,
png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type));
#endif
#ifdef PNG_oFFs_SUPPORTED
PNG_EXPORT(146, void, png_set_oFFs,
- (png_structp png_ptr, png_infop info_ptr,
+ (png_structp png_ptr, png_infop info_ptr,
png_int_32 offset_x, png_int_32 offset_y, int unit_type));
#endif
#ifdef PNG_pCAL_SUPPORTED
PNG_EXPORT(147, png_uint_32, png_get_pCAL,
- (png_const_structp png_ptr, png_const_infop info_ptr,
+ (png_const_structp png_ptr, png_const_infop info_ptr,
png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type,
- int *nparams,
+ int *nparams,
png_charp *units, png_charpp *params));
#endif
#ifdef PNG_pCAL_SUPPORTED
PNG_EXPORT(148, void, png_set_pCAL, (png_structp png_ptr,
- png_infop info_ptr,
- png_const_charp purpose, png_int_32 X0, png_int_32 X1, int type,
+ png_infop info_ptr,
+ png_const_charp purpose, png_int_32 X0, png_int_32 X1, int type,
int nparams, png_const_charp units, png_charpp params));
#endif
#ifdef PNG_pHYs_SUPPORTED
PNG_EXPORT(149, png_uint_32, png_get_pHYs,
- (png_const_structp png_ptr, png_const_infop info_ptr,
+ (png_const_structp png_ptr, png_const_infop info_ptr,
png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type));
#endif
#ifdef PNG_pHYs_SUPPORTED
PNG_EXPORT(150, void, png_set_pHYs,
- (png_structp png_ptr, png_infop info_ptr,
+ (png_structp png_ptr, png_infop info_ptr,
png_uint_32 res_x, png_uint_32 res_y, int unit_type));
#endif
PNG_EXPORT(151, png_uint_32, png_get_PLTE,
- (png_const_structp png_ptr, png_const_infop info_ptr,
+ (png_const_structp png_ptr, png_const_infop info_ptr,
png_colorp *palette, int *num_palette));
PNG_EXPORT(152, void, png_set_PLTE,
- (png_structp png_ptr, png_infop info_ptr,
+ (png_structp png_ptr, png_infop info_ptr,
png_const_colorp palette, int num_palette));
#ifdef PNG_sBIT_SUPPORTED
PNG_EXPORT(153, png_uint_32, png_get_sBIT,
- (png_const_structp png_ptr, png_infop info_ptr,
+ (png_const_structp png_ptr, png_infop info_ptr,
png_color_8p *sig_bit));
#endif
@@ -1867,44 +2232,44 @@ PNG_EXPORT(155, png_uint_32, png_get_sRGB, (png_const_structp png_ptr,
#ifdef PNG_sRGB_SUPPORTED
PNG_EXPORT(156, void, png_set_sRGB,
(png_structp png_ptr, png_infop info_ptr, int srgb_intent));
-PNG_EXPORT(157, void, png_set_sRGB_gAMA_and_cHRM, (png_structp png_ptr,
+PNG_EXPORT(157, void, png_set_sRGB_gAMA_and_cHRM, (png_structp png_ptr,
png_infop info_ptr, int srgb_intent));
#endif
#ifdef PNG_iCCP_SUPPORTED
PNG_EXPORT(158, png_uint_32, png_get_iCCP,
- (png_const_structp png_ptr, png_const_infop info_ptr,
- png_charpp name, int *compression_type, png_bytepp profile,
+ (png_const_structp png_ptr, png_const_infop info_ptr,
+ png_charpp name, int *compression_type, png_bytepp profile,
png_uint_32 *proflen));
#endif
#ifdef PNG_iCCP_SUPPORTED
PNG_EXPORT(159, void, png_set_iCCP,
- (png_structp png_ptr, png_infop info_ptr,
- png_const_charp name, int compression_type, png_const_bytep profile,
+ (png_structp png_ptr, png_infop info_ptr,
+ png_const_charp name, int compression_type, png_const_bytep profile,
png_uint_32 proflen));
#endif
#ifdef PNG_sPLT_SUPPORTED
PNG_EXPORT(160, png_uint_32, png_get_sPLT,
- (png_const_structp png_ptr, png_const_infop info_ptr,
+ (png_const_structp png_ptr, png_const_infop info_ptr,
png_sPLT_tpp entries));
#endif
#ifdef PNG_sPLT_SUPPORTED
PNG_EXPORT(161, void, png_set_sPLT,
- (png_structp png_ptr, png_infop info_ptr,
+ (png_structp png_ptr, png_infop info_ptr,
png_const_sPLT_tp entries, int nentries));
#endif
#ifdef PNG_TEXT_SUPPORTED
/* png_get_text also returns the number of text chunks in *num_text */
PNG_EXPORT(162, png_uint_32, png_get_text,
- (png_const_structp png_ptr, png_const_infop info_ptr,
+ (png_const_structp png_ptr, png_const_infop info_ptr,
png_textp *text_ptr, int *num_text));
#endif
-/* Note while png_set_text() will accept a structure whose text,
+/* Note while png_set_text() will accept a structure whose text,
* language, and translated keywords are NULL pointers, the structure
* returned by png_get_text will always contain regular
* zero-terminated C strings. They might be empty strings but
@@ -1913,7 +2278,7 @@ PNG_EXPORT(162, png_uint_32, png_get_text,
#ifdef PNG_TEXT_SUPPORTED
PNG_EXPORT(163, void, png_set_text,
- (png_structp png_ptr, png_infop info_ptr,
+ (png_structp png_ptr, png_infop info_ptr,
png_const_textp text_ptr, int num_text));
#endif
@@ -1929,30 +2294,30 @@ PNG_EXPORT(165, void, png_set_tIME,
#ifdef PNG_tRNS_SUPPORTED
PNG_EXPORT(166, png_uint_32, png_get_tRNS,
- (png_const_structp png_ptr, png_infop info_ptr,
+ (png_const_structp png_ptr, png_infop info_ptr,
png_bytep *trans_alpha, int *num_trans, png_color_16p *trans_color));
#endif
#ifdef PNG_tRNS_SUPPORTED
PNG_EXPORT(167, void, png_set_tRNS,
- (png_structp png_ptr, png_infop info_ptr,
- png_const_bytep trans_alpha, int num_trans,
+ (png_structp png_ptr, png_infop info_ptr,
+ png_const_bytep trans_alpha, int num_trans,
png_const_color_16p trans_color));
#endif
#ifdef PNG_sCAL_SUPPORTED
PNG_FP_EXPORT(168, png_uint_32, png_get_sCAL,
- (png_const_structp png_ptr, png_const_infop info_ptr,
+ (png_const_structp png_ptr, png_const_infop info_ptr,
int *unit, double *width, double *height));
#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
-/* NOTE: this API is currently implemented using floating point arithmetic,
+/* NOTE: this API is currently implemented using floating point arithmetic,
* consequently it can only be used on systems with floating point support.
* In any case the range of values supported by png_fixed_point is small and it
* is highly recommended that png_get_sCAL_s be used instead.
*/
PNG_FIXED_EXPORT(214, png_uint_32, png_get_sCAL_fixed,
(png_structp png_ptr, png_const_infop info_ptr, int *unit,
- png_fixed_point *width,
+ png_fixed_point *width,
png_fixed_point *height));
#endif
PNG_EXPORT(169, png_uint_32, png_get_sCAL_s,
@@ -1960,13 +2325,13 @@ PNG_EXPORT(169, png_uint_32, png_get_sCAL_s,
int *unit, png_charpp swidth, png_charpp sheight));
PNG_FP_EXPORT(170, void, png_set_sCAL,
- (png_structp png_ptr, png_infop info_ptr,
+ (png_structp png_ptr, png_infop info_ptr,
int unit, double width, double height));
-PNG_FIXED_EXPORT(213, void, png_set_sCAL_fixed, (png_structp png_ptr,
- png_infop info_ptr, int unit, png_fixed_point width,
+PNG_FIXED_EXPORT(213, void, png_set_sCAL_fixed, (png_structp png_ptr,
+ png_infop info_ptr, int unit, png_fixed_point width,
png_fixed_point height));
PNG_EXPORT(171, void, png_set_sCAL_s,
- (png_structp png_ptr, png_infop info_ptr,
+ (png_structp png_ptr, png_infop info_ptr,
int unit, png_const_charp swidth, png_const_charp sheight));
#endif /* PNG_sCAL_SUPPORTED */
@@ -1974,30 +2339,36 @@ PNG_EXPORT(171, void, png_set_sCAL_s,
/* Provide a list of chunks and how they are to be handled, if the built-in
handling or default unknown chunk handling is not desired. Any chunks not
listed will be handled in the default manner. The IHDR and IEND chunks
- must not be listed.
- keep = 0: follow default behaviour
- = 1: do not keep
- = 2: keep only if safe-to-copy
- = 3: keep even if unsafe-to-copy
+ must not be listed. Because this turns off the default handling for chunks
+ that would otherwise be recognized the behavior of libpng transformations may
+ well become incorrect!
+ keep = 0: PNG_HANDLE_CHUNK_AS_DEFAULT: follow default behavior
+ = 1: PNG_HANDLE_CHUNK_NEVER: do not keep
+ = 2: PNG_HANDLE_CHUNK_IF_SAFE: keep only if safe-to-copy
+ = 3: PNG_HANDLE_CHUNK_ALWAYS: keep even if unsafe-to-copy
*/
PNG_EXPORT(172, void, png_set_keep_unknown_chunks,
- (png_structp png_ptr, int keep,
+ (png_structp png_ptr, int keep,
png_const_bytep chunk_list, int num_chunks));
-PNG_EXPORT(173, int, png_handle_as_unknown, (png_structp png_ptr,
+
+/* The handling code is returned; the result is therefore true (non-zero) if
+ * special handling is required, false for the default handling.
+ */
+PNG_EXPORT(173, int, png_handle_as_unknown, (png_structp png_ptr,
png_const_bytep chunk_name));
#endif
#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED
-PNG_EXPORT(174, void, png_set_unknown_chunks, (png_structp png_ptr,
+PNG_EXPORT(174, void, png_set_unknown_chunks, (png_structp png_ptr,
png_infop info_ptr, png_const_unknown_chunkp unknowns,
int num_unknowns));
PNG_EXPORT(175, void, png_set_unknown_chunk_location,
(png_structp png_ptr, png_infop info_ptr, int chunk, int location));
-PNG_EXPORT(176, int, png_get_unknown_chunks, (png_const_structp png_ptr,
+PNG_EXPORT(176, int, png_get_unknown_chunks, (png_const_structp png_ptr,
png_const_infop info_ptr, png_unknown_chunkpp entries));
#endif
/* Png_free_data() will turn off the "valid" flag for anything it frees.
- * If you need to turn it off for a chunk that your application has freed,
+ * If you need to turn it off for a chunk that your application has freed,
* you can use png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK);
*/
PNG_EXPORT(177, void, png_set_invalid,
@@ -2005,9 +2376,9 @@ PNG_EXPORT(177, void, png_set_invalid,
#ifdef PNG_INFO_IMAGE_SUPPORTED
/* The "params" pointer is currently not used and is for future expansion. */
-PNG_EXPORT(178, void, png_read_png, (png_structp png_ptr, png_infop info_ptr,
+PNG_EXPORT(178, void, png_read_png, (png_structp png_ptr, png_infop info_ptr,
int transforms, png_voidp params));
-PNG_EXPORT(179, void, png_write_png, (png_structp png_ptr, png_infop info_ptr,
+PNG_EXPORT(179, void, png_write_png, (png_structp png_ptr, png_infop info_ptr,
int transforms, png_voidp params));
#endif
@@ -2021,7 +2392,7 @@ PNG_EXPORT(183, png_const_charp, png_get_libpng_ver,
(png_const_structp png_ptr));
#ifdef PNG_MNG_FEATURES_SUPPORTED
-PNG_EXPORT(184, png_uint_32, png_permit_mng_features, (png_structp png_ptr,
+PNG_EXPORT(184, png_uint_32, png_permit_mng_features, (png_structp png_ptr,
png_uint_32 mng_features_permitted));
#endif
@@ -2036,25 +2407,25 @@ PNG_EXPORT(184, png_uint_32, png_permit_mng_features, (png_structp png_ptr,
*/
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
PNG_EXPORT(185, void, png_set_strip_error_numbers,
- (png_structp png_ptr,
+ (png_structp png_ptr,
png_uint_32 strip_mode));
#endif
/* Added in libpng-1.2.6 */
#ifdef PNG_SET_USER_LIMITS_SUPPORTED
-PNG_EXPORT(186, void, png_set_user_limits, (png_structp png_ptr,
+PNG_EXPORT(186, void, png_set_user_limits, (png_structp png_ptr,
png_uint_32 user_width_max, png_uint_32 user_height_max));
PNG_EXPORT(187, png_uint_32, png_get_user_width_max,
(png_const_structp png_ptr));
PNG_EXPORT(188, png_uint_32, png_get_user_height_max,
(png_const_structp png_ptr));
/* Added in libpng-1.4.0 */
-PNG_EXPORT(189, void, png_set_chunk_cache_max, (png_structp png_ptr,
+PNG_EXPORT(189, void, png_set_chunk_cache_max, (png_structp png_ptr,
png_uint_32 user_chunk_cache_max));
PNG_EXPORT(190, png_uint_32, png_get_chunk_cache_max,
(png_const_structp png_ptr));
/* Added in libpng-1.4.1 */
-PNG_EXPORT(191, void, png_set_chunk_malloc_max, (png_structp png_ptr,
+PNG_EXPORT(191, void, png_set_chunk_malloc_max, (png_structp png_ptr,
png_alloc_size_t user_chunk_cache_max));
PNG_EXPORT(192, png_alloc_size_t, png_get_chunk_malloc_max,
(png_const_structp png_ptr));
@@ -2073,19 +2444,19 @@ PNG_EXPORT(195, png_uint_32, png_get_y_pixels_per_inch,
PNG_FP_EXPORT(196, float, png_get_x_offset_inches,
(png_const_structp png_ptr, png_const_infop info_ptr));
#ifdef PNG_FIXED_POINT_SUPPORTED /* otherwise not implemented. */
-PNG_FIXED_EXPORT(211, png_fixed_point, png_get_x_offset_inches_fixed,
+PNG_FIXED_EXPORT(211, png_fixed_point, png_get_x_offset_inches_fixed,
(png_structp png_ptr, png_const_infop info_ptr));
#endif
-PNG_FP_EXPORT(197, float, png_get_y_offset_inches, (png_const_structp png_ptr,
+PNG_FP_EXPORT(197, float, png_get_y_offset_inches, (png_const_structp png_ptr,
png_const_infop info_ptr));
#ifdef PNG_FIXED_POINT_SUPPORTED /* otherwise not implemented. */
-PNG_FIXED_EXPORT(212, png_fixed_point, png_get_y_offset_inches_fixed,
+PNG_FIXED_EXPORT(212, png_fixed_point, png_get_y_offset_inches_fixed,
(png_structp png_ptr, png_const_infop info_ptr));
#endif
# ifdef PNG_pHYs_SUPPORTED
-PNG_EXPORT(198, png_uint_32, png_get_pHYs_dpi, (png_const_structp png_ptr,
+PNG_EXPORT(198, png_uint_32, png_get_pHYs_dpi, (png_const_structp png_ptr,
png_const_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y,
int *unit_type));
# endif /* PNG_pHYs_SUPPORTED */
@@ -2122,8 +2493,16 @@ PNG_EXPORT(216, png_uint_32, png_get_io_chunk_type,
* full, image which appears in a given pass. 'pass' is in the range 0
* to 6 and the result is in the range 0 to 7.
*/
-#define PNG_PASS_START_ROW(pass) (((1U&~(pass))<<(3-((pass)>>1)))&7)
-#define PNG_PASS_START_COL(pass) (((1U& (pass))<<(3-(((pass)+1)>>1)))&7)
+#define PNG_PASS_START_ROW(pass) (((1&~(pass))<<(3-((pass)>>1)))&7)
+#define PNG_PASS_START_COL(pass) (((1& (pass))<<(3-(((pass)+1)>>1)))&7)
+
+/* A macro to return the offset between pixels in the output row for a pair of
+ * pixels in the input - effectively the inverse of the 'COL_SHIFT' macro that
+ * follows. Note that ROW_OFFSET is the offset from one row to the next whereas
+ * COL_OFFSET is from one column to the next, within a row.
+ */
+#define PNG_PASS_ROW_OFFSET(pass) ((pass)>2?(8>>(((pass)-1)>>1)):8)
+#define PNG_PASS_COL_OFFSET(pass) (1<<((7-(pass))>>1))
/* Two macros to help evaluate the number of rows or columns in each
* pass. This is expressed as a shift - effectively log2 of the number or
@@ -2142,8 +2521,9 @@ PNG_EXPORT(216, png_uint_32, png_get_io_chunk_type,
#define PNG_PASS_COLS(width, pass) (((width)+(((1<<PNG_PASS_COL_SHIFT(pass))\
-1)-PNG_PASS_START_COL(pass)))>>PNG_PASS_COL_SHIFT(pass))
-/* For the progressive reader it is necessary to find the row in the output
- * image given a row in an interlaced image, so two more macros:
+/* For the reader row callbacks (both progressive and sequential) it is
+ * necessary to find the row in the output image given a row in an interlaced
+ * image, so two more macros:
*/
#define PNG_ROW_FROM_PASS_ROW(yIn, pass) \
(((yIn)<<PNG_PASS_ROW_SHIFT(pass))+PNG_PASS_START_ROW(pass))
@@ -2157,8 +2537,8 @@ PNG_EXPORT(216, png_uint_32, png_get_io_chunk_type,
* the tile.
*/
#define PNG_PASS_MASK(pass,off) ( \
- ((0x110145AFU>>(((7-(off))-(pass))<<2)) & 0xFU) | \
- ((0x01145AF0U>>(((7-(off))-(pass))<<2)) & 0xF0U))
+ ((0x110145AF>>(((7-(off))-(pass))<<2)) & 0xF) | \
+ ((0x01145AF0>>(((7-(off))-(pass))<<2)) & 0xF0))
#define PNG_ROW_IN_INTERLACE_PASS(y, pass) \
((PNG_PASS_MASK(pass,0) >> ((y)&7)) & 1)
@@ -2184,14 +2564,14 @@ PNG_EXPORT(216, png_uint_32, png_get_io_chunk_type,
{ png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) \
* (png_uint_16)(alpha) \
+ (png_uint_16)(bg)*(png_uint_16)(255 \
- - (png_uint_16)(alpha)) + (png_uint_16)128); \
+ - (png_uint_16)(alpha)) + 128); \
(composite) = (png_byte)((temp + (temp >> 8)) >> 8); }
# define png_composite_16(composite, fg, alpha, bg) \
{ png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) \
* (png_uint_32)(alpha) \
- + (png_uint_32)(bg)*(png_uint_32)(65535L \
- - (png_uint_32)(alpha)) + (png_uint_32)32768L); \
+ + (png_uint_32)(bg)*(65535 \
+ - (png_uint_32)(alpha)) + 32768); \
(composite) = (png_uint_16)((temp + (temp >> 16)) >> 16); }
#else /* Standard method using integer division */
@@ -2199,12 +2579,12 @@ PNG_EXPORT(216, png_uint_32, png_get_io_chunk_type,
# define png_composite(composite, fg, alpha, bg) \
(composite) = (png_byte)(((png_uint_16)(fg) * (png_uint_16)(alpha) + \
(png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \
- (png_uint_16)127) / 255)
+ 127) / 255)
# define png_composite_16(composite, fg, alpha, bg) \
(composite) = (png_uint_16)(((png_uint_32)(fg) * (png_uint_32)(alpha) + \
- (png_uint_32)(bg)*(png_uint_32)(65535L - (png_uint_32)(alpha)) + \
- (png_uint_32)32767) / (png_uint_32)65535L)
+ (png_uint_32)(bg)*(png_uint_32)(65535 - (png_uint_32)(alpha)) + \
+ 32767) / 65535)
#endif /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */
#ifdef PNG_READ_INT_FUNCTIONS_SUPPORTED
@@ -2213,7 +2593,7 @@ PNG_EXPORT(202, png_uint_16, png_get_uint_16, (png_const_bytep buf));
PNG_EXPORT(203, png_int_32, png_get_int_32, (png_const_bytep buf));
#endif
-PNG_EXPORT(204, png_uint_32, png_get_uint_31, (png_structp png_ptr,
+PNG_EXPORT(204, png_uint_32, png_get_uint_31, (png_structp png_ptr,
png_const_bytep buf));
/* No png_get_int_16 -- may be added if there's a real need for it. */
@@ -2226,7 +2606,7 @@ PNG_EXPORT(206, void, png_save_int_32, (png_bytep buf, png_int_32 i));
#endif
/* Place a 16-bit number into a buffer in PNG byte order.
- * The parameter is declared unsigned int, not png_uint_16,
+ * The parameter is declared unsigned int, not png_uint_16,
* just to avoid potential problems on pre-ANSI C compilers.
*/
#ifdef PNG_WRITE_INT_FUNCTIONS_SUPPORTED
@@ -2259,6 +2639,12 @@ PNG_EXPORT(207, void, png_save_uint_16, (png_bytep buf, unsigned int i));
: (png_int_32)png_get_uint_32(buf)))
#endif
+#if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \
+ defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED)
+PNG_EXPORT(234, void, png_set_check_for_invalid_index, (png_structp png_ptr,
+ int allowed));
+#endif
+
/* Maintainer: Put new public prototypes here ^, in libpng.3, and project
* defs
*/
@@ -2268,7 +2654,7 @@ PNG_EXPORT(207, void, png_save_uint_16, (png_bytep buf, unsigned int i));
* scripts/symbols.def as well.
*/
#ifdef PNG_EXPORT_LAST_ORDINAL
- PNG_EXPORT_LAST_ORDINAL(220);
+ PNG_EXPORT_LAST_ORDINAL(234);
#endif
#ifdef __cplusplus
diff --git a/src/3rdparty/libpng/pngconf.h b/src/3rdparty/libpng/pngconf.h
index dd7ebba10d..89add405b6 100644
--- a/src/3rdparty/libpng/pngconf.h
+++ b/src/3rdparty/libpng/pngconf.h
@@ -1,9 +1,9 @@
/* pngconf.h - machine configurable file for libpng
*
- * libpng version 1.5.1 - February 3, 2011
+ * libpng version 1.5.10 - March 29, 2012
*
- * Copyright (c) 1998-2011 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2012 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -22,35 +22,37 @@
#ifndef PNGCONF_H
#define PNGCONF_H
+#ifndef PNG_BUILDING_SYMBOL_TABLE
/* PNG_NO_LIMITS_H may be used to turn off the use of the standard C
* definition file for machine specific limits, this may impact the
* correctness of the definitons below (see uses of INT_MAX).
*/
-#ifndef PNG_NO_LIMITS_H
-# include <limits.h>
-#endif
+# ifndef PNG_NO_LIMITS_H
+# include <limits.h>
+# endif
/* For the memory copy APIs (i.e. the standard definitions of these),
* because this file defines png_memcpy and so on the base APIs must
* be defined here.
*/
-#if defined(BSD) && !defined(VXWORKS)
-# include <strings.h>
-#else
-# include <string.h>
-#endif
+# if defined(BSD) && !defined(VXWORKS)
+# include <strings.h>
+# else
+# include <string.h>
+# endif
/* For png_FILE_p - this provides the standard definition of a
* FILE
*/
-#ifdef PNG_STDIO_SUPPORTED
-# include <stdio.h>
+# ifdef PNG_STDIO_SUPPORTED
+# include <stdio.h>
+# endif
#endif
/* This controls optimization of the reading of 16 and 32 bit values
* from PNG files. It can be set on a per-app-file basis - it
- * just changes whether a macro is used to the function is called.
- * The library builder sets the default, if read functions are not
+ * just changes whether a macro is used when the function is called.
+ * The library builder sets the default; if read functions are not
* built into the library the macro implementation is forced on.
*/
#ifndef PNG_READ_INT_FUNCTIONS_SUPPORTED
@@ -162,7 +164,9 @@
* 'type', compiler specific.
*
* PNG_DLL_EXPORT Set to the magic to use during a libpng build to
- * make a symbol exported from the DLL.
+ * make a symbol exported from the DLL. Not used in the
+ * public header files; see pngpriv.h for how it is used
+ * in the libpng build.
*
* PNG_DLL_IMPORT Set to the magic to force the libpng symbols to come
* from a DLL - used to define PNG_IMPEXP when
@@ -195,7 +199,7 @@
# define PNGCAPI __watcall
# endif
-# if defined(__GNUC__) || (defined (_MSC_VER) && (_MSC_VER >= 800)) || defined(__WINSCW__)
+# if defined(__GNUC__) || (defined (_MSC_VER) && (_MSC_VER >= 800))
# define PNGCAPI __cdecl
# if PNG_API_RULE == 1
# define PNGAPI __stdcall
@@ -256,25 +260,14 @@
# define PNGAPI PNGCAPI
#endif
-/* The default for PNG_IMPEXP depends on whether the library is
- * being built or used.
+/* PNG_IMPEXP may be set on the compilation system command line or (if not set)
+ * then in an internal header file when building the library, otherwise (when
+ * using the library) it is set here.
*/
#ifndef PNG_IMPEXP
-# ifdef PNGLIB_BUILD
- /* Building the library */
-# if (defined(DLL_EXPORT)/*from libtool*/ ||\
- defined(_WINDLL) || defined(_DLL) || defined(__DLL__) ||\
- defined(_USRDLL) ||\
- defined(PNG_BUILD_DLL)) && defined(PNG_DLL_EXPORT)
- /* Building a DLL. */
-# define PNG_IMPEXP PNG_DLL_EXPORT
-# endif /* DLL */
-# else
- /* Using the library */
-# if defined(PNG_USE_DLL) && defined(PNG_DLL_IMPORT)
- /* This forces use of a DLL, disallowing static linking */
-# define PNG_IMPEXP PNG_DLL_IMPORT
-# endif
+# if defined(PNG_USE_DLL) && defined(PNG_DLL_IMPORT)
+ /* This forces use of a DLL, disallowing static linking */
+# define PNG_IMPEXP PNG_DLL_IMPORT
# endif
# ifndef PNG_IMPEXP
@@ -282,23 +275,15 @@
# endif
#endif
-/* THe following complexity is concerned with getting the 'attributes' of the
- * declared function in the correct place. This potentially requires a separate
- * PNG_EXPORT function for every compiler.
+/* In 1.5.2 the definition of PNG_FUNCTION has been changed to always treat
+ * 'attributes' as a storage class - the attributes go at the start of the
+ * function definition, and attributes are always appended regardless of the
+ * compiler. This considerably simplifies these macros but may cause problems
+ * if any compilers both need function attributes and fail to handle them as
+ * a storage class (this is unlikely.)
*/
#ifndef PNG_FUNCTION
-# ifdef __GNUC__
-# define PNG_FUNCTION(type, name, args, attributes)\
- attributes type name args
-# else /* !GNUC */
-# ifdef _MSC_VER
-# define PNG_FUNCTION(type, name, args, attributes)\
- attributes type name args
-# else /* !MSC */
-# define PNG_FUNCTION(type, name, args, attributes)\
- type name args
-# endif
-# endif
+# define PNG_FUNCTION(type, name, args, attributes) attributes type name args
#endif
#ifndef PNG_EXPORT_TYPE
@@ -310,13 +295,19 @@
* scripts directory.
*/
#ifndef PNG_EXPORTA
+
# define PNG_EXPORTA(ordinal, type, name, args, attributes)\
- extern PNG_FUNCTION(PNG_EXPORT_TYPE(type),(PNGAPI name),PNGARG(args),\
- attributes)
+ PNG_FUNCTION(PNG_EXPORT_TYPE(type),(PNGAPI name),PNGARG(args), \
+ extern attributes)
#endif
+/* ANSI-C (C90) does not permit a macro to be invoked with an empty argument,
+ * so make something non-empty to satisfy the requirement:
+ */
+#define PNG_EMPTY /*empty list*/
+
#define PNG_EXPORT(ordinal, type, name, args)\
- PNG_EXPORTA(ordinal, type, name, args, )
+ PNG_EXPORTA(ordinal, type, name, args, PNG_EMPTY)
/* Use PNG_REMOVED to comment out a removed interface. */
#ifndef PNG_REMOVED
@@ -324,8 +315,7 @@
#endif
#ifndef PNG_CALLBACK
-# define PNG_CALLBACK(type, name, args, attributes)\
- type (PNGCBAPI name) PNGARG(args) attributes
+# define PNG_CALLBACK(type, name, args) type (PNGCBAPI name) PNGARG(args)
#endif
/* Support for compiler specific function attributes. These are used
@@ -347,72 +337,49 @@
* functions in png.h will generate compiler warnings. Added at libpng
* version 1.2.41.
*/
-# ifdef __GNUC__
+# if defined(__GNUC__)
# ifndef PNG_USE_RESULT
# define PNG_USE_RESULT __attribute__((__warn_unused_result__))
# endif
# ifndef PNG_NORETURN
# define PNG_NORETURN __attribute__((__noreturn__))
# endif
-# ifndef PNG_PTR_NORETURN
-# define PNG_PTR_NORETURN __attribute__((__noreturn__))
-# endif
# ifndef PNG_ALLOCATED
# define PNG_ALLOCATED __attribute__((__malloc__))
# endif
-
- /* This specifically protects structure members that should only be
- * accessed from within the library, therefore should be empty during
- * a library build.
- */
-# ifndef PNGLIB_BUILD
-# ifndef PNG_DEPRECATED
-# define PNG_DEPRECATED __attribute__((__deprecated__))
-# endif
-# ifndef PNG_DEPSTRUCT
-# define PNG_DEPSTRUCT __attribute__((__deprecated__))
+# ifndef PNG_DEPRECATED
+# define PNG_DEPRECATED __attribute__((__deprecated__))
+# endif
+# ifndef PNG_PRIVATE
+# if 0 /* Doesn't work so we use deprecated instead*/
+# define PNG_PRIVATE \
+ __attribute__((warning("This function is not exported by libpng.")))
+# else
+# define PNG_PRIVATE \
+ __attribute__((__deprecated__))
# endif
-# ifndef PNG_PRIVATE
-# if 0 /* Doesn't work so we use deprecated instead*/
-# define PNG_PRIVATE \
- __attribute__((warning("This function is not exported by libpng.")))
-# else
-# define PNG_PRIVATE \
- __attribute__((__deprecated__))
-# endif
-# endif /* PNG_PRIVATE */
-# endif /* PNGLIB_BUILD */
+# endif
# endif /* __GNUC__ */
-# ifdef _MSC_VER /* may need to check value */
+
+# if defined(_MSC_VER) && (_MSC_VER >= 1300)
# ifndef PNG_USE_RESULT
-# define PNG_USE_RESULT /*not supported*/
+# define PNG_USE_RESULT /* not supported */
# endif
# ifndef PNG_NORETURN
-# define PNG_NORETURN __declspec(noreturn)
-# endif
-# ifndef PNG_PTR_NORETURN
-# define PNG_PTR_NORETURN /*not supported*/
+# define PNG_NORETURN __declspec(noreturn)
# endif
# ifndef PNG_ALLOCATED
-# define PNG_ALLOCATED __declspec(restrict)
-# endif
-
- /* This specifically protects structure members that should only be
- * accessed from within the library, therefore should be empty during
- * a library build.
- */
-# ifndef PNGLIB_BUILD
-# ifndef PNG_DEPRECATED
-# define PNG_DEPRECATED __declspec(deprecated)
-# endif
-# ifndef PNG_DEPSTRUCT
-# define PNG_DEPSTRUCT __declspec(deprecated)
+# if (_MSC_VER >= 1400)
+# define PNG_ALLOCATED __declspec(restrict)
# endif
-# ifndef PNG_PRIVATE
-# define PNG_PRIVATE __declspec(deprecated)
-# endif /* PNG_PRIVATE */
-# endif /* PNGLIB_BUILD */
-# endif /* __GNUC__ */
+# endif
+# ifndef PNG_DEPRECATED
+# define PNG_DEPRECATED __declspec(deprecated)
+# endif
+# ifndef PNG_PRIVATE
+# define PNG_PRIVATE __declspec(deprecated)
+# endif
+# endif /* _MSC_VER */
#endif /* PNG_PEDANTIC_WARNINGS */
#ifndef PNG_DEPRECATED
@@ -427,9 +394,6 @@
#ifndef PNG_ALLOCATED
# define PNG_ALLOCATED /* The result of the function is new memory */
#endif
-#ifndef PNG_DEPSTRUCT
-# define PNG_DEPSTRUCT /* Access to this struct member is deprecated */
-#endif
#ifndef PNG_PRIVATE
# define PNG_PRIVATE /* This is a private libpng function */
#endif
diff --git a/src/3rdparty/libpng/pngdebug.h b/src/3rdparty/libpng/pngdebug.h
index 16f81fdd14..4547b7d808 100644
--- a/src/3rdparty/libpng/pngdebug.h
+++ b/src/3rdparty/libpng/pngdebug.h
@@ -85,7 +85,7 @@
# define png_debug(l,m) \
do { \
int num_tabs=l; \
- fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \
+ fprintf(PNG_DEBUG_FILE,"%s" m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \
(num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \
} while (0)
# endif
@@ -93,7 +93,7 @@
# define png_debug1(l,m,p1) \
do { \
int num_tabs=l; \
- fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \
+ fprintf(PNG_DEBUG_FILE,"%s" m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \
(num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \
} while (0)
# endif
@@ -101,7 +101,7 @@
# define png_debug2(l,m,p1,p2) \
do { \
int num_tabs=l; \
- fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \
+ fprintf(PNG_DEBUG_FILE,"%s" m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \
(num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \
} while (0)
# endif
diff --git a/src/3rdparty/libpng/pngerror.c b/src/3rdparty/libpng/pngerror.c
index 8290bb4106..95002f84f7 100644
--- a/src/3rdparty/libpng/pngerror.c
+++ b/src/3rdparty/libpng/pngerror.c
@@ -1,8 +1,8 @@
/* pngerror.c - stub functions for i/o and memory allocation
*
- * Last changed in libpng 1.5.1 [February 3, 2011]
- * Copyright (c) 1998-2011 Glenn Randers-Pehrson
+ * Last changed in libpng 1.5.8 [February 1, 2011]
+ * Copyright (c) 1998-2012 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -89,15 +89,121 @@ png_error,(png_structp png_ptr, png_const_charp error_message),PNG_NORETURN)
PNG_FUNCTION(void,PNGAPI
png_err,(png_structp png_ptr),PNG_NORETURN)
{
+ /* Prior to 1.5.2 the error_fn received a NULL pointer, expressed
+ * erroneously as '\0', instead of the empty string "". This was
+ * apparently an error, introduced in libpng-1.2.20, and png_default_error
+ * will crash in this case.
+ */
if (png_ptr != NULL && png_ptr->error_fn != NULL)
- (*(png_ptr->error_fn))(png_ptr, '\0');
+ (*(png_ptr->error_fn))(png_ptr, "");
/* If the custom handler doesn't exist, or if it returns,
use the default handler, which will not return. */
- png_default_error(png_ptr, '\0');
+ png_default_error(png_ptr, "");
}
#endif /* PNG_ERROR_TEXT_SUPPORTED */
+/* Utility to safely appends strings to a buffer. This never errors out so
+ * error checking is not required in the caller.
+ */
+size_t
+png_safecat(png_charp buffer, size_t bufsize, size_t pos,
+ png_const_charp string)
+{
+ if (buffer != NULL && pos < bufsize)
+ {
+ if (string != NULL)
+ while (*string != '\0' && pos < bufsize-1)
+ buffer[pos++] = *string++;
+
+ buffer[pos] = '\0';
+ }
+
+ return pos;
+}
+
+#if defined(PNG_WARNINGS_SUPPORTED) || defined(PNG_TIME_RFC1123_SUPPORTED)
+/* Utility to dump an unsigned value into a buffer, given a start pointer and
+ * and end pointer (which should point just *beyond* the end of the buffer!)
+ * Returns the pointer to the start of the formatted string.
+ */
+png_charp
+png_format_number(png_const_charp start, png_charp end, int format,
+ png_alloc_size_t number)
+{
+ int count = 0; /* number of digits output */
+ int mincount = 1; /* minimum number required */
+ int output = 0; /* digit output (for the fixed point format) */
+
+ *--end = '\0';
+
+ /* This is written so that the loop always runs at least once, even with
+ * number zero.
+ */
+ while (end > start && (number != 0 || count < mincount))
+ {
+
+ static const char digits[] = "0123456789ABCDEF";
+
+ switch (format)
+ {
+ case PNG_NUMBER_FORMAT_fixed:
+ /* Needs five digits (the fraction) */
+ mincount = 5;
+ if (output || number % 10 != 0)
+ {
+ *--end = digits[number % 10];
+ output = 1;
+ }
+ number /= 10;
+ break;
+
+ case PNG_NUMBER_FORMAT_02u:
+ /* Expects at least 2 digits. */
+ mincount = 2;
+ /* fall through */
+
+ case PNG_NUMBER_FORMAT_u:
+ *--end = digits[number % 10];
+ number /= 10;
+ break;
+
+ case PNG_NUMBER_FORMAT_02x:
+ /* This format expects at least two digits */
+ mincount = 2;
+ /* fall through */
+
+ case PNG_NUMBER_FORMAT_x:
+ *--end = digits[number & 0xf];
+ number >>= 4;
+ break;
+
+ default: /* an error */
+ number = 0;
+ break;
+ }
+
+ /* Keep track of the number of digits added */
+ ++count;
+
+ /* Float a fixed number here: */
+ if (format == PNG_NUMBER_FORMAT_fixed) if (count == 5) if (end > start)
+ {
+ /* End of the fraction, but maybe nothing was output? In that case
+ * drop the decimal point. If the number is a true zero handle that
+ * here.
+ */
+ if (output)
+ *--end = '.';
+ else if (number == 0) /* and !output */
+ *--end = '0';
+ }
+ }
+
+ return end;
+}
+#endif
+
#ifdef PNG_WARNINGS_SUPPORTED
/* This function is called whenever there is a non-fatal error. This function
* should not be changed. If there is a need to handle warnings differently,
@@ -128,6 +234,124 @@ png_warning(png_structp png_ptr, png_const_charp warning_message)
else
png_default_warning(png_ptr, warning_message + offset);
}
+
+/* These functions support 'formatted' warning messages with up to
+ * PNG_WARNING_PARAMETER_COUNT parameters. In the format string the parameter
+ * is introduced by @<number>, where 'number' starts at 1. This follows the
+ * standard established by X/Open for internationalizable error messages.
+ */
+void
+png_warning_parameter(png_warning_parameters p, int number,
+ png_const_charp string)
+{
+ if (number > 0 && number <= PNG_WARNING_PARAMETER_COUNT)
+ (void)png_safecat(p[number-1], (sizeof p[number-1]), 0, string);
+}
+
+void
+png_warning_parameter_unsigned(png_warning_parameters p, int number, int format,
+ png_alloc_size_t value)
+{
+ char buffer[PNG_NUMBER_BUFFER_SIZE];
+ png_warning_parameter(p, number, PNG_FORMAT_NUMBER(buffer, format, value));
+}
+
+void
+png_warning_parameter_signed(png_warning_parameters p, int number, int format,
+ png_int_32 value)
+{
+ png_alloc_size_t u;
+ png_charp str;
+ char buffer[PNG_NUMBER_BUFFER_SIZE];
+
+ /* Avoid overflow by doing the negate in a png_alloc_size_t: */
+ u = (png_alloc_size_t)value;
+ if (value < 0)
+ u = ~u + 1;
+
+ str = PNG_FORMAT_NUMBER(buffer, format, u);
+
+ if (value < 0 && str > buffer)
+ *--str = '-';
+
+ png_warning_parameter(p, number, str);
+}
+
+void
+png_formatted_warning(png_structp png_ptr, png_warning_parameters p,
+ png_const_charp message)
+{
+ /* The internal buffer is just 192 bytes - enough for all our messages,
+ * overflow doesn't happen because this code checks! If someone figures
+ * out how to send us a message longer than 192 bytes, all that will
+ * happen is that the message will be truncated appropriately.
+ */
+ size_t i = 0; /* Index in the msg[] buffer: */
+ char msg[192];
+
+ /* Each iteration through the following loop writes at most one character
+ * to msg[i++] then returns here to validate that there is still space for
+ * the trailing '\0'. It may (in the case of a parameter) read more than
+ * one character from message[]; it must check for '\0' and continue to the
+ * test if it finds the end of string.
+ */
+ while (i<(sizeof msg)-1 && *message != '\0')
+ {
+ /* '@' at end of string is now just printed (previously it was skipped);
+ * it is an error in the calling code to terminate the string with @.
+ */
+ if (p != NULL && *message == '@' && message[1] != '\0')
+ {
+ int parameter_char = *++message; /* Consume the '@' */
+ static const char valid_parameters[] = "123456789";
+ int parameter = 0;
+
+ /* Search for the parameter digit, the index in the string is the
+ * parameter to use.
+ */
+ while (valid_parameters[parameter] != parameter_char &&
+ valid_parameters[parameter] != '\0')
+ ++parameter;
+
+ /* If the parameter digit is out of range it will just get printed. */
+ if (parameter < PNG_WARNING_PARAMETER_COUNT)
+ {
+ /* Append this parameter */
+ png_const_charp parm = p[parameter];
+ png_const_charp pend = p[parameter] + (sizeof p[parameter]);
+
+ /* No need to copy the trailing '\0' here, but there is no guarantee
+ * that parm[] has been initialized, so there is no guarantee of a
+ * trailing '\0':
+ */
+ while (i<(sizeof msg)-1 && *parm != '\0' && parm < pend)
+ msg[i++] = *parm++;
+
+ /* Consume the parameter digit too: */
+ ++message;
+ continue;
+ }
+
+ /* else not a parameter and there is a character after the @ sign; just
+ * copy that. This is known not to be '\0' because of the test above.
+ */
+ }
+
+ /* At this point *message can't be '\0', even in the bad parameter case
+ * above where there is a lone '@' at the end of the message string.
+ */
+ msg[i++] = *message++;
+ }
+
+ /* i is always less than (sizeof msg), so: */
+ msg[i] = '\0';
+
+ /* And this is the formatted message, it may be larger than
+ * PNG_MAX_ERROR_TEXT, but that is only used for 'chunk' errors and these are
+ * not (currently) formatted.
+ */
+ png_warning(png_ptr, msg);
+}
#endif /* PNG_WARNINGS_SUPPORTED */
#ifdef PNG_BENIGN_ERRORS_SUPPORTED
@@ -159,11 +383,14 @@ static void /* PRIVATE */
png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp
error_message)
{
- int iout = 0, iin = 0;
+ png_uint_32 chunk_name = png_ptr->chunk_name;
+ int iout = 0, ishift = 24;
- while (iin < 4)
+ while (ishift >= 0)
{
- int c = png_ptr->chunk_name[iin++];
+ int c = (int)(chunk_name >> ishift) & 0xff;
+
+ ishift -= 8;
if (isnonalpha(c))
{
buffer[iout++] = PNG_LITERAL_LEFT_SQUARE_BRACKET;
@@ -174,7 +401,7 @@ png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp
else
{
- buffer[iout++] = (png_byte)c;
+ buffer[iout++] = (char)c;
}
}
@@ -183,10 +410,16 @@ png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp
else
{
+ int iin = 0;
+
buffer[iout++] = ':';
buffer[iout++] = ' ';
- png_memcpy(buffer + iout, error_message, PNG_MAX_ERROR_TEXT);
- buffer[iout + PNG_MAX_ERROR_TEXT - 1] = '\0';
+
+ while (iin < PNG_MAX_ERROR_TEXT-1 && error_message[iin] != '\0')
+ buffer[iout++] = error_message[iin++];
+
+ /* iin < PNG_MAX_ERROR_TEXT, so the following is safe: */
+ buffer[iout] = '\0';
}
}
#endif /* PNG_WARNINGS_SUPPORTED || PNG_ERROR_TEXT_SUPPORTED */
@@ -272,7 +505,7 @@ png_set_longjmp_fn(png_structp png_ptr, png_longjmp_ptr longjmp_fn,
return NULL;
png_ptr->longjmp_fn = longjmp_fn;
- return &png_ptr->png_jmpbuf;
+ return &png_ptr->longjmp_buffer;
}
#endif
@@ -287,7 +520,8 @@ png_default_error,(png_structp png_ptr, png_const_charp error_message),
{
#ifdef PNG_CONSOLE_IO_SUPPORTED
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
- if (*error_message == PNG_LITERAL_SHARP)
+ /* Check on NULL only added in 1.5.4 */
+ if (error_message != NULL && *error_message == PNG_LITERAL_SHARP)
{
/* Strip "#nnnn " from beginning of error message. */
int offset;
@@ -317,11 +551,11 @@ png_default_error,(png_structp png_ptr, png_const_charp error_message),
else
#endif
{
- fprintf(stderr, "libpng error: %s", error_message);
+ fprintf(stderr, "libpng error: %s", error_message ? error_message :
+ "undefined");
fprintf(stderr, PNG_STRING_NEWLINE);
}
-#endif
-#ifndef PNG_CONSOLE_IO_SUPPORTED
+#else
PNG_UNUSED(error_message) /* Make compiler happy */
#endif
png_longjmp(png_ptr, 1);
@@ -335,13 +569,13 @@ png_longjmp,(png_structp png_ptr, int val),PNG_NORETURN)
{
# ifdef USE_FAR_KEYWORD
{
- jmp_buf png_jmpbuf;
- png_memcpy(png_jmpbuf, png_ptr->png_jmpbuf, png_sizeof(jmp_buf));
- png_ptr->longjmp_fn(png_jmpbuf, val);
+ jmp_buf tmp_jmpbuf;
+ png_memcpy(tmp_jmpbuf, png_ptr->longjmp_buffer, png_sizeof(jmp_buf));
+ png_ptr->longjmp_fn(tmp_jmpbuf, val);
}
# else
- png_ptr->longjmp_fn(png_ptr->png_jmpbuf, val);
+ png_ptr->longjmp_fn(png_ptr->longjmp_buffer, val);
# endif
}
#endif
@@ -403,7 +637,7 @@ png_default_warning(png_structp png_ptr, png_const_charp warning_message)
/* This function is called when the application wants to use another method
* of handling errors and warnings. Note that the error function MUST NOT
* return to the calling routine or serious problems will occur. The return
- * method used in the default routine calls longjmp(png_ptr->png_jmpbuf, 1)
+ * method used in the default routine calls longjmp(png_ptr->longjmp_buffer, 1)
*/
void PNGAPI
png_set_error_fn(png_structp png_ptr, png_voidp error_ptr,
@@ -414,7 +648,11 @@ png_set_error_fn(png_structp png_ptr, png_voidp error_ptr,
png_ptr->error_ptr = error_ptr;
png_ptr->error_fn = error_fn;
+#ifdef PNG_WARNINGS_SUPPORTED
png_ptr->warning_fn = warning_fn;
+#else
+ PNG_UNUSED(warning_fn)
+#endif
}
diff --git a/src/3rdparty/libpng/pngget.c b/src/3rdparty/libpng/pngget.c
index b5e5798c02..43400cda7e 100644
--- a/src/3rdparty/libpng/pngget.c
+++ b/src/3rdparty/libpng/pngget.c
@@ -1,7 +1,7 @@
/* pngget.c - retrieval of values from info struct
*
- * Last changed in libpng 1.5.1 [February 3, 2011]
+ * Last changed in libpng 1.5.7 [December 15, 2011]
* Copyright (c) 1998-2011 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
@@ -459,6 +459,65 @@ png_get_bKGD(png_const_structp png_ptr, png_infop info_ptr,
#endif
#ifdef PNG_cHRM_SUPPORTED
+/* The XYZ APIs were added in 1.5.5 to take advantage of the code added at the
+ * same time to correct the rgb grayscale coefficient defaults obtained from the
+ * cHRM chunk in 1.5.4
+ */
+png_uint_32 PNGFAPI
+png_get_cHRM_XYZ_fixed(png_structp png_ptr, png_const_infop info_ptr,
+ png_fixed_point *int_red_X, png_fixed_point *int_red_Y,
+ png_fixed_point *int_red_Z, png_fixed_point *int_green_X,
+ png_fixed_point *int_green_Y, png_fixed_point *int_green_Z,
+ png_fixed_point *int_blue_X, png_fixed_point *int_blue_Y,
+ png_fixed_point *int_blue_Z)
+{
+ if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM))
+ {
+ png_xy xy;
+ png_XYZ XYZ;
+
+ png_debug1(1, "in %s retrieval function", "cHRM_XYZ");
+
+ xy.whitex = info_ptr->x_white;
+ xy.whitey = info_ptr->y_white;
+ xy.redx = info_ptr->x_red;
+ xy.redy = info_ptr->y_red;
+ xy.greenx = info_ptr->x_green;
+ xy.greeny = info_ptr->y_green;
+ xy.bluex = info_ptr->x_blue;
+ xy.bluey = info_ptr->y_blue;
+
+ /* The *_checked function handles error reporting, so just return 0 if
+ * there is a failure here.
+ */
+ if (png_XYZ_from_xy_checked(png_ptr, &XYZ, xy))
+ {
+ if (int_red_X != NULL)
+ *int_red_X = XYZ.redX;
+ if (int_red_Y != NULL)
+ *int_red_Y = XYZ.redY;
+ if (int_red_Z != NULL)
+ *int_red_Z = XYZ.redZ;
+ if (int_green_X != NULL)
+ *int_green_X = XYZ.greenX;
+ if (int_green_Y != NULL)
+ *int_green_Y = XYZ.greenY;
+ if (int_green_Z != NULL)
+ *int_green_Z = XYZ.greenZ;
+ if (int_blue_X != NULL)
+ *int_blue_X = XYZ.blueX;
+ if (int_blue_Y != NULL)
+ *int_blue_Y = XYZ.blueY;
+ if (int_blue_Z != NULL)
+ *int_blue_Z = XYZ.blueZ;
+
+ return (PNG_INFO_cHRM);
+ }
+ }
+
+ return (0);
+}
+
# ifdef PNG_FLOATING_POINT_SUPPORTED
png_uint_32 PNGAPI
png_get_cHRM(png_const_structp png_ptr, png_const_infop info_ptr,
@@ -490,6 +549,42 @@ png_get_cHRM(png_const_structp png_ptr, png_const_infop info_ptr,
return (0);
}
+
+png_uint_32 PNGAPI
+png_get_cHRM_XYZ(png_structp png_ptr, png_const_infop info_ptr,
+ double *red_X, double *red_Y, double *red_Z, double *green_X,
+ double *green_Y, double *green_Z, double *blue_X, double *blue_Y,
+ double *blue_Z)
+{
+ png_XYZ XYZ;
+
+ if (png_get_cHRM_XYZ_fixed(png_ptr, info_ptr,
+ &XYZ.redX, &XYZ.redY, &XYZ.redZ, &XYZ.greenX, &XYZ.greenY, &XYZ.greenZ,
+ &XYZ.blueX, &XYZ.blueY, &XYZ.blueZ) & PNG_INFO_cHRM)
+ {
+ if (red_X != NULL)
+ *red_X = png_float(png_ptr, XYZ.redX, "cHRM red X");
+ if (red_Y != NULL)
+ *red_Y = png_float(png_ptr, XYZ.redY, "cHRM red Y");
+ if (red_Z != NULL)
+ *red_Z = png_float(png_ptr, XYZ.redZ, "cHRM red Z");
+ if (green_X != NULL)
+ *green_X = png_float(png_ptr, XYZ.greenX, "cHRM green X");
+ if (green_Y != NULL)
+ *green_Y = png_float(png_ptr, XYZ.greenY, "cHRM green Y");
+ if (green_Z != NULL)
+ *green_Z = png_float(png_ptr, XYZ.greenZ, "cHRM green Z");
+ if (blue_X != NULL)
+ *blue_X = png_float(png_ptr, XYZ.blueX, "cHRM blue X");
+ if (blue_Y != NULL)
+ *blue_Y = png_float(png_ptr, XYZ.blueY, "cHRM blue Y");
+ if (blue_Z != NULL)
+ *blue_Z = png_float(png_ptr, XYZ.blueZ, "cHRM blue Z");
+ return (PNG_INFO_cHRM);
+ }
+
+ return (0);
+}
# endif
# ifdef PNG_FIXED_POINT_SUPPORTED
@@ -587,15 +682,16 @@ png_get_iCCP(png_const_structp png_ptr, png_const_infop info_ptr,
png_debug1(1, "in %s retrieval function", "iCCP");
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP)
- && name != NULL && profile != NULL && proflen != NULL)
+ && name != NULL && compression_type != NULL && profile != NULL &&
+ proflen != NULL)
{
*name = info_ptr->iccp_name;
*profile = info_ptr->iccp_profile;
/* Compression_type is a dummy so the API won't have to change
* if we introduce multiple compression types later.
*/
- *proflen = (int)info_ptr->iccp_proflen;
- *compression_type = (int)info_ptr->iccp_compression;
+ *proflen = info_ptr->iccp_proflen;
+ *compression_type = info_ptr->iccp_compression;
return (PNG_INFO_iCCP);
}
@@ -855,9 +951,8 @@ png_get_text(png_const_structp png_ptr, png_const_infop info_ptr,
{
if (png_ptr != NULL && info_ptr != NULL && info_ptr->num_text > 0)
{
- png_debug1(1, "in %s retrieval function",
- (png_ptr->chunk_name[0] == '\0' ? "text" :
- (png_const_charp)png_ptr->chunk_name));
+ png_debug1(1, "in 0x%lx retrieval function",
+ (unsigned long)png_ptr->chunk_name);
if (text_ptr != NULL)
*text_ptr = info_ptr->text;
@@ -971,10 +1066,9 @@ png_get_user_chunk_ptr(png_const_structp png_ptr)
png_size_t PNGAPI
png_get_compression_buffer_size(png_const_structp png_ptr)
{
- return (png_ptr ? png_ptr->zbuf_size : 0L);
+ return (png_ptr ? png_ptr->zbuf_size : 0);
}
-
#ifdef PNG_SET_USER_LIMITS_SUPPORTED
/* These functions were added to libpng 1.2.6 and were enabled
* by default in libpng-1.4.0 */
@@ -1016,16 +1110,14 @@ png_get_io_state (png_structp png_ptr)
png_uint_32 PNGAPI
png_get_io_chunk_type (png_const_structp png_ptr)
{
- return ((png_ptr->chunk_name[0] << 24) +
- (png_ptr->chunk_name[1] << 16) +
- (png_ptr->chunk_name[2] << 8) +
- (png_ptr->chunk_name[3]));
+ return png_ptr->chunk_name;
}
png_const_bytep PNGAPI
png_get_io_chunk_name (png_structp png_ptr)
{
- return png_ptr->chunk_name;
+ PNG_CSTRING_FROM_CHUNK(png_ptr->io_chunk_string, png_ptr->chunk_name);
+ return png_ptr->io_chunk_string;
}
#endif /* ?PNG_IO_STATE_SUPPORTED */
diff --git a/src/3rdparty/libpng/pnginfo.h b/src/3rdparty/libpng/pnginfo.h
index fa19f85e72..a33bfab06d 100644
--- a/src/3rdparty/libpng/pnginfo.h
+++ b/src/3rdparty/libpng/pnginfo.h
@@ -138,7 +138,6 @@ defined(PNG_READ_BACKGROUND_SUPPORTED)
* single color specified that should be treated as fully transparent.
* Data is valid if (valid & PNG_INFO_tRNS) is non-zero.
*/
- png_bytep trans; /* alpha values for paletted image */
png_bytep trans_alpha; /* alpha values for paletted image */
png_color_16 trans_color; /* transparent color for non-palette image */
#endif
diff --git a/src/3rdparty/libpng/pnglibconf.h b/src/3rdparty/libpng/pnglibconf.h
index c46dde3a0f..aa82b574a8 100644
--- a/src/3rdparty/libpng/pnglibconf.h
+++ b/src/3rdparty/libpng/pnglibconf.h
@@ -3,176 +3,187 @@
/* pnglibconf.h - library build configuration */
-/* libpng version 1.5.0 - last changed on January 6, 2011 */
+/* Libpng 1.5.10 - March 29, 2012 */
-/* Copyright (c) 1998-2011 Glenn Randers-Pehrson */
+/* Copyright (c) 1998-2012 Glenn Randers-Pehrson */
/* This code is released under the libpng license. */
/* For conditions of distribution and use, see the disclaimer */
/* and license in png.h */
/* pnglibconf.h */
-/* Machine generated file: DO NOT EDIT */
/* Derived from: scripts/pnglibconf.dfa */
+/* If you edit this file by hand you must obey the rules expressed in */
+/* pnglibconf.dfa with respect to the dependencies between the following */
+/* symbols. It is much better to generate a new file using */
+/* scripts/libpngconf.mak */
+
#ifndef PNGLCONF_H
#define PNGLCONF_H
/* settings */
-#define PNG_MAX_GAMMA_8 11
-#define PNG_CALLOC_SUPPORTED
-#define PNG_QUANTIZE_RED_BITS 5
-#define PNG_USER_WIDTH_MAX 1000000L
-#define PNG_QUANTIZE_GREEN_BITS 5
#define PNG_API_RULE 0
+#define PNG_CALLOC_SUPPORTED
+#define PNG_COST_SHIFT 3
+#define PNG_DEFAULT_READ_MACROS 1
+#define PNG_GAMMA_THRESHOLD_FIXED 5000
+#define PNG_MAX_GAMMA_8 11
#define PNG_QUANTIZE_BLUE_BITS 5
-#define PNG_USER_CHUNK_CACHE_MAX 0
-#define PNG_USER_HEIGHT_MAX 1000000L
+#define PNG_QUANTIZE_GREEN_BITS 5
+#define PNG_QUANTIZE_RED_BITS 5
#define PNG_sCAL_PRECISION 5
-#define PNG_COST_SHIFT 3
#define PNG_WEIGHT_SHIFT 8
-#define PNG_USER_CHUNK_MALLOC_MAX 0
-#define PNG_DEFAULT_READ_MACROS 1
#define PNG_ZBUF_SIZE 8192
-#define PNG_GAMMA_THRESHOLD_FIXED 5000
/* end of settings */
/* options */
-#define PNG_INFO_IMAGE_SUPPORTED
-#define PNG_HANDLE_AS_UNKNOWN_SUPPORTED
-#define PNG_POINTER_INDEXING_SUPPORTED
-#define PNG_WARNINGS_SUPPORTED
-#define PNG_FLOATING_ARITHMETIC_SUPPORTED
-#define PNG_WRITE_SUPPORTED
-#define PNG_WRITE_INTERLACING_SUPPORTED
-#define PNG_WRITE_16BIT_SUPPORTED
-#define PNG_EASY_ACCESS_SUPPORTED
+#define PNG_16BIT_SUPPORTED
#define PNG_ALIGN_MEMORY_SUPPORTED
-#define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
-#define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
-#define PNG_USER_LIMITS_SUPPORTED
-#define PNG_FIXED_POINT_SUPPORTED
+#define PNG_BENIGN_ERRORS_SUPPORTED
+#define PNG_bKGD_SUPPORTED
+#define PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED
+#define PNG_CHECK_cHRM_SUPPORTED
+#define PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED
+#define PNG_cHRM_SUPPORTED
+#define PNG_CONSOLE_IO_SUPPORTED
+#ifndef _WIN32_WCE
+#define PNG_CONVERT_tIME_SUPPORTED
+#endif
+#define PNG_EASY_ACCESS_SUPPORTED
/*#undef PNG_ERROR_NUMBERS_SUPPORTED*/
#define PNG_ERROR_TEXT_SUPPORTED
-#define PNG_READ_SUPPORTED
-/*#undef PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED*/
-#define PNG_BENIGN_ERRORS_SUPPORTED
-#define PNG_SETJMP_SUPPORTED
-#define PNG_WRITE_FLUSH_SUPPORTED
-#define PNG_MNG_FEATURES_SUPPORTED
+#define PNG_FIXED_POINT_SUPPORTED
+#define PNG_FLOATING_ARITHMETIC_SUPPORTED
#define PNG_FLOATING_POINT_SUPPORTED
+#define PNG_gAMA_SUPPORTED
+#define PNG_HANDLE_AS_UNKNOWN_SUPPORTED
+#define PNG_hIST_SUPPORTED
+#define PNG_iCCP_SUPPORTED
#define PNG_INCH_CONVERSIONS_SUPPORTED
-#define PNG_STDIO_SUPPORTED
-#define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
-#define PNG_USER_MEM_SUPPORTED
+#define PNG_INFO_IMAGE_SUPPORTED
#define PNG_IO_STATE_SUPPORTED
-#define PNG_SET_USER_LIMITS_SUPPORTED
+#define PNG_iTXt_SUPPORTED
+#define PNG_MNG_FEATURES_SUPPORTED
+#define PNG_oFFs_SUPPORTED
+#define PNG_pCAL_SUPPORTED
+#define PNG_pHYs_SUPPORTED
+#define PNG_POINTER_INDEXING_SUPPORTED
+#define PNG_PROGRESSIVE_READ_SUPPORTED
+#define PNG_READ_16BIT_SUPPORTED
+#define PNG_READ_ALPHA_MODE_SUPPORTED
#define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED
-#define PNG_WRITE_INT_FUNCTIONS_SUPPORTED
-#define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED
-#define PNG_WRITE_FILTER_SUPPORTED
-#define PNG_SET_CHUNK_CACHE_LIMIT_SUPPORTED
-#define PNG_WRITE_iCCP_SUPPORTED
-#define PNG_READ_TRANSFORMS_SUPPORTED
-#define PNG_READ_GAMMA_SUPPORTED
+#define PNG_READ_BACKGROUND_SUPPORTED
+#define PNG_READ_BGR_SUPPORTED
#define PNG_READ_bKGD_SUPPORTED
-#define PNG_UNKNOWN_CHUNKS_SUPPORTED
-#define PNG_READ_sCAL_SUPPORTED
-#define PNG_WRITE_hIST_SUPPORTED
-#define PNG_READ_OPT_PLTE_SUPPORTED
-#define PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED
-#define PNG_WRITE_gAMA_SUPPORTED
+#define PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED
+#define PNG_READ_cHRM_SUPPORTED
+#define PNG_READ_COMPOSITE_NODIV_SUPPORTED
+#define PNG_READ_COMPRESSED_TEXT_SUPPORTED
+#define PNG_READ_EXPAND_16_SUPPORTED
+#define PNG_READ_EXPAND_SUPPORTED
+#define PNG_READ_FILLER_SUPPORTED
+#define PNG_READ_gAMA_SUPPORTED
+#define PNG_READ_GAMMA_SUPPORTED
#define PNG_READ_GRAY_TO_RGB_SUPPORTED
-#define PNG_WRITE_pCAL_SUPPORTED
+#define PNG_READ_hIST_SUPPORTED
+#define PNG_READ_iCCP_SUPPORTED
+#define PNG_READ_INTERLACING_SUPPORTED
+#define PNG_READ_INT_FUNCTIONS_SUPPORTED
#define PNG_READ_INVERT_ALPHA_SUPPORTED
-#define PNG_WRITE_TRANSFORMS_SUPPORTED
-#define PNG_READ_sBIT_SUPPORTED
+#define PNG_READ_INVERT_SUPPORTED
+#define PNG_READ_iTXt_SUPPORTED
+#define PNG_READ_oFFs_SUPPORTED
+#define PNG_READ_OPT_PLTE_SUPPORTED
#define PNG_READ_PACK_SUPPORTED
-#define PNG_WRITE_SWAP_SUPPORTED
-#define PNG_READ_cHRM_SUPPORTED
-#define PNG_WRITE_tIME_SUPPORTED
-#define PNG_READ_INTERLACING_SUPPORTED
-#define PNG_READ_tRNS_SUPPORTED
-#define PNG_WRITE_pHYs_SUPPORTED
-#define PNG_WRITE_INVERT_SUPPORTED
+#define PNG_READ_PACKSWAP_SUPPORTED
+#define PNG_READ_pCAL_SUPPORTED
+#define PNG_READ_pHYs_SUPPORTED
+#define PNG_READ_QUANTIZE_SUPPORTED
#define PNG_READ_RGB_TO_GRAY_SUPPORTED
-#define PNG_WRITE_sRGB_SUPPORTED
-#define PNG_READ_oFFs_SUPPORTED
-#define PNG_WRITE_FILLER_SUPPORTED
-#define PNG_WRITE_TEXT_SUPPORTED
-#define PNG_WRITE_SHIFT_SUPPORTED
-#define PNG_PROGRESSIVE_READ_SUPPORTED
+#define PNG_READ_sBIT_SUPPORTED
+#define PNG_READ_SCALE_16_TO_8_SUPPORTED
+#define PNG_READ_sCAL_SUPPORTED
#define PNG_READ_SHIFT_SUPPORTED
-#ifndef _WIN32_WCE
- #define PNG_CONVERT_tIME_SUPPORTED
-#endif
-#define PNG_READ_USER_TRANSFORM_SUPPORTED
-#define PNG_READ_INT_FUNCTIONS_SUPPORTED
-#define PNG_READ_USER_CHUNKS_SUPPORTED
-#define PNG_READ_hIST_SUPPORTED
-#define PNG_READ_16BIT_SUPPORTED
-#define PNG_READ_SWAP_ALPHA_SUPPORTED
-#define PNG_READ_COMPOSITE_NODIV_SUPPORTED
-#define PNG_SEQUENTIAL_READ_SUPPORTED
-#define PNG_READ_BACKGROUND_SUPPORTED
-#define PNG_READ_QUANTIZE_SUPPORTED
-#define PNG_READ_iCCP_SUPPORTED
-#define PNG_READ_STRIP_ALPHA_SUPPORTED
-#define PNG_READ_PACKSWAP_SUPPORTED
+#define PNG_READ_sPLT_SUPPORTED
#define PNG_READ_sRGB_SUPPORTED
-#define PNG_WRITE_tEXt_SUPPORTED
-#define PNG_READ_gAMA_SUPPORTED
-#define PNG_READ_pCAL_SUPPORTED
-#define PNG_READ_EXPAND_SUPPORTED
-#define PNG_WRITE_sPLT_SUPPORTED
+#define PNG_READ_STRIP_16_TO_8_SUPPORTED
+#define PNG_READ_STRIP_ALPHA_SUPPORTED
+#define PNG_READ_SUPPORTED
+#define PNG_READ_SWAP_ALPHA_SUPPORTED
#define PNG_READ_SWAP_SUPPORTED
+#define PNG_READ_tEXt_SUPPORTED
+#define PNG_READ_TEXT_SUPPORTED
#define PNG_READ_tIME_SUPPORTED
-#define PNG_READ_pHYs_SUPPORTED
-#define PNG_WRITE_SWAP_ALPHA_SUPPORTED
+#define PNG_READ_TRANSFORMS_SUPPORTED
+#define PNG_READ_tRNS_SUPPORTED
+#define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
+#define PNG_READ_USER_CHUNKS_SUPPORTED
+#define PNG_READ_USER_TRANSFORM_SUPPORTED
+#define PNG_READ_zTXt_SUPPORTED
+#define PNG_SAVE_INT_32_SUPPORTED
+#define PNG_sBIT_SUPPORTED
+#define PNG_sCAL_SUPPORTED
+#define PNG_SEQUENTIAL_READ_SUPPORTED
+#define PNG_SET_CHUNK_CACHE_LIMIT_SUPPORTED
+#define PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED
+#define PNG_SETJMP_SUPPORTED
+#define PNG_SET_USER_LIMITS_SUPPORTED
+#define PNG_sPLT_SUPPORTED
+#define PNG_sRGB_SUPPORTED
+#define PNG_STDIO_SUPPORTED
+#define PNG_tEXt_SUPPORTED
+#define PNG_TEXT_SUPPORTED
#define PNG_TIME_RFC1123_SUPPORTED
-#define PNG_READ_TEXT_SUPPORTED
-#define PNG_WRITE_BGR_SUPPORTED
+#define PNG_tIME_SUPPORTED
+#define PNG_tRNS_SUPPORTED
+#define PNG_UNKNOWN_CHUNKS_SUPPORTED
#define PNG_USER_CHUNKS_SUPPORTED
-#define PNG_CONSOLE_IO_SUPPORTED
-#define PNG_WRITE_PACK_SUPPORTED
-#define PNG_READ_FILLER_SUPPORTED
+#define PNG_USER_LIMITS_SUPPORTED
+#define PNG_USER_MEM_SUPPORTED
+#define PNG_USER_TRANSFORM_INFO_SUPPORTED
+#define PNG_USER_TRANSFORM_PTR_SUPPORTED
+#define PNG_WARNINGS_SUPPORTED
+#define PNG_WRITE_16BIT_SUPPORTED
+#define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED
+#define PNG_WRITE_BGR_SUPPORTED
#define PNG_WRITE_bKGD_SUPPORTED
-#define PNG_WRITE_tRNS_SUPPORTED
-#define PNG_READ_sPLT_SUPPORTED
-#define PNG_WRITE_sCAL_SUPPORTED
+#define PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED
+#define PNG_WRITE_cHRM_SUPPORTED
+#define PNG_WRITE_COMPRESSED_TEXT_SUPPORTED
+#define PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED
+#define PNG_WRITE_FILLER_SUPPORTED
+#define PNG_WRITE_FILTER_SUPPORTED
+#define PNG_WRITE_FLUSH_SUPPORTED
+#define PNG_WRITE_gAMA_SUPPORTED
+#define PNG_WRITE_hIST_SUPPORTED
+#define PNG_WRITE_iCCP_SUPPORTED
+#define PNG_WRITE_INTERLACING_SUPPORTED
+#define PNG_WRITE_INT_FUNCTIONS_SUPPORTED
+#define PNG_WRITE_INVERT_ALPHA_SUPPORTED
+#define PNG_WRITE_INVERT_SUPPORTED
+#define PNG_WRITE_iTXt_SUPPORTED
#define PNG_WRITE_oFFs_SUPPORTED
-#define PNG_READ_tEXt_SUPPORTED
+#define PNG_WRITE_OPTIMIZE_CMF_SUPPORTED
+#define PNG_WRITE_PACK_SUPPORTED
+#define PNG_WRITE_PACKSWAP_SUPPORTED
+#define PNG_WRITE_pCAL_SUPPORTED
+#define PNG_WRITE_pHYs_SUPPORTED
#define PNG_WRITE_sBIT_SUPPORTED
-#define PNG_READ_INVERT_SUPPORTED
-#define PNG_READ_16_TO_8_SUPPORTED
-#define PNG_WRITE_cHRM_SUPPORTED
-#define PNG_16BIT_SUPPORTED
+#define PNG_WRITE_sCAL_SUPPORTED
+#define PNG_WRITE_SHIFT_SUPPORTED
+#define PNG_WRITE_sPLT_SUPPORTED
+#define PNG_WRITE_sRGB_SUPPORTED
+#define PNG_WRITE_SUPPORTED
+#define PNG_WRITE_SWAP_ALPHA_SUPPORTED
+#define PNG_WRITE_SWAP_SUPPORTED
+#define PNG_WRITE_tEXt_SUPPORTED
+#define PNG_WRITE_TEXT_SUPPORTED
+#define PNG_WRITE_tIME_SUPPORTED
+#define PNG_WRITE_TRANSFORMS_SUPPORTED
+#define PNG_WRITE_tRNS_SUPPORTED
+#define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
#define PNG_WRITE_USER_TRANSFORM_SUPPORTED
-#define PNG_READ_BGR_SUPPORTED
-#define PNG_WRITE_PACKSWAP_SUPPORTED
-#define PNG_WRITE_INVERT_ALPHA_SUPPORTED
-#define PNG_sCAL_SUPPORTED
+#define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
#define PNG_WRITE_zTXt_SUPPORTED
-#define PNG_sBIT_SUPPORTED
-#define PNG_cHRM_SUPPORTED
-#define PNG_bKGD_SUPPORTED
-#define PNG_tRNS_SUPPORTED
-#define PNG_WRITE_iTXt_SUPPORTED
-#define PNG_oFFs_SUPPORTED
-#define PNG_USER_TRANSFORM_PTR_SUPPORTED
-#define PNG_USER_TRANSFORM_INFO_SUPPORTED
-#define PNG_hIST_SUPPORTED
-#define PNG_iCCP_SUPPORTED
-#define PNG_sRGB_SUPPORTED
-#define PNG_READ_zTXt_SUPPORTED
-#define PNG_gAMA_SUPPORTED
-#define PNG_pCAL_SUPPORTED
-#define PNG_CHECK_cHRM_SUPPORTED
-#define PNG_tIME_SUPPORTED
-#define PNG_pHYs_SUPPORTED
-#define PNG_READ_iTXt_SUPPORTED
-#define PNG_TEXT_SUPPORTED
-#define PNG_SAVE_INT_32_SUPPORTED
-#define PNG_sPLT_SUPPORTED
-#define PNG_tEXt_SUPPORTED
#define PNG_zTXt_SUPPORTED
-#define PNG_iTXt_SUPPORTED
/* end of options */
+#define PNG_SAFE_LIMITS_SUPPORTED
#endif /* PNGLCONF_H */
diff --git a/src/3rdparty/libpng/pngmem.c b/src/3rdparty/libpng/pngmem.c
index a15d8b0859..bf5ff037da 100644
--- a/src/3rdparty/libpng/pngmem.c
+++ b/src/3rdparty/libpng/pngmem.c
@@ -1,7 +1,7 @@
/* pngmem.c - stub functions for memory allocation
*
- * Last changed in libpng 1.5.1 [February 3, 2011]
+ * Last changed in libpng 1.5.7 [December 15, 2011]
* Copyright (c) 1998-2011 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
@@ -56,9 +56,9 @@ png_create_struct_2,(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr),
if (malloc_fn != NULL)
{
png_struct dummy_struct;
- png_structp png_ptr = &dummy_struct;
- png_ptr->mem_ptr=mem_ptr;
- struct_ptr = (*(malloc_fn))(png_ptr, (png_uint_32)size);
+ memset(&dummy_struct, 0, sizeof dummy_struct);
+ dummy_struct.mem_ptr=mem_ptr;
+ struct_ptr = (*(malloc_fn))(&dummy_struct, (png_alloc_size_t)size);
}
else
@@ -90,9 +90,9 @@ png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn,
if (free_fn != NULL)
{
png_struct dummy_struct;
- png_structp png_ptr = &dummy_struct;
- png_ptr->mem_ptr=mem_ptr;
- (*(free_fn))(png_ptr, struct_ptr);
+ memset(&dummy_struct, 0, sizeof dummy_struct);
+ dummy_struct.mem_ptr=mem_ptr;
+ (*(free_fn))(&dummy_struct, struct_ptr);
return;
}
@@ -143,7 +143,7 @@ png_malloc,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)
# ifdef PNG_USER_MEM_SUPPORTED
if (png_ptr->malloc_fn != NULL)
- ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size));
+ ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, size));
else
ret = (png_malloc_default(png_ptr, size));
@@ -187,8 +187,9 @@ png_malloc_default,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)
int num_blocks;
png_uint_32 total_size;
png_bytep table;
- int i;
+ int i, mem_level, window_bits;
png_byte huge * hptr;
+ int window_bits
if (ret != NULL)
{
@@ -196,14 +197,22 @@ png_malloc_default,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)
ret = NULL;
}
- if (png_ptr->zlib_window_bits > 14)
- num_blocks = (int)(1 << (png_ptr->zlib_window_bits - 14));
+ window_bits =
+ png_ptr->zlib_window_bits >= png_ptr->zlib_text_window_bits ?
+ png_ptr->zlib_window_bits : png_ptr->zlib_text_window_bits;
+
+ if (window_bits > 14)
+ num_blocks = (int)(1 << (window_bits - 14));
else
num_blocks = 1;
- if (png_ptr->zlib_mem_level >= 7)
- num_blocks += (int)(1 << (png_ptr->zlib_mem_level - 7));
+ mem_level =
+ png_ptr->zlib_mem_level >= png_ptr->zlib_text_mem_level ?
+ png_ptr->zlib_mem_level : png_ptr->zlib_text_mem_level;
+
+ if (mem_level >= 7)
+ num_blocks += (int)(1 << (mem_level - 7));
else
num_blocks++;
@@ -277,7 +286,7 @@ png_malloc_default,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)
{
# ifndef PNG_USER_MEM_SUPPORTED
if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
- png_error(png_ptr, "Out of Memory"); /* Note "o" and "M" */
+ png_error(png_ptr, "Out of Memory"); /* Note "O" and "M" */
else
png_warning(png_ptr, "Out of Memory");
diff --git a/src/3rdparty/libpng/pngpread.c b/src/3rdparty/libpng/pngpread.c
index 7b1149bab1..8a5aa29ec8 100644
--- a/src/3rdparty/libpng/pngpread.c
+++ b/src/3rdparty/libpng/pngpread.c
@@ -1,8 +1,8 @@
/* pngpread.c - read a png file in push mode
*
- * Last changed in libpng 1.5.1 [February 3, 2011]
- * Copyright (c) 1998-2011 Glenn Randers-Pehrson
+ * Last changed in libpng 1.5.9 [February 18, 2012]
+ * Copyright (c) 1998-2012 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -128,30 +128,6 @@ png_process_some_data(png_structp png_ptr, png_infop info_ptr)
break;
}
-#ifdef PNG_READ_tEXt_SUPPORTED
- case PNG_READ_tEXt_MODE:
- {
- png_push_read_tEXt(png_ptr, info_ptr);
- break;
- }
-
-#endif
-#ifdef PNG_READ_zTXt_SUPPORTED
- case PNG_READ_zTXt_MODE:
- {
- png_push_read_zTXt(png_ptr, info_ptr);
- break;
- }
-
-#endif
-#ifdef PNG_READ_iTXt_SUPPORTED
- case PNG_READ_iTXt_MODE:
- {
- png_push_read_iTXt(png_ptr, info_ptr);
- break;
- }
-
-#endif
case PNG_SKIP_MODE:
{
png_push_crc_finish(png_ptr);
@@ -176,7 +152,7 @@ void /* PRIVATE */
png_push_read_sig(png_structp png_ptr, png_infop info_ptr)
{
png_size_t num_checked = png_ptr->sig_bytes,
- num_to_check = 8 - num_checked;
+ num_to_check = 8 - num_checked;
if (png_ptr->buffer_size < num_to_check)
{
@@ -196,6 +172,7 @@ png_push_read_sig(png_structp png_ptr, png_infop info_ptr)
else
png_error(png_ptr, "PNG file corrupted by ASCII conversion");
}
+
else
{
if (png_ptr->sig_bytes >= 8)
@@ -208,61 +185,7 @@ png_push_read_sig(png_structp png_ptr, png_infop info_ptr)
void /* PRIVATE */
png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
{
- PNG_IHDR;
- PNG_IDAT;
- PNG_IEND;
- PNG_PLTE;
-#ifdef PNG_READ_bKGD_SUPPORTED
- PNG_bKGD;
-#endif
-#ifdef PNG_READ_cHRM_SUPPORTED
- PNG_cHRM;
-#endif
-#ifdef PNG_READ_gAMA_SUPPORTED
- PNG_gAMA;
-#endif
-#ifdef PNG_READ_hIST_SUPPORTED
- PNG_hIST;
-#endif
-#ifdef PNG_READ_iCCP_SUPPORTED
- PNG_iCCP;
-#endif
-#ifdef PNG_READ_iTXt_SUPPORTED
- PNG_iTXt;
-#endif
-#ifdef PNG_READ_oFFs_SUPPORTED
- PNG_oFFs;
-#endif
-#ifdef PNG_READ_pCAL_SUPPORTED
- PNG_pCAL;
-#endif
-#ifdef PNG_READ_pHYs_SUPPORTED
- PNG_pHYs;
-#endif
-#ifdef PNG_READ_sBIT_SUPPORTED
- PNG_sBIT;
-#endif
-#ifdef PNG_READ_sCAL_SUPPORTED
- PNG_sCAL;
-#endif
-#ifdef PNG_READ_sRGB_SUPPORTED
- PNG_sRGB;
-#endif
-#ifdef PNG_READ_sPLT_SUPPORTED
- PNG_sPLT;
-#endif
-#ifdef PNG_READ_tEXt_SUPPORTED
- PNG_tEXt;
-#endif
-#ifdef PNG_READ_tIME_SUPPORTED
- PNG_tIME;
-#endif
-#ifdef PNG_READ_tRNS_SUPPORTED
- PNG_tRNS;
-#endif
-#ifdef PNG_READ_zTXt_SUPPORTED
- PNG_zTXt;
-#endif
+ png_uint_32 chunk_name;
/* First we make sure we have enough data for the 4 byte chunk name
* and the 4 byte chunk length before proceeding with decoding the
@@ -273,6 +196,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER))
{
png_byte chunk_length[4];
+ png_byte chunk_tag[4];
if (png_ptr->buffer_size < 8)
{
@@ -283,16 +207,27 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
png_push_fill_buffer(png_ptr, chunk_length, 4);
png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length);
png_reset_crc(png_ptr);
- png_crc_read(png_ptr, png_ptr->chunk_name, 4);
+ png_crc_read(png_ptr, chunk_tag, 4);
+ png_ptr->chunk_name = PNG_CHUNK_FROM_STRING(chunk_tag);
png_check_chunk_name(png_ptr, png_ptr->chunk_name);
png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
}
- if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
+ chunk_name = png_ptr->chunk_name;
+
+ if (chunk_name == png_IDAT)
+ {
+ /* This is here above the if/else case statement below because if the
+ * unknown handling marks 'IDAT' as unknown then the IDAT handling case is
+ * completely skipped.
+ *
+ * TODO: there must be a better way of doing this.
+ */
if (png_ptr->mode & PNG_AFTER_IDAT)
png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
+ }
- if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4))
+ if (chunk_name == png_IHDR)
{
if (png_ptr->push_length != 13)
png_error(png_ptr, "Invalid IHDR length");
@@ -306,7 +241,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length);
}
- else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4))
+ else if (chunk_name == png_IEND)
{
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
{
@@ -321,7 +256,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
}
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
- else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name))
+ else if (png_chunk_unknown_handling(png_ptr, chunk_name))
{
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
{
@@ -329,15 +264,15 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
return;
}
- if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
+ if (chunk_name == png_IDAT)
png_ptr->mode |= PNG_HAVE_IDAT;
png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length);
- if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
+ if (chunk_name == png_PLTE)
png_ptr->mode |= PNG_HAVE_PLTE;
- else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
+ else if (chunk_name == png_IDAT)
{
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before IDAT");
@@ -349,7 +284,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
}
#endif
- else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
+ else if (chunk_name == png_PLTE)
{
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
{
@@ -359,7 +294,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length);
}
- else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
+ else if (chunk_name == png_IDAT)
{
/* If we reach an IDAT chunk, this means we have read all of the
* header chunks, and we can start reading the image (or if this
@@ -395,7 +330,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
}
#ifdef PNG_READ_gAMA_SUPPORTED
- else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4))
+ else if (png_ptr->chunk_name == png_gAMA)
{
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
{
@@ -408,7 +343,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#endif
#ifdef PNG_READ_sBIT_SUPPORTED
- else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4))
+ else if (png_ptr->chunk_name == png_sBIT)
{
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
{
@@ -421,7 +356,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#endif
#ifdef PNG_READ_cHRM_SUPPORTED
- else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4))
+ else if (png_ptr->chunk_name == png_cHRM)
{
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
{
@@ -434,7 +369,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#endif
#ifdef PNG_READ_sRGB_SUPPORTED
- else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4))
+ else if (chunk_name == png_sRGB)
{
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
{
@@ -447,7 +382,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#endif
#ifdef PNG_READ_iCCP_SUPPORTED
- else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4))
+ else if (png_ptr->chunk_name == png_iCCP)
{
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
{
@@ -460,7 +395,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#endif
#ifdef PNG_READ_sPLT_SUPPORTED
- else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4))
+ else if (chunk_name == png_sPLT)
{
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
{
@@ -473,7 +408,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#endif
#ifdef PNG_READ_tRNS_SUPPORTED
- else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4))
+ else if (chunk_name == png_tRNS)
{
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
{
@@ -486,7 +421,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#endif
#ifdef PNG_READ_bKGD_SUPPORTED
- else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4))
+ else if (chunk_name == png_bKGD)
{
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
{
@@ -499,7 +434,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#endif
#ifdef PNG_READ_hIST_SUPPORTED
- else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4))
+ else if (chunk_name == png_hIST)
{
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
{
@@ -512,7 +447,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#endif
#ifdef PNG_READ_pHYs_SUPPORTED
- else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4))
+ else if (chunk_name == png_pHYs)
{
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
{
@@ -525,7 +460,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#endif
#ifdef PNG_READ_oFFs_SUPPORTED
- else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4))
+ else if (chunk_name == png_oFFs)
{
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
{
@@ -538,7 +473,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#endif
#ifdef PNG_READ_pCAL_SUPPORTED
- else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4))
+ else if (chunk_name == png_pCAL)
{
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
{
@@ -551,7 +486,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#endif
#ifdef PNG_READ_sCAL_SUPPORTED
- else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4))
+ else if (chunk_name == png_sCAL)
{
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
{
@@ -564,7 +499,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#endif
#ifdef PNG_READ_tIME_SUPPORTED
- else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4))
+ else if (chunk_name == png_tIME)
{
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
{
@@ -577,7 +512,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#endif
#ifdef PNG_READ_tEXt_SUPPORTED
- else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4))
+ else if (chunk_name == png_tEXt)
{
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
{
@@ -585,12 +520,12 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
return;
}
- png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length);
+ png_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length);
}
#endif
#ifdef PNG_READ_zTXt_SUPPORTED
- else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4))
+ else if (chunk_name == png_zTXt)
{
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
{
@@ -598,12 +533,12 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
return;
}
- png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length);
+ png_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length);
}
#endif
#ifdef PNG_READ_iTXt_SUPPORTED
- else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4))
+ else if (chunk_name == png_iTXt)
{
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
{
@@ -611,7 +546,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
return;
}
- png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length);
+ png_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length);
}
#endif
@@ -622,7 +557,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
png_push_save_buffer(png_ptr);
return;
}
- png_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length);
+ png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length);
}
png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
@@ -662,6 +597,7 @@ png_push_crc_finish(png_structp png_ptr)
png_ptr->save_buffer_size -= save_size;
png_ptr->save_buffer_ptr += save_size;
}
+
if (png_ptr->skip_length && png_ptr->current_buffer_size)
{
png_size_t save_size = png_ptr->current_buffer_size;
@@ -683,6 +619,7 @@ png_push_crc_finish(png_structp png_ptr)
png_ptr->current_buffer_size -= save_size;
png_ptr->current_buffer_ptr += save_size;
}
+
if (!png_ptr->skip_length)
{
if (png_ptr->buffer_size < 4)
@@ -705,6 +642,7 @@ png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length)
return;
ptr = buffer;
+
if (png_ptr->save_buffer_size)
{
png_size_t save_size;
@@ -722,6 +660,7 @@ png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length)
png_ptr->save_buffer_size -= save_size;
png_ptr->save_buffer_ptr += save_size;
}
+
if (length && png_ptr->current_buffer_size)
{
png_size_t save_size;
@@ -751,6 +690,7 @@ png_push_save_buffer(png_structp png_ptr)
png_bytep dp;
istop = png_ptr->save_buffer_size;
+
for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer;
i < istop; i++, sp++, dp++)
{
@@ -758,6 +698,7 @@ png_push_save_buffer(png_structp png_ptr)
}
}
}
+
if (png_ptr->save_buffer_size + png_ptr->current_buffer_size >
png_ptr->save_buffer_max)
{
@@ -772,8 +713,7 @@ png_push_save_buffer(png_structp png_ptr)
new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256;
old_buffer = png_ptr->save_buffer;
- png_ptr->save_buffer = (png_bytep)png_malloc_warn(png_ptr,
- (png_size_t)new_max);
+ png_ptr->save_buffer = (png_bytep)png_malloc_warn(png_ptr, new_max);
if (png_ptr->save_buffer == NULL)
{
@@ -785,6 +725,7 @@ png_push_save_buffer(png_structp png_ptr)
png_free(png_ptr, old_buffer);
png_ptr->save_buffer_max = new_max;
}
+
if (png_ptr->current_buffer_size)
{
png_memcpy(png_ptr->save_buffer + png_ptr->save_buffer_size,
@@ -792,6 +733,7 @@ png_push_save_buffer(png_structp png_ptr)
png_ptr->save_buffer_size += png_ptr->current_buffer_size;
png_ptr->current_buffer_size = 0;
}
+
png_ptr->save_buffer_ptr = png_ptr->save_buffer;
png_ptr->buffer_size = 0;
}
@@ -809,11 +751,12 @@ png_push_restore_buffer(png_structp png_ptr, png_bytep buffer,
void /* PRIVATE */
png_push_read_IDAT(png_structp png_ptr)
{
- PNG_IDAT;
if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER))
{
png_byte chunk_length[4];
+ png_byte chunk_tag[4];
+ /* TODO: this code can be commoned up with the same code in push_read */
if (png_ptr->buffer_size < 8)
{
png_push_save_buffer(png_ptr);
@@ -823,10 +766,11 @@ png_push_read_IDAT(png_structp png_ptr)
png_push_fill_buffer(png_ptr, chunk_length, 4);
png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length);
png_reset_crc(png_ptr);
- png_crc_read(png_ptr, png_ptr->chunk_name, 4);
+ png_crc_read(png_ptr, chunk_tag, 4);
+ png_ptr->chunk_name = PNG_CHUNK_FROM_STRING(chunk_tag);
png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
- if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
+ if (png_ptr->chunk_name != png_IDAT)
{
png_ptr->process_mode = PNG_READ_CHUNK_MODE;
@@ -838,6 +782,7 @@ png_push_read_IDAT(png_structp png_ptr)
png_ptr->idat_size = png_ptr->push_length;
}
+
if (png_ptr->idat_size && png_ptr->save_buffer_size)
{
png_size_t save_size = png_ptr->save_buffer_size;
@@ -890,6 +835,7 @@ png_push_read_IDAT(png_structp png_ptr)
png_ptr->current_buffer_size -= save_size;
png_ptr->current_buffer_ptr += save_size;
}
+
if (!png_ptr->idat_size)
{
if (png_ptr->buffer_size < 4)
@@ -1011,34 +957,56 @@ png_process_IDAT_data(png_structp png_ptr, png_bytep buffer,
void /* PRIVATE */
png_push_process_row(png_structp png_ptr)
{
- png_ptr->row_info.color_type = png_ptr->color_type;
- png_ptr->row_info.width = png_ptr->iwidth;
- png_ptr->row_info.channels = png_ptr->channels;
- png_ptr->row_info.bit_depth = png_ptr->bit_depth;
- png_ptr->row_info.pixel_depth = png_ptr->pixel_depth;
+ /* 1.5.6: row_info moved out of png_struct to a local here. */
+ png_row_info row_info;
- png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth,
- png_ptr->row_info.width);
+ row_info.width = png_ptr->iwidth; /* NOTE: width of current interlaced row */
+ row_info.color_type = png_ptr->color_type;
+ row_info.bit_depth = png_ptr->bit_depth;
+ row_info.channels = png_ptr->channels;
+ row_info.pixel_depth = png_ptr->pixel_depth;
+ row_info.rowbytes = PNG_ROWBYTES(row_info.pixel_depth, row_info.width);
- png_read_filter_row(png_ptr, &(png_ptr->row_info),
- png_ptr->row_buf + 1, png_ptr->prev_row + 1,
- (int)(png_ptr->row_buf[0]));
+ if (png_ptr->row_buf[0] > PNG_FILTER_VALUE_NONE)
+ {
+ if (png_ptr->row_buf[0] < PNG_FILTER_VALUE_LAST)
+ png_read_filter_row(png_ptr, &row_info, png_ptr->row_buf + 1,
+ png_ptr->prev_row + 1, png_ptr->row_buf[0]);
+ else
+ png_error(png_ptr, "bad adaptive filter value");
+ }
+
+ /* libpng 1.5.6: the following line was copying png_ptr->rowbytes before
+ * 1.5.6, while the buffer really is this big in current versions of libpng
+ * it may not be in the future, so this was changed just to copy the
+ * interlaced row count:
+ */
+ png_memcpy(png_ptr->prev_row, png_ptr->row_buf, row_info.rowbytes + 1);
+
+#ifdef PNG_READ_TRANSFORMS_SUPPORTED
+ if (png_ptr->transformations)
+ png_do_read_transformations(png_ptr, &row_info);
+#endif
+
+ /* The transformed pixel depth should match the depth now in row_info. */
+ if (png_ptr->transformed_pixel_depth == 0)
+ {
+ png_ptr->transformed_pixel_depth = row_info.pixel_depth;
+ if (row_info.pixel_depth > png_ptr->maximum_pixel_depth)
+ png_error(png_ptr, "progressive row overflow");
+ }
- png_memcpy(png_ptr->prev_row, png_ptr->row_buf, png_ptr->rowbytes + 1);
+ else if (png_ptr->transformed_pixel_depth != row_info.pixel_depth)
+ png_error(png_ptr, "internal progressive row size calculation error");
- if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA))
- png_do_read_transformations(png_ptr);
#ifdef PNG_READ_INTERLACING_SUPPORTED
/* Blow up interlaced rows to full size */
if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
{
if (png_ptr->pass < 6)
-/* old interface (pre-1.0.9):
- png_do_read_interlace(&(png_ptr->row_info),
- png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations);
- */
- png_do_read_interlace(png_ptr);
+ png_do_read_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass,
+ png_ptr->transformations);
switch (png_ptr->pass)
{
@@ -1218,24 +1186,26 @@ png_push_process_row(png_structp png_ptr)
void /* PRIVATE */
png_read_push_finish_row(png_structp png_ptr)
{
+#ifdef PNG_READ_INTERLACING_SUPPORTED
/* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
/* Start of interlace block */
- PNG_CONST int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};
+ static PNG_CONST png_byte FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};
/* Offset to next interlace block */
- PNG_CONST int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
+ static PNG_CONST png_byte FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
/* Start of interlace block in the y direction */
- PNG_CONST int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};
+ static PNG_CONST png_byte FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};
/* Offset to next interlace block in the y direction */
- PNG_CONST int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};
+ static PNG_CONST png_byte FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};
/* Height of interlace block. This is not currently used - if you need
* it, uncomment it here and in png.h
- PNG_CONST int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1};
+ static PNG_CONST png_byte FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1};
*/
+#endif
png_ptr->row_number++;
if (png_ptr->row_number < png_ptr->num_rows)
@@ -1279,519 +1249,6 @@ png_read_push_finish_row(png_structp png_ptr)
#endif /* PNG_READ_INTERLACING_SUPPORTED */
}
-#ifdef PNG_READ_tEXt_SUPPORTED
-void /* PRIVATE */
-png_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
- length)
-{
- if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
- {
- PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */
- png_error(png_ptr, "Out of place tEXt");
- /*NOT REACHED*/
- }
-
-#ifdef PNG_MAX_MALLOC_64K
- png_ptr->skip_length = 0; /* This may not be necessary */
-
- if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */
- {
- png_warning(png_ptr, "tEXt chunk too large to fit in memory");
- png_ptr->skip_length = length - (png_uint_32)65535L;
- length = (png_uint_32)65535L;
- }
-#endif
-
- png_ptr->current_text = (png_charp)png_malloc(png_ptr,
- (png_size_t)(length + 1));
- png_ptr->current_text[length] = '\0';
- png_ptr->current_text_ptr = png_ptr->current_text;
- png_ptr->current_text_size = (png_size_t)length;
- png_ptr->current_text_left = (png_size_t)length;
- png_ptr->process_mode = PNG_READ_tEXt_MODE;
-}
-
-void /* PRIVATE */
-png_push_read_tEXt(png_structp png_ptr, png_infop info_ptr)
-{
- if (png_ptr->buffer_size && png_ptr->current_text_left)
- {
- png_size_t text_size;
-
- if (png_ptr->buffer_size < png_ptr->current_text_left)
- text_size = png_ptr->buffer_size;
-
- else
- text_size = png_ptr->current_text_left;
-
- png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
- png_ptr->current_text_left -= text_size;
- png_ptr->current_text_ptr += text_size;
- }
- if (!(png_ptr->current_text_left))
- {
- png_textp text_ptr;
- png_charp text;
- png_charp key;
- int ret;
-
- if (png_ptr->buffer_size < 4)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- png_push_crc_finish(png_ptr);
-
-#ifdef PNG_MAX_MALLOC_64K
- if (png_ptr->skip_length)
- return;
-#endif
-
- key = png_ptr->current_text;
-
- for (text = key; *text; text++)
- /* Empty loop */ ;
-
- if (text < key + png_ptr->current_text_size)
- text++;
-
- text_ptr = (png_textp)png_malloc(png_ptr, png_sizeof(png_text));
- text_ptr->compression = PNG_TEXT_COMPRESSION_NONE;
- text_ptr->key = key;
- text_ptr->itxt_length = 0;
- text_ptr->lang = NULL;
- text_ptr->lang_key = NULL;
- text_ptr->text = text;
-
- ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
-
- png_free(png_ptr, key);
- png_free(png_ptr, text_ptr);
- png_ptr->current_text = NULL;
-
- if (ret)
- png_warning(png_ptr, "Insufficient memory to store text chunk");
- }
-}
-#endif
-
-#ifdef PNG_READ_zTXt_SUPPORTED
-void /* PRIVATE */
-png_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
- length)
-{
- if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
- {
- PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */
- png_error(png_ptr, "Out of place zTXt");
- /*NOT REACHED*/
- }
-
-#ifdef PNG_MAX_MALLOC_64K
- /* We can't handle zTXt chunks > 64K, since we don't have enough space
- * to be able to store the uncompressed data. Actually, the threshold
- * is probably around 32K, but it isn't as definite as 64K is.
- */
- if (length > (png_uint_32)65535L)
- {
- png_warning(png_ptr, "zTXt chunk too large to fit in memory");
- png_push_crc_skip(png_ptr, length);
- return;
- }
-#endif
-
- png_ptr->current_text = (png_charp)png_malloc(png_ptr,
- (png_size_t)(length + 1));
- png_ptr->current_text[length] = '\0';
- png_ptr->current_text_ptr = png_ptr->current_text;
- png_ptr->current_text_size = (png_size_t)length;
- png_ptr->current_text_left = (png_size_t)length;
- png_ptr->process_mode = PNG_READ_zTXt_MODE;
-}
-
-void /* PRIVATE */
-png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr)
-{
- if (png_ptr->buffer_size && png_ptr->current_text_left)
- {
- png_size_t text_size;
-
- if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left)
- text_size = png_ptr->buffer_size;
-
- else
- text_size = png_ptr->current_text_left;
-
- png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
- png_ptr->current_text_left -= text_size;
- png_ptr->current_text_ptr += text_size;
- }
- if (!(png_ptr->current_text_left))
- {
- png_textp text_ptr;
- png_charp text;
- png_charp key;
- int ret;
- png_size_t text_size, key_size;
-
- if (png_ptr->buffer_size < 4)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- png_push_crc_finish(png_ptr);
-
- key = png_ptr->current_text;
-
- for (text = key; *text; text++)
- /* Empty loop */ ;
-
- /* zTXt can't have zero text */
- if (text >= key + png_ptr->current_text_size)
- {
- png_ptr->current_text = NULL;
- png_free(png_ptr, key);
- return;
- }
-
- text++;
-
- if (*text != PNG_TEXT_COMPRESSION_zTXt) /* Check compression byte */
- {
- png_ptr->current_text = NULL;
- png_free(png_ptr, key);
- return;
- }
-
- text++;
-
- png_ptr->zstream.next_in = (png_bytep)text;
- png_ptr->zstream.avail_in = (uInt)(png_ptr->current_text_size -
- (text - key));
- png_ptr->zstream.next_out = png_ptr->zbuf;
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
-
- key_size = text - key;
- text_size = 0;
- text = NULL;
- ret = Z_STREAM_END;
-
- while (png_ptr->zstream.avail_in)
- {
- ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);
- if (ret != Z_OK && ret != Z_STREAM_END)
- {
- inflateReset(&png_ptr->zstream);
- png_ptr->zstream.avail_in = 0;
- png_ptr->current_text = NULL;
- png_free(png_ptr, key);
- png_free(png_ptr, text);
- return;
- }
-
- if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END)
- {
- if (text == NULL)
- {
- text = (png_charp)png_malloc(png_ptr,
- (png_ptr->zbuf_size
- - png_ptr->zstream.avail_out + key_size + 1));
-
- png_memcpy(text + key_size, png_ptr->zbuf,
- png_ptr->zbuf_size - png_ptr->zstream.avail_out);
-
- png_memcpy(text, key, key_size);
-
- text_size = key_size + png_ptr->zbuf_size -
- png_ptr->zstream.avail_out;
-
- *(text + text_size) = '\0';
- }
-
- else
- {
- png_charp tmp;
-
- tmp = text;
- text = (png_charp)png_malloc(png_ptr, text_size +
- (png_ptr->zbuf_size
- - png_ptr->zstream.avail_out + 1));
-
- png_memcpy(text, tmp, text_size);
- png_free(png_ptr, tmp);
-
- png_memcpy(text + text_size, png_ptr->zbuf,
- png_ptr->zbuf_size - png_ptr->zstream.avail_out);
-
- text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out;
- *(text + text_size) = '\0';
- }
-
- if (ret != Z_STREAM_END)
- {
- png_ptr->zstream.next_out = png_ptr->zbuf;
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
- }
- }
- else
- {
- break;
- }
-
- if (ret == Z_STREAM_END)
- break;
- }
-
- inflateReset(&png_ptr->zstream);
- png_ptr->zstream.avail_in = 0;
-
- if (ret != Z_STREAM_END)
- {
- png_ptr->current_text = NULL;
- png_free(png_ptr, key);
- png_free(png_ptr, text);
- return;
- }
-
- png_ptr->current_text = NULL;
- png_free(png_ptr, key);
- key = text;
- text += key_size;
-
- text_ptr = (png_textp)png_malloc(png_ptr,
- png_sizeof(png_text));
- text_ptr->compression = PNG_TEXT_COMPRESSION_zTXt;
- text_ptr->key = key;
- text_ptr->itxt_length = 0;
- text_ptr->lang = NULL;
- text_ptr->lang_key = NULL;
- text_ptr->text = text;
-
- ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
-
- png_free(png_ptr, key);
- png_free(png_ptr, text_ptr);
-
- if (ret)
- png_warning(png_ptr, "Insufficient memory to store text chunk");
- }
-}
-#endif
-
-#ifdef PNG_READ_iTXt_SUPPORTED
-void /* PRIVATE */
-png_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
- length)
-{
- if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
- {
- PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */
- png_error(png_ptr, "Out of place iTXt");
- /*NOT REACHED*/
- }
-
-#ifdef PNG_MAX_MALLOC_64K
- png_ptr->skip_length = 0; /* This may not be necessary */
-
- if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */
- {
- png_warning(png_ptr, "iTXt chunk too large to fit in memory");
- png_ptr->skip_length = length - (png_uint_32)65535L;
- length = (png_uint_32)65535L;
- }
-#endif
-
- png_ptr->current_text = (png_charp)png_malloc(png_ptr,
- (png_size_t)(length + 1));
- png_ptr->current_text[length] = '\0';
- png_ptr->current_text_ptr = png_ptr->current_text;
- png_ptr->current_text_size = (png_size_t)length;
- png_ptr->current_text_left = (png_size_t)length;
- png_ptr->process_mode = PNG_READ_iTXt_MODE;
-}
-
-void /* PRIVATE */
-png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr)
-{
-
- if (png_ptr->buffer_size && png_ptr->current_text_left)
- {
- png_size_t text_size;
-
- if (png_ptr->buffer_size < png_ptr->current_text_left)
- text_size = png_ptr->buffer_size;
-
- else
- text_size = png_ptr->current_text_left;
-
- png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
- png_ptr->current_text_left -= text_size;
- png_ptr->current_text_ptr += text_size;
- }
-
- if (!(png_ptr->current_text_left))
- {
- png_textp text_ptr;
- png_charp key;
- int comp_flag;
- png_charp lang;
- png_charp lang_key;
- png_charp text;
- int ret;
-
- if (png_ptr->buffer_size < 4)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- png_push_crc_finish(png_ptr);
-
-#ifdef PNG_MAX_MALLOC_64K
- if (png_ptr->skip_length)
- return;
-#endif
-
- key = png_ptr->current_text;
-
- for (lang = key; *lang; lang++)
- /* Empty loop */ ;
-
- if (lang < key + png_ptr->current_text_size - 3)
- lang++;
-
- comp_flag = *lang++;
- lang++; /* Skip comp_type, always zero */
-
- for (lang_key = lang; *lang_key; lang_key++)
- /* Empty loop */ ;
-
- lang_key++; /* Skip NUL separator */
-
- text=lang_key;
-
- if (lang_key < key + png_ptr->current_text_size - 1)
- {
- for (; *text; text++)
- /* Empty loop */ ;
- }
-
- if (text < key + png_ptr->current_text_size)
- text++;
-
- text_ptr = (png_textp)png_malloc(png_ptr,
- png_sizeof(png_text));
-
- text_ptr->compression = comp_flag + 2;
- text_ptr->key = key;
- text_ptr->lang = lang;
- text_ptr->lang_key = lang_key;
- text_ptr->text = text;
- text_ptr->text_length = 0;
- text_ptr->itxt_length = png_strlen(text);
-
- ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
-
- png_ptr->current_text = NULL;
-
- png_free(png_ptr, text_ptr);
- if (ret)
- png_warning(png_ptr, "Insufficient memory to store iTXt chunk");
- }
-}
-#endif
-
-/* This function is called when we haven't found a handler for this
- * chunk. If there isn't a problem with the chunk itself (ie a bad chunk
- * name or a critical chunk), the chunk is (currently) silently ignored.
- */
-void /* PRIVATE */
-png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32
- length)
-{
- png_uint_32 skip = 0;
-
- if (!(png_ptr->chunk_name[0] & 0x20))
- {
-#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
- if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
- PNG_HANDLE_CHUNK_ALWAYS
-#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
- && png_ptr->read_user_chunk_fn == NULL
-#endif
- )
-#endif
- png_chunk_error(png_ptr, "unknown critical chunk");
-
- PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */
- }
-
-#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
- if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS)
- {
-#ifdef PNG_MAX_MALLOC_64K
- if (length > (png_uint_32)65535L)
- {
- png_warning(png_ptr, "unknown chunk too large to fit in memory");
- skip = length - (png_uint_32)65535L;
- length = (png_uint_32)65535L;
- }
-#endif
- png_memcpy((png_charp)png_ptr->unknown_chunk.name,
- (png_charp)png_ptr->chunk_name,
- png_sizeof(png_ptr->unknown_chunk.name));
- png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name) - 1]
- = '\0';
-
- png_ptr->unknown_chunk.size = (png_size_t)length;
-
- if (length == 0)
- png_ptr->unknown_chunk.data = NULL;
-
- else
- {
- png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr,
- (png_size_t)length);
- png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length);
- }
-
-#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
- if (png_ptr->read_user_chunk_fn != NULL)
- {
- /* Callback to user unknown chunk handler */
- int ret;
- ret = (*(png_ptr->read_user_chunk_fn))
- (png_ptr, &png_ptr->unknown_chunk);
-
- if (ret < 0)
- png_chunk_error(png_ptr, "error in user chunk");
-
- if (ret == 0)
- {
- if (!(png_ptr->chunk_name[0] & 0x20))
- if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
- PNG_HANDLE_CHUNK_ALWAYS)
- png_chunk_error(png_ptr, "unknown critical chunk");
- png_set_unknown_chunks(png_ptr, info_ptr,
- &png_ptr->unknown_chunk, 1);
- }
- }
-
- else
-#endif
- png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1);
- png_free(png_ptr, png_ptr->unknown_chunk.data);
- png_ptr->unknown_chunk.data = NULL;
- }
-
- else
-#endif
- skip=length;
- png_push_crc_skip(png_ptr, skip);
-}
-
void /* PRIVATE */
png_push_have_info(png_structp png_ptr, png_infop info_ptr)
{
@@ -1814,19 +1271,22 @@ png_push_have_row(png_structp png_ptr, png_bytep row)
(int)png_ptr->pass);
}
+#ifdef PNG_READ_INTERLACING_SUPPORTED
void PNGAPI
png_progressive_combine_row (png_structp png_ptr, png_bytep old_row,
png_const_bytep new_row)
{
- PNG_CONST int FARDATA png_pass_dsp_mask[7] =
- {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff};
-
if (png_ptr == NULL)
return;
- if (new_row != NULL) /* new_row must == png_ptr->row_buf here. */
- png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]);
+ /* new_row is a flag here - if it is NULL then the app callback was called
+ * from an empty row (see the calls to png_struct::row_fn below), otherwise
+ * it must be png_ptr->row_buf+1
+ */
+ if (new_row != NULL)
+ png_combine_row(png_ptr, old_row, 1/*display*/);
}
+#endif /* PNG_READ_INTERLACING_SUPPORTED */
void PNGAPI
png_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr,
diff --git a/src/3rdparty/libpng/pngpriv.h b/src/3rdparty/libpng/pngpriv.h
index e248ad8bbe..f3441ee2a1 100644
--- a/src/3rdparty/libpng/pngpriv.h
+++ b/src/3rdparty/libpng/pngpriv.h
@@ -2,11 +2,11 @@
/* pngpriv.h - private declarations for use inside libpng
*
* For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2011 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2012 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
- * Last changed in libpng 1.5.0 [January 6, 2011]
+ * Last changed in libpng 1.5.10 [March 29, 2012]
*
* This code is released under the libpng license.
* For conditions of distribution and use, see the disclaimer
@@ -26,15 +26,35 @@
#define PNGPRIV_H
#ifdef _MSC_VER
-# define _CRT_SECURE_NO_DEPRECATE
+# ifndef _CRT_SECURE_NO_DEPRECATE
+# define _CRT_SECURE_NO_DEPRECATE
+# endif
#endif
+/* Feature Test Macros. The following are defined here to ensure that correctly
+ * implemented libraries reveal the APIs libpng needs to build and hide those
+ * that are not needed and potentially damaging to the compilation.
+ *
+ * Feature Test Macros must be defined before any system header is included (see
+ * POSIX 1003.1 2.8.2 "POSIX Symbols."
+ *
+ * These macros only have an effect if the operating system supports either
+ * POSIX 1003.1 or C99, or both. On other operating systems (particularly
+ * Windows/Visual Studio) there is no effect; the OS specific tests below are
+ * still required (as of 2011-05-02.)
+ */
+#define _POSIX_SOURCE 1 /* Just the POSIX 1003.1 and C89 APIs */
+
/* This is required for the definition of abort(), used as a last ditch
* error handler when all else fails.
*/
#include <stdlib.h>
-#define PNGLIB_BUILD
+/* This is used to find 'offsetof', used below for alignment tests. */
+#include <stddef.h>
+
+#define PNGLIB_BUILD /*libpng is being built, not used*/
+
#ifdef PNG_USER_CONFIG
# include "pngusr.h"
/* These should have been defined in pngusr.h */
@@ -45,10 +65,125 @@
# define PNG_USER_DLLFNAME_POSTFIX "Cb"
# endif
#endif
+
+/* Is this a build of a DLL where compilation of the object modules requires
+ * different preprocessor settings to those required for a simple library? If
+ * so PNG_BUILD_DLL must be set.
+ *
+ * If libpng is used inside a DLL but that DLL does not export the libpng APIs
+ * PNG_BUILD_DLL must not be set. To avoid the code below kicking in build a
+ * static library of libpng then link the DLL against that.
+ */
+#ifndef PNG_BUILD_DLL
+# ifdef DLL_EXPORT
+ /* This is set by libtool when files are compiled for a DLL; libtool
+ * always compiles twice, even on systems where it isn't necessary. Set
+ * PNG_BUILD_DLL in case it is necessary:
+ */
+# define PNG_BUILD_DLL
+# else
+# ifdef _WINDLL
+ /* This is set by the Microsoft Visual Studio IDE in projects that
+ * build a DLL. It can't easily be removed from those projects (it
+ * isn't visible in the Visual Studio UI) so it is a fairly reliable
+ * indication that PNG_IMPEXP needs to be set to the DLL export
+ * attributes.
+ */
+# define PNG_BUILD_DLL
+# else
+# ifdef __DLL__
+ /* This is set by the Borland C system when compiling for a DLL
+ * (as above.)
+ */
+# define PNG_BUILD_DLL
+# else
+ /* Add additional compiler cases here. */
+# endif
+# endif
+# endif
+#endif /* Setting PNG_BUILD_DLL if required */
+
+/* Modfied for usage in Qt: Do not export the libpng APIs */
+#ifdef PNG_BUILD_DLL
+#undef PNG_BUILD_DLL
+#endif
+
+/* See pngconf.h for more details: the builder of the library may set this on
+ * the command line to the right thing for the specific compilation system or it
+ * may be automagically set above (at present we know of no system where it does
+ * need to be set on the command line.)
+ *
+ * PNG_IMPEXP must be set here when building the library to prevent pngconf.h
+ * setting it to the "import" setting for a DLL build.
+ */
+#ifndef PNG_IMPEXP
+# ifdef PNG_BUILD_DLL
+# define PNG_IMPEXP PNG_DLL_EXPORT
+# else
+ /* Not building a DLL, or the DLL doesn't require specific export
+ * definitions.
+ */
+# define PNG_IMPEXP
+# endif
+#endif
+
+/* No warnings for private or deprecated functions in the build: */
+#ifndef PNG_DEPRECATED
+# define PNG_DEPRECATED
+#endif
+#ifndef PNG_PRIVATE
+# define PNG_PRIVATE
+#endif
+
#include "png.h"
#include "pnginfo.h"
#include "pngstruct.h"
+/* pngconf.h does not set PNG_DLL_EXPORT unless it is required, so: */
+#ifndef PNG_DLL_EXPORT
+# define PNG_DLL_EXPORT
+#endif
+
+/* SECURITY and SAFETY:
+ *
+ * By default libpng is built without any internal limits on image size,
+ * individual heap (png_malloc) allocations or the total amount of memory used.
+ * If PNG_SAFE_LIMITS_SUPPORTED is defined, however, the limits below are used
+ * (unless individually overridden). These limits are believed to be fairly
+ * safe, but builders of secure systems should verify the values against the
+ * real system capabilities.
+ */
+
+#ifdef PNG_SAFE_LIMITS_SUPPORTED
+ /* 'safe' limits */
+# ifndef PNG_USER_WIDTH_MAX
+# define PNG_USER_WIDTH_MAX 1000000
+# endif
+# ifndef PNG_USER_HEIGHT_MAX
+# define PNG_USER_HEIGHT_MAX 1000000
+# endif
+# ifndef PNG_USER_CHUNK_CACHE_MAX
+# define PNG_USER_CHUNK_CACHE_MAX 128
+# endif
+# ifndef PNG_USER_CHUNK_MALLOC_MAX
+# define PNG_USER_CHUNK_MALLOC_MAX 8000000
+# endif
+#else
+ /* values for no limits */
+# ifndef PNG_USER_WIDTH_MAX
+# define PNG_USER_WIDTH_MAX 0x7fffffff
+# endif
+# ifndef PNG_USER_HEIGHT_MAX
+# define PNG_USER_HEIGHT_MAX 0x7fffffff
+# endif
+# ifndef PNG_USER_CHUNK_CACHE_MAX
+# define PNG_USER_CHUNK_CACHE_MAX 0
+# endif
+# ifndef PNG_USER_CHUNK_MALLOC_MAX
+# define PNG_USER_CHUNK_MALLOC_MAX 0
+# endif
+#endif
+
/* This is used for 16 bit gamma tables - only the top level pointers are const,
* this could be changed:
*/
@@ -87,13 +222,15 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp;
# define PNG_MAX_MALLOC_64K
#endif
+#ifndef PNG_UNUSED
/* Unused formal parameter warnings are silenced using the following macro
* which is expected to have no bad effects on performance (optimizing
* compilers will probably remove it entirely). Note that if you replace
* it with something other than whitespace, you must include the terminating
* semicolon.
*/
-#define PNG_UNUSED(param) (void)param;
+# define PNG_UNUSED(param) (void)param;
+#endif
/* Just a little check that someone hasn't tried to define something
* contradictory.
@@ -103,12 +240,44 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp;
# define PNG_ZBUF_SIZE 65536L
#endif
-/* If warnings or errors are turned off the code is disabled
- * or redirected here.
+/* PNG_STATIC is used to mark internal file scope functions if they need to be
+ * accessed for implementation tests (see the code in tests/?*).
+ */
+#ifndef PNG_STATIC
+# define PNG_STATIC static
+#endif
+
+/* C99 restrict is used where possible, to do this 'restrict' is defined as
+ * empty if we can't be sure it is supported. configure builds have already
+ * done this work.
+ */
+#ifdef PNG_CONFIGURE_LIBPNG
+# define PNG_RESTRICT restrict
+#else
+ /* Modern compilers support restrict, but assume not for anything not
+ * recognized here:
+ */
+# if defined __GNUC__ || defined _MSC_VER || defined __WATCOMC__
+# define PNG_RESTRICT restrict
+# else
+# define PNG_RESTRICT
+# endif
+#endif
+
+/* If warnings or errors are turned off the code is disabled or redirected here.
+ * From 1.5.4 functions have been added to allow very limited formatting of
+ * error and warning messages - this code will also be disabled here.
*/
-#ifndef PNG_WARNINGS_SUPPORTED
-# define png_warning(s1,s2) ((void)0)
-# define png_chunk_warning(s1,s2) ((void)0)
+#ifdef PNG_WARNINGS_SUPPORTED
+# define PNG_WARNING_PARAMETERS(p) png_warning_parameters p;
+#else
+# define png_warning(s1,s2) ((void)(s1))
+# define png_chunk_warning(s1,s2) ((void)(s1))
+# define png_warning_parameter(p,number,string) ((void)0)
+# define png_warning_parameter_unsigned(p,number,format,value) ((void)0)
+# define png_warning_parameter_signed(p,number,format,value) ((void)0)
+# define png_formatted_warning(pp,p,message) ((void)(pp))
+# define PNG_WARNING_PARAMETERS(p)
#endif
#ifndef PNG_ERROR_TEXT_SUPPORTED
# define png_error(s1,s2) png_err(s1)
@@ -116,15 +285,28 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp;
# define png_fixed_error(s1,s2) png_err(s1)
#endif
+/* C allows up-casts from (void*) to any pointer and (const void*) to any
+ * pointer to a const object. C++ regards this as a type error and requires an
+ * explicit, static, cast and provides the static_cast<> rune to ensure that
+ * const is not cast away.
+ */
+#ifdef __cplusplus
+# define png_voidcast(type, value) static_cast<type>(value)
+#else
+# define png_voidcast(type, value) (value)
+#endif /* __cplusplus */
+
#ifndef PNG_EXTERN
/* The functions exported by PNG_EXTERN are internal functions, which
* aren't usually used outside the library (as far as I know), so it is
* debatable if they should be exported at all. In the future, when it
* is possible to have run-time registry of chunk-handling functions,
* some of these might be made available again.
-# define PNG_EXTERN extern
+ *
+ * 1.5.7: turned the use of 'extern' back on, since it is localized to pngpriv.h
+ * it should be safe now (it is unclear why it was turned off.)
*/
-# define PNG_EXTERN
+# define PNG_EXTERN extern
#endif
/* Some fixed point APIs are still required even if not exported because
@@ -202,60 +384,74 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp;
# define NOCHECK 0
# define CVT_PTR(ptr) (png_far_to_near(png_ptr,ptr,CHECK))
# define CVT_PTR_NOCHECK(ptr) (png_far_to_near(png_ptr,ptr,NOCHECK))
-# define png_strcpy _fstrcpy
-# define png_strncpy _fstrncpy /* Added to v 1.2.6 */
# define png_strlen _fstrlen
# define png_memcmp _fmemcmp /* SJT: added */
# define png_memcpy _fmemcpy
# define png_memset _fmemset
-# define png_sprintf sprintf
#else
# ifdef _WINDOWS_ /* Favor Windows over C runtime fns */
# define CVT_PTR(ptr) (ptr)
# define CVT_PTR_NOCHECK(ptr) (ptr)
-# define png_strcpy lstrcpyA
-# define png_strncpy lstrcpynA
# define png_strlen lstrlenA
# define png_memcmp memcmp
# define png_memcpy CopyMemory
# define png_memset memset
-# define png_sprintf wsprintfA
# else
# define CVT_PTR(ptr) (ptr)
# define CVT_PTR_NOCHECK(ptr) (ptr)
-# define png_strcpy strcpy
-# define png_strncpy strncpy /* Added to v 1.2.6 */
# define png_strlen strlen
# define png_memcmp memcmp /* SJT: added */
# define png_memcpy memcpy
# define png_memset memset
-# define png_sprintf sprintf
# endif
#endif
-/* End of memory model/platform independent support */
-#ifndef PNG_NO_SNPRINTF
-# ifdef _MSC_VER
-# define png_snprintf _snprintf /* Added to v 1.2.19 */
-# define png_snprintf2 _snprintf
-# define png_snprintf6 _snprintf
+/* These macros may need to be architecture dependent. */
+#define PNG_ALIGN_NONE 0 /* do not use data alignment */
+#define PNG_ALIGN_ALWAYS 1 /* assume unaligned accesses are OK */
+#ifdef offsetof
+# define PNG_ALIGN_OFFSET 2 /* use offsetof to determine alignment */
+#else
+# define PNG_ALIGN_OFFSET -1 /* prevent the use of this */
+#endif
+#define PNG_ALIGN_SIZE 3 /* use sizeof to determine alignment */
+
+#ifndef PNG_ALIGN_TYPE
+ /* Default to using aligned access optimizations and requiring alignment to a
+ * multiple of the data type size. Override in a compiler specific fashion
+ * if necessary by inserting tests here:
+ */
+# define PNG_ALIGN_TYPE PNG_ALIGN_SIZE
+#endif
+
+#if PNG_ALIGN_TYPE == PNG_ALIGN_SIZE
+ /* This is used because in some compiler implementations non-aligned
+ * structure members are supported, so the offsetof approach below fails.
+ * Set PNG_ALIGN_TO_SIZE=0 for compiler combinations where unaligned access
+ * is good for performance. Do not do this unless you have tested the result
+ * and understand it.
+ */
+# define png_alignof(type) (sizeof (type))
+#else
+# if PNG_ALIGN_TYPE == PNG_ALIGN_OFFSET
+# define png_alignof(type) offsetof(struct{char c; type t;}, t)
# else
-# define png_snprintf snprintf /* Added to v 1.2.19 */
-# define png_snprintf2 snprintf
-# define png_snprintf6 snprintf
+# if PNG_ALIGN_TYPE == PNG_ALIGN_ALWAYS
+# define png_alignof(type) (1)
+# endif
+ /* Else leave png_alignof undefined to prevent use thereof */
# endif
+#endif
+
+/* This implicitly assumes alignment is always to a power of 2. */
+#ifdef png_alignof
+# define png_isaligned(ptr, type)\
+ ((((const char*)ptr-(const char*)0) & (png_alignof(type)-1)) == 0)
#else
- /* You don't have or don't want to use snprintf(). Caution: Using
- * sprintf instead of snprintf exposes your application to accidental
- * or malevolent buffer overflows. If you don't have snprintf()
- * as a general rule you should provide one (you can get one from
- * Portable OpenSSH).
- */
-# define png_snprintf(s1,n,fmt,x1) png_sprintf(s1,fmt,x1)
-# define png_snprintf2(s1,n,fmt,x1,x2) png_sprintf(s1,fmt,x1,x2)
-# define png_snprintf6(s1,n,fmt,x1,x2,x3,x4,x5,x6) \
- png_sprintf(s1,fmt,x1,x2,x3,x4,x5,x6)
+# define png_isaligned(ptr, type) 0
#endif
+
+/* End of memory model/platform independent support */
/* End of 1.5.0beta36 move from pngconf.h */
/* CONSTANTS and UTILITY MACROS
@@ -263,12 +459,14 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp;
*/
/* Various modes of operation. Note that after an init, mode is set to
- * zero automatically when the structure is created.
+ * zero automatically when the structure is created. Three of these
+ * are defined in png.h because they need to be visible to applications
+ * that call png_set_unknown_chunk().
*/
-#define PNG_HAVE_IHDR 0x01
-#define PNG_HAVE_PLTE 0x02
+/* #define PNG_HAVE_IHDR 0x01 (defined in png.h) */
+/* #define PNG_HAVE_PLTE 0x02 (defined in png.h) */
#define PNG_HAVE_IDAT 0x04
-#define PNG_AFTER_IDAT 0x08 /* Have complete zlib datastream */
+/* #define PNG_AFTER_IDAT 0x08 (defined in png.h) */
#define PNG_HAVE_IEND 0x10
#define PNG_HAVE_gAMA 0x20
#define PNG_HAVE_cHRM 0x40
@@ -279,6 +477,7 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp;
#define PNG_BACKGROUND_IS_GRAY 0x800
#define PNG_HAVE_PNG_SIGNATURE 0x1000
#define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000 /* Have another chunk after IDAT */
+#define PNG_HAVE_iCCP 0x4000
/* Flags for the transformations the PNG library does on the image data */
#define PNG_BGR 0x0001
@@ -288,32 +487,31 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp;
#define PNG_SWAP_BYTES 0x0010
#define PNG_INVERT_MONO 0x0020
#define PNG_QUANTIZE 0x0040
-#define PNG_BACKGROUND 0x0080
+#define PNG_COMPOSE 0x0080 /* Was PNG_BACKGROUND */
#define PNG_BACKGROUND_EXPAND 0x0100
- /* 0x0200 unused */
-#define PNG_16_TO_8 0x0400
+#define PNG_EXPAND_16 0x0200 /* Added to libpng 1.5.2 */
+#define PNG_16_TO_8 0x0400 /* Becomes 'chop' in 1.5.4 */
#define PNG_RGBA 0x0800
#define PNG_EXPAND 0x1000
#define PNG_GAMMA 0x2000
#define PNG_GRAY_TO_RGB 0x4000
-#define PNG_FILLER 0x8000L
-#define PNG_PACKSWAP 0x10000L
-#define PNG_SWAP_ALPHA 0x20000L
-#define PNG_STRIP_ALPHA 0x40000L
-#define PNG_INVERT_ALPHA 0x80000L
-#define PNG_USER_TRANSFORM 0x100000L
-#define PNG_RGB_TO_GRAY_ERR 0x200000L
-#define PNG_RGB_TO_GRAY_WARN 0x400000L
-#define PNG_RGB_TO_GRAY 0x600000L /* two bits, RGB_TO_GRAY_ERR|WARN */
- /* 0x800000L Unused */
-#define PNG_ADD_ALPHA 0x1000000L /* Added to libpng-1.2.7 */
-#define PNG_EXPAND_tRNS 0x2000000L /* Added to libpng-1.2.9 */
- /* 0x4000000L unused */
- /* 0x8000000L unused */
- /* 0x10000000L unused */
- /* 0x20000000L unused */
- /* 0x40000000L unused */
-
+#define PNG_FILLER 0x8000
+#define PNG_PACKSWAP 0x10000
+#define PNG_SWAP_ALPHA 0x20000
+#define PNG_STRIP_ALPHA 0x40000
+#define PNG_INVERT_ALPHA 0x80000
+#define PNG_USER_TRANSFORM 0x100000
+#define PNG_RGB_TO_GRAY_ERR 0x200000
+#define PNG_RGB_TO_GRAY_WARN 0x400000
+#define PNG_RGB_TO_GRAY 0x600000 /* two bits, RGB_TO_GRAY_ERR|WARN */
+#define PNG_ENCODE_ALPHA 0x800000 /* Added to libpng-1.5.4 */
+#define PNG_ADD_ALPHA 0x1000000 /* Added to libpng-1.2.7 */
+#define PNG_EXPAND_tRNS 0x2000000 /* Added to libpng-1.2.9 */
+#define PNG_SCALE_16_TO_8 0x4000000 /* Added to libpng-1.5.4 */
+ /* 0x8000000 unused */
+ /* 0x10000000 unused */
+ /* 0x20000000 unused */
+ /* 0x40000000 unused */
/* Flags for png_create_struct */
#define PNG_STRUCT_PNG 0x0001
#define PNG_STRUCT_INFO 0x0002
@@ -335,25 +533,25 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp;
#define PNG_FLAG_CRC_ANCILLARY_NOWARN 0x0200
#define PNG_FLAG_CRC_CRITICAL_USE 0x0400
#define PNG_FLAG_CRC_CRITICAL_IGNORE 0x0800
- /* 0x1000 unused */
- /* 0x2000 unused */
- /* 0x4000 unused */
-#define PNG_FLAG_KEEP_UNKNOWN_CHUNKS 0x8000L
-#define PNG_FLAG_KEEP_UNSAFE_CHUNKS 0x10000L
-#define PNG_FLAG_LIBRARY_MISMATCH 0x20000L
-#define PNG_FLAG_STRIP_ERROR_NUMBERS 0x40000L
-#define PNG_FLAG_STRIP_ERROR_TEXT 0x80000L
-#define PNG_FLAG_MALLOC_NULL_MEM_OK 0x100000L
-#define PNG_FLAG_ADD_ALPHA 0x200000L /* Added to libpng-1.2.8 */
-#define PNG_FLAG_STRIP_ALPHA 0x400000L /* Added to libpng-1.2.8 */
-#define PNG_FLAG_BENIGN_ERRORS_WARN 0x800000L /* Added to libpng-1.4.0 */
- /* 0x1000000L unused */
- /* 0x2000000L unused */
- /* 0x4000000L unused */
- /* 0x8000000L unused */
- /* 0x10000000L unused */
- /* 0x20000000L unused */
- /* 0x40000000L unused */
+#define PNG_FLAG_ASSUME_sRGB 0x1000 /* Added to libpng-1.5.4 */
+#define PNG_FLAG_OPTIMIZE_ALPHA 0x2000 /* Added to libpng-1.5.4 */
+#define PNG_FLAG_DETECT_UNINITIALIZED 0x4000 /* Added to libpng-1.5.4 */
+#define PNG_FLAG_KEEP_UNKNOWN_CHUNKS 0x8000
+#define PNG_FLAG_KEEP_UNSAFE_CHUNKS 0x10000
+#define PNG_FLAG_LIBRARY_MISMATCH 0x20000
+#define PNG_FLAG_STRIP_ERROR_NUMBERS 0x40000
+#define PNG_FLAG_STRIP_ERROR_TEXT 0x80000
+#define PNG_FLAG_MALLOC_NULL_MEM_OK 0x100000
+ /* 0x200000 unused */
+ /* 0x400000 unused */
+#define PNG_FLAG_BENIGN_ERRORS_WARN 0x800000 /* Added to libpng-1.4.0 */
+#define PNG_FLAG_ZTXT_CUSTOM_STRATEGY 0x1000000 /* 5 lines added */
+#define PNG_FLAG_ZTXT_CUSTOM_LEVEL 0x2000000 /* to libpng-1.5.4 */
+#define PNG_FLAG_ZTXT_CUSTOM_MEM_LEVEL 0x4000000
+#define PNG_FLAG_ZTXT_CUSTOM_WINDOW_BITS 0x8000000
+#define PNG_FLAG_ZTXT_CUSTOM_METHOD 0x10000000
+ /* 0x20000000 unused */
+ /* 0x40000000 unused */
#define PNG_FLAG_CRC_ANCILLARY_MASK (PNG_FLAG_CRC_ANCILLARY_USE | \
PNG_FLAG_CRC_ANCILLARY_NOWARN)
@@ -435,32 +633,75 @@ PNG_EXTERN png_fixed_point png_fixed PNGARG((png_structp png_ptr, double fp,
#endif
#endif
-/* Constant strings for known chunk types. If you need to add a chunk,
- * define the name here, and add an invocation of the macro wherever it's
- * needed.
+/* Constants for known chunk types. If you need to add a chunk, define the name
+ * here. For historical reasons these constants have the form png_<name>; i.e.
+ * the prefix is lower case. Please use decimal values as the parameters to
+ * match the ISO PNG specification and to avoid relying on the C locale
+ * interpretation of character values.
+ *
+ * Prior to 1.5.6 these constants were strings, as of 1.5.6 png_uint_32 values
+ * are computed and a new macro (PNG_STRING_FROM_CHUNK) added to allow a string
+ * to be generated if required.
+ *
+ * PNG_32b correctly produces a value shifted by up to 24 bits, even on
+ * architectures where (int) is only 16 bits.
+ */
+#define PNG_32b(b,s) ((png_uint_32)(b) << (s))
+#define PNG_CHUNK(b1,b2,b3,b4) \
+ (PNG_32b(b1,24) | PNG_32b(b2,16) | PNG_32b(b3,8) | PNG_32b(b4,0))
+
+#define png_IHDR PNG_CHUNK( 73, 72, 68, 82)
+#define png_IDAT PNG_CHUNK( 73, 68, 65, 84)
+#define png_IEND PNG_CHUNK( 73, 69, 78, 68)
+#define png_PLTE PNG_CHUNK( 80, 76, 84, 69)
+#define png_bKGD PNG_CHUNK( 98, 75, 71, 68)
+#define png_cHRM PNG_CHUNK( 99, 72, 82, 77)
+#define png_gAMA PNG_CHUNK(103, 65, 77, 65)
+#define png_hIST PNG_CHUNK(104, 73, 83, 84)
+#define png_iCCP PNG_CHUNK(105, 67, 67, 80)
+#define png_iTXt PNG_CHUNK(105, 84, 88, 116)
+#define png_oFFs PNG_CHUNK(111, 70, 70, 115)
+#define png_pCAL PNG_CHUNK(112, 67, 65, 76)
+#define png_sCAL PNG_CHUNK(115, 67, 65, 76)
+#define png_pHYs PNG_CHUNK(112, 72, 89, 115)
+#define png_sBIT PNG_CHUNK(115, 66, 73, 84)
+#define png_sPLT PNG_CHUNK(115, 80, 76, 84)
+#define png_sRGB PNG_CHUNK(115, 82, 71, 66)
+#define png_sTER PNG_CHUNK(115, 84, 69, 82)
+#define png_tEXt PNG_CHUNK(116, 69, 88, 116)
+#define png_tIME PNG_CHUNK(116, 73, 77, 69)
+#define png_tRNS PNG_CHUNK(116, 82, 78, 83)
+#define png_zTXt PNG_CHUNK(122, 84, 88, 116)
+
+/* The following will work on (signed char*) strings, whereas the get_uint_32
+ * macro will fail on top-bit-set values because of the sign extension.
*/
-#define PNG_IHDR PNG_CONST png_byte png_IHDR[5] = { 73, 72, 68, 82, '\0'}
-#define PNG_IDAT PNG_CONST png_byte png_IDAT[5] = { 73, 68, 65, 84, '\0'}
-#define PNG_IEND PNG_CONST png_byte png_IEND[5] = { 73, 69, 78, 68, '\0'}
-#define PNG_PLTE PNG_CONST png_byte png_PLTE[5] = { 80, 76, 84, 69, '\0'}
-#define PNG_bKGD PNG_CONST png_byte png_bKGD[5] = { 98, 75, 71, 68, '\0'}
-#define PNG_cHRM PNG_CONST png_byte png_cHRM[5] = { 99, 72, 82, 77, '\0'}
-#define PNG_gAMA PNG_CONST png_byte png_gAMA[5] = {103, 65, 77, 65, '\0'}
-#define PNG_hIST PNG_CONST png_byte png_hIST[5] = {104, 73, 83, 84, '\0'}
-#define PNG_iCCP PNG_CONST png_byte png_iCCP[5] = {105, 67, 67, 80, '\0'}
-#define PNG_iTXt PNG_CONST png_byte png_iTXt[5] = {105, 84, 88, 116, '\0'}
-#define PNG_oFFs PNG_CONST png_byte png_oFFs[5] = {111, 70, 70, 115, '\0'}
-#define PNG_pCAL PNG_CONST png_byte png_pCAL[5] = {112, 67, 65, 76, '\0'}
-#define PNG_sCAL PNG_CONST png_byte png_sCAL[5] = {115, 67, 65, 76, '\0'}
-#define PNG_pHYs PNG_CONST png_byte png_pHYs[5] = {112, 72, 89, 115, '\0'}
-#define PNG_sBIT PNG_CONST png_byte png_sBIT[5] = {115, 66, 73, 84, '\0'}
-#define PNG_sPLT PNG_CONST png_byte png_sPLT[5] = {115, 80, 76, 84, '\0'}
-#define PNG_sRGB PNG_CONST png_byte png_sRGB[5] = {115, 82, 71, 66, '\0'}
-#define PNG_sTER PNG_CONST png_byte png_sTER[5] = {115, 84, 69, 82, '\0'}
-#define PNG_tEXt PNG_CONST png_byte png_tEXt[5] = {116, 69, 88, 116, '\0'}
-#define PNG_tIME PNG_CONST png_byte png_tIME[5] = {116, 73, 77, 69, '\0'}
-#define PNG_tRNS PNG_CONST png_byte png_tRNS[5] = {116, 82, 78, 83, '\0'}
-#define PNG_zTXt PNG_CONST png_byte png_zTXt[5] = {122, 84, 88, 116, '\0'}
+#define PNG_CHUNK_FROM_STRING(s)\
+ PNG_CHUNK(0xff&(s)[0], 0xff&(s)[1], 0xff&(s)[2], 0xff&(s)[3])
+
+/* This uses (char), not (png_byte) to avoid warnings on systems where (char) is
+ * signed and the argument is a (char[]) This macro will fail miserably on
+ * systems where (char) is more than 8 bits.
+ */
+#define PNG_STRING_FROM_CHUNK(s,c)\
+ (void)(((char*)(s))[0]=(char)((c)>>24), ((char*)(s))[1]=(char)((c)>>16),\
+ ((char*)(s))[2]=(char)((c)>>8), ((char*)(s))[3]=(char)((c)))
+
+/* Do the same but terminate with a null character. */
+#define PNG_CSTRING_FROM_CHUNK(s,c)\
+ (void)(PNG_STRING_FROM_CHUNK(s,c), ((char*)(s))[4] = 0)
+
+/* Test on flag values as defined in the spec (section 5.4): */
+#define PNG_CHUNK_ANCILLIARY(c) (1 & ((c) >> 29))
+#define PNG_CHUNK_CRITICAL(c) (!PNG_CHUNK_ANCILLIARY(c))
+#define PNG_CHUNK_PRIVATE(c) (1 & ((c) >> 21))
+#define PNG_CHUNK_RESERVED(c) (1 & ((c) >> 13))
+#define PNG_CHUNK_SAFE_TO_COPY(c) (1 & ((c) >> 5))
+
+/* Gamma values (new at libpng-1.5.4): */
+#define PNG_GAMMA_MAC_OLD 151724 /* Assume '1.8' is really 2.2/1.45! */
+#define PNG_GAMMA_MAC_INVERSE 65909
+#define PNG_GAMMA_sRGB_INVERSE 45455
/* Inhibit C++ name-mangling for libpng functions but not for system calls. */
@@ -474,6 +715,12 @@ extern "C" {
* be found in the files where the functions are located.
*/
+/* Check the user version string for compatibility, returns false if the version
+ * numbers aren't compatible.
+ */
+PNG_EXTERN int png_user_version_check(png_structp png_ptr,
+ png_const_charp user_png_ver);
+
/* Allocate memory for an internal libpng struct */
PNG_EXTERN PNG_FUNCTION(png_voidp,png_create_struct,PNGARG((int type)),
PNG_ALLOCATED);
@@ -542,8 +789,7 @@ PNG_EXTERN void png_crc_read PNGARG((png_structp png_ptr, png_bytep buf,
png_size_t length));
/* Decompress data in a chunk that uses compression */
-#if defined(PNG_zTXt_SUPPORTED) || defined(PNG_iTXt_SUPPORTED) || \
- defined(PNG_iCCP_SUPPORTED) || defined(PNG_sPLT_SUPPORTED)
+#if defined(PNG_READ_COMPRESSED_TEXT_SUPPORTED)
PNG_EXTERN void png_decompress_chunk PNGARG((png_structp png_ptr,
int comp_type, png_size_t chunklength, png_size_t prefix_length,
png_size_t *data_length));
@@ -646,6 +892,7 @@ PNG_EXTERN void png_write_hIST PNGARG((png_structp png_ptr,
png_const_uint_16p hist, int num_hist));
#endif
+/* Chunks that have keywords */
#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \
defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED)
PNG_EXTERN png_size_t png_check_keyword PNGARG((png_structp png_ptr,
@@ -706,17 +953,44 @@ PNG_EXTERN void png_write_finish_row PNGARG((png_structp png_ptr));
/* Internal use only. Called before first row of data */
PNG_EXTERN void png_write_start_row PNGARG((png_structp png_ptr));
-/* Combine a row of data, dealing with alpha, etc. if requested */
+/* Combine a row of data, dealing with alpha, etc. if requested. 'row' is an
+ * array of png_ptr->width pixels. If the image is not interlaced or this
+ * is the final pass this just does a png_memcpy, otherwise the "display" flag
+ * is used to determine whether to copy pixels that are not in the current pass.
+ *
+ * Because 'png_do_read_interlace' (below) replicates pixels this allows this
+ * function to achieve the documented 'blocky' appearance during interlaced read
+ * if display is 1 and the 'sparkle' appearance, where existing pixels in 'row'
+ * are not changed if they are not in the current pass, when display is 0.
+ *
+ * 'display' must be 0 or 1, otherwise the memcpy will be done regardless.
+ *
+ * The API always reads from the png_struct row buffer and always assumes that
+ * it is full width (png_do_read_interlace has already been called.)
+ *
+ * This function is only ever used to write to row buffers provided by the
+ * caller of the relevant libpng API and the row must have already been
+ * transformed by the read transformations.
+ *
+ * The PNG_USE_COMPILE_TIME_MASKS option causes generation of pre-computed
+ * bitmasks for use within the code, otherwise runtime generated masks are used.
+ * The default is compile time masks.
+ */
+#ifndef PNG_USE_COMPILE_TIME_MASKS
+# define PNG_USE_COMPILE_TIME_MASKS 1
+#endif
PNG_EXTERN void png_combine_row PNGARG((png_structp png_ptr, png_bytep row,
- int mask));
+ int display));
#ifdef PNG_READ_INTERLACING_SUPPORTED
-/* Expand an interlaced row */
-/* OLD pre-1.0.9 interface:
+/* Expand an interlaced row: the 'row_info' describes the pass data that has
+ * been read in and must correspond to the pixels in 'row', the pixels are
+ * expanded (moved apart) in 'row' to match the final layout, when doing this
+ * the pixels are *replicated* to the intervening space. This is essential for
+ * the correct operation of png_combine_row, above.
+ */
PNG_EXTERN void png_do_read_interlace PNGARG((png_row_infop row_info,
png_bytep row, int pass, png_uint_32 transformations));
- */
-PNG_EXTERN void png_do_read_interlace PNGARG((png_structp png_ptr));
#endif
/* GRR TO DO (2.0 or whenever): simplify other internal calling interfaces */
@@ -727,26 +1001,42 @@ PNG_EXTERN void png_do_write_interlace PNGARG((png_row_infop row_info,
png_bytep row, int pass));
#endif
-/* Unfilter a row */
-PNG_EXTERN void png_read_filter_row PNGARG((png_structp png_ptr,
- png_row_infop row_info, png_bytep row, png_const_bytep prev_row,
- int filter));
+/* Unfilter a row: check the filter value before calling this, there is no point
+ * calling it for PNG_FILTER_VALUE_NONE.
+ */
+PNG_EXTERN void png_read_filter_row PNGARG((png_structp pp, png_row_infop row_info,
+ png_bytep row, png_const_bytep prev_row, int filter));
+
+PNG_EXTERN void png_read_filter_row_up_neon PNGARG((png_row_infop row_info,
+ png_bytep row, png_const_bytep prev_row));
+PNG_EXTERN void png_read_filter_row_sub3_neon PNGARG((png_row_infop row_info,
+ png_bytep row, png_const_bytep prev_row));
+PNG_EXTERN void png_read_filter_row_sub4_neon PNGARG((png_row_infop row_info,
+ png_bytep row, png_const_bytep prev_row));
+PNG_EXTERN void png_read_filter_row_avg3_neon PNGARG((png_row_infop row_info,
+ png_bytep row, png_const_bytep prev_row));
+PNG_EXTERN void png_read_filter_row_avg4_neon PNGARG((png_row_infop row_info,
+ png_bytep row, png_const_bytep prev_row));
+PNG_EXTERN void png_read_filter_row_paeth3_neon PNGARG((png_row_infop row_info,
+ png_bytep row, png_const_bytep prev_row));
+PNG_EXTERN void png_read_filter_row_paeth4_neon PNGARG((png_row_infop row_info,
+ png_bytep row, png_const_bytep prev_row));
/* Choose the best filter to use and filter the row data */
PNG_EXTERN void png_write_find_filter PNGARG((png_structp png_ptr,
png_row_infop row_info));
-/* Write out the filtered row. */
-PNG_EXTERN void png_write_filtered_row PNGARG((png_structp png_ptr,
- png_bytep filtered_row));
/* Finish a row while reading, dealing with interlacing passes, etc. */
PNG_EXTERN void png_read_finish_row PNGARG((png_structp png_ptr));
/* Initialize the row buffers, etc. */
PNG_EXTERN void png_read_start_row PNGARG((png_structp png_ptr));
+
+#ifdef PNG_READ_TRANSFORMS_SUPPORTED
/* Optional call to update the users info structure */
PNG_EXTERN void png_read_transform_info PNGARG((png_structp png_ptr,
png_infop info_ptr));
+#endif
/* These are the functions that do the transformations */
#ifdef PNG_READ_FILLER_SUPPORTED
@@ -776,8 +1066,8 @@ PNG_EXTERN void png_do_write_invert_alpha PNGARG((png_row_infop row_info,
#if defined(PNG_WRITE_FILLER_SUPPORTED) || \
defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
-PNG_EXTERN void png_do_strip_filler PNGARG((png_row_infop row_info,
- png_bytep row, png_uint_32 flags));
+PNG_EXTERN void png_do_strip_channel PNGARG((png_row_infop row_info,
+ png_bytep row, int at_start));
#endif
#ifdef PNG_16BIT_SUPPORTED
@@ -818,7 +1108,12 @@ PNG_EXTERN void png_do_invert PNGARG((png_row_infop row_info,
png_bytep row));
#endif
-#ifdef PNG_READ_16_TO_8_SUPPORTED
+#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
+PNG_EXTERN void png_do_scale_16_to_8 PNGARG((png_row_infop row_info,
+ png_bytep row));
+#endif
+
+#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
PNG_EXTERN void png_do_chop PNGARG((png_row_infop row_info,
png_bytep row));
#endif
@@ -849,26 +1144,20 @@ PNG_EXTERN void png_do_shift PNGARG((png_row_infop row_info,
png_bytep row, png_const_color_8p bit_depth));
#endif
-#ifdef PNG_READ_BACKGROUND_SUPPORTED
-# ifdef PNG_READ_GAMMA_SUPPORTED
-PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info,
- png_bytep row, png_const_color_16p trans_color,
- png_const_color_16p background, png_const_color_16p background_1,
- png_const_bytep gamma_table, png_const_bytep gamma_from_1,
- png_const_bytep gamma_to_1, png_const_uint_16pp gamma_16,
- png_const_uint_16pp gamma_16_from_1, png_const_uint_16pp gamma_16_to_1,
- int gamma_shift));
-# else
-PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info,
- png_bytep row, png_const_color_16p trans_color,
- png_const_color_16p background));
-# endif
+#if defined(PNG_READ_BACKGROUND_SUPPORTED) ||\
+ defined(PNG_READ_ALPHA_MODE_SUPPORTED)
+PNG_EXTERN void png_do_compose PNGARG((png_row_infop row_info,
+ png_bytep row, png_structp png_ptr));
#endif
#ifdef PNG_READ_GAMMA_SUPPORTED
PNG_EXTERN void png_do_gamma PNGARG((png_row_infop row_info,
- png_bytep row, png_const_bytep gamma_table,
- png_const_uint_16pp gamma_16_table, int gamma_shift));
+ png_bytep row, png_structp png_ptr));
+#endif
+
+#ifdef PNG_READ_ALPHA_MODE_SUPPORTED
+PNG_EXTERN void png_do_encode_alpha PNGARG((png_row_infop row_info,
+ png_bytep row, png_structp png_ptr));
#endif
#ifdef PNG_READ_EXPAND_SUPPORTED
@@ -879,6 +1168,11 @@ PNG_EXTERN void png_do_expand PNGARG((png_row_infop row_info,
png_bytep row, png_const_color_16p trans_color));
#endif
+#ifdef PNG_READ_EXPAND_16_SUPPORTED
+PNG_EXTERN void png_do_expand_16 PNGARG((png_row_infop row_info,
+ png_bytep row));
+#endif
+
/* The following decodes the appropriate chunks, and does error correction,
* then calls the appropriate callback for the chunk if it is valid.
*/
@@ -976,17 +1270,35 @@ PNG_EXTERN void png_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr,
png_uint_32 length));
#endif
+#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr,
png_infop info_ptr, png_uint_32 length));
+#endif
PNG_EXTERN void png_check_chunk_name PNGARG((png_structp png_ptr,
- png_const_bytep chunk_name));
+ png_uint_32 chunk_name));
+
+#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
+/* Exactly as png_handle_as_unknown() except that the argument is a 32-bit chunk
+ * name, not a string.
+ */
+PNG_EXTERN int png_chunk_unknown_handling PNGARG((png_structp png_ptr,
+ png_uint_32 chunk_name));
+#endif
/* Handle the transformations for reading and writing */
-PNG_EXTERN void png_do_read_transformations PNGARG((png_structp png_ptr));
-PNG_EXTERN void png_do_write_transformations PNGARG((png_structp png_ptr));
+#ifdef PNG_READ_TRANSFORMS_SUPPORTED
+PNG_EXTERN void png_do_read_transformations PNGARG((png_structp png_ptr,
+ png_row_infop row_info));
+#endif
+#ifdef PNG_WRITE_TRANSFORMS_SUPPORTED
+PNG_EXTERN void png_do_write_transformations PNGARG((png_structp png_ptr,
+ png_row_infop row_info));
+#endif
+#ifdef PNG_READ_TRANSFORMS_SUPPORTED
PNG_EXTERN void png_init_read_transformations PNGARG((png_structp png_ptr));
+#endif
#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
PNG_EXTERN void png_push_read_chunk PNGARG((png_structp png_ptr,
@@ -1060,12 +1372,48 @@ PNG_EXTERN void png_64bit_product PNGARG((long v1, long v2,
unsigned long *hi_product, unsigned long *lo_product));
#endif
+#ifdef PNG_cHRM_SUPPORTED
+/* Added at libpng version 1.5.5 */
+typedef struct png_xy
+{
+ png_fixed_point redx, redy;
+ png_fixed_point greenx, greeny;
+ png_fixed_point bluex, bluey;
+ png_fixed_point whitex, whitey;
+} png_xy;
+
+typedef struct png_XYZ
+{
+ png_fixed_point redX, redY, redZ;
+ png_fixed_point greenX, greenY, greenZ;
+ png_fixed_point blueX, blueY, blueZ;
+} png_XYZ;
+
+/* The conversion APIs return 0 on success, non-zero on a parameter error. They
+ * allow conversion between the above representations of a color encoding. When
+ * converting from XYZ end points to chromaticities the absolute magnitude of
+ * the end points is lost, when converting back the sum of the Y values of the
+ * three end points will be 1.0
+ */
+PNG_EXTERN int png_xy_from_XYZ PNGARG((png_xy *xy, png_XYZ XYZ));
+PNG_EXTERN int png_XYZ_from_xy PNGARG((png_XYZ *XYZ, png_xy xy));
+PNG_EXTERN int png_XYZ_from_xy_checked PNGARG((png_structp png_ptr,
+ png_XYZ *XYZ, png_xy xy));
+#endif
+
/* Added at libpng version 1.4.0 */
PNG_EXTERN void png_check_IHDR PNGARG((png_structp png_ptr,
png_uint_32 width, png_uint_32 height, int bit_depth,
int color_type, int interlace_type, int compression_type,
int filter_type));
+/* Added at libpng version 1.5.10 */
+#if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \
+ defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED)
+PNG_EXTERN void png_do_check_palette_indexes PNGARG((png_structp png_ptr,
+ png_row_infop row_info));
+#endif
+
/* Free all memory used by the read (old method - NOT DLL EXPORTED) */
PNG_EXTERN void png_read_destroy PNGARG((png_structp png_ptr,
png_infop info_ptr, png_infop end_info_ptr));
@@ -1083,6 +1431,76 @@ PNG_EXTERN PNG_FUNCTION(void, png_fixed_error, (png_structp png_ptr,
png_const_charp name),PNG_NORETURN);
#endif
+/* Puts 'string' into 'buffer' at buffer[pos], taking care never to overwrite
+ * the end. Always leaves the buffer nul terminated. Never errors out (and
+ * there is no error code.)
+ */
+PNG_EXTERN size_t png_safecat(png_charp buffer, size_t bufsize, size_t pos,
+ png_const_charp string);
+
+/* Various internal functions to handle formatted warning messages, currently
+ * only implemented for warnings.
+ */
+#if defined(PNG_WARNINGS_SUPPORTED) || defined(PNG_TIME_RFC1123_SUPPORTED)
+/* Utility to dump an unsigned value into a buffer, given a start pointer and
+ * and end pointer (which should point just *beyond* the end of the buffer!)
+ * Returns the pointer to the start of the formatted string. This utility only
+ * does unsigned values.
+ */
+PNG_EXTERN png_charp png_format_number(png_const_charp start, png_charp end,
+ int format, png_alloc_size_t number);
+
+/* Convenience macro that takes an array: */
+#define PNG_FORMAT_NUMBER(buffer,format,number) \
+ png_format_number(buffer, buffer + (sizeof buffer), format, number)
+
+/* Suggested size for a number buffer (enough for 64 bits and a sign!) */
+#define PNG_NUMBER_BUFFER_SIZE 24
+
+/* These are the integer formats currently supported, the name is formed from
+ * the standard printf(3) format string.
+ */
+#define PNG_NUMBER_FORMAT_u 1 /* chose unsigned API! */
+#define PNG_NUMBER_FORMAT_02u 2
+#define PNG_NUMBER_FORMAT_d 1 /* chose signed API! */
+#define PNG_NUMBER_FORMAT_02d 2
+#define PNG_NUMBER_FORMAT_x 3
+#define PNG_NUMBER_FORMAT_02x 4
+#define PNG_NUMBER_FORMAT_fixed 5 /* choose the signed API */
+#endif
+
+#ifdef PNG_WARNINGS_SUPPORTED
+/* New defines and members adding in libpng-1.5.4 */
+# define PNG_WARNING_PARAMETER_SIZE 32
+# define PNG_WARNING_PARAMETER_COUNT 8
+
+/* An l-value of this type has to be passed to the APIs below to cache the
+ * values of the parameters to a formatted warning message.
+ */
+typedef char png_warning_parameters[PNG_WARNING_PARAMETER_COUNT][
+ PNG_WARNING_PARAMETER_SIZE];
+
+PNG_EXTERN void png_warning_parameter(png_warning_parameters p, int number,
+ png_const_charp string);
+ /* Parameters are limited in size to PNG_WARNING_PARAMETER_SIZE characters,
+ * including the trailing '\0'.
+ */
+PNG_EXTERN void png_warning_parameter_unsigned(png_warning_parameters p,
+ int number, int format, png_alloc_size_t value);
+ /* Use png_alloc_size_t because it is an unsigned type as big as any we
+ * need to output. Use the following for a signed value.
+ */
+PNG_EXTERN void png_warning_parameter_signed(png_warning_parameters p,
+ int number, int format, png_int_32 value);
+
+PNG_EXTERN void png_formatted_warning(png_structp png_ptr,
+ png_warning_parameters p, png_const_charp message);
+ /* 'message' follows the X/Open approach of using @1, @2 to insert
+ * parameters previously supplied using the above functions. Errors in
+ * specifying the paramters will simple result in garbage substitutions.
+ */
+#endif
+
/* ASCII to FP interfaces, currently only implemented if sCAL
* support is required.
*/
@@ -1145,8 +1563,18 @@ PNG_EXTERN void png_ascii_from_fixed PNGARG((png_structp png_ptr,
#define PNG_FP_SAW_DOT 16 /* Saw a dot in current state */
#define PNG_FP_SAW_E 32 /* Saw an E (or e) in current state */
#define PNG_FP_SAW_ANY 60 /* Saw any of the above 4 */
+
+/* These three values don't affect the parser. They are set but not used.
+ */
#define PNG_FP_WAS_VALID 64 /* Preceding substring is a valid fp number */
-#define PNG_FP_INVALID 128 /* Available for callers as a distinct value */
+#define PNG_FP_NEGATIVE 128 /* A negative number, including "-0" */
+#define PNG_FP_NONZERO 256 /* A non-zero value */
+#define PNG_FP_STICKY 448 /* The above three flags */
+
+/* This is available for the caller to store in 'state' if required. Do not
+ * call the parser after setting it (the parser sometimes clears it.)
+ */
+#define PNG_FP_INVALID 512 /* Available for callers as a distinct value */
/* Result codes for the parser (boolean - true meants ok, false means
* not ok yet.)
@@ -1154,6 +1582,20 @@ PNG_EXTERN void png_ascii_from_fixed PNGARG((png_structp png_ptr,
#define PNG_FP_MAYBE 0 /* The number may be valid in the future */
#define PNG_FP_OK 1 /* The number is valid */
+/* Tests on the sticky non-zero and negative flags. To pass these checks
+ * the state must also indicate that the whole number is valid - this is
+ * achieved by testing PNG_FP_SAW_DIGIT (see the implementation for why this
+ * is equivalent to PNG_FP_OK above.)
+ */
+#define PNG_FP_NZ_MASK (PNG_FP_SAW_DIGIT | PNG_FP_NEGATIVE | PNG_FP_NONZERO)
+ /* NZ_MASK: the string is valid and a non-zero negative value */
+#define PNG_FP_Z_MASK (PNG_FP_SAW_DIGIT | PNG_FP_NONZERO)
+ /* Z MASK: the string is valid and a non-zero value. */
+ /* PNG_FP_SAW_DIGIT: the string is valid. */
+#define PNG_FP_IS_ZERO(state) (((state) & PNG_FP_Z_MASK) == PNG_FP_SAW_DIGIT)
+#define PNG_FP_IS_POSITIVE(state) (((state) & PNG_FP_NZ_MASK) == PNG_FP_Z_MASK)
+#define PNG_FP_IS_NEGATIVE(state) (((state) & PNG_FP_NZ_MASK) == PNG_FP_NZ_MASK)
+
/* The actual parser. This can be called repeatedly, it updates
* the index into the string and the state variable (which must
* be initialzed to 0). It returns a result code, as above. There
@@ -1173,7 +1615,10 @@ PNG_EXTERN int png_check_fp_number PNGARG((png_const_charp string,
png_size_t size, int *statep, png_size_tp whereami));
/* This is the same but it checks a complete string and returns true
- * only if it just contains a floating point number.
+ * only if it just contains a floating point number. As of 1.5.4 this
+ * function also returns the state at the end of parsing the number if
+ * it was valid (otherwise it returns 0.) This can be used for testing
+ * for negative or zero values using the sticky flag.
*/
PNG_EXTERN int png_check_fp_string PNGARG((png_const_charp string,
png_size_t size));
@@ -1188,13 +1633,13 @@ PNG_EXTERN int png_check_fp_string PNGARG((png_const_charp string,
* holds the result.
*/
PNG_EXTERN int png_muldiv PNGARG((png_fixed_point_p res, png_fixed_point a,
- png_int_32 times, png_int_32 div));
+ png_int_32 multiplied_by, png_int_32 divided_by));
#endif
#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_INCH_CONVERSIONS_SUPPORTED)
/* Same deal, but issue a warning on overflow and return 0. */
PNG_EXTERN png_fixed_point png_muldiv_warn PNGARG((png_structp png_ptr,
- png_fixed_point a, png_int_32 times, png_int_32 div));
+ png_fixed_point a, png_int_32 multiplied_by, png_int_32 divided_by));
#endif
#ifdef PNG_READ_GAMMA_SUPPORTED
@@ -1221,19 +1666,19 @@ PNG_EXTERN png_fixed_point png_reciprocal2 PNGARG((png_fixed_point a,
* correct bit value - 0..255 or 0..65535 as required.
*/
PNG_EXTERN png_uint_16 png_gamma_correct PNGARG((png_structp png_ptr,
- unsigned int value, png_fixed_point gamma));
-PNG_EXTERN int png_gamma_significant PNGARG((png_fixed_point gamma));
+ unsigned int value, png_fixed_point gamma_value));
+PNG_EXTERN int png_gamma_significant PNGARG((png_fixed_point gamma_value));
PNG_EXTERN png_uint_16 png_gamma_16bit_correct PNGARG((unsigned int value,
- png_fixed_point gamma));
+ png_fixed_point gamma_value));
PNG_EXTERN png_byte png_gamma_8bit_correct PNGARG((unsigned int value,
- png_fixed_point gamma));
+ png_fixed_point gamma_value));
+PNG_EXTERN void png_destroy_gamma_table(png_structp png_ptr);
PNG_EXTERN void png_build_gamma_table PNGARG((png_structp png_ptr,
int bit_depth));
#endif
/* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */
-
#include "pngdebug.h"
#ifdef __cplusplus
diff --git a/src/3rdparty/libpng/pngread.c b/src/3rdparty/libpng/pngread.c
index 2c8f2cd687..1d8c6b3346 100644
--- a/src/3rdparty/libpng/pngread.c
+++ b/src/3rdparty/libpng/pngread.c
@@ -1,8 +1,8 @@
/* pngread.c - read a PNG file
*
- * Last changed in libpng 1.5.1 [$RDATE%]
- * Copyright (c) 1998-2011 Glenn Randers-Pehrson
+ * Last changed in libpng 1.5.10 [March 8, 2012]
+ * Copyright (c) 1998-2012 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -47,12 +47,10 @@ png_create_read_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr,
#ifdef PNG_SETJMP_SUPPORTED
#ifdef USE_FAR_KEYWORD
- jmp_buf png_jmpbuf;
+ jmp_buf tmp_jmpbuf;
#endif
#endif
- int i;
-
png_debug(1, "in png_create_read_struct");
#ifdef PNG_USER_MEM_SUPPORTED
@@ -69,29 +67,26 @@ png_create_read_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr,
png_ptr->user_width_max = PNG_USER_WIDTH_MAX;
png_ptr->user_height_max = PNG_USER_HEIGHT_MAX;
-# ifdef PNG_USER_CHUNK_CACHE_MAX
/* Added at libpng-1.2.43 and 1.4.0 */
png_ptr->user_chunk_cache_max = PNG_USER_CHUNK_CACHE_MAX;
-# endif
-# ifdef PNG_SET_USER_CHUNK_MALLOC_MAX
/* Added at libpng-1.2.43 and 1.4.1 */
png_ptr->user_chunk_malloc_max = PNG_USER_CHUNK_MALLOC_MAX;
-# endif
#endif
#ifdef PNG_SETJMP_SUPPORTED
/* Applications that neglect to set up their own setjmp() and then
- encounter a png_error() will longjmp here. Since the jmpbuf is
- then meaningless we abort instead of returning. */
+ * encounter a png_error() will longjmp here. Since the jmpbuf is
+ * then meaningless we abort instead of returning.
+ */
#ifdef USE_FAR_KEYWORD
- if (setjmp(png_jmpbuf))
+ if (setjmp(tmp_jmpbuf))
#else
if (setjmp(png_jmpbuf(png_ptr))) /* Sets longjmp to match setjmp */
#endif
PNG_ABORT();
#ifdef USE_FAR_KEYWORD
- png_memcpy(png_jmpbuf(png_ptr), png_jmpbuf, png_sizeof(jmp_buf));
+ png_memcpy(png_jmpbuf(png_ptr), tmp_jmpbuf, png_sizeof(jmp_buf));
#endif
#endif /* PNG_SETJMP_SUPPORTED */
@@ -101,54 +96,9 @@ png_create_read_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr,
png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn);
- if (user_png_ver)
- {
- i = 0;
-
- do
- {
- if (user_png_ver[i] != png_libpng_ver[i])
- png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
- } while (png_libpng_ver[i++]);
- }
-
- else
- png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
-
-
- if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH)
- {
- /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so
- * we must recompile any applications that use any older library version.
- * For versions after libpng 1.0, we will be compatible, so we need
- * only check the first digit.
- */
- if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] ||
- (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) ||
- (user_png_ver[0] == '0' && user_png_ver[2] < '9'))
- {
-#ifdef PNG_CONSOLE_IO_SUPPORTED
- char msg[80];
- if (user_png_ver)
- {
- png_snprintf2(msg, 80,
- "Application built with libpng-%.20s"
- " but running with %.20s",
- user_png_ver,
- png_libpng_ver);
- png_warning(png_ptr, msg);
- }
-#else
- png_warning(png_ptr,
- "Incompatible libpng version in application and library");
-#endif
-#ifdef PNG_ERROR_NUMBERS_SUPPORTED
- png_ptr->flags = 0;
-#endif
-
- png_cleanup_needed = 1;
- }
- }
+ /* Call the general version checker (shared with read and write code): */
+ if (!png_user_version_check(png_ptr, user_png_ver))
+ png_cleanup_needed = 1;
if (!png_cleanup_needed)
{
@@ -237,89 +187,35 @@ png_read_info(png_structp png_ptr, png_infop info_ptr)
for (;;)
{
- PNG_IHDR;
- PNG_IDAT;
- PNG_IEND;
- PNG_PLTE;
-#ifdef PNG_READ_bKGD_SUPPORTED
- PNG_bKGD;
-#endif
-#ifdef PNG_READ_cHRM_SUPPORTED
- PNG_cHRM;
-#endif
-#ifdef PNG_READ_gAMA_SUPPORTED
- PNG_gAMA;
-#endif
-#ifdef PNG_READ_hIST_SUPPORTED
- PNG_hIST;
-#endif
-#ifdef PNG_READ_iCCP_SUPPORTED
- PNG_iCCP;
-#endif
-#ifdef PNG_READ_iTXt_SUPPORTED
- PNG_iTXt;
-#endif
-#ifdef PNG_READ_oFFs_SUPPORTED
- PNG_oFFs;
-#endif
-#ifdef PNG_READ_pCAL_SUPPORTED
- PNG_pCAL;
-#endif
-#ifdef PNG_READ_pHYs_SUPPORTED
- PNG_pHYs;
-#endif
-#ifdef PNG_READ_sBIT_SUPPORTED
- PNG_sBIT;
-#endif
-#ifdef PNG_READ_sCAL_SUPPORTED
- PNG_sCAL;
-#endif
-#ifdef PNG_READ_sPLT_SUPPORTED
- PNG_sPLT;
-#endif
-#ifdef PNG_READ_sRGB_SUPPORTED
- PNG_sRGB;
-#endif
-#ifdef PNG_READ_tEXt_SUPPORTED
- PNG_tEXt;
-#endif
-#ifdef PNG_READ_tIME_SUPPORTED
- PNG_tIME;
-#endif
-#ifdef PNG_READ_tRNS_SUPPORTED
- PNG_tRNS;
-#endif
-#ifdef PNG_READ_zTXt_SUPPORTED
- PNG_zTXt;
-#endif
png_uint_32 length = png_read_chunk_header(png_ptr);
- PNG_CONST png_bytep chunk_name = png_ptr->chunk_name;
+ png_uint_32 chunk_name = png_ptr->chunk_name;
/* This should be a binary subdivision search or a hash for
* matching the chunk name rather than a linear search.
*/
- if (!png_memcmp(chunk_name, png_IDAT, 4))
+ if (chunk_name == png_IDAT)
if (png_ptr->mode & PNG_AFTER_IDAT)
png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
- if (!png_memcmp(chunk_name, png_IHDR, 4))
+ if (chunk_name == png_IHDR)
png_handle_IHDR(png_ptr, info_ptr, length);
- else if (!png_memcmp(chunk_name, png_IEND, 4))
+ else if (chunk_name == png_IEND)
png_handle_IEND(png_ptr, info_ptr, length);
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
- else if (png_handle_as_unknown(png_ptr, chunk_name))
+ else if (png_chunk_unknown_handling(png_ptr, chunk_name) !=
+ PNG_HANDLE_CHUNK_AS_DEFAULT)
{
- if (!png_memcmp(chunk_name, png_IDAT, 4))
+ if (chunk_name == png_IDAT)
png_ptr->mode |= PNG_HAVE_IDAT;
png_handle_unknown(png_ptr, info_ptr, length);
- if (!png_memcmp(chunk_name, png_PLTE, 4))
+ if (chunk_name == png_PLTE)
png_ptr->mode |= PNG_HAVE_PLTE;
- else if (!png_memcmp(chunk_name, png_IDAT, 4))
+ else if (chunk_name == png_IDAT)
{
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before IDAT");
@@ -332,10 +228,10 @@ png_read_info(png_structp png_ptr, png_infop info_ptr)
}
}
#endif
- else if (!png_memcmp(chunk_name, png_PLTE, 4))
+ else if (chunk_name == png_PLTE)
png_handle_PLTE(png_ptr, info_ptr, length);
- else if (!png_memcmp(chunk_name, png_IDAT, 4))
+ else if (chunk_name == png_IDAT)
{
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before IDAT");
@@ -350,87 +246,87 @@ png_read_info(png_structp png_ptr, png_infop info_ptr)
}
#ifdef PNG_READ_bKGD_SUPPORTED
- else if (!png_memcmp(chunk_name, png_bKGD, 4))
+ else if (chunk_name == png_bKGD)
png_handle_bKGD(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_cHRM_SUPPORTED
- else if (!png_memcmp(chunk_name, png_cHRM, 4))
+ else if (chunk_name == png_cHRM)
png_handle_cHRM(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_gAMA_SUPPORTED
- else if (!png_memcmp(chunk_name, png_gAMA, 4))
+ else if (chunk_name == png_gAMA)
png_handle_gAMA(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_hIST_SUPPORTED
- else if (!png_memcmp(chunk_name, png_hIST, 4))
+ else if (chunk_name == png_hIST)
png_handle_hIST(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_oFFs_SUPPORTED
- else if (!png_memcmp(chunk_name, png_oFFs, 4))
+ else if (chunk_name == png_oFFs)
png_handle_oFFs(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_pCAL_SUPPORTED
- else if (!png_memcmp(chunk_name, png_pCAL, 4))
+ else if (chunk_name == png_pCAL)
png_handle_pCAL(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_sCAL_SUPPORTED
- else if (!png_memcmp(chunk_name, png_sCAL, 4))
+ else if (chunk_name == png_sCAL)
png_handle_sCAL(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_pHYs_SUPPORTED
- else if (!png_memcmp(chunk_name, png_pHYs, 4))
+ else if (chunk_name == png_pHYs)
png_handle_pHYs(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_sBIT_SUPPORTED
- else if (!png_memcmp(chunk_name, png_sBIT, 4))
+ else if (chunk_name == png_sBIT)
png_handle_sBIT(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_sRGB_SUPPORTED
- else if (!png_memcmp(chunk_name, png_sRGB, 4))
+ else if (chunk_name == png_sRGB)
png_handle_sRGB(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_iCCP_SUPPORTED
- else if (!png_memcmp(chunk_name, png_iCCP, 4))
+ else if (chunk_name == png_iCCP)
png_handle_iCCP(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_sPLT_SUPPORTED
- else if (!png_memcmp(chunk_name, png_sPLT, 4))
+ else if (chunk_name == png_sPLT)
png_handle_sPLT(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_tEXt_SUPPORTED
- else if (!png_memcmp(chunk_name, png_tEXt, 4))
+ else if (chunk_name == png_tEXt)
png_handle_tEXt(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_tIME_SUPPORTED
- else if (!png_memcmp(chunk_name, png_tIME, 4))
+ else if (chunk_name == png_tIME)
png_handle_tIME(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_tRNS_SUPPORTED
- else if (!png_memcmp(chunk_name, png_tRNS, 4))
+ else if (chunk_name == png_tRNS)
png_handle_tRNS(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_zTXt_SUPPORTED
- else if (!png_memcmp(chunk_name, png_zTXt, 4))
+ else if (chunk_name == png_zTXt)
png_handle_zTXt(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_iTXt_SUPPORTED
- else if (!png_memcmp(chunk_name, png_iTXt, 4))
+ else if (chunk_name == png_iTXt)
png_handle_iTXt(png_ptr, info_ptr, length);
#endif
@@ -449,15 +345,13 @@ png_read_update_info(png_structp png_ptr, png_infop info_ptr)
if (png_ptr == NULL)
return;
- if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
- png_read_start_row(png_ptr);
-
- else
- png_warning(png_ptr,
- "Ignoring extra png_read_update_info() call;"
- " row buffer not reallocated");
+ png_read_start_row(png_ptr);
+#ifdef PNG_READ_TRANSFORMS_SUPPORTED
png_read_transform_info(png_ptr, info_ptr);
+#else
+ PNG_UNUSED(info_ptr)
+#endif
}
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
@@ -471,15 +365,8 @@ png_start_read_image(png_structp png_ptr)
{
png_debug(1, "in png_start_read_image");
- if (png_ptr == NULL)
- return;
-
- if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
- png_read_start_row(png_ptr);
- else
- png_warning(png_ptr,
- "Ignoring extra png_start_read_image() call;"
- " row buffer not reallocated");
+ if (png_ptr != NULL)
+ png_read_start_row(png_ptr);
}
#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
@@ -487,21 +374,30 @@ png_start_read_image(png_structp png_ptr)
void PNGAPI
png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
{
- PNG_IDAT;
- PNG_CONST int png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55,
- 0xff};
- PNG_CONST int png_pass_mask[7] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff};
int ret;
+ png_row_info row_info;
+
if (png_ptr == NULL)
return;
png_debug2(1, "in png_read_row (row %lu, pass %d)",
(unsigned long)png_ptr->row_number, png_ptr->pass);
+ /* png_read_start_row sets the information (in particular iwidth) for this
+ * interlace pass.
+ */
if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
png_read_start_row(png_ptr);
+ /* 1.5.6: row_info moved out of png_struct to a local here. */
+ row_info.width = png_ptr->iwidth; /* NOTE: width of current interlaced row */
+ row_info.color_type = png_ptr->color_type;
+ row_info.bit_depth = png_ptr->bit_depth;
+ row_info.channels = png_ptr->channels;
+ row_info.pixel_depth = png_ptr->pixel_depth;
+ row_info.rowbytes = PNG_ROWBYTES(row_info.pixel_depth, row_info.width);
+
if (png_ptr->row_number == 0 && png_ptr->pass == 0)
{
/* Check for transforms that have been set but were defined out */
@@ -543,7 +439,12 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
}
#ifdef PNG_READ_INTERLACING_SUPPORTED
- /* If interlaced and we do not need a new row, combine row and return */
+ /* If interlaced and we do not need a new row, combine row and return.
+ * Notice that the pixels we have from previous rows have been transformed
+ * already; we can only combine like with like (transformed or
+ * untransformed) and, because of the libpng API for interlaced images, this
+ * means we must transform before de-interlacing.
+ */
if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
{
switch (png_ptr->pass)
@@ -552,8 +453,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
if (png_ptr->row_number & 0x07)
{
if (dsp_row != NULL)
- png_combine_row(png_ptr, dsp_row,
- png_pass_dsp_mask[png_ptr->pass]);
+ png_combine_row(png_ptr, dsp_row, 1/*display*/);
png_read_finish_row(png_ptr);
return;
}
@@ -563,8 +463,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
if ((png_ptr->row_number & 0x07) || png_ptr->width < 5)
{
if (dsp_row != NULL)
- png_combine_row(png_ptr, dsp_row,
- png_pass_dsp_mask[png_ptr->pass]);
+ png_combine_row(png_ptr, dsp_row, 1/*display*/);
png_read_finish_row(png_ptr);
return;
@@ -575,8 +474,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
if ((png_ptr->row_number & 0x07) != 4)
{
if (dsp_row != NULL && (png_ptr->row_number & 4))
- png_combine_row(png_ptr, dsp_row,
- png_pass_dsp_mask[png_ptr->pass]);
+ png_combine_row(png_ptr, dsp_row, 1/*display*/);
png_read_finish_row(png_ptr);
return;
@@ -587,8 +485,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
if ((png_ptr->row_number & 3) || png_ptr->width < 3)
{
if (dsp_row != NULL)
- png_combine_row(png_ptr, dsp_row,
- png_pass_dsp_mask[png_ptr->pass]);
+ png_combine_row(png_ptr, dsp_row, 1/*display*/);
png_read_finish_row(png_ptr);
return;
@@ -599,8 +496,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
if ((png_ptr->row_number & 3) != 2)
{
if (dsp_row != NULL && (png_ptr->row_number & 2))
- png_combine_row(png_ptr, dsp_row,
- png_pass_dsp_mask[png_ptr->pass]);
+ png_combine_row(png_ptr, dsp_row, 1/*display*/);
png_read_finish_row(png_ptr);
return;
@@ -610,8 +506,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
if ((png_ptr->row_number & 1) || png_ptr->width < 2)
{
if (dsp_row != NULL)
- png_combine_row(png_ptr, dsp_row,
- png_pass_dsp_mask[png_ptr->pass]);
+ png_combine_row(png_ptr, dsp_row, 1/*display*/);
png_read_finish_row(png_ptr);
return;
@@ -647,7 +542,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
png_crc_finish(png_ptr, 0);
png_ptr->idat_size = png_read_chunk_header(png_ptr);
- if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
+ if (png_ptr->chunk_name != png_IDAT)
png_error(png_ptr, "Not enough image data");
}
png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size;
@@ -677,33 +572,47 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
} while (png_ptr->zstream.avail_out);
- png_ptr->row_info.color_type = png_ptr->color_type;
- png_ptr->row_info.width = png_ptr->iwidth;
- png_ptr->row_info.channels = png_ptr->channels;
- png_ptr->row_info.bit_depth = png_ptr->bit_depth;
- png_ptr->row_info.pixel_depth = png_ptr->pixel_depth;
- png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth,
- png_ptr->row_info.width);
-
- if (png_ptr->row_buf[0])
- png_read_filter_row(png_ptr, &(png_ptr->row_info),
- png_ptr->row_buf + 1, png_ptr->prev_row + 1,
- (int)(png_ptr->row_buf[0]));
+ if (png_ptr->row_buf[0] > PNG_FILTER_VALUE_NONE)
+ {
+ if (png_ptr->row_buf[0] < PNG_FILTER_VALUE_LAST)
+ png_read_filter_row(png_ptr, &row_info, png_ptr->row_buf + 1,
+ png_ptr->prev_row + 1, png_ptr->row_buf[0]);
+ else
+ png_error(png_ptr, "bad adaptive filter value");
+ }
- png_memcpy(png_ptr->prev_row, png_ptr->row_buf, png_ptr->rowbytes + 1);
+ /* libpng 1.5.6: the following line was copying png_ptr->rowbytes before
+ * 1.5.6, while the buffer really is this big in current versions of libpng
+ * it may not be in the future, so this was changed just to copy the
+ * interlaced count:
+ */
+ png_memcpy(png_ptr->prev_row, png_ptr->row_buf, row_info.rowbytes + 1);
#ifdef PNG_MNG_FEATURES_SUPPORTED
if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
(png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING))
{
/* Intrapixel differencing */
- png_do_read_intrapixel(&(png_ptr->row_info), png_ptr->row_buf + 1);
+ png_do_read_intrapixel(&row_info, png_ptr->row_buf + 1);
}
#endif
- if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA))
- png_do_read_transformations(png_ptr);
+#ifdef PNG_READ_TRANSFORMS_SUPPORTED
+ if (png_ptr->transformations)
+ png_do_read_transformations(png_ptr, &row_info);
+#endif
+
+ /* The transformed pixel depth should match the depth now in row_info. */
+ if (png_ptr->transformed_pixel_depth == 0)
+ {
+ png_ptr->transformed_pixel_depth = row_info.pixel_depth;
+ if (row_info.pixel_depth > png_ptr->maximum_pixel_depth)
+ png_error(png_ptr, "sequential row overflow");
+ }
+
+ else if (png_ptr->transformed_pixel_depth != row_info.pixel_depth)
+ png_error(png_ptr, "internal sequential row size calculation error");
#ifdef PNG_READ_INTERLACING_SUPPORTED
/* Blow up interlaced rows to full size */
@@ -711,27 +620,24 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
(png_ptr->transformations & PNG_INTERLACE))
{
if (png_ptr->pass < 6)
- /* Old interface (pre-1.0.9):
- * png_do_read_interlace(&(png_ptr->row_info),
- * png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations);
- */
- png_do_read_interlace(png_ptr);
+ png_do_read_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass,
+ png_ptr->transformations);
if (dsp_row != NULL)
- png_combine_row(png_ptr, dsp_row, png_pass_dsp_mask[png_ptr->pass]);
+ png_combine_row(png_ptr, dsp_row, 1/*display*/);
if (row != NULL)
- png_combine_row(png_ptr, row, png_pass_mask[png_ptr->pass]);
+ png_combine_row(png_ptr, row, 0/*row*/);
}
else
#endif
{
if (row != NULL)
- png_combine_row(png_ptr, row, 0xff);
+ png_combine_row(png_ptr, row, -1/*ignored*/);
if (dsp_row != NULL)
- png_combine_row(png_ptr, dsp_row, 0xff);
+ png_combine_row(png_ptr, dsp_row, -1/*ignored*/);
}
png_read_finish_row(png_ptr);
@@ -895,87 +801,40 @@ png_read_end(png_structp png_ptr, png_infop info_ptr)
png_crc_finish(png_ptr, 0); /* Finish off CRC from last IDAT chunk */
+#ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED
+ /* Report invalid palette index; added at libng-1.5.10 */
+ if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
+ png_ptr->num_palette_max > png_ptr->num_palette)
+ png_benign_error(png_ptr, "Read palette index exceeding num_palette");
+#endif
+
do
{
- PNG_IHDR;
- PNG_IDAT;
- PNG_IEND;
- PNG_PLTE;
-#ifdef PNG_READ_bKGD_SUPPORTED
- PNG_bKGD;
-#endif
-#ifdef PNG_READ_cHRM_SUPPORTED
- PNG_cHRM;
-#endif
-#ifdef PNG_READ_gAMA_SUPPORTED
- PNG_gAMA;
-#endif
-#ifdef PNG_READ_hIST_SUPPORTED
- PNG_hIST;
-#endif
-#ifdef PNG_READ_iCCP_SUPPORTED
- PNG_iCCP;
-#endif
-#ifdef PNG_READ_iTXt_SUPPORTED
- PNG_iTXt;
-#endif
-#ifdef PNG_READ_oFFs_SUPPORTED
- PNG_oFFs;
-#endif
-#ifdef PNG_READ_pCAL_SUPPORTED
- PNG_pCAL;
-#endif
-#ifdef PNG_READ_pHYs_SUPPORTED
- PNG_pHYs;
-#endif
-#ifdef PNG_READ_sBIT_SUPPORTED
- PNG_sBIT;
-#endif
-#ifdef PNG_READ_sCAL_SUPPORTED
- PNG_sCAL;
-#endif
-#ifdef PNG_READ_sPLT_SUPPORTED
- PNG_sPLT;
-#endif
-#ifdef PNG_READ_sRGB_SUPPORTED
- PNG_sRGB;
-#endif
-#ifdef PNG_READ_tEXt_SUPPORTED
- PNG_tEXt;
-#endif
-#ifdef PNG_READ_tIME_SUPPORTED
- PNG_tIME;
-#endif
-#ifdef PNG_READ_tRNS_SUPPORTED
- PNG_tRNS;
-#endif
-#ifdef PNG_READ_zTXt_SUPPORTED
- PNG_zTXt;
-#endif
png_uint_32 length = png_read_chunk_header(png_ptr);
- PNG_CONST png_bytep chunk_name = png_ptr->chunk_name;
+ png_uint_32 chunk_name = png_ptr->chunk_name;
- if (!png_memcmp(chunk_name, png_IHDR, 4))
+ if (chunk_name == png_IHDR)
png_handle_IHDR(png_ptr, info_ptr, length);
- else if (!png_memcmp(chunk_name, png_IEND, 4))
+ else if (chunk_name == png_IEND)
png_handle_IEND(png_ptr, info_ptr, length);
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
- else if (png_handle_as_unknown(png_ptr, chunk_name))
+ else if (png_chunk_unknown_handling(png_ptr, chunk_name) !=
+ PNG_HANDLE_CHUNK_AS_DEFAULT)
{
- if (!png_memcmp(chunk_name, png_IDAT, 4))
+ if (chunk_name == png_IDAT)
{
if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT))
png_benign_error(png_ptr, "Too many IDATs found");
}
png_handle_unknown(png_ptr, info_ptr, length);
- if (!png_memcmp(chunk_name, png_PLTE, 4))
+ if (chunk_name == png_PLTE)
png_ptr->mode |= PNG_HAVE_PLTE;
}
#endif
- else if (!png_memcmp(chunk_name, png_IDAT, 4))
+ else if (chunk_name == png_IDAT)
{
/* Zero length IDATs are legal after the last IDAT has been
* read, but not after other chunks have been read.
@@ -985,91 +844,91 @@ png_read_end(png_structp png_ptr, png_infop info_ptr)
png_crc_finish(png_ptr, length);
}
- else if (!png_memcmp(chunk_name, png_PLTE, 4))
+ else if (chunk_name == png_PLTE)
png_handle_PLTE(png_ptr, info_ptr, length);
#ifdef PNG_READ_bKGD_SUPPORTED
- else if (!png_memcmp(chunk_name, png_bKGD, 4))
+ else if (chunk_name == png_bKGD)
png_handle_bKGD(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_cHRM_SUPPORTED
- else if (!png_memcmp(chunk_name, png_cHRM, 4))
+ else if (chunk_name == png_cHRM)
png_handle_cHRM(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_gAMA_SUPPORTED
- else if (!png_memcmp(chunk_name, png_gAMA, 4))
+ else if (chunk_name == png_gAMA)
png_handle_gAMA(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_hIST_SUPPORTED
- else if (!png_memcmp(chunk_name, png_hIST, 4))
+ else if (chunk_name == png_hIST)
png_handle_hIST(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_oFFs_SUPPORTED
- else if (!png_memcmp(chunk_name, png_oFFs, 4))
+ else if (chunk_name == png_oFFs)
png_handle_oFFs(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_pCAL_SUPPORTED
- else if (!png_memcmp(chunk_name, png_pCAL, 4))
+ else if (chunk_name == png_pCAL)
png_handle_pCAL(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_sCAL_SUPPORTED
- else if (!png_memcmp(chunk_name, png_sCAL, 4))
+ else if (chunk_name == png_sCAL)
png_handle_sCAL(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_pHYs_SUPPORTED
- else if (!png_memcmp(chunk_name, png_pHYs, 4))
+ else if (chunk_name == png_pHYs)
png_handle_pHYs(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_sBIT_SUPPORTED
- else if (!png_memcmp(chunk_name, png_sBIT, 4))
+ else if (chunk_name == png_sBIT)
png_handle_sBIT(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_sRGB_SUPPORTED
- else if (!png_memcmp(chunk_name, png_sRGB, 4))
+ else if (chunk_name == png_sRGB)
png_handle_sRGB(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_iCCP_SUPPORTED
- else if (!png_memcmp(chunk_name, png_iCCP, 4))
+ else if (chunk_name == png_iCCP)
png_handle_iCCP(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_sPLT_SUPPORTED
- else if (!png_memcmp(chunk_name, png_sPLT, 4))
+ else if (chunk_name == png_sPLT)
png_handle_sPLT(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_tEXt_SUPPORTED
- else if (!png_memcmp(chunk_name, png_tEXt, 4))
+ else if (chunk_name == png_tEXt)
png_handle_tEXt(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_tIME_SUPPORTED
- else if (!png_memcmp(chunk_name, png_tIME, 4))
+ else if (chunk_name == png_tIME)
png_handle_tIME(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_tRNS_SUPPORTED
- else if (!png_memcmp(chunk_name, png_tRNS, 4))
+ else if (chunk_name == png_tRNS)
png_handle_tRNS(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_zTXt_SUPPORTED
- else if (!png_memcmp(chunk_name, png_zTXt, 4))
+ else if (chunk_name == png_zTXt)
png_handle_zTXt(png_ptr, info_ptr, length);
#endif
#ifdef PNG_READ_iTXt_SUPPORTED
- else if (!png_memcmp(chunk_name, png_iTXt, 4))
+ else if (chunk_name == png_iTXt)
png_handle_iTXt(png_ptr, info_ptr, length);
#endif
@@ -1161,7 +1020,9 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr,
jmp_buf tmp_jmp;
#endif
png_error_ptr error_fn;
+#ifdef PNG_WARNINGS_SUPPORTED
png_error_ptr warning_fn;
+#endif
png_voidp error_ptr;
#ifdef PNG_USER_MEM_SUPPORTED
png_free_ptr free_fn;
@@ -1175,9 +1036,13 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr,
if (end_info_ptr != NULL)
png_info_destroy(png_ptr, end_info_ptr);
+#ifdef PNG_READ_GAMMA_SUPPORTED
+ png_destroy_gamma_table(png_ptr);
+#endif
+
png_free(png_ptr, png_ptr->zbuf);
png_free(png_ptr, png_ptr->big_row_buf);
- png_free(png_ptr, png_ptr->prev_row);
+ png_free(png_ptr, png_ptr->big_prev_row);
png_free(png_ptr, png_ptr->chunkdata);
#ifdef PNG_READ_QUANTIZE_SUPPORTED
@@ -1185,15 +1050,6 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr,
png_free(png_ptr, png_ptr->quantize_index);
#endif
-#ifdef PNG_READ_GAMMA_SUPPORTED
- png_free(png_ptr, png_ptr->gamma_table);
-#endif
-
-#ifdef PNG_READ_BACKGROUND_SUPPORTED
- png_free(png_ptr, png_ptr->gamma_from_1);
- png_free(png_ptr, png_ptr->gamma_to_1);
-#endif
-
if (png_ptr->free_me & PNG_FREE_PLTE)
png_zfree(png_ptr, png_ptr->palette);
png_ptr->free_me &= ~PNG_FREE_PLTE;
@@ -1211,67 +1067,23 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr,
png_ptr->free_me &= ~PNG_FREE_HIST;
#endif
-#ifdef PNG_READ_GAMMA_SUPPORTED
- if (png_ptr->gamma_16_table != NULL)
- {
- int i;
- int istop = (1 << (8 - png_ptr->gamma_shift));
- for (i = 0; i < istop; i++)
- {
- png_free(png_ptr, png_ptr->gamma_16_table[i]);
- }
- png_free(png_ptr, png_ptr->gamma_16_table);
- }
-
-#ifdef PNG_READ_BACKGROUND_SUPPORTED
- if (png_ptr->gamma_16_from_1 != NULL)
- {
- int i;
- int istop = (1 << (8 - png_ptr->gamma_shift));
- for (i = 0; i < istop; i++)
- {
- png_free(png_ptr, png_ptr->gamma_16_from_1[i]);
- }
- png_free(png_ptr, png_ptr->gamma_16_from_1);
- }
- if (png_ptr->gamma_16_to_1 != NULL)
- {
- int i;
- int istop = (1 << (8 - png_ptr->gamma_shift));
- for (i = 0; i < istop; i++)
- {
- png_free(png_ptr, png_ptr->gamma_16_to_1[i]);
- }
- png_free(png_ptr, png_ptr->gamma_16_to_1);
- }
-#endif
-#endif
-
-#ifdef PNG_TIME_RFC1123_SUPPORTED
- png_free(png_ptr, png_ptr->time_buffer);
-#endif
-
inflateEnd(&png_ptr->zstream);
#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
png_free(png_ptr, png_ptr->save_buffer);
#endif
-#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
-#ifdef PNG_TEXT_SUPPORTED
- png_free(png_ptr, png_ptr->current_text);
-#endif /* PNG_TEXT_SUPPORTED */
-#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
-
/* Save the important info out of the png_struct, in case it is
* being used again.
*/
#ifdef PNG_SETJMP_SUPPORTED
- png_memcpy(tmp_jmp, png_ptr->png_jmpbuf, png_sizeof(jmp_buf));
+ png_memcpy(tmp_jmp, png_ptr->longjmp_buffer, png_sizeof(jmp_buf));
#endif
error_fn = png_ptr->error_fn;
+#ifdef PNG_WARNINGS_SUPPORTED
warning_fn = png_ptr->warning_fn;
+#endif
error_ptr = png_ptr->error_ptr;
#ifdef PNG_USER_MEM_SUPPORTED
free_fn = png_ptr->free_fn;
@@ -1280,14 +1092,16 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr,
png_memset(png_ptr, 0, png_sizeof(png_struct));
png_ptr->error_fn = error_fn;
+#ifdef PNG_WARNINGS_SUPPORTED
png_ptr->warning_fn = warning_fn;
+#endif
png_ptr->error_ptr = error_ptr;
#ifdef PNG_USER_MEM_SUPPORTED
png_ptr->free_fn = free_fn;
#endif
#ifdef PNG_SETJMP_SUPPORTED
- png_memcpy(png_ptr->png_jmpbuf, tmp_jmp, png_sizeof(jmp_buf));
+ png_memcpy(png_ptr->longjmp_buffer, tmp_jmp, png_sizeof(jmp_buf));
#endif
}
@@ -1311,7 +1125,7 @@ png_read_png(png_structp png_ptr, png_infop info_ptr,
{
int row;
- if (png_ptr == NULL)
+ if (png_ptr == NULL || info_ptr == NULL)
return;
/* png_read_info() gives us all of the information from the
@@ -1323,8 +1137,22 @@ png_read_png(png_structp png_ptr, png_infop info_ptr,
/* -------------- image transformations start here ------------------- */
-#ifdef PNG_READ_16_TO_8_SUPPORTED
- /* Tell libpng to strip 16 bit/color files down to 8 bits per color.
+#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
+ /* Tell libpng to strip 16-bit/color files down to 8 bits per color.
+ */
+ if (transforms & PNG_TRANSFORM_SCALE_16)
+ {
+ /* Added at libpng-1.5.4. "strip_16" produces the same result that it
+ * did in earlier versions, while "scale_16" is now more accurate.
+ */
+ png_set_scale_16(png_ptr);
+ }
+#endif
+
+#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
+ /* If both SCALE and STRIP are required pngrtran will effectively cancel the
+ * latter by doing SCALE first. This is ok and allows apps not to check for
+ * which is supported to get the right answer.
*/
if (transforms & PNG_TRANSFORM_STRIP_16)
png_set_strip_16(png_ptr);
@@ -1405,7 +1233,7 @@ png_read_png(png_structp png_ptr, png_infop info_ptr,
#endif
#ifdef PNG_READ_SWAP_SUPPORTED
- /* Swap bytes of 16 bit files to least significant byte first */
+ /* Swap bytes of 16-bit files to least significant byte first */
if (transforms & PNG_TRANSFORM_SWAP_ENDIAN)
png_set_swap(png_ptr);
#endif
@@ -1424,8 +1252,19 @@ png_read_png(png_structp png_ptr, png_infop info_ptr,
png_set_gray_to_rgb(png_ptr);
#endif
+/* Added at libpng-1.5.4 */
+#ifdef PNG_READ_EXPAND_16_SUPPORTED
+ if (transforms & PNG_TRANSFORM_EXPAND_16)
+ png_set_expand_16(png_ptr);
+#endif
+
/* We don't handle adding filler bytes */
+ /* We use png_read_image and rely on that for interlace handling, but we also
+ * call png_read_update_info therefore must turn on interlace handling now:
+ */
+ (void)png_set_interlace_handling(png_ptr);
+
/* Optional call to gamma correct and add the background to the palette
* and update info structure. REQUIRED if you are expecting libpng to
* update the palette for you (i.e., you selected such a transform above).
diff --git a/src/3rdparty/libpng/pngrtran.c b/src/3rdparty/libpng/pngrtran.c
index e6e0c46b4d..5561852860 100644
--- a/src/3rdparty/libpng/pngrtran.c
+++ b/src/3rdparty/libpng/pngrtran.c
@@ -1,8 +1,8 @@
/* pngrtran.c - transforms the data in a row for PNG readers
*
- * Last changed in libpng 1.5.1 [February 3, 2011]
- * Copyright (c) 1998-2011 Glenn Randers-Pehrson
+ * Last changed in libpng 1.5.10 [March 8, 2012]
+ * Copyright (c) 1998-2012 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -106,12 +106,18 @@ png_set_background_fixed(png_structp png_ptr,
return;
}
- png_ptr->transformations |= PNG_BACKGROUND;
+ png_ptr->transformations |= PNG_COMPOSE | PNG_STRIP_ALPHA;
+ png_ptr->transformations &= ~PNG_ENCODE_ALPHA;
+ png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;
+
png_memcpy(&(png_ptr->background), background_color,
png_sizeof(png_color_16));
png_ptr->background_gamma = background_gamma;
png_ptr->background_gamma_type = (png_byte)(background_gamma_code);
- png_ptr->transformations |= (need_expand ? PNG_BACKGROUND_EXPAND : 0);
+ if (need_expand)
+ png_ptr->transformations |= PNG_BACKGROUND_EXPAND;
+ else
+ png_ptr->transformations &= ~PNG_BACKGROUND_EXPAND;
}
# ifdef PNG_FLOATING_POINT_SUPPORTED
@@ -126,8 +132,25 @@ png_set_background(png_structp png_ptr,
# endif /* FLOATING_POINT */
#endif /* READ_BACKGROUND */
-#ifdef PNG_READ_16_TO_8_SUPPORTED
-/* Strip 16 bit depth files to 8 bit depth */
+/* Scale 16-bit depth files to 8-bit depth. If both of these are set then the
+ * one that pngrtran does first (scale) happens. This is necessary to allow the
+ * TRANSFORM and API behavior to be somewhat consistent, and it's simpler.
+ */
+#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
+void PNGAPI
+png_set_scale_16(png_structp png_ptr)
+{
+ png_debug(1, "in png_set_scale_16");
+
+ if (png_ptr == NULL)
+ return;
+
+ png_ptr->transformations |= PNG_SCALE_16_TO_8;
+}
+#endif
+
+#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
+/* Chop 16-bit depth files to 8-bit depth */
void PNGAPI
png_set_strip_16(png_structp png_ptr)
{
@@ -149,12 +172,194 @@ png_set_strip_alpha(png_structp png_ptr)
if (png_ptr == NULL)
return;
- png_ptr->flags |= PNG_FLAG_STRIP_ALPHA;
+ png_ptr->transformations |= PNG_STRIP_ALPHA;
}
#endif
+#if defined(PNG_READ_ALPHA_MODE_SUPPORTED) || defined(PNG_READ_GAMMA_SUPPORTED)
+static png_fixed_point
+translate_gamma_flags(png_structp png_ptr, png_fixed_point output_gamma,
+ int is_screen)
+{
+ /* Check for flag values. The main reason for having the old Mac value as a
+ * flag is that it is pretty near impossible to work out what the correct
+ * value is from Apple documentation - a working Mac system is needed to
+ * discover the value!
+ */
+ if (output_gamma == PNG_DEFAULT_sRGB ||
+ output_gamma == PNG_FP_1 / PNG_DEFAULT_sRGB)
+ {
+ /* If there is no sRGB support this just sets the gamma to the standard
+ * sRGB value. (This is a side effect of using this function!)
+ */
+# ifdef PNG_READ_sRGB_SUPPORTED
+ png_ptr->flags |= PNG_FLAG_ASSUME_sRGB;
+# endif
+ if (is_screen)
+ output_gamma = PNG_GAMMA_sRGB;
+ else
+ output_gamma = PNG_GAMMA_sRGB_INVERSE;
+ }
+
+ else if (output_gamma == PNG_GAMMA_MAC_18 ||
+ output_gamma == PNG_FP_1 / PNG_GAMMA_MAC_18)
+ {
+ if (is_screen)
+ output_gamma = PNG_GAMMA_MAC_OLD;
+ else
+ output_gamma = PNG_GAMMA_MAC_INVERSE;
+ }
+
+ return output_gamma;
+}
+
+# ifdef PNG_FLOATING_POINT_SUPPORTED
+static png_fixed_point
+convert_gamma_value(png_structp png_ptr, double output_gamma)
+{
+ /* The following silently ignores cases where fixed point (times 100,000)
+ * gamma values are passed to the floating point API. This is safe and it
+ * means the fixed point constants work just fine with the floating point
+ * API. The alternative would just lead to undetected errors and spurious
+ * bug reports. Negative values fail inside the _fixed API unless they
+ * correspond to the flag values.
+ */
+ if (output_gamma > 0 && output_gamma < 128)
+ output_gamma *= PNG_FP_1;
+
+ /* This preserves -1 and -2 exactly: */
+ output_gamma = floor(output_gamma + .5);
+
+ if (output_gamma > PNG_FP_MAX || output_gamma < PNG_FP_MIN)
+ png_fixed_error(png_ptr, "gamma value");
+
+ return (png_fixed_point)output_gamma;
+}
+# endif
+#endif /* READ_ALPHA_MODE || READ_GAMMA */
+
+#ifdef PNG_READ_ALPHA_MODE_SUPPORTED
+void PNGFAPI
+png_set_alpha_mode_fixed(png_structp png_ptr, int mode,
+ png_fixed_point output_gamma)
+{
+ int compose = 0;
+ png_fixed_point file_gamma;
+
+ png_debug(1, "in png_set_alpha_mode");
+
+ if (png_ptr == NULL)
+ return;
+
+ output_gamma = translate_gamma_flags(png_ptr, output_gamma, 1/*screen*/);
+
+ /* Validate the value to ensure it is in a reasonable range. The value
+ * is expected to be 1 or greater, but this range test allows for some
+ * viewing correction values. The intent is to weed out users of this API
+ * who use the inverse of the gamma value accidentally! Since some of these
+ * values are reasonable this may have to be changed.
+ */
+ if (output_gamma < 70000 || output_gamma > 300000)
+ png_error(png_ptr, "output gamma out of expected range");
+
+ /* The default file gamma is the inverse of the output gamma; the output
+ * gamma may be changed below so get the file value first:
+ */
+ file_gamma = png_reciprocal(output_gamma);
+
+ /* There are really 8 possibilities here, composed of any combination
+ * of:
+ *
+ * premultiply the color channels
+ * do not encode non-opaque pixels
+ * encode the alpha as well as the color channels
+ *
+ * The differences disappear if the input/output ('screen') gamma is 1.0,
+ * because then the encoding is a no-op and there is only the choice of
+ * premultiplying the color channels or not.
+ *
+ * png_set_alpha_mode and png_set_background interact because both use
+ * png_compose to do the work. Calling both is only useful when
+ * png_set_alpha_mode is used to set the default mode - PNG_ALPHA_PNG - along
+ * with a default gamma value. Otherwise PNG_COMPOSE must not be set.
+ */
+ switch (mode)
+ {
+ case PNG_ALPHA_PNG: /* default: png standard */
+ /* No compose, but it may be set by png_set_background! */
+ png_ptr->transformations &= ~PNG_ENCODE_ALPHA;
+ png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;
+ break;
+
+ case PNG_ALPHA_ASSOCIATED: /* color channels premultiplied */
+ compose = 1;
+ png_ptr->transformations &= ~PNG_ENCODE_ALPHA;
+ png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;
+ /* The output is linear: */
+ output_gamma = PNG_FP_1;
+ break;
+
+ case PNG_ALPHA_OPTIMIZED: /* associated, non-opaque pixels linear */
+ compose = 1;
+ png_ptr->transformations &= ~PNG_ENCODE_ALPHA;
+ png_ptr->flags |= PNG_FLAG_OPTIMIZE_ALPHA;
+ /* output_gamma records the encoding of opaque pixels! */
+ break;
+
+ case PNG_ALPHA_BROKEN: /* associated, non-linear, alpha encoded */
+ compose = 1;
+ png_ptr->transformations |= PNG_ENCODE_ALPHA;
+ png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;
+ break;
+
+ default:
+ png_error(png_ptr, "invalid alpha mode");
+ }
+
+ /* Only set the default gamma if the file gamma has not been set (this has
+ * the side effect that the gamma in a second call to png_set_alpha_mode will
+ * be ignored.)
+ */
+ if (png_ptr->gamma == 0)
+ png_ptr->gamma = file_gamma;
+
+ /* But always set the output gamma: */
+ png_ptr->screen_gamma = output_gamma;
+
+ /* Finally, if pre-multiplying, set the background fields to achieve the
+ * desired result.
+ */
+ if (compose)
+ {
+ /* And obtain alpha pre-multiplication by composing on black: */
+ png_memset(&png_ptr->background, 0, sizeof png_ptr->background);
+ png_ptr->background_gamma = png_ptr->gamma; /* just in case */
+ png_ptr->background_gamma_type = PNG_BACKGROUND_GAMMA_FILE;
+ png_ptr->transformations &= ~PNG_BACKGROUND_EXPAND;
+
+ if (png_ptr->transformations & PNG_COMPOSE)
+ png_error(png_ptr,
+ "conflicting calls to set alpha mode and background");
+
+ png_ptr->transformations |= PNG_COMPOSE;
+ }
+
+ /* New API, make sure apps call the correct initializers: */
+ png_ptr->flags |= PNG_FLAG_DETECT_UNINITIALIZED;
+}
+
+# ifdef PNG_FLOATING_POINT_SUPPORTED
+void PNGAPI
+png_set_alpha_mode(png_structp png_ptr, int mode, double output_gamma)
+{
+ png_set_alpha_mode_fixed(png_ptr, mode, convert_gamma_value(png_ptr,
+ output_gamma));
+}
+# endif
+#endif
+
#ifdef PNG_READ_QUANTIZE_SUPPORTED
-/* Dither file to 8 bit. Supply a palette, the current number
+/* Dither file to 8-bit. Supply a palette, the current number
* of elements in the palette, the maximum number of elements
* allowed, and a histogram if possible. If the current number
* of colors is greater then the maximum number, the palette will be
@@ -560,30 +765,6 @@ png_set_quantize(png_structp png_ptr, png_colorp palette,
#endif /* PNG_READ_QUANTIZE_SUPPORTED */
#ifdef PNG_READ_GAMMA_SUPPORTED
-/* Transform the image from the file_gamma to the screen_gamma. We
- * only do transformations on images where the file_gamma and screen_gamma
- * are not close reciprocals, otherwise it slows things down slightly, and
- * also needlessly introduces small errors.
- *
- * We will turn off gamma transformation later if no semitransparent entries
- * are present in the tRNS array for palette images. We can't do it here
- * because we don't necessarily have the tRNS chunk yet.
- */
-static int /* PRIVATE */
-png_gamma_threshold(png_fixed_point scrn_gamma, png_fixed_point file_gamma)
-{
- /* PNG_GAMMA_THRESHOLD is the threshold for performing gamma
- * correction as a difference of the overall transform from 1.0
- *
- * We want to compare the threshold with s*f - 1, if we get
- * overflow here it is because of wacky gamma values so we
- * turn on processing anyway.
- */
- png_fixed_point gtest;
- return !png_muldiv(&gtest, scrn_gamma, file_gamma, PNG_FP_1) ||
- png_gamma_significant(gtest);
-}
-
void PNGFAPI
png_set_gamma_fixed(png_structp png_ptr, png_fixed_point scrn_gamma,
png_fixed_point file_gamma)
@@ -593,10 +774,32 @@ png_set_gamma_fixed(png_structp png_ptr, png_fixed_point scrn_gamma,
if (png_ptr == NULL)
return;
- if ((png_ptr->color_type & PNG_COLOR_MASK_ALPHA) ||
- (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ||
- png_gamma_threshold(scrn_gamma, file_gamma))
- png_ptr->transformations |= PNG_GAMMA;
+ /* New in libpng-1.5.4 - reserve particular negative values as flags. */
+ scrn_gamma = translate_gamma_flags(png_ptr, scrn_gamma, 1/*screen*/);
+ file_gamma = translate_gamma_flags(png_ptr, file_gamma, 0/*file*/);
+
+#if PNG_LIBPNG_VER >= 10600
+ /* Checking the gamma values for being >0 was added in 1.5.4 along with the
+ * premultiplied alpha support; this actually hides an undocumented feature
+ * of the previous implementation which allowed gamma processing to be
+ * disabled in background handling. There is no evidence (so far) that this
+ * was being used; however, png_set_background itself accepted and must still
+ * accept '0' for the gamma value it takes, because it isn't always used.
+ *
+ * Since this is an API change (albeit a very minor one that removes an
+ * undocumented API feature) it will not be made until libpng-1.6.0.
+ */
+ if (file_gamma <= 0)
+ png_error(png_ptr, "invalid file gamma in png_set_gamma");
+
+ if (scrn_gamma <= 0)
+ png_error(png_ptr, "invalid screen gamma in png_set_gamma");
+#endif
+
+ /* Set the gamma values unconditionally - this overrides the value in the PNG
+ * file if a gAMA chunk was present. png_set_alpha_mode provides a
+ * different, easier, way to default the file gamma.
+ */
png_ptr->gamma = file_gamma;
png_ptr->screen_gamma = scrn_gamma;
}
@@ -605,9 +808,8 @@ png_set_gamma_fixed(png_structp png_ptr, png_fixed_point scrn_gamma,
void PNGAPI
png_set_gamma(png_structp png_ptr, double scrn_gamma, double file_gamma)
{
- png_set_gamma_fixed(png_ptr,
- png_fixed(png_ptr, scrn_gamma, "png_set_gamma screen gamma"),
- png_fixed(png_ptr, file_gamma, "png_set_gamma file gamma"));
+ png_set_gamma_fixed(png_ptr, convert_gamma_value(png_ptr, scrn_gamma),
+ convert_gamma_value(png_ptr, file_gamma));
}
# endif /* FLOATING_POINT_SUPPORTED */
#endif /* READ_GAMMA */
@@ -686,6 +888,26 @@ png_set_tRNS_to_alpha(png_structp png_ptr)
}
#endif /* defined(PNG_READ_EXPAND_SUPPORTED) */
+#ifdef PNG_READ_EXPAND_16_SUPPORTED
+/* Expand to 16-bit channels, expand the tRNS chunk too (because otherwise
+ * it may not work correctly.)
+ */
+void PNGAPI
+png_set_expand_16(png_structp png_ptr)
+{
+ png_debug(1, "in png_set_expand_16");
+
+ if (png_ptr == NULL)
+ return;
+
+ png_ptr->transformations |= (PNG_EXPAND_16 | PNG_EXPAND | PNG_EXPAND_tRNS);
+ png_ptr->flags &= ~PNG_FLAG_ROW_INIT;
+
+ /* New API, make sure apps call the correct initializers: */
+ png_ptr->flags |= PNG_FLAG_DETECT_UNINITIALIZED;
+}
+#endif
+
#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
void PNGAPI
png_set_gray_to_rgb(png_structp png_ptr)
@@ -714,15 +936,15 @@ png_set_rgb_to_gray_fixed(png_structp png_ptr, int error_action,
switch(error_action)
{
- case 1:
+ case PNG_ERROR_ACTION_NONE:
png_ptr->transformations |= PNG_RGB_TO_GRAY;
break;
- case 2:
+ case PNG_ERROR_ACTION_WARN:
png_ptr->transformations |= PNG_RGB_TO_GRAY_WARN;
break;
- case 3:
+ case PNG_ERROR_ACTION_ERROR:
png_ptr->transformations |= PNG_RGB_TO_GRAY_ERR;
break;
@@ -742,30 +964,43 @@ png_set_rgb_to_gray_fixed(png_structp png_ptr, int error_action,
}
#endif
{
- png_uint_16 red_int, green_int;
- if (red < 0 || green < 0)
+ if (red >= 0 && green >= 0 && red + green <= PNG_FP_1)
{
- red_int = 6968; /* .212671 * 32768 + .5 */
- green_int = 23434; /* .715160 * 32768 + .5 */
- }
+ png_uint_16 red_int, green_int;
- else if (red + green < 100000L)
- {
- red_int = (png_uint_16)(((png_uint_32)red*32768L)/100000L);
- green_int = (png_uint_16)(((png_uint_32)green*32768L)/100000L);
+ /* NOTE: this calculation does not round, but this behavior is retained
+ * for consistency, the inaccuracy is very small. The code here always
+ * overwrites the coefficients, regardless of whether they have been
+ * defaulted or set already.
+ */
+ red_int = (png_uint_16)(((png_uint_32)red*32768)/100000);
+ green_int = (png_uint_16)(((png_uint_32)green*32768)/100000);
+
+ png_ptr->rgb_to_gray_red_coeff = red_int;
+ png_ptr->rgb_to_gray_green_coeff = green_int;
+ png_ptr->rgb_to_gray_coefficients_set = 1;
}
else
{
- png_warning(png_ptr, "ignoring out of range rgb_to_gray coefficients");
- red_int = 6968;
- green_int = 23434;
+ if (red >= 0 && green >= 0)
+ png_warning(png_ptr,
+ "ignoring out of range rgb_to_gray coefficients");
+
+ /* Use the defaults, from the cHRM chunk if set, else the historical
+ * values which are close to the sRGB/HDTV/ITU-Rec 709 values. See
+ * png_do_rgb_to_gray for more discussion of the values. In this case
+ * the coefficients are not marked as 'set' and are not overwritten if
+ * something has already provided a default.
+ */
+ if (png_ptr->rgb_to_gray_red_coeff == 0 &&
+ png_ptr->rgb_to_gray_green_coeff == 0)
+ {
+ png_ptr->rgb_to_gray_red_coeff = 6968;
+ png_ptr->rgb_to_gray_green_coeff = 23434;
+ /* png_ptr->rgb_to_gray_blue_coeff = 2366; */
+ }
}
-
- png_ptr->rgb_to_gray_red_coeff = red_int;
- png_ptr->rgb_to_gray_green_coeff = green_int;
- png_ptr->rgb_to_gray_blue_coeff =
- (png_uint_16)(32768 - red_int - green_int);
}
}
@@ -807,167 +1042,513 @@ png_set_read_user_transform_fn(png_structp png_ptr, png_user_transform_ptr
}
#endif
+#ifdef PNG_READ_TRANSFORMS_SUPPORTED
+#ifdef PNG_READ_GAMMA_SUPPORTED
+/* In the case of gamma transformations only do transformations on images where
+ * the [file] gamma and screen_gamma are not close reciprocals, otherwise it
+ * slows things down slightly, and also needlessly introduces small errors.
+ */
+static int /* PRIVATE */
+png_gamma_threshold(png_fixed_point screen_gamma, png_fixed_point file_gamma)
+{
+ /* PNG_GAMMA_THRESHOLD is the threshold for performing gamma
+ * correction as a difference of the overall transform from 1.0
+ *
+ * We want to compare the threshold with s*f - 1, if we get
+ * overflow here it is because of wacky gamma values so we
+ * turn on processing anyway.
+ */
+ png_fixed_point gtest;
+ return !png_muldiv(&gtest, screen_gamma, file_gamma, PNG_FP_1) ||
+ png_gamma_significant(gtest);
+}
+#endif
+
/* Initialize everything needed for the read. This includes modifying
* the palette.
*/
-void /* PRIVATE */
-png_init_read_transformations(png_structp png_ptr)
+
+/*For the moment 'png_init_palette_transformations' and
+ * 'png_init_rgb_transformations' only do some flag canceling optimizations.
+ * The intent is that these two routines should have palette or rgb operations
+ * extracted from 'png_init_read_transformations'.
+ */
+static void /* PRIVATE */
+png_init_palette_transformations(png_structp png_ptr)
{
- png_debug(1, "in png_init_read_transformations");
+ /* Called to handle the (input) palette case. In png_do_read_transformations
+ * the first step is to expand the palette if requested, so this code must
+ * take care to only make changes that are invariant with respect to the
+ * palette expansion, or only do them if there is no expansion.
+ *
+ * STRIP_ALPHA has already been handled in the caller (by setting num_trans
+ * to 0.)
+ */
+ int input_has_alpha = 0;
+ int input_has_transparency = 0;
- {
-#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \
- defined(PNG_READ_SHIFT_SUPPORTED) || \
- defined(PNG_READ_GAMMA_SUPPORTED)
- int color_type = png_ptr->color_type;
-#endif
+ if (png_ptr->num_trans > 0)
+ {
+ int i;
+
+ /* Ignore if all the entries are opaque (unlikely!) */
+ for (i=0; i<png_ptr->num_trans; ++i)
+ if (png_ptr->trans_alpha[i] == 255)
+ continue;
+ else if (png_ptr->trans_alpha[i] == 0)
+ input_has_transparency = 1;
+ else
+ input_has_alpha = 1;
+ }
+
+ /* If no alpha we can optimize. */
+ if (!input_has_alpha)
+ {
+ /* Any alpha means background and associative alpha processing is
+ * required, however if the alpha is 0 or 1 throughout OPTIIMIZE_ALPHA
+ * and ENCODE_ALPHA are irrelevant.
+ */
+ png_ptr->transformations &= ~PNG_ENCODE_ALPHA;
+ png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;
+
+ if (!input_has_transparency)
+ png_ptr->transformations &= ~(PNG_COMPOSE | PNG_BACKGROUND_EXPAND);
+ }
#if defined(PNG_READ_EXPAND_SUPPORTED) && defined(PNG_READ_BACKGROUND_SUPPORTED)
+ /* png_set_background handling - deals with the complexity of whether the
+ * background color is in the file format or the screen format in the case
+ * where an 'expand' will happen.
+ */
-#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
- /* Detect gray background and attempt to enable optimization
- * for gray --> RGB case
- *
- * Note: if PNG_BACKGROUND_EXPAND is set and color_type is either RGB or
- * RGB_ALPHA (in which case need_expand is superfluous anyway), the
- * background color might actually be gray yet not be flagged as such.
- * This is not a problem for the current code, which uses
- * PNG_BACKGROUND_IS_GRAY only to decide when to do the
- * png_do_gray_to_rgb() transformation.
+ /* The following code cannot be entered in the alpha pre-multiplication case
+ * because PNG_BACKGROUND_EXPAND is cancelled below.
*/
if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) &&
- !(color_type & PNG_COLOR_MASK_COLOR))
+ (png_ptr->transformations & PNG_EXPAND))
{
- png_ptr->mode |= PNG_BACKGROUND_IS_GRAY;
- }
+ {
+ png_ptr->background.red =
+ png_ptr->palette[png_ptr->background.index].red;
+ png_ptr->background.green =
+ png_ptr->palette[png_ptr->background.index].green;
+ png_ptr->background.blue =
+ png_ptr->palette[png_ptr->background.index].blue;
+
+#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED
+ if (png_ptr->transformations & PNG_INVERT_ALPHA)
+ {
+ if (!(png_ptr->transformations & PNG_EXPAND_tRNS))
+ {
+ /* Invert the alpha channel (in tRNS) unless the pixels are
+ * going to be expanded, in which case leave it for later
+ */
+ int i, istop = png_ptr->num_trans;
+
+ for (i=0; i<istop; i++)
+ png_ptr->trans_alpha[i] = (png_byte)(255 -
+ png_ptr->trans_alpha[i]);
+ }
+ }
+#endif /* PNG_READ_INVERT_ALPHA_SUPPORTED */
+ }
+ } /* background expand and (therefore) no alpha association. */
+#endif /* PNG_READ_EXPAND_SUPPORTED && PNG_READ_BACKGROUND_SUPPORTED */
+}
- else if ((png_ptr->transformations & PNG_BACKGROUND) &&
- !(png_ptr->transformations & PNG_BACKGROUND_EXPAND) &&
- (png_ptr->transformations & PNG_GRAY_TO_RGB) &&
- png_ptr->background.red == png_ptr->background.green &&
- png_ptr->background.red == png_ptr->background.blue)
+static void /* PRIVATE */
+png_init_rgb_transformations(png_structp png_ptr)
+{
+ /* Added to libpng-1.5.4: check the color type to determine whether there
+ * is any alpha or transparency in the image and simply cancel the
+ * background and alpha mode stuff if there isn't.
+ */
+ int input_has_alpha = (png_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0;
+ int input_has_transparency = png_ptr->num_trans > 0;
+
+ /* If no alpha we can optimize. */
+ if (!input_has_alpha)
{
- png_ptr->mode |= PNG_BACKGROUND_IS_GRAY;
- png_ptr->background.gray = png_ptr->background.red;
+ /* Any alpha means background and associative alpha processing is
+ * required, however if the alpha is 0 or 1 throughout OPTIIMIZE_ALPHA
+ * and ENCODE_ALPHA are irrelevant.
+ */
+# ifdef PNG_READ_ALPHA_MODE_SUPPORTED
+ png_ptr->transformations &= ~PNG_ENCODE_ALPHA;
+ png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;
+# endif
+
+ if (!input_has_transparency)
+ png_ptr->transformations &= ~(PNG_COMPOSE | PNG_BACKGROUND_EXPAND);
}
-#endif
+#if defined(PNG_READ_EXPAND_SUPPORTED) && defined(PNG_READ_BACKGROUND_SUPPORTED)
+ /* png_set_background handling - deals with the complexity of whether the
+ * background color is in the file format or the screen format in the case
+ * where an 'expand' will happen.
+ */
+
+ /* The following code cannot be entered in the alpha pre-multiplication case
+ * because PNG_BACKGROUND_EXPAND is cancelled below.
+ */
if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) &&
- (png_ptr->transformations & PNG_EXPAND))
+ (png_ptr->transformations & PNG_EXPAND) &&
+ !(png_ptr->color_type & PNG_COLOR_MASK_COLOR))
+ /* i.e., GRAY or GRAY_ALPHA */
{
- if (!(color_type & PNG_COLOR_MASK_COLOR)) /* i.e., GRAY or GRAY_ALPHA */
{
/* Expand background and tRNS chunks */
+ int gray = png_ptr->background.gray;
+ int trans_gray = png_ptr->trans_color.gray;
+
switch (png_ptr->bit_depth)
{
case 1:
- png_ptr->background.gray *= (png_uint_16)0xff;
- png_ptr->background.red = png_ptr->background.green
- = png_ptr->background.blue = png_ptr->background.gray;
- if (!(png_ptr->transformations & PNG_EXPAND_tRNS))
- {
- png_ptr->trans_color.gray *= (png_uint_16)0xff;
- png_ptr->trans_color.red = png_ptr->trans_color.green
- = png_ptr->trans_color.blue = png_ptr->trans_color.gray;
- }
+ gray *= 0xff;
+ trans_gray *= 0xff;
break;
case 2:
- png_ptr->background.gray *= (png_uint_16)0x55;
- png_ptr->background.red = png_ptr->background.green
- = png_ptr->background.blue = png_ptr->background.gray;
- if (!(png_ptr->transformations & PNG_EXPAND_tRNS))
- {
- png_ptr->trans_color.gray *= (png_uint_16)0x55;
- png_ptr->trans_color.red = png_ptr->trans_color.green
- = png_ptr->trans_color.blue = png_ptr->trans_color.gray;
- }
+ gray *= 0x55;
+ trans_gray *= 0x55;
break;
case 4:
- png_ptr->background.gray *= (png_uint_16)0x11;
- png_ptr->background.red = png_ptr->background.green
- = png_ptr->background.blue = png_ptr->background.gray;
- if (!(png_ptr->transformations & PNG_EXPAND_tRNS))
- {
- png_ptr->trans_color.gray *= (png_uint_16)0x11;
- png_ptr->trans_color.red = png_ptr->trans_color.green
- = png_ptr->trans_color.blue = png_ptr->trans_color.gray;
- }
+ gray *= 0x11;
+ trans_gray *= 0x11;
break;
default:
case 8:
+ /* Already 8 bits, fall through */
case 16:
- png_ptr->background.red = png_ptr->background.green
- = png_ptr->background.blue = png_ptr->background.gray;
+ /* Already a full 16 bits */
break;
}
+
+ png_ptr->background.red = png_ptr->background.green =
+ png_ptr->background.blue = (png_uint_16)gray;
+
+ if (!(png_ptr->transformations & PNG_EXPAND_tRNS))
+ {
+ png_ptr->trans_color.red = png_ptr->trans_color.green =
+ png_ptr->trans_color.blue = (png_uint_16)trans_gray;
+ }
}
- else if (color_type == PNG_COLOR_TYPE_PALETTE)
- {
- png_ptr->background.red =
- png_ptr->palette[png_ptr->background.index].red;
- png_ptr->background.green =
- png_ptr->palette[png_ptr->background.index].green;
- png_ptr->background.blue =
- png_ptr->palette[png_ptr->background.index].blue;
+ } /* background expand and (therefore) no alpha association. */
+#endif /* PNG_READ_EXPAND_SUPPORTED && PNG_READ_BACKGROUND_SUPPORTED */
+}
-#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED
- if (png_ptr->transformations & PNG_INVERT_ALPHA)
- {
-#ifdef PNG_READ_EXPAND_SUPPORTED
- if (!(png_ptr->transformations & PNG_EXPAND_tRNS))
-#endif
- {
- /* Invert the alpha channel (in tRNS) unless the pixels are
- * going to be expanded, in which case leave it for later
- */
- int i, istop;
- istop=(int)png_ptr->num_trans;
- for (i=0; i<istop; i++)
- png_ptr->trans_alpha[i] = (png_byte)(255 -
- png_ptr->trans_alpha[i]);
- }
- }
-#endif
+void /* PRIVATE */
+png_init_read_transformations(png_structp png_ptr)
+{
+ png_debug(1, "in png_init_read_transformations");
+
+ /* This internal function is called from png_read_start_row in pngrutil.c
+ * and it is called before the 'rowbytes' calculation is done, so the code
+ * in here can change or update the transformations flags.
+ *
+ * First do updates that do not depend on the details of the PNG image data
+ * being processed.
+ */
+#ifdef PNG_READ_GAMMA_SUPPORTED
+ /* Prior to 1.5.4 these tests were performed from png_set_gamma, 1.5.4 adds
+ * png_set_alpha_mode and this is another source for a default file gamma so
+ * the test needs to be performed later - here. In addition prior to 1.5.4
+ * the tests were repeated for the PALETTE color type here - this is no
+ * longer necessary (and doesn't seem to have been necessary before.)
+ */
+ {
+ /* The following temporary indicates if overall gamma correction is
+ * required.
+ */
+ int gamma_correction = 0;
+
+ if (png_ptr->gamma != 0) /* has been set */
+ {
+ if (png_ptr->screen_gamma != 0) /* screen set too */
+ gamma_correction = png_gamma_threshold(png_ptr->gamma,
+ png_ptr->screen_gamma);
+
+ else
+ /* Assume the output matches the input; a long time default behavior
+ * of libpng, although the standard has nothing to say about this.
+ */
+ png_ptr->screen_gamma = png_reciprocal(png_ptr->gamma);
}
+
+ else if (png_ptr->screen_gamma != 0)
+ /* The converse - assume the file matches the screen, note that this
+ * perhaps undesireable default can (from 1.5.4) be changed by calling
+ * png_set_alpha_mode (even if the alpha handling mode isn't required
+ * or isn't changed from the default.)
+ */
+ png_ptr->gamma = png_reciprocal(png_ptr->screen_gamma);
+
+ else /* neither are set */
+ /* Just in case the following prevents any processing - file and screen
+ * are both assumed to be linear and there is no way to introduce a
+ * third gamma value other than png_set_background with 'UNIQUE', and,
+ * prior to 1.5.4
+ */
+ png_ptr->screen_gamma = png_ptr->gamma = PNG_FP_1;
+
+ /* Now turn the gamma transformation on or off as appropriate. Notice
+ * that PNG_GAMMA just refers to the file->screen correction. Alpha
+ * composition may independently cause gamma correction because it needs
+ * linear data (e.g. if the file has a gAMA chunk but the screen gamma
+ * hasn't been specified.) In any case this flag may get turned off in
+ * the code immediately below if the transform can be handled outside the
+ * row loop.
+ */
+ if (gamma_correction)
+ png_ptr->transformations |= PNG_GAMMA;
+
+ else
+ png_ptr->transformations &= ~PNG_GAMMA;
}
#endif
-#if defined(PNG_READ_BACKGROUND_SUPPORTED) && defined(PNG_READ_GAMMA_SUPPORTED)
- png_ptr->background_1 = png_ptr->background;
+ /* Certain transformations have the effect of preventing other
+ * transformations that happen afterward in png_do_read_transformations,
+ * resolve the interdependencies here. From the code of
+ * png_do_read_transformations the order is:
+ *
+ * 1) PNG_EXPAND (including PNG_EXPAND_tRNS)
+ * 2) PNG_STRIP_ALPHA (if no compose)
+ * 3) PNG_RGB_TO_GRAY
+ * 4) PNG_GRAY_TO_RGB iff !PNG_BACKGROUND_IS_GRAY
+ * 5) PNG_COMPOSE
+ * 6) PNG_GAMMA
+ * 7) PNG_STRIP_ALPHA (if compose)
+ * 8) PNG_ENCODE_ALPHA
+ * 9) PNG_SCALE_16_TO_8
+ * 10) PNG_16_TO_8
+ * 11) PNG_QUANTIZE (converts to palette)
+ * 12) PNG_EXPAND_16
+ * 13) PNG_GRAY_TO_RGB iff PNG_BACKGROUND_IS_GRAY
+ * 14) PNG_INVERT_MONO
+ * 15) PNG_SHIFT
+ * 16) PNG_PACK
+ * 17) PNG_BGR
+ * 18) PNG_PACKSWAP
+ * 19) PNG_FILLER (includes PNG_ADD_ALPHA)
+ * 20) PNG_INVERT_ALPHA
+ * 21) PNG_SWAP_ALPHA
+ * 22) PNG_SWAP_BYTES
+ * 23) PNG_USER_TRANSFORM [must be last]
+ */
+#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
+ if ((png_ptr->transformations & PNG_STRIP_ALPHA) &&
+ !(png_ptr->transformations & PNG_COMPOSE))
+ {
+ /* Stripping the alpha channel happens immediately after the 'expand'
+ * transformations, before all other transformation, so it cancels out
+ * the alpha handling. It has the side effect negating the effect of
+ * PNG_EXPAND_tRNS too:
+ */
+ png_ptr->transformations &= ~(PNG_BACKGROUND_EXPAND | PNG_ENCODE_ALPHA |
+ PNG_EXPAND_tRNS);
+ png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;
+
+ /* Kill the tRNS chunk itself too. Prior to 1.5.4 this did not happen
+ * so transparency information would remain just so long as it wasn't
+ * expanded. This produces unexpected API changes if the set of things
+ * that do PNG_EXPAND_tRNS changes (perfectly possible given the
+ * documentation - which says ask for what you want, accept what you
+ * get.) This makes the behavior consistent from 1.5.4:
+ */
+ png_ptr->num_trans = 0;
+ }
+#endif /* STRIP_ALPHA supported, no COMPOSE */
+
+#ifdef PNG_READ_ALPHA_MODE_SUPPORTED
+ /* If the screen gamma is about 1.0 then the OPTIMIZE_ALPHA and ENCODE_ALPHA
+ * settings will have no effect.
+ */
+ if (!png_gamma_significant(png_ptr->screen_gamma))
+ {
+ png_ptr->transformations &= ~PNG_ENCODE_ALPHA;
+ png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;
+ }
#endif
-#ifdef PNG_READ_GAMMA_SUPPORTED
- if ((color_type == PNG_COLOR_TYPE_PALETTE && png_ptr->num_trans != 0)
- && png_gamma_threshold(png_ptr->screen_gamma, png_ptr->gamma))
+#if defined(PNG_READ_EXPAND_SUPPORTED) && \
+ defined(PNG_READ_BACKGROUND_SUPPORTED) && \
+ defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)
+ /* Detect gray background and attempt to enable optimization for
+ * gray --> RGB case.
+ *
+ * Note: if PNG_BACKGROUND_EXPAND is set and color_type is either RGB or
+ * RGB_ALPHA (in which case need_expand is superfluous anyway), the
+ * background color might actually be gray yet not be flagged as such.
+ * This is not a problem for the current code, which uses
+ * PNG_BACKGROUND_IS_GRAY only to decide when to do the
+ * png_do_gray_to_rgb() transformation.
+ *
+ * TODO: this code needs to be revised to avoid the complexity and
+ * interdependencies. The color type of the background should be recorded in
+ * png_set_background, along with the bit depth, then the code has a record
+ * of exactly what color space the background is currently in.
+ */
+ if (png_ptr->transformations & PNG_BACKGROUND_EXPAND)
+ {
+ /* PNG_BACKGROUND_EXPAND: the background is in the file color space, so if
+ * the file was grayscale the background value is gray.
+ */
+ if (!(png_ptr->color_type & PNG_COLOR_MASK_COLOR))
+ png_ptr->mode |= PNG_BACKGROUND_IS_GRAY;
+ }
+
+ else if (png_ptr->transformations & PNG_COMPOSE)
{
- int i, k;
- k=0;
- for (i=0; i<png_ptr->num_trans; i++)
+ /* PNG_COMPOSE: png_set_background was called with need_expand false,
+ * so the color is in the color space of the output or png_set_alpha_mode
+ * was called and the color is black. Ignore RGB_TO_GRAY because that
+ * happens before GRAY_TO_RGB.
+ */
+ if (png_ptr->transformations & PNG_GRAY_TO_RGB)
{
- if (png_ptr->trans_alpha[i] != 0 && png_ptr->trans_alpha[i] != 0xff)
- k=1; /* Partial transparency is present */
+ if (png_ptr->background.red == png_ptr->background.green &&
+ png_ptr->background.red == png_ptr->background.blue)
+ {
+ png_ptr->mode |= PNG_BACKGROUND_IS_GRAY;
+ png_ptr->background.gray = png_ptr->background.red;
+ }
}
- if (k == 0)
- png_ptr->transformations &= ~PNG_GAMMA;
}
+#endif /* PNG_READ_GRAY_TO_RGB_SUPPORTED (etc) */
+
+ /* For indexed PNG data (PNG_COLOR_TYPE_PALETTE) many of the transformations
+ * can be performed directly on the palette, and some (such as rgb to gray)
+ * can be optimized inside the palette. This is particularly true of the
+ * composite (background and alpha) stuff, which can be pretty much all done
+ * in the palette even if the result is expanded to RGB or gray afterward.
+ *
+ * NOTE: this is Not Yet Implemented, the code behaves as in 1.5.1 and
+ * earlier and the palette stuff is actually handled on the first row. This
+ * leads to the reported bug that the palette returned by png_get_PLTE is not
+ * updated.
+ */
+ if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
+ png_init_palette_transformations(png_ptr);
- if ((png_ptr->transformations & (PNG_GAMMA | PNG_RGB_TO_GRAY)) &&
- png_ptr->gamma != 0)
+ else
+ png_init_rgb_transformations(png_ptr);
+
+#if defined(PNG_READ_BACKGROUND_SUPPORTED) && \
+ defined(PNG_READ_EXPAND_16_SUPPORTED)
+ if ((png_ptr->transformations & PNG_EXPAND_16) &&
+ (png_ptr->transformations & PNG_COMPOSE) &&
+ !(png_ptr->transformations & PNG_BACKGROUND_EXPAND) &&
+ png_ptr->bit_depth != 16)
+ {
+ /* TODO: fix this. Because the expand_16 operation is after the compose
+ * handling the background color must be 8, not 16, bits deep, but the
+ * application will supply a 16-bit value so reduce it here.
+ *
+ * The PNG_BACKGROUND_EXPAND code above does not expand to 16 bits at
+ * present, so that case is ok (until do_expand_16 is moved.)
+ *
+ * NOTE: this discards the low 16 bits of the user supplied background
+ * color, but until expand_16 works properly there is no choice!
+ */
+# define CHOP(x) (x)=((png_uint_16)(((png_uint_32)(x)*255+32895) >> 16))
+ CHOP(png_ptr->background.red);
+ CHOP(png_ptr->background.green);
+ CHOP(png_ptr->background.blue);
+ CHOP(png_ptr->background.gray);
+# undef CHOP
+ }
+#endif /* PNG_READ_BACKGROUND_SUPPORTED && PNG_READ_EXPAND_16_SUPPORTED */
+
+#if defined(PNG_READ_BACKGROUND_SUPPORTED) && \
+ (defined(PNG_READ_SCALE_16_TO_8_SUPPORTED) || \
+ defined(PNG_READ_STRIP_16_TO_8_SUPPORTED))
+ if ((png_ptr->transformations & (PNG_16_TO_8|PNG_SCALE_16_TO_8)) &&
+ (png_ptr->transformations & PNG_COMPOSE) &&
+ !(png_ptr->transformations & PNG_BACKGROUND_EXPAND) &&
+ png_ptr->bit_depth == 16)
+ {
+ /* On the other hand, if a 16-bit file is to be reduced to 8-bits per
+ * component this will also happen after PNG_COMPOSE and so the background
+ * color must be pre-expanded here.
+ *
+ * TODO: fix this too.
+ */
+ png_ptr->background.red = (png_uint_16)(png_ptr->background.red * 257);
+ png_ptr->background.green =
+ (png_uint_16)(png_ptr->background.green * 257);
+ png_ptr->background.blue = (png_uint_16)(png_ptr->background.blue * 257);
+ png_ptr->background.gray = (png_uint_16)(png_ptr->background.gray * 257);
+ }
+#endif
+
+ /* NOTE: below 'PNG_READ_ALPHA_MODE_SUPPORTED' is presumed to also enable the
+ * background support (see the comments in scripts/pnglibconf.dfa), this
+ * allows pre-multiplication of the alpha channel to be implemented as
+ * compositing on black. This is probably sub-optimal and has been done in
+ * 1.5.4 betas simply to enable external critique and testing (i.e. to
+ * implement the new API quickly, without lots of internal changes.)
+ */
+
+#ifdef PNG_READ_GAMMA_SUPPORTED
+# ifdef PNG_READ_BACKGROUND_SUPPORTED
+ /* Includes ALPHA_MODE */
+ png_ptr->background_1 = png_ptr->background;
+# endif
+
+ /* This needs to change - in the palette image case a whole set of tables are
+ * built when it would be quicker to just calculate the correct value for
+ * each palette entry directly. Also, the test is too tricky - why check
+ * PNG_RGB_TO_GRAY if PNG_GAMMA is not set? The answer seems to be that
+ * PNG_GAMMA is cancelled even if the gamma is known? The test excludes the
+ * PNG_COMPOSE case, so apparently if there is no *overall* gamma correction
+ * the gamma tables will not be built even if composition is required on a
+ * gamma encoded value.
+ *
+ * In 1.5.4 this is addressed below by an additional check on the individual
+ * file gamma - if it is not 1.0 both RGB_TO_GRAY and COMPOSE need the
+ * tables.
+ */
+ if ((png_ptr->transformations & PNG_GAMMA)
+ || ((png_ptr->transformations & PNG_RGB_TO_GRAY)
+ && (png_gamma_significant(png_ptr->gamma) ||
+ png_gamma_significant(png_ptr->screen_gamma)))
+ || ((png_ptr->transformations & PNG_COMPOSE)
+ && (png_gamma_significant(png_ptr->gamma)
+ || png_gamma_significant(png_ptr->screen_gamma)
+# ifdef PNG_READ_BACKGROUND_SUPPORTED
+ || (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_UNIQUE
+ && png_gamma_significant(png_ptr->background_gamma))
+# endif
+ )) || ((png_ptr->transformations & PNG_ENCODE_ALPHA)
+ && png_gamma_significant(png_ptr->screen_gamma))
+ )
{
png_build_gamma_table(png_ptr, png_ptr->bit_depth);
#ifdef PNG_READ_BACKGROUND_SUPPORTED
- if (png_ptr->transformations & PNG_BACKGROUND)
+ if (png_ptr->transformations & PNG_COMPOSE)
{
- if (color_type == PNG_COLOR_TYPE_PALETTE)
+ /* Issue a warning about this combination: because RGB_TO_GRAY is
+ * optimized to do the gamma transform if present yet do_background has
+ * to do the same thing if both options are set a
+ * double-gamma-correction happens. This is true in all versions of
+ * libpng to date.
+ */
+ if (png_ptr->transformations & PNG_RGB_TO_GRAY)
+ png_warning(png_ptr,
+ "libpng does not support gamma+background+rgb_to_gray");
+
+ if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
{
- /* Could skip if no transparency */
+ /* We don't get to here unless there is a tRNS chunk with non-opaque
+ * entries - see the checking code at the start of this function.
+ */
png_color back, back_1;
png_colorp palette = png_ptr->palette;
int num_palette = png_ptr->num_palette;
@@ -1013,26 +1594,39 @@ png_init_read_transformations(png_structp png_ptr)
if (png_gamma_significant(gs))
{
+ back.red = png_gamma_8bit_correct(png_ptr->background.red,
+ gs);
+ back.green = png_gamma_8bit_correct(png_ptr->background.green,
+ gs);
+ back.blue = png_gamma_8bit_correct(png_ptr->background.blue,
+ gs);
+ }
+
+ else
+ {
back.red = (png_byte)png_ptr->background.red;
back.green = (png_byte)png_ptr->background.green;
back.blue = (png_byte)png_ptr->background.blue;
}
+ if (png_gamma_significant(g))
+ {
+ back_1.red = png_gamma_8bit_correct(png_ptr->background.red,
+ g);
+ back_1.green = png_gamma_8bit_correct(
+ png_ptr->background.green, g);
+ back_1.blue = png_gamma_8bit_correct(png_ptr->background.blue,
+ g);
+ }
+
else
{
- back.red = png_gamma_8bit_correct(png_ptr->background.red,
- gs);
- back.green = png_gamma_8bit_correct(png_ptr->background.green,
- gs);
- back.blue = png_gamma_8bit_correct(png_ptr->background.blue,
- gs);
+ back_1.red = (png_byte)png_ptr->background.red;
+ back_1.green = (png_byte)png_ptr->background.green;
+ back_1.blue = (png_byte)png_ptr->background.blue;
}
- back_1.red = png_gamma_8bit_correct(png_ptr->background.red, g);
- back_1.green = png_gamma_8bit_correct(png_ptr->background.green,
- g);
- back_1.blue = png_gamma_8bit_correct(png_ptr->background.blue,
- g);
}
+
for (i = 0; i < num_palette; i++)
{
if (i < (int)png_ptr->num_trans &&
@@ -1066,22 +1660,22 @@ png_init_read_transformations(png_structp png_ptr)
palette[i].blue = png_ptr->gamma_table[palette[i].blue];
}
}
- /* Prevent the transformations being done again, and make sure
- * that the now spurious alpha channel is stripped - the code
- * has just reduced background composition and gamma correction
- * to a simple alpha channel strip.
+
+ /* Prevent the transformations being done again.
+ *
+ * NOTE: this is highly dubious; it removes the transformations in
+ * place. This seems inconsistent with the general treatment of the
+ * transformations elsewhere.
*/
- png_ptr->transformations &= ~PNG_BACKGROUND;
- png_ptr->transformations &= ~PNG_GAMMA;
- png_ptr->flags |= PNG_FLAG_STRIP_ALPHA;
- }
+ png_ptr->transformations &= ~(PNG_COMPOSE | PNG_GAMMA);
+ } /* color_type == PNG_COLOR_TYPE_PALETTE */
/* if (png_ptr->background_gamma_type!=PNG_BACKGROUND_GAMMA_UNKNOWN) */
- else
- /* color_type != PNG_COLOR_TYPE_PALETTE */
+ else /* color_type != PNG_COLOR_TYPE_PALETTE */
{
- png_fixed_point g = PNG_FP_1;
- png_fixed_point gs = PNG_FP_1;
+ int gs_sig, g_sig;
+ png_fixed_point g = PNG_FP_1; /* Correction to linear */
+ png_fixed_point gs = PNG_FP_1; /* Correction to screen */
switch (png_ptr->background_gamma_type)
{
@@ -1105,34 +1699,45 @@ png_init_read_transformations(png_structp png_ptr)
png_error(png_ptr, "invalid background gamma type");
}
- png_ptr->background_1.gray = png_gamma_correct(png_ptr,
- png_ptr->background.gray, g);
+ g_sig = png_gamma_significant(g);
+ gs_sig = png_gamma_significant(gs);
+
+ if (g_sig)
+ png_ptr->background_1.gray = png_gamma_correct(png_ptr,
+ png_ptr->background.gray, g);
- png_ptr->background.gray = png_gamma_correct(png_ptr,
- png_ptr->background.gray, gs);
+ if (gs_sig)
+ png_ptr->background.gray = png_gamma_correct(png_ptr,
+ png_ptr->background.gray, gs);
if ((png_ptr->background.red != png_ptr->background.green) ||
(png_ptr->background.red != png_ptr->background.blue) ||
(png_ptr->background.red != png_ptr->background.gray))
{
/* RGB or RGBA with color background */
- png_ptr->background_1.red = png_gamma_correct(png_ptr,
- png_ptr->background.red, g);
+ if (g_sig)
+ {
+ png_ptr->background_1.red = png_gamma_correct(png_ptr,
+ png_ptr->background.red, g);
- png_ptr->background_1.green = png_gamma_correct(png_ptr,
- png_ptr->background.green, g);
+ png_ptr->background_1.green = png_gamma_correct(png_ptr,
+ png_ptr->background.green, g);
- png_ptr->background_1.blue = png_gamma_correct(png_ptr,
- png_ptr->background.blue, g);
+ png_ptr->background_1.blue = png_gamma_correct(png_ptr,
+ png_ptr->background.blue, g);
+ }
- png_ptr->background.red = png_gamma_correct(png_ptr,
- png_ptr->background.red, gs);
+ if (gs_sig)
+ {
+ png_ptr->background.red = png_gamma_correct(png_ptr,
+ png_ptr->background.red, gs);
- png_ptr->background.green = png_gamma_correct(png_ptr,
- png_ptr->background.green, gs);
+ png_ptr->background.green = png_gamma_correct(png_ptr,
+ png_ptr->background.green, gs);
- png_ptr->background.blue = png_gamma_correct(png_ptr,
- png_ptr->background.blue, gs);
+ png_ptr->background.blue = png_gamma_correct(png_ptr,
+ png_ptr->background.blue, gs);
+ }
}
else
@@ -1144,17 +1749,30 @@ png_init_read_transformations(png_structp png_ptr)
png_ptr->background.red = png_ptr->background.green
= png_ptr->background.blue = png_ptr->background.gray;
}
- }
- }
+
+ /* The background is now in screen gamma: */
+ png_ptr->background_gamma_type = PNG_BACKGROUND_GAMMA_SCREEN;
+ } /* color_type != PNG_COLOR_TYPE_PALETTE */
+ }/* png_ptr->transformations & PNG_BACKGROUND */
+
else
/* Transformation does not include PNG_BACKGROUND */
#endif /* PNG_READ_BACKGROUND_SUPPORTED */
- if (color_type == PNG_COLOR_TYPE_PALETTE)
+ if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE
+#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
+ /* RGB_TO_GRAY needs to have non-gamma-corrected values! */
+ && ((png_ptr->transformations & PNG_EXPAND) == 0 ||
+ (png_ptr->transformations & PNG_RGB_TO_GRAY) == 0)
+#endif
+ )
{
png_colorp palette = png_ptr->palette;
int num_palette = png_ptr->num_palette;
int i;
+ /*NOTE: there are other transformations that should probably be in here
+ * too.
+ */
for (i = 0; i < num_palette; i++)
{
palette[i].red = png_ptr->gamma_table[palette[i].red];
@@ -1164,16 +1782,17 @@ png_init_read_transformations(png_structp png_ptr)
/* Done the gamma correction. */
png_ptr->transformations &= ~PNG_GAMMA;
- }
+ } /* color_type == PALETTE && !PNG_BACKGROUND transformation */
}
#ifdef PNG_READ_BACKGROUND_SUPPORTED
else
#endif
#endif /* PNG_READ_GAMMA_SUPPORTED */
+
#ifdef PNG_READ_BACKGROUND_SUPPORTED
- /* No GAMMA transformation */
- if ((png_ptr->transformations & PNG_BACKGROUND) &&
- (color_type == PNG_COLOR_TYPE_PALETTE))
+ /* No GAMMA transformation (see the hanging else 4 lines above) */
+ if ((png_ptr->transformations & PNG_COMPOSE) &&
+ (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE))
{
int i;
int istop = (int)png_ptr->num_trans;
@@ -1205,45 +1824,52 @@ png_init_read_transformations(png_structp png_ptr)
}
}
- /* Handled alpha, still need to strip the channel. */
- png_ptr->transformations &= ~PNG_BACKGROUND;
- png_ptr->flags |= PNG_FLAG_STRIP_ALPHA;
+ png_ptr->transformations &= ~PNG_COMPOSE;
}
#endif /* PNG_READ_BACKGROUND_SUPPORTED */
#ifdef PNG_READ_SHIFT_SUPPORTED
if ((png_ptr->transformations & PNG_SHIFT) &&
- (color_type == PNG_COLOR_TYPE_PALETTE))
+ !(png_ptr->transformations & PNG_EXPAND) &&
+ (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE))
{
- png_uint_16 i;
- png_uint_16 istop = png_ptr->num_palette;
- int sr = 8 - png_ptr->sig_bit.red;
- int sg = 8 - png_ptr->sig_bit.green;
- int sb = 8 - png_ptr->sig_bit.blue;
+ int i;
+ int istop = png_ptr->num_palette;
+ int shift = 8 - png_ptr->sig_bit.red;
- if (sr < 0 || sr > 8)
- sr = 0;
+ png_ptr->transformations &= ~PNG_SHIFT;
- if (sg < 0 || sg > 8)
- sg = 0;
+ /* significant bits can be in the range 1 to 7 for a meaninful result, if
+ * the number of significant bits is 0 then no shift is done (this is an
+ * error condition which is silently ignored.)
+ */
+ if (shift > 0 && shift < 8) for (i=0; i<istop; ++i)
+ {
+ int component = png_ptr->palette[i].red;
- if (sb < 0 || sb > 8)
- sb = 0;
+ component >>= shift;
+ png_ptr->palette[i].red = (png_byte)component;
+ }
- for (i = 0; i < istop; i++)
+ shift = 8 - png_ptr->sig_bit.green;
+ if (shift > 0 && shift < 8) for (i=0; i<istop; ++i)
{
- png_ptr->palette[i].red >>= sr;
- png_ptr->palette[i].green >>= sg;
- png_ptr->palette[i].blue >>= sb;
+ int component = png_ptr->palette[i].green;
+
+ component >>= shift;
+ png_ptr->palette[i].green = (png_byte)component;
+ }
+
+ shift = 8 - png_ptr->sig_bit.blue;
+ if (shift > 0 && shift < 8) for (i=0; i<istop; ++i)
+ {
+ int component = png_ptr->palette[i].blue;
+
+ component >>= shift;
+ png_ptr->palette[i].blue = (png_byte)component;
}
}
#endif /* PNG_READ_SHIFT_SUPPORTED */
- }
-#if !defined(PNG_READ_GAMMA_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED) \
- && !defined(PNG_READ_BACKGROUND_SUPPORTED)
- if (png_ptr)
- return;
-#endif
}
/* Modify the info structure to reflect the transformations. The
@@ -1260,8 +1886,11 @@ png_read_transform_info(png_structp png_ptr, png_infop info_ptr)
{
if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
{
- if (png_ptr->num_trans &&
- (png_ptr->transformations & PNG_EXPAND_tRNS))
+ /* This check must match what actually happens in
+ * png_do_expand_palette; if it ever checks the tRNS chunk to see if
+ * it is all opaque we must do the same (at present it does not.)
+ */
+ if (png_ptr->num_trans > 0)
info_ptr->color_type = PNG_COLOR_TYPE_RGB_ALPHA;
else
@@ -1285,45 +1914,72 @@ png_read_transform_info(png_structp png_ptr, png_infop info_ptr)
}
#endif
-#ifdef PNG_READ_BACKGROUND_SUPPORTED
- if (png_ptr->transformations & PNG_BACKGROUND)
- {
- info_ptr->color_type = (png_byte)(info_ptr->color_type &
- ~PNG_COLOR_MASK_ALPHA);
- info_ptr->num_trans = 0;
+#if defined(PNG_READ_BACKGROUND_SUPPORTED) ||\
+ defined(PNG_READ_ALPHA_MODE_SUPPORTED)
+ /* The following is almost certainly wrong unless the background value is in
+ * the screen space!
+ */
+ if (png_ptr->transformations & PNG_COMPOSE)
info_ptr->background = png_ptr->background;
- }
#endif
#ifdef PNG_READ_GAMMA_SUPPORTED
- if (png_ptr->transformations & PNG_GAMMA)
- {
- info_ptr->gamma = png_ptr->gamma;
- }
+ /* The following used to be conditional on PNG_GAMMA (prior to 1.5.4),
+ * however it seems that the code in png_init_read_transformations, which has
+ * been called before this from png_read_update_info->png_read_start_row
+ * sometimes does the gamma transform and cancels the flag.
+ */
+ info_ptr->gamma = png_ptr->gamma;
#endif
-#ifdef PNG_READ_16_TO_8_SUPPORTED
-#ifdef PNG_READ_16BIT_SUPPORTED
- if ((png_ptr->transformations & PNG_16_TO_8) && (info_ptr->bit_depth == 16))
- info_ptr->bit_depth = 8;
-#else
- /* Force chopping 16-bit input down to 8 */
if (info_ptr->bit_depth == 16)
{
- png_ptr->transformations |=PNG_16_TO_8;
- info_ptr->bit_depth = 8;
+# ifdef PNG_READ_16BIT_SUPPORTED
+# ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
+ if (png_ptr->transformations & PNG_SCALE_16_TO_8)
+ info_ptr->bit_depth = 8;
+# endif
+
+# ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
+ if (png_ptr->transformations & PNG_16_TO_8)
+ info_ptr->bit_depth = 8;
+# endif
+
+# else
+ /* No 16 bit support: force chopping 16-bit input down to 8, in this case
+ * the app program can chose if both APIs are available by setting the
+ * correct scaling to use.
+ */
+# ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
+ /* For compatibility with previous versions use the strip method by
+ * default. This code works because if PNG_SCALE_16_TO_8 is already
+ * set the code below will do that in preference to the chop.
+ */
+ png_ptr->transformations |= PNG_16_TO_8;
+ info_ptr->bit_depth = 8;
+# else
+
+# ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
+ png_ptr->transformations |= PNG_SCALE_16_TO_8;
+ info_ptr->bit_depth = 8;
+# else
+
+ CONFIGURATION ERROR: you must enable at least one 16 to 8 method
+# endif
+# endif
+#endif /* !READ_16BIT_SUPPORTED */
}
-#endif
-#endif
#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
if (png_ptr->transformations & PNG_GRAY_TO_RGB)
- info_ptr->color_type |= PNG_COLOR_MASK_COLOR;
+ info_ptr->color_type = (png_byte)(info_ptr->color_type |
+ PNG_COLOR_MASK_COLOR);
#endif
#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
if (png_ptr->transformations & PNG_RGB_TO_GRAY)
- info_ptr->color_type &= ~PNG_COLOR_MASK_COLOR;
+ info_ptr->color_type = (png_byte)(info_ptr->color_type &
+ ~PNG_COLOR_MASK_COLOR);
#endif
#ifdef PNG_READ_QUANTIZE_SUPPORTED
@@ -1338,6 +1994,14 @@ png_read_transform_info(png_structp png_ptr, png_infop info_ptr)
}
#endif
+#ifdef PNG_READ_EXPAND_16_SUPPORTED
+ if (png_ptr->transformations & PNG_EXPAND_16 && info_ptr->bit_depth == 8 &&
+ info_ptr->color_type != PNG_COLOR_TYPE_PALETTE)
+ {
+ info_ptr->bit_depth = 16;
+ }
+#endif
+
#ifdef PNG_READ_PACK_SUPPORTED
if ((png_ptr->transformations & PNG_PACK) && (info_ptr->bit_depth < 8))
info_ptr->bit_depth = 8;
@@ -1353,8 +2017,12 @@ png_read_transform_info(png_structp png_ptr, png_infop info_ptr)
info_ptr->channels = 1;
#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
- if (png_ptr->flags & PNG_FLAG_STRIP_ALPHA)
- info_ptr->color_type &= ~PNG_COLOR_MASK_ALPHA;
+ if (png_ptr->transformations & PNG_STRIP_ALPHA)
+ {
+ info_ptr->color_type = (png_byte)(info_ptr->color_type &
+ ~PNG_COLOR_MASK_ALPHA);
+ info_ptr->num_trans = 0;
+ }
#endif
if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA)
@@ -1390,6 +2058,14 @@ defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, info_ptr->width);
+ /* Adding in 1.5.4: cache the above value in png_struct so that we can later
+ * check in png_rowbytes that the user buffer won't get overwritten. Note
+ * that the field is not always set - if png_read_update_info isn't called
+ * the application has to either not do any transforms or get the calculation
+ * right itself.
+ */
+ png_ptr->info_rowbytes = info_ptr->rowbytes;
+
#ifndef PNG_READ_EXPAND_SUPPORTED
if (png_ptr)
return;
@@ -1401,69 +2077,71 @@ defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
* decide how it fits in with the other transformations here.
*/
void /* PRIVATE */
-png_do_read_transformations(png_structp png_ptr)
+png_do_read_transformations(png_structp png_ptr, png_row_infop row_info)
{
png_debug(1, "in png_do_read_transformations");
if (png_ptr->row_buf == NULL)
{
-#ifdef PNG_CONSOLE_IO_SUPPORTED
- char msg[50];
-
- png_snprintf2(msg, 50,
- "NULL row buffer for row %ld, pass %d", (long)png_ptr->row_number,
- png_ptr->pass);
- png_error(png_ptr, msg);
-#else
+ /* Prior to 1.5.4 this output row/pass where the NULL pointer is, but this
+ * error is incredibly rare and incredibly easy to debug without this
+ * information.
+ */
png_error(png_ptr, "NULL row buffer");
-#endif
}
-#ifdef PNG_WARN_UNINITIALIZED_ROW
- if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
- /* Application has failed to call either png_read_start_image()
- * or png_read_update_info() after setting transforms that expand
- * pixels. This check added to libpng-1.2.19
+
+ /* The following is debugging; prior to 1.5.4 the code was never compiled in;
+ * in 1.5.4 PNG_FLAG_DETECT_UNINITIALIZED was added and the macro
+ * PNG_WARN_UNINITIALIZED_ROW removed. In 1.5 the new flag is set only for
+ * selected new APIs to ensure that there is no API change.
+ */
+ if ((png_ptr->flags & PNG_FLAG_DETECT_UNINITIALIZED) != 0 &&
+ !(png_ptr->flags & PNG_FLAG_ROW_INIT))
+ {
+ /* Application has failed to call either png_read_start_image() or
+ * png_read_update_info() after setting transforms that expand pixels.
+ * This check added to libpng-1.2.19 (but not enabled until 1.5.4).
*/
-#if (PNG_WARN_UNINITIALIZED_ROW==1)
png_error(png_ptr, "Uninitialized row");
-#else
- png_warning(png_ptr, "Uninitialized row");
-#endif
-#endif
+ }
#ifdef PNG_READ_EXPAND_SUPPORTED
if (png_ptr->transformations & PNG_EXPAND)
{
- if (png_ptr->row_info.color_type == PNG_COLOR_TYPE_PALETTE)
+ if (row_info->color_type == PNG_COLOR_TYPE_PALETTE)
{
- png_do_expand_palette(&(png_ptr->row_info), png_ptr->row_buf + 1,
+ png_do_expand_palette(row_info, png_ptr->row_buf + 1,
png_ptr->palette, png_ptr->trans_alpha, png_ptr->num_trans);
}
+
else
{
if (png_ptr->num_trans &&
(png_ptr->transformations & PNG_EXPAND_tRNS))
- png_do_expand(&(png_ptr->row_info), png_ptr->row_buf + 1,
+ png_do_expand(row_info, png_ptr->row_buf + 1,
&(png_ptr->trans_color));
- else
- png_do_expand(&(png_ptr->row_info), png_ptr->row_buf + 1,
+ else
+ png_do_expand(row_info, png_ptr->row_buf + 1,
NULL);
}
}
#endif
#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
- if (png_ptr->flags & PNG_FLAG_STRIP_ALPHA)
- png_do_strip_filler(&(png_ptr->row_info), png_ptr->row_buf + 1,
- PNG_FLAG_FILLER_AFTER | (png_ptr->flags & PNG_FLAG_STRIP_ALPHA));
+ if ((png_ptr->transformations & PNG_STRIP_ALPHA) &&
+ !(png_ptr->transformations & PNG_COMPOSE) &&
+ (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||
+ row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA))
+ png_do_strip_channel(row_info, png_ptr->row_buf + 1,
+ 0 /* at_start == false, because SWAP_ALPHA happens later */);
#endif
#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
if (png_ptr->transformations & PNG_RGB_TO_GRAY)
{
int rgb_error =
- png_do_rgb_to_gray(png_ptr, &(png_ptr->row_info),
+ png_do_rgb_to_gray(png_ptr, row_info,
png_ptr->row_buf + 1);
if (rgb_error)
@@ -1517,107 +2195,146 @@ png_do_read_transformations(png_structp png_ptr)
*/
if ((png_ptr->transformations & PNG_GRAY_TO_RGB) &&
!(png_ptr->mode & PNG_BACKGROUND_IS_GRAY))
- png_do_gray_to_rgb(&(png_ptr->row_info), png_ptr->row_buf + 1);
+ png_do_gray_to_rgb(row_info, png_ptr->row_buf + 1);
#endif
-#ifdef PNG_READ_BACKGROUND_SUPPORTED
- if ((png_ptr->transformations & PNG_BACKGROUND) &&
- ((png_ptr->num_trans != 0) ||
- (png_ptr->color_type & PNG_COLOR_MASK_ALPHA)))
- png_do_background(&(png_ptr->row_info), png_ptr->row_buf + 1,
- &(png_ptr->trans_color), &(png_ptr->background)
-#ifdef PNG_READ_GAMMA_SUPPORTED
- , &(png_ptr->background_1),
- png_ptr->gamma_table, png_ptr->gamma_from_1,
- png_ptr->gamma_to_1, png_ptr->gamma_16_table,
- png_ptr->gamma_16_from_1, png_ptr->gamma_16_to_1,
- png_ptr->gamma_shift
-#endif
- );
+#if (defined PNG_READ_BACKGROUND_SUPPORTED) ||\
+ (defined PNG_READ_ALPHA_MODE_SUPPORTED)
+ if (png_ptr->transformations & PNG_COMPOSE)
+ png_do_compose(row_info, png_ptr->row_buf + 1, png_ptr);
#endif
#ifdef PNG_READ_GAMMA_SUPPORTED
if ((png_ptr->transformations & PNG_GAMMA) &&
-#ifdef PNG_READ_BACKGROUND_SUPPORTED
- !((png_ptr->transformations & PNG_BACKGROUND) &&
+#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
+ /* Because RGB_TO_GRAY does the gamma transform. */
+ !(png_ptr->transformations & PNG_RGB_TO_GRAY) &&
+#endif
+#if (defined PNG_READ_BACKGROUND_SUPPORTED) ||\
+ (defined PNG_READ_ALPHA_MODE_SUPPORTED)
+ /* Because PNG_COMPOSE does the gamma transform if there is something to
+ * do (if there is an alpha channel or transparency.)
+ */
+ !((png_ptr->transformations & PNG_COMPOSE) &&
((png_ptr->num_trans != 0) ||
(png_ptr->color_type & PNG_COLOR_MASK_ALPHA))) &&
#endif
+ /* Because png_init_read_transformations transforms the palette, unless
+ * RGB_TO_GRAY will do the transform.
+ */
(png_ptr->color_type != PNG_COLOR_TYPE_PALETTE))
- png_do_gamma(&(png_ptr->row_info), png_ptr->row_buf + 1,
- png_ptr->gamma_table, png_ptr->gamma_16_table,
- png_ptr->gamma_shift);
+ png_do_gamma(row_info, png_ptr->row_buf + 1, png_ptr);
+#endif
+
+#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
+ if ((png_ptr->transformations & PNG_STRIP_ALPHA) &&
+ (png_ptr->transformations & PNG_COMPOSE) &&
+ (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||
+ row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA))
+ png_do_strip_channel(row_info, png_ptr->row_buf + 1,
+ 0 /* at_start == false, because SWAP_ALPHA happens later */);
+#endif
+
+#ifdef PNG_READ_ALPHA_MODE_SUPPORTED
+ if ((png_ptr->transformations & PNG_ENCODE_ALPHA) &&
+ (row_info->color_type & PNG_COLOR_MASK_ALPHA))
+ png_do_encode_alpha(row_info, png_ptr->row_buf + 1, png_ptr);
+#endif
+
+#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
+ if (png_ptr->transformations & PNG_SCALE_16_TO_8)
+ png_do_scale_16_to_8(row_info, png_ptr->row_buf + 1);
#endif
-#ifdef PNG_READ_16_TO_8_SUPPORTED
+#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
+ /* There is no harm in doing both of these because only one has any effect,
+ * by putting the 'scale' option first if the app asks for scale (either by
+ * calling the API or in a TRANSFORM flag) this is what happens.
+ */
if (png_ptr->transformations & PNG_16_TO_8)
- png_do_chop(&(png_ptr->row_info), png_ptr->row_buf + 1);
+ png_do_chop(row_info, png_ptr->row_buf + 1);
#endif
#ifdef PNG_READ_QUANTIZE_SUPPORTED
if (png_ptr->transformations & PNG_QUANTIZE)
{
- png_do_quantize(&(png_ptr->row_info), png_ptr->row_buf + 1,
+ png_do_quantize(row_info, png_ptr->row_buf + 1,
png_ptr->palette_lookup, png_ptr->quantize_index);
- if (png_ptr->row_info.rowbytes == 0)
+ if (row_info->rowbytes == 0)
png_error(png_ptr, "png_do_quantize returned rowbytes=0");
}
#endif /* PNG_READ_QUANTIZE_SUPPORTED */
+#ifdef PNG_READ_EXPAND_16_SUPPORTED
+ /* Do the expansion now, after all the arithmetic has been done. Notice
+ * that previous transformations can handle the PNG_EXPAND_16 flag if this
+ * is efficient (particularly true in the case of gamma correction, where
+ * better accuracy results faster!)
+ */
+ if (png_ptr->transformations & PNG_EXPAND_16)
+ png_do_expand_16(row_info, png_ptr->row_buf + 1);
+#endif
+
+#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
+ /*NOTE: moved here in 1.5.4 (from much later in this list.) */
+ if ((png_ptr->transformations & PNG_GRAY_TO_RGB) &&
+ (png_ptr->mode & PNG_BACKGROUND_IS_GRAY))
+ png_do_gray_to_rgb(row_info, png_ptr->row_buf + 1);
+#endif
+
#ifdef PNG_READ_INVERT_SUPPORTED
if (png_ptr->transformations & PNG_INVERT_MONO)
- png_do_invert(&(png_ptr->row_info), png_ptr->row_buf + 1);
+ png_do_invert(row_info, png_ptr->row_buf + 1);
#endif
#ifdef PNG_READ_SHIFT_SUPPORTED
if (png_ptr->transformations & PNG_SHIFT)
- png_do_unshift(&(png_ptr->row_info), png_ptr->row_buf + 1,
+ png_do_unshift(row_info, png_ptr->row_buf + 1,
&(png_ptr->shift));
#endif
#ifdef PNG_READ_PACK_SUPPORTED
if (png_ptr->transformations & PNG_PACK)
- png_do_unpack(&(png_ptr->row_info), png_ptr->row_buf + 1);
+ png_do_unpack(row_info, png_ptr->row_buf + 1);
+#endif
+
+#ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED
+ /* Added at libpng-1.5.10 */
+ if (row_info->color_type == PNG_COLOR_TYPE_PALETTE)
+ png_do_check_palette_indexes(png_ptr, row_info);
#endif
#ifdef PNG_READ_BGR_SUPPORTED
if (png_ptr->transformations & PNG_BGR)
- png_do_bgr(&(png_ptr->row_info), png_ptr->row_buf + 1);
+ png_do_bgr(row_info, png_ptr->row_buf + 1);
#endif
#ifdef PNG_READ_PACKSWAP_SUPPORTED
if (png_ptr->transformations & PNG_PACKSWAP)
- png_do_packswap(&(png_ptr->row_info), png_ptr->row_buf + 1);
-#endif
-
-#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
- /* If gray -> RGB, do so now only if we did not do so above */
- if ((png_ptr->transformations & PNG_GRAY_TO_RGB) &&
- (png_ptr->mode & PNG_BACKGROUND_IS_GRAY))
- png_do_gray_to_rgb(&(png_ptr->row_info), png_ptr->row_buf + 1);
+ png_do_packswap(row_info, png_ptr->row_buf + 1);
#endif
#ifdef PNG_READ_FILLER_SUPPORTED
if (png_ptr->transformations & PNG_FILLER)
- png_do_read_filler(&(png_ptr->row_info), png_ptr->row_buf + 1,
+ png_do_read_filler(row_info, png_ptr->row_buf + 1,
(png_uint_32)png_ptr->filler, png_ptr->flags);
#endif
#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED
if (png_ptr->transformations & PNG_INVERT_ALPHA)
- png_do_read_invert_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1);
+ png_do_read_invert_alpha(row_info, png_ptr->row_buf + 1);
#endif
#ifdef PNG_READ_SWAP_ALPHA_SUPPORTED
if (png_ptr->transformations & PNG_SWAP_ALPHA)
- png_do_read_swap_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1);
+ png_do_read_swap_alpha(row_info, png_ptr->row_buf + 1);
#endif
#ifdef PNG_READ_16BIT_SUPPORTED
#ifdef PNG_READ_SWAP_SUPPORTED
if (png_ptr->transformations & PNG_SWAP_BYTES)
- png_do_swap(&(png_ptr->row_info), png_ptr->row_buf + 1);
+ png_do_swap(row_info, png_ptr->row_buf + 1);
#endif
#endif
@@ -1626,8 +2343,8 @@ png_do_read_transformations(png_structp png_ptr)
{
if (png_ptr->read_user_transform_fn != NULL)
(*(png_ptr->read_user_transform_fn)) /* User read transform function */
- (png_ptr, /* png_ptr */
- &(png_ptr->row_info), /* row_info: */
+ (png_ptr, /* png_ptr */
+ row_info, /* row_info: */
/* png_uint_32 width; width of row */
/* png_size_t rowbytes; number of bytes in row */
/* png_byte color_type; color type of pixels */
@@ -1637,19 +2354,17 @@ png_do_read_transformations(png_structp png_ptr)
png_ptr->row_buf + 1); /* start of pixel data for row */
#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
if (png_ptr->user_transform_depth)
- png_ptr->row_info.bit_depth = png_ptr->user_transform_depth;
+ row_info->bit_depth = png_ptr->user_transform_depth;
if (png_ptr->user_transform_channels)
- png_ptr->row_info.channels = png_ptr->user_transform_channels;
+ row_info->channels = png_ptr->user_transform_channels;
#endif
- png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth *
- png_ptr->row_info.channels);
+ row_info->pixel_depth = (png_byte)(row_info->bit_depth *
+ row_info->channels);
- png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth,
- png_ptr->row_info.width);
+ row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_info->width);
}
#endif
-
}
#ifdef PNG_READ_PACK_SUPPORTED
@@ -1761,105 +2476,128 @@ void /* PRIVATE */
png_do_unshift(png_row_infop row_info, png_bytep row,
png_const_color_8p sig_bits)
{
+ int color_type;
+
png_debug(1, "in png_do_unshift");
- if (
- row_info->color_type != PNG_COLOR_TYPE_PALETTE)
+ /* The palette case has already been handled in the _init routine. */
+ color_type = row_info->color_type;
+
+ if (color_type != PNG_COLOR_TYPE_PALETTE)
{
int shift[4];
int channels = 0;
- int c;
- png_uint_16 value = 0;
- png_uint_32 row_width = row_info->width;
+ int bit_depth = row_info->bit_depth;
- if (row_info->color_type & PNG_COLOR_MASK_COLOR)
+ if (color_type & PNG_COLOR_MASK_COLOR)
{
- shift[channels++] = row_info->bit_depth - sig_bits->red;
- shift[channels++] = row_info->bit_depth - sig_bits->green;
- shift[channels++] = row_info->bit_depth - sig_bits->blue;
+ shift[channels++] = bit_depth - sig_bits->red;
+ shift[channels++] = bit_depth - sig_bits->green;
+ shift[channels++] = bit_depth - sig_bits->blue;
}
else
{
- shift[channels++] = row_info->bit_depth - sig_bits->gray;
+ shift[channels++] = bit_depth - sig_bits->gray;
}
- if (row_info->color_type & PNG_COLOR_MASK_ALPHA)
+ if (color_type & PNG_COLOR_MASK_ALPHA)
{
- shift[channels++] = row_info->bit_depth - sig_bits->alpha;
+ shift[channels++] = bit_depth - sig_bits->alpha;
}
- for (c = 0; c < channels; c++)
{
- if (shift[c] <= 0)
- shift[c] = 0;
+ int c, have_shift;
- else
- value = 1;
- }
+ for (c = have_shift = 0; c < channels; ++c)
+ {
+ /* A shift of more than the bit depth is an error condition but it
+ * gets ignored here.
+ */
+ if (shift[c] <= 0 || shift[c] >= bit_depth)
+ shift[c] = 0;
- if (!value)
- return;
+ else
+ have_shift = 1;
+ }
- switch (row_info->bit_depth)
+ if (!have_shift)
+ return;
+ }
+
+ switch (bit_depth)
{
default:
- break;
+ /* Must be 1bpp gray: should not be here! */
+ /* NOTREACHED */
+ break;
case 2:
+ /* Must be 2bpp gray */
+ /* assert(channels == 1 && shift[0] == 1) */
{
- png_bytep bp;
- png_size_t i;
- png_size_t istop = row_info->rowbytes;
+ png_bytep bp = row;
+ png_bytep bp_end = bp + row_info->rowbytes;
- for (bp = row, i = 0; i < istop; i++)
+ while (bp < bp_end)
{
- *bp >>= 1;
- *bp++ &= 0x55;
+ int b = (*bp >> 1) & 0x55;
+ *bp++ = (png_byte)b;
}
break;
}
case 4:
+ /* Must be 4bpp gray */
+ /* assert(channels == 1) */
{
png_bytep bp = row;
- png_size_t i;
- png_size_t istop = row_info->rowbytes;
- png_byte mask = (png_byte)((((int)0xf0 >> shift[0]) & (int)0xf0) |
- (png_byte)((int)0xf >> shift[0]));
+ png_bytep bp_end = bp + row_info->rowbytes;
+ int gray_shift = shift[0];
+ int mask = 0xf >> gray_shift;
+
+ mask |= mask << 4;
- for (i = 0; i < istop; i++)
+ while (bp < bp_end)
{
- *bp >>= shift[0];
- *bp++ &= mask;
+ int b = (*bp >> gray_shift) & mask;
+ *bp++ = (png_byte)b;
}
break;
}
case 8:
+ /* Single byte components, G, GA, RGB, RGBA */
{
png_bytep bp = row;
- png_uint_32 i;
- png_uint_32 istop = row_width * channels;
+ png_bytep bp_end = bp + row_info->rowbytes;
+ int channel = 0;
- for (i = 0; i < istop; i++)
+ while (bp < bp_end)
{
- *bp++ >>= shift[i%channels];
+ int b = *bp >> shift[channel];
+ if (++channel >= channels)
+ channel = 0;
+ *bp++ = (png_byte)b;
}
break;
}
#ifdef PNG_READ_16BIT_SUPPORTED
case 16:
+ /* Double byte components, G, GA, RGB, RGBA */
{
png_bytep bp = row;
- png_uint_32 i;
- png_uint_32 istop = channels * row_width;
+ png_bytep bp_end = bp + row_info->rowbytes;
+ int channel = 0;
- for (i = 0; i < istop; i++)
+ while (bp < bp_end)
{
- value = (png_uint_16)((*bp << 8) + *(bp + 1));
- value >>= shift[i%channels];
+ int value = (bp[0] << 8) + bp[1];
+
+ value >>= shift[channel];
+ if (++channel >= channels)
+ channel = 0;
*bp++ = (png_byte)(value >> 8);
*bp++ = (png_byte)(value & 0xff);
}
@@ -1871,54 +2609,86 @@ png_do_unshift(png_row_infop row_info, png_bytep row,
}
#endif
-#ifdef PNG_READ_16_TO_8_SUPPORTED
-/* Chop rows of bit depth 16 down to 8 */
+#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
+/* Scale rows of bit depth 16 down to 8 accurately */
void /* PRIVATE */
-png_do_chop(png_row_infop row_info, png_bytep row)
+png_do_scale_16_to_8(png_row_infop row_info, png_bytep row)
{
- png_debug(1, "in png_do_chop");
+ png_debug(1, "in png_do_scale_16_to_8");
if (row_info->bit_depth == 16)
{
- png_bytep sp = row;
- png_bytep dp = row;
- png_uint_32 i;
- png_uint_32 istop = row_info->width * row_info->channels;
+ png_bytep sp = row; /* source */
+ png_bytep dp = row; /* destination */
+ png_bytep ep = sp + row_info->rowbytes; /* end+1 */
- for (i = 0; i<istop; i++, sp += 2, dp++)
+ while (sp < ep)
{
-#ifdef PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED
- /* This does a more accurate scaling of the 16-bit color
- * value, rather than a simple low-byte truncation.
- *
- * What the ideal calculation should be:
- * *dp = (((((png_uint_32)(*sp) << 8) |
- * (png_uint_32)(*(sp + 1))) * 255 + 127)
- * / (png_uint_32)65535L;
- *
- * GRR: no, I think this is what it really should be:
- * *dp = (((((png_uint_32)(*sp) << 8) |
- * (png_uint_32)(*(sp + 1))) + 128L)
- * / (png_uint_32)257L;
- *
- * GRR: here's the exact calculation with shifts:
- * temp = (((png_uint_32)(*sp) << 8) |
- * (png_uint_32)(*(sp + 1))) + 128L;
- * *dp = (temp - (temp >> 8)) >> 8;
- *
- * Approximate calculation with shift/add instead of multiply/divide:
- * *dp = ((((png_uint_32)(*sp) << 8) |
- * (png_uint_32)((int)(*(sp + 1)) - *sp)) + 128) >> 8;
- *
- * What we actually do to avoid extra shifting and conversion:
- */
+ /* The input is an array of 16 bit components, these must be scaled to
+ * 8 bits each. For a 16 bit value V the required value (from the PNG
+ * specification) is:
+ *
+ * (V * 255) / 65535
+ *
+ * This reduces to round(V / 257), or floor((V + 128.5)/257)
+ *
+ * Represent V as the two byte value vhi.vlo. Make a guess that the
+ * result is the top byte of V, vhi, then the correction to this value
+ * is:
+ *
+ * error = floor(((V-vhi.vhi) + 128.5) / 257)
+ * = floor(((vlo-vhi) + 128.5) / 257)
+ *
+ * This can be approximated using integer arithmetic (and a signed
+ * shift):
+ *
+ * error = (vlo-vhi+128) >> 8;
+ *
+ * The approximate differs from the exact answer only when (vlo-vhi) is
+ * 128; it then gives a correction of +1 when the exact correction is
+ * 0. This gives 128 errors. The exact answer (correct for all 16 bit
+ * input values) is:
+ *
+ * error = (vlo-vhi+128)*65535 >> 24;
+ *
+ * An alternative arithmetic calculation which also gives no errors is:
+ *
+ * (V * 255 + 32895) >> 16
+ */
- *dp = *sp + ((((int)(*(sp + 1)) - *sp) > 128) ? 1 : 0);
-#else
- /* Simply discard the low order byte */
- *dp = *sp;
+ png_int_32 tmp = *sp++; /* must be signed! */
+ tmp += (((int)*sp++ - tmp + 128) * 65535) >> 24;
+ *dp++ = (png_byte)tmp;
+ }
+
+ row_info->bit_depth = 8;
+ row_info->pixel_depth = (png_byte)(8 * row_info->channels);
+ row_info->rowbytes = row_info->width * row_info->channels;
+ }
+}
#endif
+
+#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
+void /* PRIVATE */
+/* Simply discard the low byte. This was the default behavior prior
+ * to libpng-1.5.4.
+ */
+png_do_chop(png_row_infop row_info, png_bytep row)
+{
+ png_debug(1, "in png_do_chop");
+
+ if (row_info->bit_depth == 16)
+ {
+ png_bytep sp = row; /* source */
+ png_bytep dp = row; /* destination */
+ png_bytep ep = sp + row_info->rowbytes; /* end+1 */
+
+ while (sp < ep)
+ {
+ *dp++ = *sp;
+ sp += 2; /* skip low byte */
}
+
row_info->bit_depth = 8;
row_info->pixel_depth = (png_byte)(8 * row_info->channels);
row_info->rowbytes = row_info->width * row_info->channels;
@@ -2390,7 +3160,7 @@ png_do_gray_to_rgb(png_row_infop row_info, png_bytep row)
}
}
}
- row_info->channels += (png_byte)2;
+ row_info->channels = (png_byte)(row_info->channels + 2);
row_info->color_type |= PNG_COLOR_MASK_COLOR;
row_info->pixel_depth = (png_byte)(row_info->channels *
row_info->bit_depth);
@@ -2401,33 +3171,61 @@ png_do_gray_to_rgb(png_row_infop row_info, png_bytep row)
#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
/* Reduce RGB files to grayscale, with or without alpha
- * using the equation given in Poynton's ColorFAQ at
- * <http://www.inforamp.net/~poynton/> (THIS LINK IS DEAD June 2008)
- * New link:
- * <http://www.poynton.com/notes/colour_and_gamma/>
+ * using the equation given in Poynton's ColorFAQ of 1998-01-04 at
+ * <http://www.inforamp.net/~poynton/> (THIS LINK IS DEAD June 2008 but
+ * versions dated 1998 through November 2002 have been archived at
+ * http://web.archive.org/web/20000816232553/http://www.inforamp.net/
+ * ~poynton/notes/colour_and_gamma/ColorFAQ.txt )
* Charles Poynton poynton at poynton.com
*
* Y = 0.212671 * R + 0.715160 * G + 0.072169 * B
*
- * We approximate this with
+ * which can be expressed with integers as
+ *
+ * Y = (6969 * R + 23434 * G + 2365 * B)/32768
*
- * Y = 0.21268 * R + 0.7151 * G + 0.07217 * B
+ * Poynton's current link (as of January 2003 through July 2011):
+ * <http://www.poynton.com/notes/colour_and_gamma/>
+ * has changed the numbers slightly:
+ *
+ * Y = 0.2126*R + 0.7152*G + 0.0722*B
*
* which can be expressed with integers as
*
- * Y = (6969 * R + 23434 * G + 2365 * B)/32768
+ * Y = (6966 * R + 23436 * G + 2366 * B)/32768
+ *
+ * Historically, however, libpng uses numbers derived from the ITU-R Rec 709
+ * end point chromaticities and the D65 white point. Depending on the
+ * precision used for the D65 white point this produces a variety of different
+ * numbers, however if the four decimal place value used in ITU-R Rec 709 is
+ * used (0.3127,0.3290) the Y calculation would be:
+ *
+ * Y = (6968 * R + 23435 * G + 2366 * B)/32768
+ *
+ * While this is correct the rounding results in an overflow for white, because
+ * the sum of the rounded coefficients is 32769, not 32768. Consequently
+ * libpng uses, instead, the closest non-overflowing approximation:
+ *
+ * Y = (6968 * R + 23434 * G + 2366 * B)/32768
*
- * The calculation is to be done in a linear colorspace.
+ * Starting with libpng-1.5.5, if the image being converted has a cHRM chunk
+ * (including an sRGB chunk) then the chromaticities are used to calculate the
+ * coefficients. See the chunk handling in pngrutil.c for more information.
*
- * Other integer coefficents can be used via png_set_rgb_to_gray().
+ * In all cases the calculation is to be done in a linear colorspace. If no
+ * gamma information is available to correct the encoding of the original RGB
+ * values this results in an implicit assumption that the original PNG RGB
+ * values were linear.
+ *
+ * Other integer coefficents can be used via png_set_rgb_to_gray(). Because
+ * the API takes just red and green coefficients the blue coefficient is
+ * calculated to make the sum 32768. This will result in different rounding
+ * to that used above.
*/
int /* PRIVATE */
png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)
{
- png_uint_32 i;
-
- png_uint_32 row_width = row_info->width;
int rgb_error = 0;
png_debug(1, "in png_do_rgb_to_gray");
@@ -2435,235 +3233,180 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)
if (!(row_info->color_type & PNG_COLOR_MASK_PALETTE) &&
(row_info->color_type & PNG_COLOR_MASK_COLOR))
{
- png_uint_32 rc = png_ptr->rgb_to_gray_red_coeff;
- png_uint_32 gc = png_ptr->rgb_to_gray_green_coeff;
- png_uint_32 bc = png_ptr->rgb_to_gray_blue_coeff;
+ PNG_CONST png_uint_32 rc = png_ptr->rgb_to_gray_red_coeff;
+ PNG_CONST png_uint_32 gc = png_ptr->rgb_to_gray_green_coeff;
+ PNG_CONST png_uint_32 bc = 32768 - rc - gc;
+ PNG_CONST png_uint_32 row_width = row_info->width;
+ PNG_CONST int have_alpha =
+ (row_info->color_type & PNG_COLOR_MASK_ALPHA) != 0;
- if (row_info->color_type == PNG_COLOR_TYPE_RGB)
+ if (row_info->bit_depth == 8)
{
- if (row_info->bit_depth == 8)
- {
#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
- if (png_ptr->gamma_from_1 != NULL && png_ptr->gamma_to_1 != NULL)
+ /* Notice that gamma to/from 1 are not necessarily inverses (if
+ * there is an overall gamma correction). Prior to 1.5.5 this code
+ * checked the linearized values for equality; this doesn't match
+ * the documentation, the original values must be checked.
+ */
+ if (png_ptr->gamma_from_1 != NULL && png_ptr->gamma_to_1 != NULL)
+ {
+ png_bytep sp = row;
+ png_bytep dp = row;
+ png_uint_32 i;
+
+ for (i = 0; i < row_width; i++)
{
- png_bytep sp = row;
- png_bytep dp = row;
+ png_byte red = *(sp++);
+ png_byte green = *(sp++);
+ png_byte blue = *(sp++);
- for (i = 0; i < row_width; i++)
+ if (red != green || red != blue)
{
- png_byte red = png_ptr->gamma_to_1[*(sp++)];
- png_byte green = png_ptr->gamma_to_1[*(sp++)];
- png_byte blue = png_ptr->gamma_to_1[*(sp++)];
-
- if (red != green || red != blue)
- {
- rgb_error |= 1;
- *(dp++) = png_ptr->gamma_from_1[
- (rc*red + gc*green + bc*blue)>>15];
- }
+ red = png_ptr->gamma_to_1[red];
+ green = png_ptr->gamma_to_1[green];
+ blue = png_ptr->gamma_to_1[blue];
- else
- *(dp++) = *(sp - 1);
+ rgb_error |= 1;
+ *(dp++) = png_ptr->gamma_from_1[
+ (rc*red + gc*green + bc*blue + 16384)>>15];
}
- }
- else
-#endif
- {
- png_bytep sp = row;
- png_bytep dp = row;
- for (i = 0; i < row_width; i++)
- {
- png_byte red = *(sp++);
- png_byte green = *(sp++);
- png_byte blue = *(sp++);
- if (red != green || red != blue)
- {
- rgb_error |= 1;
- *(dp++) = (png_byte)((rc*red + gc*green + bc*blue)>>15);
- }
+ else
+ {
+ /* If there is no overall correction the table will not be
+ * set.
+ */
+ if (png_ptr->gamma_table != NULL)
+ red = png_ptr->gamma_table[red];
- else
- *(dp++) = *(sp - 1);
+ *(dp++) = red;
}
+
+ if (have_alpha)
+ *(dp++) = *(sp++);
}
}
-
- else /* RGB bit_depth == 16 */
+ else
+#endif
{
-#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
- if (png_ptr->gamma_16_to_1 != NULL &&
- png_ptr->gamma_16_from_1 != NULL)
- {
- png_bytep sp = row;
- png_bytep dp = row;
- for (i = 0; i < row_width; i++)
- {
- png_uint_16 red, green, blue, w;
-
- red = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2;
- green = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2;
- blue = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2;
-
- if (red == green && red == blue)
- w = red;
-
- else
- {
- png_uint_16 red_1 = png_ptr->gamma_16_to_1[(red&0xff)
- >> png_ptr->gamma_shift][red>>8];
- png_uint_16 green_1 =
- png_ptr->gamma_16_to_1[(green&0xff) >>
- png_ptr->gamma_shift][green>>8];
- png_uint_16 blue_1 = png_ptr->gamma_16_to_1[(blue&0xff)
- >> png_ptr->gamma_shift][blue>>8];
- png_uint_16 gray16 = (png_uint_16)((rc*red_1 + gc*green_1
- + bc*blue_1)>>15);
- w = png_ptr->gamma_16_from_1[(gray16&0xff) >>
- png_ptr->gamma_shift][gray16 >> 8];
- rgb_error |= 1;
- }
+ png_bytep sp = row;
+ png_bytep dp = row;
+ png_uint_32 i;
- *(dp++) = (png_byte)((w>>8) & 0xff);
- *(dp++) = (png_byte)(w & 0xff);
- }
- }
- else
-#endif
+ for (i = 0; i < row_width; i++)
{
- png_bytep sp = row;
- png_bytep dp = row;
- for (i = 0; i < row_width; i++)
- {
- png_uint_16 red, green, blue, gray16;
+ png_byte red = *(sp++);
+ png_byte green = *(sp++);
+ png_byte blue = *(sp++);
- red = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2;
- green = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2;
- blue = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2;
+ if (red != green || red != blue)
+ {
+ rgb_error |= 1;
+ /*NOTE: this is the historical approach which simply
+ * truncates the results.
+ */
+ *(dp++) = (png_byte)((rc*red + gc*green + bc*blue)>>15);
+ }
- if (red != green || red != blue)
- rgb_error |= 1;
+ else
+ *(dp++) = red;
- gray16 = (png_uint_16)((rc*red + gc*green + bc*blue)>>15);
- *(dp++) = (png_byte)((gray16>>8) & 0xff);
- *(dp++) = (png_byte)(gray16 & 0xff);
- }
+ if (have_alpha)
+ *(dp++) = *(sp++);
}
}
}
- if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
+
+ else /* RGB bit_depth == 16 */
{
- if (row_info->bit_depth == 8)
- {
#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
- if (png_ptr->gamma_from_1 != NULL && png_ptr->gamma_to_1 != NULL)
+ if (png_ptr->gamma_16_to_1 != NULL && png_ptr->gamma_16_from_1 != NULL)
+ {
+ png_bytep sp = row;
+ png_bytep dp = row;
+ png_uint_32 i;
+
+ for (i = 0; i < row_width; i++)
{
- png_bytep sp = row;
- png_bytep dp = row;
- for (i = 0; i < row_width; i++)
- {
- png_byte red = png_ptr->gamma_to_1[*(sp++)];
- png_byte green = png_ptr->gamma_to_1[*(sp++)];
- png_byte blue = png_ptr->gamma_to_1[*(sp++)];
+ png_uint_16 red, green, blue, w;
- if (red != green || red != blue)
- rgb_error |= 1;
+ red = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2;
+ green = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2;
+ blue = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2;
- *(dp++) = png_ptr->gamma_from_1
- [(rc*red + gc*green + bc*blue)>>15];
+ if (red == green && red == blue)
+ {
+ if (png_ptr->gamma_16_table != NULL)
+ w = png_ptr->gamma_16_table[(red&0xff)
+ >> png_ptr->gamma_shift][red>>8];
- *(dp++) = *(sp++); /* alpha */
+ else
+ w = red;
}
- }
- else
-#endif
- {
- png_bytep sp = row;
- png_bytep dp = row;
- for (i = 0; i < row_width; i++)
+
+ else
+ {
+ png_uint_16 red_1 = png_ptr->gamma_16_to_1[(red&0xff)
+ >> png_ptr->gamma_shift][red>>8];
+ png_uint_16 green_1 =
+ png_ptr->gamma_16_to_1[(green&0xff) >>
+ png_ptr->gamma_shift][green>>8];
+ png_uint_16 blue_1 = png_ptr->gamma_16_to_1[(blue&0xff)
+ >> png_ptr->gamma_shift][blue>>8];
+ png_uint_16 gray16 = (png_uint_16)((rc*red_1 + gc*green_1
+ + bc*blue_1 + 16384)>>15);
+ w = png_ptr->gamma_16_from_1[(gray16&0xff) >>
+ png_ptr->gamma_shift][gray16 >> 8];
+ rgb_error |= 1;
+ }
+
+ *(dp++) = (png_byte)((w>>8) & 0xff);
+ *(dp++) = (png_byte)(w & 0xff);
+
+ if (have_alpha)
{
- png_byte red = *(sp++);
- png_byte green = *(sp++);
- png_byte blue = *(sp++);
- if (red != green || red != blue)
- rgb_error |= 1;
-
- *(dp++) = (png_byte)((rc*red + gc*green + bc*blue)>>15);
- *(dp++) = *(sp++); /* alpha */
+ *(dp++) = *(sp++);
+ *(dp++) = *(sp++);
}
}
}
- else /* RGBA bit_depth == 16 */
+ else
+#endif
{
-#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
- if (png_ptr->gamma_16_to_1 != NULL &&
- png_ptr->gamma_16_from_1 != NULL)
- {
- png_bytep sp = row;
- png_bytep dp = row;
- for (i = 0; i < row_width; i++)
- {
- png_uint_16 red, green, blue, w;
-
- red = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2;
- green = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2;
- blue = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2;
-
- if (red == green && red == blue)
- w = red;
-
- else
- {
- png_uint_16 red_1 = png_ptr->gamma_16_to_1[(red&0xff) >>
- png_ptr->gamma_shift][red>>8];
-
- png_uint_16 green_1 =
- png_ptr->gamma_16_to_1[(green&0xff) >>
- png_ptr->gamma_shift][green>>8];
+ png_bytep sp = row;
+ png_bytep dp = row;
+ png_uint_32 i;
- png_uint_16 blue_1 = png_ptr->gamma_16_to_1[(blue&0xff) >>
- png_ptr->gamma_shift][blue>>8];
+ for (i = 0; i < row_width; i++)
+ {
+ png_uint_16 red, green, blue, gray16;
- png_uint_16 gray16 = (png_uint_16)((rc * red_1
- + gc * green_1 + bc * blue_1)>>15);
+ red = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2;
+ green = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2;
+ blue = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2;
- w = png_ptr->gamma_16_from_1[(gray16&0xff) >>
- png_ptr->gamma_shift][gray16 >> 8];
+ if (red != green || red != blue)
+ rgb_error |= 1;
- rgb_error |= 1;
- }
+ /* From 1.5.5 in the 16 bit case do the accurate conversion even
+ * in the 'fast' case - this is because this is where the code
+ * ends up when handling linear 16 bit data.
+ */
+ gray16 = (png_uint_16)((rc*red + gc*green + bc*blue + 16384) >>
+ 15);
+ *(dp++) = (png_byte)((gray16>>8) & 0xff);
+ *(dp++) = (png_byte)(gray16 & 0xff);
- *(dp++) = (png_byte)((w>>8) & 0xff);
- *(dp++) = (png_byte)(w & 0xff);
- *(dp++) = *(sp++); /* alpha */
- *(dp++) = *(sp++);
- }
- }
- else
-#endif
- {
- png_bytep sp = row;
- png_bytep dp = row;
- for (i = 0; i < row_width; i++)
+ if (have_alpha)
{
- png_uint_16 red, green, blue, gray16;
- red = (png_uint_16)((*(sp)<<8) | *(sp + 1)); sp += 2;
- green = (png_uint_16)((*(sp)<<8) | *(sp + 1)); sp += 2;
- blue = (png_uint_16)((*(sp)<<8) | *(sp + 1)); sp += 2;
-
- if (red != green || red != blue)
- rgb_error |= 1;
-
- gray16 = (png_uint_16)((rc*red + gc*green + bc*blue)>>15);
- *(dp++) = (png_byte)((gray16>>8) & 0xff);
- *(dp++) = (png_byte)(gray16 & 0xff);
- *(dp++) = *(sp++); /* alpha */
+ *(dp++) = *(sp++);
*(dp++) = *(sp++);
}
}
}
}
- row_info->channels -= 2;
+
+ row_info->channels = (png_byte)(row_info->channels - 2);
row_info->color_type = (png_byte)(row_info->color_type &
~PNG_COLOR_MASK_COLOR);
row_info->pixel_depth = (png_byte)(row_info->channels *
@@ -2673,11 +3416,13 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)
return rgb_error;
}
#endif
+#endif /* PNG_READ_TRANSFORMS_SUPPORTED */
+#ifdef PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED
/* Build a grayscale palette. Palette is assumed to be 1 << bit_depth
* large of png_color. This lets grayscale images be treated as
* paletted. Most useful for gamma correction and simplification
- * of code.
+ * of code. This API is not used internally.
*/
void PNGAPI
png_build_grayscale_palette(int bit_depth, png_colorp palette)
@@ -2727,34 +3472,37 @@ png_build_grayscale_palette(int bit_depth, png_colorp palette)
palette[i].blue = (png_byte)v;
}
}
+#endif
-#ifdef PNG_READ_BACKGROUND_SUPPORTED
+#ifdef PNG_READ_TRANSFORMS_SUPPORTED
+#if (defined PNG_READ_BACKGROUND_SUPPORTED) ||\
+ (defined PNG_READ_ALPHA_MODE_SUPPORTED)
/* Replace any alpha or transparency with the supplied background color.
* "background" is already in the screen gamma, while "background_1" is
* at a gamma of 1.0. Paletted files have already been taken care of.
*/
void /* PRIVATE */
-png_do_background(png_row_infop row_info, png_bytep row,
- png_const_color_16p trans_color, png_const_color_16p background
+png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr)
+{
#ifdef PNG_READ_GAMMA_SUPPORTED
- , png_const_color_16p background_1, png_const_bytep gamma_table,
- png_const_bytep gamma_from_1, png_const_bytep gamma_to_1,
- png_const_uint_16pp gamma_16, png_const_uint_16pp gamma_16_from_1,
- png_const_uint_16pp gamma_16_to_1, int gamma_shift
+ png_const_bytep gamma_table = png_ptr->gamma_table;
+ png_const_bytep gamma_from_1 = png_ptr->gamma_from_1;
+ png_const_bytep gamma_to_1 = png_ptr->gamma_to_1;
+ png_const_uint_16pp gamma_16 = png_ptr->gamma_16_table;
+ png_const_uint_16pp gamma_16_from_1 = png_ptr->gamma_16_from_1;
+ png_const_uint_16pp gamma_16_to_1 = png_ptr->gamma_16_to_1;
+ int gamma_shift = png_ptr->gamma_shift;
#endif
- )
-{
- png_bytep sp, dp;
+
+ png_bytep sp;
png_uint_32 i;
png_uint_32 row_width = row_info->width;
+ int optimize = (png_ptr->flags & PNG_FLAG_OPTIMIZE_ALPHA) != 0;
int shift;
- png_debug(1, "in png_do_background");
+ png_debug(1, "in png_do_compose");
- if (background != NULL &&
- (!(row_info->color_type & PNG_COLOR_MASK_ALPHA) ||
- (row_info->color_type != PNG_COLOR_TYPE_PALETTE && trans_color)))
{
switch (row_info->color_type)
{
@@ -2769,10 +3517,10 @@ png_do_background(png_row_infop row_info, png_bytep row,
for (i = 0; i < row_width; i++)
{
if ((png_uint_16)((*sp >> shift) & 0x01)
- == trans_color->gray)
+ == png_ptr->trans_color.gray)
{
*sp &= (png_byte)((0x7f7f >> (7 - shift)) & 0xff);
- *sp |= (png_byte)(background->gray << shift);
+ *sp |= (png_byte)(png_ptr->background.gray << shift);
}
if (!shift)
@@ -2797,10 +3545,10 @@ png_do_background(png_row_infop row_info, png_bytep row,
for (i = 0; i < row_width; i++)
{
if ((png_uint_16)((*sp >> shift) & 0x03)
- == trans_color->gray)
+ == png_ptr->trans_color.gray)
{
*sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff);
- *sp |= (png_byte)(background->gray << shift);
+ *sp |= (png_byte)(png_ptr->background.gray << shift);
}
else
@@ -2831,10 +3579,10 @@ png_do_background(png_row_infop row_info, png_bytep row,
for (i = 0; i < row_width; i++)
{
if ((png_uint_16)((*sp >> shift) & 0x03)
- == trans_color->gray)
+ == png_ptr->trans_color.gray)
{
*sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff);
- *sp |= (png_byte)(background->gray << shift);
+ *sp |= (png_byte)(png_ptr->background.gray << shift);
}
if (!shift)
@@ -2860,10 +3608,10 @@ png_do_background(png_row_infop row_info, png_bytep row,
for (i = 0; i < row_width; i++)
{
if ((png_uint_16)((*sp >> shift) & 0x0f)
- == trans_color->gray)
+ == png_ptr->trans_color.gray)
{
*sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff);
- *sp |= (png_byte)(background->gray << shift);
+ *sp |= (png_byte)(png_ptr->background.gray << shift);
}
else
@@ -2894,10 +3642,10 @@ png_do_background(png_row_infop row_info, png_bytep row,
for (i = 0; i < row_width; i++)
{
if ((png_uint_16)((*sp >> shift) & 0x0f)
- == trans_color->gray)
+ == png_ptr->trans_color.gray)
{
*sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff);
- *sp |= (png_byte)(background->gray << shift);
+ *sp |= (png_byte)(png_ptr->background.gray << shift);
}
if (!shift)
@@ -2921,8 +3669,8 @@ png_do_background(png_row_infop row_info, png_bytep row,
sp = row;
for (i = 0; i < row_width; i++, sp++)
{
- if (*sp == trans_color->gray)
- *sp = (png_byte)background->gray;
+ if (*sp == png_ptr->trans_color.gray)
+ *sp = (png_byte)png_ptr->background.gray;
else
*sp = gamma_table[*sp];
@@ -2934,8 +3682,8 @@ png_do_background(png_row_infop row_info, png_bytep row,
sp = row;
for (i = 0; i < row_width; i++, sp++)
{
- if (*sp == trans_color->gray)
- *sp = (png_byte)background->gray;
+ if (*sp == png_ptr->trans_color.gray)
+ *sp = (png_byte)png_ptr->background.gray;
}
}
break;
@@ -2953,11 +3701,11 @@ png_do_background(png_row_infop row_info, png_bytep row,
v = (png_uint_16)(((*sp) << 8) + *(sp + 1));
- if (v == trans_color->gray)
+ if (v == png_ptr->trans_color.gray)
{
/* Background is already in screen gamma */
- *sp = (png_byte)((background->gray >> 8) & 0xff);
- *(sp + 1) = (png_byte)(background->gray & 0xff);
+ *sp = (png_byte)((png_ptr->background.gray >> 8) & 0xff);
+ *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff);
}
else
@@ -2978,10 +3726,10 @@ png_do_background(png_row_infop row_info, png_bytep row,
v = (png_uint_16)(((*sp) << 8) + *(sp + 1));
- if (v == trans_color->gray)
+ if (v == png_ptr->trans_color.gray)
{
- *sp = (png_byte)((background->gray >> 8) & 0xff);
- *(sp + 1) = (png_byte)(background->gray & 0xff);
+ *sp = (png_byte)((png_ptr->background.gray >> 8) & 0xff);
+ *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff);
}
}
}
@@ -3004,13 +3752,13 @@ png_do_background(png_row_infop row_info, png_bytep row,
sp = row;
for (i = 0; i < row_width; i++, sp += 3)
{
- if (*sp == trans_color->red &&
- *(sp + 1) == trans_color->green &&
- *(sp + 2) == trans_color->blue)
+ if (*sp == png_ptr->trans_color.red &&
+ *(sp + 1) == png_ptr->trans_color.green &&
+ *(sp + 2) == png_ptr->trans_color.blue)
{
- *sp = (png_byte)background->red;
- *(sp + 1) = (png_byte)background->green;
- *(sp + 2) = (png_byte)background->blue;
+ *sp = (png_byte)png_ptr->background.red;
+ *(sp + 1) = (png_byte)png_ptr->background.green;
+ *(sp + 2) = (png_byte)png_ptr->background.blue;
}
else
@@ -3027,13 +3775,13 @@ png_do_background(png_row_infop row_info, png_bytep row,
sp = row;
for (i = 0; i < row_width; i++, sp += 3)
{
- if (*sp == trans_color->red &&
- *(sp + 1) == trans_color->green &&
- *(sp + 2) == trans_color->blue)
+ if (*sp == png_ptr->trans_color.red &&
+ *(sp + 1) == png_ptr->trans_color.green &&
+ *(sp + 2) == png_ptr->trans_color.blue)
{
- *sp = (png_byte)background->red;
- *(sp + 1) = (png_byte)background->green;
- *(sp + 2) = (png_byte)background->blue;
+ *sp = (png_byte)png_ptr->background.red;
+ *(sp + 1) = (png_byte)png_ptr->background.green;
+ *(sp + 2) = (png_byte)png_ptr->background.blue;
}
}
}
@@ -3054,16 +3802,17 @@ png_do_background(png_row_infop row_info, png_bytep row,
png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8)
+ *(sp + 5));
- if (r == trans_color->red && g == trans_color->green &&
- b == trans_color->blue)
+ if (r == png_ptr->trans_color.red &&
+ g == png_ptr->trans_color.green &&
+ b == png_ptr->trans_color.blue)
{
/* Background is already in screen gamma */
- *sp = (png_byte)((background->red >> 8) & 0xff);
- *(sp + 1) = (png_byte)(background->red & 0xff);
- *(sp + 2) = (png_byte)((background->green >> 8) & 0xff);
- *(sp + 3) = (png_byte)(background->green & 0xff);
- *(sp + 4) = (png_byte)((background->blue >> 8) & 0xff);
- *(sp + 5) = (png_byte)(background->blue & 0xff);
+ *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
+ *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
+ *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) & 0xff);
+ *(sp + 3) = (png_byte)(png_ptr->background.green & 0xff);
+ *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) & 0xff);
+ *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
}
else
@@ -3097,15 +3846,16 @@ png_do_background(png_row_infop row_info, png_bytep row,
png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8)
+ *(sp + 5));
- if (r == trans_color->red && g == trans_color->green &&
- b == trans_color->blue)
+ if (r == png_ptr->trans_color.red &&
+ g == png_ptr->trans_color.green &&
+ b == png_ptr->trans_color.blue)
{
- *sp = (png_byte)((background->red >> 8) & 0xff);
- *(sp + 1) = (png_byte)(background->red & 0xff);
- *(sp + 2) = (png_byte)((background->green >> 8) & 0xff);
- *(sp + 3) = (png_byte)(background->green & 0xff);
- *(sp + 4) = (png_byte)((background->blue >> 8) & 0xff);
- *(sp + 5) = (png_byte)(background->blue & 0xff);
+ *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
+ *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
+ *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) & 0xff);
+ *(sp + 3) = (png_byte)(png_ptr->background.green & 0xff);
+ *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) & 0xff);
+ *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
}
}
}
@@ -3122,18 +3872,17 @@ png_do_background(png_row_infop row_info, png_bytep row,
gamma_table != NULL)
{
sp = row;
- dp = row;
- for (i = 0; i < row_width; i++, sp += 2, dp++)
+ for (i = 0; i < row_width; i++, sp += 2)
{
png_uint_16 a = *(sp + 1);
if (a == 0xff)
- *dp = gamma_table[*sp];
+ *sp = gamma_table[*sp];
else if (a == 0)
{
/* Background is already in screen gamma */
- *dp = (png_byte)background->gray;
+ *sp = (png_byte)png_ptr->background.gray;
}
else
@@ -3141,8 +3890,10 @@ png_do_background(png_row_infop row_info, png_bytep row,
png_byte v, w;
v = gamma_to_1[*sp];
- png_composite(w, v, a, background_1->gray);
- *dp = gamma_from_1[w];
+ png_composite(w, v, a, png_ptr->background_1.gray);
+ if (!optimize)
+ w = gamma_from_1[w];
+ *sp = w;
}
}
}
@@ -3150,24 +3901,15 @@ png_do_background(png_row_infop row_info, png_bytep row,
#endif
{
sp = row;
- dp = row;
- for (i = 0; i < row_width; i++, sp += 2, dp++)
+ for (i = 0; i < row_width; i++, sp += 2)
{
png_byte a = *(sp + 1);
- if (a == 0xff)
- *dp = *sp;
-
-#ifdef PNG_READ_GAMMA_SUPPORTED
- else if (a == 0)
- *dp = (png_byte)background->gray;
-
- else
- png_composite(*dp, *sp, a, background_1->gray);
+ if (a == 0)
+ *sp = (png_byte)png_ptr->background.gray;
-#else
- *dp = (png_byte)background->gray;
-#endif
+ else if (a < 0xff)
+ png_composite(*sp, *sp, a, png_ptr->background_1.gray);
}
}
}
@@ -3178,8 +3920,7 @@ png_do_background(png_row_infop row_info, png_bytep row,
gamma_16_to_1 != NULL)
{
sp = row;
- dp = row;
- for (i = 0; i < row_width; i++, sp += 4, dp += 2)
+ for (i = 0; i < row_width; i++, sp += 4)
{
png_uint_16 a = (png_uint_16)(((*(sp + 2)) << 8)
+ *(sp + 3));
@@ -3189,69 +3930,56 @@ png_do_background(png_row_infop row_info, png_bytep row,
png_uint_16 v;
v = gamma_16[*(sp + 1) >> gamma_shift][*sp];
- *dp = (png_byte)((v >> 8) & 0xff);
- *(dp + 1) = (png_byte)(v & 0xff);
+ *sp = (png_byte)((v >> 8) & 0xff);
+ *(sp + 1) = (png_byte)(v & 0xff);
}
-#ifdef PNG_READ_GAMMA_SUPPORTED
else if (a == 0)
-#else
- else
-#endif
{
/* Background is already in screen gamma */
- *dp = (png_byte)((background->gray >> 8) & 0xff);
- *(dp + 1) = (png_byte)(background->gray & 0xff);
+ *sp = (png_byte)((png_ptr->background.gray >> 8) & 0xff);
+ *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff);
}
-#ifdef PNG_READ_GAMMA_SUPPORTED
else
{
png_uint_16 g, v, w;
g = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp];
- png_composite_16(v, g, a, background_1->gray);
- w = gamma_16_from_1[(v&0xff) >> gamma_shift][v >> 8];
- *dp = (png_byte)((w >> 8) & 0xff);
- *(dp + 1) = (png_byte)(w & 0xff);
+ png_composite_16(v, g, a, png_ptr->background_1.gray);
+ if (optimize)
+ w = v;
+ else
+ w = gamma_16_from_1[(v&0xff) >> gamma_shift][v >> 8];
+ *sp = (png_byte)((w >> 8) & 0xff);
+ *(sp + 1) = (png_byte)(w & 0xff);
}
-#endif
}
}
else
#endif
{
sp = row;
- dp = row;
- for (i = 0; i < row_width; i++, sp += 4, dp += 2)
+ for (i = 0; i < row_width; i++, sp += 4)
{
png_uint_16 a = (png_uint_16)(((*(sp + 2)) << 8)
+ *(sp + 3));
- if (a == (png_uint_16)0xffff)
- png_memcpy(dp, sp, 2);
-
-#ifdef PNG_READ_GAMMA_SUPPORTED
- else if (a == 0)
-#else
- else
-#endif
+ if (a == 0)
{
- *dp = (png_byte)((background->gray >> 8) & 0xff);
- *(dp + 1) = (png_byte)(background->gray & 0xff);
+ *sp = (png_byte)((png_ptr->background.gray >> 8) & 0xff);
+ *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff);
}
-#ifdef PNG_READ_GAMMA_SUPPORTED
- else
+ else if (a < 0xffff)
{
png_uint_16 g, v;
g = (png_uint_16)(((*sp) << 8) + *(sp + 1));
- png_composite_16(v, g, a, background_1->gray);
- *dp = (png_byte)((v >> 8) & 0xff);
- *(dp + 1) = (png_byte)(v & 0xff);
+ png_composite_16(v, g, a, png_ptr->background_1.gray);
+ *sp = (png_byte)((v >> 8) & 0xff);
+ *(sp + 1) = (png_byte)(v & 0xff);
}
-#endif
}
}
}
@@ -3267,24 +3995,23 @@ png_do_background(png_row_infop row_info, png_bytep row,
gamma_table != NULL)
{
sp = row;
- dp = row;
- for (i = 0; i < row_width; i++, sp += 4, dp += 3)
+ for (i = 0; i < row_width; i++, sp += 4)
{
png_byte a = *(sp + 3);
if (a == 0xff)
{
- *dp = gamma_table[*sp];
- *(dp + 1) = gamma_table[*(sp + 1)];
- *(dp + 2) = gamma_table[*(sp + 2)];
+ *sp = gamma_table[*sp];
+ *(sp + 1) = gamma_table[*(sp + 1)];
+ *(sp + 2) = gamma_table[*(sp + 2)];
}
else if (a == 0)
{
/* Background is already in screen gamma */
- *dp = (png_byte)background->red;
- *(dp + 1) = (png_byte)background->green;
- *(dp + 2) = (png_byte)background->blue;
+ *sp = (png_byte)png_ptr->background.red;
+ *(sp + 1) = (png_byte)png_ptr->background.green;
+ *(sp + 2) = (png_byte)png_ptr->background.blue;
}
else
@@ -3292,16 +4019,19 @@ png_do_background(png_row_infop row_info, png_bytep row,
png_byte v, w;
v = gamma_to_1[*sp];
- png_composite(w, v, a, background_1->red);
- *dp = gamma_from_1[w];
+ png_composite(w, v, a, png_ptr->background_1.red);
+ if (!optimize) w = gamma_from_1[w];
+ *sp = w;
v = gamma_to_1[*(sp + 1)];
- png_composite(w, v, a, background_1->green);
- *(dp + 1) = gamma_from_1[w];
+ png_composite(w, v, a, png_ptr->background_1.green);
+ if (!optimize) w = gamma_from_1[w];
+ *(sp + 1) = w;
v = gamma_to_1[*(sp + 2)];
- png_composite(w, v, a, background_1->blue);
- *(dp + 2) = gamma_from_1[w];
+ png_composite(w, v, a, png_ptr->background_1.blue);
+ if (!optimize) w = gamma_from_1[w];
+ *(sp + 2) = w;
}
}
}
@@ -3309,34 +4039,26 @@ png_do_background(png_row_infop row_info, png_bytep row,
#endif
{
sp = row;
- dp = row;
- for (i = 0; i < row_width; i++, sp += 4, dp += 3)
+ for (i = 0; i < row_width; i++, sp += 4)
{
png_byte a = *(sp + 3);
- if (a == 0xff)
- {
- *dp = *sp;
- *(dp + 1) = *(sp + 1);
- *(dp + 2) = *(sp + 2);
- }
-
- else if (a == 0)
+ if (a == 0)
{
- *dp = (png_byte)background->red;
- *(dp + 1) = (png_byte)background->green;
- *(dp + 2) = (png_byte)background->blue;
+ *sp = (png_byte)png_ptr->background.red;
+ *(sp + 1) = (png_byte)png_ptr->background.green;
+ *(sp + 2) = (png_byte)png_ptr->background.blue;
}
- else
+ else if (a < 0xff)
{
- png_composite(*dp, *sp, a, background->red);
+ png_composite(*sp, *sp, a, png_ptr->background.red);
- png_composite(*(dp + 1), *(sp + 1), a,
- background->green);
+ png_composite(*(sp + 1), *(sp + 1), a,
+ png_ptr->background.green);
- png_composite(*(dp + 2), *(sp + 2), a,
- background->blue);
+ png_composite(*(sp + 2), *(sp + 2), a,
+ png_ptr->background.blue);
}
}
}
@@ -3348,8 +4070,7 @@ png_do_background(png_row_infop row_info, png_bytep row,
gamma_16_to_1 != NULL)
{
sp = row;
- dp = row;
- for (i = 0; i < row_width; i++, sp += 8, dp += 6)
+ for (i = 0; i < row_width; i++, sp += 8)
{
png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6))
<< 8) + (png_uint_16)(*(sp + 7)));
@@ -3359,53 +4080,55 @@ png_do_background(png_row_infop row_info, png_bytep row,
png_uint_16 v;
v = gamma_16[*(sp + 1) >> gamma_shift][*sp];
- *dp = (png_byte)((v >> 8) & 0xff);
- *(dp + 1) = (png_byte)(v & 0xff);
+ *sp = (png_byte)((v >> 8) & 0xff);
+ *(sp + 1) = (png_byte)(v & 0xff);
v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)];
- *(dp + 2) = (png_byte)((v >> 8) & 0xff);
- *(dp + 3) = (png_byte)(v & 0xff);
+ *(sp + 2) = (png_byte)((v >> 8) & 0xff);
+ *(sp + 3) = (png_byte)(v & 0xff);
v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)];
- *(dp + 4) = (png_byte)((v >> 8) & 0xff);
- *(dp + 5) = (png_byte)(v & 0xff);
+ *(sp + 4) = (png_byte)((v >> 8) & 0xff);
+ *(sp + 5) = (png_byte)(v & 0xff);
}
else if (a == 0)
{
/* Background is already in screen gamma */
- *dp = (png_byte)((background->red >> 8) & 0xff);
- *(dp + 1) = (png_byte)(background->red & 0xff);
- *(dp + 2) = (png_byte)((background->green >> 8) & 0xff);
- *(dp + 3) = (png_byte)(background->green & 0xff);
- *(dp + 4) = (png_byte)((background->blue >> 8) & 0xff);
- *(dp + 5) = (png_byte)(background->blue & 0xff);
+ *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
+ *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
+ *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) & 0xff);
+ *(sp + 3) = (png_byte)(png_ptr->background.green & 0xff);
+ *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) & 0xff);
+ *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
}
else
{
- png_uint_16 v, w, x;
+ png_uint_16 v, w;
v = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp];
- png_composite_16(w, v, a, background_1->red);
-
- x = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8];
- *dp = (png_byte)((x >> 8) & 0xff);
- *(dp + 1) = (png_byte)(x & 0xff);
+ png_composite_16(w, v, a, png_ptr->background_1.red);
+ if (!optimize)
+ w = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8];
+ *sp = (png_byte)((w >> 8) & 0xff);
+ *(sp + 1) = (png_byte)(w & 0xff);
v = gamma_16_to_1[*(sp + 3) >> gamma_shift][*(sp + 2)];
- png_composite_16(w, v, a, background_1->green);
+ png_composite_16(w, v, a, png_ptr->background_1.green);
+ if (!optimize)
+ w = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8];
- x = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8];
- *(dp + 2) = (png_byte)((x >> 8) & 0xff);
- *(dp + 3) = (png_byte)(x & 0xff);
+ *(sp + 2) = (png_byte)((w >> 8) & 0xff);
+ *(sp + 3) = (png_byte)(w & 0xff);
v = gamma_16_to_1[*(sp + 5) >> gamma_shift][*(sp + 4)];
- png_composite_16(w, v, a, background_1->blue);
+ png_composite_16(w, v, a, png_ptr->background_1.blue);
+ if (!optimize)
+ w = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8];
- x = gamma_16_from_1[(w & 0xff) >> gamma_shift][w >> 8];
- *(dp + 4) = (png_byte)((x >> 8) & 0xff);
- *(dp + 5) = (png_byte)(x & 0xff);
+ *(sp + 4) = (png_byte)((w >> 8) & 0xff);
+ *(sp + 5) = (png_byte)(w & 0xff);
}
}
}
@@ -3414,28 +4137,22 @@ png_do_background(png_row_infop row_info, png_bytep row,
#endif
{
sp = row;
- dp = row;
- for (i = 0; i < row_width; i++, sp += 8, dp += 6)
+ for (i = 0; i < row_width; i++, sp += 8)
{
png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6))
<< 8) + (png_uint_16)(*(sp + 7)));
- if (a == (png_uint_16)0xffff)
- {
- png_memcpy(dp, sp, 6);
- }
-
- else if (a == 0)
+ if (a == 0)
{
- *dp = (png_byte)((background->red >> 8) & 0xff);
- *(dp + 1) = (png_byte)(background->red & 0xff);
- *(dp + 2) = (png_byte)((background->green >> 8) & 0xff);
- *(dp + 3) = (png_byte)(background->green & 0xff);
- *(dp + 4) = (png_byte)((background->blue >> 8) & 0xff);
- *(dp + 5) = (png_byte)(background->blue & 0xff);
+ *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
+ *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
+ *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) & 0xff);
+ *(sp + 3) = (png_byte)(png_ptr->background.green & 0xff);
+ *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) & 0xff);
+ *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
}
- else
+ else if (a < 0xffff)
{
png_uint_16 v;
@@ -3445,17 +4162,17 @@ png_do_background(png_row_infop row_info, png_bytep row,
png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8)
+ *(sp + 5));
- png_composite_16(v, r, a, background->red);
- *dp = (png_byte)((v >> 8) & 0xff);
- *(dp + 1) = (png_byte)(v & 0xff);
+ png_composite_16(v, r, a, png_ptr->background.red);
+ *sp = (png_byte)((v >> 8) & 0xff);
+ *(sp + 1) = (png_byte)(v & 0xff);
- png_composite_16(v, g, a, background->green);
- *(dp + 2) = (png_byte)((v >> 8) & 0xff);
- *(dp + 3) = (png_byte)(v & 0xff);
+ png_composite_16(v, g, a, png_ptr->background.green);
+ *(sp + 2) = (png_byte)((v >> 8) & 0xff);
+ *(sp + 3) = (png_byte)(v & 0xff);
- png_composite_16(v, b, a, background->blue);
- *(dp + 4) = (png_byte)((v >> 8) & 0xff);
- *(dp + 5) = (png_byte)(v & 0xff);
+ png_composite_16(v, b, a, png_ptr->background.blue);
+ *(sp + 4) = (png_byte)((v >> 8) & 0xff);
+ *(sp + 5) = (png_byte)(v & 0xff);
}
}
}
@@ -3466,19 +4183,9 @@ png_do_background(png_row_infop row_info, png_bytep row,
default:
break;
}
-
- if (row_info->color_type & PNG_COLOR_MASK_ALPHA)
- {
- row_info->color_type = (png_byte)(row_info->color_type &
- ~PNG_COLOR_MASK_ALPHA);
- row_info->channels--;
- row_info->pixel_depth = (png_byte)(row_info->channels *
- row_info->bit_depth);
- row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width);
- }
}
}
-#endif
+#endif /* PNG_READ_BACKGROUND_SUPPORTED || PNG_READ_ALPHA_MODE_SUPPORTED */
#ifdef PNG_READ_GAMMA_SUPPORTED
/* Gamma correct the image, avoiding the alpha channel. Make sure
@@ -3488,10 +4195,12 @@ png_do_background(png_row_infop row_info, png_bytep row,
* build_gamma_table().
*/
void /* PRIVATE */
-png_do_gamma(png_row_infop row_info, png_bytep row,
- png_const_bytep gamma_table, png_const_uint_16pp gamma_16_table,
- int gamma_shift)
+png_do_gamma(png_row_infop row_info, png_bytep row, png_structp png_ptr)
{
+ png_const_bytep gamma_table = png_ptr->gamma_table;
+ png_const_uint_16pp gamma_16_table = png_ptr->gamma_16_table;
+ int gamma_shift = png_ptr->gamma_shift;
+
png_bytep sp;
png_uint_32 i;
png_uint_32 row_width=row_info->width;
@@ -3681,6 +4390,73 @@ png_do_gamma(png_row_infop row_info, png_bytep row,
}
#endif
+#ifdef PNG_READ_ALPHA_MODE_SUPPORTED
+/* Encode the alpha channel to the output gamma (the input channel is always
+ * linear.) Called only with color types that have an alpha channel. Needs the
+ * from_1 tables.
+ */
+void /* PRIVATE */
+png_do_encode_alpha(png_row_infop row_info, png_bytep row, png_structp png_ptr)
+{
+ png_uint_32 row_width = row_info->width;
+
+ png_debug(1, "in png_do_encode_alpha");
+
+ if (row_info->color_type & PNG_COLOR_MASK_ALPHA)
+ {
+ if (row_info->bit_depth == 8)
+ {
+ PNG_CONST png_bytep table = png_ptr->gamma_from_1;
+
+ if (table != NULL)
+ {
+ PNG_CONST int step =
+ (row_info->color_type & PNG_COLOR_MASK_COLOR) ? 4 : 2;
+
+ /* The alpha channel is the last component: */
+ row += step - 1;
+
+ for (; row_width > 0; --row_width, row += step)
+ *row = table[*row];
+
+ return;
+ }
+ }
+
+ else if (row_info->bit_depth == 16)
+ {
+ PNG_CONST png_uint_16pp table = png_ptr->gamma_16_from_1;
+ PNG_CONST int gamma_shift = png_ptr->gamma_shift;
+
+ if (table != NULL)
+ {
+ PNG_CONST int step =
+ (row_info->color_type & PNG_COLOR_MASK_COLOR) ? 8 : 4;
+
+ /* The alpha channel is the last component: */
+ row += step - 2;
+
+ for (; row_width > 0; --row_width, row += step)
+ {
+ png_uint_16 v;
+
+ v = table[*(row + 1) >> gamma_shift][*row];
+ *row = (png_byte)((v >> 8) & 0xff);
+ *(row + 1) = (png_byte)(v & 0xff);
+ }
+
+ return;
+ }
+ }
+ }
+
+ /* Only get to here if called with a weird row_info; no harm has been done,
+ * so just issue a warning.
+ */
+ png_warning(png_ptr, "png_do_encode_alpha: unexpected call");
+}
+#endif
+
#ifdef PNG_READ_EXPAND_SUPPORTED
/* Expands a palette row to an RGB or RGBA row depending
* upon whether you supply trans and num_trans.
@@ -3786,7 +4562,7 @@ png_do_expand_palette(png_row_infop row_info, png_bytep row,
if (row_info->bit_depth == 8)
{
{
- if (trans_alpha != NULL)
+ if (num_trans > 0)
{
sp = row + (png_size_t)row_width - 1;
dp = row + (png_size_t)(row_width << 2) - 1;
@@ -3840,7 +4616,7 @@ png_do_expand_palette(png_row_infop row_info, png_bytep row,
*/
void /* PRIVATE */
png_do_expand(png_row_infop row_info, png_bytep row,
- png_const_color_16p trans_value)
+ png_const_color_16p trans_color)
{
int shift, value;
png_bytep sp, dp;
@@ -3852,7 +4628,7 @@ png_do_expand(png_row_infop row_info, png_bytep row,
{
if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
{
- png_uint_16 gray = (png_uint_16)(trans_value ? trans_value->gray : 0);
+ png_uint_16 gray = (png_uint_16)(trans_color ? trans_color->gray : 0);
if (row_info->bit_depth < 8)
{
@@ -3944,7 +4720,7 @@ png_do_expand(png_row_infop row_info, png_bytep row,
row_info->rowbytes = row_width;
}
- if (trans_value != NULL)
+ if (trans_color != NULL)
{
if (row_info->bit_depth == 8)
{
@@ -3996,13 +4772,13 @@ png_do_expand(png_row_infop row_info, png_bytep row,
row_width);
}
}
- else if (row_info->color_type == PNG_COLOR_TYPE_RGB && trans_value)
+ else if (row_info->color_type == PNG_COLOR_TYPE_RGB && trans_color)
{
if (row_info->bit_depth == 8)
{
- png_byte red = (png_byte)(trans_value->red & 0xff);
- png_byte green = (png_byte)(trans_value->green & 0xff);
- png_byte blue = (png_byte)(trans_value->blue & 0xff);
+ png_byte red = (png_byte)(trans_color->red & 0xff);
+ png_byte green = (png_byte)(trans_color->green & 0xff);
+ png_byte blue = (png_byte)(trans_color->blue & 0xff);
sp = row + (png_size_t)row_info->rowbytes - 1;
dp = row + (png_size_t)(row_width << 2) - 1;
for (i = 0; i < row_width; i++)
@@ -4020,12 +4796,12 @@ png_do_expand(png_row_infop row_info, png_bytep row,
}
else if (row_info->bit_depth == 16)
{
- png_byte red_high = (png_byte)((trans_value->red >> 8) & 0xff);
- png_byte green_high = (png_byte)((trans_value->green >> 8) & 0xff);
- png_byte blue_high = (png_byte)((trans_value->blue >> 8) & 0xff);
- png_byte red_low = (png_byte)(trans_value->red & 0xff);
- png_byte green_low = (png_byte)(trans_value->green & 0xff);
- png_byte blue_low = (png_byte)(trans_value->blue & 0xff);
+ png_byte red_high = (png_byte)((trans_color->red >> 8) & 0xff);
+ png_byte green_high = (png_byte)((trans_color->green >> 8) & 0xff);
+ png_byte blue_high = (png_byte)((trans_color->blue >> 8) & 0xff);
+ png_byte red_low = (png_byte)(trans_color->red & 0xff);
+ png_byte green_low = (png_byte)(trans_color->green & 0xff);
+ png_byte blue_low = (png_byte)(trans_color->blue & 0xff);
sp = row + row_info->rowbytes - 1;
dp = row + (png_size_t)(row_width << 3) - 1;
for (i = 0; i < row_width; i++)
@@ -4064,6 +4840,37 @@ png_do_expand(png_row_infop row_info, png_bytep row,
}
#endif
+#ifdef PNG_READ_EXPAND_16_SUPPORTED
+/* If the bit depth is 8 and the color type is not a palette type expand the
+ * whole row to 16 bits. Has no effect otherwise.
+ */
+void /* PRIVATE */
+png_do_expand_16(png_row_infop row_info, png_bytep row)
+{
+ if (row_info->bit_depth == 8 &&
+ row_info->color_type != PNG_COLOR_TYPE_PALETTE)
+ {
+ /* The row have a sequence of bytes containing [0..255] and we need
+ * to turn it into another row containing [0..65535], to do this we
+ * calculate:
+ *
+ * (input / 255) * 65535
+ *
+ * Which happens to be exactly input * 257 and this can be achieved
+ * simply by byte replication in place (copying backwards).
+ */
+ png_byte *sp = row + row_info->rowbytes; /* source, last byte + 1 */
+ png_byte *dp = sp + row_info->rowbytes; /* destination, end + 1 */
+ while (dp > sp)
+ dp[-2] = dp[-1] = *--sp, dp -= 2;
+
+ row_info->rowbytes *= 2;
+ row_info->bit_depth = 16;
+ row_info->pixel_depth = (png_byte)(row_info->channels * 16);
+ }
+}
+#endif
+
#ifdef PNG_READ_QUANTIZE_SUPPORTED
void /* PRIVATE */
png_do_quantize(png_row_infop row_info, png_bytep row,
@@ -4157,6 +4964,7 @@ png_do_quantize(png_row_infop row_info, png_bytep row,
}
}
#endif /* PNG_READ_QUANTIZE_SUPPORTED */
+#endif /* PNG_READ_TRANSFORMS_SUPPORTED */
#ifdef PNG_MNG_FEATURES_SUPPORTED
/* Undoes intrapixel differencing */
@@ -4210,8 +5018,8 @@ png_do_read_intrapixel(png_row_infop row_info, png_bytep row)
png_uint_32 s0 = (*(rp ) << 8) | *(rp + 1);
png_uint_32 s1 = (*(rp + 2) << 8) | *(rp + 3);
png_uint_32 s2 = (*(rp + 4) << 8) | *(rp + 5);
- png_uint_32 red = (png_uint_32)((s0 + s1 + 65536L) & 0xffffL);
- png_uint_32 blue = (png_uint_32)((s2 + s1 + 65536L) & 0xffffL);
+ png_uint_32 red = (s0 + s1 + 65536) & 0xffff;
+ png_uint_32 blue = (s2 + s1 + 65536) & 0xffff;
*(rp ) = (png_byte)((red >> 8) & 0xff);
*(rp + 1) = (png_byte)(red & 0xff);
*(rp + 4) = (png_byte)((blue >> 8) & 0xff);
diff --git a/src/3rdparty/libpng/pngrutil.c b/src/3rdparty/libpng/pngrutil.c
index 4c3cd53813..aa592ccfbd 100644
--- a/src/3rdparty/libpng/pngrutil.c
+++ b/src/3rdparty/libpng/pngrutil.c
@@ -1,8 +1,8 @@
/* pngrutil.c - utilities to read a PNG file
*
- * Last changed in libpng 1.5.1 [February 3, 2011]
- * Copyright (c) 1998-2011 Glenn Randers-Pehrson
+ * Last changed in libpng 1.5.10 [March 8, 2012]
+ * Copyright (c) 1998-2012 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -87,10 +87,10 @@ png_int_32 (PNGAPI
png_get_int_32)(png_const_bytep buf)
{
png_uint_32 uval = png_get_uint_32(buf);
- if ((uval & 0x80000000L) == 0) /* non-negative */
+ if ((uval & 0x80000000) == 0) /* non-negative */
return uval;
- uval = (uval ^ 0xffffffffL) + 1; /* 2's complement: -x = ~x+1 */
+ uval = (uval ^ 0xffffffff) + 1; /* 2's complement: -x = ~x+1 */
return -(png_int_32)uval;
}
@@ -165,14 +165,14 @@ png_read_chunk_header(png_structp png_ptr)
length = png_get_uint_31(png_ptr, buf);
/* Put the chunk name into png_ptr->chunk_name. */
- png_memcpy(png_ptr->chunk_name, buf + 4, 4);
+ png_ptr->chunk_name = PNG_CHUNK_FROM_STRING(buf+4);
- png_debug2(0, "Reading %s chunk, length = %u",
- png_ptr->chunk_name, length);
+ png_debug2(0, "Reading %lx chunk, length = %lu",
+ (unsigned long)png_ptr->chunk_name, (unsigned long)length);
/* Reset the crc and run it over the chunk name. */
png_reset_crc(png_ptr);
- png_calculate_crc(png_ptr, png_ptr->chunk_name, 4);
+ png_calculate_crc(png_ptr, buf + 4, 4);
/* Check to see if chunk name is valid. */
png_check_chunk_name(png_ptr, png_ptr->chunk_name);
@@ -218,10 +218,9 @@ png_crc_finish(png_structp png_ptr, png_uint_32 skip)
if (png_crc_error(png_ptr))
{
- if (((png_ptr->chunk_name[0] & 0x20) && /* Ancillary */
- !(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN)) ||
- (!(png_ptr->chunk_name[0] & 0x20) && /* Critical */
- (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_USE)))
+ if (PNG_CHUNK_ANCILLIARY(png_ptr->chunk_name) ?
+ !(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN) :
+ (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_USE))
{
png_chunk_warning(png_ptr, "CRC error");
}
@@ -248,14 +247,14 @@ png_crc_error(png_structp png_ptr)
png_uint_32 crc;
int need_crc = 1;
- if (png_ptr->chunk_name[0] & 0x20) /* ancillary */
+ if (PNG_CHUNK_ANCILLIARY(png_ptr->chunk_name))
{
if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) ==
(PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN))
need_crc = 0;
}
- else /* critical */
+ else /* critical */
{
if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE)
need_crc = 0;
@@ -278,8 +277,7 @@ png_crc_error(png_structp png_ptr)
return (0);
}
-#if defined(PNG_READ_zTXt_SUPPORTED) || defined(PNG_READ_iTXt_SUPPORTED) || \
- defined(PNG_READ_iCCP_SUPPORTED)
+#ifdef PNG_READ_COMPRESSED_TEXT_SUPPORTED
static png_size_t
png_inflate(png_structp png_ptr, png_bytep data, png_size_t size,
png_bytep output, png_size_t output_size)
@@ -303,7 +301,7 @@ png_inflate(png_structp png_ptr, png_bytep data, png_size_t size,
{
int ret, avail;
- /* The setting of 'avail_in' used to be outside the loop, by setting it
+ /* The setting of 'avail_in' used to be outside the loop; by setting it
* inside it is possible to chunk the input to zlib and simply rely on
* zlib to advance the 'next_in' pointer. This allows arbitrary amounts o
* data to be passed through zlib at the unavoidable cost of requiring a
@@ -370,41 +368,31 @@ png_inflate(png_structp png_ptr, png_bytep data, png_size_t size,
* and the error message is dumped into the uncompressed
* buffer if available.
*/
+# ifdef PNG_WARNINGS_SUPPORTED
{
- PNG_CONST char *msg;
-#ifdef PNG_CONSOLE_IO_SUPPORTED
- char umsg[52];
-#endif
+ png_const_charp msg;
+
if (png_ptr->zstream.msg != 0)
msg = png_ptr->zstream.msg;
- else
+ else switch (ret)
{
-#ifdef PNG_CONSOLE_IO_SUPPORTED
- switch (ret)
- {
- case Z_BUF_ERROR:
- msg = "Buffer error in compressed datastream in %s chunk";
- break;
-
- case Z_DATA_ERROR:
- msg = "Data error in compressed datastream in %s chunk";
- break;
+ case Z_BUF_ERROR:
+ msg = "Buffer error in compressed datastream";
+ break;
- default:
- msg = "Incomplete compressed datastream in %s chunk";
- break;
- }
+ case Z_DATA_ERROR:
+ msg = "Data error in compressed datastream";
+ break;
- png_snprintf(umsg, sizeof umsg, msg, png_ptr->chunk_name);
- msg = umsg;
-#else
- msg = "Damaged compressed datastream in chunk other than IDAT";
-#endif
+ default:
+ msg = "Incomplete compressed datastream";
+ break;
}
- png_warning(png_ptr, msg);
+ png_chunk_warning(png_ptr, msg);
}
+# endif
/* 0 means an error - notice that this code simply ignores
* zero length compressed chunks as a result.
@@ -438,21 +426,22 @@ png_decompress_chunk(png_structp png_ptr, int comp_type,
png_size_t expanded_size = png_inflate(png_ptr,
(png_bytep)(png_ptr->chunkdata + prefix_size),
chunklength - prefix_size,
- 0, /*output*/
- 0); /*output size*/
+ 0, /* output */
+ 0); /* output size */
/* Now check the limits on this chunk - if the limit fails the
* compressed data will be removed, the prefix will remain.
*/
-#ifdef PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED
- if (png_ptr->user_chunk_malloc_max &&
+ if (prefix_size >= (~(png_size_t)0) - 1 ||
+ expanded_size >= (~(png_size_t)0) - 1 - prefix_size
+#ifdef PNG_USER_LIMITS_SUPPORTED
+ || (png_ptr->user_chunk_malloc_max &&
(prefix_size + expanded_size >= png_ptr->user_chunk_malloc_max - 1))
#else
-# ifdef PNG_USER_CHUNK_MALLOC_MAX
- if ((PNG_USER_CHUNK_MALLOC_MAX > 0) &&
+ || ((PNG_USER_CHUNK_MALLOC_MAX > 0) &&
prefix_size + expanded_size >= PNG_USER_CHUNK_MALLOC_MAX - 1)
-# endif
#endif
+ )
png_warning(png_ptr, "Exceeded size limit while expanding chunk");
/* If the size is zero either there was an error and a message
@@ -460,16 +449,11 @@ png_decompress_chunk(png_structp png_ptr, int comp_type,
* and we have nothing to do - the code will exit through the
* error case below.
*/
-#if defined(PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED) || \
- defined(PNG_USER_CHUNK_MALLOC_MAX)
else if (expanded_size > 0)
-#else
- if (expanded_size > 0)
-#endif
{
/* Success (maybe) - really uncompress the chunk. */
png_size_t new_size = 0;
- png_charp text = png_malloc_warn(png_ptr,
+ png_charp text = (png_charp)png_malloc_warn(png_ptr,
prefix_size + expanded_size + 1);
if (text != NULL)
@@ -500,15 +484,9 @@ png_decompress_chunk(png_structp png_ptr, int comp_type,
else /* if (comp_type != PNG_COMPRESSION_TYPE_BASE) */
{
-#ifdef PNG_STDIO_SUPPORTED
- char umsg[50];
-
- png_snprintf(umsg, sizeof umsg,
- "Unknown zTXt compression type %d", comp_type);
- png_warning(png_ptr, umsg);
-#else
- png_warning(png_ptr, "Unknown zTXt compression type");
-#endif
+ PNG_WARNING_PARAMETERS(p)
+ png_warning_parameter_signed(p, 1, PNG_NUMBER_FORMAT_d, comp_type);
+ png_formatted_warning(png_ptr, p, "Unknown compression type @1");
/* The recovery is to simply drop the data. */
}
@@ -518,7 +496,7 @@ png_decompress_chunk(png_structp png_ptr, int comp_type,
* amount of compressed data.
*/
{
- png_charp text = png_malloc_warn(png_ptr, prefix_size + 1);
+ png_charp text = (png_charp)png_malloc_warn(png_ptr, prefix_size + 1);
if (text != NULL)
{
@@ -536,7 +514,7 @@ png_decompress_chunk(png_structp png_ptr, int comp_type,
*newlength = prefix_size;
}
-#endif
+#endif /* PNG_READ_COMPRESSED_TEXT_SUPPORTED */
/* Read and check the IDHR chunk */
void /* PRIVATE */
@@ -844,14 +822,12 @@ png_handle_gAMA(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
# ifdef PNG_READ_sRGB_SUPPORTED
if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB))
{
- if (PNG_OUT_OF_RANGE(igamma, 45500L, 500))
+ if (PNG_OUT_OF_RANGE(igamma, 45500, 500))
{
- png_warning(png_ptr,
- "Ignoring incorrect gAMA value when sRGB is also present");
-
-# ifdef PNG_CONSOLE_IO_SUPPORTED
- fprintf(stderr, "gamma = (%d/100000)", (int)igamma);
-# endif
+ PNG_WARNING_PARAMETERS(p)
+ png_warning_parameter_signed(p, 1, PNG_NUMBER_FORMAT_fixed, igamma);
+ png_formatted_warning(png_ptr, p,
+ "Ignoring incorrect gAMA value @1 when sRGB is also present");
return;
}
}
@@ -961,7 +937,7 @@ png_handle_cHRM(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
else if (png_ptr->mode & PNG_HAVE_PLTE)
/* Should be an error, but we can cope with it */
- png_warning(png_ptr, "Missing PLTE before cHRM");
+ png_warning(png_ptr, "Out of place cHRM chunk");
if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM)
# ifdef PNG_READ_sRGB_SUPPORTED
@@ -1013,28 +989,112 @@ png_handle_cHRM(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
if (PNG_OUT_OF_RANGE(x_white, 31270, 1000) ||
PNG_OUT_OF_RANGE(y_white, 32900, 1000) ||
- PNG_OUT_OF_RANGE(x_red, 64000L, 1000) ||
+ PNG_OUT_OF_RANGE(x_red, 64000, 1000) ||
PNG_OUT_OF_RANGE(y_red, 33000, 1000) ||
PNG_OUT_OF_RANGE(x_green, 30000, 1000) ||
- PNG_OUT_OF_RANGE(y_green, 60000L, 1000) ||
+ PNG_OUT_OF_RANGE(y_green, 60000, 1000) ||
PNG_OUT_OF_RANGE(x_blue, 15000, 1000) ||
PNG_OUT_OF_RANGE(y_blue, 6000, 1000))
{
- png_warning(png_ptr,
- "Ignoring incorrect cHRM value when sRGB is also present");
-
-#ifdef PNG_CONSOLE_IO_SUPPORTED
- fprintf(stderr, "wx=%d, wy=%d, rx=%d, ry=%d\n",
- x_white, y_white, x_red, y_red);
-
- fprintf(stderr, "gx=%d, gy=%d, bx=%d, by=%d\n",
- x_green, y_green, x_blue, y_blue);
-#endif /* PNG_CONSOLE_IO_SUPPORTED */
+ PNG_WARNING_PARAMETERS(p)
+
+ png_warning_parameter_signed(p, 1, PNG_NUMBER_FORMAT_fixed, x_white);
+ png_warning_parameter_signed(p, 2, PNG_NUMBER_FORMAT_fixed, y_white);
+ png_warning_parameter_signed(p, 3, PNG_NUMBER_FORMAT_fixed, x_red);
+ png_warning_parameter_signed(p, 4, PNG_NUMBER_FORMAT_fixed, y_red);
+ png_warning_parameter_signed(p, 5, PNG_NUMBER_FORMAT_fixed, x_green);
+ png_warning_parameter_signed(p, 6, PNG_NUMBER_FORMAT_fixed, y_green);
+ png_warning_parameter_signed(p, 7, PNG_NUMBER_FORMAT_fixed, x_blue);
+ png_warning_parameter_signed(p, 8, PNG_NUMBER_FORMAT_fixed, y_blue);
+
+ png_formatted_warning(png_ptr, p,
+ "Ignoring incorrect cHRM white(@1,@2) r(@3,@4)g(@5,@6)b(@7,@8) "
+ "when sRGB is also present");
}
return;
}
#endif /* PNG_READ_sRGB_SUPPORTED */
+#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
+ /* Store the _white values as default coefficients for the rgb to gray
+ * operation if it is supported. Check if the transform is already set to
+ * avoid destroying the transform values.
+ */
+ if (!png_ptr->rgb_to_gray_coefficients_set)
+ {
+ /* png_set_background has not been called and we haven't seen an sRGB
+ * chunk yet. Find the XYZ of the three end points.
+ */
+ png_XYZ XYZ;
+ png_xy xy;
+
+ xy.redx = x_red;
+ xy.redy = y_red;
+ xy.greenx = x_green;
+ xy.greeny = y_green;
+ xy.bluex = x_blue;
+ xy.bluey = y_blue;
+ xy.whitex = x_white;
+ xy.whitey = y_white;
+
+ if (png_XYZ_from_xy_checked(png_ptr, &XYZ, xy))
+ {
+ /* The success case, because XYZ_from_xy normalises to a reference
+ * white Y of 1.0 we just need to scale the numbers. This should
+ * always work just fine. It is an internal error if this overflows.
+ */
+ {
+ png_fixed_point r, g, b;
+ if (png_muldiv(&r, XYZ.redY, 32768, PNG_FP_1) &&
+ r >= 0 && r <= 32768 &&
+ png_muldiv(&g, XYZ.greenY, 32768, PNG_FP_1) &&
+ g >= 0 && g <= 32768 &&
+ png_muldiv(&b, XYZ.blueY, 32768, PNG_FP_1) &&
+ b >= 0 && b <= 32768 &&
+ r+g+b <= 32769)
+ {
+ /* We allow 0 coefficients here. r+g+b may be 32769 if two or
+ * all of the coefficients were rounded up. Handle this by
+ * reducing the *largest* coefficient by 1; this matches the
+ * approach used for the default coefficients in pngrtran.c
+ */
+ int add = 0;
+
+ if (r+g+b > 32768)
+ add = -1;
+ else if (r+g+b < 32768)
+ add = 1;
+
+ if (add != 0)
+ {
+ if (g >= r && g >= b)
+ g += add;
+ else if (r >= g && r >= b)
+ r += add;
+ else
+ b += add;
+ }
+
+ /* Check for an internal error. */
+ if (r+g+b != 32768)
+ png_error(png_ptr,
+ "internal error handling cHRM coefficients");
+
+ png_ptr->rgb_to_gray_red_coeff = (png_uint_16)r;
+ png_ptr->rgb_to_gray_green_coeff = (png_uint_16)g;
+ }
+
+ /* This is a png_error at present even though it could be ignored -
+ * it should never happen, but it is important that if it does, the
+ * bug is fixed.
+ */
+ else
+ png_error(png_ptr, "internal error handling cHRM->XYZ");
+ }
+ }
+ }
+#endif
+
png_set_cHRM_fixed(png_ptr, info_ptr, x_white, y_white, x_red, y_red,
x_green, y_green, x_blue, y_blue);
}
@@ -1094,13 +1154,15 @@ png_handle_sRGB(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
#if defined(PNG_READ_gAMA_SUPPORTED) && defined(PNG_READ_GAMMA_SUPPORTED)
if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA))
{
- if (PNG_OUT_OF_RANGE(info_ptr->gamma, 45500L, 500))
+ if (PNG_OUT_OF_RANGE(info_ptr->gamma, 45500, 500))
{
- png_warning(png_ptr,
- "Ignoring incorrect gAMA value when sRGB is also present");
-#ifdef PNG_CONSOLE_IO_SUPPORTED
- fprintf(stderr, "incorrect gamma=(%d/100000)\n", info_ptr->gamma);
-#endif
+ PNG_WARNING_PARAMETERS(p)
+
+ png_warning_parameter_signed(p, 1, PNG_NUMBER_FORMAT_fixed,
+ info_ptr->gamma);
+
+ png_formatted_warning(png_ptr, p,
+ "Ignoring incorrect gAMA value @1 when sRGB is also present");
}
}
#endif /* PNG_READ_gAMA_SUPPORTED */
@@ -1109,10 +1171,10 @@ png_handle_sRGB(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM))
if (PNG_OUT_OF_RANGE(info_ptr->x_white, 31270, 1000) ||
PNG_OUT_OF_RANGE(info_ptr->y_white, 32900, 1000) ||
- PNG_OUT_OF_RANGE(info_ptr->x_red, 64000L, 1000) ||
+ PNG_OUT_OF_RANGE(info_ptr->x_red, 64000, 1000) ||
PNG_OUT_OF_RANGE(info_ptr->y_red, 33000, 1000) ||
PNG_OUT_OF_RANGE(info_ptr->x_green, 30000, 1000) ||
- PNG_OUT_OF_RANGE(info_ptr->y_green, 60000L, 1000) ||
+ PNG_OUT_OF_RANGE(info_ptr->y_green, 60000, 1000) ||
PNG_OUT_OF_RANGE(info_ptr->x_blue, 15000, 1000) ||
PNG_OUT_OF_RANGE(info_ptr->y_blue, 6000, 1000))
{
@@ -1121,6 +1183,47 @@ png_handle_sRGB(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
}
#endif /* PNG_READ_cHRM_SUPPORTED */
+ /* This is recorded for use when handling the cHRM chunk above. An sRGB
+ * chunk unconditionally overwrites the coefficients for grayscale conversion
+ * too.
+ */
+ png_ptr->is_sRGB = 1;
+
+# ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
+ /* Don't overwrite user supplied values: */
+ if (!png_ptr->rgb_to_gray_coefficients_set)
+ {
+ /* These numbers come from the sRGB specification (or, since one has to
+ * pay much money to get a copy, the wikipedia sRGB page) the
+ * chromaticity values quoted have been inverted to get the reverse
+ * transformation from RGB to XYZ and the 'Y' coefficients scaled by
+ * 32768 (then rounded).
+ *
+ * sRGB and ITU Rec-709 both truncate the values for the D65 white
+ * point to four digits and, even though it actually stores five
+ * digits, the PNG spec gives the truncated value.
+ *
+ * This means that when the chromaticities are converted back to XYZ
+ * end points we end up with (6968,23435,2366), which, as described in
+ * pngrtran.c, would overflow. If the five digit precision and up is
+ * used we get, instead:
+ *
+ * 6968*R + 23435*G + 2365*B
+ *
+ * (Notice that this rounds the blue coefficient down, rather than the
+ * choice used in pngrtran.c which is to round the green one down.)
+ */
+ png_ptr->rgb_to_gray_red_coeff = 6968; /* 0.212639005871510 */
+ png_ptr->rgb_to_gray_green_coeff = 23434; /* 0.715168678767756 */
+ /* png_ptr->rgb_to_gray_blue_coeff = 2366; 0.072192315360734 */
+
+ /* The following keeps the cHRM chunk from destroying the
+ * coefficients again in the event that it follows the sRGB chunk.
+ */
+ png_ptr->rgb_to_gray_coefficients_set = 1;
+ }
+# endif
+
png_set_sRGB_gAMA_and_cHRM(png_ptr, info_ptr, intent);
}
#endif /* PNG_READ_sRGB_SUPPORTED */
@@ -1154,13 +1257,16 @@ png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
/* Should be an error, but we can cope with it */
png_warning(png_ptr, "Out of place iCCP chunk");
- if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP))
+ if ((png_ptr->mode & PNG_HAVE_iCCP) || (info_ptr != NULL &&
+ (info_ptr->valid & (PNG_INFO_iCCP|PNG_INFO_sRGB))))
{
png_warning(png_ptr, "Duplicate iCCP chunk");
png_crc_finish(png_ptr, length);
return;
}
+ png_ptr->mode |= PNG_HAVE_iCCP;
+
#ifdef PNG_MAX_MALLOC_64K
if (length > (png_uint_32)65535L)
{
@@ -1172,7 +1278,7 @@ png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_free(png_ptr, png_ptr->chunkdata);
png_ptr->chunkdata = (png_charp)png_malloc(png_ptr, length + 1);
- slength = (png_size_t)length;
+ slength = length;
png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);
if (png_crc_finish(png_ptr, skip))
@@ -1240,23 +1346,15 @@ png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
/* And the following guarantees that profile_size == profile_length. */
if (profile_size > profile_length)
{
+ PNG_WARNING_PARAMETERS(p)
+
png_free(png_ptr, png_ptr->chunkdata);
png_ptr->chunkdata = NULL;
-#ifdef PNG_STDIO_SUPPORTED
- {
- char umsg[80];
-
- png_snprintf2(umsg, 80,
- "Ignoring iCCP chunk with declared size = %u "
- "and actual length = %u",
- (unsigned int) profile_size,
- (unsigned int) profile_length);
- png_warning(png_ptr, umsg);
- }
-#else
- png_warning(png_ptr,
- "Ignoring iCCP chunk with uncompressed size mismatch");
-#endif
+
+ png_warning_parameter_unsigned(p, 1, PNG_NUMBER_FORMAT_u, profile_size);
+ png_warning_parameter_unsigned(p, 2, PNG_NUMBER_FORMAT_u, profile_length);
+ png_formatted_warning(png_ptr, p,
+ "Ignoring iCCP chunk with declared size = @1 and actual length = @2");
return;
}
@@ -1275,9 +1373,7 @@ png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
png_bytep entry_start;
png_sPLT_t new_palette;
-#ifdef PNG_POINTER_INDEXING_SUPPORTED
png_sPLT_entryp pp;
-#endif
png_uint_32 data_length;
int entry_size, i;
png_uint_32 skip = 0;
@@ -1332,7 +1428,7 @@ png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
* that the PNG_MAX_MALLOC_64K test is enabled in this case, but this is a
* potential breakage point if the types in pngconf.h aren't exactly right.
*/
- slength = (png_size_t)length;
+ slength = length;
png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);
if (png_crc_finish(png_ptr, skip))
@@ -1442,7 +1538,7 @@ png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
pp[i].alpha = png_get_uint_16(entry_start); entry_start += 2;
}
- pp->frequency = png_get_uint_16(entry_start); entry_start += 2;
+ pp[i].frequency = png_get_uint_16(entry_start); entry_start += 2;
}
#endif
@@ -1567,6 +1663,7 @@ png_handle_bKGD(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
png_size_t truelen;
png_byte buf[6];
+ png_color_16 background;
png_debug(1, "in png_handle_bKGD");
@@ -1623,7 +1720,7 @@ png_handle_bKGD(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
*/
if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
{
- png_ptr->background.index = buf[0];
+ background.index = buf[0];
if (info_ptr && info_ptr->num_palette)
{
@@ -1633,33 +1730,36 @@ png_handle_bKGD(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
return;
}
- png_ptr->background.red =
- (png_uint_16)png_ptr->palette[buf[0]].red;
+ background.red = (png_uint_16)png_ptr->palette[buf[0]].red;
+ background.green = (png_uint_16)png_ptr->palette[buf[0]].green;
+ background.blue = (png_uint_16)png_ptr->palette[buf[0]].blue;
+ }
- png_ptr->background.green =
- (png_uint_16)png_ptr->palette[buf[0]].green;
+ else
+ background.red = background.green = background.blue = 0;
- png_ptr->background.blue =
- (png_uint_16)png_ptr->palette[buf[0]].blue;
- }
+ background.gray = 0;
}
else if (!(png_ptr->color_type & PNG_COLOR_MASK_COLOR)) /* GRAY */
{
- png_ptr->background.red =
- png_ptr->background.green =
- png_ptr->background.blue =
- png_ptr->background.gray = png_get_uint_16(buf);
+ background.index = 0;
+ background.red =
+ background.green =
+ background.blue =
+ background.gray = png_get_uint_16(buf);
}
else
{
- png_ptr->background.red = png_get_uint_16(buf);
- png_ptr->background.green = png_get_uint_16(buf + 2);
- png_ptr->background.blue = png_get_uint_16(buf + 4);
+ background.index = 0;
+ background.red = png_get_uint_16(buf);
+ background.green = png_get_uint_16(buf + 2);
+ background.blue = png_get_uint_16(buf + 4);
+ background.gray = 0;
}
- png_set_bKGD(png_ptr, info_ptr, &(png_ptr->background));
+ png_set_bKGD(png_ptr, info_ptr, &background);
}
#endif
@@ -1696,16 +1796,16 @@ png_handle_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
return;
}
- num = length / 2 ;
-
- if (num != (unsigned int)png_ptr->num_palette || num >
- (unsigned int)PNG_MAX_PALETTE_LENGTH)
+ if (length > 2*PNG_MAX_PALETTE_LENGTH ||
+ length != (unsigned int) (2*png_ptr->num_palette))
{
png_warning(png_ptr, "Incorrect hIST chunk length");
png_crc_finish(png_ptr, length);
return;
}
+ num = length / 2 ;
+
for (i = 0; i < num; i++)
{
png_byte buf[2];
@@ -1855,7 +1955,7 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
return;
}
- slength = (png_size_t)length;
+ slength = length;
png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);
if (png_crc_finish(png_ptr, 0))
@@ -1984,6 +2084,14 @@ png_handle_sCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
return;
}
+ /* Need unit type, width, \0, height: minimum 4 bytes */
+ else if (length < 4)
+ {
+ png_warning(png_ptr, "sCAL chunk too short");
+ png_crc_finish(png_ptr, length);
+ return;
+ }
+
png_debug1(2, "Allocating and reading sCAL chunk data (%u bytes)",
length + 1);
@@ -1996,7 +2104,7 @@ png_handle_sCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
return;
}
- slength = (png_size_t)length;
+ slength = length;
png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);
png_ptr->chunkdata[slength] = 0x00; /* Null terminate the last string */
@@ -2019,23 +2127,29 @@ png_handle_sCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
/* Validate the ASCII numbers, need two ASCII numbers separated by
* a '\0' and they need to fit exactly in the chunk data.
*/
- i = 0;
+ i = 1;
state = 0;
- if (png_ptr->chunkdata[1] == 45 /* negative width */ ||
- !png_check_fp_number(png_ptr->chunkdata, slength, &state, &i) ||
+ if (!png_check_fp_number(png_ptr->chunkdata, slength, &state, &i) ||
i >= slength || png_ptr->chunkdata[i++] != 0)
png_warning(png_ptr, "Invalid sCAL chunk ignored: bad width format");
+ else if (!PNG_FP_IS_POSITIVE(state))
+ png_warning(png_ptr, "Invalid sCAL chunk ignored: non-positive width");
+
else
{
png_size_t heighti = i;
- if (png_ptr->chunkdata[i] == 45 /* negative height */ ||
- !png_check_fp_number(png_ptr->chunkdata, slength, &state, &i) ||
+ state = 0;
+ if (!png_check_fp_number(png_ptr->chunkdata, slength, &state, &i) ||
i != slength)
png_warning(png_ptr, "Invalid sCAL chunk ignored: bad height format");
+ else if (!PNG_FP_IS_POSITIVE(state))
+ png_warning(png_ptr,
+ "Invalid sCAL chunk ignored: non-positive height");
+
else
/* This is the (only) success case. */
png_set_sCAL_s(png_ptr, info_ptr, png_ptr->chunkdata[0],
@@ -2150,7 +2264,7 @@ png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
return;
}
- slength = (png_size_t)length;
+ slength = length;
png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);
if (png_crc_finish(png_ptr, skip))
@@ -2258,7 +2372,7 @@ png_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
return;
}
- slength = (png_size_t)length;
+ slength = length;
png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);
if (png_crc_finish(png_ptr, 0))
@@ -2389,7 +2503,7 @@ png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
return;
}
- slength = (png_size_t)length;
+ slength = length;
png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);
if (png_crc_finish(png_ptr, 0))
@@ -2425,6 +2539,14 @@ png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
comp_type = *lang++;
}
+ if (comp_type || (comp_flag && comp_flag != PNG_TEXT_COMPRESSION_zTXt))
+ {
+ png_warning(png_ptr, "Unknown iTXt compression type or method");
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
+ return;
+ }
+
for (lang_key = lang; *lang_key; lang_key++)
/* Empty loop */ ;
@@ -2525,16 +2647,14 @@ png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
if (png_ptr->mode & PNG_HAVE_IDAT)
{
- PNG_IDAT;
-
- if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) /* Not an IDAT */
+ if (png_ptr->chunk_name != png_IDAT)
png_ptr->mode |= PNG_AFTER_IDAT;
}
- if (!(png_ptr->chunk_name[0] & 0x20))
+ if (PNG_CHUNK_CRITICAL(png_ptr->chunk_name))
{
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
- if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
+ if (png_chunk_unknown_handling(png_ptr, png_ptr->chunk_name) !=
PNG_HANDLE_CHUNK_ALWAYS
#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
&& png_ptr->read_user_chunk_fn == NULL
@@ -2552,21 +2672,20 @@ png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
)
{
#ifdef PNG_MAX_MALLOC_64K
- if (length > (png_uint_32)65535L)
+ if (length > 65535)
{
png_warning(png_ptr, "unknown chunk too large to fit in memory");
- skip = length - (png_uint_32)65535L;
- length = (png_uint_32)65535L;
+ skip = length - 65535;
+ length = 65535;
}
#endif
- png_memcpy((png_charp)png_ptr->unknown_chunk.name,
- (png_charp)png_ptr->chunk_name,
- png_sizeof(png_ptr->unknown_chunk.name));
-
- png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name)-1]
- = '\0';
-
+ /* TODO: this code is very close to the unknown handling in pngpread.c,
+ * maybe it can be put into a common utility routine?
+ * png_struct::unknown_chunk is just used as a temporary variable, along
+ * with the data into which the chunk is read. These can be eliminated.
+ */
+ PNG_CSTRING_FROM_CHUNK(png_ptr->unknown_chunk.name, png_ptr->chunk_name);
png_ptr->unknown_chunk.size = (png_size_t)length;
if (length == 0)
@@ -2575,7 +2694,7 @@ png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
else
{
png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, length);
- png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length);
+ png_crc_read(png_ptr, png_ptr->unknown_chunk.data, length);
}
#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
@@ -2592,10 +2711,10 @@ png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
if (ret == 0)
{
- if (!(png_ptr->chunk_name[0] & 0x20))
+ if (PNG_CHUNK_CRITICAL(png_ptr->chunk_name))
{
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
- if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
+ if (png_chunk_unknown_handling(png_ptr, png_ptr->chunk_name) !=
PNG_HANDLE_CHUNK_ALWAYS)
#endif
png_chunk_error(png_ptr, "unknown critical chunk");
@@ -2632,259 +2751,523 @@ png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
* the chunk name itself is valid.
*/
-#define isnonalpha(c) ((c) < 65 || (c) > 122 || ((c) > 90 && (c) < 97))
+/* Bit hacking: the test for an invalid byte in the 4 byte chunk name is:
+ *
+ * ((c) < 65 || (c) > 122 || ((c) > 90 && (c) < 97))
+ */
void /* PRIVATE */
-png_check_chunk_name(png_structp png_ptr, png_const_bytep chunk_name)
+png_check_chunk_name(png_structp png_ptr, png_uint_32 chunk_name)
{
+ int i;
+
png_debug(1, "in png_check_chunk_name");
- if (isnonalpha(chunk_name[0]) || isnonalpha(chunk_name[1]) ||
- isnonalpha(chunk_name[2]) || isnonalpha(chunk_name[3]))
+
+ for (i=1; i<=4; ++i)
{
- png_chunk_error(png_ptr, "invalid chunk type");
+ int c = chunk_name & 0xff;
+
+ if (c < 65 || c > 122 || (c > 90 && c < 97))
+ png_chunk_error(png_ptr, "invalid chunk type");
+
+ chunk_name >>= 8;
}
}
-/* Combines the row recently read in with the existing pixels in the
- * row. This routine takes care of alpha and transparency if requested.
- * This routine also handles the two methods of progressive display
- * of interlaced images, depending on the mask value.
- * The mask value describes which pixels are to be combined with
- * the row. The pattern always repeats every 8 pixels, so just 8
- * bits are needed. A one indicates the pixel is to be combined,
- * a zero indicates the pixel is to be skipped. This is in addition
- * to any alpha or transparency value associated with the pixel. If
- * you want all pixels to be combined, pass 0xff (255) in mask.
+/* Combines the row recently read in with the existing pixels in the row. This
+ * routine takes care of alpha and transparency if requested. This routine also
+ * handles the two methods of progressive display of interlaced images,
+ * depending on the 'display' value; if 'display' is true then the whole row
+ * (dp) is filled from the start by replicating the available pixels. If
+ * 'display' is false only those pixels present in the pass are filled in.
*/
-
void /* PRIVATE */
-png_combine_row(png_structp png_ptr, png_bytep row, int mask)
+png_combine_row(png_structp png_ptr, png_bytep dp, int display)
{
+ unsigned int pixel_depth = png_ptr->transformed_pixel_depth;
+ png_const_bytep sp = png_ptr->row_buf + 1;
+ png_uint_32 row_width = png_ptr->width;
+ unsigned int pass = png_ptr->pass;
+ png_bytep end_ptr = 0;
+ png_byte end_byte = 0;
+ unsigned int end_mask;
+
png_debug(1, "in png_combine_row");
- if (mask == 0xff)
- {
- png_memcpy(row, png_ptr->row_buf + 1,
- PNG_ROWBYTES(png_ptr->row_info.pixel_depth, png_ptr->width));
- }
+ /* Added in 1.5.6: it should not be possible to enter this routine until at
+ * least one row has been read from the PNG data and transformed.
+ */
+ if (pixel_depth == 0)
+ png_error(png_ptr, "internal row logic error");
- else
+ /* Added in 1.5.4: the pixel depth should match the information returned by
+ * any call to png_read_update_info at this point. Do not continue if we got
+ * this wrong.
+ */
+ if (png_ptr->info_rowbytes != 0 && png_ptr->info_rowbytes !=
+ PNG_ROWBYTES(pixel_depth, row_width))
+ png_error(png_ptr, "internal row size calculation error");
+
+ /* Don't expect this to ever happen: */
+ if (row_width == 0)
+ png_error(png_ptr, "internal row width error");
+
+ /* Preserve the last byte in cases where only part of it will be overwritten,
+ * the multiply below may overflow, we don't care because ANSI-C guarantees
+ * we get the low bits.
+ */
+ end_mask = (pixel_depth * row_width) & 7;
+ if (end_mask != 0)
+ {
+ /* end_ptr == NULL is a flag to say do nothing */
+ end_ptr = dp + PNG_ROWBYTES(pixel_depth, row_width) - 1;
+ end_byte = *end_ptr;
+# ifdef PNG_READ_PACKSWAP_SUPPORTED
+ if (png_ptr->transformations & PNG_PACKSWAP) /* little-endian byte */
+ end_mask = 0xff << end_mask;
+
+ else /* big-endian byte */
+# endif
+ end_mask = 0xff >> end_mask;
+ /* end_mask is now the bits to *keep* from the destination row */
+ }
+
+ /* For non-interlaced images this reduces to a png_memcpy(). A png_memcpy()
+ * will also happen if interlacing isn't supported or if the application
+ * does not call png_set_interlace_handling(). In the latter cases the
+ * caller just gets a sequence of the unexpanded rows from each interlace
+ * pass.
+ */
+#ifdef PNG_READ_INTERLACING_SUPPORTED
+ if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE) &&
+ pass < 6 && (display == 0 ||
+ /* The following copies everything for 'display' on passes 0, 2 and 4. */
+ (display == 1 && (pass & 1) != 0)))
{
- switch (png_ptr->row_info.pixel_depth)
+ /* Narrow images may have no bits in a pass; the caller should handle
+ * this, but this test is cheap:
+ */
+ if (row_width <= PNG_PASS_START_COL(pass))
+ return;
+
+ if (pixel_depth < 8)
{
- case 1:
+ /* For pixel depths up to 4 bpp the 8-pixel mask can be expanded to fit
+ * into 32 bits, then a single loop over the bytes using the four byte
+ * values in the 32-bit mask can be used. For the 'display' option the
+ * expanded mask may also not require any masking within a byte. To
+ * make this work the PACKSWAP option must be taken into account - it
+ * simply requires the pixels to be reversed in each byte.
+ *
+ * The 'regular' case requires a mask for each of the first 6 passes,
+ * the 'display' case does a copy for the even passes in the range
+ * 0..6. This has already been handled in the test above.
+ *
+ * The masks are arranged as four bytes with the first byte to use in
+ * the lowest bits (little-endian) regardless of the order (PACKSWAP or
+ * not) of the pixels in each byte.
+ *
+ * NOTE: the whole of this logic depends on the caller of this function
+ * only calling it on rows appropriate to the pass. This function only
+ * understands the 'x' logic; the 'y' logic is handled by the caller.
+ *
+ * The following defines allow generation of compile time constant bit
+ * masks for each pixel depth and each possibility of swapped or not
+ * swapped bytes. Pass 'p' is in the range 0..6; 'x', a pixel index,
+ * is in the range 0..7; and the result is 1 if the pixel is to be
+ * copied in the pass, 0 if not. 'S' is for the sparkle method, 'B'
+ * for the block method.
+ *
+ * With some compilers a compile time expression of the general form:
+ *
+ * (shift >= 32) ? (a >> (shift-32)) : (b >> shift)
+ *
+ * Produces warnings with values of 'shift' in the range 33 to 63
+ * because the right hand side of the ?: expression is evaluated by
+ * the compiler even though it isn't used. Microsoft Visual C (various
+ * versions) and the Intel C compiler are known to do this. To avoid
+ * this the following macros are used in 1.5.6. This is a temporary
+ * solution to avoid destabilizing the code during the release process.
+ */
+# if PNG_USE_COMPILE_TIME_MASKS
+# define PNG_LSR(x,s) ((x)>>((s) & 0x1f))
+# define PNG_LSL(x,s) ((x)<<((s) & 0x1f))
+# else
+# define PNG_LSR(x,s) ((x)>>(s))
+# define PNG_LSL(x,s) ((x)<<(s))
+# endif
+# define S_COPY(p,x) (((p)<4 ? PNG_LSR(0x80088822,(3-(p))*8+(7-(x))) :\
+ PNG_LSR(0xaa55ff00,(7-(p))*8+(7-(x)))) & 1)
+# define B_COPY(p,x) (((p)<4 ? PNG_LSR(0xff0fff33,(3-(p))*8+(7-(x))) :\
+ PNG_LSR(0xff55ff00,(7-(p))*8+(7-(x)))) & 1)
+
+ /* Return a mask for pass 'p' pixel 'x' at depth 'd'. The mask is
+ * little endian - the first pixel is at bit 0 - however the extra
+ * parameter 's' can be set to cause the mask position to be swapped
+ * within each byte, to match the PNG format. This is done by XOR of
+ * the shift with 7, 6 or 4 for bit depths 1, 2 and 4.
+ */
+# define PIXEL_MASK(p,x,d,s) \
+ (PNG_LSL(((PNG_LSL(1U,(d)))-1),(((x)*(d))^((s)?8-(d):0))))
+
+ /* Hence generate the appropriate 'block' or 'sparkle' pixel copy mask.
+ */
+# define S_MASKx(p,x,d,s) (S_COPY(p,x)?PIXEL_MASK(p,x,d,s):0)
+# define B_MASKx(p,x,d,s) (B_COPY(p,x)?PIXEL_MASK(p,x,d,s):0)
+
+ /* Combine 8 of these to get the full mask. For the 1-bpp and 2-bpp
+ * cases the result needs replicating, for the 4-bpp case the above
+ * generates a full 32 bits.
+ */
+# define MASK_EXPAND(m,d) ((m)*((d)==1?0x01010101:((d)==2?0x00010001:1)))
+
+# define S_MASK(p,d,s) MASK_EXPAND(S_MASKx(p,0,d,s) + S_MASKx(p,1,d,s) +\
+ S_MASKx(p,2,d,s) + S_MASKx(p,3,d,s) + S_MASKx(p,4,d,s) +\
+ S_MASKx(p,5,d,s) + S_MASKx(p,6,d,s) + S_MASKx(p,7,d,s), d)
+
+# define B_MASK(p,d,s) MASK_EXPAND(B_MASKx(p,0,d,s) + B_MASKx(p,1,d,s) +\
+ B_MASKx(p,2,d,s) + B_MASKx(p,3,d,s) + B_MASKx(p,4,d,s) +\
+ B_MASKx(p,5,d,s) + B_MASKx(p,6,d,s) + B_MASKx(p,7,d,s), d)
+
+#if PNG_USE_COMPILE_TIME_MASKS
+ /* Utility macros to construct all the masks for a depth/swap
+ * combination. The 's' parameter says whether the format is PNG
+ * (big endian bytes) or not. Only the three odd-numbered passes are
+ * required for the display/block algorithm.
+ */
+# define S_MASKS(d,s) { S_MASK(0,d,s), S_MASK(1,d,s), S_MASK(2,d,s),\
+ S_MASK(3,d,s), S_MASK(4,d,s), S_MASK(5,d,s) }
+
+# define B_MASKS(d,s) { B_MASK(1,d,s), S_MASK(3,d,s), S_MASK(5,d,s) }
+
+# define DEPTH_INDEX(d) ((d)==1?0:((d)==2?1:2))
+
+ /* Hence the pre-compiled masks indexed by PACKSWAP (or not), depth and
+ * then pass:
+ */
+ static PNG_CONST png_uint_32 row_mask[2/*PACKSWAP*/][3/*depth*/][6] =
{
- png_bytep sp = png_ptr->row_buf + 1;
- png_bytep dp = row;
- int s_inc, s_start, s_end;
- int m = 0x80;
- int shift;
- png_uint_32 i;
- png_uint_32 row_width = png_ptr->width;
-
-#ifdef PNG_READ_PACKSWAP_SUPPORTED
+ /* Little-endian byte masks for PACKSWAP */
+ { S_MASKS(1,0), S_MASKS(2,0), S_MASKS(4,0) },
+ /* Normal (big-endian byte) masks - PNG format */
+ { S_MASKS(1,1), S_MASKS(2,1), S_MASKS(4,1) }
+ };
+
+ /* display_mask has only three entries for the odd passes, so index by
+ * pass>>1.
+ */
+ static PNG_CONST png_uint_32 display_mask[2][3][3] =
+ {
+ /* Little-endian byte masks for PACKSWAP */
+ { B_MASKS(1,0), B_MASKS(2,0), B_MASKS(4,0) },
+ /* Normal (big-endian byte) masks - PNG format */
+ { B_MASKS(1,1), B_MASKS(2,1), B_MASKS(4,1) }
+ };
+
+# define MASK(pass,depth,display,png)\
+ ((display)?display_mask[png][DEPTH_INDEX(depth)][pass>>1]:\
+ row_mask[png][DEPTH_INDEX(depth)][pass])
+
+#else /* !PNG_USE_COMPILE_TIME_MASKS */
+ /* This is the runtime alternative: it seems unlikely that this will
+ * ever be either smaller or faster than the compile time approach.
+ */
+# define MASK(pass,depth,display,png)\
+ ((display)?B_MASK(pass,depth,png):S_MASK(pass,depth,png))
+#endif /* !PNG_USE_COMPILE_TIME_MASKS */
+
+ /* Use the appropriate mask to copy the required bits. In some cases
+ * the byte mask will be 0 or 0xff, optimize these cases. row_width is
+ * the number of pixels, but the code copies bytes, so it is necessary
+ * to special case the end.
+ */
+ png_uint_32 pixels_per_byte = 8 / pixel_depth;
+ png_uint_32 mask;
+
+# ifdef PNG_READ_PACKSWAP_SUPPORTED
if (png_ptr->transformations & PNG_PACKSWAP)
- {
- s_start = 0;
- s_end = 7;
- s_inc = 1;
- }
+ mask = MASK(pass, pixel_depth, display, 0);
else
-#endif
+# endif
+ mask = MASK(pass, pixel_depth, display, 1);
+
+ for (;;)
+ {
+ png_uint_32 m;
+
+ /* It doesn't matter in the following if png_uint_32 has more than
+ * 32 bits because the high bits always match those in m<<24; it is,
+ * however, essential to use OR here, not +, because of this.
+ */
+ m = mask;
+ mask = (m >> 8) | (m << 24); /* rotate right to good compilers */
+ m &= 0xff;
+
+ if (m != 0) /* something to copy */
{
- s_start = 7;
- s_end = 0;
- s_inc = -1;
+ if (m != 0xff)
+ *dp = (png_byte)((*dp & ~m) | (*sp & m));
+ else
+ *dp = *sp;
}
- shift = s_start;
+ /* NOTE: this may overwrite the last byte with garbage if the image
+ * is not an exact number of bytes wide; libpng has always done
+ * this.
+ */
+ if (row_width <= pixels_per_byte)
+ break; /* May need to restore part of the last byte */
- for (i = 0; i < row_width; i++)
- {
- if (m & mask)
- {
- int value;
+ row_width -= pixels_per_byte;
+ ++dp;
+ ++sp;
+ }
+ }
- value = (*sp >> shift) & 0x01;
- *dp &= (png_byte)((0x7f7f >> (7 - shift)) & 0xff);
- *dp |= (png_byte)(value << shift);
- }
+ else /* pixel_depth >= 8 */
+ {
+ unsigned int bytes_to_copy, bytes_to_jump;
- if (shift == s_end)
- {
- shift = s_start;
- sp++;
- dp++;
- }
+ /* Validate the depth - it must be a multiple of 8 */
+ if (pixel_depth & 7)
+ png_error(png_ptr, "invalid user transform pixel depth");
- else
- shift += s_inc;
+ pixel_depth >>= 3; /* now in bytes */
+ row_width *= pixel_depth;
- if (m == 1)
- m = 0x80;
+ /* Regardless of pass number the Adam 7 interlace always results in a
+ * fixed number of pixels to copy then to skip. There may be a
+ * different number of pixels to skip at the start though.
+ */
+ {
+ unsigned int offset = PNG_PASS_START_COL(pass) * pixel_depth;
- else
- m >>= 1;
- }
- break;
+ row_width -= offset;
+ dp += offset;
+ sp += offset;
}
- case 2:
+ /* Work out the bytes to copy. */
+ if (display)
{
- png_bytep sp = png_ptr->row_buf + 1;
- png_bytep dp = row;
- int s_start, s_end, s_inc;
- int m = 0x80;
- int shift;
- png_uint_32 i;
- png_uint_32 row_width = png_ptr->width;
- int value;
+ /* When doing the 'block' algorithm the pixel in the pass gets
+ * replicated to adjacent pixels. This is why the even (0,2,4,6)
+ * passes are skipped above - the entire expanded row is copied.
+ */
+ bytes_to_copy = (1<<((6-pass)>>1)) * pixel_depth;
-#ifdef PNG_READ_PACKSWAP_SUPPORTED
- if (png_ptr->transformations & PNG_PACKSWAP)
- {
- s_start = 0;
- s_end = 6;
- s_inc = 2;
- }
+ /* But don't allow this number to exceed the actual row width. */
+ if (bytes_to_copy > row_width)
+ bytes_to_copy = row_width;
+ }
- else
-#endif
- {
- s_start = 6;
- s_end = 0;
- s_inc = -2;
- }
+ else /* normal row; Adam7 only ever gives us one pixel to copy. */
+ bytes_to_copy = pixel_depth;
+
+ /* In Adam7 there is a constant offset between where the pixels go. */
+ bytes_to_jump = PNG_PASS_COL_OFFSET(pass) * pixel_depth;
+
+ /* And simply copy these bytes. Some optimization is possible here,
+ * depending on the value of 'bytes_to_copy'. Special case the low
+ * byte counts, which we know to be frequent.
+ *
+ * Notice that these cases all 'return' rather than 'break' - this
+ * avoids an unnecessary test on whether to restore the last byte
+ * below.
+ */
+ switch (bytes_to_copy)
+ {
+ case 1:
+ for (;;)
+ {
+ *dp = *sp;
- shift = s_start;
+ if (row_width <= bytes_to_jump)
+ return;
- for (i = 0; i < row_width; i++)
- {
- if (m & mask)
- {
- value = (*sp >> shift) & 0x03;
- *dp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff);
- *dp |= (png_byte)(value << shift);
+ dp += bytes_to_jump;
+ sp += bytes_to_jump;
+ row_width -= bytes_to_jump;
}
- if (shift == s_end)
+ case 2:
+ /* There is a possibility of a partial copy at the end here; this
+ * slows the code down somewhat.
+ */
+ do
{
- shift = s_start;
- sp++;
- dp++;
- }
+ dp[0] = sp[0], dp[1] = sp[1];
- else
- shift += s_inc;
+ if (row_width <= bytes_to_jump)
+ return;
- if (m == 1)
- m = 0x80;
+ sp += bytes_to_jump;
+ dp += bytes_to_jump;
+ row_width -= bytes_to_jump;
+ }
+ while (row_width > 1);
- else
- m >>= 1;
- }
- break;
- }
+ /* And there can only be one byte left at this point: */
+ *dp = *sp;
+ return;
- case 4:
- {
- png_bytep sp = png_ptr->row_buf + 1;
- png_bytep dp = row;
- int s_start, s_end, s_inc;
- int m = 0x80;
- int shift;
- png_uint_32 i;
- png_uint_32 row_width = png_ptr->width;
- int value;
-
-#ifdef PNG_READ_PACKSWAP_SUPPORTED
- if (png_ptr->transformations & PNG_PACKSWAP)
- {
- s_start = 0;
- s_end = 4;
- s_inc = 4;
- }
+ case 3:
+ /* This can only be the RGB case, so each copy is exactly one
+ * pixel and it is not necessary to check for a partial copy.
+ */
+ for(;;)
+ {
+ dp[0] = sp[0], dp[1] = sp[1], dp[2] = sp[2];
- else
-#endif
- {
- s_start = 4;
- s_end = 0;
- s_inc = -4;
- }
- shift = s_start;
+ if (row_width <= bytes_to_jump)
+ return;
- for (i = 0; i < row_width; i++)
- {
- if (m & mask)
- {
- value = (*sp >> shift) & 0xf;
- *dp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff);
- *dp |= (png_byte)(value << shift);
+ sp += bytes_to_jump;
+ dp += bytes_to_jump;
+ row_width -= bytes_to_jump;
}
- if (shift == s_end)
+ default:
+#if PNG_ALIGN_TYPE != PNG_ALIGN_NONE
+ /* Check for double byte alignment and, if possible, use a
+ * 16-bit copy. Don't attempt this for narrow images - ones that
+ * are less than an interlace panel wide. Don't attempt it for
+ * wide bytes_to_copy either - use the png_memcpy there.
+ */
+ if (bytes_to_copy < 16 /*else use png_memcpy*/ &&
+ png_isaligned(dp, png_uint_16) &&
+ png_isaligned(sp, png_uint_16) &&
+ bytes_to_copy % sizeof (png_uint_16) == 0 &&
+ bytes_to_jump % sizeof (png_uint_16) == 0)
{
- shift = s_start;
- sp++;
- dp++;
+ /* Everything is aligned for png_uint_16 copies, but try for
+ * png_uint_32 first.
+ */
+ if (png_isaligned(dp, png_uint_32) &&
+ png_isaligned(sp, png_uint_32) &&
+ bytes_to_copy % sizeof (png_uint_32) == 0 &&
+ bytes_to_jump % sizeof (png_uint_32) == 0)
+ {
+ png_uint_32p dp32 = (png_uint_32p)dp;
+ png_const_uint_32p sp32 = (png_const_uint_32p)sp;
+ unsigned int skip = (bytes_to_jump-bytes_to_copy) /
+ sizeof (png_uint_32);
+
+ do
+ {
+ size_t c = bytes_to_copy;
+ do
+ {
+ *dp32++ = *sp32++;
+ c -= sizeof (png_uint_32);
+ }
+ while (c > 0);
+
+ if (row_width <= bytes_to_jump)
+ return;
+
+ dp32 += skip;
+ sp32 += skip;
+ row_width -= bytes_to_jump;
+ }
+ while (bytes_to_copy <= row_width);
+
+ /* Get to here when the row_width truncates the final copy.
+ * There will be 1-3 bytes left to copy, so don't try the
+ * 16-bit loop below.
+ */
+ dp = (png_bytep)dp32;
+ sp = (png_const_bytep)sp32;
+ do
+ *dp++ = *sp++;
+ while (--row_width > 0);
+ return;
+ }
+
+ /* Else do it in 16-bit quantities, but only if the size is
+ * not too large.
+ */
+ else
+ {
+ png_uint_16p dp16 = (png_uint_16p)dp;
+ png_const_uint_16p sp16 = (png_const_uint_16p)sp;
+ unsigned int skip = (bytes_to_jump-bytes_to_copy) /
+ sizeof (png_uint_16);
+
+ do
+ {
+ size_t c = bytes_to_copy;
+ do
+ {
+ *dp16++ = *sp16++;
+ c -= sizeof (png_uint_16);
+ }
+ while (c > 0);
+
+ if (row_width <= bytes_to_jump)
+ return;
+
+ dp16 += skip;
+ sp16 += skip;
+ row_width -= bytes_to_jump;
+ }
+ while (bytes_to_copy <= row_width);
+
+ /* End of row - 1 byte left, bytes_to_copy > row_width: */
+ dp = (png_bytep)dp16;
+ sp = (png_const_bytep)sp16;
+ do
+ *dp++ = *sp++;
+ while (--row_width > 0);
+ return;
+ }
}
+#endif /* PNG_ALIGN_ code */
- else
- shift += s_inc;
+ /* The true default - use a png_memcpy: */
+ for (;;)
+ {
+ png_memcpy(dp, sp, bytes_to_copy);
- if (m == 1)
- m = 0x80;
+ if (row_width <= bytes_to_jump)
+ return;
- else
- m >>= 1;
- }
- break;
+ sp += bytes_to_jump;
+ dp += bytes_to_jump;
+ row_width -= bytes_to_jump;
+ if (bytes_to_copy > row_width)
+ bytes_to_copy = row_width;
+ }
}
- default:
- {
- png_bytep sp = png_ptr->row_buf + 1;
- png_bytep dp = row;
- png_size_t pixel_bytes = (png_ptr->row_info.pixel_depth >> 3);
- png_uint_32 i;
- png_uint_32 row_width = png_ptr->width;
- png_byte m = 0x80;
-
- for (i = 0; i < row_width; i++)
- {
- if (m & mask)
- {
- png_memcpy(dp, sp, pixel_bytes);
- }
+ /* NOT REACHED*/
+ } /* pixel_depth >= 8 */
- sp += pixel_bytes;
- dp += pixel_bytes;
+ /* Here if pixel_depth < 8 to check 'end_ptr' below. */
+ }
+ else
+#endif
- if (m == 1)
- m = 0x80;
+ /* If here then the switch above wasn't used so just png_memcpy the whole row
+ * from the temporary row buffer (notice that this overwrites the end of the
+ * destination row if it is a partial byte.)
+ */
+ png_memcpy(dp, sp, PNG_ROWBYTES(pixel_depth, row_width));
- else
- m >>= 1;
- }
- break;
- }
- }
- }
+ /* Restore the overwritten bits from the last byte if necessary. */
+ if (end_ptr != NULL)
+ *end_ptr = (png_byte)((end_byte & end_mask) | (*end_ptr & ~end_mask));
}
#ifdef PNG_READ_INTERLACING_SUPPORTED
void /* PRIVATE */
-png_do_read_interlace(png_structp png_ptr)
+png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
+ png_uint_32 transformations /* Because these may affect the byte layout */)
{
- png_row_infop row_info = &(png_ptr->row_info);
- png_bytep row = png_ptr->row_buf + 1;
- int pass = png_ptr->pass;
- png_uint_32 transformations = png_ptr->transformations;
/* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
/* Offset to next interlace block */
- PNG_CONST int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
+ static PNG_CONST int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
png_debug(1, "in png_do_read_interlace");
if (row != NULL && row_info != NULL)
@@ -3049,7 +3432,7 @@ png_do_read_interlace(png_structp png_ptr)
for (i = 0; i < row_info->width; i++)
{
- png_byte v = (png_byte)((*sp >> sshift) & 0xf);
+ png_byte v = (png_byte)((*sp >> sshift) & 0x0f);
int j;
for (j = 0; j < jstop; j++)
@@ -3078,6 +3461,7 @@ png_do_read_interlace(png_structp png_ptr)
}
break;
}
+
default:
{
png_size_t pixel_bytes = (row_info->pixel_depth >> 3);
@@ -3108,6 +3492,7 @@ png_do_read_interlace(png_structp png_ptr)
break;
}
}
+
row_info->width = final_width;
row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, final_width);
}
@@ -3117,132 +3502,252 @@ png_do_read_interlace(png_structp png_ptr)
}
#endif /* PNG_READ_INTERLACING_SUPPORTED */
-void /* PRIVATE */
-png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row,
- png_const_bytep prev_row, int filter)
+static void
+png_read_filter_row_sub(png_row_infop row_info, png_bytep row,
+ png_const_bytep prev_row)
{
- png_debug(1, "in png_read_filter_row");
- png_debug2(2, "row = %u, filter = %d", png_ptr->row_number, filter);
- switch (filter)
+ png_size_t i;
+ png_size_t istop = row_info->rowbytes;
+ unsigned int bpp = (row_info->pixel_depth + 7) >> 3;
+ png_bytep rp = row + bpp;
+
+ PNG_UNUSED(prev_row)
+
+ for (i = bpp; i < istop; i++)
{
- case PNG_FILTER_VALUE_NONE:
- break;
+ *rp = (png_byte)(((int)(*rp) + (int)(*(rp-bpp))) & 0xff);
+ rp++;
+ }
+}
- case PNG_FILTER_VALUE_SUB:
- {
- png_size_t i;
- png_size_t istop = row_info->rowbytes;
- unsigned int bpp = (row_info->pixel_depth + 7) >> 3;
- png_bytep rp = row + bpp;
- png_bytep lp = row;
+static void
+png_read_filter_row_up(png_row_infop row_info, png_bytep row,
+ png_const_bytep prev_row)
+{
+ png_size_t i;
+ png_size_t istop = row_info->rowbytes;
+ png_bytep rp = row;
+ png_const_bytep pp = prev_row;
- for (i = bpp; i < istop; i++)
- {
- *rp = (png_byte)(((int)(*rp) + (int)(*lp++)) & 0xff);
- rp++;
- }
- break;
- }
- case PNG_FILTER_VALUE_UP:
- {
- png_size_t i;
- png_size_t istop = row_info->rowbytes;
- png_bytep rp = row;
- png_const_bytep pp = prev_row;
+ for (i = 0; i < istop; i++)
+ {
+ *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff);
+ rp++;
+ }
+}
- for (i = 0; i < istop; i++)
- {
- *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff);
- rp++;
- }
- break;
- }
- case PNG_FILTER_VALUE_AVG:
- {
- png_size_t i;
- png_bytep rp = row;
- png_const_bytep pp = prev_row;
- png_bytep lp = row;
- unsigned int bpp = (row_info->pixel_depth + 7) >> 3;
- png_size_t istop = row_info->rowbytes - bpp;
-
- for (i = 0; i < bpp; i++)
- {
- *rp = (png_byte)(((int)(*rp) +
- ((int)(*pp++) / 2 )) & 0xff);
+static void
+png_read_filter_row_avg(png_row_infop row_info, png_bytep row,
+ png_const_bytep prev_row)
+{
+ png_size_t i;
+ png_bytep rp = row;
+ png_const_bytep pp = prev_row;
+ unsigned int bpp = (row_info->pixel_depth + 7) >> 3;
+ png_size_t istop = row_info->rowbytes - bpp;
- rp++;
- }
+ for (i = 0; i < bpp; i++)
+ {
+ *rp = (png_byte)(((int)(*rp) +
+ ((int)(*pp++) / 2 )) & 0xff);
- for (i = 0; i < istop; i++)
- {
- *rp = (png_byte)(((int)(*rp) +
- (int)(*pp++ + *lp++) / 2 ) & 0xff);
+ rp++;
+ }
- rp++;
- }
- break;
- }
- case PNG_FILTER_VALUE_PAETH:
- {
- png_size_t i;
- png_bytep rp = row;
- png_const_bytep pp = prev_row;
- png_bytep lp = row;
- png_const_bytep cp = prev_row;
- unsigned int bpp = (row_info->pixel_depth + 7) >> 3;
- png_size_t istop=row_info->rowbytes - bpp;
-
- for (i = 0; i < bpp; i++)
- {
- *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff);
- rp++;
- }
+ for (i = 0; i < istop; i++)
+ {
+ *rp = (png_byte)(((int)(*rp) +
+ (int)(*pp++ + *(rp-bpp)) / 2 ) & 0xff);
- for (i = 0; i < istop; i++) /* Use leftover rp,pp */
- {
- int a, b, c, pa, pb, pc, p;
+ rp++;
+ }
+}
- a = *lp++;
- b = *pp++;
- c = *cp++;
+static void
+png_read_filter_row_paeth_1byte_pixel(png_row_infop row_info, png_bytep row,
+ png_const_bytep prev_row)
+{
+ png_bytep rp_end = row + row_info->rowbytes;
+ int a, c;
- p = b - c;
- pc = a - c;
+ /* First pixel/byte */
+ c = *prev_row++;
+ a = *row + c;
+ *row++ = (png_byte)a;
-#ifdef PNG_USE_ABS
- pa = abs(p);
- pb = abs(pc);
- pc = abs(p + pc);
-#else
- pa = p < 0 ? -p : p;
- pb = pc < 0 ? -pc : pc;
- pc = (p + pc) < 0 ? -(p + pc) : p + pc;
-#endif
+ /* Remainder */
+ while (row < rp_end)
+ {
+ int b, pa, pb, pc, p;
- /*
- if (pa <= pb && pa <= pc)
- p = a;
+ a &= 0xff; /* From previous iteration or start */
+ b = *prev_row++;
- else if (pb <= pc)
- p = b;
+ p = b - c;
+ pc = a - c;
- else
- p = c;
- */
+# ifdef PNG_USE_ABS
+ pa = abs(p);
+ pb = abs(pc);
+ pc = abs(p + pc);
+# else
+ pa = p < 0 ? -p : p;
+ pb = pc < 0 ? -pc : pc;
+ pc = (p + pc) < 0 ? -(p + pc) : p + pc;
+# endif
- p = (pa <= pb && pa <= pc) ? a : (pb <= pc) ? b : c;
+ /* Find the best predictor, the least of pa, pb, pc favoring the earlier
+ * ones in the case of a tie.
+ */
+ if (pb < pa) pa = pb, a = b;
+ if (pc < pa) a = c;
- *rp = (png_byte)(((int)(*rp) + p) & 0xff);
- rp++;
- }
+ /* Calculate the current pixel in a, and move the previous row pixel to c
+ * for the next time round the loop
+ */
+ c = b;
+ a += *row;
+ *row++ = (png_byte)a;
+ }
+}
+
+static void
+png_read_filter_row_paeth_multibyte_pixel(png_row_infop row_info, png_bytep row,
+ png_const_bytep prev_row)
+{
+ int bpp = (row_info->pixel_depth + 7) >> 3;
+ png_bytep rp_end = row + bpp;
+
+ /* Process the first pixel in the row completely (this is the same as 'up'
+ * because there is only one candidate predictor for the first row).
+ */
+ while (row < rp_end)
+ {
+ int a = *row + *prev_row++;
+ *row++ = (png_byte)a;
+ }
+
+ /* Remainder */
+ rp_end += row_info->rowbytes - bpp;
+
+ while (row < rp_end)
+ {
+ int a, b, c, pa, pb, pc, p;
+
+ c = *(prev_row - bpp);
+ a = *(row - bpp);
+ b = *prev_row++;
+
+ p = b - c;
+ pc = a - c;
+
+# ifdef PNG_USE_ABS
+ pa = abs(p);
+ pb = abs(pc);
+ pc = abs(p + pc);
+# else
+ pa = p < 0 ? -p : p;
+ pb = pc < 0 ? -pc : pc;
+ pc = (p + pc) < 0 ? -(p + pc) : p + pc;
+# endif
+
+ if (pb < pa) pa = pb, a = b;
+ if (pc < pa) a = c;
+
+ c = b;
+ a += *row;
+ *row++ = (png_byte)a;
+ }
+}
+
+#ifdef PNG_ARM_NEON
+
+#ifdef __linux__
+#include <stdio.h>
+#include <elf.h>
+#include <asm/hwcap.h>
+
+static int png_have_hwcap(unsigned cap)
+{
+ FILE *f = fopen("/proc/self/auxv", "r");
+ Elf32_auxv_t aux;
+ int have_cap = 0;
+
+ if (!f)
+ return 0;
+
+ while (fread(&aux, sizeof(aux), 1, f) > 0)
+ {
+ if (aux.a_type == AT_HWCAP &&
+ aux.a_un.a_val & cap)
+ {
+ have_cap = 1;
break;
}
- default:
- png_error(png_ptr, "Ignoring bad adaptive filter type");
- /*NOT REACHED */
- break;
}
+
+ fclose(f);
+
+ return have_cap;
+}
+#endif /* __linux__ */
+
+static void
+png_init_filter_functions_neon(png_structp pp, unsigned int bpp)
+{
+#ifdef __linux__
+ if (!png_have_hwcap(HWCAP_NEON))
+ return;
+#endif
+
+ pp->read_filter[PNG_FILTER_VALUE_UP-1] = png_read_filter_row_up_neon;
+
+ if (bpp == 3)
+ {
+ pp->read_filter[PNG_FILTER_VALUE_SUB-1] = png_read_filter_row_sub3_neon;
+ pp->read_filter[PNG_FILTER_VALUE_AVG-1] = png_read_filter_row_avg3_neon;
+ pp->read_filter[PNG_FILTER_VALUE_PAETH-1] =
+ png_read_filter_row_paeth3_neon;
+ }
+
+ else if (bpp == 4)
+ {
+ pp->read_filter[PNG_FILTER_VALUE_SUB-1] = png_read_filter_row_sub4_neon;
+ pp->read_filter[PNG_FILTER_VALUE_AVG-1] = png_read_filter_row_avg4_neon;
+ pp->read_filter[PNG_FILTER_VALUE_PAETH-1] =
+ png_read_filter_row_paeth4_neon;
+ }
+}
+#endif /* PNG_ARM_NEON */
+
+static void
+png_init_filter_functions(png_structp pp)
+{
+ unsigned int bpp = (pp->pixel_depth + 7) >> 3;
+
+ pp->read_filter[PNG_FILTER_VALUE_SUB-1] = png_read_filter_row_sub;
+ pp->read_filter[PNG_FILTER_VALUE_UP-1] = png_read_filter_row_up;
+ pp->read_filter[PNG_FILTER_VALUE_AVG-1] = png_read_filter_row_avg;
+ if (bpp == 1)
+ pp->read_filter[PNG_FILTER_VALUE_PAETH-1] =
+ png_read_filter_row_paeth_1byte_pixel;
+ else
+ pp->read_filter[PNG_FILTER_VALUE_PAETH-1] =
+ png_read_filter_row_paeth_multibyte_pixel;
+
+#ifdef PNG_ARM_NEON
+ png_init_filter_functions_neon(pp, bpp);
+#endif
+}
+
+void /* PRIVATE */
+png_read_filter_row(png_structp pp, png_row_infop row_info, png_bytep row,
+ png_const_bytep prev_row, int filter)
+{
+ if (pp->read_filter[0] == NULL)
+ png_init_filter_functions(pp);
+ if (filter > PNG_FILTER_VALUE_NONE && filter < PNG_FILTER_VALUE_LAST)
+ pp->read_filter[filter-1](row_info, row, prev_row);
}
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
@@ -3253,16 +3758,16 @@ png_read_finish_row(png_structp png_ptr)
/* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
/* Start of interlace block */
- PNG_CONST int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
+ static PNG_CONST png_byte png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
/* Offset to next interlace block */
- PNG_CONST int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
+ static PNG_CONST png_byte png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
/* Start of interlace block in the y direction */
- PNG_CONST int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};
+ static PNG_CONST png_byte png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};
/* Offset to next interlace block in the y direction */
- PNG_CONST int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
+ static PNG_CONST png_byte png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
#endif /* PNG_READ_INTERLACING_SUPPORTED */
png_debug(1, "in png_read_finish_row");
@@ -3275,6 +3780,9 @@ png_read_finish_row(png_structp png_ptr)
{
png_ptr->row_number = 0;
+ /* TO DO: don't do this if prev_row isn't needed (requires
+ * read-ahead of the next row's filter byte.
+ */
png_memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1);
do
@@ -3309,7 +3817,6 @@ png_read_finish_row(png_structp png_ptr)
if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
{
- PNG_IDAT;
char extra;
int ret;
@@ -3324,7 +3831,7 @@ png_read_finish_row(png_structp png_ptr)
{
png_crc_finish(png_ptr, 0);
png_ptr->idat_size = png_read_chunk_header(png_ptr);
- if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
+ if (png_ptr->chunk_name != png_IDAT)
png_error(png_ptr, "Not enough image data");
}
@@ -3383,16 +3890,16 @@ png_read_start_row(png_structp png_ptr)
/* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
/* Start of interlace block */
- PNG_CONST int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
+ static PNG_CONST png_byte png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
/* Offset to next interlace block */
- PNG_CONST int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
+ static PNG_CONST png_byte png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
/* Start of interlace block in the y direction */
- PNG_CONST int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};
+ static PNG_CONST png_byte png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};
/* Offset to next interlace block in the y direction */
- PNG_CONST int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
+ static PNG_CONST png_byte png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
#endif
int max_pixel_depth;
@@ -3400,7 +3907,9 @@ png_read_start_row(png_structp png_ptr)
png_debug(1, "in png_read_start_row");
png_ptr->zstream.avail_in = 0;
+#ifdef PNG_READ_TRANSFORMS_SUPPORTED
png_init_read_transformations(png_ptr);
+#endif
#ifdef PNG_READ_INTERLACING_SUPPORTED
if (png_ptr->interlaced)
{
@@ -3426,6 +3935,16 @@ png_read_start_row(png_structp png_ptr)
max_pixel_depth = png_ptr->pixel_depth;
+ /* WARNING: * png_read_transform_info (pngrtran.c) performs a simpliar set of
+ * calculations to calculate the final pixel depth, then
+ * png_do_read_transforms actually does the transforms. This means that the
+ * code which effectively calculates this value is actually repeated in three
+ * separate places. They must all match. Innocent changes to the order of
+ * transformations can and will break libpng in a way that causes memory
+ * overwrites.
+ *
+ * TODO: fix this.
+ */
#ifdef PNG_READ_PACK_SUPPORTED
if ((png_ptr->transformations & PNG_PACK) && png_ptr->bit_depth < 8)
max_pixel_depth = 8;
@@ -3463,13 +3982,28 @@ png_read_start_row(png_structp png_ptr)
}
#endif
+#ifdef PNG_READ_EXPAND_16_SUPPORTED
+ if (png_ptr->transformations & PNG_EXPAND_16)
+ {
+# ifdef PNG_READ_EXPAND_SUPPORTED
+ /* In fact it is an error if it isn't supported, but checking is
+ * the safe way.
+ */
+ if (png_ptr->transformations & PNG_EXPAND)
+ {
+ if (png_ptr->bit_depth < 16)
+ max_pixel_depth *= 2;
+ }
+ else
+# endif
+ png_ptr->transformations &= ~PNG_EXPAND_16;
+ }
+#endif
+
#ifdef PNG_READ_FILLER_SUPPORTED
if (png_ptr->transformations & (PNG_FILLER))
{
- if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
- max_pixel_depth = 32;
-
- else if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY)
+ if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY)
{
if (max_pixel_depth <= 8)
max_pixel_depth = 16;
@@ -3478,7 +4012,8 @@ png_read_start_row(png_structp png_ptr)
max_pixel_depth = 32;
}
- else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB)
+ else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB ||
+ png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
{
if (max_pixel_depth <= 32)
max_pixel_depth = 32;
@@ -3532,14 +4067,20 @@ png_read_start_row(png_structp png_ptr)
defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
if (png_ptr->transformations & PNG_USER_TRANSFORM)
{
- int user_pixel_depth = png_ptr->user_transform_depth*
+ int user_pixel_depth = png_ptr->user_transform_depth *
png_ptr->user_transform_channels;
if (user_pixel_depth > max_pixel_depth)
- max_pixel_depth=user_pixel_depth;
+ max_pixel_depth = user_pixel_depth;
}
#endif
+ /* This value is stored in png_struct and double checked in the row read
+ * code.
+ */
+ png_ptr->maximum_pixel_depth = (png_byte)max_pixel_depth;
+ png_ptr->transformed_pixel_depth = 0; /* calculated on demand */
+
/* Align the width on the next larger 8 pixels. Mainly used
* for interlacing
*/
@@ -3558,28 +4099,39 @@ defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
if (row_bytes + 48 > png_ptr->old_big_row_buf_size)
{
png_free(png_ptr, png_ptr->big_row_buf);
+ png_free(png_ptr, png_ptr->big_prev_row);
if (png_ptr->interlaced)
png_ptr->big_row_buf = (png_bytep)png_calloc(png_ptr,
row_bytes + 48);
else
- png_ptr->big_row_buf = (png_bytep)png_malloc(png_ptr,
- row_bytes + 48);
+ png_ptr->big_row_buf = (png_bytep)png_malloc(png_ptr, row_bytes + 48);
- png_ptr->old_big_row_buf_size = row_bytes + 48;
+ png_ptr->big_prev_row = (png_bytep)png_malloc(png_ptr, row_bytes + 48);
#ifdef PNG_ALIGNED_MEMORY_SUPPORTED
/* Use 16-byte aligned memory for row_buf with at least 16 bytes
- * of padding before and after row_buf.
+ * of padding before and after row_buf; treat prev_row similarly.
+ * NOTE: the alignment is to the start of the pixels, one beyond the start
+ * of the buffer, because of the filter byte. Prior to libpng 1.5.6 this
+ * was incorrect; the filter byte was aligned, which had the exact
+ * opposite effect of that intended.
*/
- png_ptr->row_buf = png_ptr->big_row_buf + 32 -
- (((png_alloc_size_t)png_ptr->big_row_buf + 15) & 0x0F);
+ {
+ png_bytep temp = png_ptr->big_row_buf + 32;
+ int extra = (int)((temp - (png_bytep)0) & 0x0f);
+ png_ptr->row_buf = temp - extra - 1/*filter byte*/;
+
+ temp = png_ptr->big_prev_row + 32;
+ extra = (int)((temp - (png_bytep)0) & 0x0f);
+ png_ptr->prev_row = temp - extra - 1/*filter byte*/;
+ }
- png_ptr->old_big_row_buf_size = row_bytes + 48;
#else
- /* Use 32 bytes of padding before and 16 bytes after row_buf. */
- png_ptr->row_buf = png_ptr->big_row_buf + 32;
+ /* Use 31 bytes of padding before and 17 bytes after row_buf. */
+ png_ptr->row_buf = png_ptr->big_row_buf + 31;
+ png_ptr->prev_row = png_ptr->big_prev_row + 31;
#endif
png_ptr->old_big_row_buf_size = row_bytes + 48;
}
@@ -3592,15 +4144,6 @@ defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
if (png_ptr->rowbytes > (PNG_SIZE_MAX - 1))
png_error(png_ptr, "Row has too many bytes to allocate in memory");
- if (png_ptr->rowbytes + 1 > png_ptr->old_prev_row_size)
- {
- png_free(png_ptr, png_ptr->prev_row);
-
- png_ptr->prev_row = (png_bytep)png_malloc(png_ptr, png_ptr->rowbytes + 1);
-
- png_ptr->old_prev_row_size = png_ptr->rowbytes + 1;
- }
-
png_memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1);
png_debug1(3, "width = %u,", png_ptr->width);
diff --git a/src/3rdparty/libpng/pngset.c b/src/3rdparty/libpng/pngset.c
index 2cfcf33bdf..e0118fa8c2 100644
--- a/src/3rdparty/libpng/pngset.c
+++ b/src/3rdparty/libpng/pngset.c
@@ -1,8 +1,8 @@
/* pngset.c - storage of image information into info struct
*
- * Last changed in libpng 1.5.1 [February 3, 2011]
- * Copyright (c) 1998-2011 Glenn Randers-Pehrson
+ * Last changed in libpng 1.5.10 [(PENDING RELEASE)]
+ * Copyright (c) 1998-2012 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -64,6 +64,39 @@ png_set_cHRM_fixed(png_structp png_ptr, png_infop info_ptr,
}
}
+void PNGFAPI
+png_set_cHRM_XYZ_fixed(png_structp png_ptr, png_infop info_ptr,
+ png_fixed_point int_red_X, png_fixed_point int_red_Y,
+ png_fixed_point int_red_Z, png_fixed_point int_green_X,
+ png_fixed_point int_green_Y, png_fixed_point int_green_Z,
+ png_fixed_point int_blue_X, png_fixed_point int_blue_Y,
+ png_fixed_point int_blue_Z)
+{
+ png_XYZ XYZ;
+ png_xy xy;
+
+ png_debug1(1, "in %s storage function", "cHRM XYZ fixed");
+
+ if (png_ptr == NULL || info_ptr == NULL)
+ return;
+
+ XYZ.redX = int_red_X;
+ XYZ.redY = int_red_Y;
+ XYZ.redZ = int_red_Z;
+ XYZ.greenX = int_green_X;
+ XYZ.greenY = int_green_Y;
+ XYZ.greenZ = int_green_Z;
+ XYZ.blueX = int_blue_X;
+ XYZ.blueY = int_blue_Y;
+ XYZ.blueZ = int_blue_Z;
+
+ if (png_xy_from_XYZ(&xy, XYZ))
+ png_error(png_ptr, "XYZ values out of representable range");
+
+ png_set_cHRM_fixed(png_ptr, info_ptr, xy.whitex, xy.whitey, xy.redx, xy.redy,
+ xy.greenx, xy.greeny, xy.bluex, xy.bluey);
+}
+
# ifdef PNG_FLOATING_POINT_SUPPORTED
void PNGAPI
png_set_cHRM(png_structp png_ptr, png_infop info_ptr,
@@ -80,6 +113,23 @@ png_set_cHRM(png_structp png_ptr, png_infop info_ptr,
png_fixed(png_ptr, blue_x, "cHRM Blue X"),
png_fixed(png_ptr, blue_y, "cHRM Blue Y"));
}
+
+void PNGAPI
+png_set_cHRM_XYZ(png_structp png_ptr, png_infop info_ptr, double red_X,
+ double red_Y, double red_Z, double green_X, double green_Y, double green_Z,
+ double blue_X, double blue_Y, double blue_Z)
+{
+ png_set_cHRM_XYZ_fixed(png_ptr, info_ptr,
+ png_fixed(png_ptr, red_X, "cHRM Red X"),
+ png_fixed(png_ptr, red_Y, "cHRM Red Y"),
+ png_fixed(png_ptr, red_Z, "cHRM Red Z"),
+ png_fixed(png_ptr, green_X, "cHRM Red X"),
+ png_fixed(png_ptr, green_Y, "cHRM Red Y"),
+ png_fixed(png_ptr, green_Z, "cHRM Red Z"),
+ png_fixed(png_ptr, blue_X, "cHRM Red X"),
+ png_fixed(png_ptr, blue_Y, "cHRM Red Y"),
+ png_fixed(png_ptr, blue_Z, "cHRM Red Z"));
+}
# endif /* PNG_FLOATING_POINT_SUPPORTED */
#endif /* PNG_cHRM_SUPPORTED */
@@ -94,15 +144,16 @@ png_set_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, png_fixed_point
if (png_ptr == NULL || info_ptr == NULL)
return;
- /* Previously these values were limited, however they must be
- * wrong, therefore storing them (and setting PNG_INFO_gAMA)
- * must be wrong too.
+ /* Changed in libpng-1.5.4 to limit the values to ensure overflow can't
+ * occur. Since the fixed point representation is assymetrical it is
+ * possible for 1/gamma to overflow the limit of 21474 and this means the
+ * gamma value must be at least 5/100000 and hence at most 20000.0. For
+ * safety the limits here are a little narrower. The values are 0.00016 to
+ * 6250.0, which are truly ridiculous gammma values (and will produce
+ * displays that are all black or all white.)
*/
- if (file_gamma > (png_fixed_point)PNG_UINT_31_MAX)
- png_warning(png_ptr, "Gamma too large, ignored");
-
- else if (file_gamma <= 0)
- png_warning(png_ptr, "Negative or zero gamma ignored");
+ if (file_gamma < 16 || file_gamma > 625000000)
+ png_warning(png_ptr, "Out of range gamma value ignored");
else
{
@@ -340,12 +391,12 @@ png_set_sCAL_s(png_structp png_ptr, png_infop info_ptr,
if (unit != 1 && unit != 2)
png_error(png_ptr, "Invalid sCAL unit");
- if (swidth == NULL || (lengthw = png_strlen(swidth)) <= 0 ||
- swidth[0] == 45 /*'-'*/ || !png_check_fp_string(swidth, lengthw))
+ if (swidth == NULL || (lengthw = png_strlen(swidth)) == 0 ||
+ swidth[0] == 45 /* '-' */ || !png_check_fp_string(swidth, lengthw))
png_error(png_ptr, "Invalid sCAL width");
- if (sheight == NULL || (lengthh = png_strlen(sheight)) <= 0 ||
- sheight[0] == 45 /*'-'*/ || !png_check_fp_string(sheight, lengthh))
+ if (sheight == NULL || (lengthh = png_strlen(sheight)) == 0 ||
+ sheight[0] == 45 /* '-' */ || !png_check_fp_string(sheight, lengthh))
png_error(png_ptr, "Invalid sCAL height");
info_ptr->scal_unit = (png_byte)unit;
@@ -545,16 +596,16 @@ png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr,
png_set_sRGB(png_ptr, info_ptr, srgb_intent);
# ifdef PNG_gAMA_SUPPORTED
- png_set_gAMA_fixed(png_ptr, info_ptr, 45455L);
+ png_set_gAMA_fixed(png_ptr, info_ptr, PNG_GAMMA_sRGB_INVERSE);
# endif
# ifdef PNG_cHRM_SUPPORTED
png_set_cHRM_fixed(png_ptr, info_ptr,
/* color x y */
- /* white */ 31270L, 32900L,
- /* red */ 64000L, 33000L,
- /* green */ 30000L, 60000L,
- /* blue */ 15000L, 6000L
+ /* white */ 31270, 32900,
+ /* red */ 64000, 33000,
+ /* green */ 30000, 60000,
+ /* blue */ 15000, 6000
);
# endif /* cHRM */
}
@@ -569,7 +620,7 @@ png_set_iCCP(png_structp png_ptr, png_infop info_ptr,
{
png_charp new_iccp_name;
png_bytep new_iccp_profile;
- png_uint_32 length;
+ png_size_t length;
png_debug1(1, "in %s storage function", "iCCP");
@@ -630,9 +681,8 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr,
{
int i;
- png_debug1(1, "in %s storage function", ((png_ptr == NULL ||
- png_ptr->chunk_name[0] == '\0') ?
- "text" : (png_const_charp)png_ptr->chunk_name));
+ png_debug1(1, "in %lx storage function", png_ptr == NULL ? "unexpected" :
+ (unsigned long)png_ptr->chunk_name);
if (png_ptr == NULL || info_ptr == NULL || num_text == 0)
return(0);
@@ -642,24 +692,28 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr,
*/
if (info_ptr->num_text + num_text > info_ptr->max_text)
{
+ int old_max_text = info_ptr->max_text;
+ int old_num_text = info_ptr->num_text;
+
if (info_ptr->text != NULL)
{
png_textp old_text;
- int old_max;
- old_max = info_ptr->max_text;
info_ptr->max_text = info_ptr->num_text + num_text + 8;
old_text = info_ptr->text;
+
info_ptr->text = (png_textp)png_malloc_warn(png_ptr,
(png_size_t)(info_ptr->max_text * png_sizeof(png_text)));
if (info_ptr->text == NULL)
{
- png_free(png_ptr, old_text);
+ /* Restore to previous condition */
+ info_ptr->max_text = old_max_text;
+ info_ptr->text = old_text;
return(1);
}
- png_memcpy(info_ptr->text, old_text, (png_size_t)(old_max *
+ png_memcpy(info_ptr->text, old_text, (png_size_t)(old_max_text *
png_sizeof(png_text)));
png_free(png_ptr, old_text);
}
@@ -671,7 +725,12 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr,
info_ptr->text = (png_textp)png_malloc_warn(png_ptr,
(png_size_t)(info_ptr->max_text * png_sizeof(png_text)));
if (info_ptr->text == NULL)
+ {
+ /* Restore to previous condition */
+ info_ptr->num_text = old_num_text;
+ info_ptr->max_text = old_max_text;
return(1);
+ }
info_ptr->free_me |= PNG_FREE_TEXT;
}
@@ -814,6 +873,15 @@ png_set_tIME(png_structp png_ptr, png_infop info_ptr, png_const_timep mod_time)
(png_ptr->mode & PNG_WROTE_tIME))
return;
+ if (mod_time->month == 0 || mod_time->month > 12 ||
+ mod_time->day == 0 || mod_time->day > 31 ||
+ mod_time->hour > 23 || mod_time->minute > 59 ||
+ mod_time->second > 60)
+ {
+ png_warning(png_ptr, "Ignoring invalid time value");
+ return;
+ }
+
png_memcpy(&(info_ptr->mod_time), mod_time, png_sizeof(png_time));
info_ptr->valid |= PNG_INFO_tIME;
}
@@ -915,10 +983,10 @@ png_set_sPLT(png_structp png_ptr,
{
png_sPLT_tp to = np + info_ptr->splt_palettes_num + i;
png_const_sPLT_tp from = entries + i;
- png_uint_32 length;
+ png_size_t length;
length = png_strlen(from->name) + 1;
- to->name = (png_charp)png_malloc_warn(png_ptr, (png_size_t)length);
+ to->name = (png_charp)png_malloc_warn(png_ptr, length);
if (to->name == NULL)
{
@@ -929,7 +997,7 @@ png_set_sPLT(png_structp png_ptr,
png_memcpy(to->name, from->name, length);
to->entries = (png_sPLT_entryp)png_malloc_warn(png_ptr,
- (png_size_t)(from->nentries * png_sizeof(png_sPLT_entry)));
+ from->nentries * png_sizeof(png_sPLT_entry));
if (to->entries == NULL)
{
@@ -1222,4 +1290,20 @@ png_set_benign_errors(png_structp png_ptr, int allowed)
png_ptr->flags &= ~PNG_FLAG_BENIGN_ERRORS_WARN;
}
#endif /* PNG_BENIGN_ERRORS_SUPPORTED */
+
+#ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED
+ /* Do not report invalid palette index; added at libng-1.5.10 */
+void PNGAPI
+png_set_check_for_invalid_index(png_structp png_ptr, int allowed)
+{
+ png_debug(1, "in png_set_check_for_invalid_index");
+
+ if (allowed)
+ png_ptr->num_palette_max = 0;
+
+ else
+ png_ptr->num_palette_max = -1;
+}
+#endif
+
#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */
diff --git a/src/3rdparty/libpng/pngstruct.h b/src/3rdparty/libpng/pngstruct.h
index 8d781faefe..43a45cdec6 100644
--- a/src/3rdparty/libpng/pngstruct.h
+++ b/src/3rdparty/libpng/pngstruct.h
@@ -5,7 +5,7 @@
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
- * Last changed in libpng 1.5.0 [January 6, 2011]
+ * Last changed in libpng 1.5.9 [March 29, 2012]
*
* This code is released under the libpng license.
* For conditions of distribution and use, see the disclaimer
@@ -29,11 +29,13 @@
struct png_struct_def
{
#ifdef PNG_SETJMP_SUPPORTED
- jmp_buf png_jmpbuf; /* used in png_error */
+ jmp_buf longjmp_buffer; /* used in png_error */
png_longjmp_ptr longjmp_fn;/* setjmp non-local goto function. */
#endif
png_error_ptr error_fn; /* function for printing errors and aborting */
+#ifdef PNG_WARNINGS_SUPPORTED
png_error_ptr warning_fn; /* function for printing warnings */
+#endif
png_voidp error_ptr; /* user supplied struct for error functions */
png_rw_ptr write_data_fn; /* function for writing output data */
png_rw_ptr read_data_fn; /* function for reading input data */
@@ -64,11 +66,36 @@ struct png_struct_def
z_stream zstream; /* pointer to decompression structure (below) */
png_bytep zbuf; /* buffer for zlib */
uInt zbuf_size; /* size of zbuf (typically 65536) */
+#ifdef PNG_WRITE_SUPPORTED
+
+/* Added in 1.5.4: state to keep track of whether the zstream has been
+ * initialized and if so whether it is for IDAT or some other chunk.
+ */
+#define PNG_ZLIB_UNINITIALIZED 0
+#define PNG_ZLIB_FOR_IDAT 1
+#define PNG_ZLIB_FOR_TEXT 2 /* anything other than IDAT */
+#define PNG_ZLIB_USE_MASK 3 /* bottom two bits */
+#define PNG_ZLIB_IN_USE 4 /* a flag value */
+
+ png_uint_32 zlib_state; /* State of zlib initialization */
+/* End of material added at libpng 1.5.4 */
+
int zlib_level; /* holds zlib compression level */
int zlib_method; /* holds zlib compression method */
int zlib_window_bits; /* holds zlib compression window bits */
int zlib_mem_level; /* holds zlib compression memory level */
int zlib_strategy; /* holds zlib compression strategy */
+#endif
+/* Added at libpng 1.5.4 */
+#if defined(PNG_WRITE_COMPRESSED_TEXT_SUPPORTED) || \
+ defined(PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED)
+ int zlib_text_level; /* holds zlib compression level */
+ int zlib_text_method; /* holds zlib compression method */
+ int zlib_text_window_bits; /* holds zlib compression window bits */
+ int zlib_text_mem_level; /* holds zlib compression memory level */
+ int zlib_text_strategy; /* holds zlib compression strategy */
+#endif
+/* End of material added at libpng 1.5.4 */
png_uint_32 width; /* width of image in pixels */
png_uint_32 height; /* height of image in pixels */
@@ -77,20 +104,30 @@ struct png_struct_def
png_size_t rowbytes; /* size of row in bytes */
png_uint_32 iwidth; /* width of current interlaced row in pixels */
png_uint_32 row_number; /* current row in interlace pass */
- png_bytep prev_row; /* buffer to save previous (unfiltered) row */
- png_bytep row_buf; /* buffer to save current (unfiltered) row */
+ png_uint_32 chunk_name; /* PNG_CHUNK() id of current chunk */
+ png_bytep prev_row; /* buffer to save previous (unfiltered) row.
+ * This is a pointer into big_prev_row
+ */
+ png_bytep row_buf; /* buffer to save current (unfiltered) row.
+ * This is a pointer into big_row_buf
+ */
png_bytep sub_row; /* buffer to save "sub" row when filtering */
png_bytep up_row; /* buffer to save "up" row when filtering */
png_bytep avg_row; /* buffer to save "avg" row when filtering */
png_bytep paeth_row; /* buffer to save "Paeth" row when filtering */
- png_row_info row_info; /* used for transformation routines */
+ png_size_t info_rowbytes; /* Added in 1.5.4: cache of updated row bytes */
png_uint_32 idat_size; /* current IDAT size for read */
png_uint_32 crc; /* current chunk CRC value */
png_colorp palette; /* palette from the input file */
png_uint_16 num_palette; /* number of color entries in palette */
+
+/* Added at libpng-1.5.10 */
+#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED
+ int num_palette_max; /* maximum palette index found in IDAT */
+#endif
+
png_uint_16 num_trans; /* number of transparency values */
- png_byte chunk_name[5]; /* null-terminated name of current chunk */
png_byte compression; /* file compression type (always 0) */
png_byte filter; /* file filter type (always 0) */
png_byte interlaced; /* PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */
@@ -98,17 +135,24 @@ struct png_struct_def
png_byte do_filter; /* row filter flags (see PNG_FILTER_ below ) */
png_byte color_type; /* color type of file */
png_byte bit_depth; /* bit depth of file */
- png_byte usr_bit_depth; /* bit depth of users row */
+ png_byte usr_bit_depth; /* bit depth of users row: write only */
png_byte pixel_depth; /* number of bits per pixel */
png_byte channels; /* number of channels in file */
- png_byte usr_channels; /* channels at start of write */
+ png_byte usr_channels; /* channels at start of write: write only */
png_byte sig_bytes; /* magic bytes read/written from start of file */
+ png_byte maximum_pixel_depth;
+ /* pixel depth used for the row buffers */
+ png_byte transformed_pixel_depth;
+ /* pixel depth after read/write transforms */
+ png_byte io_chunk_string[5];
+ /* string name of chunk */
#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
png_uint_16 filler; /* filler bytes for pixel expansion */
#endif
-#ifdef PNG_bKGD_SUPPORTED
+#if defined(PNG_bKGD_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) ||\
+ defined(PNG_READ_ALPHA_MODE_SUPPORTED)
png_byte background_gamma_type;
png_fixed_point background_gamma;
png_color_16 background; /* background color in screen gamma space */
@@ -123,19 +167,21 @@ struct png_struct_def
png_uint_32 flush_rows; /* number of rows written since last flush */
#endif
-#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
+#ifdef PNG_READ_GAMMA_SUPPORTED
int gamma_shift; /* number of "insignificant" bits in 16-bit gamma */
png_fixed_point gamma; /* file gamma value */
png_fixed_point screen_gamma; /* screen gamma value (display_exponent) */
-#endif
-#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
png_bytep gamma_table; /* gamma table for 8-bit depth files */
+ png_uint_16pp gamma_16_table; /* gamma table for 16-bit depth files */
+#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \
+ defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \
+ defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
png_bytep gamma_from_1; /* converts from 1.0 to screen */
png_bytep gamma_to_1; /* converts from file to 1.0 */
- png_uint_16pp gamma_16_table; /* gamma table for 16-bit depth files */
png_uint_16pp gamma_16_from_1; /* converts from 1.0 to screen */
png_uint_16pp gamma_16_to_1; /* converts from file to 1.0 */
+#endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */
#endif
#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_sBIT_SUPPORTED)
@@ -171,13 +217,6 @@ struct png_struct_def
int process_mode; /* what push library is currently doing */
int cur_palette; /* current push library palette index */
-# ifdef PNG_TEXT_SUPPORTED
- png_size_t current_text_size; /* current size of text input data */
- png_size_t current_text_left; /* how much text left to read in input */
- png_charp current_text; /* current text chunk buffer */
- png_charp current_text_ptr; /* current location in current_text */
-# endif /* PNG_PROGRESSIVE_READ_SUPPORTED && PNG_TEXT_SUPPORTED */
-
#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__)
@@ -209,7 +248,7 @@ struct png_struct_def
#endif
#ifdef PNG_TIME_RFC1123_SUPPORTED
- png_charp time_buffer; /* String to hold RFC 1123 time text */
+ char time_buffer[29]; /* String to hold RFC 1123 time text */
#endif
/* New members added in libpng-1.0.6 */
@@ -226,19 +265,24 @@ struct png_struct_def
png_bytep chunk_list;
#endif
+#ifdef PNG_READ_sRGB_SUPPORTED
+ /* Added in 1.5.5 to record an sRGB chunk in the png. */
+ png_byte is_sRGB;
+#endif
+
/* New members added in libpng-1.0.3 */
#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
png_byte rgb_to_gray_status;
+ /* Added in libpng 1.5.5 to record setting of coefficients: */
+ png_byte rgb_to_gray_coefficients_set;
/* These were changed from png_byte in libpng-1.0.6 */
png_uint_16 rgb_to_gray_red_coeff;
png_uint_16 rgb_to_gray_green_coeff;
- png_uint_16 rgb_to_gray_blue_coeff;
+ /* deleted in 1.5.5: rgb_to_gray_blue_coeff; */
#endif
/* New member added in libpng-1.0.4 (renamed in 1.0.9) */
-#if defined(PNG_MNG_FEATURES_SUPPORTED) || \
- defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \
- defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED)
+#if defined(PNG_MNG_FEATURES_SUPPORTED)
/* Changed from png_byte to png_uint_32 at version 1.2.0 */
png_uint_32 mng_features_permitted;
#endif
@@ -293,9 +337,8 @@ struct png_struct_def
png_unknown_chunk unknown_chunk;
#endif
-/* New members added in libpng-1.2.26 */
+/* New member added in libpng-1.2.26 */
png_size_t old_big_row_buf_size;
- png_size_t old_prev_row_size;
/* New member added in libpng-1.2.30 */
png_charp chunkdata; /* buffer for reading chunk data */
@@ -304,5 +347,11 @@ struct png_struct_def
/* New member added in libpng-1.4.0 */
png_uint_32 io_state;
#endif
+
+/* New member added in libpng-1.5.6 */
+ png_bytep big_prev_row;
+
+ void (*read_filter[PNG_FILTER_VALUE_LAST-1])(png_row_infop row_info,
+ png_bytep row, png_const_bytep prev_row);
};
#endif /* PNGSTRUCT_H */
diff --git a/src/3rdparty/libpng/pngtest.c b/src/3rdparty/libpng/pngtest.c
deleted file mode 100644
index cbb7eb276f..0000000000
--- a/src/3rdparty/libpng/pngtest.c
+++ /dev/null
@@ -1,1787 +0,0 @@
-
-/* pngtest.c - a simple test program to test libpng
- *
- * Last changed in libpng 1.5.0 [January 6, 2011]
- * Copyright (c) 1998-2011 Glenn Randers-Pehrson
- * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
- * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
- *
- * This code is released under the libpng license.
- * For conditions of distribution and use, see the disclaimer
- * and license in png.h
- *
- * This program reads in a PNG image, writes it out again, and then
- * compares the two files. If the files are identical, this shows that
- * the basic chunk handling, filtering, and (de)compression code is working
- * properly. It does not currently test all of the transforms, although
- * it probably should.
- *
- * The program will report "FAIL" in certain legitimate cases:
- * 1) when the compression level or filter selection method is changed.
- * 2) when the maximum IDAT size (PNG_ZBUF_SIZE in pngconf.h) is not 8192.
- * 3) unknown unsafe-to-copy ancillary chunks or unknown critical chunks
- * exist in the input file.
- * 4) others not listed here...
- * In these cases, it is best to check with another tool such as "pngcheck"
- * to see what the differences between the two files are.
- *
- * If a filename is given on the command-line, then this file is used
- * for the input, rather than the default "pngtest.png". This allows
- * testing a wide variety of files easily. You can also test a number
- * of files at once by typing "pngtest -m file1.png file2.png ..."
- */
-
-#include "zlib.h"
-#include "png.h"
-/* Copied from pngpriv.h but only used in error messages below. */
-#ifndef PNG_ZBUF_SIZE
-# define PNG_ZBUF_SIZE 8192
-#endif
-# include <stdio.h>
-# include <stdlib.h>
-# include <string.h>
-# define FCLOSE(file) fclose(file)
-
-#ifndef PNG_STDIO_SUPPORTED
-typedef FILE * png_FILE_p;
-#endif
-
-/* Makes pngtest verbose so we can find problems. */
-#ifndef PNG_DEBUG
-# define PNG_DEBUG 0
-#endif
-
-#if PNG_DEBUG > 1
-# define pngtest_debug(m) ((void)fprintf(stderr, m "\n"))
-# define pngtest_debug1(m,p1) ((void)fprintf(stderr, m "\n", p1))
-# define pngtest_debug2(m,p1,p2) ((void)fprintf(stderr, m "\n", p1, p2))
-#else
-# define pngtest_debug(m) ((void)0)
-# define pngtest_debug1(m,p1) ((void)0)
-# define pngtest_debug2(m,p1,p2) ((void)0)
-#endif
-
-#if !PNG_DEBUG
-# define SINGLE_ROWBUF_ALLOC /* Makes buffer overruns easier to nail */
-#endif
-
-/* The code uses memcmp and memcpy on large objects (typically row pointers) so
- * it is necessary to do soemthing special on certain architectures, note that
- * the actual support for this was effectively removed in 1.4, so only the
- * memory remains in this program:
- */
-#define CVT_PTR(ptr) (ptr)
-#define CVT_PTR_NOCHECK(ptr) (ptr)
-#define png_memcmp memcmp
-#define png_memcpy memcpy
-#define png_memset memset
-
-/* Turn on CPU timing
-#define PNGTEST_TIMING
-*/
-
-#ifndef PNG_FLOATING_POINT_SUPPORTED
-#undef PNGTEST_TIMING
-#endif
-
-#ifdef PNGTEST_TIMING
-static float t_start, t_stop, t_decode, t_encode, t_misc;
-#include <time.h>
-#endif
-
-#ifdef PNG_TIME_RFC1123_SUPPORTED
-#define PNG_tIME_STRING_LENGTH 29
-static int tIME_chunk_present = 0;
-static char tIME_string[PNG_tIME_STRING_LENGTH] = "tIME chunk is not present";
-#endif
-
-static int verbose = 0;
-
-int test_one_file PNGARG((PNG_CONST char *inname, PNG_CONST char *outname));
-
-#ifdef __TURBOC__
-#include <mem.h>
-#endif
-
-/* Defined so I can write to a file on gui/windowing platforms */
-/* #define STDERR stderr */
-#define STDERR stdout /* For DOS */
-
-/* Define png_jmpbuf() in case we are using a pre-1.0.6 version of libpng */
-#ifndef png_jmpbuf
-# define png_jmpbuf(png_ptr) png_ptr->jmpbuf
-#endif
-
-/* Example of using row callbacks to make a simple progress meter */
-static int status_pass = 1;
-static int status_dots_requested = 0;
-static int status_dots = 1;
-
-void PNGCBAPI
-read_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass);
-void PNGCBAPI
-read_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass)
-{
- if (png_ptr == NULL || row_number > PNG_UINT_31_MAX)
- return;
-
- if (status_pass != pass)
- {
- fprintf(stdout, "\n Pass %d: ", pass);
- status_pass = pass;
- status_dots = 31;
- }
-
- status_dots--;
-
- if (status_dots == 0)
- {
- fprintf(stdout, "\n ");
- status_dots=30;
- }
-
- fprintf(stdout, "r");
-}
-
-void PNGCBAPI
-write_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass);
-void PNGCBAPI
-write_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass)
-{
- if (png_ptr == NULL || row_number > PNG_UINT_31_MAX || pass > 7)
- return;
-
- fprintf(stdout, "w");
-}
-
-
-#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
-/* Example of using user transform callback (we don't transform anything,
- * but merely examine the row filters. We set this to 256 rather than
- * 5 in case illegal filter values are present.)
- */
-static png_uint_32 filters_used[256];
-void PNGCBAPI
-count_filters(png_structp png_ptr, png_row_infop row_info, png_bytep data);
-void PNGCBAPI
-count_filters(png_structp png_ptr, png_row_infop row_info, png_bytep data)
-{
- if (png_ptr != NULL && row_info != NULL)
- ++filters_used[*(data - 1)];
-}
-#endif
-
-#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED
-/* Example of using user transform callback (we don't transform anything,
- * but merely count the zero samples)
- */
-
-static png_uint_32 zero_samples;
-
-void PNGCBAPI
-count_zero_samples(png_structp png_ptr, png_row_infop row_info, png_bytep data);
-void PNGCBAPI
-count_zero_samples(png_structp png_ptr, png_row_infop row_info, png_bytep data)
-{
- png_bytep dp = data;
- if (png_ptr == NULL)
- return;
-
- /* Contents of row_info:
- * png_uint_32 width width of row
- * png_uint_32 rowbytes number of bytes in row
- * png_byte color_type color type of pixels
- * png_byte bit_depth bit depth of samples
- * png_byte channels number of channels (1-4)
- * png_byte pixel_depth bits per pixel (depth*channels)
- */
-
- /* Counts the number of zero samples (or zero pixels if color_type is 3 */
-
- if (row_info->color_type == 0 || row_info->color_type == 3)
- {
- int pos = 0;
- png_uint_32 n, nstop;
-
- for (n = 0, nstop=row_info->width; n<nstop; n++)
- {
- if (row_info->bit_depth == 1)
- {
- if (((*dp << pos++ ) & 0x80) == 0)
- zero_samples++;
-
- if (pos == 8)
- {
- pos = 0;
- dp++;
- }
- }
-
- if (row_info->bit_depth == 2)
- {
- if (((*dp << (pos+=2)) & 0xc0) == 0)
- zero_samples++;
-
- if (pos == 8)
- {
- pos = 0;
- dp++;
- }
- }
-
- if (row_info->bit_depth == 4)
- {
- if (((*dp << (pos+=4)) & 0xf0) == 0)
- zero_samples++;
-
- if (pos == 8)
- {
- pos = 0;
- dp++;
- }
- }
-
- if (row_info->bit_depth == 8)
- if (*dp++ == 0)
- zero_samples++;
-
- if (row_info->bit_depth == 16)
- {
- if ((*dp | *(dp+1)) == 0)
- zero_samples++;
- dp+=2;
- }
- }
- }
- else /* Other color types */
- {
- png_uint_32 n, nstop;
- int channel;
- int color_channels = row_info->channels;
- if (row_info->color_type > 3)color_channels--;
-
- for (n = 0, nstop=row_info->width; n<nstop; n++)
- {
- for (channel = 0; channel < color_channels; channel++)
- {
- if (row_info->bit_depth == 8)
- if (*dp++ == 0)
- zero_samples++;
-
- if (row_info->bit_depth == 16)
- {
- if ((*dp | *(dp+1)) == 0)
- zero_samples++;
-
- dp+=2;
- }
- }
- if (row_info->color_type > 3)
- {
- dp++;
- if (row_info->bit_depth == 16)
- dp++;
- }
- }
- }
-}
-#endif /* PNG_WRITE_USER_TRANSFORM_SUPPORTED */
-
-static int wrote_question = 0;
-
-#ifndef PNG_STDIO_SUPPORTED
-/* START of code to validate stdio-free compilation */
-/* These copies of the default read/write functions come from pngrio.c and
- * pngwio.c. They allow "don't include stdio" testing of the library.
- * This is the function that does the actual reading of data. If you are
- * not reading from a standard C stream, you should create a replacement
- * read_data function and use it at run time with png_set_read_fn(), rather
- * than changing the library.
- */
-
-#ifdef PNG_IO_STATE_SUPPORTED
-void
-pngtest_check_io_state(png_structp png_ptr, png_size_t data_length,
- png_uint_32 io_op);
-void
-pngtest_check_io_state(png_structp png_ptr, png_size_t data_length,
- png_uint_32 io_op)
-{
- png_uint_32 io_state = png_get_io_state(png_ptr);
- int err = 0;
-
- /* Check if the current operation (reading / writing) is as expected. */
- if ((io_state & PNG_IO_MASK_OP) != io_op)
- png_error(png_ptr, "Incorrect operation in I/O state");
-
- /* Check if the buffer size specific to the current location
- * (file signature / header / data / crc) is as expected.
- */
- switch (io_state & PNG_IO_MASK_LOC)
- {
- case PNG_IO_SIGNATURE:
- if (data_length > 8)
- err = 1;
- break;
- case PNG_IO_CHUNK_HDR:
- if (data_length != 8)
- err = 1;
- break;
- case PNG_IO_CHUNK_DATA:
- break; /* no restrictions here */
- case PNG_IO_CHUNK_CRC:
- if (data_length != 4)
- err = 1;
- break;
- default:
- err = 1; /* uninitialized */
- }
- if (err)
- png_error(png_ptr, "Bad I/O state or buffer size");
-}
-#endif
-
-#ifndef USE_FAR_KEYWORD
-static void PNGCBAPI
-pngtest_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
-{
- png_size_t check = 0;
- png_voidp io_ptr;
-
- /* fread() returns 0 on error, so it is OK to store this in a png_size_t
- * instead of an int, which is what fread() actually returns.
- */
- io_ptr = png_get_io_ptr(png_ptr);
- if (io_ptr != NULL)
- {
- check = fread(data, 1, length, (png_FILE_p)io_ptr);
- }
-
- if (check != length)
- {
- png_error(png_ptr, "Read Error");
- }
-
-#ifdef PNG_IO_STATE_SUPPORTED
- pngtest_check_io_state(png_ptr, length, PNG_IO_READING);
-#endif
-}
-#else
-/* This is the model-independent version. Since the standard I/O library
- can't handle far buffers in the medium and small models, we have to copy
- the data.
-*/
-
-#define NEAR_BUF_SIZE 1024
-#define MIN(a,b) (a <= b ? a : b)
-
-static void PNGCBAPI
-pngtest_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
-{
- png_size_t check;
- png_byte *n_data;
- png_FILE_p io_ptr;
-
- /* Check if data really is near. If so, use usual code. */
- n_data = (png_byte *)CVT_PTR_NOCHECK(data);
- io_ptr = (png_FILE_p)CVT_PTR(png_get_io_ptr(png_ptr));
- if ((png_bytep)n_data == data)
- {
- check = fread(n_data, 1, length, io_ptr);
- }
- else
- {
- png_byte buf[NEAR_BUF_SIZE];
- png_size_t read, remaining, err;
- check = 0;
- remaining = length;
-
- do
- {
- read = MIN(NEAR_BUF_SIZE, remaining);
- err = fread(buf, 1, 1, io_ptr);
- png_memcpy(data, buf, read); /* Copy far buffer to near buffer */
- if (err != read)
- break;
- else
- check += err;
- data += read;
- remaining -= read;
- }
- while (remaining != 0);
- }
-
- if (check != length)
- png_error(png_ptr, "Read Error");
-
-#ifdef PNG_IO_STATE_SUPPORTED
- pngtest_check_io_state(png_ptr, length, PNG_IO_READING);
-#endif
-}
-#endif /* USE_FAR_KEYWORD */
-
-#ifdef PNG_WRITE_FLUSH_SUPPORTED
-static void PNGCBAPI
-pngtest_flush(png_structp png_ptr)
-{
- /* Do nothing; fflush() is said to be just a waste of energy. */
- PNG_UNUSED(png_ptr) /* Stifle compiler warning */
-}
-#endif
-
-/* This is the function that does the actual writing of data. If you are
- * not writing to a standard C stream, you should create a replacement
- * write_data function and use it at run time with png_set_write_fn(), rather
- * than changing the library.
- */
-#ifndef USE_FAR_KEYWORD
-static void PNGCBAPI
-pngtest_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
-{
- png_size_t check;
-
- check = fwrite(data, 1, length, (png_FILE_p)png_get_io_ptr(png_ptr));
-
- if (check != length)
- {
- png_error(png_ptr, "Write Error");
- }
-
-#ifdef PNG_IO_STATE_SUPPORTED
- pngtest_check_io_state(png_ptr, length, PNG_IO_WRITING);
-#endif
-}
-#else
-/* This is the model-independent version. Since the standard I/O library
- can't handle far buffers in the medium and small models, we have to copy
- the data.
-*/
-
-#define NEAR_BUF_SIZE 1024
-#define MIN(a,b) (a <= b ? a : b)
-
-static void PNGCBAPI
-pngtest_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
-{
- png_size_t check;
- png_byte *near_data; /* Needs to be "png_byte *" instead of "png_bytep" */
- png_FILE_p io_ptr;
-
- /* Check if data really is near. If so, use usual code. */
- near_data = (png_byte *)CVT_PTR_NOCHECK(data);
- io_ptr = (png_FILE_p)CVT_PTR(png_get_io_ptr(png_ptr));
-
- if ((png_bytep)near_data == data)
- {
- check = fwrite(near_data, 1, length, io_ptr);
- }
-
- else
- {
- png_byte buf[NEAR_BUF_SIZE];
- png_size_t written, remaining, err;
- check = 0;
- remaining = length;
-
- do
- {
- written = MIN(NEAR_BUF_SIZE, remaining);
- png_memcpy(buf, data, written); /* Copy far buffer to near buffer */
- err = fwrite(buf, 1, written, io_ptr);
- if (err != written)
- break;
- else
- check += err;
- data += written;
- remaining -= written;
- }
- while (remaining != 0);
- }
-
- if (check != length)
- {
- png_error(png_ptr, "Write Error");
- }
-
-#ifdef PNG_IO_STATE_SUPPORTED
- pngtest_check_io_state(png_ptr, length, PNG_IO_WRITING);
-#endif
-}
-#endif /* USE_FAR_KEYWORD */
-
-/* This function is called when there is a warning, but the library thinks
- * it can continue anyway. Replacement functions don't have to do anything
- * here if you don't want to. In the default configuration, png_ptr is
- * not used, but it is passed in case it may be useful.
- */
-static void PNGCBAPI
-pngtest_warning(png_structp png_ptr, png_const_charp message)
-{
- PNG_CONST char *name = "UNKNOWN (ERROR!)";
- char *test;
- test = png_get_error_ptr(png_ptr);
-
- if (test == NULL)
- fprintf(STDERR, "%s: libpng warning: %s\n", name, message);
-
- else
- fprintf(STDERR, "%s: libpng warning: %s\n", test, message);
-}
-
-/* This is the default error handling function. Note that replacements for
- * this function MUST NOT RETURN, or the program will likely crash. This
- * function is used by default, or if the program supplies NULL for the
- * error function pointer in png_set_error_fn().
- */
-static void PNGCBAPI
-pngtest_error(png_structp png_ptr, png_const_charp message)
-{
- pngtest_warning(png_ptr, message);
- /* We can return because png_error calls the default handler, which is
- * actually OK in this case.
- */
-}
-#endif /* !PNG_STDIO_SUPPORTED */
-/* END of code to validate stdio-free compilation */
-
-/* START of code to validate memory allocation and deallocation */
-#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
-
-/* Allocate memory. For reasonable files, size should never exceed
- * 64K. However, zlib may allocate more then 64K if you don't tell
- * it not to. See zconf.h and png.h for more information. zlib does
- * need to allocate exactly 64K, so whatever you call here must
- * have the ability to do that.
- *
- * This piece of code can be compiled to validate max 64K allocations
- * by setting MAXSEG_64K in zlib zconf.h *or* PNG_MAX_MALLOC_64K.
- */
-typedef struct memory_information
-{
- png_alloc_size_t size;
- png_voidp pointer;
- struct memory_information FAR *next;
-} memory_information;
-typedef memory_information FAR *memory_infop;
-
-static memory_infop pinformation = NULL;
-static int current_allocation = 0;
-static int maximum_allocation = 0;
-static int total_allocation = 0;
-static int num_allocations = 0;
-
-png_voidp PNGCBAPI png_debug_malloc PNGARG((png_structp png_ptr,
- png_alloc_size_t size));
-void PNGCBAPI png_debug_free PNGARG((png_structp png_ptr, png_voidp ptr));
-
-png_voidp
-PNGCBAPI png_debug_malloc(png_structp png_ptr, png_alloc_size_t size)
-{
-
- /* png_malloc has already tested for NULL; png_create_struct calls
- * png_debug_malloc directly, with png_ptr == NULL which is OK
- */
-
- if (size == 0)
- return (NULL);
-
- /* This calls the library allocator twice, once to get the requested
- buffer and once to get a new free list entry. */
- {
- /* Disable malloc_fn and free_fn */
- memory_infop pinfo;
- png_set_mem_fn(png_ptr, NULL, NULL, NULL);
- pinfo = (memory_infop)png_malloc(png_ptr,
- png_sizeof(*pinfo));
- pinfo->size = size;
- current_allocation += size;
- total_allocation += size;
- num_allocations ++;
-
- if (current_allocation > maximum_allocation)
- maximum_allocation = current_allocation;
-
- pinfo->pointer = png_malloc(png_ptr, size);
- /* Restore malloc_fn and free_fn */
-
- png_set_mem_fn(png_ptr,
- NULL, png_debug_malloc, png_debug_free);
-
- if (size != 0 && pinfo->pointer == NULL)
- {
- current_allocation -= size;
- total_allocation -= size;
- png_error(png_ptr,
- "out of memory in pngtest->png_debug_malloc");
- }
-
- pinfo->next = pinformation;
- pinformation = pinfo;
- /* Make sure the caller isn't assuming zeroed memory. */
- png_memset(pinfo->pointer, 0xdd, pinfo->size);
-
- if (verbose)
- printf("png_malloc %lu bytes at %p\n", (unsigned long)size,
- pinfo->pointer);
-
- return (png_voidp)(pinfo->pointer);
- }
-}
-
-/* Free a pointer. It is removed from the list at the same time. */
-void PNGCBAPI
-png_debug_free(png_structp png_ptr, png_voidp ptr)
-{
- if (png_ptr == NULL)
- fprintf(STDERR, "NULL pointer to png_debug_free.\n");
-
- if (ptr == 0)
- {
-#if 0 /* This happens all the time. */
- fprintf(STDERR, "WARNING: freeing NULL pointer\n");
-#endif
- return;
- }
-
- /* Unlink the element from the list. */
- {
- memory_infop FAR *ppinfo = &pinformation;
-
- for (;;)
- {
- memory_infop pinfo = *ppinfo;
-
- if (pinfo->pointer == ptr)
- {
- *ppinfo = pinfo->next;
- current_allocation -= pinfo->size;
- if (current_allocation < 0)
- fprintf(STDERR, "Duplicate free of memory\n");
- /* We must free the list element too, but first kill
- the memory that is to be freed. */
- png_memset(ptr, 0x55, pinfo->size);
- png_free_default(png_ptr, pinfo);
- pinfo = NULL;
- break;
- }
-
- if (pinfo->next == NULL)
- {
- fprintf(STDERR, "Pointer %x not found\n", (unsigned int)ptr);
- break;
- }
-
- ppinfo = &pinfo->next;
- }
- }
-
- /* Finally free the data. */
- if (verbose)
- printf("Freeing %p\n", ptr);
-
- png_free_default(png_ptr, ptr);
- ptr = NULL;
-}
-#endif /* PNG_USER_MEM_SUPPORTED && PNG_DEBUG */
-/* END of code to test memory allocation/deallocation */
-
-
-/* Demonstration of user chunk support of the sTER and vpAg chunks */
-#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED
-
-/* (sTER is a public chunk not yet known by libpng. vpAg is a private
-chunk used in ImageMagick to store "virtual page" size). */
-
-static png_uint_32 user_chunk_data[4];
-
- /* 0: sTER mode + 1
- * 1: vpAg width
- * 2: vpAg height
- * 3: vpAg units
- */
-
-static int PNGCBAPI read_user_chunk_callback(png_struct *png_ptr,
- png_unknown_chunkp chunk)
-{
- png_uint_32
- *my_user_chunk_data;
-
- /* Return one of the following:
- * return (-n); chunk had an error
- * return (0); did not recognize
- * return (n); success
- *
- * The unknown chunk structure contains the chunk data:
- * png_byte name[5];
- * png_byte *data;
- * png_size_t size;
- *
- * Note that libpng has already taken care of the CRC handling.
- */
-
- if (chunk->name[0] == 115 && chunk->name[1] == 84 && /* s T */
- chunk->name[2] == 69 && chunk->name[3] == 82) /* E R */
- {
- /* Found sTER chunk */
- if (chunk->size != 1)
- return (-1); /* Error return */
-
- if (chunk->data[0] != 0 && chunk->data[0] != 1)
- return (-1); /* Invalid mode */
-
- my_user_chunk_data=(png_uint_32 *) png_get_user_chunk_ptr(png_ptr);
- my_user_chunk_data[0]=chunk->data[0]+1;
- return (1);
- }
-
- if (chunk->name[0] != 118 || chunk->name[1] != 112 || /* v p */
- chunk->name[2] != 65 || chunk->name[3] != 103) /* A g */
- return (0); /* Did not recognize */
-
- /* Found ImageMagick vpAg chunk */
-
- if (chunk->size != 9)
- return (-1); /* Error return */
-
- my_user_chunk_data=(png_uint_32 *) png_get_user_chunk_ptr(png_ptr);
-
- my_user_chunk_data[1]=png_get_uint_31(png_ptr, chunk->data);
- my_user_chunk_data[2]=png_get_uint_31(png_ptr, chunk->data + 4);
- my_user_chunk_data[3]=(png_uint_32)chunk->data[8];
-
- return (1);
-
-}
-#endif
-/* END of code to demonstrate user chunk support */
-
-/* Test one file */
-int
-test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
-{
- static png_FILE_p fpin;
- static png_FILE_p fpout; /* "static" prevents setjmp corruption */
- png_structp read_ptr;
- png_infop read_info_ptr, end_info_ptr;
-#ifdef PNG_WRITE_SUPPORTED
- png_structp write_ptr;
- png_infop write_info_ptr;
- png_infop write_end_info_ptr;
-#else
- png_structp write_ptr = NULL;
- png_infop write_info_ptr = NULL;
- png_infop write_end_info_ptr = NULL;
-#endif
- png_bytep row_buf;
- png_uint_32 y;
- png_uint_32 width, height;
- int num_pass, pass;
- int bit_depth, color_type;
-#ifdef PNG_SETJMP_SUPPORTED
-#ifdef USE_FAR_KEYWORD
- jmp_buf png_jmpbuf;
-#endif
-#endif
-
- char inbuf[256], outbuf[256];
-
- row_buf = NULL;
-
- if ((fpin = fopen(inname, "rb")) == NULL)
- {
- fprintf(STDERR, "Could not find input file %s\n", inname);
- return (1);
- }
-
- if ((fpout = fopen(outname, "wb")) == NULL)
- {
- fprintf(STDERR, "Could not open output file %s\n", outname);
- FCLOSE(fpin);
- return (1);
- }
-
- pngtest_debug("Allocating read and write structures");
-#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
- read_ptr =
- png_create_read_struct_2(PNG_LIBPNG_VER_STRING, NULL,
- NULL, NULL, NULL, png_debug_malloc, png_debug_free);
-#else
- read_ptr =
- png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
-#endif
-#ifndef PNG_STDIO_SUPPORTED
- png_set_error_fn(read_ptr, (png_voidp)inname, pngtest_error,
- pngtest_warning);
-#endif
-
-#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED
- user_chunk_data[0] = 0;
- user_chunk_data[1] = 0;
- user_chunk_data[2] = 0;
- user_chunk_data[3] = 0;
- png_set_read_user_chunk_fn(read_ptr, user_chunk_data,
- read_user_chunk_callback);
-
-#endif
-#ifdef PNG_WRITE_SUPPORTED
-#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
- write_ptr =
- png_create_write_struct_2(PNG_LIBPNG_VER_STRING, NULL,
- NULL, NULL, NULL, png_debug_malloc, png_debug_free);
-#else
- write_ptr =
- png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
-#endif
-#ifndef PNG_STDIO_SUPPORTED
- png_set_error_fn(write_ptr, (png_voidp)inname, pngtest_error,
- pngtest_warning);
-#endif
-#endif
- pngtest_debug("Allocating read_info, write_info and end_info structures");
- read_info_ptr = png_create_info_struct(read_ptr);
- end_info_ptr = png_create_info_struct(read_ptr);
-#ifdef PNG_WRITE_SUPPORTED
- write_info_ptr = png_create_info_struct(write_ptr);
- write_end_info_ptr = png_create_info_struct(write_ptr);
-#endif
-
-#ifdef PNG_SETJMP_SUPPORTED
- pngtest_debug("Setting jmpbuf for read struct");
-#ifdef USE_FAR_KEYWORD
- if (setjmp(png_jmpbuf))
-#else
- if (setjmp(png_jmpbuf(read_ptr)))
-#endif
- {
- fprintf(STDERR, "%s -> %s: libpng read error\n", inname, outname);
- png_free(read_ptr, row_buf);
- row_buf = NULL;
- png_destroy_read_struct(&read_ptr, &read_info_ptr, &end_info_ptr);
-#ifdef PNG_WRITE_SUPPORTED
- png_destroy_info_struct(write_ptr, &write_end_info_ptr);
- png_destroy_write_struct(&write_ptr, &write_info_ptr);
-#endif
- FCLOSE(fpin);
- FCLOSE(fpout);
- return (1);
- }
-#ifdef USE_FAR_KEYWORD
- png_memcpy(png_jmpbuf(read_ptr), png_jmpbuf, png_sizeof(jmp_buf));
-#endif
-
-#ifdef PNG_WRITE_SUPPORTED
- pngtest_debug("Setting jmpbuf for write struct");
-#ifdef USE_FAR_KEYWORD
-
- if (setjmp(png_jmpbuf))
-#else
- if (setjmp(png_jmpbuf(write_ptr)))
-#endif
- {
- fprintf(STDERR, "%s -> %s: libpng write error\n", inname, outname);
- png_destroy_read_struct(&read_ptr, &read_info_ptr, &end_info_ptr);
- png_destroy_info_struct(write_ptr, &write_end_info_ptr);
-#ifdef PNG_WRITE_SUPPORTED
- png_destroy_write_struct(&write_ptr, &write_info_ptr);
-#endif
- FCLOSE(fpin);
- FCLOSE(fpout);
- return (1);
- }
-
-#ifdef USE_FAR_KEYWORD
- png_memcpy(png_jmpbuf(write_ptr), png_jmpbuf, png_sizeof(jmp_buf));
-#endif
-#endif
-#endif
-
- pngtest_debug("Initializing input and output streams");
-#ifdef PNG_STDIO_SUPPORTED
- png_init_io(read_ptr, fpin);
-# ifdef PNG_WRITE_SUPPORTED
- png_init_io(write_ptr, fpout);
-# endif
-#else
- png_set_read_fn(read_ptr, (png_voidp)fpin, pngtest_read_data);
-# ifdef PNG_WRITE_SUPPORTED
- png_set_write_fn(write_ptr, (png_voidp)fpout, pngtest_write_data,
-# ifdef PNG_WRITE_FLUSH_SUPPORTED
- pngtest_flush);
-# else
- NULL);
-# endif
-# endif
-#endif
-
- if (status_dots_requested == 1)
- {
-#ifdef PNG_WRITE_SUPPORTED
- png_set_write_status_fn(write_ptr, write_row_callback);
-#endif
- png_set_read_status_fn(read_ptr, read_row_callback);
- }
-
- else
- {
-#ifdef PNG_WRITE_SUPPORTED
- png_set_write_status_fn(write_ptr, NULL);
-#endif
- png_set_read_status_fn(read_ptr, NULL);
- }
-
-#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
- {
- int i;
-
- for (i = 0; i<256; i++)
- filters_used[i] = 0;
-
- png_set_read_user_transform_fn(read_ptr, count_filters);
- }
-#endif
-#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED
- zero_samples = 0;
- png_set_write_user_transform_fn(write_ptr, count_zero_samples);
-#endif
-
-#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
-# ifndef PNG_HANDLE_CHUNK_ALWAYS
-# define PNG_HANDLE_CHUNK_ALWAYS 3
-# endif
- png_set_keep_unknown_chunks(read_ptr, PNG_HANDLE_CHUNK_ALWAYS,
- NULL, 0);
-#endif
-#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
-# ifndef PNG_HANDLE_CHUNK_IF_SAFE
-# define PNG_HANDLE_CHUNK_IF_SAFE 2
-# endif
- png_set_keep_unknown_chunks(write_ptr, PNG_HANDLE_CHUNK_IF_SAFE,
- NULL, 0);
-#endif
-
- pngtest_debug("Reading info struct");
- png_read_info(read_ptr, read_info_ptr);
-
- pngtest_debug("Transferring info struct");
- {
- int interlace_type, compression_type, filter_type;
-
- if (png_get_IHDR(read_ptr, read_info_ptr, &width, &height, &bit_depth,
- &color_type, &interlace_type, &compression_type, &filter_type))
- {
- png_set_IHDR(write_ptr, write_info_ptr, width, height, bit_depth,
-#ifdef PNG_WRITE_INTERLACING_SUPPORTED
- color_type, interlace_type, compression_type, filter_type);
-#else
- color_type, PNG_INTERLACE_NONE, compression_type, filter_type);
-#endif
- }
- }
-#ifdef PNG_FIXED_POINT_SUPPORTED
-#ifdef PNG_cHRM_SUPPORTED
- {
- png_fixed_point white_x, white_y, red_x, red_y, green_x, green_y, blue_x,
- blue_y;
-
- if (png_get_cHRM_fixed(read_ptr, read_info_ptr, &white_x, &white_y,
- &red_x, &red_y, &green_x, &green_y, &blue_x, &blue_y))
- {
- png_set_cHRM_fixed(write_ptr, write_info_ptr, white_x, white_y, red_x,
- red_y, green_x, green_y, blue_x, blue_y);
- }
- }
-#endif
-#ifdef PNG_gAMA_SUPPORTED
- {
- png_fixed_point gamma;
-
- if (png_get_gAMA_fixed(read_ptr, read_info_ptr, &gamma))
- png_set_gAMA_fixed(write_ptr, write_info_ptr, gamma);
- }
-#endif
-#else /* Use floating point versions */
-#ifdef PNG_FLOATING_POINT_SUPPORTED
-#ifdef PNG_cHRM_SUPPORTED
- {
- double white_x, white_y, red_x, red_y, green_x, green_y, blue_x,
- blue_y;
-
- if (png_get_cHRM(read_ptr, read_info_ptr, &white_x, &white_y, &red_x,
- &red_y, &green_x, &green_y, &blue_x, &blue_y))
- {
- png_set_cHRM(write_ptr, write_info_ptr, white_x, white_y, red_x,
- red_y, green_x, green_y, blue_x, blue_y);
- }
- }
-#endif
-#ifdef PNG_gAMA_SUPPORTED
- {
- double gamma;
-
- if (png_get_gAMA(read_ptr, read_info_ptr, &gamma))
- png_set_gAMA(write_ptr, write_info_ptr, gamma);
- }
-#endif
-#endif /* Floating point */
-#endif /* Fixed point */
-#ifdef PNG_iCCP_SUPPORTED
- {
- png_charp name;
- png_bytep profile;
- png_uint_32 proflen;
- int compression_type;
-
- if (png_get_iCCP(read_ptr, read_info_ptr, &name, &compression_type,
- &profile, &proflen))
- {
- png_set_iCCP(write_ptr, write_info_ptr, name, compression_type,
- profile, proflen);
- }
- }
-#endif
-#ifdef PNG_sRGB_SUPPORTED
- {
- int intent;
-
- if (png_get_sRGB(read_ptr, read_info_ptr, &intent))
- png_set_sRGB(write_ptr, write_info_ptr, intent);
- }
-#endif
- {
- png_colorp palette;
- int num_palette;
-
- if (png_get_PLTE(read_ptr, read_info_ptr, &palette, &num_palette))
- png_set_PLTE(write_ptr, write_info_ptr, palette, num_palette);
- }
-#ifdef PNG_bKGD_SUPPORTED
- {
- png_color_16p background;
-
- if (png_get_bKGD(read_ptr, read_info_ptr, &background))
- {
- png_set_bKGD(write_ptr, write_info_ptr, background);
- }
- }
-#endif
-#ifdef PNG_hIST_SUPPORTED
- {
- png_uint_16p hist;
-
- if (png_get_hIST(read_ptr, read_info_ptr, &hist))
- png_set_hIST(write_ptr, write_info_ptr, hist);
- }
-#endif
-#ifdef PNG_oFFs_SUPPORTED
- {
- png_int_32 offset_x, offset_y;
- int unit_type;
-
- if (png_get_oFFs(read_ptr, read_info_ptr, &offset_x, &offset_y,
- &unit_type))
- {
- png_set_oFFs(write_ptr, write_info_ptr, offset_x, offset_y, unit_type);
- }
- }
-#endif
-#ifdef PNG_pCAL_SUPPORTED
- {
- png_charp purpose, units;
- png_charpp params;
- png_int_32 X0, X1;
- int type, nparams;
-
- if (png_get_pCAL(read_ptr, read_info_ptr, &purpose, &X0, &X1, &type,
- &nparams, &units, &params))
- {
- png_set_pCAL(write_ptr, write_info_ptr, purpose, X0, X1, type,
- nparams, units, params);
- }
- }
-#endif
-#ifdef PNG_pHYs_SUPPORTED
- {
- png_uint_32 res_x, res_y;
- int unit_type;
-
- if (png_get_pHYs(read_ptr, read_info_ptr, &res_x, &res_y, &unit_type))
- png_set_pHYs(write_ptr, write_info_ptr, res_x, res_y, unit_type);
- }
-#endif
-#ifdef PNG_sBIT_SUPPORTED
- {
- png_color_8p sig_bit;
-
- if (png_get_sBIT(read_ptr, read_info_ptr, &sig_bit))
- png_set_sBIT(write_ptr, write_info_ptr, sig_bit);
- }
-#endif
-#ifdef PNG_sCAL_SUPPORTED
-#ifdef PNG_FLOATING_POINT_SUPPORTED
- {
- int unit;
- double scal_width, scal_height;
-
- if (png_get_sCAL(read_ptr, read_info_ptr, &unit, &scal_width,
- &scal_height))
- {
- png_set_sCAL(write_ptr, write_info_ptr, unit, scal_width, scal_height);
- }
- }
-#else
-#ifdef PNG_FIXED_POINT_SUPPORTED
- {
- int unit;
- png_charp scal_width, scal_height;
-
- if (png_get_sCAL_s(read_ptr, read_info_ptr, &unit, &scal_width,
- &scal_height))
- {
- png_set_sCAL_s(write_ptr, write_info_ptr, unit, scal_width,
- scal_height);
- }
- }
-#endif
-#endif
-#endif
-#ifdef PNG_TEXT_SUPPORTED
- {
- png_textp text_ptr;
- int num_text;
-
- if (png_get_text(read_ptr, read_info_ptr, &text_ptr, &num_text) > 0)
- {
- pngtest_debug1("Handling %d iTXt/tEXt/zTXt chunks", num_text);
- png_set_text(write_ptr, write_info_ptr, text_ptr, num_text);
- }
- }
-#endif
-#ifdef PNG_tIME_SUPPORTED
- {
- png_timep mod_time;
-
- if (png_get_tIME(read_ptr, read_info_ptr, &mod_time))
- {
- png_set_tIME(write_ptr, write_info_ptr, mod_time);
-#ifdef PNG_TIME_RFC1123_SUPPORTED
- /* We have to use png_memcpy instead of "=" because the string
- * pointed to by png_convert_to_rfc1123() gets free'ed before
- * we use it.
- */
- png_memcpy(tIME_string,
- png_convert_to_rfc1123(read_ptr, mod_time),
- png_sizeof(tIME_string));
-
- tIME_string[png_sizeof(tIME_string) - 1] = '\0';
- tIME_chunk_present++;
-#endif /* PNG_TIME_RFC1123_SUPPORTED */
- }
- }
-#endif
-#ifdef PNG_tRNS_SUPPORTED
- {
- png_bytep trans_alpha;
- int num_trans;
- png_color_16p trans_color;
-
- if (png_get_tRNS(read_ptr, read_info_ptr, &trans_alpha, &num_trans,
- &trans_color))
- {
- int sample_max = (1 << bit_depth);
- /* libpng doesn't reject a tRNS chunk with out-of-range samples */
- if (!((color_type == PNG_COLOR_TYPE_GRAY &&
- (int)trans_color->gray > sample_max) ||
- (color_type == PNG_COLOR_TYPE_RGB &&
- ((int)trans_color->red > sample_max ||
- (int)trans_color->green > sample_max ||
- (int)trans_color->blue > sample_max))))
- png_set_tRNS(write_ptr, write_info_ptr, trans_alpha, num_trans,
- trans_color);
- }
- }
-#endif
-#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
- {
- png_unknown_chunkp unknowns;
- int num_unknowns = png_get_unknown_chunks(read_ptr, read_info_ptr,
- &unknowns);
-
- if (num_unknowns)
- {
- int i;
- png_set_unknown_chunks(write_ptr, write_info_ptr, unknowns,
- num_unknowns);
- /* Copy the locations from the read_info_ptr. The automatically
- * generated locations in write_info_ptr are wrong because we
- * haven't written anything yet.
- */
- for (i = 0; i < num_unknowns; i++)
- png_set_unknown_chunk_location(write_ptr, write_info_ptr, i,
- unknowns[i].location);
- }
- }
-#endif
-
-#ifdef PNG_WRITE_SUPPORTED
- pngtest_debug("Writing info struct");
-
-/* If we wanted, we could write info in two steps:
- * png_write_info_before_PLTE(write_ptr, write_info_ptr);
- */
- png_write_info(write_ptr, write_info_ptr);
-
-#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED
- if (user_chunk_data[0] != 0)
- {
- png_byte png_sTER[5] = {115, 84, 69, 82, '\0'};
-
- unsigned char
- ster_chunk_data[1];
-
- if (verbose)
- fprintf(STDERR, "\n stereo mode = %lu\n",
- (unsigned long)(user_chunk_data[0] - 1));
-
- ster_chunk_data[0]=(unsigned char)(user_chunk_data[0] - 1);
- png_write_chunk(write_ptr, png_sTER, ster_chunk_data, 1);
- }
-
- if (user_chunk_data[1] != 0 || user_chunk_data[2] != 0)
- {
- png_byte png_vpAg[5] = {118, 112, 65, 103, '\0'};
-
- unsigned char
- vpag_chunk_data[9];
-
- if (verbose)
- fprintf(STDERR, " vpAg = %lu x %lu, units = %lu\n",
- (unsigned long)user_chunk_data[1],
- (unsigned long)user_chunk_data[2],
- (unsigned long)user_chunk_data[3]);
-
- png_save_uint_32(vpag_chunk_data, user_chunk_data[1]);
- png_save_uint_32(vpag_chunk_data + 4, user_chunk_data[2]);
- vpag_chunk_data[8] = (unsigned char)(user_chunk_data[3] & 0xff);
- png_write_chunk(write_ptr, png_vpAg, vpag_chunk_data, 9);
- }
-
-#endif
-#endif
-
-#ifdef SINGLE_ROWBUF_ALLOC
- pngtest_debug("Allocating row buffer...");
- row_buf = (png_bytep)png_malloc(read_ptr,
- png_get_rowbytes(read_ptr, read_info_ptr));
-
- pngtest_debug1("\t0x%08lx", (unsigned long)row_buf);
-#endif /* SINGLE_ROWBUF_ALLOC */
- pngtest_debug("Writing row data");
-
-#if defined(PNG_READ_INTERLACING_SUPPORTED) || \
- defined(PNG_WRITE_INTERLACING_SUPPORTED)
- num_pass = png_set_interlace_handling(read_ptr);
-# ifdef PNG_WRITE_SUPPORTED
- png_set_interlace_handling(write_ptr);
-# endif
-#else
- num_pass = 1;
-#endif
-
-#ifdef PNGTEST_TIMING
- t_stop = (float)clock();
- t_misc += (t_stop - t_start);
- t_start = t_stop;
-#endif
- for (pass = 0; pass < num_pass; pass++)
- {
- pngtest_debug1("Writing row data for pass %d", pass);
- for (y = 0; y < height; y++)
- {
-#ifndef SINGLE_ROWBUF_ALLOC
- pngtest_debug2("Allocating row buffer (pass %d, y = %u)...", pass, y);
- row_buf = (png_bytep)png_malloc(read_ptr,
- png_get_rowbytes(read_ptr, read_info_ptr));
-
- pngtest_debug2("\t0x%08lx (%u bytes)", (unsigned long)row_buf,
- png_get_rowbytes(read_ptr, read_info_ptr));
-
-#endif /* !SINGLE_ROWBUF_ALLOC */
- png_read_rows(read_ptr, (png_bytepp)&row_buf, NULL, 1);
-
-#ifdef PNG_WRITE_SUPPORTED
-#ifdef PNGTEST_TIMING
- t_stop = (float)clock();
- t_decode += (t_stop - t_start);
- t_start = t_stop;
-#endif
- png_write_rows(write_ptr, (png_bytepp)&row_buf, 1);
-#ifdef PNGTEST_TIMING
- t_stop = (float)clock();
- t_encode += (t_stop - t_start);
- t_start = t_stop;
-#endif
-#endif /* PNG_WRITE_SUPPORTED */
-
-#ifndef SINGLE_ROWBUF_ALLOC
- pngtest_debug2("Freeing row buffer (pass %d, y = %u)", pass, y);
- png_free(read_ptr, row_buf);
- row_buf = NULL;
-#endif /* !SINGLE_ROWBUF_ALLOC */
- }
- }
-
-#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
- png_free_data(read_ptr, read_info_ptr, PNG_FREE_UNKN, -1);
-#endif
-#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
- png_free_data(write_ptr, write_info_ptr, PNG_FREE_UNKN, -1);
-#endif
-
- pngtest_debug("Reading and writing end_info data");
-
- png_read_end(read_ptr, end_info_ptr);
-#ifdef PNG_TEXT_SUPPORTED
- {
- png_textp text_ptr;
- int num_text;
-
- if (png_get_text(read_ptr, end_info_ptr, &text_ptr, &num_text) > 0)
- {
- pngtest_debug1("Handling %d iTXt/tEXt/zTXt chunks", num_text);
- png_set_text(write_ptr, write_end_info_ptr, text_ptr, num_text);
- }
- }
-#endif
-#ifdef PNG_tIME_SUPPORTED
- {
- png_timep mod_time;
-
- if (png_get_tIME(read_ptr, end_info_ptr, &mod_time))
- {
- png_set_tIME(write_ptr, write_end_info_ptr, mod_time);
-#ifdef PNG_TIME_RFC1123_SUPPORTED
- /* We have to use png_memcpy instead of "=" because the string
- pointed to by png_convert_to_rfc1123() gets free'ed before
- we use it */
- png_memcpy(tIME_string,
- png_convert_to_rfc1123(read_ptr, mod_time),
- png_sizeof(tIME_string));
-
- tIME_string[png_sizeof(tIME_string) - 1] = '\0';
- tIME_chunk_present++;
-#endif /* PNG_TIME_RFC1123_SUPPORTED */
- }
- }
-#endif
-#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
- {
- png_unknown_chunkp unknowns;
- int num_unknowns = png_get_unknown_chunks(read_ptr, end_info_ptr,
- &unknowns);
-
- if (num_unknowns)
- {
- int i;
- png_set_unknown_chunks(write_ptr, write_end_info_ptr, unknowns,
- num_unknowns);
- /* Copy the locations from the read_info_ptr. The automatically
- * generated locations in write_end_info_ptr are wrong because we
- * haven't written the end_info yet.
- */
- for (i = 0; i < num_unknowns; i++)
- png_set_unknown_chunk_location(write_ptr, write_end_info_ptr, i,
- unknowns[i].location);
- }
- }
-#endif
-#ifdef PNG_WRITE_SUPPORTED
- png_write_end(write_ptr, write_end_info_ptr);
-#endif
-
-#ifdef PNG_EASY_ACCESS_SUPPORTED
- if (verbose)
- {
- png_uint_32 iwidth, iheight;
- iwidth = png_get_image_width(write_ptr, write_info_ptr);
- iheight = png_get_image_height(write_ptr, write_info_ptr);
- fprintf(STDERR, "\n Image width = %lu, height = %lu\n",
- (unsigned long)iwidth, (unsigned long)iheight);
- }
-#endif
-
- pngtest_debug("Destroying data structs");
-#ifdef SINGLE_ROWBUF_ALLOC
- pngtest_debug("destroying row_buf for read_ptr");
- png_free(read_ptr, row_buf);
- row_buf = NULL;
-#endif /* SINGLE_ROWBUF_ALLOC */
- pngtest_debug("destroying read_ptr, read_info_ptr, end_info_ptr");
- png_destroy_read_struct(&read_ptr, &read_info_ptr, &end_info_ptr);
-#ifdef PNG_WRITE_SUPPORTED
- pngtest_debug("destroying write_end_info_ptr");
- png_destroy_info_struct(write_ptr, &write_end_info_ptr);
- pngtest_debug("destroying write_ptr, write_info_ptr");
- png_destroy_write_struct(&write_ptr, &write_info_ptr);
-#endif
- pngtest_debug("Destruction complete.");
-
- FCLOSE(fpin);
- FCLOSE(fpout);
-
- pngtest_debug("Opening files for comparison");
- if ((fpin = fopen(inname, "rb")) == NULL)
- {
- fprintf(STDERR, "Could not find file %s\n", inname);
- return (1);
- }
-
- if ((fpout = fopen(outname, "rb")) == NULL)
- {
- fprintf(STDERR, "Could not find file %s\n", outname);
- FCLOSE(fpin);
- return (1);
- }
-
- for (;;)
- {
- png_size_t num_in, num_out;
-
- num_in = fread(inbuf, 1, 1, fpin);
- num_out = fread(outbuf, 1, 1, fpout);
-
- if (num_in != num_out)
- {
- fprintf(STDERR, "\nFiles %s and %s are of a different size\n",
- inname, outname);
-
- if (wrote_question == 0)
- {
- fprintf(STDERR,
- " Was %s written with the same maximum IDAT chunk size (%d bytes),",
- inname, PNG_ZBUF_SIZE);
- fprintf(STDERR,
- "\n filtering heuristic (libpng default), compression");
- fprintf(STDERR,
- " level (zlib default),\n and zlib version (%s)?\n\n",
- ZLIB_VERSION);
- wrote_question = 1;
- }
-
- FCLOSE(fpin);
- FCLOSE(fpout);
- return (0);
- }
-
- if (!num_in)
- break;
-
- if (png_memcmp(inbuf, outbuf, num_in))
- {
- fprintf(STDERR, "\nFiles %s and %s are different\n", inname, outname);
-
- if (wrote_question == 0)
- {
- fprintf(STDERR,
- " Was %s written with the same maximum IDAT chunk size (%d bytes),",
- inname, PNG_ZBUF_SIZE);
- fprintf(STDERR,
- "\n filtering heuristic (libpng default), compression");
- fprintf(STDERR,
- " level (zlib default),\n and zlib version (%s)?\n\n",
- ZLIB_VERSION);
- wrote_question = 1;
- }
-
- FCLOSE(fpin);
- FCLOSE(fpout);
- return (0);
- }
- }
-
- FCLOSE(fpin);
- FCLOSE(fpout);
-
- return (0);
-}
-
-/* Input and output filenames */
-#ifdef RISCOS
-static PNG_CONST char *inname = "pngtest/png";
-static PNG_CONST char *outname = "pngout/png";
-#else
-static PNG_CONST char *inname = "pngtest.png";
-static PNG_CONST char *outname = "pngout.png";
-#endif
-
-int
-main(int argc, char *argv[])
-{
- int multiple = 0;
- int ierror = 0;
-
- fprintf(STDERR, "\n Testing libpng version %s\n", PNG_LIBPNG_VER_STRING);
- fprintf(STDERR, " with zlib version %s\n", ZLIB_VERSION);
- fprintf(STDERR, "%s", png_get_copyright(NULL));
- /* Show the version of libpng used in building the library */
- fprintf(STDERR, " library (%lu):%s",
- (unsigned long)png_access_version_number(),
- png_get_header_version(NULL));
-
- /* Show the version of libpng used in building the application */
- fprintf(STDERR, " pngtest (%lu):%s", (unsigned long)PNG_LIBPNG_VER,
- PNG_HEADER_VERSION_STRING);
-
- /* Do some consistency checking on the memory allocation settings, I'm
- * not sure this matters, but it is nice to know, the first of these
- * tests should be impossible because of the way the macros are set
- * in pngconf.h
- */
-#if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K)
- fprintf(STDERR, " NOTE: Zlib compiled for max 64k, libpng not\n");
-#endif
- /* I think the following can happen. */
-#if !defined(MAXSEG_64K) && defined(PNG_MAX_MALLOC_64K)
- fprintf(STDERR, " NOTE: libpng compiled for max 64k, zlib not\n");
-#endif
-
- if (strcmp(png_libpng_ver, PNG_LIBPNG_VER_STRING))
- {
- fprintf(STDERR,
- "Warning: versions are different between png.h and png.c\n");
- fprintf(STDERR, " png.h version: %s\n", PNG_LIBPNG_VER_STRING);
- fprintf(STDERR, " png.c version: %s\n\n", png_libpng_ver);
- ++ierror;
- }
-
- if (argc > 1)
- {
- if (strcmp(argv[1], "-m") == 0)
- {
- multiple = 1;
- status_dots_requested = 0;
- }
-
- else if (strcmp(argv[1], "-mv") == 0 ||
- strcmp(argv[1], "-vm") == 0 )
- {
- multiple = 1;
- verbose = 1;
- status_dots_requested = 1;
- }
-
- else if (strcmp(argv[1], "-v") == 0)
- {
- verbose = 1;
- status_dots_requested = 1;
- inname = argv[2];
- }
-
- else
- {
- inname = argv[1];
- status_dots_requested = 0;
- }
- }
-
- if (!multiple && argc == 3 + verbose)
- outname = argv[2 + verbose];
-
- if ((!multiple && argc > 3 + verbose) || (multiple && argc < 2))
- {
- fprintf(STDERR,
- "usage: %s [infile.png] [outfile.png]\n\t%s -m {infile.png}\n",
- argv[0], argv[0]);
- fprintf(STDERR,
- " reads/writes one PNG file (without -m) or multiple files (-m)\n");
- fprintf(STDERR,
- " with -m %s is used as a temporary file\n", outname);
- exit(1);
- }
-
- if (multiple)
- {
- int i;
-#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
- int allocation_now = current_allocation;
-#endif
- for (i=2; i<argc; ++i)
- {
- int kerror;
- fprintf(STDERR, "\n Testing %s:", argv[i]);
- kerror = test_one_file(argv[i], outname);
- if (kerror == 0)
- {
-#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
- int k;
-#endif
-#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED
- fprintf(STDERR, "\n PASS (%lu zero samples)\n",
- (unsigned long)zero_samples);
-#else
- fprintf(STDERR, " PASS\n");
-#endif
-#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
- for (k = 0; k<256; k++)
- if (filters_used[k])
- fprintf(STDERR, " Filter %d was used %lu times\n",
- k, (unsigned long)filters_used[k]);
-#endif
-#ifdef PNG_TIME_RFC1123_SUPPORTED
- if (tIME_chunk_present != 0)
- fprintf(STDERR, " tIME = %s\n", tIME_string);
-
- tIME_chunk_present = 0;
-#endif /* PNG_TIME_RFC1123_SUPPORTED */
- }
-
- else
- {
- fprintf(STDERR, " FAIL\n");
- ierror += kerror;
- }
-#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
- if (allocation_now != current_allocation)
- fprintf(STDERR, "MEMORY ERROR: %d bytes lost\n",
- current_allocation - allocation_now);
-
- if (current_allocation != 0)
- {
- memory_infop pinfo = pinformation;
-
- fprintf(STDERR, "MEMORY ERROR: %d bytes still allocated\n",
- current_allocation);
-
- while (pinfo != NULL)
- {
- fprintf(STDERR, " %lu bytes at %x\n",
- (unsigned long)pinfo->size,
- (unsigned int)pinfo->pointer);
- pinfo = pinfo->next;
- }
- }
-#endif
- }
-#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
- fprintf(STDERR, " Current memory allocation: %10d bytes\n",
- current_allocation);
- fprintf(STDERR, " Maximum memory allocation: %10d bytes\n",
- maximum_allocation);
- fprintf(STDERR, " Total memory allocation: %10d bytes\n",
- total_allocation);
- fprintf(STDERR, " Number of allocations: %10d\n",
- num_allocations);
-#endif
- }
-
- else
- {
- int i;
- for (i = 0; i<3; ++i)
- {
- int kerror;
-#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
- int allocation_now = current_allocation;
-#endif
- if (i == 1)
- status_dots_requested = 1;
-
- else if (verbose == 0)
- status_dots_requested = 0;
-
- if (i == 0 || verbose == 1 || ierror != 0)
- fprintf(STDERR, "\n Testing %s:", inname);
-
- kerror = test_one_file(inname, outname);
-
- if (kerror == 0)
- {
- if (verbose == 1 || i == 2)
- {
-#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
- int k;
-#endif
-#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED
- fprintf(STDERR, "\n PASS (%lu zero samples)\n",
- (unsigned long)zero_samples);
-#else
- fprintf(STDERR, " PASS\n");
-#endif
-#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
- for (k = 0; k<256; k++)
- if (filters_used[k])
- fprintf(STDERR, " Filter %d was used %lu times\n",
- k, (unsigned long)filters_used[k]);
-#endif
-#ifdef PNG_TIME_RFC1123_SUPPORTED
- if (tIME_chunk_present != 0)
- fprintf(STDERR, " tIME = %s\n", tIME_string);
-#endif /* PNG_TIME_RFC1123_SUPPORTED */
- }
- }
-
- else
- {
- if (verbose == 0 && i != 2)
- fprintf(STDERR, "\n Testing %s:", inname);
-
- fprintf(STDERR, " FAIL\n");
- ierror += kerror;
- }
-#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
- if (allocation_now != current_allocation)
- fprintf(STDERR, "MEMORY ERROR: %d bytes lost\n",
- current_allocation - allocation_now);
-
- if (current_allocation != 0)
- {
- memory_infop pinfo = pinformation;
-
- fprintf(STDERR, "MEMORY ERROR: %d bytes still allocated\n",
- current_allocation);
-
- while (pinfo != NULL)
- {
- fprintf(STDERR, " %lu bytes at %x\n",
- (unsigned long)pinfo->size, (unsigned int)pinfo->pointer);
- pinfo = pinfo->next;
- }
- }
-#endif
- }
-#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
- fprintf(STDERR, " Current memory allocation: %10d bytes\n",
- current_allocation);
- fprintf(STDERR, " Maximum memory allocation: %10d bytes\n",
- maximum_allocation);
- fprintf(STDERR, " Total memory allocation: %10d bytes\n",
- total_allocation);
- fprintf(STDERR, " Number of allocations: %10d\n",
- num_allocations);
-#endif
- }
-
-#ifdef PNGTEST_TIMING
- t_stop = (float)clock();
- t_misc += (t_stop - t_start);
- t_start = t_stop;
- fprintf(STDERR, " CPU time used = %.3f seconds",
- (t_misc+t_decode+t_encode)/(float)CLOCKS_PER_SEC);
- fprintf(STDERR, " (decoding %.3f,\n",
- t_decode/(float)CLOCKS_PER_SEC);
- fprintf(STDERR, " encoding %.3f ,",
- t_encode/(float)CLOCKS_PER_SEC);
- fprintf(STDERR, " other %.3f seconds)\n\n",
- t_misc/(float)CLOCKS_PER_SEC);
-#endif
-
- if (ierror == 0)
- fprintf(STDERR, " libpng passes test\n");
-
- else
- fprintf(STDERR, " libpng FAILS test\n");
-
- return (int)(ierror != 0);
-}
-
-/* Generate a compiler error if there is an old png.h in the search path. */
-typedef png_libpng_version_1_5_1 Your_png_h_is_not_version_1_5_1;
diff --git a/src/3rdparty/libpng/pngtrans.c b/src/3rdparty/libpng/pngtrans.c
index 137f555a62..fef12f1851 100644
--- a/src/3rdparty/libpng/pngtrans.c
+++ b/src/3rdparty/libpng/pngtrans.c
@@ -1,8 +1,8 @@
/* pngtrans.c - transforms the data in a row (used by both readers and writers)
*
- * Last changed in libpng 1.5.1 [February 3, 2011]
- * Copyright (c) 1998-2011 Glenn Randers-Pehrson
+ * Last changed in libpng 1.5.10 [March 8, 2012]
+ * Copyright (c) 1998-2012 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -424,170 +424,119 @@ png_do_packswap(png_row_infop row_info, png_bytep row)
#if defined(PNG_WRITE_FILLER_SUPPORTED) || \
defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
-/* Remove filler or alpha byte(s) */
+/* Remove a channel - this used to be 'png_do_strip_filler' but it used a
+ * somewhat weird combination of flags to determine what to do. All the calls
+ * to png_do_strip_filler are changed in 1.5.2 to call this instead with the
+ * correct arguments.
+ *
+ * The routine isn't general - the channel must be the channel at the start or
+ * end (not in the middle) of each pixel.
+ */
void /* PRIVATE */
-png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
+png_do_strip_channel(png_row_infop row_info, png_bytep row, int at_start)
{
- png_debug(1, "in png_do_strip_filler");
-
+ png_bytep sp = row; /* source pointer */
+ png_bytep dp = row; /* destination pointer */
+ png_bytep ep = row + row_info->rowbytes; /* One beyond end of row */
+
+ /* At the start sp will point to the first byte to copy and dp to where
+ * it is copied to. ep always points just beyond the end of the row, so
+ * the loop simply copies (channels-1) channels until sp reaches ep.
+ *
+ * at_start: 0 -- convert AG, XG, ARGB, XRGB, AAGG, XXGG, etc.
+ * nonzero -- convert GA, GX, RGBA, RGBX, GGAA, RRGGBBXX, etc.
+ */
+
+ /* GA, GX, XG cases */
+ if (row_info->channels == 2)
{
- png_bytep sp = row;
- png_bytep dp = row;
- png_uint_32 row_width = row_info->width;
- png_uint_32 i;
-
- if ((row_info->color_type == PNG_COLOR_TYPE_RGB ||
- (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA &&
- (flags & PNG_FLAG_STRIP_ALPHA))) &&
- row_info->channels == 4)
+ if (row_info->bit_depth == 8)
{
- if (row_info->bit_depth == 8)
- {
- /* This converts from RGBX or RGBA to RGB */
- if (flags & PNG_FLAG_FILLER_AFTER)
- {
- dp += 3; sp += 4;
- for (i = 1; i < row_width; i++)
- {
- *dp++ = *sp++;
- *dp++ = *sp++;
- *dp++ = *sp++;
- sp++;
- }
- }
+ if (at_start) /* Skip initial filler */
+ ++sp;
+ else /* Skip initial channel and, for sp, the filler */
+ sp += 2, ++dp;
- /* This converts from XRGB or ARGB to RGB */
- else
- {
- for (i = 0; i < row_width; i++)
- {
- sp++;
- *dp++ = *sp++;
- *dp++ = *sp++;
- *dp++ = *sp++;
- }
- }
- row_info->pixel_depth = 24;
- row_info->rowbytes = row_width * 3;
- }
+ /* For a 1 pixel wide image there is nothing to do */
+ while (sp < ep)
+ *dp++ = *sp, sp += 2;
- else /* if (row_info->bit_depth == 16) */
- {
- if (flags & PNG_FLAG_FILLER_AFTER)
- {
- /* This converts from RRGGBBXX or RRGGBBAA to RRGGBB */
- sp += 8; dp += 6;
- for (i = 1; i < row_width; i++)
- {
- /* This could be (although png_memcpy is probably slower):
- png_memcpy(dp, sp, 6);
- sp += 8;
- dp += 6;
- */
-
- *dp++ = *sp++;
- *dp++ = *sp++;
- *dp++ = *sp++;
- *dp++ = *sp++;
- *dp++ = *sp++;
- *dp++ = *sp++;
- sp += 2;
- }
- }
+ row_info->pixel_depth = 8;
+ }
- else
- {
- /* This converts from XXRRGGBB or AARRGGBB to RRGGBB */
- for (i = 0; i < row_width; i++)
- {
- /* This could be (although png_memcpy is probably slower):
- png_memcpy(dp, sp, 6);
- sp += 8;
- dp += 6;
- */
-
- sp += 2;
- *dp++ = *sp++;
- *dp++ = *sp++;
- *dp++ = *sp++;
- *dp++ = *sp++;
- *dp++ = *sp++;
- *dp++ = *sp++;
- }
- }
+ else if (row_info->bit_depth == 16)
+ {
+ if (at_start) /* Skip initial filler */
+ sp += 2;
+ else /* Skip initial channel and, for sp, the filler */
+ sp += 4, dp += 2;
- row_info->pixel_depth = 48;
- row_info->rowbytes = row_width * 6;
- }
- row_info->channels = 3;
+ while (sp < ep)
+ *dp++ = *sp++, *dp++ = *sp, sp += 3;
+
+ row_info->pixel_depth = 16;
}
- else if ((row_info->color_type == PNG_COLOR_TYPE_GRAY ||
- (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
- (flags & PNG_FLAG_STRIP_ALPHA))) &&
- row_info->channels == 2)
- {
- if (row_info->bit_depth == 8)
- {
- if (flags & PNG_FLAG_FILLER_AFTER)
- {
- /* This converts from GX or GA to G */
- for (i = 0; i < row_width; i++)
- {
- *dp++ = *sp++;
- sp++;
- }
- }
+ else
+ return; /* bad bit depth */
- else
- {
- /* This converts from XG or AG to G */
- for (i = 0; i < row_width; i++)
- {
- sp++;
- *dp++ = *sp++;
- }
- }
+ row_info->channels = 1;
- row_info->pixel_depth = 8;
- row_info->rowbytes = row_width;
- }
+ /* Finally fix the color type if it records an alpha channel */
+ if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
+ row_info->color_type = PNG_COLOR_TYPE_GRAY;
+ }
- else /* if (row_info->bit_depth == 16) */
- {
- if (flags & PNG_FLAG_FILLER_AFTER)
- {
- /* This converts from GGXX or GGAA to GG */
- sp += 4; dp += 2;
- for (i = 1; i < row_width; i++)
- {
- *dp++ = *sp++;
- *dp++ = *sp++;
- sp += 2;
- }
- }
+ /* RGBA, RGBX, XRGB cases */
+ else if (row_info->channels == 4)
+ {
+ if (row_info->bit_depth == 8)
+ {
+ if (at_start) /* Skip initial filler */
+ ++sp;
+ else /* Skip initial channels and, for sp, the filler */
+ sp += 4, dp += 3;
- else
- {
- /* This converts from XXGG or AAGG to GG */
- for (i = 0; i < row_width; i++)
- {
- sp += 2;
- *dp++ = *sp++;
- *dp++ = *sp++;
- }
- }
+ /* Note that the loop adds 3 to dp and 4 to sp each time. */
+ while (sp < ep)
+ *dp++ = *sp++, *dp++ = *sp++, *dp++ = *sp, sp += 2;
+
+ row_info->pixel_depth = 24;
+ }
+
+ else if (row_info->bit_depth == 16)
+ {
+ if (at_start) /* Skip initial filler */
+ sp += 2;
+ else /* Skip initial channels and, for sp, the filler */
+ sp += 8, dp += 6;
- row_info->pixel_depth = 16;
- row_info->rowbytes = row_width * 2;
+ while (sp < ep)
+ {
+ /* Copy 6 bytes, skip 2 */
+ *dp++ = *sp++, *dp++ = *sp++;
+ *dp++ = *sp++, *dp++ = *sp++;
+ *dp++ = *sp++, *dp++ = *sp, sp += 3;
}
- row_info->channels = 1;
+
+ row_info->pixel_depth = 48;
}
- if (flags & PNG_FLAG_STRIP_ALPHA)
- row_info->color_type = (png_byte)(row_info->color_type &
- ~PNG_COLOR_MASK_ALPHA);
+ else
+ return; /* bad bit depth */
+
+ row_info->channels = 3;
+
+ /* Finally fix the color type if it records an alpha channel */
+ if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
+ row_info->color_type = PNG_COLOR_TYPE_RGB;
}
+
+ else
+ return; /* The filler channel has gone already */
+
+ /* Fix the rowbytes value. */
+ row_info->rowbytes = dp-row;
}
#endif
@@ -670,6 +619,109 @@ png_do_bgr(png_row_infop row_info, png_bytep row)
}
#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */
+#if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \
+ defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED)
+/* Added at libpng-1.5.10 */
+void /* PRIVATE */
+png_do_check_palette_indexes(png_structp png_ptr, png_row_infop row_info)
+{
+ if (png_ptr->num_palette < (1 << row_info->bit_depth) &&
+ png_ptr->num_palette_max >= 0)
+ {
+ /* Calculations moved outside switch in an attempt to stop different
+ * compiler warnings. 'padding' is in *bits* within the last byte, it is
+ * an 'int' because pixel_depth becomes an 'int' in the expression below,
+ * and this calculation is used because it avoids warnings that other
+ * forms produced on either GCC or MSVC.
+ */
+ int padding = (-row_info->pixel_depth * row_info->width) & 7;
+ png_bytep rp = png_ptr->row_buf + row_info->rowbytes;
+
+ switch (row_info->bit_depth)
+ {
+ case 1:
+ {
+ /* in this case, all bytes must be 0 so we don't need
+ * to unpack the pixels except for the rightmost one.
+ */
+ for (; rp > png_ptr->row_buf; rp--)
+ {
+ if (*rp >> padding != 0)
+ png_ptr->num_palette_max = 1;
+ padding = 0;
+ }
+
+ break;
+ }
+
+ case 2:
+ {
+ for (; rp > png_ptr->row_buf; rp--)
+ {
+ int i = ((*rp >> padding) & 0x03);
+
+ if (i > png_ptr->num_palette_max)
+ png_ptr->num_palette_max = i;
+
+ i = (((*rp >> padding) >> 2) & 0x03);
+
+ if (i > png_ptr->num_palette_max)
+ png_ptr->num_palette_max = i;
+
+ i = (((*rp >> padding) >> 4) & 0x03);
+
+ if (i > png_ptr->num_palette_max)
+ png_ptr->num_palette_max = i;
+
+ i = (((*rp >> padding) >> 6) & 0x03);
+
+ if (i > png_ptr->num_palette_max)
+ png_ptr->num_palette_max = i;
+
+ padding = 0;
+ }
+
+ break;
+ }
+
+ case 4:
+ {
+ for (; rp > png_ptr->row_buf; rp--)
+ {
+ int i = ((*rp >> padding) & 0x0f);
+
+ if (i > png_ptr->num_palette_max)
+ png_ptr->num_palette_max = i;
+
+ i = (((*rp >> padding) >> 4) & 0x0f);
+
+ if (i > png_ptr->num_palette_max)
+ png_ptr->num_palette_max = i;
+
+ padding = 0;
+ }
+
+ break;
+ }
+
+ case 8:
+ {
+ for (; rp > png_ptr->row_buf; rp--)
+ {
+ if (*rp >= png_ptr->num_palette_max)
+ png_ptr->num_palette_max = (int) *rp;
+ }
+
+ break;
+ }
+
+ default:
+ break;
+ }
+ }
+}
+#endif /* PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED */
+
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
@@ -703,11 +755,16 @@ png_get_user_transform_ptr(png_const_structp png_ptr)
}
#endif
+#ifdef PNG_USER_TRANSFORM_INFO_SUPPORTED
png_uint_32 PNGAPI
png_get_current_row_number(png_const_structp png_ptr)
{
+ /* See the comments in png.h - this is the sub-image row when reading and
+ * interlaced image.
+ */
if (png_ptr != NULL)
return png_ptr->row_number;
+
return PNG_UINT_32_MAX; /* help the app not to fail silently */
}
@@ -718,6 +775,7 @@ png_get_current_pass_number(png_const_structp png_ptr)
return png_ptr->pass;
return 8; /* invalid */
}
+#endif /* PNG_USER_TRANSFORM_INFO_SUPPORTED */
#endif /* PNG_READ_USER_TRANSFORM_SUPPORTED ||
PNG_WRITE_USER_TRANSFORM_SUPPORTED */
#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */
diff --git a/src/3rdparty/libpng/pngvalid.c b/src/3rdparty/libpng/pngvalid.c
deleted file mode 100644
index faebe4b8b7..0000000000
--- a/src/3rdparty/libpng/pngvalid.c
+++ /dev/null
@@ -1,6658 +0,0 @@
-
-/* pngvalid.c - validate libpng by constructing then reading png files.
- *
- * Last changed in libpng 1.5.1 [February 3, 2011]
- * Copyright (c) 2011 Glenn Randers-Pehrson
- * Written by John Cunningham Bowler
- *
- * This code is released under the libpng license.
- * For conditions of distribution and use, see the disclaimer
- * and license in png.h
- *
- * NOTES:
- * This is a C program that is intended to be linked against libpng. It
- * generates bitmaps internally, stores them as PNG files (using the
- * sequential write code) then reads them back (using the sequential
- * read code) and validates that the result has the correct data.
- *
- * The program can be modified and extended to test the correctness of
- * transformations performed by libpng.
- */
-
-#include "png.h"
-#if PNG_LIBPNG_VER < 10500
-/* This delibarately lacks the PNG_CONST. */
-typedef png_byte *png_const_bytep;
-
-/* This is copied from 1.5.1 png.h: */
-#define PNG_INTERLACE_ADAM7_PASSES 7
-#define PNG_PASS_START_ROW(pass) (((1U&~(pass))<<(3-((pass)>>1)))&7)
-#define PNG_PASS_START_COL(pass) (((1U& (pass))<<(3-(((pass)+1)>>1)))&7)
-#define PNG_PASS_ROW_SHIFT(pass) ((pass)>2?(8-(pass))>>1:3)
-#define PNG_PASS_COL_SHIFT(pass) ((pass)>1?(7-(pass))>>1:3)
-#define PNG_PASS_ROWS(height, pass) (((height)+(((1<<PNG_PASS_ROW_SHIFT(pass))\
- -1)-PNG_PASS_START_ROW(pass)))>>PNG_PASS_ROW_SHIFT(pass))
-#define PNG_PASS_COLS(width, pass) (((width)+(((1<<PNG_PASS_COL_SHIFT(pass))\
- -1)-PNG_PASS_START_COL(pass)))>>PNG_PASS_COL_SHIFT(pass))
-#define PNG_ROW_FROM_PASS_ROW(yIn, pass) \
- (((yIn)<<PNG_PASS_ROW_SHIFT(pass))+PNG_PASS_START_ROW(pass))
-#define PNG_COL_FROM_PASS_COL(xIn, pass) \
- (((xIn)<<PNG_PASS_COL_SHIFT(pass))+PNG_PASS_START_COL(pass))
-#define PNG_PASS_MASK(pass,off) ( \
- ((0x110145AFU>>(((7-(off))-(pass))<<2)) & 0xFU) | \
- ((0x01145AF0U>>(((7-(off))-(pass))<<2)) & 0xF0U))
-#define PNG_ROW_IN_INTERLACE_PASS(y, pass) \
- ((PNG_PASS_MASK(pass,0) >> ((y)&7)) & 1)
-#define PNG_COL_IN_INTERLACE_PASS(x, pass) \
- ((PNG_PASS_MASK(pass,1) >> ((x)&7)) & 1)
-
-/* These are needed too for the defualt build: */
-#define PNG_WRITE_16BIT_SUPPORTED
-#define PNG_READ_16BIT_SUPPORTED
-#endif
-
-#include "zlib.h" /* For crc32 */
-
-#include <float.h> /* For floating point constants */
-#include <stdlib.h> /* For malloc */
-#include <string.h> /* For memcpy, memset */
-#include <math.h> /* For floor */
-
-/* Unused formal parameter errors are removed using the following macro which is
- * expected to have no bad effects on performance.
- */
-#ifndef UNUSED
-# if defined(__GNUC__) || defined(_MSC_VER)
-# define UNUSED(param) (void)param;
-# else
-# define UNUSED(param)
-# endif
-#endif
-
-/***************************** EXCEPTION HANDLING *****************************/
-#include "contrib/visupng/cexcept.h"
-struct png_store;
-define_exception_type(struct png_store*);
-
-/* The following are macros to reduce typing everywhere where the well known
- * name 'the_exception_context' must be defined.
- */
-#define anon_context(ps) struct exception_context *the_exception_context = \
- &(ps)->exception_context
-#define context(ps,fault) anon_context(ps); png_store *fault
-
-/******************************* UTILITIES ************************************/
-/* Error handling is particularly problematic in production code - error
- * handlers often themselves have bugs which lead to programs that detect
- * minor errors crashing. The following functions deal with one very
- * common class of errors in error handlers - attempting to format error or
- * warning messages into buffers that are too small.
- */
-static size_t safecat(char *buffer, size_t bufsize, size_t pos,
- PNG_CONST char *cat)
-{
- while (pos < bufsize && cat != NULL && *cat != 0)
- buffer[pos++] = *cat++;
-
- if (pos >= bufsize)
- pos = bufsize-1;
-
- buffer[pos] = 0;
- return pos;
-}
-
-static size_t safecatn(char *buffer, size_t bufsize, size_t pos, int n)
-{
- char number[64];
- sprintf(number, "%d", n);
- return safecat(buffer, bufsize, pos, number);
-}
-
-static size_t safecatd(char *buffer, size_t bufsize, size_t pos, double d,
- int precision)
-{
- char number[64];
- sprintf(number, "%.*f", precision, d);
- return safecat(buffer, bufsize, pos, number);
-}
-
-static PNG_CONST char invalid[] = "invalid";
-static PNG_CONST char sep[] = ": ";
-
-/* NOTE: this is indexed by ln2(bit_depth)! */
-static PNG_CONST char *bit_depths[8] =
-{
- "1", "2", "4", "8", "16", invalid, invalid, invalid
-};
-
-static PNG_CONST char *colour_types[8] =
-{
- "greyscale", invalid, "truecolour", "indexed-colour",
- "greyscale with alpha", invalid, "truecolour with alpha", invalid
-};
-
-/* To get log-bit-depth from bit depth, returns 0 to 7 (7 on error). */
-static unsigned int
-log2depth(png_byte bit_depth)
-{
- switch (bit_depth)
- {
- case 1:
- return 0;
-
- case 2:
- return 1;
-
- case 4:
- return 2;
-
- case 8:
- return 3;
-
- case 16:
- return 4;
-
- default:
- return 7;
- }
-}
-
-/* A numeric ID based on PNG file characteristics. The 'do_interlace' field
- * simply records whether pngvalid did the interlace itself or whether it
- * was done by libpng. Width and height must be less than 256.
- */
-#define FILEID(col, depth, interlace, width, height, do_interlace) \
- ((png_uint_32)((col) + ((depth)<<3) + ((interlace)<<8) + \
- (((do_interlace)!=0)<<15) + ((width)<<16) + ((height)<<24)))
-
-#define COL_FROM_ID(id) ((png_byte)((id)& 0x7U))
-#define DEPTH_FROM_ID(id) ((png_byte)(((id) >> 3) & 0x1fU))
-#define INTERLACE_FROM_ID(id) ((int)(((id) >> 8) & 0x3))
-#define DO_INTERLACE_FROM_ID(id) ((int)(((id)>>15) & 1))
-#define WIDTH_FROM_ID(id) (((id)>>16) & 0xff)
-#define HEIGHT_FROM_ID(id) (((id)>>24) & 0xff)
-
-/* Utility to construct a standard name for a standard image. */
-static size_t
-standard_name(char *buffer, size_t bufsize, size_t pos, png_byte colour_type,
- int log_bit_depth, int interlace_type, png_uint_32 w, png_uint_32 h,
- int do_interlace)
-{
- pos = safecat(buffer, bufsize, pos, colour_types[colour_type]);
- pos = safecat(buffer, bufsize, pos, " ");
- pos = safecat(buffer, bufsize, pos, bit_depths[log_bit_depth]);
- pos = safecat(buffer, bufsize, pos, " bit ");
-
- if (interlace_type != PNG_INTERLACE_NONE)
- pos = safecat(buffer, bufsize, pos, "interlaced");
- if (do_interlace)
- pos = safecat(buffer, bufsize, pos, "(pngvalid)");
- else
- pos = safecat(buffer, bufsize, pos, "(libpng)");
- if (w > 0 || h > 0)
- {
- pos = safecat(buffer, bufsize, pos, " ");
- pos = safecatn(buffer, bufsize, pos, w);
- pos = safecat(buffer, bufsize, pos, "x");
- pos = safecatn(buffer, bufsize, pos, h);
- }
-
- return pos;
-}
-
-static size_t
-standard_name_from_id(char *buffer, size_t bufsize, size_t pos, png_uint_32 id)
-{
- return standard_name(buffer, bufsize, pos, COL_FROM_ID(id),
- log2depth(DEPTH_FROM_ID(id)), INTERLACE_FROM_ID(id),
- WIDTH_FROM_ID(id), HEIGHT_FROM_ID(id), DO_INTERLACE_FROM_ID(id));
-}
-
-/* Convenience API and defines to list valid formats. Note that 16 bit read and
- * write support is required to do 16 bit read tests (we must be able to make a
- * 16 bit image to test!)
- */
-#ifdef PNG_WRITE_16BIT_SUPPORTED
-# define WRITE_BDHI 4
-# ifdef PNG_READ_16BIT_SUPPORTED
-# define READ_BDHI 4
-# define DO_16BIT
-# endif
-#else
-# define WRITE_BDHI 3
-#endif
-#ifndef DO_16BIT
-# define READ_BDHI 3
-#endif
-
-static int
-next_format(png_bytep colour_type, png_bytep bit_depth)
-{
- if (*bit_depth == 0)
- {
- *colour_type = 0, *bit_depth = 1;
- return 1;
- }
-
- *bit_depth = (png_byte)(*bit_depth << 1);
-
- /* Palette images are restricted to 8 bit depth */
- if (*bit_depth <= 8
-# ifdef DO_16BIT
- || (*colour_type != 3 && *bit_depth <= 16)
-# endif
- )
- return 1;
-
- /* Move to the next color type, or return 0 at the end. */
- switch (*colour_type)
- {
- case 0:
- *colour_type = 2;
- *bit_depth = 8;
- return 1;
-
- case 2:
- *colour_type = 3;
- *bit_depth = 1;
- return 1;
-
- case 3:
- *colour_type = 4;
- *bit_depth = 8;
- return 1;
-
- case 4:
- *colour_type = 6;
- *bit_depth = 8;
- return 1;
-
- default:
- return 0;
- }
-}
-
-static unsigned int
-sample(png_const_bytep row, png_byte colour_type, png_byte bit_depth,
- png_uint_32 x, unsigned int sample_index)
-{
- png_uint_32 bit_index, result;
-
- /* Find a sample index for the desired sample: */
- x *= bit_depth;
- bit_index = x;
-
- if ((colour_type & 1) == 0) /* !palette */
- {
- if (colour_type & 2)
- bit_index *= 3;
-
- if (colour_type & 4)
- bit_index += x; /* Alpha channel */
-
- if (colour_type & (2+4))
- bit_index += sample_index * bit_depth; /* Multiple channels: select one */
- }
-
- /* Return the sample from the row as an integer. */
- row += bit_index >> 3;
- result = *row;
-
- if (bit_depth == 8)
- return result;
-
- else if (bit_depth > 8)
- return (result << 8) + *++row;
-
- /* Less than 8 bits per sample. */
- bit_index &= 7;
- return (result >> (8-bit_index-bit_depth)) & ((1U<<bit_depth)-1);
-}
-
-/* Copy a single pixel, of a given size, from one buffer to another -
- * while this is basically bit addressed there is an implicit assumption
- * that pixels 8 or more bits in size are byte aligned and that pixels
- * do not otherwise cross byte boundaries. (This is, so far as I know,
- * universally true in bitmap computer graphics. [JCB 20101212])
- *
- * NOTE: The to and from buffers may be the same.
- */
-static void
-pixel_copy(png_bytep toBuffer, png_uint_32 toIndex,
- png_const_bytep fromBuffer, png_uint_32 fromIndex, unsigned int pixelSize)
-{
- /* Assume we can multiply by 'size' without overflow because we are
- * just working in a single buffer.
- */
- toIndex *= pixelSize;
- fromIndex *= pixelSize;
- if (pixelSize < 8) /* Sub-byte */
- {
- /* Mask to select the location of the copied pixel: */
- unsigned int destMask = ((1U<<pixelSize)-1) << (8-pixelSize-(toIndex&7));
- /* The following read the entire pixels and clears the extra: */
- unsigned int destByte = toBuffer[toIndex >> 3] & ~destMask;
- unsigned int sourceByte = fromBuffer[fromIndex >> 3];
-
- /* Don't rely on << or >> supporting '0' here, just in case: */
- fromIndex &= 7;
- if (fromIndex > 0) sourceByte <<= fromIndex;
- if ((toIndex & 7) > 0) sourceByte >>= toIndex & 7;
-
- toBuffer[toIndex >> 3] = (png_byte)(destByte | (sourceByte & destMask));
- }
- else /* One or more bytes */
- memmove(toBuffer+(toIndex>>3), fromBuffer+(fromIndex>>3), pixelSize>>3);
-}
-
-/* Compare pixels - they are assumed to start at the first byte in the
- * given buffers.
- */
-static int
-pixel_cmp(png_const_bytep pa, png_const_bytep pb, png_uint_32 bit_width)
-{
- if (memcmp(pa, pb, bit_width>>3) == 0)
- {
- png_uint_32 p;
-
- if ((bit_width & 7) == 0) return 0;
-
- /* Ok, any differences? */
- p = pa[bit_width >> 3];
- p ^= pb[bit_width >> 3];
-
- if (p == 0) return 0;
-
- /* There are, but they may not be significant, remove the bits
- * after the end (the low order bits in PNG.)
- */
- bit_width &= 7;
- p >>= 8-bit_width;
-
- if (p == 0) return 0;
- }
-
- return 1; /* Different */
-}
-
-/*************************** BASIC PNG FILE WRITING ***************************/
-/* A png_store takes data from the sequential writer or provides data
- * to the sequential reader. It can also store the result of a PNG
- * write for later retrieval.
- */
-#define STORE_BUFFER_SIZE 500 /* arbitrary */
-typedef struct png_store_buffer
-{
- struct png_store_buffer* prev; /* NOTE: stored in reverse order */
- png_byte buffer[STORE_BUFFER_SIZE];
-} png_store_buffer;
-
-#define FILE_NAME_SIZE 64
-
-typedef struct png_store_file
-{
- struct png_store_file* next; /* as many as you like... */
- char name[FILE_NAME_SIZE];
- png_uint_32 id; /* must be correct (see FILEID) */
- png_size_t datacount; /* In this (the last) buffer */
- png_store_buffer data; /* Last buffer in file */
-} png_store_file;
-
-/* The following is a pool of memory allocated by a single libpng read or write
- * operation.
- */
-typedef struct store_pool
-{
- struct png_store *store; /* Back pointer */
- struct store_memory *list; /* List of allocated memory */
- png_byte mark[4]; /* Before and after data */
-
- /* Statistics for this run. */
- png_alloc_size_t max; /* Maximum single allocation */
- png_alloc_size_t current; /* Current allocation */
- png_alloc_size_t limit; /* Highest current allocation */
- png_alloc_size_t total; /* Total allocation */
-
- /* Overall statistics (retained across successive runs). */
- png_alloc_size_t max_max;
- png_alloc_size_t max_limit;
- png_alloc_size_t max_total;
-} store_pool;
-
-typedef struct png_store
-{
- /* For cexcept.h exception handling - simply store one of these;
- * the context is a self pointer but it may point to a different
- * png_store (in fact it never does in this program.)
- */
- struct exception_context
- exception_context;
-
- unsigned int verbose :1;
- unsigned int treat_warnings_as_errors :1;
- unsigned int expect_error :1;
- unsigned int expect_warning :1;
- unsigned int saw_warning :1;
- unsigned int speed :1;
- unsigned int progressive :1; /* use progressive read */
- unsigned int validated :1; /* used as a temporary flag */
- int nerrors;
- int nwarnings;
- char test[128]; /* Name of test */
- char error[256];
-
- /* Read fields */
- png_structp pread; /* Used to read a saved file */
- png_infop piread;
- png_store_file* current; /* Set when reading */
- png_store_buffer* next; /* Set when reading */
- png_size_t readpos; /* Position in *next */
- png_byte* image; /* Buffer for reading interlaced images */
- size_t cb_image; /* Size of this buffer */
- store_pool read_memory_pool;
-
- /* Write fields */
- png_store_file* saved;
- png_structp pwrite; /* Used when writing a new file */
- png_infop piwrite;
- png_size_t writepos; /* Position in .new */
- char wname[FILE_NAME_SIZE];
- png_store_buffer new; /* The end of the new PNG file being written. */
- store_pool write_memory_pool;
-} png_store;
-
-/* Initialization and cleanup */
-static void
-store_pool_mark(png_byte *mark)
-{
- /* Generate a new mark. This uses a boring repeatable algorithm and it is
- * implemented here so that it gives the same set of numbers on every
- * architecture. It's a linear congruential generator (Knuth or Sedgewick
- * "Algorithms") but it comes from the 'feedback taps' table in Horowitz and
- * Hill, "The Art of Electronics".
- */
- static png_uint_32 u0 = 0x12345678, u1 = 1;
-
- /* There are thirty three bits, the next bit in the sequence is bit-33 XOR
- * bit-20. The top 1 bit is in u1, the bottom 32 are in u0.
- */
- int i;
- for (i=0; i<4; ++i)
- {
- /* First generate 8 new bits then shift them in at the end. */
- png_uint_32 u = ((u0 >> (20-8)) ^ ((u1 << 7) | (u0 >> (32-7)))) & 0xff;
- u1 <<= 8;
- u1 |= u0 >> 24;
- u0 <<= 8;
- u0 |= u;
- *mark++ = (png_byte)u;
- }
-}
-
-/* Use this for random 32 bit values, this function makes sure the result is
- * non-zero.
- */
-static png_uint_32
-random_32(void)
-{
-
- for(;;)
- {
- png_byte mark[4];
- png_uint_32 result;
-
- store_pool_mark(mark);
- result = png_get_uint_32(mark);
-
- if (result != 0)
- return result;
- }
-}
-
-static void
-store_pool_init(png_store *ps, store_pool *pool)
-{
- memset(pool, 0, sizeof *pool);
-
- pool->store = ps;
- pool->list = NULL;
- pool->max = pool->current = pool->limit = pool->total = 0;
- pool->max_max = pool->max_limit = pool->max_total = 0;
- store_pool_mark(pool->mark);
-}
-
-static void
-store_init(png_store* ps)
-{
- memset(ps, 0, sizeof *ps);
- init_exception_context(&ps->exception_context);
- store_pool_init(ps, &ps->read_memory_pool);
- store_pool_init(ps, &ps->write_memory_pool);
- ps->verbose = 0;
- ps->treat_warnings_as_errors = 0;
- ps->expect_error = 0;
- ps->expect_warning = 0;
- ps->saw_warning = 0;
- ps->speed = 0;
- ps->progressive = 0;
- ps->validated = 0;
- ps->nerrors = ps->nwarnings = 0;
- ps->pread = NULL;
- ps->piread = NULL;
- ps->saved = ps->current = NULL;
- ps->next = NULL;
- ps->readpos = 0;
- ps->image = NULL;
- ps->cb_image = 0;
- ps->pwrite = NULL;
- ps->piwrite = NULL;
- ps->writepos = 0;
- ps->new.prev = NULL;
-}
-
-/* This somewhat odd function is used when reading an image to ensure that the
- * buffer is big enough - this is why a png_structp is available.
- */
-static void
-store_ensure_image(png_store *ps, png_structp pp, size_t cb)
-{
- if (ps->cb_image < cb)
- {
- if (ps->image != NULL)
- {
- free(ps->image-1);
- ps->cb_image = 0;
- }
-
- /* The buffer is deliberately mis-aligned. */
- ps->image = malloc(cb+1);
- if (ps->image == NULL)
- png_error(pp, "OOM allocating image buffer");
-
- ++(ps->image);
- ps->cb_image = cb;
- }
-
- /* And, for error checking, the whole buffer is set to '1' - this
- * matches what happens with the 'size' test images on write and also
- * matches the unused bits in the test rows.
- */
- memset(ps->image, 0xff, cb);
-}
-
-static void
-store_freebuffer(png_store_buffer* psb)
-{
- if (psb->prev)
- {
- store_freebuffer(psb->prev);
- free(psb->prev);
- psb->prev = NULL;
- }
-}
-
-static void
-store_freenew(png_store *ps)
-{
- store_freebuffer(&ps->new);
- ps->writepos = 0;
-}
-
-static void
-store_storenew(png_store *ps)
-{
- png_store_buffer *pb;
-
- if (ps->writepos != STORE_BUFFER_SIZE)
- png_error(ps->pwrite, "invalid store call");
-
- pb = malloc(sizeof *pb);
-
- if (pb == NULL)
- png_error(ps->pwrite, "store new: OOM");
-
- *pb = ps->new;
- ps->new.prev = pb;
- ps->writepos = 0;
-}
-
-static void
-store_freefile(png_store_file **ppf)
-{
- if (*ppf != NULL)
- {
- store_freefile(&(*ppf)->next);
-
- store_freebuffer(&(*ppf)->data);
- (*ppf)->datacount = 0;
- free(*ppf);
- *ppf = NULL;
- }
-}
-
-/* Main interface to file storeage, after writing a new PNG file (see the API
- * below) call store_storefile to store the result with the given name and id.
- */
-static void
-store_storefile(png_store *ps, png_uint_32 id)
-{
- png_store_file *pf = malloc(sizeof *pf);
- if (pf == NULL)
- png_error(ps->pwrite, "storefile: OOM");
- safecat(pf->name, sizeof pf->name, 0, ps->wname);
- pf->id = id;
- pf->data = ps->new;
- pf->datacount = ps->writepos;
- ps->new.prev = NULL;
- ps->writepos = 0;
-
- /* And save it. */
- pf->next = ps->saved;
- ps->saved = pf;
-}
-
-/* Generate an error message (in the given buffer) */
-static size_t
-store_message(png_store *ps, png_structp pp, char *buffer, size_t bufsize,
- size_t pos, PNG_CONST char *msg)
-{
- if (pp != NULL && pp == ps->pread)
- {
- /* Reading a file */
- pos = safecat(buffer, bufsize, pos, "read: ");
-
- if (ps->current != NULL)
- {
- pos = safecat(buffer, bufsize, pos, ps->current->name);
- pos = safecat(buffer, bufsize, pos, sep);
- }
- }
-
- else if (pp != NULL && pp == ps->pwrite)
- {
- /* Writing a file */
- pos = safecat(buffer, bufsize, pos, "write: ");
- pos = safecat(buffer, bufsize, pos, ps->wname);
- pos = safecat(buffer, bufsize, pos, sep);
- }
-
- else
- {
- /* Neither reading nor writing (or a memory error in struct delete) */
- pos = safecat(buffer, bufsize, pos, "pngvalid: ");
- }
-
- if (ps->test[0] != 0)
- {
- pos = safecat(buffer, bufsize, pos, ps->test);
- pos = safecat(buffer, bufsize, pos, sep);
- }
- pos = safecat(buffer, bufsize, pos, msg);
- return pos;
-}
-
-/* Log an error or warning - the relevant count is always incremented. */
-static void
-store_log(png_store* ps, png_structp pp, png_const_charp message, int is_error)
-{
- /* The warning is copied to the error buffer if there are no errors and it is
- * the first warning. The error is copied to the error buffer if it is the
- * first error (overwriting any prior warnings).
- */
- if (is_error ? (ps->nerrors)++ == 0 :
- (ps->nwarnings)++ == 0 && ps->nerrors == 0)
- store_message(ps, pp, ps->error, sizeof ps->error, 0, message);
-
- if (ps->verbose)
- {
- char buffer[256];
- size_t pos;
-
- if (is_error)
- pos = safecat(buffer, sizeof buffer, 0, "error: ");
- else
- pos = safecat(buffer, sizeof buffer, 0, "warning: ");
-
- store_message(ps, pp, buffer, sizeof buffer, pos, message);
- fputs(buffer, stderr);
- fputc('\n', stderr);
- }
-}
-
-/* Functions to use as PNG callbacks. */
-static void
-store_error(png_structp pp, png_const_charp message) /* PNG_NORETURN */
-{
- png_store *ps = png_get_error_ptr(pp);
-
- if (!ps->expect_error)
- store_log(ps, pp, message, 1 /* error */);
-
- /* And finally throw an exception. */
- {
- struct exception_context *the_exception_context = &ps->exception_context;
- Throw ps;
- }
-}
-
-static void
-store_warning(png_structp pp, png_const_charp message)
-{
- png_store *ps = png_get_error_ptr(pp);
-
- if (!ps->expect_warning)
- store_log(ps, pp, message, 0 /* warning */);
- else
- ps->saw_warning = 1;
-}
-
-static void
-store_write(png_structp pp, png_bytep pb, png_size_t st)
-{
- png_store *ps = png_get_io_ptr(pp);
-
- if (ps->pwrite != pp)
- png_error(pp, "store state damaged");
-
- while (st > 0)
- {
- size_t cb;
-
- if (ps->writepos >= STORE_BUFFER_SIZE)
- store_storenew(ps);
-
- cb = st;
-
- if (cb > STORE_BUFFER_SIZE - ps->writepos)
- cb = STORE_BUFFER_SIZE - ps->writepos;
-
- memcpy(ps->new.buffer + ps->writepos, pb, cb);
- pb += cb;
- st -= cb;
- ps->writepos += cb;
- }
-}
-
-static void
-store_flush(png_structp pp)
-{
- UNUSED(pp) /*DOES NOTHING*/
-}
-
-static size_t
-store_read_buffer_size(png_store *ps)
-{
- /* Return the bytes available for read in the current buffer. */
- if (ps->next != &ps->current->data)
- return STORE_BUFFER_SIZE;
-
- return ps->current->datacount;
-}
-
-/* Return total bytes available for read. */
-static size_t
-store_read_buffer_avail(png_store *ps)
-{
- if (ps->current != NULL && ps->next != NULL)
- {
- png_store_buffer *next = &ps->current->data;
- size_t cbAvail = ps->current->datacount;
-
- while (next != ps->next && next != NULL)
- {
- next = next->prev;
- cbAvail += STORE_BUFFER_SIZE;
- }
-
- if (next != ps->next)
- png_error(ps->pread, "buffer read error");
-
- if (cbAvail > ps->readpos)
- return cbAvail - ps->readpos;
- }
-
- return 0;
-}
-
-static int
-store_read_buffer_next(png_store *ps)
-{
- png_store_buffer *pbOld = ps->next;
- png_store_buffer *pbNew = &ps->current->data;
- if (pbOld != pbNew)
- {
- while (pbNew != NULL && pbNew->prev != pbOld)
- pbNew = pbNew->prev;
-
- if (pbNew != NULL)
- {
- ps->next = pbNew;
- ps->readpos = 0;
- return 1;
- }
-
- png_error(ps->pread, "buffer lost");
- }
-
- return 0; /* EOF or error */
-}
-
-/* Need separate implementation and callback to allow use of the same code
- * during progressive read, where the io_ptr is set internally by libpng.
- */
-static void
-store_read_imp(png_store *ps, png_bytep pb, png_size_t st)
-{
- if (ps->current == NULL || ps->next == NULL)
- png_error(ps->pread, "store state damaged");
-
- while (st > 0)
- {
- size_t cbAvail = store_read_buffer_size(ps) - ps->readpos;
-
- if (cbAvail > 0)
- {
- if (cbAvail > st) cbAvail = st;
- memcpy(pb, ps->next->buffer + ps->readpos, cbAvail);
- st -= cbAvail;
- pb += cbAvail;
- ps->readpos += cbAvail;
- }
-
- else if (!store_read_buffer_next(ps))
- png_error(ps->pread, "read beyond end of file");
- }
-}
-
-static void
-store_read(png_structp pp, png_bytep pb, png_size_t st)
-{
- png_store *ps = png_get_io_ptr(pp);
-
- if (ps == NULL || ps->pread != pp)
- png_error(pp, "bad store read call");
-
- store_read_imp(ps, pb, st);
-}
-
-static void
-store_progressive_read(png_store *ps, png_structp pp, png_infop pi)
-{
- /* Notice that a call to store_read will cause this function to fail because
- * readpos will be set.
- */
- if (ps->pread != pp || ps->current == NULL || ps->next == NULL)
- png_error(pp, "store state damaged (progressive)");
-
- do
- {
- if (ps->readpos != 0)
- png_error(pp, "store_read called during progressive read");
-
- png_process_data(pp, pi, ps->next->buffer, store_read_buffer_size(ps));
- }
- while (store_read_buffer_next(ps));
-}
-
-/***************************** MEMORY MANAGEMENT*** ***************************/
-/* A store_memory is simply the header for an allocated block of memory. The
- * pointer returned to libpng is just after the end of the header block, the
- * allocated memory is followed by a second copy of the 'mark'.
- */
-typedef struct store_memory
-{
- store_pool *pool; /* Originating pool */
- struct store_memory *next; /* Singly linked list */
- png_alloc_size_t size; /* Size of memory allocated */
- png_byte mark[4]; /* ID marker */
-} store_memory;
-
-/* Handle a fatal error in memory allocation. This calls png_error if the
- * libpng struct is non-NULL, else it outputs a message and returns. This means
- * that a memory problem while libpng is running will abort (png_error) the
- * handling of particular file while one in cleanup (after the destroy of the
- * struct has returned) will simply keep going and free (or attempt to free)
- * all the memory.
- */
-static void
-store_pool_error(png_store *ps, png_structp pp, PNG_CONST char *msg)
-{
- if (pp != NULL)
- png_error(pp, msg);
-
- /* Else we have to do it ourselves. png_error eventually calls store_log,
- * above. store_log accepts a NULL png_structp - it just changes what gets
- * output by store_message.
- */
- store_log(ps, pp, msg, 1 /* error */);
-}
-
-static void
-store_memory_free(png_structp pp, store_pool *pool, store_memory *memory)
-{
- /* Note that pp may be NULL (see store_pool_delete below), the caller has
- * found 'memory' in pool->list *and* unlinked this entry, so this is a valid
- * pointer (for sure), but the contents may have been trashed.
- */
- if (memory->pool != pool)
- store_pool_error(pool->store, pp, "memory corrupted (pool)");
-
- else if (memcmp(memory->mark, pool->mark, sizeof memory->mark) != 0)
- store_pool_error(pool->store, pp, "memory corrupted (start)");
-
- /* It should be safe to read the size field now. */
- else
- {
- png_alloc_size_t cb = memory->size;
-
- if (cb > pool->max)
- store_pool_error(pool->store, pp, "memory corrupted (size)");
-
- else if (memcmp((png_bytep)(memory+1)+cb, pool->mark, sizeof pool->mark)
- != 0)
- store_pool_error(pool->store, pp, "memory corrupted (end)");
-
- /* Finally give the library a chance to find problems too: */
- else
- {
- pool->current -= cb;
- free(memory);
- }
- }
-}
-
-static void
-store_pool_delete(png_store *ps, store_pool *pool)
-{
- if (pool->list != NULL)
- {
- fprintf(stderr, "%s: %s %s: memory lost (list follows):\n", ps->test,
- pool == &ps->read_memory_pool ? "read" : "write",
- pool == &ps->read_memory_pool ? (ps->current != NULL ?
- ps->current->name : "unknown file") : ps->wname);
- ++ps->nerrors;
-
- do
- {
- store_memory *next = pool->list;
- pool->list = next->next;
- next->next = NULL;
-
- fprintf(stderr, "\t%lu bytes @ %p\n",
- (unsigned long)next->size, next+1);
- /* The NULL means this will always return, even if the memory is
- * corrupted.
- */
- store_memory_free(NULL, pool, next);
- }
- while (pool->list != NULL);
- }
-
- /* And reset the other fields too for the next time. */
- if (pool->max > pool->max_max) pool->max_max = pool->max;
- pool->max = 0;
- if (pool->current != 0) /* unexpected internal error */
- fprintf(stderr, "%s: %s %s: memory counter mismatch (internal error)\n",
- ps->test, pool == &ps->read_memory_pool ? "read" : "write",
- pool == &ps->read_memory_pool ? (ps->current != NULL ?
- ps->current->name : "unknown file") : ps->wname);
- pool->current = 0;
-
- if (pool->limit > pool->max_limit)
- pool->max_limit = pool->limit;
-
- pool->limit = 0;
-
- if (pool->total > pool->max_total)
- pool->max_total = pool->total;
-
- pool->total = 0;
-
- /* Get a new mark too. */
- store_pool_mark(pool->mark);
-}
-
-/* The memory callbacks: */
-static png_voidp
-store_malloc(png_structp pp, png_alloc_size_t cb)
-{
- store_pool *pool = png_get_mem_ptr(pp);
- store_memory *new = malloc(cb + (sizeof *new) + (sizeof pool->mark));
-
- if (new != NULL)
- {
- if (cb > pool->max)
- pool->max = cb;
-
- pool->current += cb;
-
- if (pool->current > pool->limit)
- pool->limit = pool->current;
-
- pool->total += cb;
-
- new->size = cb;
- memcpy(new->mark, pool->mark, sizeof new->mark);
- memcpy((png_byte*)(new+1) + cb, pool->mark, sizeof pool->mark);
- new->pool = pool;
- new->next = pool->list;
- pool->list = new;
- ++new;
- }
-
- else
- store_pool_error(pool->store, pp, "out of memory");
-
- return new;
-}
-
-static void
-store_free(png_structp pp, png_voidp memory)
-{
- store_pool *pool = png_get_mem_ptr(pp);
- store_memory *this = memory, **test;
-
- /* First check that this 'memory' really is valid memory - it must be in the
- * pool list. If it is, use the shared memory_free function to free it.
- */
- --this;
- for (test = &pool->list; *test != this; test = &(*test)->next)
- {
- if (*test == NULL)
- {
- store_pool_error(pool->store, pp, "bad pointer to free");
- return;
- }
- }
-
- /* Unlink this entry, *test == this. */
- *test = this->next;
- this->next = NULL;
- store_memory_free(pp, pool, this);
-}
-
-/* Setup functions. */
-/* Cleanup when aborting a write or after storing the new file. */
-static void
-store_write_reset(png_store *ps)
-{
- if (ps->pwrite != NULL)
- {
- anon_context(ps);
-
- Try
- png_destroy_write_struct(&ps->pwrite, &ps->piwrite);
-
- Catch_anonymous
- {
- /* memory corruption: continue. */
- }
-
- ps->pwrite = NULL;
- ps->piwrite = NULL;
- }
-
- /* And make sure that all the memory has been freed - this will output
- * spurious errors in the case of memory corruption above, but this is safe.
- */
- store_pool_delete(ps, &ps->write_memory_pool);
-
- store_freenew(ps);
-}
-
-/* The following is the main write function, it returns a png_struct and,
- * optionally, a png_info suitable for writiing a new PNG file. Use
- * store_storefile above to record this file after it has been written. The
- * returned libpng structures as destroyed by store_write_reset above.
- */
-static png_structp
-set_store_for_write(png_store *ps, png_infopp ppi,
- PNG_CONST char * volatile name)
-{
- anon_context(ps);
-
- Try
- {
- if (ps->pwrite != NULL)
- png_error(ps->pwrite, "write store already in use");
-
- store_write_reset(ps);
- safecat(ps->wname, sizeof ps->wname, 0, name);
-
- /* Don't do the slow memory checks if doing a speed test. */
- if (ps->speed)
- ps->pwrite = png_create_write_struct(PNG_LIBPNG_VER_STRING,
- ps, store_error, store_warning);
-
- else
- ps->pwrite = png_create_write_struct_2(PNG_LIBPNG_VER_STRING,
- ps, store_error, store_warning, &ps->write_memory_pool,
- store_malloc, store_free);
-
- png_set_write_fn(ps->pwrite, ps, store_write, store_flush);
-
- if (ppi != NULL)
- *ppi = ps->piwrite = png_create_info_struct(ps->pwrite);
- }
-
- Catch_anonymous
- return NULL;
-
- return ps->pwrite;
-}
-
-/* Cleanup when finished reading (either due to error or in the success case).
- */
-static void
-store_read_reset(png_store *ps)
-{
- if (ps->pread != NULL)
- {
- anon_context(ps);
-
- Try
- png_destroy_read_struct(&ps->pread, &ps->piread, NULL);
-
- Catch_anonymous
- {
- /* error already output: continue */
- }
-
- ps->pread = NULL;
- ps->piread = NULL;
- }
-
- /* Always do this to be safe. */
- store_pool_delete(ps, &ps->read_memory_pool);
-
- ps->current = NULL;
- ps->next = NULL;
- ps->readpos = 0;
- ps->validated = 0;
-}
-
-static void
-store_read_set(png_store *ps, png_uint_32 id)
-{
- png_store_file *pf = ps->saved;
-
- while (pf != NULL)
- {
- if (pf->id == id)
- {
- ps->current = pf;
- ps->next = NULL;
- store_read_buffer_next(ps);
- return;
- }
-
- pf = pf->next;
- }
-
- {
- size_t pos;
- char msg[FILE_NAME_SIZE+64];
-
- pos = standard_name_from_id(msg, sizeof msg, 0, id);
- pos = safecat(msg, sizeof msg, pos, ": file not found");
- png_error(ps->pread, msg);
- }
-}
-
-/* The main interface for reading a saved file - pass the id number of the file
- * to retrieve. Ids must be unique or the earlier file will be hidden. The API
- * returns a png_struct and, optionally, a png_info. Both of these will be
- * destroyed by store_read_reset above.
- */
-static png_structp
-set_store_for_read(png_store *ps, png_infopp ppi, png_uint_32 id,
- PNG_CONST char *name)
-{
- /* Set the name for png_error */
- safecat(ps->test, sizeof ps->test, 0, name);
-
- if (ps->pread != NULL)
- png_error(ps->pread, "read store already in use");
-
- store_read_reset(ps);
-
- /* Both the create APIs can return NULL if used in their default mode
- * (because there is no other way of handling an error because the jmp_buf
- * by default is stored in png_struct and that has not been allocated!)
- * However, given that store_error works correctly in these circumstances
- * we don't ever expect NULL in this program.
- */
- if (ps->speed)
- ps->pread = png_create_read_struct(PNG_LIBPNG_VER_STRING, ps,
- store_error, store_warning);
-
- else
- ps->pread = png_create_read_struct_2(PNG_LIBPNG_VER_STRING, ps,
- store_error, store_warning, &ps->read_memory_pool, store_malloc,
- store_free);
-
- if (ps->pread == NULL)
- {
- struct exception_context *the_exception_context = &ps->exception_context;
-
- store_log(ps, NULL, "png_create_read_struct returned NULL (unexpected)",
- 1 /*error*/);
-
- Throw ps;
- }
-
- store_read_set(ps, id);
-
- if (ppi != NULL)
- *ppi = ps->piread = png_create_info_struct(ps->pread);
-
- return ps->pread;
-}
-
-/* The overall cleanup of a store simply calls the above then removes all the
- * saved files. This does not delete the store itself.
- */
-static void
-store_delete(png_store *ps)
-{
- store_write_reset(ps);
- store_read_reset(ps);
- store_freefile(&ps->saved);
-
- if (ps->image != NULL)
- {
- free(ps->image-1);
- ps->image = NULL;
- ps->cb_image = 0;
- }
-}
-
-/*********************** PNG FILE MODIFICATION ON READ ************************/
-/* Files may be modified on read. The following structure contains a complete
- * png_store together with extra members to handle modification and a special
- * read callback for libpng. To use this the 'modifications' field must be set
- * to a list of png_modification structures that actually perform the
- * modification, otherwise a png_modifier is functionally equivalent to a
- * png_store. There is a special read function, set_modifier_for_read, which
- * replaces set_store_for_read.
- */
-typedef struct png_modifier
-{
- png_store this; /* I am a png_store */
- struct png_modification *modifications; /* Changes to make */
-
- enum modifier_state
- {
- modifier_start, /* Initial value */
- modifier_signature, /* Have a signature */
- modifier_IHDR /* Have an IHDR */
- } state; /* My state */
-
- /* Information from IHDR: */
- png_byte bit_depth; /* From IHDR */
- png_byte colour_type; /* From IHDR */
-
- /* While handling PLTE, IDAT and IEND these chunks may be pended to allow
- * other chunks to be inserted.
- */
- png_uint_32 pending_len;
- png_uint_32 pending_chunk;
-
- /* Test values */
- double *gammas;
- unsigned int ngammas;
-
- /* Lowest sbit to test (libpng fails for sbit < 8) */
- png_byte sbitlow;
-
- /* Error control - these are the limits on errors accepted by the gamma tests
- * below.
- */
- double maxout8; /* Maximum output value error */
- double maxabs8; /* Absolute sample error 0..1 */
- double maxpc8; /* Percentage sample error 0..100% */
- double maxout16; /* Maximum output value error */
- double maxabs16; /* Absolute sample error 0..1 */
- double maxpc16; /* Percentage sample error 0..100% */
-
- /* Logged 8 and 16 bit errors ('output' values): */
- double error_gray_2;
- double error_gray_4;
- double error_gray_8;
- double error_gray_16;
- double error_color_8;
- double error_color_16;
-
- /* Flags: */
- /* Whether or not to interlace. */
- int interlace_type :9; /* int, but must store '1' */
-
- /* Run the standard tests? */
- unsigned int test_standard :1;
-
- /* Run the odd-sized image and interlace read/write tests? */
- unsigned int test_size :1;
-
- /* Run tests on reading with a combiniation of transforms, */
- unsigned int test_transform :1;
-
- /* When to use the use_input_precision option: */
- unsigned int use_input_precision :1;
- unsigned int use_input_precision_sbit :1;
- unsigned int use_input_precision_16to8 :1;
-
- /* Which gamma tests to run: */
- unsigned int test_gamma_threshold :1;
- unsigned int test_gamma_transform :1; /* main tests */
- unsigned int test_gamma_sbit :1;
- unsigned int test_gamma_strip16 :1;
-
- unsigned int log :1; /* Log max error */
-
- /* Buffer information, the buffer size limits the size of the chunks that can
- * be modified - they must fit (including header and CRC) into the buffer!
- */
- size_t flush; /* Count of bytes to flush */
- size_t buffer_count; /* Bytes in buffer */
- size_t buffer_position; /* Position in buffer */
- png_byte buffer[1024];
-} png_modifier;
-
-static double abserr(png_modifier *pm, png_byte bit_depth)
-{
- return bit_depth == 16 ? pm->maxabs16 : pm->maxabs8;
-}
-
-static double pcerr(png_modifier *pm, png_byte bit_depth)
-{
- return (bit_depth == 16 ? pm->maxpc16 : pm->maxpc8) * .01;
-}
-
-static double outerr(png_modifier *pm, png_byte bit_depth)
-{
- /* There is a serious error in the 2 and 4 bit grayscale transform because
- * the gamma table value (8 bits) is simply shifted, not rounded, so the
- * error in 4 bit greyscale gamma is up to the value below. This is a hack
- * to allow pngvalid to succeed:
- */
- if (bit_depth == 2)
- return .73182-.5;
-
- if (bit_depth == 4)
- return .90644-.5;
-
- if (bit_depth == 16)
- return pm->maxout16;
-
- return pm->maxout8;
-}
-
-/* This returns true if the test should be stopped now because it has already
- * failed and it is running silently.
- */
-static int fail(png_modifier *pm)
-{
- return !pm->log && !pm->this.verbose && (pm->this.nerrors > 0 ||
- (pm->this.treat_warnings_as_errors && pm->this.nwarnings > 0));
-}
-
-static void
-modifier_init(png_modifier *pm)
-{
- memset(pm, 0, sizeof *pm);
- store_init(&pm->this);
- pm->modifications = NULL;
- pm->state = modifier_start;
- pm->sbitlow = 1U;
- pm->maxout8 = pm->maxpc8 = pm->maxabs8 = 0;
- pm->maxout16 = pm->maxpc16 = pm->maxabs16 = 0;
- pm->error_gray_2 = pm->error_gray_4 = pm->error_gray_8 = 0;
- pm->error_gray_16 = pm->error_color_8 = pm->error_color_16 = 0;
- pm->interlace_type = PNG_INTERLACE_NONE;
- pm->test_standard = 0;
- pm->test_size = 0;
- pm->test_transform = 0;
- pm->use_input_precision = 0;
- pm->use_input_precision_sbit = 0;
- pm->use_input_precision_16to8 = 0;
- pm->test_gamma_threshold = 0;
- pm->test_gamma_transform = 0;
- pm->test_gamma_sbit = 0;
- pm->test_gamma_strip16 = 0;
- pm->log = 0;
-
- /* Rely on the memset for all the other fields - there are no pointers */
-}
-
-/* One modification structure must be provided for each chunk to be modified (in
- * fact more than one can be provided if multiple separate changes are desired
- * for a single chunk.) Modifications include adding a new chunk when a
- * suitable chunk does not exist.
- *
- * The caller of modify_fn will reset the CRC of the chunk and record 'modified'
- * or 'added' as appropriate if the modify_fn returns 1 (true). If the
- * modify_fn is NULL the chunk is simply removed.
- */
-typedef struct png_modification
-{
- struct png_modification *next;
- png_uint_32 chunk;
-
- /* If the following is NULL all matching chunks will be removed: */
- int (*modify_fn)(struct png_modifier *pm,
- struct png_modification *me, int add);
-
- /* If the following is set to PLTE, IDAT or IEND and the chunk has not been
- * found and modified (and there is a modify_fn) the modify_fn will be called
- * to add the chunk before the relevant chunk.
- */
- png_uint_32 add;
- unsigned int modified :1; /* Chunk was modified */
- unsigned int added :1; /* Chunk was added */
- unsigned int removed :1; /* Chunk was removed */
-} png_modification;
-
-static void modification_reset(png_modification *pmm)
-{
- if (pmm != NULL)
- {
- pmm->modified = 0;
- pmm->added = 0;
- pmm->removed = 0;
- modification_reset(pmm->next);
- }
-}
-
-static void
-modification_init(png_modification *pmm)
-{
- memset(pmm, 0, sizeof *pmm);
- pmm->next = NULL;
- pmm->chunk = 0;
- pmm->modify_fn = NULL;
- pmm->add = 0;
- modification_reset(pmm);
-}
-
-static void
-modifier_reset(png_modifier *pm)
-{
- store_read_reset(&pm->this);
- pm->modifications = NULL;
- pm->state = modifier_start;
- pm->bit_depth = pm->colour_type = 0;
- pm->pending_len = pm->pending_chunk = 0;
- pm->flush = pm->buffer_count = pm->buffer_position = 0;
-}
-
-/* Convenience macros. */
-#define CHUNK(a,b,c,d) (((a)<<24)+((b)<<16)+((c)<<8)+(d))
-#define CHUNK_IHDR CHUNK(73,72,68,82)
-#define CHUNK_PLTE CHUNK(80,76,84,69)
-#define CHUNK_IDAT CHUNK(73,68,65,84)
-#define CHUNK_IEND CHUNK(73,69,78,68)
-#define CHUNK_cHRM CHUNK(99,72,82,77)
-#define CHUNK_gAMA CHUNK(103,65,77,65)
-#define CHUNK_sBIT CHUNK(115,66,73,84)
-#define CHUNK_sRGB CHUNK(115,82,71,66)
-
-/* The guts of modification are performed during a read. */
-static void
-modifier_crc(png_bytep buffer)
-{
- /* Recalculate the chunk CRC - a complete chunk must be in
- * the buffer, at the start.
- */
- uInt datalen = png_get_uint_32(buffer);
- png_save_uint_32(buffer+datalen+8, crc32(0L, buffer+4, datalen+4));
-}
-
-static void
-modifier_setbuffer(png_modifier *pm)
-{
- modifier_crc(pm->buffer);
- pm->buffer_count = png_get_uint_32(pm->buffer)+12;
- pm->buffer_position = 0;
-}
-
-/* Separate the callback into the actual implementation (which is passed the
- * png_modifier explicitly) and the callback, which gets the modifier from the
- * png_struct.
- */
-static void
-modifier_read_imp(png_modifier *pm, png_bytep pb, png_size_t st)
-{
- while (st > 0)
- {
- size_t cb;
- png_uint_32 len, chunk;
- png_modification *mod;
-
- if (pm->buffer_position >= pm->buffer_count) switch (pm->state)
- {
- static png_byte sign[8] = { 137, 80, 78, 71, 13, 10, 26, 10 };
- case modifier_start:
- store_read_imp(&pm->this, pm->buffer, 8); /* size of signature. */
- pm->buffer_count = 8;
- pm->buffer_position = 0;
-
- if (memcmp(pm->buffer, sign, 8) != 0)
- png_error(pm->this.pread, "invalid PNG file signature");
- pm->state = modifier_signature;
- break;
-
- case modifier_signature:
- store_read_imp(&pm->this, pm->buffer, 13+12); /* size of IHDR */
- pm->buffer_count = 13+12;
- pm->buffer_position = 0;
-
- if (png_get_uint_32(pm->buffer) != 13 ||
- png_get_uint_32(pm->buffer+4) != CHUNK_IHDR)
- png_error(pm->this.pread, "invalid IHDR");
-
- /* Check the list of modifiers for modifications to the IHDR. */
- mod = pm->modifications;
- while (mod != NULL)
- {
- if (mod->chunk == CHUNK_IHDR && mod->modify_fn &&
- (*mod->modify_fn)(pm, mod, 0))
- {
- mod->modified = 1;
- modifier_setbuffer(pm);
- }
-
- /* Ignore removal or add if IHDR! */
- mod = mod->next;
- }
-
- /* Cache information from the IHDR (the modified one.) */
- pm->bit_depth = pm->buffer[8+8];
- pm->colour_type = pm->buffer[8+8+1];
-
- pm->state = modifier_IHDR;
- pm->flush = 0;
- break;
-
- case modifier_IHDR:
- default:
- /* Read a new chunk and process it until we see PLTE, IDAT or
- * IEND. 'flush' indicates that there is still some data to
- * output from the preceding chunk.
- */
- if ((cb = pm->flush) > 0)
- {
- if (cb > st) cb = st;
- pm->flush -= cb;
- store_read_imp(&pm->this, pb, cb);
- pb += cb;
- st -= cb;
- if (st <= 0) return;
- }
-
- /* No more bytes to flush, read a header, or handle a pending
- * chunk.
- */
- if (pm->pending_chunk != 0)
- {
- png_save_uint_32(pm->buffer, pm->pending_len);
- png_save_uint_32(pm->buffer+4, pm->pending_chunk);
- pm->pending_len = 0;
- pm->pending_chunk = 0;
- }
- else
- store_read_imp(&pm->this, pm->buffer, 8);
-
- pm->buffer_count = 8;
- pm->buffer_position = 0;
-
- /* Check for something to modify or a terminator chunk. */
- len = png_get_uint_32(pm->buffer);
- chunk = png_get_uint_32(pm->buffer+4);
-
- /* Terminators first, they may have to be delayed for added
- * chunks
- */
- if (chunk == CHUNK_PLTE || chunk == CHUNK_IDAT ||
- chunk == CHUNK_IEND)
- {
- mod = pm->modifications;
-
- while (mod != NULL)
- {
- if ((mod->add == chunk ||
- (mod->add == CHUNK_PLTE && chunk == CHUNK_IDAT)) &&
- mod->modify_fn != NULL && !mod->modified && !mod->added)
- {
- /* Regardless of what the modify function does do not run
- * this again.
- */
- mod->added = 1;
-
- if ((*mod->modify_fn)(pm, mod, 1 /*add*/))
- {
- /* Reset the CRC on a new chunk */
- if (pm->buffer_count > 0)
- modifier_setbuffer(pm);
-
- else
- {
- pm->buffer_position = 0;
- mod->removed = 1;
- }
-
- /* The buffer has been filled with something (we assume)
- * so output this. Pend the current chunk.
- */
- pm->pending_len = len;
- pm->pending_chunk = chunk;
- break; /* out of while */
- }
- }
-
- mod = mod->next;
- }
-
- /* Don't do any further processing if the buffer was modified -
- * otherwise the code will end up modifying a chunk that was
- * just added.
- */
- if (mod != NULL)
- break; /* out of switch */
- }
-
- /* If we get to here then this chunk may need to be modified. To
- * do this it must be less than 1024 bytes in total size, otherwise
- * it just gets flushed.
- */
- if (len+12 <= sizeof pm->buffer)
- {
- store_read_imp(&pm->this, pm->buffer+pm->buffer_count,
- len+12-pm->buffer_count);
- pm->buffer_count = len+12;
-
- /* Check for a modification, else leave it be. */
- mod = pm->modifications;
- while (mod != NULL)
- {
- if (mod->chunk == chunk)
- {
- if (mod->modify_fn == NULL)
- {
- /* Remove this chunk */
- pm->buffer_count = pm->buffer_position = 0;
- mod->removed = 1;
- break; /* Terminate the while loop */
- }
-
- else if ((*mod->modify_fn)(pm, mod, 0))
- {
- mod->modified = 1;
- /* The chunk may have been removed: */
- if (pm->buffer_count == 0)
- {
- pm->buffer_position = 0;
- break;
- }
- modifier_setbuffer(pm);
- }
- }
-
- mod = mod->next;
- }
- }
-
- else
- pm->flush = len+12 - pm->buffer_count; /* data + crc */
-
- /* Take the data from the buffer (if there is any). */
- break;
- }
-
- /* Here to read from the modifier buffer (not directly from
- * the store, as in the flush case above.)
- */
- cb = pm->buffer_count - pm->buffer_position;
-
- if (cb > st)
- cb = st;
-
- memcpy(pb, pm->buffer + pm->buffer_position, cb);
- st -= cb;
- pb += cb;
- pm->buffer_position += cb;
- }
-}
-
-/* The callback: */
-static void
-modifier_read(png_structp pp, png_bytep pb, png_size_t st)
-{
- png_modifier *pm = png_get_io_ptr(pp);
-
- if (pm == NULL || pm->this.pread != pp)
- png_error(pp, "bad modifier_read call");
-
- modifier_read_imp(pm, pb, st);
-}
-
-/* Like store_progressive_read but the data is getting changed as we go so we
- * need a local buffer.
- */
-static void
-modifier_progressive_read(png_modifier *pm, png_structp pp, png_infop pi)
-{
- if (pm->this.pread != pp || pm->this.current == NULL ||
- pm->this.next == NULL)
- png_error(pp, "store state damaged (progressive)");
-
- /* This is another Horowitz and Hill random noise generator. In this case
- * the aim is to stress the progressive reader with truely horrible variable
- * buffer sizes in the range 1..500, so a sequence of 9 bit random numbers
- * is generated. We could probably just count from 1 to 32767 and get as
- * good a result.
- */
- for (;;)
- {
- static png_uint_32 noise = 1;
- png_size_t cb, cbAvail;
- png_byte buffer[512];
-
- /* Generate 15 more bits of stuff: */
- noise = (noise << 9) | ((noise ^ (noise >> (9-5))) & 0x1ff);
- cb = noise & 0x1ff;
-
- /* Check that this number of bytes are available (in the current buffer.)
- * (This doesn't quite work - the modifier might delete a chunk; unlikely
- * but possible, it doesn't happen at present because the modifier only
- * adds chunks to standard images.)
- */
- cbAvail = store_read_buffer_avail(&pm->this);
- if (pm->buffer_count > pm->buffer_position)
- cbAvail += pm->buffer_count - pm->buffer_position;
-
- if (cb > cbAvail)
- {
- /* Check for EOF: */
- if (cbAvail == 0)
- break;
-
- cb = cbAvail;
- }
-
- modifier_read_imp(pm, buffer, cb);
- png_process_data(pp, pi, buffer, cb);
- }
-
- /* Check the invariants at the end (if this fails it's a problem in this
- * file!)
- */
- if (pm->buffer_count > pm->buffer_position ||
- pm->this.next != &pm->this.current->data ||
- pm->this.readpos < pm->this.current->datacount)
- png_error(pp, "progressive read implementation error");
-}
-
-/* Set up a modifier. */
-static png_structp
-set_modifier_for_read(png_modifier *pm, png_infopp ppi, png_uint_32 id,
- PNG_CONST char *name)
-{
- /* Do this first so that the modifier fields are cleared even if an error
- * happens allocating the png_struct. No allocation is done here so no
- * cleanup is required.
- */
- pm->state = modifier_start;
- pm->bit_depth = 0;
- pm->colour_type = 255;
-
- pm->pending_len = 0;
- pm->pending_chunk = 0;
- pm->flush = 0;
- pm->buffer_count = 0;
- pm->buffer_position = 0;
-
- return set_store_for_read(&pm->this, ppi, id, name);
-}
-
-/***************************** STANDARD PNG FILES *****************************/
-/* Standard files - write and save standard files. */
-/* There are two basic forms of standard images. Those which attempt to have
- * all the possible pixel values (not possible for 16bpp images, but a range of
- * values are produced) and those which have a range of image sizes. The former
- * are used for testing transforms, in particular gamma correction and bit
- * reduction and increase. The latter are reserved for testing the behavior of
- * libpng with respect to 'odd' image sizes - particularly small images where
- * rows become 1 byte and interlace passes disappear.
- *
- * The first, most useful, set are the 'transform' images, the second set of
- * small images are the 'size' images.
- *
- * The transform files are constructed with rows which fit into a 1024 byte row
- * buffer. This makes allocation easier below. Further regardless of the file
- * format every row has 128 pixels (giving 1024 bytes for 64bpp formats).
- *
- * Files are stored with no gAMA or sBIT chunks, with a PLTE only when needed
- * and with an ID derived from the colour type, bit depth and interlace type
- * as above (FILEID). The width (128) and height (variable) are not stored in
- * the FILEID - instead the fields are set to 0, indicating a transform file.
- *
- * The size files ar constructed with rows a maximum of 128 bytes wide, allowing
- * a maximum width of 16 pixels (for the 64bpp case.) They also have a maximum
- * height of 16 rows. The width and height are stored in the FILEID and, being
- * non-zero, indicate a size file.
- */
-
-/* The number of passes is related to the interlace type. There wass no libpng
- * API to determine this prior to 1.5, so we need an inquiry function:
- */
-static int
-npasses_from_interlace_type(png_structp pp, int interlace_type)
-{
- switch (interlace_type)
- {
- default:
- png_error(pp, "invalid interlace type");
-
- case PNG_INTERLACE_NONE:
- return 1;
-
- case PNG_INTERLACE_ADAM7:
- return PNG_INTERLACE_ADAM7_PASSES;
- }
-}
-
-static unsigned int
-bit_size(png_structp pp, png_byte colour_type, png_byte bit_depth)
-{
- switch (colour_type)
- {
- case 0: return bit_depth;
-
- case 2: return 3*bit_depth;
-
- case 3: return bit_depth;
-
- case 4: return 2*bit_depth;
-
- case 6: return 4*bit_depth;
-
- default: png_error(pp, "invalid color type");
- }
-}
-
-#define TRANSFORM_WIDTH 128U
-#define TRANSFORM_ROWMAX (TRANSFORM_WIDTH*8U)
-#define SIZE_ROWMAX (16*8U) /* 16 pixels, max 8 bytes each - 128 bytes */
-#define STANDARD_ROWMAX TRANSFORM_ROWMAX /* The larger of the two */
-
-/* So the maximum image sizes are as follows. A 'transform' image may require
- * more than 65535 bytes. The size images are a maximum of 2046 bytes.
- */
-#define TRANSFORM_IMAGEMAX (TRANSFORM_ROWMAX * (png_uint_32)2048)
-#define SIZE_IMAGEMAX (SIZE_ROWMAX * 16U)
-
-static size_t
-transform_rowsize(png_structp pp, png_byte colour_type, png_byte bit_depth)
-{
- return (TRANSFORM_WIDTH * bit_size(pp, colour_type, bit_depth)) / 8;
-}
-
-/* transform_width(pp, colour_type, bit_depth) current returns the same number
- * every time, so just use a macro:
- */
-#define transform_width(pp, colour_type, bit_depth) TRANSFORM_WIDTH
-
-static png_uint_32
-transform_height(png_structp pp, png_byte colour_type, png_byte bit_depth)
-{
- switch (bit_size(pp, colour_type, bit_depth))
- {
- case 1:
- case 2:
- case 4:
- return 1; /* Total of 128 pixels */
-
- case 8:
- return 2; /* Total of 256 pixels/bytes */
-
- case 16:
- return 512; /* Total of 65536 pixels */
-
- case 24:
- case 32:
- return 512; /* 65536 pixels */
-
- case 48:
- case 64:
- return 2048;/* 4 x 65536 pixels. */
-
- default:
- return 0; /* Error, will be caught later */
- }
-}
-
-/* The following can only be defined here, now we have the definitions
- * of the transform image sizes.
- */
-static png_uint_32
-standard_width(png_structp pp, png_uint_32 id)
-{
- png_uint_32 width = WIDTH_FROM_ID(id);
- UNUSED(pp)
-
- if (width == 0)
- width = transform_width(pp, COL_FROM_ID(id), DEPTH_FROM_ID(id));
-
- return width;
-}
-
-static png_uint_32
-standard_height(png_structp pp, png_uint_32 id)
-{
- png_uint_32 height = HEIGHT_FROM_ID(id);
-
- if (height == 0)
- height = transform_height(pp, COL_FROM_ID(id), DEPTH_FROM_ID(id));
-
- return height;
-}
-
-static png_uint_32
-standard_rowsize(png_structp pp, png_uint_32 id)
-{
- png_uint_32 width = standard_width(pp, id);
-
- /* This won't overflow: */
- width *= bit_size(pp, COL_FROM_ID(id), DEPTH_FROM_ID(id));
- return (width + 7) / 8;
-}
-
-static void
-transform_row(png_structp pp, png_byte buffer[TRANSFORM_ROWMAX],
- png_byte colour_type, png_byte bit_depth, png_uint_32 y)
-{
- png_uint_32 v = y << 7;
- png_uint_32 i = 0;
-
- switch (bit_size(pp, colour_type, bit_depth))
- {
- case 1:
- while (i<128/8) buffer[i] = v & 0xff, v += 17, ++i;
- return;
-
- case 2:
- while (i<128/4) buffer[i] = v & 0xff, v += 33, ++i;
- return;
-
- case 4:
- while (i<128/2) buffer[i] = v & 0xff, v += 65, ++i;
- return;
-
- case 8:
- /* 256 bytes total, 128 bytes in each row set as follows: */
- while (i<128) buffer[i] = v & 0xff, ++v, ++i;
- return;
-
- case 16:
- /* Generate all 65536 pixel values in order, which includes the 8 bit
- * GA case as well as the 16 bit G case.
- */
- while (i<128)
- buffer[2*i] = (v>>8) & 0xff, buffer[2*i+1] = v & 0xff, ++v, ++i;
-
- return;
-
- case 24:
- /* 65535 pixels, but rotate the values. */
- while (i<128)
- {
- /* Three bytes per pixel, r, g, b, make b by r^g */
- buffer[3*i+0] = (v >> 8) & 0xff;
- buffer[3*i+1] = v & 0xff;
- buffer[3*i+2] = ((v >> 8) ^ v) & 0xff;
- ++v;
- ++i;
- }
-
- return;
-
- case 32:
- /* 65535 pixels, r, g, b, a; just replicate */
- while (i<128)
- {
- buffer[4*i+0] = (v >> 8) & 0xff;
- buffer[4*i+1] = v & 0xff;
- buffer[4*i+2] = (v >> 8) & 0xff;
- buffer[4*i+3] = v & 0xff;
- ++v;
- ++i;
- }
-
- return;
-
- case 48:
- /* y is maximum 2047, giving 4x65536 pixels, make 'r' increase by 1 at
- * each pixel, g increase by 257 (0x101) and 'b' by 0x1111:
- */
- while (i<128)
- {
- png_uint_32 t = v++;
- buffer[6*i+0] = (t >> 8) & 0xff;
- buffer[6*i+1] = t & 0xff;
- t *= 257;
- buffer[6*i+2] = (t >> 8) & 0xff;
- buffer[6*i+3] = t & 0xff;
- t *= 17;
- buffer[6*i+4] = (t >> 8) & 0xff;
- buffer[6*i+5] = t & 0xff;
- ++i;
- }
-
- return;
-
- case 64:
- /* As above in the 32 bit case. */
- while (i<128)
- {
- png_uint_32 t = v++;
- buffer[8*i+0] = (t >> 8) & 0xff;
- buffer[8*i+1] = t & 0xff;
- buffer[8*i+4] = (t >> 8) & 0xff;
- buffer[8*i+5] = t & 0xff;
- t *= 257;
- buffer[8*i+2] = (t >> 8) & 0xff;
- buffer[8*i+3] = t & 0xff;
- buffer[8*i+6] = (t >> 8) & 0xff;
- buffer[8*i+7] = t & 0xff;
- ++i;
- }
- return;
-
- default:
- break;
- }
-
- png_error(pp, "internal error");
-}
-
-/* This is just to do the right cast - could be changed to a function to check
- * 'bd' but there isn't much point.
- */
-#define DEPTH(bd) ((png_byte)(1U << (bd)))
-
-/* Make a standardized image given a an image colour type, bit depth and
- * interlace type. The standard images have a very restricted range of
- * rows and heights and are used for testing transforms rather than image
- * layout details. See make_size_images below for a way to make images
- * that test odd sizes along with the libpng interlace handling.
- */
-static void
-make_transform_image(png_store* PNG_CONST ps, png_byte PNG_CONST colour_type,
- png_byte PNG_CONST bit_depth, int interlace_type, png_const_charp name)
-{
- context(ps, fault);
-
- Try
- {
- png_infop pi;
- png_structp pp = set_store_for_write(ps, &pi, name);
- png_uint_32 h;
-
- /* In the event of a problem return control to the Catch statement below
- * to do the clean up - it is not possible to 'return' directly from a Try
- * block.
- */
- if (pp == NULL)
- Throw ps;
-
- h = transform_height(pp, colour_type, bit_depth);
-
- png_set_IHDR(pp, pi, transform_width(pp, colour_type, bit_depth), h,
- bit_depth, colour_type, interlace_type,
- PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
-
- if (colour_type == 3) /* palette */
- {
- unsigned int i = 0;
- png_color pal[256];
-
- do
- pal[i].red = pal[i].green = pal[i].blue = (png_byte)i;
- while(++i < 256U);
-
- png_set_PLTE(pp, pi, pal, 256);
- }
-
- png_write_info(pp, pi);
-
- if (png_get_rowbytes(pp, pi) !=
- transform_rowsize(pp, colour_type, bit_depth))
- png_error(pp, "row size incorrect");
-
- else
- {
- /* Somewhat confusingly this must be called *after* png_write_info
- * because if it is called before, the information in *pp has not been
- * updated to reflect the interlaced image.
- */
- int npasses = png_set_interlace_handling(pp);
- int pass;
-
- if (npasses != npasses_from_interlace_type(pp, interlace_type))
- png_error(pp, "write: png_set_interlace_handling failed");
-
- for (pass=0; pass<npasses; ++pass)
- {
- png_uint_32 y;
-
- for (y=0; y<h; ++y)
- {
- png_byte buffer[TRANSFORM_ROWMAX];
-
- transform_row(pp, buffer, colour_type, bit_depth, y);
- png_write_row(pp, buffer);
- }
- }
- }
-
- png_write_end(pp, pi);
-
- /* And store this under the appropriate id, then clean up. */
- store_storefile(ps, FILEID(colour_type, bit_depth, interlace_type,
- 0, 0, 0));
-
- store_write_reset(ps);
- }
-
- Catch(fault)
- {
- /* Use the png_store returned by the exception. This may help the compiler
- * because 'ps' is not used in this branch of the setjmp. Note that fault
- * and ps will always be the same value.
- */
- store_write_reset(fault);
- }
-}
-
-static void
-make_standard(png_store* PNG_CONST ps, png_byte PNG_CONST colour_type, int bdlo,
- int PNG_CONST bdhi)
-{
- for (; bdlo <= bdhi; ++bdlo)
- {
- int interlace_type;
-
- for (interlace_type = PNG_INTERLACE_NONE;
- interlace_type < PNG_INTERLACE_LAST; ++interlace_type)
- {
- char name[FILE_NAME_SIZE];
-
- standard_name(name, sizeof name, 0, colour_type, bdlo, interlace_type,
- 0, 0, 0);
- make_transform_image(ps, colour_type, DEPTH(bdlo), interlace_type,
- name);
- }
- }
-}
-
-static void
-make_transform_images(png_store *ps)
-{
- /* This is in case of errors. */
- safecat(ps->test, sizeof ps->test, 0, "make standard images");
-
- /* Arguments are colour_type, low bit depth, high bit depth
- */
- make_standard(ps, 0, 0, WRITE_BDHI);
- make_standard(ps, 2, 3, WRITE_BDHI);
- make_standard(ps, 3, 0, 3 /*palette: max 8 bits*/);
- make_standard(ps, 4, 3, WRITE_BDHI);
- make_standard(ps, 6, 3, WRITE_BDHI);
-}
-
-/* The following two routines use the PNG interlace support macros from
- * png.h to interlace or deinterlace rows.
- */
-static void
-interlace_row(png_bytep buffer, png_const_bytep imageRow,
- unsigned int pixel_size, png_uint_32 w, int pass)
-{
- png_uint_32 xin, xout, xstep;
-
- /* Note that this can, trivially, be optimized to a memcpy on pass 7, the
- * code is presented this way to make it easier to understand. In practice
- * consult the code in the libpng source to see other ways of doing this.
- */
- xin = PNG_PASS_START_COL(pass);
- xstep = 1U<<PNG_PASS_COL_SHIFT(pass);
-
- for (xout=0; xin<w; xin+=xstep)
- {
- pixel_copy(buffer, xout, imageRow, xin, pixel_size);
- ++xout;
- }
-}
-
-static void
-deinterlace_row(png_bytep buffer, png_const_bytep row,
- unsigned int pixel_size, png_uint_32 w, int pass)
-{
- /* The inverse of the above, 'row' is part of row 'y' of the output image,
- * in 'buffer'. The image is 'w' wide and this is pass 'pass', distribute
- * the pixels of row into buffer and return the number written (to allow
- * this to be checked).
- */
- png_uint_32 xin, xout, xstep;
-
- xout = PNG_PASS_START_COL(pass);
- xstep = 1U<<PNG_PASS_COL_SHIFT(pass);
-
- for (xin=0; xout<w; xout+=xstep)
- {
- pixel_copy(buffer, xout, row, xin, pixel_size);
- ++xin;
- }
-}
-
-/* Build a single row for the 'size' test images, this fills in only the
- * first bit_width bits of the sample row.
- */
-static void
-size_row(png_byte buffer[SIZE_ROWMAX], png_uint_32 bit_width, png_uint_32 y)
-{
- /* height is in the range 1 to 16, so: */
- y = ((y & 1) << 7) + ((y & 2) << 6) + ((y & 4) << 5) + ((y & 8) << 4);
- /* the following ensures bits are set in small images: */
- y ^= 0xA5;
-
- while (bit_width >= 8)
- *buffer++ = (png_byte)y++, bit_width -= 8;
-
- /* There may be up to 7 remaining bits, these go in the most significant
- * bits of the byte.
- */
- if (bit_width > 0)
- {
- png_uint_32 mask = (1U<<(8-bit_width))-1;
- *buffer = (png_byte)((*buffer & mask) | (y & ~mask));
- }
-}
-
-static void
-make_size_image(png_store* PNG_CONST ps, png_byte PNG_CONST colour_type,
- png_byte PNG_CONST bit_depth, int PNG_CONST interlace_type,
- png_uint_32 PNG_CONST w, png_uint_32 PNG_CONST h,
- int PNG_CONST do_interlace)
-{
- context(ps, fault);
-
- Try
- {
- png_infop pi;
- png_structp pp;
- unsigned int pixel_size;
-
- /* Make a name and get an appropriate id for the store: */
- char name[FILE_NAME_SIZE];
- PNG_CONST png_uint_32 id = FILEID(colour_type, bit_depth, interlace_type,
- w, h, do_interlace);
-
- standard_name_from_id(name, sizeof name, 0, id);
- pp = set_store_for_write(ps, &pi, name);
-
- /* In the event of a problem return control to the Catch statement below
- * to do the clean up - it is not possible to 'return' directly from a Try
- * block.
- */
- if (pp == NULL)
- Throw ps;
-
- png_set_IHDR(pp, pi, w, h, bit_depth, colour_type, interlace_type,
- PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
-
- /* Same palette as make_transform_image - I don' think there is any
- * benefit from using a different one (JB 20101211)
- */
- if (colour_type == 3) /* palette */
- {
- unsigned int i = 0;
- png_color pal[256];
-
- do
- pal[i].red = pal[i].green = pal[i].blue = (png_byte)i;
- while(++i < 256U);
-
- png_set_PLTE(pp, pi, pal, 256);
- }
-
- png_write_info(pp, pi);
-
- /* Calculate the bit size, divide by 8 to get the byte size - this won't
- * overflow because we know the w values are all small enough even for
- * a system where 'unsigned int' is only 16 bits.
- */
- pixel_size = bit_size(pp, colour_type, bit_depth);
- if (png_get_rowbytes(pp, pi) != ((w * pixel_size) + 7) / 8)
- png_error(pp, "row size incorrect");
-
- else
- {
- int npasses = npasses_from_interlace_type(pp, interlace_type);
- png_uint_32 y;
- int pass;
- png_byte image[16][SIZE_ROWMAX];
-
- /* To help consistent error detection make the parts of this buffer
- * that aren't set below all '1':
- */
- memset(image, 0xff, sizeof image);
-
- if (!do_interlace && npasses != png_set_interlace_handling(pp))
- png_error(pp, "write: png_set_interlace_handling failed");
-
- /* Prepare the whole image first to avoid making it 7 times: */
- for (y=0; y<h; ++y)
- size_row(image[y], w * pixel_size, y);
-
- for (pass=0; pass<npasses; ++pass)
- {
- /* The following two are for checking the macros: */
- PNG_CONST png_uint_32 wPass = PNG_PASS_COLS(w, pass);
-
- /* If do_interlace is set we don't call png_write_row for every
- * row because some of them are empty. In fact, for a 1x1 image,
- * most of them are empty!
- */
- for (y=0; y<h; ++y)
- {
- png_const_bytep row = image[y];
- png_byte tempRow[SIZE_ROWMAX];
-
- /* If do_interlace *and* the image is interlaced we
- * need a reduced interlace row, this may be reduced
- * to empty.
- */
- if (do_interlace && interlace_type == PNG_INTERLACE_ADAM7)
- {
- /* The row must not be written if it doesn't exist, notice
- * that there are two conditions here, either the row isn't
- * ever in the pass or the row would be but isn't wide
- * enough to contribute any pixels. In fact the wPass test
- * can be used to skip the whole y loop in this case.
- */
- if (PNG_ROW_IN_INTERLACE_PASS(y, pass) && wPass > 0)
- {
- /* Set to all 1's for error detection (libpng tends to
- * set unset things to 0).
- */
- memset(tempRow, 0xff, sizeof tempRow);
- interlace_row(tempRow, row, pixel_size, w, pass);
- row = tempRow;
- }
- else
- continue;
- }
-
- /* Only get to here if the row has some pixels in it. */
- png_write_row(pp, row);
- }
- }
- }
-
- png_write_end(pp, pi);
-
- /* And store this under the appropriate id, then clean up. */
- store_storefile(ps, id);
-
- store_write_reset(ps);
- }
-
- Catch(fault)
- {
- /* Use the png_store returned by the exception. This may help the compiler
- * because 'ps' is not used in this branch of the setjmp. Note that fault
- * and ps will always be the same value.
- */
- store_write_reset(fault);
- }
-}
-
-static void
-make_size(png_store* PNG_CONST ps, png_byte PNG_CONST colour_type, int bdlo,
- int PNG_CONST bdhi)
-{
- for (; bdlo <= bdhi; ++bdlo)
- {
- png_uint_32 width;
-
- for (width = 1; width <= 16; ++width)
- {
- png_uint_32 height;
-
- for (height = 1; height <= 16; ++height)
- {
- /* The four combinations of DIY interlace and interlace or not -
- * no interlace + DIY should be identical to no interlace with
- * libpng doing it.
- */
- make_size_image(ps, colour_type, DEPTH(bdlo), PNG_INTERLACE_NONE,
- width, height, 0);
- make_size_image(ps, colour_type, DEPTH(bdlo), PNG_INTERLACE_NONE,
- width, height, 1);
- make_size_image(ps, colour_type, DEPTH(bdlo), PNG_INTERLACE_ADAM7,
- width, height, 0);
- make_size_image(ps, colour_type, DEPTH(bdlo), PNG_INTERLACE_ADAM7,
- width, height, 1);
- }
- }
- }
-}
-
-static void
-make_size_images(png_store *ps)
-{
- /* This is in case of errors. */
- safecat(ps->test, sizeof ps->test, 0, "make size images");
-
- /* Arguments are colour_type, low bit depth, high bit depth
- */
- make_size(ps, 0, 0, WRITE_BDHI);
- make_size(ps, 2, 3, WRITE_BDHI);
- make_size(ps, 3, 0, 3 /*palette: max 8 bits*/);
- make_size(ps, 4, 3, WRITE_BDHI);
- make_size(ps, 6, 3, WRITE_BDHI);
-}
-
-/* Return a row based on image id and 'y' for checking: */
-static void
-standard_row(png_structp pp, png_byte std[STANDARD_ROWMAX], png_uint_32 id,
- png_uint_32 y)
-{
- if (WIDTH_FROM_ID(id) == 0)
- transform_row(pp, std, COL_FROM_ID(id), DEPTH_FROM_ID(id), y);
- else
- size_row(std, WIDTH_FROM_ID(id) * bit_size(pp, COL_FROM_ID(id),
- DEPTH_FROM_ID(id)), y);
-}
-
-/* Tests - individual test cases */
-/* Like 'make_standard' but errors are deliberately introduced into the calls
- * to ensure that they get detected - it should not be possible to write an
- * invalid image with libpng!
- */
-static void
-sBIT0_error_fn(png_structp pp, png_infop pi)
-{
- /* 0 is invalid... */
- png_color_8 bad;
- bad.red = bad.green = bad.blue = bad.gray = bad.alpha = 0;
- png_set_sBIT(pp, pi, &bad);
-}
-
-static void
-sBIT_error_fn(png_structp pp, png_infop pi)
-{
- png_byte bit_depth;
- png_color_8 bad;
-
- if (png_get_color_type(pp, pi) == PNG_COLOR_TYPE_PALETTE)
- bit_depth = 8;
-
- else
- bit_depth = png_get_bit_depth(pp, pi);
-
- /* Now we know the bit depth we can easily generate an invalid sBIT entry */
- bad.red = bad.green = bad.blue = bad.gray = bad.alpha =
- (png_byte)(bit_depth+1);
- png_set_sBIT(pp, pi, &bad);
-}
-
-static PNG_CONST struct
-{
- void (*fn)(png_structp, png_infop);
- PNG_CONST char *msg;
- unsigned int warning :1; /* the error is a warning... */
-} error_test[] =
- {
- { sBIT0_error_fn, "sBIT(0): failed to detect error", 1 },
- { sBIT_error_fn, "sBIT(too big): failed to detect error", 1 },
- };
-
-static void
-make_error(png_store* volatile ps, png_byte PNG_CONST colour_type,
- png_byte bit_depth, int interlace_type, int test, png_const_charp name)
-{
- context(ps, fault);
-
- Try
- {
- png_structp pp;
- png_infop pi;
-
- pp = set_store_for_write(ps, &pi, name);
-
- if (pp == NULL)
- Throw ps;
-
- png_set_IHDR(pp, pi, transform_width(pp, colour_type, bit_depth),
- transform_height(pp, colour_type, bit_depth), bit_depth, colour_type,
- interlace_type, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
-
- if (colour_type == 3) /* palette */
- {
- unsigned int i = 0;
- png_color pal[256];
-
- do
- pal[i].red = pal[i].green = pal[i].blue = (png_byte)i;
- while(++i < 256U);
-
- png_set_PLTE(pp, pi, pal, 256);
- }
-
- /* Time for a few errors, these are in various optional chunks, the
- * standard tests test the standard chunks pretty well.
- */
-# define exception__prev exception_prev_1
-# define exception__env exception_env_1
- Try
- {
- /* Expect this to throw: */
- ps->expect_error = !error_test[test].warning;
- ps->expect_warning = error_test[test].warning;
- ps->saw_warning = 0;
- error_test[test].fn(pp, pi);
-
- /* Normally the error is only detected here: */
- png_write_info(pp, pi);
-
- /* And handle the case where it was only a warning: */
- if (ps->expect_warning && ps->saw_warning)
- Throw ps;
-
- /* If we get here there is a problem, we have success - no error or
- * no warning - when we shouldn't have success. Log an error.
- */
- store_log(ps, pp, error_test[test].msg, 1 /*error*/);
- }
-
- Catch (fault)
- ps = fault; /* expected exit, make sure ps is not clobbered */
-#undef exception__prev
-#undef exception__env
-
- /* And clear these flags */
- ps->expect_error = 0;
- ps->expect_warning = 0;
-
- /* Now write the whole image, just to make sure that the detected, or
- * undetected, errro has not created problems inside libpng.
- */
- if (png_get_rowbytes(pp, pi) !=
- transform_rowsize(pp, colour_type, bit_depth))
- png_error(pp, "row size incorrect");
-
- else
- {
- png_uint_32 h = transform_height(pp, colour_type, bit_depth);
- int npasses = png_set_interlace_handling(pp);
- int pass;
-
- if (npasses != npasses_from_interlace_type(pp, interlace_type))
- png_error(pp, "write: png_set_interlace_handling failed");
-
- for (pass=0; pass<npasses; ++pass)
- {
- png_uint_32 y;
-
- for (y=0; y<h; ++y)
- {
- png_byte buffer[TRANSFORM_ROWMAX];
-
- transform_row(pp, buffer, colour_type, bit_depth, y);
- png_write_row(pp, buffer);
- }
- }
- }
-
- png_write_end(pp, pi);
-
- /* The following deletes the file that was just written. */
- store_write_reset(ps);
- }
-
- Catch(fault)
- {
- store_write_reset(fault);
- }
-}
-
-static int
-make_errors(png_modifier* PNG_CONST pm, png_byte PNG_CONST colour_type,
- int bdlo, int PNG_CONST bdhi)
-{
- for (; bdlo <= bdhi; ++bdlo)
- {
- int interlace_type;
-
- for (interlace_type = PNG_INTERLACE_NONE;
- interlace_type < PNG_INTERLACE_LAST; ++interlace_type)
- {
- unsigned int test;
- char name[FILE_NAME_SIZE];
-
- standard_name(name, sizeof name, 0, colour_type, bdlo, interlace_type,
- 0, 0, 0);
-
- for (test=0; test<(sizeof error_test)/(sizeof error_test[0]); ++test)
- {
- make_error(&pm->this, colour_type, DEPTH(bdlo), interlace_type,
- test, name);
-
- if (fail(pm))
- return 0;
- }
- }
- }
-
- return 1; /* keep going */
-}
-
-static void
-perform_error_test(png_modifier *pm)
-{
- /* Need to do this here because we just write in this test. */
- safecat(pm->this.test, sizeof pm->this.test, 0, "error test");
-
- if (!make_errors(pm, 0, 0, WRITE_BDHI))
- return;
-
- if (!make_errors(pm, 2, 3, WRITE_BDHI))
- return;
-
- if (!make_errors(pm, 3, 0, 3))
- return;
-
- if (!make_errors(pm, 4, 3, WRITE_BDHI))
- return;
-
- if (!make_errors(pm, 6, 3, WRITE_BDHI))
- return;
-}
-
-/* Because we want to use the same code in both the progressive reader and the
- * sequential reader it is necessary to deal with the fact that the progressive
- * reader callbacks only have one parameter (png_get_progressive_ptr()), so this
- * must contain all the test parameters and all the local variables directly
- * accessible to the sequential reader implementation.
- *
- * The technique adopted is to reinvent part of what Dijkstra termed a
- * 'display'; an array of pointers to the stack frames of enclosing functions so
- * that a nested function definition can access the local (C auto) variables of
- * the functions that contain its definition. In fact C provides the first
- * pointer (the local variables - the stack frame pointer) and the last (the
- * global variables - the BCPL global vector typically implemented as global
- * addresses), this code requires one more pointer to make the display - the
- * local variables (and function call parameters) of the function that actually
- * invokes either the progressive or sequential reader.
- *
- * Perhaps confusingly this technique is confounded with classes - the
- * 'standard_display' defined here is sub-classed as the 'gamma_display' below.
- * A gamma_display is a standard_display, taking advantage of the ANSI-C
- * requirement that the pointer to the first member of a structure must be the
- * same as the pointer to the structure. This allows us to reuse standard_
- * functions in the gamma test code; something that could not be done with
- * nested funtions!
- */
-typedef struct standard_palette_entry /* pngvalid format palette! */
-{
- png_byte red;
- png_byte green;
- png_byte blue;
- png_byte alpha;
-} standard_palette[256];
-
-typedef struct standard_display
-{
- png_store* ps; /* Test parameters (passed to the function) */
- png_byte colour_type;
- png_byte bit_depth;
- png_byte red_sBIT; /* Input data sBIT values. */
- png_byte green_sBIT;
- png_byte blue_sBIT;
- png_byte alpha_sBIT;
- int interlace_type;
- png_uint_32 id; /* Calculated file ID */
- png_uint_32 w; /* Width of image */
- png_uint_32 h; /* Height of image */
- int npasses; /* Number of interlaced passes */
- png_uint_32 pixel_size; /* Width of one pixel in bits */
- png_uint_32 bit_width; /* Width of output row in bits */
- size_t cbRow; /* Bytes in a row of the output image */
- int do_interlace; /* Do interlacing internally */
- int is_transparent; /* Transparecy information was present. */
- struct
- {
- png_uint_16 red;
- png_uint_16 green;
- png_uint_16 blue;
- } transparent; /* The transparent color, if set. */
- standard_palette
- palette;
-} standard_display;
-
-static void
-standard_display_init(standard_display *dp, png_store* ps, png_uint_32 id,
- int do_interlace)
-{
- dp->ps = ps;
- dp->colour_type = COL_FROM_ID(id);
- dp->bit_depth = DEPTH_FROM_ID(id);
- dp->alpha_sBIT = dp->blue_sBIT = dp->green_sBIT = dp->alpha_sBIT =
- dp->bit_depth;
- dp->interlace_type = INTERLACE_FROM_ID(id);
- dp->id = id;
- /* All the rest are filled in after the read_info: */
- dp->w = 0;
- dp->h = 0;
- dp->npasses = 0;
- dp->pixel_size = 0;
- dp->bit_width = 0;
- dp->cbRow = 0;
- dp->do_interlace = do_interlace;
- dp->is_transparent = 0;
- /* Preset the transparent color to black: */
- memset(&dp->transparent, 0, sizeof dp->transparent);
- /* Preset the palette to full intensity/opaque througout: */
- memset(dp->palette, 0xff, sizeof dp->palette);
-
-}
-
-/* Call this only if the colour type is 3 - PNG_COLOR_TYPE_PALETTE - otherwise
- * it will png_error out. The API returns true if tRNS information was
- * present.
- */
-static int
-standard_palette_init(standard_palette palette, png_structp pp, png_infop pi)
-{
- png_colorp pal;
- png_bytep trans_alpha;
- int num;
-
- pal = 0;
- num = -1;
- if (png_get_PLTE(pp, pi, &pal, &num) & PNG_INFO_PLTE)
- {
- int i;
-
- for (i=0; i<num; ++i)
- {
- palette[i].red = pal[i].red;
- palette[i].green = pal[i].green;
- palette[i].blue = pal[i].blue;
- }
-
- /* Mark the remainder of the entries with a flag value: */
- for (; i<256; ++i)
- palette[i].red = palette[i].green = palette[i].blue = 126;
- }
-
- else /* !png_get_PLTE */
- png_error(pp, "validate: missing PLTE with color type 3");
-
- trans_alpha = 0;
- num = -1;
- if (png_get_tRNS(pp, pi, &trans_alpha, &num, 0) & PNG_INFO_tRNS)
- {
- int i;
-
- /* Any of these are crash-worthy - given the implementation of
- * png_get_tRNS up to 1.5 an app won't crash if it just checks the
- * result above and fails to check that the variables it passed have
- * actually been filled in! Note that if the app were to pass the
- * last, png_color_16p, variable too it couldn't rely on this.
- */
- if (trans_alpha == 0 || num <= 0 || num > 256)
- png_error(pp, "validate: unexpected png_get_tRNS (palette) result");
-
- for (i=0; i<num; ++i)
- palette[i].alpha = trans_alpha[i];
-
- for (; i<256; ++i)
- palette[i].alpha = 255;
-
- return 1; /* transparency */
- }
-
- else
- {
- /* No transparency - just set the alpha channel to opaque. */
- int i;
-
- for (i=0; i<256; ++i)
- palette[i].alpha = 255;
-
- return 0; /* no transparency */
- }
-}
-
-/* By passing a 'standard_display' the progressive callbacks can be used
- * directly by the sequential code, the functions suffixed "_imp" are the
- * implementations, the functions without the suffix are the callbacks.
- *
- * The code for the info callback is split into two because this callback calls
- * png_read_update_info or png_start_read_image and what gets called depends on
- * whether the info needs updating (we want to test both calls in pngvalid.)
- */
-static void
-standard_info_part1(standard_display *dp, png_structp pp, png_infop pi)
-{
- if (png_get_bit_depth(pp, pi) != dp->bit_depth)
- png_error(pp, "validate: bit depth changed");
-
- if (png_get_color_type(pp, pi) != dp->colour_type)
- png_error(pp, "validate: color type changed");
-
- if (png_get_filter_type(pp, pi) != PNG_FILTER_TYPE_BASE)
- png_error(pp, "validate: filter type changed");
-
- if (png_get_interlace_type(pp, pi) != dp->interlace_type)
- png_error(pp, "validate: interlacing changed");
-
- if (png_get_compression_type(pp, pi) != PNG_COMPRESSION_TYPE_BASE)
- png_error(pp, "validate: compression type changed");
-
- dp->w = png_get_image_width(pp, pi);
-
- if (dp->w != standard_width(pp, dp->id))
- png_error(pp, "validate: image width changed");
-
- dp->h = png_get_image_height(pp, pi);
-
- if (dp->h != standard_height(pp, dp->id))
- png_error(pp, "validate: image height changed");
-
- /* Record (but don't check at present) the input sBIT according to the colour
- * type information.
- */
- {
- png_color_8p sBIT = 0;
-
- if (png_get_sBIT(pp, pi, &sBIT) & PNG_INFO_sBIT)
- {
- int sBIT_invalid = 0;
-
- if (sBIT == 0)
- png_error(pp, "validate: unexpected png_get_sBIT result");
-
- if (dp->colour_type & PNG_COLOR_MASK_COLOR)
- {
- if (sBIT->red == 0 || sBIT->red > dp->bit_depth)
- sBIT_invalid = 1;
- else
- dp->red_sBIT = sBIT->red;
-
- if (sBIT->green == 0 || sBIT->green > dp->bit_depth)
- sBIT_invalid = 1;
- else
- dp->green_sBIT = sBIT->green;
-
- if (sBIT->blue == 0 || sBIT->blue > dp->bit_depth)
- sBIT_invalid = 1;
- else
- dp->blue_sBIT = sBIT->blue;
- }
-
- else /* !COLOR */
- {
- if (sBIT->gray == 0 || sBIT->gray > dp->bit_depth)
- sBIT_invalid = 1;
- else
- dp->blue_sBIT = dp->green_sBIT = dp->red_sBIT = sBIT->gray;
- }
-
- /* All 8 bits in tRNS for a palette image are significant - see the
- * spec.
- */
- if (dp->colour_type & PNG_COLOR_MASK_ALPHA)
- {
- if (sBIT->alpha == 0 || sBIT->alpha > dp->bit_depth)
- sBIT_invalid = 1;
- else
- dp->alpha_sBIT = sBIT->alpha;
- }
-
- if (sBIT_invalid)
- png_error(pp, "validate: sBIT value out of range");
- }
- }
-
- /* Important: this is validating the value *before* any transforms have been
- * put in place. It doesn't matter for the standard tests, where there are
- * no transforms, but it does for other tests where rowbytes may change after
- * png_read_update_info.
- */
- if (png_get_rowbytes(pp, pi) != standard_rowsize(pp, dp->id))
- png_error(pp, "validate: row size changed");
-
- /* The palette is never read for non-palette images, even though it is valid
- * - this could be changed.
- */
- if (dp->colour_type == 3) /* palette */
- {
- int i;
-
- dp->is_transparent = standard_palette_init(dp->palette, pp, pi);
-
- /* And validate the result. */
- for (i=0; i<256; ++i)
- if (dp->palette[i].red != i || dp->palette[i].green != i ||
- dp->palette[i].blue != i)
- png_error(pp, "validate: color type 3 PLTE chunk changed");
- }
-
- /* In any case always check for a tranparent color: */
- {
- png_color_16p trans_color = 0;
-
- if (png_get_tRNS(pp, pi, 0, 0, &trans_color) & PNG_INFO_tRNS)
- {
- if (trans_color == 0)
- png_error(pp, "validate: unexpected png_get_tRNS (color) result");
-
- switch (dp->colour_type)
- {
- case 0:
- dp->transparent.red = dp->transparent.green = dp->transparent.blue =
- trans_color->gray;
- dp->is_transparent = 1;
- break;
-
- case 2:
- dp->transparent.red = trans_color->red;
- dp->transparent.green = trans_color->green;
- dp->transparent.blue = trans_color->blue;
- dp->is_transparent = 1;
- break;
-
- case 3:
- /* Not expected because it should result in the array case
- * above.
- */
- png_error(pp, "validate: unexpected png_get_tRNS result");
- break;
-
- default:
- png_error(pp, "validate: invalid tRNS chunk with alpha image");
- }
- }
- }
-
- /* Read the number of passes - expected to match the value used when
- * creating the image (interlaced or not). This has the side effect of
- * turning on interlace handling (if do_interlace is not set.)
- */
- dp->npasses = npasses_from_interlace_type(pp, dp->interlace_type);
- if (!dp->do_interlace && dp->npasses != png_set_interlace_handling(pp))
- png_error(pp, "validate: file changed interlace type");
-
- /* Caller calls png_read_update_info or png_start_read_image now, then calls
- * part2.
- */
-}
-
-/* This must be called *after* the png_read_update_info call to get the correct
- * 'rowbytes' value, otherwise png_get_rowbytes will refer to the untransformed
- * image.
- */
-static void
-standard_info_part2(standard_display *dp, png_structp pp, png_infop pi,
- int nImages)
-{
- /* Record cbRow now that it can be found. */
- dp->pixel_size = bit_size(pp, png_get_color_type(pp, pi),
- png_get_bit_depth(pp, pi));
- dp->bit_width = png_get_image_width(pp, pi) * dp->pixel_size;
- dp->cbRow = png_get_rowbytes(pp, pi);
-
- /* Validate the rowbytes here again. */
- if (dp->cbRow != (dp->bit_width+7)/8)
- png_error(pp, "bad png_get_rowbytes calculation");
-
- /* Then ensure there is enough space for the output image(s). */
- store_ensure_image(dp->ps, pp, nImages * dp->cbRow * dp->h);
-}
-
-static void
-standard_info_imp(standard_display *dp, png_structp pp, png_infop pi,
- int nImages)
-{
- /* Note that the validation routine has the side effect of turning on
- * interlace handling in the subsequent code.
- */
- standard_info_part1(dp, pp, pi);
-
- /* And the info callback has to call this (or png_read_update_info - see
- * below in the png_modifier code for that variant.
- */
- png_start_read_image(pp);
-
- /* Validate the height, width and rowbytes plus ensure that sufficient buffer
- * exists for decoding the image.
- */
- standard_info_part2(dp, pp, pi, nImages);
-}
-
-static void
-standard_info(png_structp pp, png_infop pi)
-{
- standard_display *dp = png_get_progressive_ptr(pp);
-
- /* Call with nImages==1 because the progressive reader can only produce one
- * image.
- */
- standard_info_imp(dp, pp, pi, 1 /*only one image*/);
-}
-
-static void
-progressive_row(png_structp pp, png_bytep new_row, png_uint_32 y, int pass)
-{
- PNG_CONST standard_display *dp = png_get_progressive_ptr(pp);
-
- /* When handling interlacing some rows will be absent in each pass, the
- * callback still gets called, but with a NULL pointer. This is checked
- * in the 'else' clause below. We need our own 'cbRow', but we can't call
- * png_get_rowbytes because we got no info structure.
- */
- if (new_row != NULL)
- {
- png_bytep row;
-
- /* In the case where the reader doesn't do the interlace it gives
- * us the y in the sub-image:
- */
- if (dp->do_interlace && dp->interlace_type == PNG_INTERLACE_ADAM7)
- y = PNG_ROW_FROM_PASS_ROW(y, pass);
-
- /* Validate this just in case. */
- if (y >= dp->h)
- png_error(pp, "invalid y to progressive row callback");
-
- row = dp->ps->image + y * dp->cbRow;
-
- /* Combine the new row into the old: */
- if (dp->do_interlace)
- {
- if (dp->interlace_type == PNG_INTERLACE_ADAM7)
- deinterlace_row(row, new_row, dp->pixel_size, dp->w, pass);
- else
- memcpy(row, new_row, dp->cbRow);
- }
- else
- png_progressive_combine_row(pp, row, new_row);
- } else if (dp->interlace_type == PNG_INTERLACE_ADAM7 &&
- PNG_ROW_IN_INTERLACE_PASS(y, pass) &&
- PNG_PASS_COLS(dp->w, pass) > 0)
- png_error(pp, "missing row in progressive de-interlacing");
-}
-
-static void
-sequential_row(standard_display *dp, png_structp pp, png_infop pi,
- PNG_CONST png_bytep pImage, PNG_CONST png_bytep pDisplay)
-{
- PNG_CONST int npasses = dp->npasses;
- PNG_CONST int do_interlace = dp->do_interlace &&
- dp->interlace_type == PNG_INTERLACE_ADAM7;
- PNG_CONST png_uint_32 height = standard_height(pp, dp->id);
- PNG_CONST png_uint_32 width = standard_width(pp, dp->id);
- PNG_CONST size_t cbRow = dp->cbRow;
- int pass;
-
- for (pass=0; pass<npasses; ++pass)
- {
- png_uint_32 y;
- png_uint_32 wPass = PNG_PASS_COLS(width, pass);
- png_bytep pRow1 = pImage;
- png_bytep pRow2 = pDisplay;
-
- for (y=0; y<height; ++y)
- {
- if (do_interlace)
- {
- /* wPass may be zero or this row may not be in this pass.
- * png_read_row must not be called in either case.
- */
- if (wPass > 0 && PNG_ROW_IN_INTERLACE_PASS(y, pass))
- {
- /* Read the row into a pair of temporary buffers, then do the
- * merge here into the output rows.
- */
- png_byte row[STANDARD_ROWMAX], display[STANDARD_ROWMAX];
-
- /* The following aids (to some extent) error detection - we can
- * see where png_read_row wrote. Use opposite values in row and
- * display to make this easier.
- */
- memset(row, 0xff, sizeof row);
- memset(display, 0, sizeof display);
-
- png_read_row(pp, row, display);
-
- if (pRow1 != NULL)
- deinterlace_row(pRow1, row, dp->pixel_size, dp->w, pass);
-
- if (pRow2 != NULL)
- deinterlace_row(pRow2, display, dp->pixel_size, dp->w, pass);
- }
- }
- else
- png_read_row(pp, pRow1, pRow2);
-
- if (pRow1 != NULL)
- pRow1 += cbRow;
-
- if (pRow2 != NULL)
- pRow2 += cbRow;
- }
- }
-
- /* And finish the read operation (only really necessary if the caller wants
- * to find additional data in png_info from chunks after the last IDAT.)
- */
- png_read_end(pp, pi);
-}
-
-static void
-standard_row_validate(standard_display *dp, png_structp pp, png_const_bytep row,
- png_const_bytep display, png_uint_32 y)
-{
- png_byte std[STANDARD_ROWMAX];
-
- memset(std, 0xff, sizeof std);
- standard_row(pp, std, dp->id, y);
-
- /* At the end both the 'row' and 'display' arrays should end up identical.
- * In earlier passes 'row' will be partially filled in, with only the pixels
- * that have been read so far, but 'display' will have those pixels
- * replicated to fill the unread pixels while reading an interlaced image.
- * The side effect inside the libpng sequential reader is that the 'row'
- * array retains the correct values for unwritten pixels within the row
- * bytes, while the 'display' array gets bits off the end of the image (in
- * the last byte) trashed. Unfortunately in the progressive reader the
- * row bytes are always trashed, so we always do a pixel_cmp here even though
- * a memcmp of all cbRow bytes will succeed for the sequential reader.
- */
- if (row != NULL && pixel_cmp(std, row, dp->bit_width) != 0)
- {
- char msg[64];
- sprintf(msg, "PNG image row %d changed", y);
- png_error(pp, msg);
- }
-
- /* In this case use pixel_cmp because we need to compare a partial
- * byte at the end of the row if the row is not an exact multiple
- * of 8 bits wide.
- */
- if (display != NULL && pixel_cmp(std, display, dp->bit_width) != 0)
- {
- char msg[64];
- sprintf(msg, "display row %d changed", y);
- png_error(pp, msg);
- }
-}
-
-static void
-standard_image_validate(standard_display *dp, png_structp pp,
- png_const_bytep pImage, png_const_bytep pDisplay)
-{
- png_uint_32 y;
-
- for (y=0; y<dp->h; ++y)
- {
- standard_row_validate(dp, pp, pImage, pDisplay, y);
-
- if (pImage != NULL)
- pImage += dp->cbRow;
-
- if (pDisplay != NULL)
- pDisplay += dp->cbRow;
- }
-
- /* This avoids false positives if the validation code is never called! */
- dp->ps->validated = 1;
-}
-
-static void
-standard_end(png_structp pp, png_infop pi)
-{
- standard_display *dp = png_get_progressive_ptr(pp);
-
- UNUSED(pi)
-
- /* Validate the image - progressive reading only produces one variant for
- * interlaced images.
- */
- standard_image_validate(dp, pp, dp->ps->image, NULL);
-}
-
-/* A single test run checking the standard image to ensure it is not damaged. */
-static void
-standard_test(png_store* PNG_CONST psIn, png_uint_32 PNG_CONST id,
- int do_interlace)
-{
- standard_display d;
- context(psIn, fault);
-
- /* Set up the display (stack frame) variables from the arguments to the
- * function and initialize the locals that are filled in later.
- */
- standard_display_init(&d, psIn, id, do_interlace);
-
- /* Everything is protected by a Try/Catch. The functions called also
- * typically have local Try/Catch blocks.
- */
- Try
- {
- png_structp pp;
- png_infop pi;
-
- /* Get a png_struct for reading the image. This will throw an error if it
- * fails, so we don't need to check the result.
- */
- pp = set_store_for_read(d.ps, &pi, d.id,
- d.do_interlace ? (d.ps->progressive ?
- "pngvalid progressive deinterlacer" :
- "pngvalid sequential deinterlacer") : (d.ps->progressive ?
- "progressive reader" : "sequential reader"));
-
- /* Introduce the correct read function. */
- if (d.ps->progressive)
- {
- png_set_progressive_read_fn(pp, &d, standard_info, progressive_row,
- standard_end);
-
- /* Now feed data into the reader until we reach the end: */
- store_progressive_read(d.ps, pp, pi);
- }
- else
- {
- /* Note that this takes the store, not the display. */
- png_set_read_fn(pp, d.ps, store_read);
-
- /* Check the header values: */
- png_read_info(pp, pi);
-
- /* The code tests both versions of the images that the sequential
- * reader can produce.
- */
- standard_info_imp(&d, pp, pi, 2 /*images*/);
-
- /* Need the total bytes in the image below; we can't get to this point
- * unless the PNG file values have been checked against the expected
- * values.
- */
- {
- PNG_CONST png_bytep pImage = d.ps->image;
- PNG_CONST png_bytep pDisplay = pImage + d.cbRow * d.h;
-
- sequential_row(&d, pp, pi, pImage, pDisplay);
-
- /* After the last pass loop over the rows again to check that the
- * image is correct.
- */
- standard_image_validate(&d, pp, pImage, pDisplay);
- }
- }
-
- /* Check for validation. */
- if (!d.ps->validated)
- png_error(pp, "image read failed silently");
-
- /* Successful completion. */
- }
-
- Catch(fault)
- d.ps = fault; /* make sure this hasn't been clobbered. */
-
- /* In either case clean up the store. */
- store_read_reset(d.ps);
-}
-
-static int
-test_standard(png_modifier* PNG_CONST pm, png_byte PNG_CONST colour_type,
- int bdlo, int PNG_CONST bdhi)
-{
- for (; bdlo <= bdhi; ++bdlo)
- {
- int interlace_type;
-
- for (interlace_type = PNG_INTERLACE_NONE;
- interlace_type < PNG_INTERLACE_LAST; ++interlace_type)
- {
- standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo),
- interlace_type, 0, 0, 0), 0/*do_interlace*/);
-
- if (fail(pm))
- return 0;
- }
- }
-
- return 1; /* keep going */
-}
-
-static void
-perform_standard_test(png_modifier *pm)
-{
- /* Test each colour type over the valid range of bit depths (expressed as
- * log2(bit_depth) in turn, stop as soon as any error is detected.
- */
- if (!test_standard(pm, 0, 0, READ_BDHI))
- return;
-
- if (!test_standard(pm, 2, 3, READ_BDHI))
- return;
-
- if (!test_standard(pm, 3, 0, 3))
- return;
-
- if (!test_standard(pm, 4, 3, READ_BDHI))
- return;
-
- if (!test_standard(pm, 6, 3, READ_BDHI))
- return;
-}
-
-
-/********************************** SIZE TESTS ********************************/
-static int
-test_size(png_modifier* PNG_CONST pm, png_byte PNG_CONST colour_type,
- int bdlo, int PNG_CONST bdhi)
-{
- /* Run the tests on each combination.
- *
- * NOTE: on my 32 bit x86 each of the following blocks takes
- * a total of 3.5 seconds if done across every combo of bit depth
- * width and height. This is a waste of time in practice, hence the
- * hinc and winc stuff:
- */
- static PNG_CONST png_byte hinc[] = {1, 3, 11, 1, 5};
- static PNG_CONST png_byte winc[] = {1, 9, 5, 7, 1};
- for (; bdlo <= bdhi; ++bdlo)
- {
- png_uint_32 h, w;
-
- for (h=1; h<=16; h+=hinc[bdlo]) for (w=1; w<=16; w+=winc[bdlo])
- {
- /* First test all the 'size' images against the sequential
- * reader using libpng to deinterlace (where required.) This
- * validates the write side of libpng. There are four possibilities
- * to validate.
- */
- standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo),
- PNG_INTERLACE_NONE, w, h, 0), 0/*do_interlace*/);
-
- if (fail(pm))
- return 0;
-
- standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo),
- PNG_INTERLACE_NONE, w, h, 1), 0/*do_interlace*/);
-
- if (fail(pm))
- return 0;
-
- standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo),
- PNG_INTERLACE_ADAM7, w, h, 0), 0/*do_interlace*/);
-
- if (fail(pm))
- return 0;
-
- standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo),
- PNG_INTERLACE_ADAM7, w, h, 1), 0/*do_interlace*/);
-
- if (fail(pm))
- return 0;
-
- /* Now validate the interlaced read side - do_interlace true,
- * in the progressive case this does actually make a difference
- * to the code used in the non-interlaced case too.
- */
- standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo),
- PNG_INTERLACE_NONE, w, h, 0), 1/*do_interlace*/);
-
- if (fail(pm))
- return 0;
-
- standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo),
- PNG_INTERLACE_ADAM7, w, h, 0), 1/*do_interlace*/);
-
- if (fail(pm))
- return 0;
- }
- }
-
- return 1; /* keep going */
-}
-
-static void
-perform_size_test(png_modifier *pm)
-{
- /* Test each colour type over the valid range of bit depths (expressed as
- * log2(bit_depth) in turn, stop as soon as any error is detected.
- */
- if (!test_size(pm, 0, 0, READ_BDHI))
- return;
-
- if (!test_size(pm, 2, 3, READ_BDHI))
- return;
-
- /* For the moment don't do the palette test - it's a waste of time when
- * compared to the greyscale test.
- */
-#if 0
- if (!test_size(pm, 3, 0, 3))
- return;
-#endif
-
- if (!test_size(pm, 4, 3, READ_BDHI))
- return;
-
- if (!test_size(pm, 6, 3, READ_BDHI))
- return;
-}
-
-
-/******************************* TRANSFORM TESTS ******************************/
-/* A set of tests to validate libpng image transforms. The possibilities here
- * are legion because the transforms can be combined in a combinatorial
- * fashion. To deal with this some measure of restraint is required, otherwise
- * the tests would take forever.
- */
-typedef struct image_pixel
-{
- /* A local (pngvalid) representation of a PNG pixel, in all its
- * various forms.
- */
- unsigned int red, green, blue, alpha; /* For non-palette images. */
- unsigned int palette_index; /* For a palette image. */
- png_byte colour_type; /* As in the spec. */
- png_byte bit_depth; /* Defines bit size in row */
- png_byte sample_depth; /* Scale of samples */
- int have_tRNS; /* tRNS chunk may need processing */
-
- /* For checking the code calculates double precision floating point values
- * along with an error value, accumulated from the transforms. Because an
- * sBIT setting allows larger error bounds (indeed, by the spec, apparently
- * up to just less than +/-1 in the scaled value) the *lowest* sBIT for each
- * channel is stored. This sBIT value is folded in to the stored error value
- * at the end of the application of the transforms to the pixel.
- */
- double redf, greenf, bluef, alphaf;
- double rede, greene, bluee, alphae;
- png_byte red_sBIT, green_sBIT, blue_sBIT, alpha_sBIT;
-} image_pixel;
-
-/* Shared utility function, see below. */
-static void
-image_pixel_setf(image_pixel *this, unsigned int max)
-{
- this->redf = this->red / (double)max;
- this->greenf = this->green / (double)max;
- this->bluef = this->blue / (double)max;
- this->alphaf = this->alpha / (double)max;
-
- if (this->red < max)
- this->rede = this->redf * DBL_EPSILON;
- else
- this->rede = 0;
- if (this->green < max)
- this->greene = this->greenf * DBL_EPSILON;
- else
- this->greene = 0;
- if (this->blue < max)
- this->bluee = this->bluef * DBL_EPSILON;
- else
- this->bluee = 0;
- if (this->alpha < max)
- this->alphae = this->alphaf * DBL_EPSILON;
- else
- this->alphae = 0;
-}
-
-/* Initialize the structure for the next pixel - call this before doing any
- * transforms and call it for each pixel since all the fields may need to be
- * reset.
- */
-static void
-image_pixel_init(image_pixel *this, png_const_bytep row, png_byte colour_type,
- png_byte bit_depth, png_uint_32 x, standard_palette palette)
-{
- PNG_CONST png_byte sample_depth = (png_byte)(colour_type ==
- PNG_COLOR_TYPE_PALETTE ? 8 : bit_depth);
- PNG_CONST unsigned int max = (1U<<sample_depth)-1;
-
- /* Initially just set everything to the same number and the alpha to opaque.
- * Note that this currently assumes a simple palette where entry x has colour
- * rgb(x,x,x)!
- */
- this->palette_index = this->red = this->green = this->blue =
- sample(row, colour_type, bit_depth, x, 0);
- this->alpha = max;
- this->red_sBIT = this->green_sBIT = this->blue_sBIT = this->alpha_sBIT =
- sample_depth;
-
- /* Then override as appropriate: */
- if (colour_type == 3) /* palette */
- {
- /* This permits the caller to default to the sample value. */
- if (palette != 0)
- {
- PNG_CONST unsigned int i = this->palette_index;
-
- this->red = palette[i].red;
- this->green = palette[i].green;
- this->blue = palette[i].blue;
- this->alpha = palette[i].alpha;
- }
- }
-
- else /* not palette */
- {
- unsigned int i = 0;
-
- if (colour_type & 2)
- {
- this->green = sample(row, colour_type, bit_depth, x, 1);
- this->blue = sample(row, colour_type, bit_depth, x, 2);
- i = 2;
- }
- if (colour_type & 4)
- this->alpha = sample(row, colour_type, bit_depth, x, ++i);
- }
-
- /* Calculate the scaled values, these are simply the values divided by
- * 'max' and the error is initialized to the double precision epsilon value
- * from the header file.
- */
- image_pixel_setf(this, max);
-
- /* Store the input information for use in the transforms - these will
- * modify the information.
- */
- this->colour_type = colour_type;
- this->bit_depth = bit_depth;
- this->sample_depth = sample_depth;
- this->have_tRNS = 0;
-}
-
-/* Convert a palette image to an rgb image. This necessarily converts the tRNS
- * chunk at the same time, because the tRNS will be in palette form.
- */
-static void
-image_pixel_convert_PLTE(image_pixel *this, const standard_display *display)
-{
- if (this->colour_type == PNG_COLOR_TYPE_PALETTE)
- {
- PNG_CONST unsigned int i = this->palette_index;
-
- this->bit_depth = this->sample_depth;
- this->red = display->palette[i].red;
- this->green = display->palette[i].green;
- this->blue = display->palette[i].blue;
- this->red_sBIT = display->red_sBIT;
- this->green_sBIT = display->green_sBIT;
- this->blue_sBIT = display->blue_sBIT;
-
- if (this->have_tRNS)
- {
- this->alpha = display->palette[i].alpha;
- this->colour_type = PNG_COLOR_TYPE_RGB_ALPHA;
- this->have_tRNS = 0;
- }
- else
- {
- this->alpha = 255;
- this->colour_type = PNG_COLOR_TYPE_RGB;
- }
- this->alpha_sBIT = 8;
-
- /* And regenerate the scaled values and all the errors, which are now set
- * back to the initial values.
- */
- image_pixel_setf(this, 255);
- }
-}
-
-/* Add an alpha channel, this will glom in the tRNS information because tRNS is
- * not valid in an alpha image. The bit depth will invariably be set to at
- * least 8. Palette images will be converted to alpha (using the above API).
- */
-static void
-image_pixel_add_alpha(image_pixel *this, const standard_display *display)
-{
- if (this->colour_type == PNG_COLOR_TYPE_PALETTE)
- image_pixel_convert_PLTE(this, display);
-
- if ((this->colour_type & PNG_COLOR_MASK_ALPHA) == 0)
- {
- if (this->colour_type == PNG_COLOR_TYPE_GRAY)
- {
- if (this->bit_depth < 8)
- this->bit_depth = 8;
-
- if (this->have_tRNS)
- {
- this->have_tRNS = 0;
-
- /* Check the input, original, channel value here against the
- * original tRNS gray chunk valie.
- */
- if (this->red == display->transparent.red)
- this->alphaf = 0;
- else
- this->alphaf = 1;
- }
- else
- this->alphaf = 1;
-
- this->colour_type = PNG_COLOR_TYPE_GRAY_ALPHA;
- }
-
- else if (this->colour_type == PNG_COLOR_TYPE_RGB)
- {
- if (this->have_tRNS)
- {
- this->have_tRNS = 0;
-
- /* Again, check the exact input values, not the current transformed
- * value!
- */
- if (this->red == display->transparent.red &&
- this->green == display->transparent.green &&
- this->blue == display->transparent.blue)
- this->alphaf = 0;
- else
- this->alphaf = 1;
-
- this->colour_type = PNG_COLOR_TYPE_RGB_ALPHA;
- }
- }
-
- /* The error in the alpha is zero and the sBIT value comes from the
- * original sBIT data (actually it will always be the original bit depth).
- */
- this->alphae = 0;
- this->alpha_sBIT = display->alpha_sBIT;
- }
-}
-
-struct transform_display;
-typedef struct image_transform
-{
- /* The name of this transform: a string. */
- PNG_CONST char *name;
-
- /* Each transform can be disabled from the command line: */
- int enable;
-
- /* The global list of transforms; read only. */
- struct image_transform *PNG_CONST list;
-
- /* The global count of the number of times this transform has been set on an
- * image.
- */
- unsigned int global_use;
-
- /* The local count of the number of times this transform has been set. */
- unsigned int local_use;
-
- /* The next transform in the list, each transform must call its own next
- * transform after it has processed the pixel successfully.
- */
- PNG_CONST struct image_transform *next;
-
- /* A single transform for the image, expressed as a series of function
- * callbacks and some space for values.
- *
- * First a callback to set the transform on the current png_read_struct:
- */
- void (*set)(PNG_CONST struct image_transform *this,
- struct transform_display *that, png_structp pp, png_infop pi);
-
- /* Then a transform that takes an input pixel in one PNG format or another
- * and modifies it by a pngvalid implementation of the transform (thus
- * duplicating the libpng intent without, we hope, duplicating the bugs
- * in the libpng implementation!) The png_structp is solely to allow error
- * reporting via png_error and png_warning.
- */
- void (*mod)(PNG_CONST struct image_transform *this, image_pixel *that,
- png_structp pp, PNG_CONST struct transform_display *display);
-
- /* Add this transform to the list and return true if the transform is
- * meaningful for this colour type and bit depth - if false then the
- * transform should have no effect on the image so there's not a lot of
- * point running it.
- */
- int (*add)(struct image_transform *this,
- PNG_CONST struct image_transform **that, png_byte colour_type,
- png_byte bit_depth);
-} image_transform;
-
-typedef struct transform_display
-{
- standard_display this;
-
- /* Parameters */
- png_modifier* pm;
- PNG_CONST image_transform* transform_list;
-
- /* Local variables */
- png_byte output_colour_type;
- png_byte output_bit_depth;
-} transform_display;
-
-/* Two functions to end the list: */
-static void
-image_transform_set_end(PNG_CONST image_transform *this,
- transform_display *that, png_structp pp, png_infop pi)
-{
- UNUSED(this)
- UNUSED(that)
- UNUSED(pp)
- UNUSED(pi)
-}
-
-/* At the end of the list recalculate the output image pixel value from the
- * double precision values set up by the preceding 'mod' calls:
- */
-static unsigned int
-sample_scale(double sample_value, unsigned int scale)
-{
- sample_value = floor(sample_value * scale + .5);
-
- /* Return NaN as 0: */
- if (!(sample_value > 0))
- sample_value = 0;
- else if (sample_value > scale)
- sample_value = scale;
-
- return (unsigned int)sample_value;
-}
-
-static void
-image_transform_mod_end(PNG_CONST image_transform *this, image_pixel *that,
- png_structp pp, PNG_CONST transform_display *display)
-{
- PNG_CONST unsigned int scale = (1U<<that->sample_depth)-1;
-
- UNUSED(this)
- UNUSED(pp)
- UNUSED(display)
-
- /* At the end recalculate the digitized red green and blue values according
- * to the current sample_depth of the pixel.
- *
- * The sample value is simply scaled to the maximum, checking for over
- * and underflow (which can both happen for some image transforms,
- * including simple size scaling, though libpng doesn't do that at present.
- */
- that->red = sample_scale(that->redf, scale);
-
- /* The error value is increased, at the end, according to the lowest sBIT
- * value seen. Common sense tells us that the intermediate integer
- * representations are no more accurate than +/- 0.5 in the integral values,
- * the sBIT allows the implementation to be worse than this. In addition the
- * PNG specification actually permits any error within the range (-1..+1),
- * but that is ignored here. Instead the final digitized value is compared,
- * below to the digitized value of the error limits - this has the net effect
- * of allowing (almost) +/-1 in the output value. It's difficult to see how
- * any algorithm that digitizes intermediate results can be more accurate.
- */
- that->rede += 1./(2*((1U<<that->red_sBIT)-1));
-
- if (that->colour_type & PNG_COLOR_MASK_COLOR)
- {
- that->green = sample_scale(that->greenf, scale);
- that->blue = sample_scale(that->bluef, scale);
- that->greene += 1./(2*((1U<<that->green_sBIT)-1));
- that->bluee += 1./(2*((1U<<that->blue_sBIT)-1));
- }
- else
- {
- that->blue = that->green = that->red;
- that->bluef = that->greenf = that->redf;
- that->bluee = that->greene = that->rede;
- }
-
- if ((that->colour_type & PNG_COLOR_MASK_ALPHA) ||
- that->colour_type == PNG_COLOR_TYPE_PALETTE)
- {
- that->alpha = sample_scale(that->alphaf, scale);
- that->alphae += 1./(2*((1U<<that->alpha_sBIT)-1));
- }
- else
- {
- that->alpha = scale; /* opaque */
- that->alpha = 1; /* Override this. */
- that->alphae = 0; /* It's exact ;-) */
- }
-}
-
-/* Static 'end' structure: */
-static image_transform image_transform_end =
-{
- "(end)", /* name */
- 1, /* enable */
- 0, /* list */
- 0, /* global_use */
- 0, /* local_use */
- 0, /* next */
- image_transform_set_end,
- image_transform_mod_end,
- 0 /* never called, I want it to crash if it is! */
-};
-
-/* Reader callbacks and implementations, where they differ from the standard
- * ones.
- */
-static void
-transform_display_init(transform_display *dp, png_modifier *pm, png_uint_32 id,
- PNG_CONST image_transform *transform_list)
-{
- /* Standard fields */
- standard_display_init(&dp->this, &pm->this, id, 0/*do_interlace*/);
-
- /* Parameter fields */
- dp->pm = pm;
- dp->transform_list = transform_list;
-
- /* Local variable fields */
- dp->output_colour_type = 255; /* invalid */
- dp->output_bit_depth = 255; /* invalid */
-}
-
-static void
-transform_info_imp(transform_display *dp, png_structp pp, png_infop pi)
-{
- /* Reuse the standard stuff as appropriate. */
- standard_info_part1(&dp->this, pp, pi);
-
- /* Now set the list of transforms. */
- dp->transform_list->set(dp->transform_list, dp, pp, pi);
-
- /* Update the info structure for these transforms: */
- png_read_update_info(pp, pi);
-
- /* And get the output information into the standard_display */
- standard_info_part2(&dp->this, pp, pi, 1/*images*/);
-
- /* Plus the extra stuff we need for the transform tests: */
- dp->output_colour_type = png_get_color_type(pp, pi);
- dp->output_bit_depth = png_get_bit_depth(pp, pi);
-
- /* Validate the combination of colour type and bit depth that we are getting
- * out of libpng; the semantics of something not in the PNG spec are, at
- * best, unclear.
- */
- switch (dp->output_colour_type)
- {
- case PNG_COLOR_TYPE_PALETTE:
- if (dp->output_bit_depth > 8) goto error;
- /*FALL THROUGH*/
- case PNG_COLOR_TYPE_GRAY:
- if (dp->output_bit_depth == 1 || dp->output_bit_depth == 2 ||
- dp->output_bit_depth == 4)
- break;
- /*FALL THROUGH*/
- default:
- if (dp->output_bit_depth == 8 || dp->output_bit_depth == 16)
- break;
- /*FALL THROUGH*/
- error:
- {
- char message[128];
- size_t pos;
-
- pos = safecat(message, sizeof message, 0,
- "invalid final bit depth: colour type(");
- pos = safecatn(message, sizeof message, pos, dp->output_colour_type);
- pos = safecat(message, sizeof message, pos, ") with bit depth: ");
- pos = safecatn(message, sizeof message, pos, dp->output_bit_depth);
-
- png_error(pp, message);
- }
- }
-
- /* Use a test pixel to check that the output agrees with what we expect -
- * this avoids running the whole test if the output is unexpected.
- */
- {
- image_pixel test_pixel;
-
- memset(&test_pixel, 0, sizeof test_pixel);
- test_pixel.colour_type = dp->this.colour_type; /* input */
- test_pixel.bit_depth = dp->this.bit_depth;
- if (test_pixel.colour_type == PNG_COLOR_TYPE_PALETTE)
- test_pixel.sample_depth = 8;
- else
- test_pixel.sample_depth = test_pixel.bit_depth;
- /* Don't need sBIT here */
- test_pixel.have_tRNS = dp->this.is_transparent;
-
- dp->transform_list->mod(dp->transform_list, &test_pixel, pp, dp);
-
- if (test_pixel.colour_type != dp->output_colour_type)
- {
- char message[128];
- size_t pos = safecat(message, sizeof message, 0, "colour type ");
-
- pos = safecatn(message, sizeof message, pos, dp->output_colour_type);
- pos = safecat(message, sizeof message, pos, " expected ");
- pos = safecatn(message, sizeof message, pos, test_pixel.colour_type);
-
- png_error(pp, message);
- }
-
- if (test_pixel.bit_depth != dp->output_bit_depth)
- {
- char message[128];
- size_t pos = safecat(message, sizeof message, 0, "bit depth ");
-
- pos = safecatn(message, sizeof message, pos, dp->output_bit_depth);
- pos = safecat(message, sizeof message, pos, " expected ");
- pos = safecatn(message, sizeof message, pos, test_pixel.bit_depth);
-
- png_error(pp, message);
- }
-
- /* If both bit depth and colour type are correct check the sample depth.
- * I believe these are both internal errors.
- */
- if (test_pixel.colour_type == PNG_COLOR_TYPE_PALETTE)
- {
- if (test_pixel.sample_depth != 8) /* oops - internal error! */
- png_error(pp, "pngvalid: internal: palette sample depth not 8");
- }
- else if (test_pixel.sample_depth != dp->output_bit_depth)
- {
- char message[128];
- size_t pos = safecat(message, sizeof message, 0,
- "internal: sample depth ");
-
- pos = safecatn(message, sizeof message, pos, dp->output_bit_depth);
- pos = safecat(message, sizeof message, pos, " expected ");
- pos = safecatn(message, sizeof message, pos, test_pixel.sample_depth);
-
- png_error(pp, message);
- }
- }
-}
-
-static void
-transform_info(png_structp pp, png_infop pi)
-{
- transform_info_imp(png_get_progressive_ptr(pp), pp, pi);
-}
-
-static void
-transform_range_check(png_structp pp, unsigned int r, unsigned int g,
- unsigned int b, unsigned int a, unsigned int in_digitized, double in,
- unsigned int out, png_byte sample_depth, double err, PNG_CONST char *name)
-{
- /* Compare the scaled, digitzed, values of our local calculation (in+-err)
- * with the digitized values libpng produced; 'sample_depth' is the actual
- * digitization depth of the libpng output colors (the bit depth except for
- * palette images where it is always 8.)
- */
- unsigned int max = (1U<<sample_depth)-1;
- double in_min = ceil((in-err)*max - .5);
- double in_max = floor((in+err)*max + .5);
- if (!(out >= in_min && out <= in_max))
- {
- char message[256];
- size_t pos;
-
- pos = safecat(message, sizeof message, 0, name);
- pos = safecat(message, sizeof message, pos, " output value error: rgba(");
- pos = safecatn(message, sizeof message, pos, r);
- pos = safecat(message, sizeof message, pos, ",");
- pos = safecatn(message, sizeof message, pos, g);
- pos = safecat(message, sizeof message, pos, ",");
- pos = safecatn(message, sizeof message, pos, b);
- pos = safecat(message, sizeof message, pos, ",");
- pos = safecatn(message, sizeof message, pos, a);
- pos = safecat(message, sizeof message, pos, "): ");
- pos = safecatn(message, sizeof message, pos, out);
- pos = safecat(message, sizeof message, pos, " expected: ");
- pos = safecatn(message, sizeof message, pos, in_digitized);
- pos = safecat(message, sizeof message, pos, " (");
- pos = safecatd(message, sizeof message, pos, (in-err)*max, 3);
- pos = safecat(message, sizeof message, pos, "..");
- pos = safecatd(message, sizeof message, pos, (in+err)*max, 3);
- pos = safecat(message, sizeof message, pos, ")");
-
- png_error(pp, message);
- }
-}
-
-static void
-transform_image_validate(transform_display *dp, png_structp pp, png_infop pi,
- png_const_bytep pRow)
-{
- /* Constants for the loop below: */
- PNG_CONST png_byte in_ct = dp->this.colour_type;
- PNG_CONST png_byte in_bd = dp->this.bit_depth;
- PNG_CONST png_uint_32 w = dp->this.w;
- PNG_CONST png_uint_32 h = dp->this.h;
- PNG_CONST size_t cbRow = dp->this.cbRow;
- PNG_CONST png_byte out_ct = dp->output_colour_type;
- PNG_CONST png_byte out_bd = dp->output_bit_depth;
- PNG_CONST png_byte sample_depth = (png_byte)(out_ct ==
- PNG_COLOR_TYPE_PALETTE ? 8 : out_bd);
- PNG_CONST png_byte red_sBIT = dp->this.red_sBIT;
- PNG_CONST png_byte green_sBIT = dp->this.green_sBIT;
- PNG_CONST png_byte blue_sBIT = dp->this.blue_sBIT;
- PNG_CONST png_byte alpha_sBIT = dp->this.alpha_sBIT;
- PNG_CONST int have_tRNS = dp->this.is_transparent;
-
- standard_palette out_palette;
- png_uint_32 y;
-
- UNUSED(pi)
-
- /* Read the palette corresponding to the output if the output colour type
- * indicates a palette, othewise set out_palette to garbage.
- */
- if (out_ct == PNG_COLOR_TYPE_PALETTE)
- (void)standard_palette_init(out_palette, pp, pi);
- else
- memset(out_palette, 0x5e, sizeof out_palette);
-
- for (y=0; y<h; ++y, pRow += cbRow)
- {
- png_uint_32 x;
-
- /* The original, standard, row pre-transforms. */
- png_byte std[STANDARD_ROWMAX];
-
- transform_row(pp, std, in_ct, in_bd, y);
-
- /* Go through each original pixel transforming it and comparing with what
- * libpng did to the same pixel.
- */
- for (x=0; x<w; ++x)
- {
- image_pixel in_pixel, out_pixel;
- unsigned int r, g, b, a;
-
- /* Find out what we think the pixel should be: */
- image_pixel_init(&in_pixel, std, in_ct, in_bd, x, dp->this.palette);
-
- in_pixel.red_sBIT = red_sBIT;
- in_pixel.green_sBIT = green_sBIT;
- in_pixel.blue_sBIT = blue_sBIT;
- in_pixel.alpha_sBIT = alpha_sBIT;
- in_pixel.have_tRNS = have_tRNS;
-
- /* For error detection, below. */
- r = in_pixel.red;
- g = in_pixel.green;
- b = in_pixel.blue;
- a = in_pixel.alpha;
-
- dp->transform_list->mod(dp->transform_list, &in_pixel, pp, dp);
-
- /* Read the output pixel and compare it to what we got, we don't
- * use the error field here, so no need to update sBIT.
- */
- image_pixel_init(&out_pixel, pRow, out_ct, out_bd, x, out_palette);
-
- /* We don't expect changes to the index here even if the bit depth is
- * changed.
- */
- if (in_ct == PNG_COLOR_TYPE_PALETTE &&
- out_ct == PNG_COLOR_TYPE_PALETTE)
- {
- if (in_pixel.palette_index != out_pixel.palette_index)
- png_error(pp, "unexpected transformed palette index");
- }
-
- /* Check the colours for palette images too - in fact the palette could
- * be separately verified itself in most cases.
- */
- if (in_pixel.red != out_pixel.red)
- transform_range_check(pp, r, g, b, a, in_pixel.red, in_pixel.redf,
- out_pixel.red, sample_depth, in_pixel.rede, "red/gray");
-
- if ((out_ct & PNG_COLOR_MASK_COLOR) != 0 &&
- in_pixel.green != out_pixel.green)
- transform_range_check(pp, r, g, b, a, in_pixel.green,
- in_pixel.greenf, out_pixel.green, sample_depth, in_pixel.greene,
- "green");
-
- if ((out_ct & PNG_COLOR_MASK_COLOR) != 0 &&
- in_pixel.blue != out_pixel.blue)
- transform_range_check(pp, r, g, b, a, in_pixel.blue, in_pixel.bluef,
- out_pixel.blue, sample_depth, in_pixel.bluee, "blue");
-
- if ((out_ct & PNG_COLOR_MASK_ALPHA) != 0 &&
- in_pixel.alpha != out_pixel.alpha)
- transform_range_check(pp, r, g, b, a, in_pixel.alpha,
- in_pixel.alphaf, out_pixel.alpha, sample_depth, in_pixel.alphae,
- "alpha");
- } /* pixel (x) loop */
- } /* row (y) loop */
-
- /* Record that something was actually checked to avoid a false positive. */
- dp->this.ps->validated = 1;
-}
-
-static void
-transform_end(png_structp pp, png_infop pi)
-{
- transform_display *dp = png_get_progressive_ptr(pp);
-
- transform_image_validate(dp, pp, pi, dp->this.ps->image);
-}
-
-/* A single test run. */
-static void
-transform_test(png_modifier *pmIn, PNG_CONST png_uint_32 idIn,
- PNG_CONST image_transform* transform_listIn, PNG_CONST char *name)
-{
- transform_display d;
- context(&pmIn->this, fault);
-
- transform_display_init(&d, pmIn, idIn, transform_listIn);
-
- Try
- {
- png_structp pp;
- png_infop pi;
-
- /* Get a png_struct for writing the image. */
- pp = set_modifier_for_read(d.pm, &pi, d.this.id, name);
-
-# if 0
- /* Logging (debugging only) */
- {
- char buffer[256];
-
- (void)store_message(&d.pm->this, pp, buffer, sizeof buffer, 0,
- "running test");
-
- fprintf(stderr, "%s\n", buffer);
- }
-# endif
-
- /* Introduce the correct read function. */
- if (d.pm->this.progressive)
- {
- /* Share the row function with the standard implementation. */
- png_set_progressive_read_fn(pp, &d, transform_info, progressive_row,
- transform_end);
-
- /* Now feed data into the reader until we reach the end: */
- modifier_progressive_read(d.pm, pp, pi);
- }
- else
- {
- /* modifier_read expects a png_modifier* */
- png_set_read_fn(pp, d.pm, modifier_read);
-
- /* Check the header values: */
- png_read_info(pp, pi);
-
- /* Process the 'info' requirements. Only one image is generated */
- transform_info_imp(&d, pp, pi);
-
- sequential_row(&d.this, pp, pi, NULL, d.this.ps->image);
-
- transform_image_validate(&d, pp, pi, d.this.ps->image);
- }
-
- modifier_reset(d.pm);
- }
-
- Catch(fault)
- modifier_reset((png_modifier*)fault);
-}
-
-/* The transforms: */
-#define ITSTRUCT(name) image_transform_##name
-#define IT(name,prev)\
-static image_transform ITSTRUCT(name) =\
-{\
- #name,\
- 1, /*enable*/\
- &ITSTRUCT(prev), /*list*/\
- 0, /*global_use*/\
- 0, /*local_use*/\
- 0, /*next*/\
- image_transform_png_set_##name##_set,\
- image_transform_png_set_##name##_mod,\
- image_transform_png_set_##name##_add\
-}
-
-/* To save code: */
-static int
-image_transform_default_add(image_transform *this,
- PNG_CONST image_transform **that, png_byte colour_type, png_byte bit_depth)
-{
- UNUSED(colour_type)
- UNUSED(bit_depth)
-
- this->next = *that;
- *that = this;
-
- return 1;
-}
-
-/* png_set_palette_to_rgb */
-static void
-image_transform_png_set_palette_to_rgb_set(PNG_CONST image_transform *this,
- transform_display *that, png_structp pp, png_infop pi)
-{
- png_set_palette_to_rgb(pp);
- this->next->set(this->next, that, pp, pi);
-}
-
-static void
-image_transform_png_set_palette_to_rgb_mod(PNG_CONST image_transform *this,
- image_pixel *that, png_structp pp, PNG_CONST transform_display *display)
-{
- if (that->colour_type == PNG_COLOR_TYPE_PALETTE)
- image_pixel_convert_PLTE(that, &display->this);
-
- this->next->mod(this->next, that, pp, display);
-}
-
-static int
-image_transform_png_set_palette_to_rgb_add(image_transform *this,
- PNG_CONST image_transform **that, png_byte colour_type, png_byte bit_depth)
-{
- UNUSED(bit_depth)
-
- this->next = *that;
- *that = this;
-
- return colour_type == PNG_COLOR_TYPE_PALETTE;
-}
-
-IT(palette_to_rgb, end);
-
-
-/* png_set_tRNS_to_alpha */
-static void
-image_transform_png_set_tRNS_to_alpha_set(PNG_CONST image_transform *this,
- transform_display *that, png_structp pp, png_infop pi)
-{
- png_set_tRNS_to_alpha(pp);
- this->next->set(this->next, that, pp, pi);
-}
-
-static void
-image_transform_png_set_tRNS_to_alpha_mod(PNG_CONST image_transform *this,
- image_pixel *that, png_structp pp, PNG_CONST transform_display *display)
-{
- /* LIBPNG BUG: this always forces palette images to RGB. */
- if (that->colour_type == PNG_COLOR_TYPE_PALETTE)
- image_pixel_convert_PLTE(that, &display->this);
-
- /* This effectively does an 'expand' only if there is some transparency to
- * covert to an alpha channel.
- */
- if (that->have_tRNS)
- image_pixel_add_alpha(that, &display->this);
-
- /* LIBPNG BUG: otherwise libpng still expands to 8 bits! */
- else
- {
- if (that->bit_depth < 8)
- that->bit_depth =8;
- if (that->sample_depth < 8)
- that->sample_depth = 8;
- }
-
- this->next->mod(this->next, that, pp, display);
-}
-
-static int
-image_transform_png_set_tRNS_to_alpha_add(image_transform *this,
- PNG_CONST image_transform **that, png_byte colour_type, png_byte bit_depth)
-{
- UNUSED(bit_depth)
-
- this->next = *that;
- *that = this;
-
- /* We don't know yet whether there will be a tRNS chunk, but we know that
- * this transformation should do nothing if there already is an alpha
- * channel.
- */
- return (colour_type & PNG_COLOR_MASK_ALPHA) == 0;
-}
-
-IT(tRNS_to_alpha,palette_to_rgb);
-
-/* png_set_gray_to_rgb */
-static void
-image_transform_png_set_gray_to_rgb_set(PNG_CONST image_transform *this,
- transform_display *that, png_structp pp, png_infop pi)
-{
- png_set_gray_to_rgb(pp);
- this->next->set(this->next, that, pp, pi);
-}
-
-static void
-image_transform_png_set_gray_to_rgb_mod(PNG_CONST image_transform *this,
- image_pixel *that, png_structp pp, PNG_CONST transform_display *display)
-{
- /* NOTE: we can actually pend the tRNS processing at this point because we
- * can correctly recognize the original pixel value even though we have
- * mapped the one gray channel to the three RGB ones, but in fact libpng
- * doesn't do this, so we don't either.
- */
- if ((that->colour_type & PNG_COLOR_MASK_COLOR) == 0 && that->have_tRNS)
- image_pixel_add_alpha(that, &display->this);
-
- /* Simply expand the bit depth and alter the colour type as required. */
- if (that->colour_type == PNG_COLOR_TYPE_GRAY)
- {
- /* RGB images have a bit depth at least equal to '8' */
- if (that->bit_depth < 8)
- that->sample_depth = that->bit_depth = 8;
-
- /* And just changing the colour type works here because the green and blue
- * channels are being maintained in lock-step with the red/gray:
- */
- that->colour_type = PNG_COLOR_TYPE_RGB;
- }
-
- else if (that->colour_type == PNG_COLOR_TYPE_GRAY_ALPHA)
- that->colour_type = PNG_COLOR_TYPE_RGB_ALPHA;
-
- this->next->mod(this->next, that, pp, display);
-}
-
-static int
-image_transform_png_set_gray_to_rgb_add(image_transform *this,
- PNG_CONST image_transform **that, png_byte colour_type, png_byte bit_depth)
-{
- UNUSED(bit_depth)
-
- this->next = *that;
- *that = this;
-
- return (colour_type & PNG_COLOR_MASK_COLOR) == 0;
-}
-
-IT(gray_to_rgb,tRNS_to_alpha);
-
-/* png_set_expand */
-static void
-image_transform_png_set_expand_set(PNG_CONST image_transform *this,
- transform_display *that, png_structp pp, png_infop pi)
-{
- png_set_expand(pp);
- this->next->set(this->next, that, pp, pi);
-}
-
-static void
-image_transform_png_set_expand_mod(PNG_CONST image_transform *this,
- image_pixel *that, png_structp pp, PNG_CONST transform_display *display)
-{
- /* The general expand case depends on what the colour type is: */
- if (that->colour_type == PNG_COLOR_TYPE_PALETTE)
- image_pixel_convert_PLTE(that, &display->this);
- else if (that->bit_depth < 8) /* grayscale */
- that->sample_depth = that->bit_depth = 8;
-
- if (that->have_tRNS)
- image_pixel_add_alpha(that, &display->this);
-
- this->next->mod(this->next, that, pp, display);
-}
-
-static int
-image_transform_png_set_expand_add(image_transform *this,
- PNG_CONST image_transform **that, png_byte colour_type, png_byte bit_depth)
-{
- UNUSED(bit_depth)
-
- this->next = *that;
- *that = this;
-
- /* 'expand' should do nothing for RGBA or GA input - no tRNS and the bit
- * depth is at least 8 already.
- */
- return (colour_type & PNG_COLOR_MASK_ALPHA) == 0;
-}
-
-IT(expand,gray_to_rgb);
-
-/* png_set_expand_gray_1_2_4_to_8
- * LIBPNG BUG: this just does an 'expand'
- */
-static void
-image_transform_png_set_expand_gray_1_2_4_to_8_set(
- PNG_CONST image_transform *this, transform_display *that, png_structp pp,
- png_infop pi)
-{
- png_set_expand_gray_1_2_4_to_8(pp);
- this->next->set(this->next, that, pp, pi);
-}
-
-static void
-image_transform_png_set_expand_gray_1_2_4_to_8_mod(
- PNG_CONST image_transform *this, image_pixel *that, png_structp pp,
- PNG_CONST transform_display *display)
-{
- image_transform_png_set_expand_mod(this, that, pp, display);
-}
-
-static int
-image_transform_png_set_expand_gray_1_2_4_to_8_add(image_transform *this,
- PNG_CONST image_transform **that, png_byte colour_type, png_byte bit_depth)
-{
- return image_transform_png_set_expand_add(this, that, colour_type,
- bit_depth);
-}
-
-IT(expand_gray_1_2_4_to_8, expand);
-
-/* png_set_strip_16 */
-static void
-image_transform_png_set_strip_16_set(PNG_CONST image_transform *this,
- transform_display *that, png_structp pp, png_infop pi)
-{
- png_set_strip_16(pp);
- this->next->set(this->next, that, pp, pi);
-}
-
-static void
-image_transform_png_set_strip_16_mod(PNG_CONST image_transform *this,
- image_pixel *that, png_structp pp, PNG_CONST transform_display *display)
-{
- if (that->bit_depth == 16)
- {
- that->sample_depth = that->bit_depth = 8;
- if (that->red_sBIT > 8) that->red_sBIT = 8;
- if (that->green_sBIT > 8) that->green_sBIT = 8;
- if (that->blue_sBIT > 8) that->blue_sBIT = 8;
- if (that->alpha_sBIT > 8) that->alpha_sBIT = 8;
-
-# ifndef PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED
- /* The strip 16 algoirithm drops the low 8 bits rather than calculating
- * 1/257, so we need to adjust the permitted errors appropriately:
- */
- {
- PNG_CONST double d = (255-128.5)/65535;
- that->rede += d;
- that->greene += d;
- that->bluee += d;
- that->alphae += d;
- }
-# endif
- }
-
- this->next->mod(this->next, that, pp, display);
-}
-
-static int
-image_transform_png_set_strip_16_add(image_transform *this,
- PNG_CONST image_transform **that, png_byte colour_type, png_byte bit_depth)
-{
- UNUSED(colour_type)
-
- this->next = *that;
- *that = this;
-
- return bit_depth > 8;
-}
-
-IT(strip_16, expand_gray_1_2_4_to_8);
-
-/* png_set_strip_alpha */
-static void
-image_transform_png_set_strip_alpha_set(PNG_CONST image_transform *this,
- transform_display *that, png_structp pp, png_infop pi)
-{
- png_set_strip_alpha(pp);
- this->next->set(this->next, that, pp, pi);
-}
-
-static void
-image_transform_png_set_strip_alpha_mod(PNG_CONST image_transform *this,
- image_pixel *that, png_structp pp, PNG_CONST transform_display *display)
-{
- if (that->colour_type == PNG_COLOR_TYPE_GRAY_ALPHA)
- that->colour_type = PNG_COLOR_TYPE_GRAY;
- else if (that->colour_type == PNG_COLOR_TYPE_RGB_ALPHA)
- that->colour_type = PNG_COLOR_TYPE_RGB;
-
- that->have_tRNS = 0;
- that->alphaf = 1;
- that->alphae = 0;
-
- this->next->mod(this->next, that, pp, display);
-}
-
-static int
-image_transform_png_set_strip_alpha_add(image_transform *this,
- PNG_CONST image_transform **that, png_byte colour_type, png_byte bit_depth)
-{
- UNUSED(bit_depth)
-
- this->next = *that;
- *that = this;
-
- return (colour_type & PNG_COLOR_MASK_ALPHA) != 0;
-}
-
-IT(strip_alpha,strip_16);
-
-/* png_set_rgb_to_gray(png_structp, int err_action, double red, double green)
- * png_set_rgb_to_gray_fixed(png_structp, int err_action, png_fixed_point red,
- * png_fixed_point green)
- * png_get_rgb_to_gray_status
- *
- * At present the APIs are simply tested using the 16.16 fixed point conversion
- * values known to be used inside libpng:
- *
- * red: 6968
- * green: 23434
- * blue: 2366
- *
- * NOTE: this currently ignores the gamma because no gamma is being set, the
- * tests on gamma need to happen in the gamma test set.
- */
-static void
-image_transform_png_set_rgb_to_gray_set(PNG_CONST image_transform *this,
- transform_display *that, png_structp pp, png_infop pi)
-{
- PNG_CONST int error_action = 1; /* no error, no defines in png.h */
-
-# ifdef PNG_FLOATING_POINT_SUPPORTED
- png_set_rgb_to_gray(pp, error_action, -1, -1);
-# else
- png_set_rgb_to_gray_fixed(pp, error_action, -1, -1);
-# endif
-
- this->next->set(this->next, that, pp, pi);
-}
-
-static void
-image_transform_png_set_rgb_to_gray_mod(PNG_CONST image_transform *this,
- image_pixel *that, png_structp pp, PNG_CONST transform_display *display)
-{
- if ((that->colour_type & PNG_COLOR_MASK_COLOR) != 0)
- {
- if (that->colour_type == PNG_COLOR_TYPE_PALETTE)
- image_pixel_convert_PLTE(that, &display->this);
-
- /* Image now has RGB channels... */
- that->bluef = that->greenf = that->redf = (that->redf * 6968 +
- that->greenf * 23434 + that->bluef * 2366) / 32768;
- that->bluee = that->greene = that->rede = (that->rede * 6968 +
- that->greene * 23434 + that->bluee * 2366) / 32768 *
- (1 + DBL_EPSILON * 6);
-
- /* The sBIT is the minium of the three colour channel sBITs. */
- if (that->red_sBIT > that->green_sBIT)
- that->red_sBIT = that->green_sBIT;
- if (that->red_sBIT > that->blue_sBIT)
- that->red_sBIT = that->blue_sBIT;
- that->blue_sBIT = that->green_sBIT = that->red_sBIT;
-
- /* And zap the colour bit in the type: */
- if (that->colour_type == PNG_COLOR_TYPE_RGB)
- that->colour_type = PNG_COLOR_TYPE_GRAY;
- else if (that->colour_type == PNG_COLOR_TYPE_RGB_ALPHA)
- that->colour_type = PNG_COLOR_TYPE_GRAY_ALPHA;
- }
-
- this->next->mod(this->next, that, pp, display);
-}
-
-static int
-image_transform_png_set_rgb_to_gray_add(image_transform *this,
- PNG_CONST image_transform **that, png_byte colour_type, png_byte bit_depth)
-{
- UNUSED(bit_depth)
-
- this->next = *that;
- *that = this;
-
- return (colour_type & PNG_COLOR_MASK_COLOR) != 0;
-}
-
-IT(rgb_to_gray,strip_alpha);
-
-/* png_set_background(png_structp, png_const_color_16p background_color,
- * int background_gamma_code, int need_expand, double background_gamma)
- * png_set_background_fixed(png_structp, png_const_color_16p background_color,
- * int background_gamma_code, int need_expand,
- * png_fixed_point background_gamma)
- *
- * As with rgb_to_gray this ignores the gamma.
-*/
-static void
-image_transform_png_set_background_set(PNG_CONST image_transform *this,
- transform_display *that, png_structp pp, png_infop pi)
-{
- png_color_16 back;
-
- /* Since we don't know the output bit depth at this point we must use the
- * input values and ask libpng to expand the chunk as required.
- */
- back.index = 255; /* Should not be used */
- back.gray = back.blue = back.green = back.red =
- (png_uint_16)((1U << that->this.bit_depth) >> 1);
-
-# ifdef PNG_FLOATING_POINT_SUPPORTED
- png_set_background(pp, &back, PNG_BACKGROUND_GAMMA_FILE, 1, 0);
-# else
- png_set_background_fixed(pp, &back, PNG_BACKGROUND_GAMMA_FILE, 1, 0);
-# endif
-
- this->next->set(this->next, that, pp, pi);
-}
-
-static void
-image_transform_png_set_background_mod(PNG_CONST image_transform *this,
- image_pixel *that, png_structp pp, PNG_CONST transform_display *display)
-{
- /* Check for tRNS first: */
- if (that->have_tRNS && that->colour_type != PNG_COLOR_TYPE_PALETTE)
- image_pixel_add_alpha(that, &display->this);
-
- /* This is only necessary if the alpha value is less than 1. */
- if (that->alphaf < 1)
- {
- /* Repeat the calculation above and scale the result: */
- unsigned int tmp = (1U << display->this.bit_depth);
- double component = (tmp >> 1)/(double)(tmp-1);
-
- /* Now we do the background calculation without any gamma correction. */
- if (that->alphaf <= 0)
- {
- that->bluef = that->greenf = that->redf = component;
- that->bluee = that->greene = that->rede = component * DBL_EPSILON;
- that->blue_sBIT = that->green_sBIT = that->red_sBIT = that->bit_depth;
- }
-
- else
- {
- component *= 1-that->alphaf;
- that->redf = that->redf * that->alphaf + component;
- that->rede = that->rede * that->alphaf + that->redf * 3 * DBL_EPSILON;
- that->greenf = that->greenf * that->alphaf + component;
- that->greene = that->greene * that->alphaf + that->greenf * 3 *
- DBL_EPSILON;
- that->bluef = that->bluef * that->alphaf + component;
- that->bluee = that->bluee * that->alphaf + that->bluef * 3 *
- DBL_EPSILON;
- }
-
- /* Remove the alpha type and set the alpha. */
- that->alphaf = 1;
- that->alphae = 0;
-
- if (that->colour_type == PNG_COLOR_TYPE_RGB_ALPHA)
- that->colour_type = PNG_COLOR_TYPE_RGB;
- else if (that->colour_type == PNG_COLOR_TYPE_GRAY_ALPHA)
- that->colour_type = PNG_COLOR_TYPE_GRAY;
- }
-
- this->next->mod(this->next, that, pp, display);
-}
-
-#define image_transform_png_set_background_add image_transform_default_add
-
-IT(background,rgb_to_gray);
-
-static image_transform *PNG_CONST image_transform_first = &ITSTRUCT(background);
-
-static void
-transform_enable(PNG_CONST char *name)
-{
- /* Everything starts out enabled, so if we see an 'enable' disabled
- * everything else the first time round.
- */
- static int all_disabled = 0;
- int found_it = 0;
- image_transform *list = image_transform_first;
-
- while (list != &image_transform_end)
- {
- if (strcmp(list->name, name) == 0)
- {
- list->enable = 1;
- found_it = 1;
- }
- else if (!all_disabled)
- list->enable = 0;
-
- list = list->list;
- }
-
- all_disabled = 1;
-
- if (!found_it)
- {
- fprintf(stderr, "pngvalid: --transform-enable=%s: unknown transform\n",
- name);
- exit(1);
- }
-}
-
-static void
-transform_disable(PNG_CONST char *name)
-{
- image_transform *list = image_transform_first;
-
- while (list != &image_transform_end)
- {
- if (strcmp(list->name, name) == 0)
- {
- list->enable = 0;
- return;
- }
-
- list = list->list;
- }
-
- fprintf(stderr, "pngvalid: --transform-disable=%s: unknown transform\n",
- name);
- exit(1);
-}
-
-static void
-image_transform_reset_count(void)
-{
- image_transform *next = image_transform_first;
- int count = 0;
-
- while (next != &image_transform_end)
- {
- next->local_use = 0;
- next->next = 0;
- next = next->list;
- ++count;
- }
-
- /* This can only happen if we every have more than 32 transforms (excluding
- * the end) in the list.
- */
- if (count > 32) abort();
-}
-
-static int
-image_transform_test_counter(png_uint_32 counter, unsigned int max)
-{
- /* Test the list to see if there is any point contining, given a current
- * counter and a 'max' value.
- */
- image_transform *next = image_transform_first;
-
- while (next != &image_transform_end)
- {
- /* For max 0 or 1 continue until the counter overflows: */
- counter >>= 1;
-
- /* Continue if any entry hasn't reacked the max. */
- if (max > 1 && next->local_use < max)
- return 1;
- next = next->list;
- }
-
- return max <= 1 && counter == 0;
-}
-
-static png_uint_32
-image_transform_add(PNG_CONST image_transform **this, unsigned int max,
- png_uint_32 counter, char *name, size_t sizeof_name, size_t *pos,
- png_byte colour_type, png_byte bit_depth)
-{
- for (;;) /* until we manage to add something */
- {
- png_uint_32 mask;
- image_transform *list;
-
- /* Find the next counter value, if the counter is zero this is the start
- * of the list. This routine always returns the current counter (not the
- * next) so it returns 0 at the end and expects 0 at the beginning.
- */
- if (counter == 0) /* first time */
- {
- image_transform_reset_count();
- if (max <= 1)
- counter = 1;
- else
- counter = random_32();
- }
- else /* advance the counter */
- {
- switch (max)
- {
- case 0: ++counter; break;
- case 1: counter <<= 1; break;
- default: counter = random_32(); break;
- }
- }
-
- /* Now add all these items, if possible */
- *this = &image_transform_end;
- list = image_transform_first;
- mask = 1;
-
- /* Go through the whole list adding anything that the counter selects: */
- while (list != &image_transform_end)
- {
- if ((counter & mask) != 0 && list->enable &&
- (max == 0 || list->local_use < max))
- {
- /* Candidate to add: */
- if (list->add(list, this, colour_type, bit_depth) || max == 0)
- {
- /* Added, so add to the name too. */
- *pos = safecat(name, sizeof_name, *pos, " +");
- *pos = safecat(name, sizeof_name, *pos, list->name);
- }
-
- else
- {
- /* Not useful and max>0, so remvoe it from *this: */
- *this = list->next;
- list->next = 0;
-
- /* And, since we know it isn't useful, stop it being added again
- * in this run:
- */
- list->local_use = max;
- }
- }
-
- mask <<= 1;
- list = list->list;
- }
-
- /* Now if anything was added we have something to do. */
- if (*this != &image_transform_end)
- return counter;
-
- /* Nothing added, but was there anything in there to add? */
- if (!image_transform_test_counter(counter, max))
- return 0;
- }
-}
-
-#ifdef THIS_IS_THE_PROFORMA
-static void
-image_transform_png_set_@_set(PNG_CONST image_transform *this,
- transform_display *that, png_structp pp, png_infop pi)
-{
- png_set_@(pp);
- this->next->set(this->next, that, pp, pi);
-}
-
-static void
-image_transform_png_set_@_mod(PNG_CONST image_transform *this,
- image_pixel *that, png_structp pp, PNG_CONST transform_display *display)
-{
- this->next->mod(this->next, that, pp, display);
-}
-
-static int
-image_transform_png_set_@_add(image_transform *this,
- PNG_CONST image_transform **that, char *name, size_t sizeof_name,
- size_t *pos, png_byte colour_type, png_byte bit_depth)
-{
- this->next = *that;
- *that = this;
-
- *pos = safecat(name, sizeof_name, *pos, " +@");
-
- return 1;
-}
-
-IT(@);
-#endif
-
-/* png_set_quantize(png_structp, png_colorp palette, int num_palette,
- * int maximum_colors, png_const_uint_16p histogram, int full_quantize)
- *
- * Very difficult to validate this!
- */
-/*NOTE: TBD NYI */
-
-/* The data layout transforms are handled by swapping our own channel data,
- * necessarily these need to happen at the end of the transform list because the
- * semantic of the channels changes after these are executed. Some of these,
- * like set_shift and set_packing, can't be done at present because they change
- * the layout of the data at the sub-sample level so sample() won't get the
- * right answer.
- */
-/* png_set_invert_alpha */
-/*NOTE: TBD NYI */
-
-/* png_set_bgr */
-/*NOTE: TBD NYI */
-
-/* png_set_swap_alpha */
-/*NOTE: TBD NYI */
-
-/* png_set_swap */
-/*NOTE: TBD NYI */
-
-/* png_set_filler, (png_structp png_ptr, png_uint_32 filler, int flags)); */
-/*NOTE: TBD NYI */
-
-/* png_set_add_alpha, (png_structp png_ptr, png_uint_32 filler, int flags)); */
-/*NOTE: TBD NYI */
-
-/* png_set_packing */
-/*NOTE: TBD NYI */
-
-/* png_set_packswap */
-/*NOTE: TBD NYI */
-
-/* png_set_invert_mono */
-/*NOTE: TBD NYI */
-
-/* png_set_shift(png_structp, png_const_color_8p true_bits) */
-/*NOTE: TBD NYI */
-
-static int
-test_transform(png_modifier* PNG_CONST pm, png_byte PNG_CONST colour_type,
- int bdlo, int PNG_CONST bdhi, png_uint_32 max)
-{
- for (; bdlo <= bdhi; ++bdlo)
- {
- PNG_CONST png_byte bit_depth = DEPTH(bdlo);
- png_uint_32 counter = 0;
- size_t base_pos;
- char name[64];
-
- base_pos = safecat(name, sizeof name, 0, "transform:");
-
- for (;;)
- {
- size_t pos = base_pos;
- PNG_CONST image_transform *list = 0;
-
- counter = image_transform_add(&list, max, counter, name, sizeof name,
- &pos, colour_type, bit_depth);
-
- if (counter == 0)
- break;
-
- /* The command line can change this to checking interlaced images. */
- transform_test(pm, FILEID(colour_type, bit_depth, pm->interlace_type,
- 0, 0, 0), list, name);
-
- if (fail(pm))
- return 0;
- }
- }
-
- return 1; /* keep going */
-}
-
-static void
-perform_transform_test(png_modifier *pm)
-{
- /* Test each colour type over the valid range of bit depths (expressed as
- * log2(bit_depth) in turn, stop as soon as any error is detected.
- */
- if (!test_transform(pm, 0, 0, READ_BDHI, 1))
- return;
-
- if (!test_transform(pm, 2, 3, READ_BDHI, 1))
- return;
-
- if (!test_transform(pm, 3, 0, 3, 1))
- return;
-
- if (!test_transform(pm, 4, 3, READ_BDHI, 1))
- return;
-
- if (!test_transform(pm, 6, 3, READ_BDHI, 1))
- return;
-}
-
-
-/********************************* GAMMA TESTS ********************************/
-/* Gamma test images. */
-typedef struct gamma_modification
-{
- png_modification this;
- png_fixed_point gamma;
-} gamma_modification;
-
-static int
-gamma_modify(png_modifier *pm, png_modification *me, int add)
-{
- UNUSED(add)
- /* This simply dumps the given gamma value into the buffer. */
- png_save_uint_32(pm->buffer, 4);
- png_save_uint_32(pm->buffer+4, CHUNK_gAMA);
- png_save_uint_32(pm->buffer+8, ((gamma_modification*)me)->gamma);
- return 1;
-}
-
-static void
-gamma_modification_init(gamma_modification *me, png_modifier *pm, double gammad)
-{
- double g;
-
- modification_init(&me->this);
- me->this.chunk = CHUNK_gAMA;
- me->this.modify_fn = gamma_modify;
- me->this.add = CHUNK_PLTE;
- g = floor(gammad * 100000 + .5);
- me->gamma = (png_fixed_point)g;
- me->this.next = pm->modifications;
- pm->modifications = &me->this;
-}
-
-typedef struct srgb_modification
-{
- png_modification this;
- png_byte intent;
-} srgb_modification;
-
-static int
-srgb_modify(png_modifier *pm, png_modification *me, int add)
-{
- UNUSED(add)
- /* As above, ignore add and just make a new chunk */
- png_save_uint_32(pm->buffer, 1);
- png_save_uint_32(pm->buffer+4, CHUNK_sRGB);
- pm->buffer[8] = ((srgb_modification*)me)->intent;
- return 1;
-}
-
-static void
-srgb_modification_init(srgb_modification *me, png_modifier *pm, png_byte intent)
-{
- modification_init(&me->this);
- me->this.chunk = CHUNK_sBIT;
-
- if (intent <= 3) /* if valid, else *delete* sRGB chunks */
- {
- me->this.modify_fn = srgb_modify;
- me->this.add = CHUNK_PLTE;
- me->intent = intent;
- }
-
- else
- {
- me->this.modify_fn = 0;
- me->this.add = 0;
- me->intent = 0;
- }
-
- me->this.next = pm->modifications;
- pm->modifications = &me->this;
-}
-
-typedef struct sbit_modification
-{
- png_modification this;
- png_byte sbit;
-} sbit_modification;
-
-static int
-sbit_modify(png_modifier *pm, png_modification *me, int add)
-{
- png_byte sbit = ((sbit_modification*)me)->sbit;
- if (pm->bit_depth > sbit)
- {
- int cb = 0;
- switch (pm->colour_type)
- {
- case 0:
- cb = 1;
- break;
-
- case 2:
- case 3:
- cb = 3;
- break;
-
- case 4:
- cb = 2;
- break;
-
- case 6:
- cb = 4;
- break;
-
- default:
- png_error(pm->this.pread,
- "unexpected colour type in sBIT modification");
- }
-
- png_save_uint_32(pm->buffer, cb);
- png_save_uint_32(pm->buffer+4, CHUNK_sBIT);
-
- while (cb > 0)
- (pm->buffer+8)[--cb] = sbit;
-
- return 1;
- }
- else if (!add)
- {
- /* Remove the sBIT chunk */
- pm->buffer_count = pm->buffer_position = 0;
- return 1;
- }
- else
- return 0; /* do nothing */
-}
-
-static void
-sbit_modification_init(sbit_modification *me, png_modifier *pm, png_byte sbit)
-{
- modification_init(&me->this);
- me->this.chunk = CHUNK_sBIT;
- me->this.modify_fn = sbit_modify;
- me->this.add = CHUNK_PLTE;
- me->sbit = sbit;
- me->this.next = pm->modifications;
- pm->modifications = &me->this;
-}
-
-/* Reader callbacks and implementations, where they differ from the standard
- * ones.
- */
-typedef struct gamma_display
-{
- standard_display this;
-
- /* Parameters */
- png_modifier* pm;
- double file_gamma;
- double screen_gamma;
- png_byte sbit;
- int threshold_test;
- PNG_CONST char* name;
- int speed;
- int use_input_precision;
- int strip16;
-
- /* Local variables */
- double maxerrout;
- double maxerrpc;
- double maxerrabs;
-} gamma_display;
-
-static void
-gamma_display_init(gamma_display *dp, png_modifier *pm, png_uint_32 id,
- double file_gamma, double screen_gamma, png_byte sbit, int threshold_test,
- int speed, int use_input_precision, int strip16)
-{
- /* Standard fields */
- standard_display_init(&dp->this, &pm->this, id, 0/*do_interlace*/);
-
- /* Parameter fields */
- dp->pm = pm;
- dp->file_gamma = file_gamma;
- dp->screen_gamma = screen_gamma;
- dp->sbit = sbit;
- dp->threshold_test = threshold_test;
- dp->speed = speed;
- dp->use_input_precision = use_input_precision;
- dp->strip16 = strip16;
-
- /* Local variable fields */
- dp->maxerrout = dp->maxerrpc = dp->maxerrabs = 0;
-}
-
-static void
-gamma_info_imp(gamma_display *dp, png_structp pp, png_infop pi)
-{
- /* Reuse the standard stuff as appropriate. */
- standard_info_part1(&dp->this, pp, pi);
-
- /* If requested strip 16 to 8 bits - this is handled automagically below
- * because the output bit depth is read from the library. Note that there
- * are interactions with sBIT but, internally, libpng makes sbit at most
- * PNG_MAX_GAMMA_8 when doing the following.
- */
- if (dp->strip16)
-# ifdef PNG_READ_16_TO_8_SUPPORTED
- png_set_strip_16(pp);
-# else
- png_error(pp, "strip16 (16 to 8 bit conversion) not supported");
-# endif
-
- png_read_update_info(pp, pi);
-
- /* Now we may get a different cbRow: */
- standard_info_part2(&dp->this, pp, pi, 1 /*images*/);
-}
-
-static void
-gamma_info(png_structp pp, png_infop pi)
-{
- gamma_info_imp(png_get_progressive_ptr(pp), pp, pi);
-}
-
-static void
-gamma_image_validate(gamma_display *dp, png_structp pp, png_infop pi,
- png_const_bytep pRow)
-{
- /* Get some constants derived from the input and output file formats: */
- PNG_CONST png_byte sbit = dp->sbit;
- PNG_CONST double file_gamma = dp->file_gamma;
- PNG_CONST double screen_gamma = dp->screen_gamma;
- PNG_CONST int use_input_precision = dp->use_input_precision;
- PNG_CONST int speed = dp->speed;
- PNG_CONST png_byte in_ct = dp->this.colour_type;
- PNG_CONST png_byte in_bd = dp->this.bit_depth;
- PNG_CONST png_uint_32 w = dp->this.w;
- PNG_CONST png_uint_32 h = dp->this.h;
- PNG_CONST size_t cbRow = dp->this.cbRow;
- PNG_CONST png_byte out_ct = png_get_color_type(pp, pi);
- PNG_CONST png_byte out_bd = png_get_bit_depth(pp, pi);
- PNG_CONST unsigned int outmax = (1U<<out_bd)-1;
- PNG_CONST double maxabs = abserr(dp->pm, out_bd);
- PNG_CONST double maxout = outerr(dp->pm, out_bd);
- PNG_CONST double maxpc = pcerr(dp->pm, out_bd);
-
- /* There are three sources of error, firstly the quantization in the
- * file encoding, determined by sbit and/or the file depth, secondly
- * the output (screen) gamma and thirdly the output file encoding.
- *
- * Since this API receives the screen and file gamma in double
- * precision it is possible to calculate an exact answer given an input
- * pixel value. Therefore we assume that the *input* value is exact -
- * sample/maxsample - calculate the corresponding gamma corrected
- * output to the limits of double precision arithmetic and compare with
- * what libpng returns.
- *
- * Since the library must quantize the output to 8 or 16 bits there is
- * a fundamental limit on the accuracy of the output of +/-.5 - this
- * quantization limit is included in addition to the other limits
- * specified by the paramaters to the API. (Effectively, add .5
- * everywhere.)
- *
- * The behavior of the 'sbit' paramter is defined by section 12.5
- * (sample depth scaling) of the PNG spec. That section forces the
- * decoder to assume that the PNG values have been scaled if sBIT is
- * present:
- *
- * png-sample = floor( input-sample * (max-out/max-in) + .5);
- *
- * This means that only a subset of the possible PNG values should
- * appear in the input. However, the spec allows the encoder to use a
- * variety of approximations to the above and doesn't require any
- * restriction of the values produced.
- *
- * Nevertheless the spec requires that the upper 'sBIT' bits of the
- * value stored in a PNG file be the original sample bits.
- * Consequently the code below simply scales the top sbit bits by
- * (1<<sbit)-1 to obtain an original sample value.
- *
- * Because there is limited precision in the input it is arguable that
- * an acceptable result is any valid result from input-.5 to input+.5.
- * The basic tests below do not do this, however if
- * 'use_input_precision' is set a subsequent test is performed below.
- */
- PNG_CONST int processing = (fabs(screen_gamma*file_gamma-1) >=
- PNG_GAMMA_THRESHOLD && !dp->threshold_test && !speed && in_ct != 3) ||
- in_bd != out_bd;
-
- PNG_CONST unsigned int samples_per_pixel = (out_ct & 2U) ? 3U : 1U;
-
- PNG_CONST double gamma_correction = 1/(file_gamma*screen_gamma);/* Overall */
-
- double maxerrout = 0, maxerrabs = 0, maxerrpc = 0;
- png_uint_32 y;
-
- for (y=0; y<h; ++y, pRow += cbRow)
- {
- unsigned int s, x;
- png_byte std[STANDARD_ROWMAX];
-
- transform_row(pp, std, in_ct, in_bd, y);
-
- if (processing)
- {
- for (x=0; x<w; ++x) for (s=0; s<samples_per_pixel; ++s)
- {
- /* Input sample values: */
- PNG_CONST unsigned int
- id = sample(std, in_ct, in_bd, x, s);
-
- PNG_CONST unsigned int
- od = sample(pRow, out_ct, out_bd, x, s);
-
- PNG_CONST unsigned int
- isbit = id >> (in_bd-sbit);
-
- double i, input_sample, encoded_sample, output;
- double encoded_error, error;
- double es_lo, es_hi;
-
- /* First check on the 'perfect' result obtained from the
- * digitized input value, id, and compare this against the
- * actual digitized result, 'od'. 'i' is the input result
- * in the range 0..1:
- *
- * NOTE: sBIT should be taken into account here but isn't,
- * as described above.
- */
- i = isbit; i /= (1U<<sbit)-1;
-
- /* Then get the gamma corrected version of 'i' and compare
- * to 'od', any error less than .5 is insignificant - just
- * quantization of the output value to the nearest digital
- * value (nevertheless the error is still recorded - it's
- * interesting ;-)
- */
- encoded_sample = pow(i, gamma_correction) * outmax;
- encoded_error = fabs(od-encoded_sample);
-
- if (encoded_error > maxerrout)
- maxerrout = encoded_error;
-
- if (encoded_error < .5+maxout)
- continue;
-
- /* There may be an error, so calculate the actual sample
- * values - unencoded light intensity values. Note that
- * in practice these are not unencoded because they
- * include a 'viewing correction' to decrease or
- * (normally) increase the perceptual contrast of the
- * image. There's nothing we can do about this - we don't
- * know what it is - so assume the unencoded value is
- * perceptually linear.
- */
- input_sample = pow(i, 1/file_gamma); /* In range 0..1 */
- output = od;
- output /= outmax;
- output = pow(output, screen_gamma);
-
- /* Now we have the numbers for real errors, both absolute
- * values as as a percentage of the correct value (output):
- */
- error = fabs(input_sample-output);
-
- if (error > maxerrabs)
- maxerrabs = error;
-
- /* The following is an attempt to ignore the tendency of
- * quantization to dominate the percentage errors for low
- * output sample values:
- */
- if (input_sample*maxpc > .5+maxabs)
- {
- double percentage_error = error/input_sample;
- if (percentage_error > maxerrpc) maxerrpc = percentage_error;
- }
-
- /* Now calculate the digitization limits for
- * 'encoded_sample' using the 'max' values. Note that
- * maxout is in the encoded space but maxpc and maxabs are
- * in linear light space.
- *
- * First find the maximum error in linear light space,
- * range 0..1:
- */
- {
- double tmp = input_sample * maxpc;
- if (tmp < maxabs) tmp = maxabs;
-
- /* Low bound - the minimum of the three: */
- es_lo = encoded_sample - maxout;
-
- if (es_lo > 0 && input_sample-tmp > 0)
- {
- double low_value = outmax * pow(input_sample-tmp,
- 1/screen_gamma);
- if (low_value < es_lo) es_lo = low_value;
- }
-
- else
- es_lo = 0;
-
- es_hi = encoded_sample + maxout;
-
- if (es_hi < outmax && input_sample+tmp < 1)
- {
- double high_value = outmax * pow(input_sample+tmp,
- 1/screen_gamma);
- if (high_value > es_hi) es_hi = high_value;
- }
-
- else
- es_hi = outmax;
- }
-
- /* The primary test is that the final encoded value
- * returned by the library should be between the two limits
- * (inclusive) that were calculated above. At this point
- * quantization of the output must be taken into account.
- */
- if (od+.5 < es_lo || od-.5 > es_hi)
- {
- /* There has been an error in processing. */
- double is_lo, is_hi;
-
- if (use_input_precision)
- {
- /* Ok, something is wrong - this actually happens in
- * current libpng sbit processing. Assume that the
- * input value (id, adjusted for sbit) can be
- * anywhere between value-.5 and value+.5 - quite a
- * large range if sbit is low.
- */
- double tmp = (isbit - .5)/((1U<<sbit)-1);
-
- if (tmp > 0)
- {
- is_lo = outmax * pow(tmp, gamma_correction) - maxout;
- if (is_lo < 0) is_lo = 0;
- }
-
- else
- is_lo = 0;
-
- tmp = (isbit + .5)/((1U<<sbit)-1);
-
- if (tmp < 1)
- {
- is_hi = outmax * pow(tmp, gamma_correction) + maxout;
- if (is_hi > outmax) is_hi = outmax;
- }
-
- else
- is_hi = outmax;
-
- if (!(od+.5 < is_lo || od-.5 > is_hi))
- continue;
- }
- else
- is_lo = es_lo, is_hi = es_hi;
-
- {
- char msg[256];
-
- sprintf(msg,
- "error: %.3f; %u{%u;%u} -> %u not %.2f (%.1f-%.1f)",
- od-encoded_sample, id, sbit, isbit, od,
- encoded_sample, is_lo, is_hi);
-
- png_warning(pp, msg);
- }
- }
- }
- }
-
- else if (!speed && memcmp(std, pRow, cbRow) != 0)
- {
- char msg[64];
-
- /* No transform is expected on the threshold tests. */
- sprintf(msg, "gamma: below threshold row %d changed", y);
-
- png_error(pp, msg);
- }
- } /* row (y) loop */
-
- dp->maxerrout = maxerrout;
- dp->maxerrabs = maxerrabs;
- dp->maxerrpc = maxerrpc;
- dp->this.ps->validated = 1;
-}
-
-static void
-gamma_end(png_structp pp, png_infop pi)
-{
- gamma_display *dp = png_get_progressive_ptr(pp);
-
- gamma_image_validate(dp, pp, pi, dp->this.ps->image);
-}
-
-/* A single test run checking a gamma transformation.
- *
- * maxabs: maximum absolute error as a fraction
- * maxout: maximum output error in the output units
- * maxpc: maximum percentage error (as a percentage)
- */
-static void
-gamma_test(png_modifier *pmIn, PNG_CONST png_byte colour_typeIn,
- PNG_CONST png_byte bit_depthIn, PNG_CONST int interlace_typeIn,
- PNG_CONST double file_gammaIn, PNG_CONST double screen_gammaIn,
- PNG_CONST png_byte sbitIn, PNG_CONST int threshold_testIn,
- PNG_CONST char *name, PNG_CONST int speedIn,
- PNG_CONST int use_input_precisionIn, PNG_CONST int strip16In)
-{
- gamma_display d;
- context(&pmIn->this, fault);
-
- gamma_display_init(&d, pmIn, FILEID(colour_typeIn, bit_depthIn,
- interlace_typeIn, 0, 0, 0), file_gammaIn, screen_gammaIn, sbitIn,
- threshold_testIn, speedIn, use_input_precisionIn, strip16In);
-
- Try
- {
- png_structp pp;
- png_infop pi;
- gamma_modification gamma_mod;
- srgb_modification srgb_mod;
- sbit_modification sbit_mod;
-
- /* Make an appropriate modifier to set the PNG file gamma to the
- * given gamma value and the sBIT chunk to the given precision.
- */
- d.pm->modifications = NULL;
- gamma_modification_init(&gamma_mod, d.pm, d.file_gamma);
- srgb_modification_init(&srgb_mod, d.pm, 127 /*delete*/);
- sbit_modification_init(&sbit_mod, d.pm, d.sbit);
-
- modification_reset(d.pm->modifications);
-
- /* Get a png_struct for writing the image. */
- pp = set_modifier_for_read(d.pm, &pi, d.this.id, name);
-
- /* Set up gamma processing. */
-#ifdef PNG_FLOATING_POINT_SUPPORTED
- png_set_gamma(pp, d.screen_gamma, d.file_gamma);
-#else
- {
- png_fixed_point s = floor(d.screen_gamma*100000+.5);
- png_fixed_point f = floor(d.file_gamma*100000+.5);
- png_set_gamma_fixed(pp, s, f);
- }
-#endif
-
- /* Introduce the correct read function. */
- if (d.pm->this.progressive)
- {
- /* Share the row function with the standard implementation. */
- png_set_progressive_read_fn(pp, &d, gamma_info, progressive_row,
- gamma_end);
-
- /* Now feed data into the reader until we reach the end: */
- modifier_progressive_read(d.pm, pp, pi);
- }
- else
- {
- /* modifier_read expects a png_modifier* */
- png_set_read_fn(pp, d.pm, modifier_read);
-
- /* Check the header values: */
- png_read_info(pp, pi);
-
- /* Process the 'info' requirements. Only one image is generated */
- gamma_info_imp(&d, pp, pi);
-
- sequential_row(&d.this, pp, pi, NULL, d.this.ps->image);
-
- gamma_image_validate(&d, pp, pi, d.this.ps->image);
- }
-
- modifier_reset(d.pm);
-
- if (d.pm->log && !d.threshold_test && !d.speed)
- fprintf(stderr, "%d bit %s %s: max error %f (%.2g, %2g%%)\n",
- d.this.bit_depth, colour_types[d.this.colour_type], d.name,
- d.maxerrout, d.maxerrabs, 100*d.maxerrpc);
-
- /* Log the summary values too. */
- if (d.this.colour_type == 0 || d.this.colour_type == 4)
- {
- switch (d.this.bit_depth)
- {
- case 1:
- break;
-
- case 2:
- if (d.maxerrout > d.pm->error_gray_2)
- d.pm->error_gray_2 = d.maxerrout;
-
- break;
-
- case 4:
- if (d.maxerrout > d.pm->error_gray_4)
- d.pm->error_gray_4 = d.maxerrout;
-
- break;
-
- case 8:
- if (d.maxerrout > d.pm->error_gray_8)
- d.pm->error_gray_8 = d.maxerrout;
-
- break;
-
- case 16:
- if (d.maxerrout > d.pm->error_gray_16)
- d.pm->error_gray_16 = d.maxerrout;
-
- break;
-
- default:
- png_error(pp, "bad bit depth (internal: 1)");
- }
- }
-
- else if (d.this.colour_type == 2 || d.this.colour_type == 6)
- {
- switch (d.this.bit_depth)
- {
- case 8:
-
- if (d.maxerrout > d.pm->error_color_8)
- d.pm->error_color_8 = d.maxerrout;
-
- break;
-
- case 16:
-
- if (d.maxerrout > d.pm->error_color_16)
- d.pm->error_color_16 = d.maxerrout;
-
- break;
-
- default:
- png_error(pp, "bad bit depth (internal: 2)");
- }
- }
- }
-
- Catch(fault)
- modifier_reset((png_modifier*)fault);
-}
-
-static void gamma_threshold_test(png_modifier *pm, png_byte colour_type,
- png_byte bit_depth, int interlace_type, double file_gamma,
- double screen_gamma)
-{
- size_t pos = 0;
- char name[64];
- pos = safecat(name, sizeof name, pos, "threshold ");
- pos = safecatd(name, sizeof name, pos, file_gamma, 3);
- pos = safecat(name, sizeof name, pos, "/");
- pos = safecatd(name, sizeof name, pos, screen_gamma, 3);
-
- (void)gamma_test(pm, colour_type, bit_depth, interlace_type, file_gamma,
- screen_gamma, bit_depth, 1, name, 0 /*speed*/, 0 /*no input precision*/,
- 0 /*no strip16*/);
-}
-
-static void
-perform_gamma_threshold_tests(png_modifier *pm)
-{
- png_byte colour_type = 0;
- png_byte bit_depth = 0;
-
- while (next_format(&colour_type, &bit_depth))
- {
- double test_gamma = 1.0;
- while (test_gamma >= .4)
- {
- /* There's little point testing the interlacing vs non-interlacing,
- * but this can be set from the command line.
- */
- gamma_threshold_test(pm, colour_type, bit_depth, pm->interlace_type,
- test_gamma, 1/test_gamma);
- test_gamma *= .95;
- }
-
- /* And a special test for sRGB */
- gamma_threshold_test(pm, colour_type, bit_depth, pm->interlace_type,
- .45455, 2.2);
-
- if (fail(pm))
- return;
- }
-}
-
-static void gamma_transform_test(png_modifier *pm,
- PNG_CONST png_byte colour_type, PNG_CONST png_byte bit_depth,
- PNG_CONST int interlace_type, PNG_CONST double file_gamma,
- PNG_CONST double screen_gamma, PNG_CONST png_byte sbit, PNG_CONST int speed,
- PNG_CONST int use_input_precision, PNG_CONST int strip16)
-{
- size_t pos = 0;
- char name[64];
-
- if (sbit != bit_depth)
- {
- pos = safecat(name, sizeof name, pos, "sbit(");
- pos = safecatn(name, sizeof name, pos, sbit);
- pos = safecat(name, sizeof name, pos, ") ");
- }
-
- else
- pos = safecat(name, sizeof name, pos, "gamma ");
-
- if (strip16)
- pos = safecat(name, sizeof name, pos, "16to8 ");
-
- pos = safecatd(name, sizeof name, pos, file_gamma, 3);
- pos = safecat(name, sizeof name, pos, "->");
- pos = safecatd(name, sizeof name, pos, screen_gamma, 3);
-
- gamma_test(pm, colour_type, bit_depth, interlace_type, file_gamma,
- screen_gamma, sbit, 0, name, speed, use_input_precision, strip16);
-}
-
-static void perform_gamma_transform_tests(png_modifier *pm, int speed)
-{
- png_byte colour_type = 0;
- png_byte bit_depth = 0;
-
- /* Ignore palette images - the gamma correction happens on the palette entry,
- * haven't got the tests for this yet.
- */
- while (next_format(&colour_type, &bit_depth)) if (colour_type != 3)
- {
- unsigned int i, j;
-
- for (i=0; i<pm->ngammas; ++i) for (j=0; j<pm->ngammas; ++j) if (i != j)
- {
- gamma_transform_test(pm, colour_type, bit_depth, pm->interlace_type,
- 1/pm->gammas[i], pm->gammas[j], bit_depth, speed,
- pm->use_input_precision, 0 /*do not strip16*/);
-
- if (fail(pm))
- return;
- }
- }
-}
-
-static void perform_gamma_sbit_tests(png_modifier *pm, int speed)
-{
- png_byte sbit;
-
- /* The only interesting cases are colour and grayscale, alpha is ignored here
- * for overall speed. Only bit depths 8 and 16 are tested.
- */
- for (sbit=pm->sbitlow; sbit<(1<<READ_BDHI); ++sbit)
- {
- unsigned int i, j;
-
- for (i=0; i<pm->ngammas; ++i)
- {
- for (j=0; j<pm->ngammas; ++j)
- {
- if (i != j)
- {
- if (sbit < 8)
- {
- gamma_transform_test(pm, 0, 8, pm->interlace_type,
- 1/pm->gammas[i], pm->gammas[j], sbit, speed,
- pm->use_input_precision_sbit, 0 /*strip16*/);
-
- if (fail(pm))
- return;
-
- gamma_transform_test(pm, 2, 8, pm->interlace_type,
- 1/pm->gammas[i], pm->gammas[j], sbit, speed,
- pm->use_input_precision_sbit, 0 /*strip16*/);
-
- if (fail(pm))
- return;
- }
-
-#ifdef DO_16BIT
- gamma_transform_test(pm, 0, 16, pm->interlace_type,
- 1/pm->gammas[i], pm->gammas[j], sbit, speed,
- pm->use_input_precision_sbit, 0 /*strip16*/);
-
- if (fail(pm))
- return;
-
- gamma_transform_test(pm, 2, 16, pm->interlace_type,
- 1/pm->gammas[i], pm->gammas[j], sbit, speed,
- pm->use_input_precision_sbit, 0 /*strip16*/);
-
- if (fail(pm))
- return;
-#endif
- }
- }
- }
- }
-}
-
-/* Note that this requires a 16 bit source image but produces 8 bit output, so
- * we only need the 16bit write support.
- */
-#ifdef PNG_READ_16_TO_8_SUPPORTED
-static void perform_gamma_strip16_tests(png_modifier *pm, int speed)
-{
-# ifndef PNG_MAX_GAMMA_8
-# define PNG_MAX_GAMMA_8 11
-# endif
- /* Include the alpha cases here. Note that sbit matches the internal value
- * used by the library - otherwise we will get spurious errors from the
- * internal sbit style approximation.
- *
- * The threshold test is here because otherwise the 16 to 8 conversion will
- * proceed *without* gamma correction, and the tests above will fail (but not
- * by much) - this could be fixed, it only appears with the -g option.
- */
- unsigned int i, j;
- for (i=0; i<pm->ngammas; ++i)
- {
- for (j=0; j<pm->ngammas; ++j)
- {
- if (i != j &&
- fabs(pm->gammas[j]/pm->gammas[i]-1) >= PNG_GAMMA_THRESHOLD)
- {
- gamma_transform_test(pm, 0, 16, pm->interlace_type, 1/pm->gammas[i],
- pm->gammas[j], PNG_MAX_GAMMA_8, speed,
- pm->use_input_precision_16to8, 1 /*strip16*/);
-
- if (fail(pm))
- return;
-
- gamma_transform_test(pm, 2, 16, pm->interlace_type, 1/pm->gammas[i],
- pm->gammas[j], PNG_MAX_GAMMA_8, speed,
- pm->use_input_precision_16to8, 1 /*strip16*/);
-
- if (fail(pm))
- return;
-
- gamma_transform_test(pm, 4, 16, pm->interlace_type, 1/pm->gammas[i],
- pm->gammas[j], PNG_MAX_GAMMA_8, speed,
- pm->use_input_precision_16to8, 1 /*strip16*/);
-
- if (fail(pm))
- return;
-
- gamma_transform_test(pm, 6, 16, pm->interlace_type, 1/pm->gammas[i],
- pm->gammas[j], PNG_MAX_GAMMA_8, speed,
- pm->use_input_precision_16to8, 1 /*strip16*/);
-
- if (fail(pm))
- return;
- }
- }
- }
-}
-#endif /* 16 to 8 bit conversion */
-
-static void
-perform_gamma_test(png_modifier *pm, int speed, int summary)
-{
- /* First some arbitrary no-transform tests: */
- if (!speed && pm->test_gamma_threshold)
- {
- perform_gamma_threshold_tests(pm);
-
- if (fail(pm))
- return;
- }
-
- /* Now some real transforms. */
- if (pm->test_gamma_transform)
- {
- perform_gamma_transform_tests(pm, speed);
-
- if (summary)
- {
- printf("Gamma correction error summary\n\n");
- printf("The printed value is the maximum error in the pixel values\n");
- printf("calculated by the libpng gamma correction code. The error\n");
- printf("is calculated as the difference between the output pixel\n");
- printf("value (always an integer) and the ideal value from the\n");
- printf("libpng specification (typically not an integer).\n\n");
-
- printf("Expect this value to be less than .5 for 8 bit formats,\n");
- printf("less than 1 for formats with fewer than 8 bits and a small\n");
- printf("number (typically less than 5) for the 16 bit formats.\n");
- printf("For performance reasons the value for 16 bit formats\n");
- printf("increases when the image file includes an sBIT chunk.\n\n");
-
- printf(" 2 bit gray: %.5f\n", pm->error_gray_2);
- printf(" 4 bit gray: %.5f\n", pm->error_gray_4);
- printf(" 8 bit gray: %.5f\n", pm->error_gray_8);
- printf(" 8 bit color: %.5f\n", pm->error_color_8);
-#ifdef DO_16BIT
- printf(" 16 bit gray: %.5f\n", pm->error_gray_16);
- printf(" 16 bit color: %.5f\n", pm->error_color_16);
-#endif
- }
- }
-
- /* The sbit tests produce much larger errors: */
- if (pm->test_gamma_sbit)
- {
- pm->error_gray_2 = pm->error_gray_4 = pm->error_gray_8 =
- pm->error_gray_16 = pm->error_color_8 = pm->error_color_16 = 0;
- perform_gamma_sbit_tests(pm, speed);
-
- if (summary)
- {
- printf("Gamma correction with sBIT:\n");
-
- if (pm->sbitlow < 8U)
- {
- printf(" 2 bit gray: %.5f\n", pm->error_gray_2);
- printf(" 4 bit gray: %.5f\n", pm->error_gray_4);
- printf(" 8 bit gray: %.5f\n", pm->error_gray_8);
- printf(" 8 bit color: %.5f\n", pm->error_color_8);
- }
-
- #ifdef DO_16BIT
- printf(" 16 bit gray: %.5f\n", pm->error_gray_16);
- printf(" 16 bit color: %.5f\n", pm->error_color_16);
- #endif
- }
- }
-
-#ifdef PNG_READ_16_TO_8_SUPPORTED
- if (pm->test_gamma_strip16)
- {
- /* The 16 to 8 bit strip operations: */
- pm->error_gray_2 = pm->error_gray_4 = pm->error_gray_8 =
- pm->error_gray_16 = pm->error_color_8 = pm->error_color_16 = 0;
- perform_gamma_strip16_tests(pm, speed);
-
- if (summary)
- {
- printf("Gamma correction with 16 to 8 bit reduction:\n");
- printf(" 16 bit gray: %.5f\n", pm->error_gray_16);
- printf(" 16 bit color: %.5f\n", pm->error_color_16);
- }
- }
-#endif
-}
-
-/* INTERLACE MACRO VALIDATION */
-/* This is copied verbatim from the specification, it is simply the pass
- * number in which each pixel in each 8x8 tile appears. The array must
- * be indexed adam7[y][x] and notice that the pass numbers are based at
- * 1, not 0 - the base libpng uses.
- */
-static PNG_CONST
-png_byte adam7[8][8] =
-{
- { 1,6,4,6,2,6,4,6 },
- { 7,7,7,7,7,7,7,7 },
- { 5,6,5,6,5,6,5,6 },
- { 7,7,7,7,7,7,7,7 },
- { 3,6,4,6,3,6,4,6 },
- { 7,7,7,7,7,7,7,7 },
- { 5,6,5,6,5,6,5,6 },
- { 7,7,7,7,7,7,7,7 }
-};
-
-/* This routine validates all the interlace support macros in png.h for
- * a variety of valid PNG widths and heights. It uses a number of similarly
- * named internal routines that feed off the above array.
- */
-static png_uint_32
-png_pass_start_row(int pass)
-{
- int x, y;
- ++pass;
- for (y=0; y<8; ++y) for (x=0; x<8; ++x) if (adam7[y][x] == pass)
- return y;
- return 0xf;
-}
-
-static png_uint_32
-png_pass_start_col(int pass)
-{
- int x, y;
- ++pass;
- for (x=0; x<8; ++x) for (y=0; y<8; ++y) if (adam7[y][x] == pass)
- return x;
- return 0xf;
-}
-
-static int
-png_pass_row_shift(int pass)
-{
- int x, y, base=(-1), inc=8;
- ++pass;
- for (y=0; y<8; ++y) for (x=0; x<8; ++x) if (adam7[y][x] == pass)
- {
- if (base == (-1))
- base = y;
- else if (base == y)
- {}
- else if (inc == y-base)
- base=y;
- else if (inc == 8)
- inc = y-base, base=y;
- else if (inc != y-base)
- return 0xff; /* error - more than one 'inc' value! */
- }
-
- if (base == (-1)) return 0xfe; /* error - no row in pass! */
-
- /* The shift is always 1, 2 or 3 - no pass has all the rows! */
- switch (inc)
- {
-case 2: return 1;
-case 4: return 2;
-case 8: return 3;
-default: break;
- }
-
- /* error - unrecognized 'inc' */
- return (inc << 8) + 0xfd;
-}
-
-static int
-png_pass_col_shift(int pass)
-{
- int x, y, base=(-1), inc=8;
- ++pass;
- for (x=0; x<8; ++x) for (y=0; y<8; ++y) if (adam7[y][x] == pass)
- {
- if (base == (-1))
- base = x;
- else if (base == x)
- {}
- else if (inc == x-base)
- base=x;
- else if (inc == 8)
- inc = x-base, base=x;
- else if (inc != x-base)
- return 0xff; /* error - more than one 'inc' value! */
- }
-
- if (base == (-1)) return 0xfe; /* error - no row in pass! */
-
- /* The shift is always 1, 2 or 3 - no pass has all the rows! */
- switch (inc)
- {
-case 1: return 0; /* pass 7 has all the columns */
-case 2: return 1;
-case 4: return 2;
-case 8: return 3;
-default: break;
- }
-
- /* error - unrecognized 'inc' */
- return (inc << 8) + 0xfd;
-}
-
-static png_uint_32
-png_row_from_pass_row(png_uint_32 yIn, int pass)
-{
- /* By examination of the array: */
- switch (pass)
- {
-case 0: return yIn * 8;
-case 1: return yIn * 8;
-case 2: return yIn * 8 + 4;
-case 3: return yIn * 4;
-case 4: return yIn * 4 + 2;
-case 5: return yIn * 2;
-case 6: return yIn * 2 + 1;
-default: break;
- }
-
- return 0xff; /* bad pass number */
-}
-
-static png_uint_32
-png_col_from_pass_col(png_uint_32 xIn, int pass)
-{
- /* By examination of the array: */
- switch (pass)
- {
-case 0: return xIn * 8;
-case 1: return xIn * 8 + 4;
-case 2: return xIn * 4;
-case 3: return xIn * 4 + 2;
-case 4: return xIn * 2;
-case 5: return xIn * 2 + 1;
-case 6: return xIn;
-default: break;
- }
-
- return 0xff; /* bad pass number */
-}
-
-static int
-png_row_in_interlace_pass(png_uint_32 y, int pass)
-{
- /* Is row 'y' in pass 'pass'? */
- int x;
- y &= 7;
- ++pass;
- for (x=0; x<8; ++x) if (adam7[y][x] == pass)
- return 1;
-
- return 0;
-}
-
-static int
-png_col_in_interlace_pass(png_uint_32 x, int pass)
-{
- /* Is column 'x' in pass 'pass'? */
- int y;
- x &= 7;
- ++pass;
- for (y=0; y<8; ++y) if (adam7[y][x] == pass)
- return 1;
-
- return 0;
-}
-
-static png_uint_32
-png_pass_rows(png_uint_32 height, int pass)
-{
- png_uint_32 tiles = height>>3;
- png_uint_32 rows = 0;
- unsigned int x, y;
-
- height &= 7;
- ++pass;
- for (y=0; y<8; ++y) for (x=0; x<8; ++x) if (adam7[y][x] == pass)
- {
- rows += tiles;
- if (y < height) ++rows;
- break; /* i.e. break the 'x', column, loop. */
- }
-
- return rows;
-}
-
-static png_uint_32
-png_pass_cols(png_uint_32 width, int pass)
-{
- png_uint_32 tiles = width>>3;
- png_uint_32 cols = 0;
- unsigned int x, y;
-
- width &= 7;
- ++pass;
- for (x=0; x<8; ++x) for (y=0; y<8; ++y) if (adam7[y][x] == pass)
- {
- cols += tiles;
- if (x < width) ++cols;
- break; /* i.e. break the 'y', row, loop. */
- }
-
- return cols;
-}
-
-static void
-perform_interlace_macro_validation(void)
-{
- /* The macros to validate, first those that depend only on pass:
- *
- * PNG_PASS_START_ROW(pass)
- * PNG_PASS_START_COL(pass)
- * PNG_PASS_ROW_SHIFT(pass)
- * PNG_PASS_COL_SHIFT(pass)
- */
- int pass;
-
- for (pass=0; pass<7; ++pass)
- {
- png_uint_32 m, f, v;
-
- m = PNG_PASS_START_ROW(pass);
- f = png_pass_start_row(pass);
- if (m != f)
- {
- fprintf(stderr, "PNG_PASS_START_ROW(%d) = %u != %x\n", pass, m, f);
- exit(1);
- }
-
- m = PNG_PASS_START_COL(pass);
- f = png_pass_start_col(pass);
- if (m != f)
- {
- fprintf(stderr, "PNG_PASS_START_COL(%d) = %u != %x\n", pass, m, f);
- exit(1);
- }
-
- m = PNG_PASS_ROW_SHIFT(pass);
- f = png_pass_row_shift(pass);
- if (m != f)
- {
- fprintf(stderr, "PNG_PASS_ROW_SHIFT(%d) = %u != %x\n", pass, m, f);
- exit(1);
- }
-
- m = PNG_PASS_COL_SHIFT(pass);
- f = png_pass_col_shift(pass);
- if (m != f)
- {
- fprintf(stderr, "PNG_PASS_COL_SHIFT(%d) = %u != %x\n", pass, m, f);
- exit(1);
- }
-
- /* Macros that depend on the image or sub-image height too:
- *
- * PNG_PASS_ROWS(height, pass)
- * PNG_PASS_COLS(width, pass)
- * PNG_ROW_FROM_PASS_ROW(yIn, pass)
- * PNG_COL_FROM_PASS_COL(xIn, pass)
- * PNG_ROW_IN_INTERLACE_PASS(y, pass)
- * PNG_COL_IN_INTERLACE_PASS(x, pass)
- */
- for (v=0;;)
- {
- /* First the base 0 stuff: */
- m = PNG_ROW_FROM_PASS_ROW(v, pass);
- f = png_row_from_pass_row(v, pass);
- if (m != f)
- {
- fprintf(stderr, "PNG_ROW_FROM_PASS_ROW(%u, %d) = %u != %x\n",
- v, pass, m, f);
- exit(1);
- }
-
- m = PNG_COL_FROM_PASS_COL(v, pass);
- f = png_col_from_pass_col(v, pass);
- if (m != f)
- {
- fprintf(stderr, "PNG_COL_FROM_PASS_COL(%u, %d) = %u != %x\n",
- v, pass, m, f);
- exit(1);
- }
-
- m = PNG_ROW_IN_INTERLACE_PASS(v, pass);
- f = png_row_in_interlace_pass(v, pass);
- if (m != f)
- {
- fprintf(stderr, "PNG_ROW_IN_INTERLACE_PASS(%u, %d) = %u != %x\n",
- v, pass, m, f);
- exit(1);
- }
-
- m = PNG_COL_IN_INTERLACE_PASS(v, pass);
- f = png_col_in_interlace_pass(v, pass);
- if (m != f)
- {
- fprintf(stderr, "PNG_COL_IN_INTERLACE_PASS(%u, %d) = %u != %x\n",
- v, pass, m, f);
- exit(1);
- }
-
- /* Then the base 1 stuff: */
- ++v;
- m = PNG_PASS_ROWS(v, pass);
- f = png_pass_rows(v, pass);
- if (m != f)
- {
- fprintf(stderr, "PNG_PASS_ROWS(%u, %d) = %u != %x\n",
- v, pass, m, f);
- exit(1);
- }
-
- m = PNG_PASS_COLS(v, pass);
- f = png_pass_cols(v, pass);
- if (m != f)
- {
- fprintf(stderr, "PNG_PASS_COLS(%u, %d) = %u != %x\n",
- v, pass, m, f);
- exit(1);
- }
-
- /* Move to the next v - the stepping algorithm starts skipping
- * values above 1024.
- */
- if (v > 1024)
- {
- if (v == PNG_UINT_31_MAX)
- break;
-
- v = (v << 1) ^ v;
- if (v >= PNG_UINT_31_MAX)
- v = PNG_UINT_31_MAX-1;
- }
- }
- }
-}
-
-/* main program */
-int main(int argc, PNG_CONST char **argv)
-{
- volatile int summary = 1; /* Print the error summary at the end */
-
- /* Create the given output file on success: */
- PNG_CONST char *volatile touch = NULL;
-
- /* This is an array of standard gamma values (believe it or not I've seen
- * every one of these mentioned somewhere.)
- *
- * In the following list the most useful values are first!
- */
- static double
- gammas[]={2.2, 1.0, 2.2/1.45, 1.8, 1.5, 2.4, 2.5, 2.62, 2.9};
-
- png_modifier pm;
- context(&pm.this, fault);
-
- modifier_init(&pm);
-
- /* Preallocate the image buffer, because we know how big it needs to be,
- * note that, for testing purposes, it is deliberately mis-aligned.
- */
- pm.this.image = malloc(2*TRANSFORM_IMAGEMAX+1);
-
- if (pm.this.image != NULL)
- {
- /* Ignore OOM at this point - the 'ensure' routine above will allocate
- * the array appropriately.
- */
- ++(pm.this.image);
- pm.this.cb_image = 2*TRANSFORM_IMAGEMAX;
- }
-
- /* Default to error on warning: */
- pm.this.treat_warnings_as_errors = 1;
-
- /* Store the test gammas */
- pm.gammas = gammas;
- pm.ngammas = 0; /* default to off */
- pm.sbitlow = 8U; /* because libpng doesn't do sBIT below 8! */
- pm.use_input_precision_16to8 = 1U; /* Because of the way libpng does it */
-
- /* Some default values (set the behavior for 'make check' here).
- * These values simply control the maximum error permitted in the gamma
- * transformations. The practial limits for human perception are described
- * below (the setting for maxpc16), however for 8 bit encodings it isn't
- * possible to meet the accepted capabilities of human vision - i.e. 8 bit
- * images can never be good enough, regardless of encoding.
- */
- pm.maxout8 = .1; /* Arithmetic error in *encoded* value */
- pm.maxabs8 = .00005; /* 1/20000 */
- pm.maxpc8 = .499; /* I.e., .499% fractional error */
- pm.maxout16 = .499; /* Error in *encoded* value */
- pm.maxabs16 = .00005;/* 1/20000 */
-
- /* NOTE: this is a reasonable perceptual limit. We assume that humans can
- * perceive light level differences of 1% over a 100:1 range, so we need to
- * maintain 1 in 10000 accuracy (in linear light space), which is what the
- * following guarantees. It also allows significantly higher errors at
- * higher 16 bit values, which is important for performance. The actual
- * maximum 16 bit error is about +/-1.9 in the fixed point implementation but
- * this is only allowed for values >38149 by the following:
- */
- pm.maxpc16 = .005; /* I.e., 1/200% - 1/20000 */
-
- /* Now parse the command line options. */
- while (--argc >= 1)
- {
- if (strcmp(*++argv, "-v") == 0)
- pm.this.verbose = 1;
-
- else if (strcmp(*argv, "-l") == 0)
- pm.log = 1;
-
- else if (strcmp(*argv, "-q") == 0)
- summary = pm.this.verbose = pm.log = 0;
-
- else if (strcmp(*argv, "-w") == 0)
- pm.this.treat_warnings_as_errors = 0;
-
- else if (strcmp(*argv, "--speed") == 0)
- pm.this.speed = 1, pm.ngammas = (sizeof gammas)/(sizeof gammas[0]),
- pm.test_standard = 0;
-
- else if (strcmp(*argv, "--size") == 0)
- pm.test_size = 1;
-
- else if (strcmp(*argv, "--nosize") == 0)
- pm.test_size = 0;
-
- else if (strcmp(*argv, "--standard") == 0)
- pm.test_standard = 1;
-
- else if (strcmp(*argv, "--nostandard") == 0)
- pm.test_standard = 0;
-
- else if (strcmp(*argv, "--transform") == 0)
- pm.test_transform = 1;
-
- else if (strcmp(*argv, "--notransform") == 0)
- pm.test_transform = 0;
-
- else if (strncmp(*argv, "--transform-disable=",
- sizeof "--transform-disable") == 0)
- {
- pm.test_transform = 1;
- transform_disable(*argv + sizeof "--transform-disable");
- }
-
- else if (strncmp(*argv, "--transform-enable=",
- sizeof "--transform-enable") == 0)
- {
- pm.test_transform = 1;
- transform_enable(*argv + sizeof "--transform-enable");
- }
-
- else if (strcmp(*argv, "--gamma") == 0)
- {
- /* Just do two gamma tests here (2.2 and linear) for speed: */
- pm.ngammas = 2U;
- pm.test_gamma_threshold = 1;
- pm.test_gamma_transform = 1;
- pm.test_gamma_sbit = 1;
- pm.test_gamma_strip16 = 1;
- }
-
- else if (strcmp(*argv, "--nogamma") == 0)
- pm.ngammas = 0;
-
- else if (strcmp(*argv, "--gamma-threshold") == 0)
- pm.ngammas = 2U, pm.test_gamma_threshold = 1;
-
- else if (strcmp(*argv, "--nogamma-threshold") == 0)
- pm.test_gamma_threshold = 0;
-
- else if (strcmp(*argv, "--gamma-transform") == 0)
- pm.ngammas = 2U, pm.test_gamma_transform = 1;
-
- else if (strcmp(*argv, "--nogamma-transform") == 0)
- pm.test_gamma_transform = 0;
-
- else if (strcmp(*argv, "--gamma-sbit") == 0)
- pm.ngammas = 2U, pm.test_gamma_sbit = 1;
-
- else if (strcmp(*argv, "--nogamma-sbit") == 0)
- pm.test_gamma_sbit = 0;
-
- else if (strcmp(*argv, "--gamma-16-to-8") == 0)
- pm.ngammas = 2U, pm.test_gamma_strip16 = 1;
-
- else if (strcmp(*argv, "--nogamma-16-to-8") == 0)
- pm.test_gamma_strip16 = 0;
-
- else if (strcmp(*argv, "--all-gammas") == 0)
- pm.ngammas = (sizeof gammas)/(sizeof gammas[0]);
-
- else if (strcmp(*argv, "--progressive-read") == 0)
- pm.this.progressive = 1;
-
- else if (strcmp(*argv, "--interlace") == 0)
- pm.interlace_type = PNG_INTERLACE_ADAM7;
-
- else if (argc >= 1 && strcmp(*argv, "--sbitlow") == 0)
- --argc, pm.sbitlow = (png_byte)atoi(*++argv);
-
- else if (argc >= 1 && strcmp(*argv, "--touch") == 0)
- --argc, touch = *++argv;
-
- else if (argc >= 1 && strncmp(*argv, "--max", 4) == 0)
- {
- --argc;
-
- if (strcmp(4+*argv, "abs8") == 0)
- pm.maxabs8 = atof(*++argv);
-
- else if (strcmp(4+*argv, "abs16") == 0)
- pm.maxabs16 = atof(*++argv);
-
- else if (strcmp(4+*argv, "out8") == 0)
- pm.maxout8 = atof(*++argv);
-
- else if (strcmp(4+*argv, "out16") == 0)
- pm.maxout16 = atof(*++argv);
-
- else if (strcmp(4+*argv, "pc8") == 0)
- pm.maxpc8 = atof(*++argv);
-
- else if (strcmp(4+*argv, "pc16") == 0)
- pm.maxpc16 = atof(*++argv);
-
- else
- {
- fprintf(stderr, "pngvalid: %s: unknown 'max' option\n", *argv);
- exit(1);
- }
- }
-
- else
- {
- fprintf(stderr, "pngvalid: %s: unknown argument\n", *argv);
- exit(1);
- }
- }
-
- /* If pngvalid is run with no arguments default to a reasonable set of the
- * tests.
- */
- if (pm.test_standard == 0 && pm.test_size == 0 && pm.test_transform == 0 &&
- pm.ngammas == 0)
- {
- pm.test_standard = 1;
- pm.test_size = 1;
- pm.test_transform = 1;
- pm.ngammas = 3U;
- }
-
- if (pm.ngammas > 0 &&
- pm.test_gamma_threshold == 0 && pm.test_gamma_transform == 0 &&
- pm.test_gamma_sbit == 0 && pm.test_gamma_strip16 == 0)
- {
- pm.test_gamma_threshold = 1;
- pm.test_gamma_transform = 1;
- pm.test_gamma_sbit = 1;
- pm.test_gamma_strip16 = 1;
- }
-
- else if (pm.ngammas == 0)
- {
- /* Nothing to test so turn everything off: */
- pm.test_gamma_threshold = 0;
- pm.test_gamma_transform = 0;
- pm.test_gamma_sbit = 0;
- pm.test_gamma_strip16 = 0;
- }
-
- Try
- {
- /* Make useful base images */
- make_transform_images(&pm.this);
-
- /* Perform the standard and gamma tests. */
- if (pm.test_standard)
- {
- perform_interlace_macro_validation();
- perform_standard_test(&pm);
- perform_error_test(&pm);
- }
-
- /* Various oddly sized images: */
- if (pm.test_size)
- {
- make_size_images(&pm.this);
- perform_size_test(&pm);
- }
-
- /* Combinatorial transforms: */
- if (pm.test_transform)
- perform_transform_test(&pm);
-
- if (pm.ngammas > 0)
- perform_gamma_test(&pm, pm.this.speed != 0,
- summary && !pm.this.speed);
- }
-
- Catch(fault)
- {
- fprintf(stderr, "pngvalid: test aborted (probably failed in cleanup)\n");
- if (!pm.this.verbose)
- {
- if (pm.this.error[0] != 0)
- fprintf(stderr, "pngvalid: first error: %s\n", pm.this.error);
-
- fprintf(stderr, "pngvalid: run with -v to see what happened\n");
- }
- exit(1);
- }
-
- if (summary && !pm.this.speed)
- {
- printf("Results using %s point arithmetic %s\n",
-#if defined(PNG_FLOATING_ARITHMETIC_SUPPORTED) || PNG_LIBPNG_VER < 10500
- "floating",
-#else
- "fixed",
-#endif
- (pm.this.nerrors || (pm.this.treat_warnings_as_errors &&
- pm.this.nwarnings)) ? "(errors)" : (pm.this.nwarnings ?
- "(warnings)" : "(no errors or warnings)")
- );
- printf("Allocated memory statistics (in bytes):\n"
- "\tread %lu maximum single, %lu peak, %lu total\n"
- "\twrite %lu maximum single, %lu peak, %lu total\n",
- (unsigned long)pm.this.read_memory_pool.max_max,
- (unsigned long)pm.this.read_memory_pool.max_limit,
- (unsigned long)pm.this.read_memory_pool.max_total,
- (unsigned long)pm.this.write_memory_pool.max_max,
- (unsigned long)pm.this.write_memory_pool.max_limit,
- (unsigned long)pm.this.write_memory_pool.max_total);
- }
-
- /* Do this here to provoke memory corruption errors in memory not directly
- * allocated by libpng - not a complete test, but better than nothing.
- */
- store_delete(&pm.this);
-
- /* Error exit if there are any errors, and maybe if there are any
- * warnings.
- */
- if (pm.this.nerrors || (pm.this.treat_warnings_as_errors &&
- pm.this.nwarnings))
- {
- if (!pm.this.verbose)
- fprintf(stderr, "pngvalid: %s\n", pm.this.error);
-
- fprintf(stderr, "pngvalid: %d errors, %d warnings\n", pm.this.nerrors,
- pm.this.nwarnings);
-
- exit(1);
- }
-
- /* Success case. */
- if (touch != NULL)
- {
- FILE *fsuccess = fopen(touch, "wt");
-
- if (fsuccess != NULL)
- {
- int error = 0;
- fprintf(fsuccess, "PNG validation succeeded\n");
- fflush(fsuccess);
- error = ferror(fsuccess);
-
- if (fclose(fsuccess) || error)
- {
- fprintf(stderr, "%s: write failed\n", touch);
- exit(1);
- }
- }
- }
-
- return 0;
-}
diff --git a/src/3rdparty/libpng/pngwrite.c b/src/3rdparty/libpng/pngwrite.c
index d90f449e30..b587f1b999 100644
--- a/src/3rdparty/libpng/pngwrite.c
+++ b/src/3rdparty/libpng/pngwrite.c
@@ -1,8 +1,8 @@
/* pngwrite.c - general routines to write a PNG file
*
- * Last changed in libpng 1.5.1 [February 3, 2011]
- * Copyright (c) 1998-2011 Glenn Randers-Pehrson
+ * Last changed in libpng 1.5.10 [March 8, 2012]
+ * Copyright (c) 1998-2012 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -99,8 +99,10 @@ png_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr)
int keep = png_handle_as_unknown(png_ptr, up->name);
if (keep != PNG_HANDLE_CHUNK_NEVER &&
- up->location && !(up->location & PNG_HAVE_PLTE) &&
+ up->location &&
+ !(up->location & PNG_HAVE_PLTE) &&
!(up->location & PNG_HAVE_IDAT) &&
+ !(up->location & PNG_AFTER_IDAT) &&
((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS ||
(png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS)))
{
@@ -273,8 +275,10 @@ png_write_info(png_structp png_ptr, png_infop info_ptr)
{
int keep = png_handle_as_unknown(png_ptr, up->name);
if (keep != PNG_HANDLE_CHUNK_NEVER &&
- up->location && (up->location & PNG_HAVE_PLTE) &&
+ up->location &&
+ (up->location & PNG_HAVE_PLTE) &&
!(up->location & PNG_HAVE_IDAT) &&
+ !(up->location & PNG_AFTER_IDAT) &&
((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS ||
(png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS)))
{
@@ -301,6 +305,11 @@ png_write_end(png_structp png_ptr, png_infop info_ptr)
if (!(png_ptr->mode & PNG_HAVE_IDAT))
png_error(png_ptr, "No IDATs written into file");
+#ifdef PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED
+ if (png_ptr->num_palette_max > png_ptr->num_palette)
+ png_benign_error(png_ptr, "Wrote palette index exceeding num_palette");
+#endif
+
/* See if user wants us to write information chunks */
if (info_ptr != NULL)
{
@@ -380,7 +389,8 @@ png_write_end(png_structp png_ptr, png_infop info_ptr)
{
int keep = png_handle_as_unknown(png_ptr, up->name);
if (keep != PNG_HANDLE_CHUNK_NEVER &&
- up->location && (up->location & PNG_AFTER_IDAT) &&
+ up->location &&
+ (up->location & PNG_AFTER_IDAT) &&
((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS ||
(png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS)))
{
@@ -462,10 +472,9 @@ png_create_write_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr,
png_structp png_ptr;
#ifdef PNG_SETJMP_SUPPORTED
#ifdef USE_FAR_KEYWORD
- jmp_buf png_jmpbuf;
+ jmp_buf tmp_jmpbuf;
#endif
#endif
- int i;
png_debug(1, "in png_create_write_struct");
@@ -486,15 +495,16 @@ png_create_write_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr,
#ifdef PNG_SETJMP_SUPPORTED
/* Applications that neglect to set up their own setjmp() and then
- encounter a png_error() will longjmp here. Since the jmpbuf is
- then meaningless we abort instead of returning. */
+ * encounter a png_error() will longjmp here. Since the jmpbuf is
+ * then meaningless we abort instead of returning.
+ */
#ifdef USE_FAR_KEYWORD
- if (setjmp(png_jmpbuf))
+ if (setjmp(tmp_jmpbuf))
#else
if (setjmp(png_jmpbuf(png_ptr))) /* sets longjmp to match setjmp */
#endif
#ifdef USE_FAR_KEYWORD
- png_memcpy(png_jmpbuf(png_ptr), png_jmpbuf, png_sizeof(jmp_buf));
+ png_memcpy(png_jmpbuf(png_ptr), tmp_jmpbuf, png_sizeof(jmp_buf));
#endif
PNG_ABORT();
#endif
@@ -504,49 +514,8 @@ png_create_write_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr,
#endif /* PNG_USER_MEM_SUPPORTED */
png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn);
- if (user_png_ver)
- {
- i = 0;
- do
- {
- if (user_png_ver[i] != png_libpng_ver[i])
- png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
- } while (png_libpng_ver[i++]);
- }
-
- if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH)
- {
- /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so
- * we must recompile any applications that use any older library version.
- * For versions after libpng 1.0, we will be compatible, so we need
- * only check the first digit.
- */
- if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] ||
- (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) ||
- (user_png_ver[0] == '0' && user_png_ver[2] < '9'))
- {
-#ifdef PNG_CONSOLE_IO_SUPPORTED
- char msg[80];
-
- if (user_png_ver)
- {
- png_snprintf2(msg, 80,
- "Application built with libpng-%.20s"
- " but running with %.20s",
- user_png_ver,
- png_libpng_ver);
- png_warning(png_ptr, msg);
- }
-#else
- png_warning(png_ptr,
- "Incompatible libpng version in application and library");
-#endif
-#ifdef PNG_ERROR_NUMBERS_SUPPORTED
- png_ptr->flags = 0;
-#endif
- png_cleanup_needed = 1;
- }
- }
+ if (!png_user_version_check(png_ptr, user_png_ver))
+ png_cleanup_needed = 1;
/* Initialize zbuf - compression buffer */
png_ptr->zbuf_size = PNG_ZBUF_SIZE;
@@ -645,6 +614,9 @@ png_write_image(png_structp png_ptr, png_bytepp image)
void PNGAPI
png_write_row(png_structp png_ptr, png_const_bytep row)
{
+ /* 1.5.6: moved from png_struct to be a local structure: */
+ png_row_info row_info;
+
if (png_ptr == NULL)
return;
@@ -768,36 +740,31 @@ png_write_row(png_structp png_ptr, png_const_bytep row)
#endif
/* Set up row info for transformations */
- png_ptr->row_info.color_type = png_ptr->color_type;
- png_ptr->row_info.width = png_ptr->usr_width;
- png_ptr->row_info.channels = png_ptr->usr_channels;
- png_ptr->row_info.bit_depth = png_ptr->usr_bit_depth;
- png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth *
- png_ptr->row_info.channels);
-
- png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth,
- png_ptr->row_info.width);
-
- png_debug1(3, "row_info->color_type = %d", png_ptr->row_info.color_type);
- png_debug1(3, "row_info->width = %u", png_ptr->row_info.width);
- png_debug1(3, "row_info->channels = %d", png_ptr->row_info.channels);
- png_debug1(3, "row_info->bit_depth = %d", png_ptr->row_info.bit_depth);
- png_debug1(3, "row_info->pixel_depth = %d", png_ptr->row_info.pixel_depth);
- png_debug1(3, "row_info->rowbytes = %lu",
- (unsigned long)png_ptr->row_info.rowbytes);
+ row_info.color_type = png_ptr->color_type;
+ row_info.width = png_ptr->usr_width;
+ row_info.channels = png_ptr->usr_channels;
+ row_info.bit_depth = png_ptr->usr_bit_depth;
+ row_info.pixel_depth = (png_byte)(row_info.bit_depth * row_info.channels);
+ row_info.rowbytes = PNG_ROWBYTES(row_info.pixel_depth, row_info.width);
+
+ png_debug1(3, "row_info->color_type = %d", row_info.color_type);
+ png_debug1(3, "row_info->width = %u", row_info.width);
+ png_debug1(3, "row_info->channels = %d", row_info.channels);
+ png_debug1(3, "row_info->bit_depth = %d", row_info.bit_depth);
+ png_debug1(3, "row_info->pixel_depth = %d", row_info.pixel_depth);
+ png_debug1(3, "row_info->rowbytes = %lu", (unsigned long)row_info.rowbytes);
/* Copy user's row into buffer, leaving room for filter byte. */
- png_memcpy(png_ptr->row_buf + 1, row, png_ptr->row_info.rowbytes);
+ png_memcpy(png_ptr->row_buf + 1, row, row_info.rowbytes);
#ifdef PNG_WRITE_INTERLACING_SUPPORTED
/* Handle interlacing */
if (png_ptr->interlaced && png_ptr->pass < 6 &&
(png_ptr->transformations & PNG_INTERLACE))
{
- png_do_write_interlace(&(png_ptr->row_info),
- png_ptr->row_buf + 1, png_ptr->pass);
+ png_do_write_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass);
/* This should always get caught above, but still ... */
- if (!(png_ptr->row_info.width))
+ if (!(row_info.width))
{
png_write_finish_row(png_ptr);
return;
@@ -805,9 +772,18 @@ png_write_row(png_structp png_ptr, png_const_bytep row)
}
#endif
+#ifdef PNG_WRITE_TRANSFORMS_SUPPORTED
/* Handle other transformations */
if (png_ptr->transformations)
- png_do_write_transformations(png_ptr);
+ png_do_write_transformations(png_ptr, &row_info);
+#endif
+
+ /* At this point the row_info pixel depth must match the 'transformed' depth,
+ * which is also the output depth.
+ */
+ if (row_info.pixel_depth != png_ptr->pixel_depth ||
+ row_info.pixel_depth != png_ptr->transformed_pixel_depth)
+ png_error(png_ptr, "internal write transform logic error");
#ifdef PNG_MNG_FEATURES_SUPPORTED
/* Write filter_method 64 (intrapixel differencing) only if
@@ -823,12 +799,19 @@ png_write_row(png_structp png_ptr, png_const_bytep row)
(png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING))
{
/* Intrapixel differencing */
- png_do_write_intrapixel(&(png_ptr->row_info), png_ptr->row_buf + 1);
+ png_do_write_intrapixel(&row_info, png_ptr->row_buf + 1);
}
#endif
+/* Added at libpng-1.5.10 */
+#ifdef PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED
+ /* Check for out-of-range palette index */
+ if(row_info.color_type == PNG_COLOR_TYPE_PALETTE)
+ png_do_check_palette_indexes(png_ptr, &row_info);
+#endif
+
/* Find a filter if necessary, filter the row and write it out. */
- png_write_find_filter(png_ptr, &(png_ptr->row_info));
+ png_write_find_filter(png_ptr, &row_info);
if (png_ptr->write_row_fn != NULL)
(*(png_ptr->write_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass);
@@ -884,8 +867,6 @@ png_write_flush(png_structp png_ptr)
{
/* Write the IDAT and reset the zlib output buffer */
png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size);
- png_ptr->zstream.next_out = png_ptr->zbuf;
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
wrote_IDAT = 1;
}
} while (wrote_IDAT == 1);
@@ -896,8 +877,6 @@ png_write_flush(png_structp png_ptr)
/* Write the IDAT and reset the zlib output buffer */
png_write_IDAT(png_ptr, png_ptr->zbuf,
png_ptr->zbuf_size - png_ptr->zstream.avail_out);
- png_ptr->zstream.next_out = png_ptr->zbuf;
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
}
png_ptr->flush_rows = 0;
png_flush(png_ptr);
@@ -918,13 +897,7 @@ png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)
png_debug(1, "in png_destroy_write_struct");
if (png_ptr_ptr != NULL)
- {
png_ptr = *png_ptr_ptr;
-#ifdef PNG_USER_MEM_SUPPORTED
- free_fn = png_ptr->free_fn;
- mem_ptr = png_ptr->mem_ptr;
-#endif
- }
#ifdef PNG_USER_MEM_SUPPORTED
if (png_ptr != NULL)
@@ -983,7 +956,9 @@ png_write_destroy(png_structp png_ptr)
jmp_buf tmp_jmp; /* Save jump buffer */
#endif
png_error_ptr error_fn;
+#ifdef PNG_WARNINGS_SUPPORTED
png_error_ptr warning_fn;
+#endif
png_voidp error_ptr;
#ifdef PNG_USER_MEM_SUPPORTED
png_free_ptr free_fn;
@@ -992,7 +967,8 @@ png_write_destroy(png_structp png_ptr)
png_debug(1, "in png_write_destroy");
/* Free any memory zlib uses */
- deflateEnd(&png_ptr->zstream);
+ if (png_ptr->zlib_state != PNG_ZLIB_UNINITIALIZED)
+ deflateEnd(&png_ptr->zstream);
/* Free our memory. png_free checks NULL for us. */
png_free(png_ptr, png_ptr->zbuf);
@@ -1005,10 +981,6 @@ png_write_destroy(png_structp png_ptr)
png_free(png_ptr, png_ptr->paeth_row);
#endif
-#ifdef PNG_TIME_RFC1123_SUPPORTED
- png_free(png_ptr, png_ptr->time_buffer);
-#endif
-
#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
/* Use this to save a little code space, it doesn't free the filter_costs */
png_reset_filter_heuristics(png_ptr);
@@ -1018,11 +990,13 @@ png_write_destroy(png_structp png_ptr)
#ifdef PNG_SETJMP_SUPPORTED
/* Reset structure */
- png_memcpy(tmp_jmp, png_ptr->png_jmpbuf, png_sizeof(jmp_buf));
+ png_memcpy(tmp_jmp, png_ptr->longjmp_buffer, png_sizeof(jmp_buf));
#endif
error_fn = png_ptr->error_fn;
+#ifdef PNG_WARNINGS_SUPPORTED
warning_fn = png_ptr->warning_fn;
+#endif
error_ptr = png_ptr->error_ptr;
#ifdef PNG_USER_MEM_SUPPORTED
free_fn = png_ptr->free_fn;
@@ -1031,14 +1005,16 @@ png_write_destroy(png_structp png_ptr)
png_memset(png_ptr, 0, png_sizeof(png_struct));
png_ptr->error_fn = error_fn;
+#ifdef PNG_WARNINGS_SUPPORTED
png_ptr->warning_fn = warning_fn;
+#endif
png_ptr->error_ptr = error_ptr;
#ifdef PNG_USER_MEM_SUPPORTED
png_ptr->free_fn = free_fn;
#endif
#ifdef PNG_SETJMP_SUPPORTED
- png_memcpy(png_ptr->png_jmpbuf, tmp_jmp, png_sizeof(jmp_buf));
+ png_memcpy(png_ptr->longjmp_buffer, tmp_jmp, png_sizeof(jmp_buf));
#endif
}
@@ -1177,7 +1153,7 @@ png_set_filter(png_structp png_ptr, int method, int filters)
* better compression.
*/
#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* GRR 970116 */
-/* Conveneince reset API. */
+/* Convenience reset API. */
static void
png_reset_filter_heuristics(png_structp png_ptr)
{
@@ -1451,6 +1427,9 @@ png_set_compression_strategy(png_structp png_ptr, int strategy)
png_ptr->zlib_strategy = strategy;
}
+/* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a
+ * smaller value of window_bits if it can do so safely.
+ */
void PNGAPI
png_set_compression_window_bits(png_structp png_ptr, int window_bits)
{
@@ -1491,6 +1470,89 @@ png_set_compression_method(png_structp png_ptr, int method)
png_ptr->zlib_method = method;
}
+/* The following were added to libpng-1.5.4 */
+#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED
+void PNGAPI
+png_set_text_compression_level(png_structp png_ptr, int level)
+{
+ png_debug(1, "in png_set_text_compression_level");
+
+ if (png_ptr == NULL)
+ return;
+
+ png_ptr->flags |= PNG_FLAG_ZTXT_CUSTOM_LEVEL;
+ png_ptr->zlib_text_level = level;
+}
+
+void PNGAPI
+png_set_text_compression_mem_level(png_structp png_ptr, int mem_level)
+{
+ png_debug(1, "in png_set_text_compression_mem_level");
+
+ if (png_ptr == NULL)
+ return;
+
+ png_ptr->flags |= PNG_FLAG_ZTXT_CUSTOM_MEM_LEVEL;
+ png_ptr->zlib_text_mem_level = mem_level;
+}
+
+void PNGAPI
+png_set_text_compression_strategy(png_structp png_ptr, int strategy)
+{
+ png_debug(1, "in png_set_text_compression_strategy");
+
+ if (png_ptr == NULL)
+ return;
+
+ png_ptr->flags |= PNG_FLAG_ZTXT_CUSTOM_STRATEGY;
+ png_ptr->zlib_text_strategy = strategy;
+}
+
+/* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a
+ * smaller value of window_bits if it can do so safely.
+ */
+void PNGAPI
+png_set_text_compression_window_bits(png_structp png_ptr, int window_bits)
+{
+ if (png_ptr == NULL)
+ return;
+
+ if (window_bits > 15)
+ png_warning(png_ptr, "Only compression windows <= 32k supported by PNG");
+
+ else if (window_bits < 8)
+ png_warning(png_ptr, "Only compression windows >= 256 supported by PNG");
+
+#ifndef WBITS_8_OK
+ /* Avoid libpng bug with 256-byte windows */
+ if (window_bits == 8)
+ {
+ png_warning(png_ptr, "Text compression window is being reset to 512");
+ window_bits = 9;
+ }
+
+#endif
+ png_ptr->flags |= PNG_FLAG_ZTXT_CUSTOM_WINDOW_BITS;
+ png_ptr->zlib_text_window_bits = window_bits;
+}
+
+void PNGAPI
+png_set_text_compression_method(png_structp png_ptr, int method)
+{
+ png_debug(1, "in png_set_text_compression_method");
+
+ if (png_ptr == NULL)
+ return;
+
+ if (method != 8)
+ png_warning(png_ptr, "Only compression method 8 is supported by PNG");
+
+ png_ptr->flags |= PNG_FLAG_ZTXT_CUSTOM_METHOD;
+ png_ptr->zlib_text_method = method;
+}
+#endif /* PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED */
+/* end of API added to libpng-1.5.4 */
+
void PNGAPI
png_set_write_status_fn(png_structp png_ptr, png_write_status_ptr write_row_fn)
{
@@ -1557,7 +1619,7 @@ png_write_png(png_structp png_ptr, png_infop info_ptr,
#endif
#ifdef PNG_WRITE_FILLER_SUPPORTED
- /* Pack XRGB/RGBX/ARGB/RGBA into * RGB (4 channels -> 3 channels) */
+ /* Pack XRGB/RGBX/ARGB/RGBA into RGB (4 channels -> 3 channels) */
if (transforms & PNG_TRANSFORM_STRIP_FILLER_AFTER)
png_set_filler(png_ptr, 0, PNG_FILLER_AFTER);
diff --git a/src/3rdparty/libpng/pngwtran.c b/src/3rdparty/libpng/pngwtran.c
index 115ca37212..96608efcb4 100644
--- a/src/3rdparty/libpng/pngwtran.c
+++ b/src/3rdparty/libpng/pngwtran.c
@@ -1,7 +1,7 @@
/* pngwtran.c - transforms the data in a row for PNG writers
*
- * Last changed in libpng 1.5.0 [January 6, 2011]
+ * Last changed in libpng 1.5.6 [November 3, 2011]
* Copyright (c) 1998-2011 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
@@ -15,11 +15,12 @@
#ifdef PNG_WRITE_SUPPORTED
+#ifdef PNG_WRITE_TRANSFORMS_SUPPORTED
/* Transform the data according to the user's wishes. The order of
* transformations is significant.
*/
void /* PRIVATE */
-png_do_write_transformations(png_structp png_ptr)
+png_do_write_transformations(png_structp png_ptr, png_row_infop row_info)
{
png_debug(1, "in png_do_write_transformations");
@@ -31,8 +32,8 @@ png_do_write_transformations(png_structp png_ptr)
if (png_ptr->write_user_transform_fn != NULL)
(*(png_ptr->write_user_transform_fn)) /* User write transform
function */
- (png_ptr, /* png_ptr */
- &(png_ptr->row_info), /* row_info: */
+ (png_ptr, /* png_ptr */
+ row_info, /* row_info: */
/* png_uint_32 width; width of row */
/* png_size_t rowbytes; number of bytes in row */
/* png_byte color_type; color type of pixels */
@@ -44,50 +45,50 @@ png_do_write_transformations(png_structp png_ptr)
#ifdef PNG_WRITE_FILLER_SUPPORTED
if (png_ptr->transformations & PNG_FILLER)
- png_do_strip_filler(&(png_ptr->row_info), png_ptr->row_buf + 1,
- png_ptr->flags);
+ png_do_strip_channel(row_info, png_ptr->row_buf + 1,
+ !(png_ptr->flags & PNG_FLAG_FILLER_AFTER));
#endif
#ifdef PNG_WRITE_PACKSWAP_SUPPORTED
if (png_ptr->transformations & PNG_PACKSWAP)
- png_do_packswap(&(png_ptr->row_info), png_ptr->row_buf + 1);
+ png_do_packswap(row_info, png_ptr->row_buf + 1);
#endif
#ifdef PNG_WRITE_PACK_SUPPORTED
if (png_ptr->transformations & PNG_PACK)
- png_do_pack(&(png_ptr->row_info), png_ptr->row_buf + 1,
+ png_do_pack(row_info, png_ptr->row_buf + 1,
(png_uint_32)png_ptr->bit_depth);
#endif
#ifdef PNG_WRITE_SWAP_SUPPORTED
if (png_ptr->transformations & PNG_SWAP_BYTES)
- png_do_swap(&(png_ptr->row_info), png_ptr->row_buf + 1);
+ png_do_swap(row_info, png_ptr->row_buf + 1);
#endif
#ifdef PNG_WRITE_SHIFT_SUPPORTED
if (png_ptr->transformations & PNG_SHIFT)
- png_do_shift(&(png_ptr->row_info), png_ptr->row_buf + 1,
+ png_do_shift(row_info, png_ptr->row_buf + 1,
&(png_ptr->shift));
#endif
#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED
if (png_ptr->transformations & PNG_SWAP_ALPHA)
- png_do_write_swap_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1);
+ png_do_write_swap_alpha(row_info, png_ptr->row_buf + 1);
#endif
#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED
if (png_ptr->transformations & PNG_INVERT_ALPHA)
- png_do_write_invert_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1);
+ png_do_write_invert_alpha(row_info, png_ptr->row_buf + 1);
#endif
#ifdef PNG_WRITE_BGR_SUPPORTED
if (png_ptr->transformations & PNG_BGR)
- png_do_bgr(&(png_ptr->row_info), png_ptr->row_buf + 1);
+ png_do_bgr(row_info, png_ptr->row_buf + 1);
#endif
#ifdef PNG_WRITE_INVERT_SUPPORTED
if (png_ptr->transformations & PNG_INVERT_MONO)
- png_do_invert(&(png_ptr->row_info), png_ptr->row_buf + 1);
+ png_do_invert(row_info, png_ptr->row_buf + 1);
#endif
}
@@ -563,6 +564,7 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)
}
}
#endif
+#endif /* PNG_WRITE_TRANSFORMS_SUPPORTED */
#ifdef PNG_MNG_FEATURES_SUPPORTED
/* Undoes intrapixel differencing */
diff --git a/src/3rdparty/libpng/pngwutil.c b/src/3rdparty/libpng/pngwutil.c
index 2c35785aa1..b49704f1a5 100644
--- a/src/3rdparty/libpng/pngwutil.c
+++ b/src/3rdparty/libpng/pngwutil.c
@@ -1,8 +1,8 @@
/* pngwutil.c - utilities to write a PNG file
*
- * Last changed in libpng 1.5.0 [January 6, 2011]
- * Copyright (c) 1998-2011 Glenn Randers-Pehrson
+ * Last changed in libpng 1.5.10 [March 8, 2012]
+ * Copyright (c) 1998-2012 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -82,39 +82,20 @@ png_write_sig(png_structp png_ptr)
png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE;
}
-/* Write a PNG chunk all at once. The type is an array of ASCII characters
- * representing the chunk name. The array must be at least 4 bytes in
- * length, and does not need to be null terminated. To be safe, pass the
- * pre-defined chunk names here, and if you need a new one, define it
- * where the others are defined. The length is the length of the data.
- * All the data must be present. If that is not possible, use the
- * png_write_chunk_start(), png_write_chunk_data(), and png_write_chunk_end()
- * functions instead.
- */
-void PNGAPI
-png_write_chunk(png_structp png_ptr, png_const_bytep chunk_name,
- png_const_bytep data, png_size_t length)
-{
- if (png_ptr == NULL)
- return;
-
- png_write_chunk_start(png_ptr, chunk_name, (png_uint_32)length);
- png_write_chunk_data(png_ptr, data, (png_size_t)length);
- png_write_chunk_end(png_ptr);
-}
-
/* Write the start of a PNG chunk. The type is the chunk type.
* The total_length is the sum of the lengths of all the data you will be
* passing in png_write_chunk_data().
*/
-void PNGAPI
-png_write_chunk_start(png_structp png_ptr, png_const_bytep chunk_name,
+static void
+png_write_chunk_header(png_structp png_ptr, png_uint_32 chunk_name,
png_uint_32 length)
{
png_byte buf[8];
- png_debug2(0, "Writing %s chunk, length = %lu", chunk_name,
- (unsigned long)length);
+#if defined(PNG_DEBUG) && (PNG_DEBUG > 0)
+ PNG_CSTRING_FROM_CHUNK(buf, chunk_name);
+ png_debug2(0, "Writing %s chunk, length = %lu", buf, (unsigned long)length);
+#endif
if (png_ptr == NULL)
return;
@@ -128,16 +109,16 @@ png_write_chunk_start(png_structp png_ptr, png_const_bytep chunk_name,
/* Write the length and the chunk name */
png_save_uint_32(buf, length);
- png_memcpy(buf + 4, chunk_name, 4);
- png_write_data(png_ptr, buf, (png_size_t)8);
+ png_save_uint_32(buf + 4, chunk_name);
+ png_write_data(png_ptr, buf, 8);
/* Put the chunk name into png_ptr->chunk_name */
- png_memcpy(png_ptr->chunk_name, chunk_name, 4);
+ png_ptr->chunk_name = chunk_name;
/* Reset the crc and run it over the chunk name */
png_reset_crc(png_ptr);
- png_calculate_crc(png_ptr, chunk_name, 4);
+ png_calculate_crc(png_ptr, buf + 4, 4);
#ifdef PNG_IO_STATE_SUPPORTED
/* Inform the I/O callback that chunk data will (possibly) be written.
@@ -147,10 +128,17 @@ png_write_chunk_start(png_structp png_ptr, png_const_bytep chunk_name,
#endif
}
-/* Write the data of a PNG chunk started with png_write_chunk_start().
+void PNGAPI
+png_write_chunk_start(png_structp png_ptr, png_const_bytep chunk_string,
+ png_uint_32 length)
+{
+ png_write_chunk_header(png_ptr, PNG_CHUNK_FROM_STRING(chunk_string), length);
+}
+
+/* Write the data of a PNG chunk started with png_write_chunk_header().
* Note that multiple calls to this function are allowed, and that the
* sum of the lengths from these calls *must* add up to the total_length
- * given to png_write_chunk_start().
+ * given to png_write_chunk_header().
*/
void PNGAPI
png_write_chunk_data(png_structp png_ptr, png_const_bytep data,
@@ -171,7 +159,7 @@ png_write_chunk_data(png_structp png_ptr, png_const_bytep data,
}
}
-/* Finish a chunk started with png_write_chunk_start(). */
+/* Finish a chunk started with png_write_chunk_header(). */
void PNGAPI
png_write_chunk_end(png_structp png_ptr)
{
@@ -192,7 +180,183 @@ png_write_chunk_end(png_structp png_ptr)
png_write_data(png_ptr, buf, (png_size_t)4);
}
-#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_iCCP_SUPPORTED)
+/* Write a PNG chunk all at once. The type is an array of ASCII characters
+ * representing the chunk name. The array must be at least 4 bytes in
+ * length, and does not need to be null terminated. To be safe, pass the
+ * pre-defined chunk names here, and if you need a new one, define it
+ * where the others are defined. The length is the length of the data.
+ * All the data must be present. If that is not possible, use the
+ * png_write_chunk_start(), png_write_chunk_data(), and png_write_chunk_end()
+ * functions instead.
+ */
+static void
+png_write_complete_chunk(png_structp png_ptr, png_uint_32 chunk_name,
+ png_const_bytep data, png_size_t length)
+{
+ if (png_ptr == NULL)
+ return;
+
+ /* On 64 bit architectures 'length' may not fit in a png_uint_32. */
+ if (length > PNG_UINT_32_MAX)
+ png_error(png_ptr, "length exceeds PNG maxima");
+
+ png_write_chunk_header(png_ptr, chunk_name, (png_uint_32)length);
+ png_write_chunk_data(png_ptr, data, length);
+ png_write_chunk_end(png_ptr);
+}
+
+/* This is the API that calls the internal function above. */
+void PNGAPI
+png_write_chunk(png_structp png_ptr, png_const_bytep chunk_string,
+ png_const_bytep data, png_size_t length)
+{
+ png_write_complete_chunk(png_ptr, PNG_CHUNK_FROM_STRING(chunk_string), data,
+ length);
+}
+
+/* Initialize the compressor for the appropriate type of compression. */
+static void
+png_zlib_claim(png_structp png_ptr, png_uint_32 state)
+{
+ if (!(png_ptr->zlib_state & PNG_ZLIB_IN_USE))
+ {
+ /* If already initialized for 'state' do not re-init. */
+ if (png_ptr->zlib_state != state)
+ {
+ int ret = Z_OK;
+ png_const_charp who = "-";
+
+ /* If actually initialized for another state do a deflateEnd. */
+ if (png_ptr->zlib_state != PNG_ZLIB_UNINITIALIZED)
+ {
+ ret = deflateEnd(&png_ptr->zstream);
+ who = "end";
+ png_ptr->zlib_state = PNG_ZLIB_UNINITIALIZED;
+ }
+
+ /* zlib itself detects an incomplete state on deflateEnd */
+ if (ret == Z_OK) switch (state)
+ {
+# ifdef PNG_WRITE_COMPRESSED_TEXT_SUPPORTED
+ case PNG_ZLIB_FOR_TEXT:
+ ret = deflateInit2(&png_ptr->zstream,
+ png_ptr->zlib_text_level, png_ptr->zlib_text_method,
+ png_ptr->zlib_text_window_bits,
+ png_ptr->zlib_text_mem_level, png_ptr->zlib_text_strategy);
+ who = "text";
+ break;
+# endif
+
+ case PNG_ZLIB_FOR_IDAT:
+ ret = deflateInit2(&png_ptr->zstream, png_ptr->zlib_level,
+ png_ptr->zlib_method, png_ptr->zlib_window_bits,
+ png_ptr->zlib_mem_level, png_ptr->zlib_strategy);
+ who = "IDAT";
+ break;
+
+ default:
+ png_error(png_ptr, "invalid zlib state");
+ }
+
+ if (ret == Z_OK)
+ png_ptr->zlib_state = state;
+
+ else /* an error in deflateEnd or deflateInit2 */
+ {
+ size_t pos = 0;
+ char msg[64];
+
+ pos = png_safecat(msg, sizeof msg, pos,
+ "zlib failed to initialize compressor (");
+ pos = png_safecat(msg, sizeof msg, pos, who);
+
+ switch (ret)
+ {
+ case Z_VERSION_ERROR:
+ pos = png_safecat(msg, sizeof msg, pos, ") version error");
+ break;
+
+ case Z_STREAM_ERROR:
+ pos = png_safecat(msg, sizeof msg, pos, ") stream error");
+ break;
+
+ case Z_MEM_ERROR:
+ pos = png_safecat(msg, sizeof msg, pos, ") memory error");
+ break;
+
+ default:
+ pos = png_safecat(msg, sizeof msg, pos, ") unknown error");
+ break;
+ }
+
+ png_error(png_ptr, msg);
+ }
+ }
+
+ /* Here on success, claim the zstream: */
+ png_ptr->zlib_state |= PNG_ZLIB_IN_USE;
+ }
+
+ else
+ png_error(png_ptr, "zstream already in use (internal error)");
+}
+
+/* The opposite: release the stream. It is also reset, this API will warn on
+ * error but will not fail.
+ */
+static void
+png_zlib_release(png_structp png_ptr)
+{
+ if (png_ptr->zlib_state & PNG_ZLIB_IN_USE)
+ {
+ int ret = deflateReset(&png_ptr->zstream);
+
+ png_ptr->zlib_state &= ~PNG_ZLIB_IN_USE;
+
+ if (ret != Z_OK)
+ {
+ png_const_charp err;
+ PNG_WARNING_PARAMETERS(p)
+
+ switch (ret)
+ {
+ case Z_VERSION_ERROR:
+ err = "version";
+ break;
+
+ case Z_STREAM_ERROR:
+ err = "stream";
+ break;
+
+ case Z_MEM_ERROR:
+ err = "memory";
+ break;
+
+ default:
+ err = "unknown";
+ break;
+ }
+
+ png_warning_parameter_signed(p, 1, PNG_NUMBER_FORMAT_d, ret);
+ png_warning_parameter(p, 2, err);
+
+ if (png_ptr->zstream.msg)
+ err = png_ptr->zstream.msg;
+ else
+ err = "[no zlib message]";
+
+ png_warning_parameter(p, 3, err);
+
+ png_formatted_warning(png_ptr, p,
+ "zlib failed to reset compressor: @1(@2): @3");
+ }
+ }
+
+ else
+ png_warning(png_ptr, "zstream not in use (internal error)");
+}
+
+#ifdef PNG_WRITE_COMPRESSED_TEXT_SUPPORTED
/* This pair of functions encapsulates the operation of (a) compressing a
* text string, and (b) issuing it later as a series of chunk data writes.
* The compression_state structure is shared context for these functions
@@ -220,25 +384,22 @@ png_text_compress(png_structp png_ptr,
comp->max_output_ptr = 0;
comp->output_ptr = NULL;
comp->input = NULL;
- comp->input_len = 0;
+ comp->input_len = text_len;
/* We may just want to pass the text right through */
if (compression == PNG_TEXT_COMPRESSION_NONE)
{
comp->input = (png_const_bytep)text;
- comp->input_len = text_len;
return((int)text_len);
}
if (compression >= PNG_TEXT_COMPRESSION_LAST)
{
-#ifdef PNG_CONSOLE_IO_SUPPORTED
- char msg[50];
- png_snprintf(msg, 50, "Unknown compression type %d", compression);
- png_warning(png_ptr, msg);
-#else
- png_warning(png_ptr, "Unknown compression type");
-#endif
+ PNG_WARNING_PARAMETERS(p)
+
+ png_warning_parameter_signed(p, 1, PNG_NUMBER_FORMAT_d,
+ compression);
+ png_formatted_warning(png_ptr, p, "Unknown compression type @1");
}
/* We can't write the chunk until we find out how much data we have,
@@ -255,10 +416,12 @@ png_text_compress(png_structp png_ptr,
* data, or if the input string is incredibly large (although this
* wouldn't cause a failure, just a slowdown due to swapping).
*/
+ png_zlib_claim(png_ptr, PNG_ZLIB_FOR_TEXT);
/* Set up the compression buffers */
/* TODO: the following cast hides a potential overflow problem. */
png_ptr->zstream.avail_in = (uInt)text_len;
+
/* NOTE: assume zlib doesn't overwrite the input */
png_ptr->zstream.next_in = (Bytef *)text;
png_ptr->zstream.avail_out = png_ptr->zbuf_size;
@@ -406,18 +569,84 @@ png_text_compress(png_structp png_ptr,
/* Ship the compressed text out via chunk writes */
static void /* PRIVATE */
-png_write_compressed_data_out(png_structp png_ptr, compression_state *comp)
+png_write_compressed_data_out(png_structp png_ptr, compression_state *comp,
+ png_size_t data_len)
{
int i;
/* Handle the no-compression case */
if (comp->input)
{
- png_write_chunk_data(png_ptr, comp->input, comp->input_len);
+ png_write_chunk_data(png_ptr, comp->input, data_len);
return;
}
+#ifdef PNG_WRITE_OPTIMIZE_CMF_SUPPORTED
+ /* The zbuf_size test is because the code below doesn't work if zbuf_size is
+ * '1'; simply skip it to avoid memory overwrite.
+ */
+ if (data_len >= 2 && comp->input_len < 16384 && png_ptr->zbuf_size > 1)
+ {
+ unsigned int z_cmf; /* zlib compression method and flags */
+
+ /* Optimize the CMF field in the zlib stream. This hack of the zlib
+ * stream is compliant to the stream specification.
+ */
+
+ if (comp->num_output_ptr)
+ z_cmf = comp->output_ptr[0][0];
+ else
+ z_cmf = png_ptr->zbuf[0];
+
+ if ((z_cmf & 0x0f) == 8 && (z_cmf & 0xf0) <= 0x70)
+ {
+ unsigned int z_cinfo;
+ unsigned int half_z_window_size;
+ png_size_t uncompressed_text_size = comp->input_len;
+
+ z_cinfo = z_cmf >> 4;
+ half_z_window_size = 1 << (z_cinfo + 7);
+
+ while (uncompressed_text_size <= half_z_window_size &&
+ half_z_window_size >= 256)
+ {
+ z_cinfo--;
+ half_z_window_size >>= 1;
+ }
+
+ z_cmf = (z_cmf & 0x0f) | (z_cinfo << 4);
+
+ if (comp->num_output_ptr)
+ {
+
+ if (comp->output_ptr[0][0] != z_cmf)
+ {
+ int tmp;
+
+ comp->output_ptr[0][0] = (png_byte)z_cmf;
+ tmp = comp->output_ptr[0][1] & 0xe0;
+ tmp += 0x1f - ((z_cmf << 8) + tmp) % 0x1f;
+ comp->output_ptr[0][1] = (png_byte)tmp;
+ }
+ }
+ else
+ {
+ int tmp;
+
+ png_ptr->zbuf[0] = (png_byte)z_cmf;
+ tmp = png_ptr->zbuf[1] & 0xe0;
+ tmp += 0x1f - ((z_cmf << 8) + tmp) % 0x1f;
+ png_ptr->zbuf[1] = (png_byte)tmp;
+ }
+ }
+
+ else
+ png_error(png_ptr,
+ "Invalid zlib compression method or flags in non-IDAT chunk");
+ }
+#endif /* PNG_WRITE_OPTIMIZE_CMF_SUPPORTED */
+
/* Write saved output buffers, if any */
for (i = 0; i < comp->num_output_ptr; i++)
{
@@ -436,10 +665,9 @@ png_write_compressed_data_out(png_structp png_ptr, compression_state *comp)
(png_size_t)(png_ptr->zbuf_size - png_ptr->zstream.avail_out));
/* Reset zlib for another zTXt/iTXt or image data */
- deflateReset(&png_ptr->zstream);
- png_ptr->zstream.data_type = Z_BINARY;
+ png_zlib_release(png_ptr);
}
-#endif
+#endif /* PNG_WRITE_COMPRESSED_TEXT_SUPPORTED */
/* Write the IHDR chunk, and update the png_struct with the necessary
* information. Note that the rest of this code depends upon this
@@ -450,9 +678,6 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height,
int bit_depth, int color_type, int compression_type, int filter_type,
int interlace_type)
{
- PNG_IHDR;
- int ret;
-
png_byte buf[13]; /* Buffer to store the IHDR info */
png_debug(1, "in png_write_IHDR");
@@ -594,7 +819,7 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height,
buf[12] = (png_byte)interlace_type;
/* Write the chunk */
- png_write_chunk(png_ptr, png_IHDR, buf, (png_size_t)13);
+ png_write_complete_chunk(png_ptr, png_IHDR, buf, (png_size_t)13);
/* Initialize zlib with PNG info */
png_ptr->zstream.zalloc = png_zalloc;
@@ -632,35 +857,35 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height,
if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_METHOD))
png_ptr->zlib_method = 8;
- ret = deflateInit2(&png_ptr->zstream, png_ptr->zlib_level,
- png_ptr->zlib_method, png_ptr->zlib_window_bits,
- png_ptr->zlib_mem_level, png_ptr->zlib_strategy);
+#ifdef PNG_WRITE_COMPRESSED_TEXT_SUPPORTED
+#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED
+ if (!(png_ptr->flags & PNG_FLAG_ZTXT_CUSTOM_STRATEGY))
+ png_ptr->zlib_text_strategy = Z_DEFAULT_STRATEGY;
- if (ret != Z_OK)
- {
- if (ret == Z_VERSION_ERROR)
- png_error(png_ptr,
- "zlib failed to initialize compressor -- version error");
+ if (!(png_ptr->flags & PNG_FLAG_ZTXT_CUSTOM_LEVEL))
+ png_ptr->zlib_text_level = png_ptr->zlib_level;
- if (ret == Z_STREAM_ERROR)
- png_error(png_ptr,
- "zlib failed to initialize compressor -- stream error");
-
- if (ret == Z_MEM_ERROR)
- png_error(png_ptr,
- "zlib failed to initialize compressor -- mem error");
+ if (!(png_ptr->flags & PNG_FLAG_ZTXT_CUSTOM_MEM_LEVEL))
+ png_ptr->zlib_text_mem_level = png_ptr->zlib_mem_level;
- png_error(png_ptr, "zlib failed to initialize compressor");
- }
+ if (!(png_ptr->flags & PNG_FLAG_ZTXT_CUSTOM_WINDOW_BITS))
+ png_ptr->zlib_text_window_bits = png_ptr->zlib_window_bits;
- png_ptr->zstream.next_out = png_ptr->zbuf;
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
- /* libpng is not interested in zstream.data_type, so set it
- * to a predefined value, to avoid its evaluation inside zlib
- */
- png_ptr->zstream.data_type = Z_BINARY;
-
- png_ptr->mode = PNG_HAVE_IHDR;
+ if (!(png_ptr->flags & PNG_FLAG_ZTXT_CUSTOM_METHOD))
+ png_ptr->zlib_text_method = png_ptr->zlib_method;
+#else
+ png_ptr->zlib_text_strategy = Z_DEFAULT_STRATEGY;
+ png_ptr->zlib_text_level = png_ptr->zlib_level;
+ png_ptr->zlib_text_mem_level = png_ptr->zlib_mem_level;
+ png_ptr->zlib_text_window_bits = png_ptr->zlib_window_bits;
+ png_ptr->zlib_text_method = png_ptr->zlib_method;
+#endif /* PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED */
+#endif /* PNG_WRITE_COMPRESSED_TEXT_SUPPORTED */
+
+ /* Record that the compressor has not yet been initialized. */
+ png_ptr->zlib_state = PNG_ZLIB_UNINITIALIZED;
+
+ png_ptr->mode = PNG_HAVE_IHDR; /* not READY_FOR_ZTXT */
}
/* Write the palette. We are careful not to trust png_color to be in the
@@ -671,7 +896,6 @@ void /* PRIVATE */
png_write_PLTE(png_structp png_ptr, png_const_colorp palette,
png_uint_32 num_pal)
{
- PNG_PLTE;
png_uint_32 i;
png_const_colorp pal_ptr;
png_byte buf[3];
@@ -707,7 +931,7 @@ png_write_PLTE(png_structp png_ptr, png_const_colorp palette,
png_ptr->num_palette = (png_uint_16)num_pal;
png_debug1(3, "num_palette = %d", png_ptr->num_palette);
- png_write_chunk_start(png_ptr, png_PLTE, (png_uint_32)(num_pal * 3));
+ png_write_chunk_header(png_ptr, png_PLTE, (png_uint_32)(num_pal * 3));
#ifdef PNG_POINTER_INDEXING_SUPPORTED
for (i = 0, pal_ptr = palette; i < num_pal; i++, pal_ptr++)
@@ -741,16 +965,17 @@ png_write_PLTE(png_structp png_ptr, png_const_colorp palette,
void /* PRIVATE */
png_write_IDAT(png_structp png_ptr, png_bytep data, png_size_t length)
{
- PNG_IDAT;
-
png_debug(1, "in png_write_IDAT");
- /* Optimize the CMF field in the zlib stream. */
- /* This hack of the zlib stream is compliant to the stream specification. */
+#ifdef PNG_WRITE_OPTIMIZE_CMF_SUPPORTED
if (!(png_ptr->mode & PNG_HAVE_IDAT) &&
png_ptr->compression_type == PNG_COMPRESSION_TYPE_BASE)
{
+ /* Optimize the CMF field in the zlib stream. This hack of the zlib
+ * stream is compliant to the stream specification.
+ */
unsigned int z_cmf = data[0]; /* zlib compression method and flags */
+
if ((z_cmf & 0x0f) == 8 && (z_cmf & 0xf0) <= 0x70)
{
/* Avoid memory underflows and multiplication overflows.
@@ -761,11 +986,29 @@ png_write_IDAT(png_structp png_ptr, png_bytep data, png_size_t length)
if (length >= 2 &&
png_ptr->height < 16384 && png_ptr->width < 16384)
{
+ /* Compute the maximum possible length of the datastream */
+
+ /* Number of pixels, plus for each row a filter byte
+ * and possibly a padding byte, so increase the maximum
+ * size to account for these.
+ */
+ unsigned int z_cinfo;
+ unsigned int half_z_window_size;
png_uint_32 uncompressed_idat_size = png_ptr->height *
((png_ptr->width *
png_ptr->channels * png_ptr->bit_depth + 15) >> 3);
- unsigned int z_cinfo = z_cmf >> 4;
- unsigned int half_z_window_size = 1 << (z_cinfo + 7);
+
+ /* If it's interlaced, each block of 8 rows is sent as up to
+ * 14 rows, i.e., 6 additional rows, each with a filter byte
+ * and possibly a padding byte
+ */
+ if (png_ptr->interlaced)
+ uncompressed_idat_size += ((png_ptr->height + 7)/8) *
+ (png_ptr->bit_depth < 8 ? 12 : 6);
+
+ z_cinfo = z_cmf >> 4;
+ half_z_window_size = 1 << (z_cinfo + 7);
+
while (uncompressed_idat_size <= half_z_window_size &&
half_z_window_size >= 256)
{
@@ -790,20 +1033,26 @@ png_write_IDAT(png_structp png_ptr, png_bytep data, png_size_t length)
png_error(png_ptr,
"Invalid zlib compression method or flags in IDAT");
}
+#endif /* PNG_WRITE_OPTIMIZE_CMF_SUPPORTED */
- png_write_chunk(png_ptr, png_IDAT, data, length);
+ png_write_complete_chunk(png_ptr, png_IDAT, data, length);
png_ptr->mode |= PNG_HAVE_IDAT;
+
+ /* Prior to 1.5.4 this code was replicated in every caller (except at the
+ * end, where it isn't technically necessary). Since this function has
+ * flushed the data we can safely reset the zlib output buffer here.
+ */
+ png_ptr->zstream.next_out = png_ptr->zbuf;
+ png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
}
/* Write an IEND chunk */
void /* PRIVATE */
png_write_IEND(png_structp png_ptr)
{
- PNG_IEND;
-
png_debug(1, "in png_write_IEND");
- png_write_chunk(png_ptr, png_IEND, NULL, (png_size_t)0);
+ png_write_complete_chunk(png_ptr, png_IEND, NULL, (png_size_t)0);
png_ptr->mode |= PNG_HAVE_IEND;
}
@@ -812,14 +1061,13 @@ png_write_IEND(png_structp png_ptr)
void /* PRIVATE */
png_write_gAMA_fixed(png_structp png_ptr, png_fixed_point file_gamma)
{
- PNG_gAMA;
png_byte buf[4];
png_debug(1, "in png_write_gAMA");
/* file_gamma is saved in 1/100,000ths */
png_save_uint_32(buf, (png_uint_32)file_gamma);
- png_write_chunk(png_ptr, png_gAMA, buf, (png_size_t)4);
+ png_write_complete_chunk(png_ptr, png_gAMA, buf, (png_size_t)4);
}
#endif
@@ -828,7 +1076,6 @@ png_write_gAMA_fixed(png_structp png_ptr, png_fixed_point file_gamma)
void /* PRIVATE */
png_write_sRGB(png_structp png_ptr, int srgb_intent)
{
- PNG_sRGB;
png_byte buf[1];
png_debug(1, "in png_write_sRGB");
@@ -838,7 +1085,7 @@ png_write_sRGB(png_structp png_ptr, int srgb_intent)
"Invalid sRGB rendering intent specified");
buf[0]=(png_byte)srgb_intent;
- png_write_chunk(png_ptr, png_sRGB, buf, (png_size_t)1);
+ png_write_complete_chunk(png_ptr, png_sRGB, buf, (png_size_t)1);
}
#endif
@@ -848,7 +1095,6 @@ void /* PRIVATE */
png_write_iCCP(png_structp png_ptr, png_const_charp name, int compression_type,
png_const_charp profile, int profile_len)
{
- PNG_iCCP;
png_size_t name_len;
png_charp new_name;
compression_state comp;
@@ -909,7 +1155,7 @@ png_write_iCCP(png_structp png_ptr, png_const_charp name, int compression_type,
(png_size_t)profile_len, PNG_COMPRESSION_TYPE_BASE, &comp);
/* Make sure we include the NULL after the name and the compression type */
- png_write_chunk_start(png_ptr, png_iCCP,
+ png_write_chunk_header(png_ptr, png_iCCP,
(png_uint_32)(name_len + profile_len + 2));
new_name[name_len + 1] = 0x00;
@@ -918,7 +1164,9 @@ png_write_iCCP(png_structp png_ptr, png_const_charp name, int compression_type,
(png_size_t)(name_len + 2));
if (profile_len)
- png_write_compressed_data_out(png_ptr, &comp);
+ {
+ png_write_compressed_data_out(png_ptr, &comp, profile_len);
+ }
png_write_chunk_end(png_ptr);
png_free(png_ptr, new_name);
@@ -930,7 +1178,6 @@ png_write_iCCP(png_structp png_ptr, png_const_charp name, int compression_type,
void /* PRIVATE */
png_write_sPLT(png_structp png_ptr, png_const_sPLT_tp spalette)
{
- PNG_sPLT;
png_size_t name_len;
png_charp new_name;
png_byte entrybuf[10];
@@ -947,7 +1194,7 @@ png_write_sPLT(png_structp png_ptr, png_const_sPLT_tp spalette)
return;
/* Make sure we include the NULL after the name */
- png_write_chunk_start(png_ptr, png_sPLT,
+ png_write_chunk_header(png_ptr, png_sPLT,
(png_uint_32)(name_len + 2 + palette_size));
png_write_chunk_data(png_ptr, (png_bytep)new_name,
@@ -1015,7 +1262,6 @@ png_write_sPLT(png_structp png_ptr, png_const_sPLT_tp spalette)
void /* PRIVATE */
png_write_sBIT(png_structp png_ptr, png_const_color_8p sbit, int color_type)
{
- PNG_sBIT;
png_byte buf[4];
png_size_t size;
@@ -1066,7 +1312,7 @@ png_write_sBIT(png_structp png_ptr, png_const_color_8p sbit, int color_type)
buf[size++] = sbit->alpha;
}
- png_write_chunk(png_ptr, png_sBIT, buf, size);
+ png_write_complete_chunk(png_ptr, png_sBIT, buf, size);
}
#endif
@@ -1078,7 +1324,6 @@ png_write_cHRM_fixed(png_structp png_ptr, png_fixed_point white_x,
png_fixed_point green_x, png_fixed_point green_y, png_fixed_point blue_x,
png_fixed_point blue_y)
{
- PNG_cHRM;
png_byte buf[32];
png_debug(1, "in png_write_cHRM");
@@ -1101,7 +1346,7 @@ png_write_cHRM_fixed(png_structp png_ptr, png_fixed_point white_x,
png_save_uint_32(buf + 24, (png_uint_32)blue_x);
png_save_uint_32(buf + 28, (png_uint_32)blue_y);
- png_write_chunk(png_ptr, png_cHRM, buf, (png_size_t)32);
+ png_write_complete_chunk(png_ptr, png_cHRM, buf, (png_size_t)32);
}
}
#endif
@@ -1112,7 +1357,6 @@ void /* PRIVATE */
png_write_tRNS(png_structp png_ptr, png_const_bytep trans_alpha,
png_const_color_16p tran, int num_trans, int color_type)
{
- PNG_tRNS;
png_byte buf[6];
png_debug(1, "in png_write_tRNS");
@@ -1126,7 +1370,7 @@ png_write_tRNS(png_structp png_ptr, png_const_bytep trans_alpha,
}
/* Write the chunk out as it is */
- png_write_chunk(png_ptr, png_tRNS, trans_alpha, (png_size_t)num_trans);
+ png_write_complete_chunk(png_ptr, png_tRNS, trans_alpha, (png_size_t)num_trans);
}
else if (color_type == PNG_COLOR_TYPE_GRAY)
@@ -1141,7 +1385,7 @@ png_write_tRNS(png_structp png_ptr, png_const_bytep trans_alpha,
}
png_save_uint_16(buf, tran->gray);
- png_write_chunk(png_ptr, png_tRNS, buf, (png_size_t)2);
+ png_write_complete_chunk(png_ptr, png_tRNS, buf, (png_size_t)2);
}
else if (color_type == PNG_COLOR_TYPE_RGB)
@@ -1161,7 +1405,7 @@ png_write_tRNS(png_structp png_ptr, png_const_bytep trans_alpha,
return;
}
- png_write_chunk(png_ptr, png_tRNS, buf, (png_size_t)6);
+ png_write_complete_chunk(png_ptr, png_tRNS, buf, (png_size_t)6);
}
else
@@ -1176,7 +1420,6 @@ png_write_tRNS(png_structp png_ptr, png_const_bytep trans_alpha,
void /* PRIVATE */
png_write_bKGD(png_structp png_ptr, png_const_color_16p back, int color_type)
{
- PNG_bKGD;
png_byte buf[6];
png_debug(1, "in png_write_bKGD");
@@ -1195,7 +1438,7 @@ png_write_bKGD(png_structp png_ptr, png_const_color_16p back, int color_type)
}
buf[0] = back->index;
- png_write_chunk(png_ptr, png_bKGD, buf, (png_size_t)1);
+ png_write_complete_chunk(png_ptr, png_bKGD, buf, (png_size_t)1);
}
else if (color_type & PNG_COLOR_MASK_COLOR)
@@ -1215,7 +1458,7 @@ png_write_bKGD(png_structp png_ptr, png_const_color_16p back, int color_type)
return;
}
- png_write_chunk(png_ptr, png_bKGD, buf, (png_size_t)6);
+ png_write_complete_chunk(png_ptr, png_bKGD, buf, (png_size_t)6);
}
else
@@ -1229,7 +1472,7 @@ png_write_bKGD(png_structp png_ptr, png_const_color_16p back, int color_type)
}
png_save_uint_16(buf, back->gray);
- png_write_chunk(png_ptr, png_bKGD, buf, (png_size_t)2);
+ png_write_complete_chunk(png_ptr, png_bKGD, buf, (png_size_t)2);
}
}
#endif
@@ -1239,7 +1482,6 @@ png_write_bKGD(png_structp png_ptr, png_const_color_16p back, int color_type)
void /* PRIVATE */
png_write_hIST(png_structp png_ptr, png_const_uint_16p hist, int num_hist)
{
- PNG_hIST;
int i;
png_byte buf[3];
@@ -1254,7 +1496,7 @@ png_write_hIST(png_structp png_ptr, png_const_uint_16p hist, int num_hist)
return;
}
- png_write_chunk_start(png_ptr, png_hIST, (png_uint_32)(num_hist * 2));
+ png_write_chunk_header(png_ptr, png_hIST, (png_uint_32)(num_hist * 2));
for (i = 0; i < num_hist; i++)
{
@@ -1313,15 +1555,11 @@ png_check_keyword(png_structp png_ptr, png_const_charp key, png_charpp new_key)
if ((png_byte)*ikp < 0x20 ||
((png_byte)*ikp > 0x7E && (png_byte)*ikp < 0xA1))
{
-#ifdef PNG_CONSOLE_IO_SUPPORTED
- char msg[40];
+ PNG_WARNING_PARAMETERS(p)
- png_snprintf(msg, 40,
- "invalid keyword character 0x%02X", (png_byte)*ikp);
- png_warning(png_ptr, msg);
-#else
- png_warning(png_ptr, "invalid character in keyword");
-#endif
+ png_warning_parameter_unsigned(p, 1, PNG_NUMBER_FORMAT_02x,
+ (png_byte)*ikp);
+ png_formatted_warning(png_ptr, p, "invalid keyword character 0x@1");
*dp = ' ';
}
@@ -1408,7 +1646,6 @@ void /* PRIVATE */
png_write_tEXt(png_structp png_ptr, png_const_charp key, png_const_charp text,
png_size_t text_len)
{
- PNG_tEXt;
png_size_t key_len;
png_charp new_key;
@@ -1424,7 +1661,7 @@ png_write_tEXt(png_structp png_ptr, png_const_charp key, png_const_charp text,
text_len = png_strlen(text);
/* Make sure we include the 0 after the key */
- png_write_chunk_start(png_ptr, png_tEXt,
+ png_write_chunk_header(png_ptr, png_tEXt,
(png_uint_32)(key_len + text_len + 1));
/*
* We leave it to the application to meet PNG-1.0 requirements on the
@@ -1450,7 +1687,6 @@ void /* PRIVATE */
png_write_zTXt(png_structp png_ptr, png_const_charp key, png_const_charp text,
png_size_t text_len, int compression)
{
- PNG_zTXt;
png_size_t key_len;
png_byte buf;
png_charp new_key;
@@ -1484,7 +1720,7 @@ png_write_zTXt(png_structp png_ptr, png_const_charp key, png_const_charp text,
&comp);
/* Write start of chunk */
- png_write_chunk_start(png_ptr, png_zTXt,
+ png_write_chunk_header(png_ptr, png_zTXt,
(png_uint_32)(key_len+text_len + 2));
/* Write key */
@@ -1499,7 +1735,7 @@ png_write_zTXt(png_structp png_ptr, png_const_charp key, png_const_charp text,
png_write_chunk_data(png_ptr, &buf, (png_size_t)1);
/* Write the compressed data */
- png_write_compressed_data_out(png_ptr, &comp);
+ png_write_compressed_data_out(png_ptr, &comp, text_len);
/* Close the chunk */
png_write_chunk_end(png_ptr);
@@ -1512,7 +1748,6 @@ void /* PRIVATE */
png_write_iTXt(png_structp png_ptr, int compression, png_const_charp key,
png_const_charp lang, png_const_charp lang_key, png_const_charp text)
{
- PNG_iTXt;
png_size_t lang_len, key_len, lang_key_len, text_len;
png_charp new_lang;
png_charp new_key = NULL;
@@ -1557,7 +1792,7 @@ png_write_iTXt(png_structp png_ptr, int compression, png_const_charp key,
* and the NULs after the key, lang, and lang_key parts
*/
- png_write_chunk_start(png_ptr, png_iTXt, (png_uint_32)(
+ png_write_chunk_header(png_ptr, png_iTXt, (png_uint_32)(
5 /* comp byte, comp flag, terminators for key, lang and lang_key */
+ key_len
+ lang_len
@@ -1591,7 +1826,7 @@ png_write_iTXt(png_structp png_ptr, int compression, png_const_charp key,
png_write_chunk_data(png_ptr, (lang_key ? (png_const_bytep)lang_key : cbuf),
(png_size_t)(lang_key_len + 1));
- png_write_compressed_data_out(png_ptr, &comp);
+ png_write_compressed_data_out(png_ptr, &comp, text_len);
png_write_chunk_end(png_ptr);
@@ -1606,7 +1841,6 @@ void /* PRIVATE */
png_write_oFFs(png_structp png_ptr, png_int_32 x_offset, png_int_32 y_offset,
int unit_type)
{
- PNG_oFFs;
png_byte buf[9];
png_debug(1, "in png_write_oFFs");
@@ -1618,7 +1852,7 @@ png_write_oFFs(png_structp png_ptr, png_int_32 x_offset, png_int_32 y_offset,
png_save_int_32(buf + 4, y_offset);
buf[8] = (png_byte)unit_type;
- png_write_chunk(png_ptr, png_oFFs, buf, (png_size_t)9);
+ png_write_complete_chunk(png_ptr, png_oFFs, buf, (png_size_t)9);
}
#endif
#ifdef PNG_WRITE_pCAL_SUPPORTED
@@ -1628,9 +1862,8 @@ png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0,
png_int_32 X1, int type, int nparams, png_const_charp units,
png_charpp params)
{
- PNG_pCAL;
png_size_t purpose_len, units_len, total_len;
- png_uint_32p params_len;
+ png_size_tp params_len;
png_byte buf[10];
png_charp new_purpose;
int i;
@@ -1646,8 +1879,8 @@ png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0,
png_debug1(3, "pCAL units length = %d", (int)units_len);
total_len = purpose_len + units_len + 10;
- params_len = (png_uint_32p)png_malloc(png_ptr,
- (png_alloc_size_t)(nparams * png_sizeof(png_uint_32)));
+ params_len = (png_size_tp)png_malloc(png_ptr,
+ (png_alloc_size_t)(nparams * png_sizeof(png_size_t)));
/* Find the length of each parameter, making sure we don't count the
* null terminator for the last parameter.
@@ -1657,13 +1890,12 @@ png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0,
params_len[i] = png_strlen(params[i]) + (i == nparams - 1 ? 0 : 1);
png_debug2(3, "pCAL parameter %d length = %lu", i,
(unsigned long)params_len[i]);
- total_len += (png_size_t)params_len[i];
+ total_len += params_len[i];
}
png_debug1(3, "pCAL total length = %d", (int)total_len);
- png_write_chunk_start(png_ptr, png_pCAL, (png_uint_32)total_len);
- png_write_chunk_data(png_ptr, (png_const_bytep)new_purpose,
- (png_size_t)purpose_len);
+ png_write_chunk_header(png_ptr, png_pCAL, (png_uint_32)total_len);
+ png_write_chunk_data(png_ptr, (png_const_bytep)new_purpose, purpose_len);
png_save_int_32(buf, X0);
png_save_int_32(buf + 4, X1);
buf[8] = (png_byte)type;
@@ -1675,8 +1907,7 @@ png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0,
for (i = 0; i < nparams; i++)
{
- png_write_chunk_data(png_ptr, (png_const_bytep)params[i],
- (png_size_t)params_len[i]);
+ png_write_chunk_data(png_ptr, (png_const_bytep)params[i], params_len[i]);
}
png_free(png_ptr, params_len);
@@ -1690,7 +1921,6 @@ void /* PRIVATE */
png_write_sCAL_s(png_structp png_ptr, int unit, png_const_charp width,
png_const_charp height)
{
- PNG_sCAL;
png_byte buf[64];
png_size_t wlen, hlen, total_len;
@@ -1711,7 +1941,7 @@ png_write_sCAL_s(png_structp png_ptr, int unit, png_const_charp width,
png_memcpy(buf + wlen + 2, height, hlen); /* Do NOT append the '\0' here */
png_debug1(3, "sCAL total length = %u", (unsigned int)total_len);
- png_write_chunk(png_ptr, png_sCAL, buf, total_len);
+ png_write_complete_chunk(png_ptr, png_sCAL, buf, total_len);
}
#endif
@@ -1722,7 +1952,6 @@ png_write_pHYs(png_structp png_ptr, png_uint_32 x_pixels_per_unit,
png_uint_32 y_pixels_per_unit,
int unit_type)
{
- PNG_pHYs;
png_byte buf[9];
png_debug(1, "in png_write_pHYs");
@@ -1734,7 +1963,7 @@ png_write_pHYs(png_structp png_ptr, png_uint_32 x_pixels_per_unit,
png_save_uint_32(buf + 4, y_pixels_per_unit);
buf[8] = (png_byte)unit_type;
- png_write_chunk(png_ptr, png_pHYs, buf, (png_size_t)9);
+ png_write_complete_chunk(png_ptr, png_pHYs, buf, (png_size_t)9);
}
#endif
@@ -1745,7 +1974,6 @@ png_write_pHYs(png_structp png_ptr, png_uint_32 x_pixels_per_unit,
void /* PRIVATE */
png_write_tIME(png_structp png_ptr, png_const_timep mod_time)
{
- PNG_tIME;
png_byte buf[7];
png_debug(1, "in png_write_tIME");
@@ -1765,7 +1993,7 @@ png_write_tIME(png_structp png_ptr, png_const_timep mod_time)
buf[5] = mod_time->minute;
buf[6] = mod_time->second;
- png_write_chunk(png_ptr, png_tIME, buf, (png_size_t)7);
+ png_write_complete_chunk(png_ptr, png_tIME, buf, (png_size_t)7);
}
#endif
@@ -1777,28 +2005,32 @@ png_write_start_row(png_structp png_ptr)
/* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
/* Start of interlace block */
- int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
+ static PNG_CONST png_byte png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
/* Offset to next interlace block */
- int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
+ static PNG_CONST png_byte png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
/* Start of interlace block in the y direction */
- int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};
+ static PNG_CONST png_byte png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};
/* Offset to next interlace block in the y direction */
- int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
+ static PNG_CONST png_byte png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
#endif
- png_size_t buf_size;
+ png_alloc_size_t buf_size;
+ int usr_pixel_depth;
png_debug(1, "in png_write_start_row");
- buf_size = (png_size_t)(PNG_ROWBYTES(
- png_ptr->usr_channels*png_ptr->usr_bit_depth, png_ptr->width) + 1);
+ usr_pixel_depth = png_ptr->usr_channels * png_ptr->usr_bit_depth;
+ buf_size = PNG_ROWBYTES(usr_pixel_depth, png_ptr->width) + 1;
+
+ /* 1.5.6: added to allow checking in the row write code. */
+ png_ptr->transformed_pixel_depth = png_ptr->pixel_depth;
+ png_ptr->maximum_pixel_depth = (png_byte)usr_pixel_depth;
/* Set up row buffer */
- png_ptr->row_buf = (png_bytep)png_malloc(png_ptr,
- (png_alloc_size_t)buf_size);
+ png_ptr->row_buf = (png_bytep)png_malloc(png_ptr, buf_size);
png_ptr->row_buf[0] = PNG_FILTER_VALUE_NONE;
@@ -1815,8 +2047,7 @@ png_write_start_row(png_structp png_ptr)
if (png_ptr->do_filter & (PNG_FILTER_AVG | PNG_FILTER_UP | PNG_FILTER_PAETH))
{
/* Set up previous row buffer */
- png_ptr->prev_row = (png_bytep)png_calloc(png_ptr,
- (png_alloc_size_t)buf_size);
+ png_ptr->prev_row = (png_bytep)png_calloc(png_ptr, buf_size);
if (png_ptr->do_filter & PNG_FILTER_UP)
{
@@ -1871,6 +2102,7 @@ png_write_start_row(png_structp png_ptr)
png_ptr->usr_width = png_ptr->width;
}
+ png_zlib_claim(png_ptr, PNG_ZLIB_FOR_IDAT);
png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
png_ptr->zstream.next_out = png_ptr->zbuf;
}
@@ -1883,16 +2115,16 @@ png_write_finish_row(png_structp png_ptr)
/* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
/* Start of interlace block */
- int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
+ static PNG_CONST png_byte png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
/* Offset to next interlace block */
- int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
+ static PNG_CONST png_byte png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
/* Start of interlace block in the y direction */
- int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};
+ static PNG_CONST png_byte png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};
/* Offset to next interlace block in the y direction */
- int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
+ static PNG_CONST png_byte png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
#endif
int ret;
@@ -1992,7 +2224,7 @@ png_write_finish_row(png_structp png_ptr)
png_ptr->zstream.avail_out);
}
- deflateReset(&png_ptr->zstream);
+ png_zlib_release(png_ptr);
png_ptr->zstream.data_type = Z_BINARY;
}
@@ -2010,10 +2242,10 @@ png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass)
/* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
/* Start of interlace block */
- int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
+ static PNG_CONST png_byte png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
/* Offset to next interlace block */
- int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
+ static PNG_CONST png_byte png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
png_debug(1, "in png_do_write_interlace");
@@ -2181,6 +2413,9 @@ png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass)
* been specified by the application, and then writes the row out with the
* chosen filter.
*/
+static void png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row,
+ png_size_t row_bytes);
+
#define PNG_MAXSUM (((png_uint_32)(-1)) >> 1)
#define PNG_HISHIFT 10
#define PNG_LOMASK ((png_uint_32)0xffffL)
@@ -2195,7 +2430,7 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
png_byte filter_to_do = png_ptr->do_filter;
png_size_t row_bytes = row_info->rowbytes;
#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
- int num_p_filters = (int)png_ptr->num_prev_filters;
+ int num_p_filters = png_ptr->num_prev_filters;
#endif
png_debug(1, "in png_write_find_filter");
@@ -2832,9 +3067,9 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
}
}
#endif /* PNG_WRITE_FILTER_SUPPORTED */
- /* Do the actual writing of the filtered row data from the chosen filter. */
- png_write_filtered_row(png_ptr, best_row);
+ /* Do the actual writing of the filtered row data from the chosen filter. */
+ png_write_filtered_row(png_ptr, best_row, row_info->rowbytes+1);
#ifdef PNG_WRITE_FILTER_SUPPORTED
#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
@@ -2856,11 +3091,10 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
/* Do the actual writing of a previously filtered row. */
-void /* PRIVATE */
-png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row)
+static void
+png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row,
+ png_size_t avail/*includes filter byte*/)
{
- png_size_t avail;
-
png_debug(1, "in png_write_filtered_row");
png_debug1(2, "filter = %d", filtered_row[0]);
@@ -2868,7 +3102,6 @@ png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row)
png_ptr->zstream.next_in = filtered_row;
png_ptr->zstream.avail_in = 0;
- avail = png_ptr->row_info.rowbytes + 1;
/* Repeat until we have compressed all the data */
do
{
@@ -2916,8 +3149,6 @@ png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row)
{
/* Write the IDAT and reset the zlib output buffer */
png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size);
- png_ptr->zstream.next_out = png_ptr->zbuf;
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
}
/* Repeat until all data has been compressed */
} while (avail > 0 || png_ptr->zstream.avail_in > 0);
diff --git a/src/3rdparty/zlib/gzguts.h b/src/3rdparty/zlib/gzguts.h
index 26b4d37c1d..9e4368e889 100644
--- a/src/3rdparty/zlib/gzguts.h
+++ b/src/3rdparty/zlib/gzguts.h
@@ -4,8 +4,12 @@
*/
#ifdef _MSC_VER
-# define _CRT_SECURE_NO_DEPRECATE
-# define _CRT_NONSTDC_NO_DEPRECATE
+# ifndef _CRT_SECURE_NO_DEPRECATE
+# define _CRT_SECURE_NO_DEPRECATE
+# endif
+# ifndef _CRT_NONSTDC_NO_DEPRECATE
+# define _CRT_NONSTDC_NO_DEPRECATE
+# endif
#endif
#ifdef _LARGEFILE64_SOURCE
diff --git a/src/concurrent/qfuturewatcher.cpp b/src/concurrent/qfuturewatcher.cpp
index d3a1122a07..9153fe5d40 100644
--- a/src/concurrent/qfuturewatcher.cpp
+++ b/src/concurrent/qfuturewatcher.cpp
@@ -45,6 +45,7 @@
#include <QtCore/qcoreevent.h>
#include <QtCore/qcoreapplication.h>
+#include <QtCore/qmetaobject.h>
#include <QtCore/qthread.h>
#include "qfuturewatcher_p.h"
@@ -354,13 +355,15 @@ void QFutureWatcherBase::setPendingResultsLimit(int limit)
d->maximumPendingResultsReady = limit;
}
-void QFutureWatcherBase::connectNotify(const char * signal)
+void QFutureWatcherBase::connectNotify(const QMetaMethod &signal)
{
Q_D(QFutureWatcherBase);
- if (qstrcmp(signal, SIGNAL(resultReadyAt(int))) == 0)
+ static const QMetaMethod resultReadyAtSignal = QMetaMethod::fromSignal(&QFutureWatcherBase::resultReadyAt);
+ if (signal == resultReadyAtSignal)
d->resultAtConnected.ref();
#ifndef QT_NO_DEBUG
- if (qstrcmp(signal, SIGNAL(finished())) == 0) {
+ static const QMetaMethod finishedSignal = QMetaMethod::fromSignal(&QFutureWatcherBase::finished);
+ if (signal == finishedSignal) {
if (futureInterface().isRunning()) {
//connections should be established before calling stFuture to avoid race.
// (The future could finish before the connection is made.)
@@ -370,10 +373,11 @@ void QFutureWatcherBase::connectNotify(const char * signal)
#endif
}
-void QFutureWatcherBase::disconnectNotify(const char * signal)
+void QFutureWatcherBase::disconnectNotify(const QMetaMethod &signal)
{
Q_D(QFutureWatcherBase);
- if (qstrcmp(signal, SIGNAL(resultReadyAt(int))) == 0)
+ static const QMetaMethod resultReadyAtSignal = QMetaMethod::fromSignal(&QFutureWatcherBase::resultReadyAt);
+ if (signal == resultReadyAtSignal)
d->resultAtConnected.deref();
}
diff --git a/src/concurrent/qfuturewatcher.h b/src/concurrent/qfuturewatcher.h
index 439a25d844..c05f58e3de 100644
--- a/src/concurrent/qfuturewatcher.h
+++ b/src/concurrent/qfuturewatcher.h
@@ -102,8 +102,8 @@ public Q_SLOTS:
void togglePaused();
protected:
- void connectNotify (const char * signal);
- void disconnectNotify (const char * signal);
+ void connectNotify (const QMetaMethod &signal);
+ void disconnectNotify (const QMetaMethod &signal);
// called from setFuture() implemented in template sub-classes
void connectOutputInterface();
diff --git a/src/corelib/arch/qatomic_sparc.h b/src/corelib/arch/qatomic_sparc.h
index 63282290c1..f5c0b3ec22 100644
--- a/src/corelib/arch/qatomic_sparc.h
+++ b/src/corelib/arch/qatomic_sparc.h
@@ -129,17 +129,17 @@ extern "C" {
Q_CORE_EXPORT int q_atomic_fetch_and_add_acquire_int(volatile int *ptr, int value);
Q_CORE_EXPORT int q_atomic_fetch_and_add_release_int(volatile int *ptr, int value);
- Q_CORE_EXPORT int q_atomic_test_and_set_ptr(volatile void *ptr, void *expected, void *newval);
+ Q_CORE_EXPORT int q_atomic_test_and_set_ptr(volatile void *ptr, const void *expected, const void *newval);
Q_CORE_EXPORT int q_atomic_test_and_set_acquire_ptr(volatile void *ptr,
- void *expected,
- void *newval);
+ const void *expected,
+ const void *newval);
Q_CORE_EXPORT int q_atomic_test_and_set_release_ptr(volatile void *ptr,
- void *expected,
- void *newval);
+ const void *expected,
+ const void *newval);
- Q_CORE_EXPORT void *q_atomic_set_ptr(volatile void *ptr, void *newval);
- Q_CORE_EXPORT void *q_atomic_fetch_and_store_acquire_ptr(volatile void *ptr, void *newval);
- Q_CORE_EXPORT void *q_atomic_fetch_and_store_release_ptr(volatile void *ptr, void *newval);
+ Q_CORE_EXPORT void *q_atomic_set_ptr(volatile void *ptr, const void *newval);
+ Q_CORE_EXPORT void *q_atomic_fetch_and_store_acquire_ptr(volatile void *ptr, const void *newval);
+ Q_CORE_EXPORT void *q_atomic_fetch_and_store_release_ptr(volatile void *ptr, const void *newval);
Q_CORE_EXPORT void *q_atomic_fetch_and_add_ptr(volatile void *ptr, int value);
Q_CORE_EXPORT void *q_atomic_fetch_and_add_acquire_ptr(volatile void *ptr, int value);
diff --git a/src/corelib/codecs/codecs.qdoc b/src/corelib/codecs/codecs.qdoc
index 669072f789..05714b2253 100644
--- a/src/corelib/codecs/codecs.qdoc
+++ b/src/corelib/codecs/codecs.qdoc
@@ -68,8 +68,8 @@
for Qt.
\legalese
- Copyright (C) 2000 Ming-Che Chuang \BR
- Copyright (C) 2002 James Su, Turbolinux Inc. \BR
+ Copyright (C) 2000 Ming-Che Chuang
+ Copyright (C) 2002 James Su, Turbolinux Inc.
Copyright (C) 2002 Anthony Fok, ThizLinux Laboratory Ltd.
Redistribution and use in source and binary forms, with or without
@@ -137,9 +137,9 @@
for the various Big5 CharMapML tables.
\legalese
- Copyright (C) 2000 Ming-Che Chuang \BR
- Copyright (C) 2001, 2002 James Su, Turbolinux Inc. \BR
- Copyright (C) 2002 WU Yi, HancomLinux Inc. \BR
+ Copyright (C) 2000 Ming-Che Chuang
+ Copyright (C) 2001, 2002 James Su, Turbolinux Inc.
+ Copyright (C) 2002 WU Yi, HancomLinux Inc.
Copyright (C) 2001, 2002 Anthony Fok, ThizLinux Laboratory Ltd.
Redistribution and use in source and binary forms, with or without
@@ -307,8 +307,8 @@
The copyright notice for their code follows:
\legalese
- Copyright (C) 2000 TurboLinux, Inc. Written by Justin Yu and Sean Chen. \BR
- Copyright (C) 2001, 2002 Turbolinux, Inc. Written by James Su. \BR
+ Copyright (C) 2000 TurboLinux, Inc. Written by Justin Yu and Sean Chen.
+ Copyright (C) 2001, 2002 Turbolinux, Inc. Written by James Su.
Copyright (C) 2001, 2002 ThizLinux Laboratory Ltd. Written by Anthony Fok.
Redistribution and use in source and binary forms, with or without
diff --git a/src/corelib/codecs/qtextcodec.cpp b/src/corelib/codecs/qtextcodec.cpp
index 784a75bcad..b7939f1f3e 100644
--- a/src/corelib/codecs/qtextcodec.cpp
+++ b/src/corelib/codecs/qtextcodec.cpp
@@ -818,13 +818,13 @@ QTextCodec::ConverterState::~ConverterState()
KOI8-R encoding, and want to convert it to Unicode. The simple way
to do it is like this:
- \snippet doc/src/snippets/code/src_corelib_codecs_qtextcodec.cpp 0
+ \snippet code/src_corelib_codecs_qtextcodec.cpp 0
After this, \c string holds the text converted to Unicode.
Converting a string from Unicode to the local encoding is just as
easy:
- \snippet doc/src/snippets/code/src_corelib_codecs_qtextcodec.cpp 1
+ \snippet code/src_corelib_codecs_qtextcodec.cpp 1
To read or write files in various encodings, use QTextStream and
its \l{QTextStream::setCodec()}{setCodec()} function. See the
@@ -841,7 +841,7 @@ QTextCodec::ConverterState::~ConverterState()
object for the codec and use this QTextDecoder for the whole
decoding process, as shown below:
- \snippet doc/src/snippets/code/src_corelib_codecs_qtextcodec.cpp 2
+ \snippet code/src_corelib_codecs_qtextcodec.cpp 2
The QTextDecoder object maintains state between chunks and therefore
works correctly even if a multi-byte character is split between
diff --git a/src/corelib/corelib.pro b/src/corelib/corelib.pro
index 40b42f4dbe..d98cebb672 100644
--- a/src/corelib/corelib.pro
+++ b/src/corelib/corelib.pro
@@ -30,9 +30,10 @@ include(codecs/codecs.pri)
include(statemachine/statemachine.pri)
include(mimetypes/mimetypes.pri)
include(xml/xml.pri)
+include(doc/doc.pri)
mac|darwin {
- contains(QT_CONFIG, coreservices) {
+ !ios {
LIBS_PRIVATE += -framework ApplicationServices
LIBS_PRIVATE += -framework CoreServices
LIBS_PRIVATE += -framework Foundation
diff --git a/src/corelib/doc/doc.pri b/src/corelib/doc/doc.pri
new file mode 100644
index 0000000000..ed970d7592
--- /dev/null
+++ b/src/corelib/doc/doc.pri
@@ -0,0 +1,3 @@
+qtPrepareTool(QDOC, qdoc)
+docs.commands += $$QDOC $$QT.core.sources/doc/qtcore.qdocconf
+QMAKE_EXTRA_TARGETS += docs
diff --git a/doc/src/images/abstract-connections.png b/src/corelib/doc/images/abstract-connections.png
index 18d2f4e3b7..18d2f4e3b7 100644
--- a/doc/src/images/abstract-connections.png
+++ b/src/corelib/doc/images/abstract-connections.png
Binary files differ
diff --git a/doc/src/images/brush-styles.png b/src/corelib/doc/images/brush-styles.png
index eecb006af1..eecb006af1 100644
--- a/doc/src/images/brush-styles.png
+++ b/src/corelib/doc/images/brush-styles.png
Binary files differ
diff --git a/doc/src/images/cursor-arrow.png b/src/corelib/doc/images/cursor-arrow.png
index a69ef4eb61..a69ef4eb61 100644
--- a/doc/src/images/cursor-arrow.png
+++ b/src/corelib/doc/images/cursor-arrow.png
Binary files differ
diff --git a/doc/src/images/cursor-busy.png b/src/corelib/doc/images/cursor-busy.png
index 53717e4992..53717e4992 100644
--- a/doc/src/images/cursor-busy.png
+++ b/src/corelib/doc/images/cursor-busy.png
Binary files differ
diff --git a/doc/src/images/cursor-closedhand.png b/src/corelib/doc/images/cursor-closedhand.png
index b78dd1dac5..b78dd1dac5 100644
--- a/doc/src/images/cursor-closedhand.png
+++ b/src/corelib/doc/images/cursor-closedhand.png
Binary files differ
diff --git a/doc/src/images/cursor-cross.png b/src/corelib/doc/images/cursor-cross.png
index fe38e74480..fe38e74480 100644
--- a/doc/src/images/cursor-cross.png
+++ b/src/corelib/doc/images/cursor-cross.png
Binary files differ
diff --git a/doc/src/images/cursor-forbidden.png b/src/corelib/doc/images/cursor-forbidden.png
index 2b08c4e2a3..2b08c4e2a3 100644
--- a/doc/src/images/cursor-forbidden.png
+++ b/src/corelib/doc/images/cursor-forbidden.png
Binary files differ
diff --git a/doc/src/images/cursor-hand.png b/src/corelib/doc/images/cursor-hand.png
index d2004aefa7..d2004aefa7 100644
--- a/doc/src/images/cursor-hand.png
+++ b/src/corelib/doc/images/cursor-hand.png
Binary files differ
diff --git a/doc/src/images/cursor-hsplit.png b/src/corelib/doc/images/cursor-hsplit.png
index a5667e3ffb..a5667e3ffb 100644
--- a/doc/src/images/cursor-hsplit.png
+++ b/src/corelib/doc/images/cursor-hsplit.png
Binary files differ
diff --git a/doc/src/images/cursor-ibeam.png b/src/corelib/doc/images/cursor-ibeam.png
index 097fc5fa72..097fc5fa72 100644
--- a/doc/src/images/cursor-ibeam.png
+++ b/src/corelib/doc/images/cursor-ibeam.png
Binary files differ
diff --git a/doc/src/images/cursor-openhand.png b/src/corelib/doc/images/cursor-openhand.png
index 9181c859ed..9181c859ed 100644
--- a/doc/src/images/cursor-openhand.png
+++ b/src/corelib/doc/images/cursor-openhand.png
Binary files differ
diff --git a/doc/src/images/cursor-sizeall.png b/src/corelib/doc/images/cursor-sizeall.png
index 69f13eb347..69f13eb347 100644
--- a/doc/src/images/cursor-sizeall.png
+++ b/src/corelib/doc/images/cursor-sizeall.png
Binary files differ
diff --git a/doc/src/images/cursor-sizeb.png b/src/corelib/doc/images/cursor-sizeb.png
index f37d7b91e8..f37d7b91e8 100644
--- a/doc/src/images/cursor-sizeb.png
+++ b/src/corelib/doc/images/cursor-sizeb.png
Binary files differ
diff --git a/doc/src/images/cursor-sizef.png b/src/corelib/doc/images/cursor-sizef.png
index 3b127a05d3..3b127a05d3 100644
--- a/doc/src/images/cursor-sizef.png
+++ b/src/corelib/doc/images/cursor-sizef.png
Binary files differ
diff --git a/doc/src/images/cursor-sizeh.png b/src/corelib/doc/images/cursor-sizeh.png
index a9f40cbc3d..a9f40cbc3d 100644
--- a/doc/src/images/cursor-sizeh.png
+++ b/src/corelib/doc/images/cursor-sizeh.png
Binary files differ
diff --git a/doc/src/images/cursor-sizev.png b/src/corelib/doc/images/cursor-sizev.png
index 1edbab27a5..1edbab27a5 100644
--- a/doc/src/images/cursor-sizev.png
+++ b/src/corelib/doc/images/cursor-sizev.png
Binary files differ
diff --git a/doc/src/images/cursor-uparrow.png b/src/corelib/doc/images/cursor-uparrow.png
index d3e70ef4c2..d3e70ef4c2 100644
--- a/doc/src/images/cursor-uparrow.png
+++ b/src/corelib/doc/images/cursor-uparrow.png
Binary files differ
diff --git a/doc/src/images/cursor-vsplit.png b/src/corelib/doc/images/cursor-vsplit.png
index 1beda2570e..1beda2570e 100644
--- a/doc/src/images/cursor-vsplit.png
+++ b/src/corelib/doc/images/cursor-vsplit.png
Binary files differ
diff --git a/doc/src/images/cursor-wait.png b/src/corelib/doc/images/cursor-wait.png
index 69056c479e..69056c479e 100644
--- a/doc/src/images/cursor-wait.png
+++ b/src/corelib/doc/images/cursor-wait.png
Binary files differ
diff --git a/doc/src/images/cursor-whatsthis.png b/src/corelib/doc/images/cursor-whatsthis.png
index b47601c378..b47601c378 100644
--- a/doc/src/images/cursor-whatsthis.png
+++ b/src/corelib/doc/images/cursor-whatsthis.png
Binary files differ
diff --git a/doc/src/images/javaiterators1.png b/src/corelib/doc/images/javaiterators1.png
index 7dfcde0188..7dfcde0188 100644
--- a/doc/src/images/javaiterators1.png
+++ b/src/corelib/doc/images/javaiterators1.png
Binary files differ
diff --git a/doc/src/images/javaiterators2.png b/src/corelib/doc/images/javaiterators2.png
index c04e3ccf88..c04e3ccf88 100644
--- a/doc/src/images/javaiterators2.png
+++ b/src/corelib/doc/images/javaiterators2.png
Binary files differ
diff --git a/doc/src/images/modelindex-no-parent.png b/src/corelib/doc/images/modelindex-no-parent.png
index 9c6258e5d1..9c6258e5d1 100644
--- a/doc/src/images/modelindex-no-parent.png
+++ b/src/corelib/doc/images/modelindex-no-parent.png
Binary files differ
diff --git a/doc/src/images/modelview-begin-append-columns.png b/src/corelib/doc/images/modelview-begin-append-columns.png
index 8d13b178d8..8d13b178d8 100644
--- a/doc/src/images/modelview-begin-append-columns.png
+++ b/src/corelib/doc/images/modelview-begin-append-columns.png
Binary files differ
diff --git a/doc/src/images/modelview-begin-append-rows.png b/src/corelib/doc/images/modelview-begin-append-rows.png
index 50d04c3e67..50d04c3e67 100644
--- a/doc/src/images/modelview-begin-append-rows.png
+++ b/src/corelib/doc/images/modelview-begin-append-rows.png
Binary files differ
diff --git a/doc/src/images/modelview-begin-insert-columns.png b/src/corelib/doc/images/modelview-begin-insert-columns.png
index 30eeb8280e..30eeb8280e 100644
--- a/doc/src/images/modelview-begin-insert-columns.png
+++ b/src/corelib/doc/images/modelview-begin-insert-columns.png
Binary files differ
diff --git a/doc/src/images/modelview-begin-insert-rows.png b/src/corelib/doc/images/modelview-begin-insert-rows.png
index b4d6eda57d..b4d6eda57d 100644
--- a/doc/src/images/modelview-begin-insert-rows.png
+++ b/src/corelib/doc/images/modelview-begin-insert-rows.png
Binary files differ
diff --git a/doc/src/images/modelview-begin-remove-columns.png b/src/corelib/doc/images/modelview-begin-remove-columns.png
index aee60e01ec..aee60e01ec 100644
--- a/doc/src/images/modelview-begin-remove-columns.png
+++ b/src/corelib/doc/images/modelview-begin-remove-columns.png
Binary files differ
diff --git a/doc/src/images/modelview-begin-remove-rows.png b/src/corelib/doc/images/modelview-begin-remove-rows.png
index 8e9518718e..8e9518718e 100644
--- a/doc/src/images/modelview-begin-remove-rows.png
+++ b/src/corelib/doc/images/modelview-begin-remove-rows.png
Binary files differ
diff --git a/doc/src/images/modelview-move-rows-1.png b/src/corelib/doc/images/modelview-move-rows-1.png
index b629a72dd4..b629a72dd4 100644
--- a/doc/src/images/modelview-move-rows-1.png
+++ b/src/corelib/doc/images/modelview-move-rows-1.png
Binary files differ
diff --git a/doc/src/images/modelview-move-rows-2.png b/src/corelib/doc/images/modelview-move-rows-2.png
index 674ca18f78..674ca18f78 100644
--- a/doc/src/images/modelview-move-rows-2.png
+++ b/src/corelib/doc/images/modelview-move-rows-2.png
Binary files differ
diff --git a/doc/src/images/modelview-move-rows-3.png b/src/corelib/doc/images/modelview-move-rows-3.png
index 5445dd599c..5445dd599c 100644
--- a/doc/src/images/modelview-move-rows-3.png
+++ b/src/corelib/doc/images/modelview-move-rows-3.png
Binary files differ
diff --git a/doc/src/images/modelview-move-rows-4.png b/src/corelib/doc/images/modelview-move-rows-4.png
index ecd65bac6c..ecd65bac6c 100644
--- a/doc/src/images/modelview-move-rows-4.png
+++ b/src/corelib/doc/images/modelview-move-rows-4.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-inback.png b/src/corelib/doc/images/qeasingcurve-inback.png
index 0064cb341c..0064cb341c 100644
--- a/doc/src/images/qeasingcurve-inback.png
+++ b/src/corelib/doc/images/qeasingcurve-inback.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-inbounce.png b/src/corelib/doc/images/qeasingcurve-inbounce.png
index eaa64f8c41..eaa64f8c41 100644
--- a/doc/src/images/qeasingcurve-inbounce.png
+++ b/src/corelib/doc/images/qeasingcurve-inbounce.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-incirc.png b/src/corelib/doc/images/qeasingcurve-incirc.png
index 7bd0f09d41..7bd0f09d41 100644
--- a/doc/src/images/qeasingcurve-incirc.png
+++ b/src/corelib/doc/images/qeasingcurve-incirc.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-incubic.png b/src/corelib/doc/images/qeasingcurve-incubic.png
index 1ac9eafba5..1ac9eafba5 100644
--- a/doc/src/images/qeasingcurve-incubic.png
+++ b/src/corelib/doc/images/qeasingcurve-incubic.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-inelastic.png b/src/corelib/doc/images/qeasingcurve-inelastic.png
index f976b5a576..f976b5a576 100644
--- a/doc/src/images/qeasingcurve-inelastic.png
+++ b/src/corelib/doc/images/qeasingcurve-inelastic.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-inexpo.png b/src/corelib/doc/images/qeasingcurve-inexpo.png
index 1af3652985..1af3652985 100644
--- a/doc/src/images/qeasingcurve-inexpo.png
+++ b/src/corelib/doc/images/qeasingcurve-inexpo.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-inoutback.png b/src/corelib/doc/images/qeasingcurve-inoutback.png
index 480bc051ef..480bc051ef 100644
--- a/doc/src/images/qeasingcurve-inoutback.png
+++ b/src/corelib/doc/images/qeasingcurve-inoutback.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-inoutbounce.png b/src/corelib/doc/images/qeasingcurve-inoutbounce.png
index de623091cf..de623091cf 100644
--- a/doc/src/images/qeasingcurve-inoutbounce.png
+++ b/src/corelib/doc/images/qeasingcurve-inoutbounce.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-inoutcirc.png b/src/corelib/doc/images/qeasingcurve-inoutcirc.png
index b4be8ac21e..b4be8ac21e 100644
--- a/doc/src/images/qeasingcurve-inoutcirc.png
+++ b/src/corelib/doc/images/qeasingcurve-inoutcirc.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-inoutcubic.png b/src/corelib/doc/images/qeasingcurve-inoutcubic.png
index 49dfbef1b6..49dfbef1b6 100644
--- a/doc/src/images/qeasingcurve-inoutcubic.png
+++ b/src/corelib/doc/images/qeasingcurve-inoutcubic.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-inoutelastic.png b/src/corelib/doc/images/qeasingcurve-inoutelastic.png
index 5b0e54a019..5b0e54a019 100644
--- a/doc/src/images/qeasingcurve-inoutelastic.png
+++ b/src/corelib/doc/images/qeasingcurve-inoutelastic.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-inoutexpo.png b/src/corelib/doc/images/qeasingcurve-inoutexpo.png
index 776984a113..776984a113 100644
--- a/doc/src/images/qeasingcurve-inoutexpo.png
+++ b/src/corelib/doc/images/qeasingcurve-inoutexpo.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-inoutquad.png b/src/corelib/doc/images/qeasingcurve-inoutquad.png
index 264333085a..264333085a 100644
--- a/doc/src/images/qeasingcurve-inoutquad.png
+++ b/src/corelib/doc/images/qeasingcurve-inoutquad.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-inoutquart.png b/src/corelib/doc/images/qeasingcurve-inoutquart.png
index 31fc0c8852..31fc0c8852 100644
--- a/doc/src/images/qeasingcurve-inoutquart.png
+++ b/src/corelib/doc/images/qeasingcurve-inoutquart.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-inoutquint.png b/src/corelib/doc/images/qeasingcurve-inoutquint.png
index 4d7a745be6..4d7a745be6 100644
--- a/doc/src/images/qeasingcurve-inoutquint.png
+++ b/src/corelib/doc/images/qeasingcurve-inoutquint.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-inoutsine.png b/src/corelib/doc/images/qeasingcurve-inoutsine.png
index 012ff751c9..012ff751c9 100644
--- a/doc/src/images/qeasingcurve-inoutsine.png
+++ b/src/corelib/doc/images/qeasingcurve-inoutsine.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-inquad.png b/src/corelib/doc/images/qeasingcurve-inquad.png
index e697c208a5..e697c208a5 100644
--- a/doc/src/images/qeasingcurve-inquad.png
+++ b/src/corelib/doc/images/qeasingcurve-inquad.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-inquart.png b/src/corelib/doc/images/qeasingcurve-inquart.png
index 6d6517551e..6d6517551e 100644
--- a/doc/src/images/qeasingcurve-inquart.png
+++ b/src/corelib/doc/images/qeasingcurve-inquart.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-inquint.png b/src/corelib/doc/images/qeasingcurve-inquint.png
index faaaea71fd..faaaea71fd 100644
--- a/doc/src/images/qeasingcurve-inquint.png
+++ b/src/corelib/doc/images/qeasingcurve-inquint.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-insine.png b/src/corelib/doc/images/qeasingcurve-insine.png
index 09449034b5..09449034b5 100644
--- a/doc/src/images/qeasingcurve-insine.png
+++ b/src/corelib/doc/images/qeasingcurve-insine.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-linear.png b/src/corelib/doc/images/qeasingcurve-linear.png
index fb3aaf3541..fb3aaf3541 100644
--- a/doc/src/images/qeasingcurve-linear.png
+++ b/src/corelib/doc/images/qeasingcurve-linear.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-outback.png b/src/corelib/doc/images/qeasingcurve-outback.png
index 83b3fa233f..83b3fa233f 100644
--- a/doc/src/images/qeasingcurve-outback.png
+++ b/src/corelib/doc/images/qeasingcurve-outback.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-outbounce.png b/src/corelib/doc/images/qeasingcurve-outbounce.png
index 27ac979642..27ac979642 100644
--- a/doc/src/images/qeasingcurve-outbounce.png
+++ b/src/corelib/doc/images/qeasingcurve-outbounce.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-outcirc.png b/src/corelib/doc/images/qeasingcurve-outcirc.png
index 00193700e0..00193700e0 100644
--- a/doc/src/images/qeasingcurve-outcirc.png
+++ b/src/corelib/doc/images/qeasingcurve-outcirc.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-outcubic.png b/src/corelib/doc/images/qeasingcurve-outcubic.png
index 45477c045a..45477c045a 100644
--- a/doc/src/images/qeasingcurve-outcubic.png
+++ b/src/corelib/doc/images/qeasingcurve-outcubic.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-outelastic.png b/src/corelib/doc/images/qeasingcurve-outelastic.png
index 1d407ed845..1d407ed845 100644
--- a/doc/src/images/qeasingcurve-outelastic.png
+++ b/src/corelib/doc/images/qeasingcurve-outelastic.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-outexpo.png b/src/corelib/doc/images/qeasingcurve-outexpo.png
index 56851554ed..56851554ed 100644
--- a/doc/src/images/qeasingcurve-outexpo.png
+++ b/src/corelib/doc/images/qeasingcurve-outexpo.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-outinback.png b/src/corelib/doc/images/qeasingcurve-outinback.png
index 4700ab02e8..4700ab02e8 100644
--- a/doc/src/images/qeasingcurve-outinback.png
+++ b/src/corelib/doc/images/qeasingcurve-outinback.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-outinbounce.png b/src/corelib/doc/images/qeasingcurve-outinbounce.png
index 12cc1a8bd4..12cc1a8bd4 100644
--- a/doc/src/images/qeasingcurve-outinbounce.png
+++ b/src/corelib/doc/images/qeasingcurve-outinbounce.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-outincirc.png b/src/corelib/doc/images/qeasingcurve-outincirc.png
index c8a5c86a23..c8a5c86a23 100644
--- a/doc/src/images/qeasingcurve-outincirc.png
+++ b/src/corelib/doc/images/qeasingcurve-outincirc.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-outincubic.png b/src/corelib/doc/images/qeasingcurve-outincubic.png
index 42af870d99..42af870d99 100644
--- a/doc/src/images/qeasingcurve-outincubic.png
+++ b/src/corelib/doc/images/qeasingcurve-outincubic.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-outinelastic.png b/src/corelib/doc/images/qeasingcurve-outinelastic.png
index 308be57900..308be57900 100644
--- a/doc/src/images/qeasingcurve-outinelastic.png
+++ b/src/corelib/doc/images/qeasingcurve-outinelastic.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-outinexpo.png b/src/corelib/doc/images/qeasingcurve-outinexpo.png
index 0692baa264..0692baa264 100644
--- a/doc/src/images/qeasingcurve-outinexpo.png
+++ b/src/corelib/doc/images/qeasingcurve-outinexpo.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-outinquad.png b/src/corelib/doc/images/qeasingcurve-outinquad.png
index 9e3cd83896..9e3cd83896 100644
--- a/doc/src/images/qeasingcurve-outinquad.png
+++ b/src/corelib/doc/images/qeasingcurve-outinquad.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-outinquart.png b/src/corelib/doc/images/qeasingcurve-outinquart.png
index 9a3c16f122..9a3c16f122 100644
--- a/doc/src/images/qeasingcurve-outinquart.png
+++ b/src/corelib/doc/images/qeasingcurve-outinquart.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-outinquint.png b/src/corelib/doc/images/qeasingcurve-outinquint.png
index add9feb26f..add9feb26f 100644
--- a/doc/src/images/qeasingcurve-outinquint.png
+++ b/src/corelib/doc/images/qeasingcurve-outinquint.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-outinsine.png b/src/corelib/doc/images/qeasingcurve-outinsine.png
index 4bc2aaf9e3..4bc2aaf9e3 100644
--- a/doc/src/images/qeasingcurve-outinsine.png
+++ b/src/corelib/doc/images/qeasingcurve-outinsine.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-outquad.png b/src/corelib/doc/images/qeasingcurve-outquad.png
index c505ff9e7b..c505ff9e7b 100644
--- a/doc/src/images/qeasingcurve-outquad.png
+++ b/src/corelib/doc/images/qeasingcurve-outquad.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-outquart.png b/src/corelib/doc/images/qeasingcurve-outquart.png
index 6eac058d18..6eac058d18 100644
--- a/doc/src/images/qeasingcurve-outquart.png
+++ b/src/corelib/doc/images/qeasingcurve-outquart.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-outquint.png b/src/corelib/doc/images/qeasingcurve-outquint.png
index 77a9ad417f..77a9ad417f 100644
--- a/doc/src/images/qeasingcurve-outquint.png
+++ b/src/corelib/doc/images/qeasingcurve-outquint.png
Binary files differ
diff --git a/doc/src/images/qeasingcurve-outsine.png b/src/corelib/doc/images/qeasingcurve-outsine.png
index d135b2f98c..d135b2f98c 100644
--- a/doc/src/images/qeasingcurve-outsine.png
+++ b/src/corelib/doc/images/qeasingcurve-outsine.png
Binary files differ
diff --git a/doc/src/images/qimage-scaling.png b/src/corelib/doc/images/qimage-scaling.png
index fcd71448f0..fcd71448f0 100644
--- a/doc/src/images/qimage-scaling.png
+++ b/src/corelib/doc/images/qimage-scaling.png
Binary files differ
diff --git a/doc/src/images/qline-coordinates.png b/src/corelib/doc/images/qline-coordinates.png
index ac4fb980ac..ac4fb980ac 100644
--- a/doc/src/images/qline-coordinates.png
+++ b/src/corelib/doc/images/qline-coordinates.png
Binary files differ
diff --git a/doc/src/images/qline-point.png b/src/corelib/doc/images/qline-point.png
index 3bc3664a20..3bc3664a20 100644
--- a/doc/src/images/qline-point.png
+++ b/src/corelib/doc/images/qline-point.png
Binary files differ
diff --git a/doc/src/images/qlinef-angle-identicaldirection.png b/src/corelib/doc/images/qlinef-angle-identicaldirection.png
index 18d632321b..18d632321b 100644
--- a/doc/src/images/qlinef-angle-identicaldirection.png
+++ b/src/corelib/doc/images/qlinef-angle-identicaldirection.png
Binary files differ
diff --git a/doc/src/images/qlinef-angle-oppositedirection.png b/src/corelib/doc/images/qlinef-angle-oppositedirection.png
index bf52cfe011..bf52cfe011 100644
--- a/doc/src/images/qlinef-angle-oppositedirection.png
+++ b/src/corelib/doc/images/qlinef-angle-oppositedirection.png
Binary files differ
diff --git a/doc/src/images/qlinef-bounded.png b/src/corelib/doc/images/qlinef-bounded.png
index 136dd50304..136dd50304 100644
--- a/doc/src/images/qlinef-bounded.png
+++ b/src/corelib/doc/images/qlinef-bounded.png
Binary files differ
diff --git a/doc/src/images/qlinef-normalvector.png b/src/corelib/doc/images/qlinef-normalvector.png
index b7d944f32f..b7d944f32f 100644
--- a/doc/src/images/qlinef-normalvector.png
+++ b/src/corelib/doc/images/qlinef-normalvector.png
Binary files differ
diff --git a/doc/src/images/qlinef-unbounded.png b/src/corelib/doc/images/qlinef-unbounded.png
index 75ead98ff2..75ead98ff2 100644
--- a/doc/src/images/qlinef-unbounded.png
+++ b/src/corelib/doc/images/qlinef-unbounded.png
Binary files differ
diff --git a/doc/src/images/qpen-bevel.png b/src/corelib/doc/images/qpen-bevel.png
index 8a30779e3b..8a30779e3b 100644
--- a/doc/src/images/qpen-bevel.png
+++ b/src/corelib/doc/images/qpen-bevel.png
Binary files differ
diff --git a/doc/src/images/qpen-custom.png b/src/corelib/doc/images/qpen-custom.png
index a2a038abe0..a2a038abe0 100644
--- a/doc/src/images/qpen-custom.png
+++ b/src/corelib/doc/images/qpen-custom.png
Binary files differ
diff --git a/doc/src/images/qpen-dash.png b/src/corelib/doc/images/qpen-dash.png
index 67082c3758..67082c3758 100644
--- a/doc/src/images/qpen-dash.png
+++ b/src/corelib/doc/images/qpen-dash.png
Binary files differ
diff --git a/doc/src/images/qpen-dashdot.png b/src/corelib/doc/images/qpen-dashdot.png
index 64b384660f..64b384660f 100644
--- a/doc/src/images/qpen-dashdot.png
+++ b/src/corelib/doc/images/qpen-dashdot.png
Binary files differ
diff --git a/doc/src/images/qpen-dashdotdot.png b/src/corelib/doc/images/qpen-dashdotdot.png
index ff1b2e69cd..ff1b2e69cd 100644
--- a/doc/src/images/qpen-dashdotdot.png
+++ b/src/corelib/doc/images/qpen-dashdotdot.png
Binary files differ
diff --git a/doc/src/images/qpen-dot.png b/src/corelib/doc/images/qpen-dot.png
index 54e81c9469..54e81c9469 100644
--- a/doc/src/images/qpen-dot.png
+++ b/src/corelib/doc/images/qpen-dot.png
Binary files differ
diff --git a/doc/src/images/qpen-flat.png b/src/corelib/doc/images/qpen-flat.png
index 06e2195f73..06e2195f73 100644
--- a/doc/src/images/qpen-flat.png
+++ b/src/corelib/doc/images/qpen-flat.png
Binary files differ
diff --git a/doc/src/images/qpen-miter.png b/src/corelib/doc/images/qpen-miter.png
index 025e003979..025e003979 100644
--- a/doc/src/images/qpen-miter.png
+++ b/src/corelib/doc/images/qpen-miter.png
Binary files differ
diff --git a/doc/src/images/qpen-roundcap.png b/src/corelib/doc/images/qpen-roundcap.png
index 77b22b2bab..77b22b2bab 100644
--- a/doc/src/images/qpen-roundcap.png
+++ b/src/corelib/doc/images/qpen-roundcap.png
Binary files differ
diff --git a/doc/src/images/qpen-roundjoin.png b/src/corelib/doc/images/qpen-roundjoin.png
index 155e2aa8cc..155e2aa8cc 100644
--- a/doc/src/images/qpen-roundjoin.png
+++ b/src/corelib/doc/images/qpen-roundjoin.png
Binary files differ
diff --git a/doc/src/images/qpen-solid.png b/src/corelib/doc/images/qpen-solid.png
index e042b18017..e042b18017 100644
--- a/doc/src/images/qpen-solid.png
+++ b/src/corelib/doc/images/qpen-solid.png
Binary files differ
diff --git a/doc/src/images/qpen-square.png b/src/corelib/doc/images/qpen-square.png
index ebc5d1e329..ebc5d1e329 100644
--- a/doc/src/images/qpen-square.png
+++ b/src/corelib/doc/images/qpen-square.png
Binary files differ
diff --git a/doc/src/images/qrect-coordinates.png b/src/corelib/doc/images/qrect-coordinates.png
index 2a2dae2d6c..2a2dae2d6c 100644
--- a/doc/src/images/qrect-coordinates.png
+++ b/src/corelib/doc/images/qrect-coordinates.png
Binary files differ
diff --git a/doc/src/images/qrect-diagram-one.png b/src/corelib/doc/images/qrect-diagram-one.png
index a893be277a..a893be277a 100644
--- a/doc/src/images/qrect-diagram-one.png
+++ b/src/corelib/doc/images/qrect-diagram-one.png
Binary files differ
diff --git a/doc/src/images/qrect-diagram-three.png b/src/corelib/doc/images/qrect-diagram-three.png
index 84fb35be6c..84fb35be6c 100644
--- a/doc/src/images/qrect-diagram-three.png
+++ b/src/corelib/doc/images/qrect-diagram-three.png
Binary files differ
diff --git a/doc/src/images/qrect-diagram-two.png b/src/corelib/doc/images/qrect-diagram-two.png
index e19caacc34..e19caacc34 100644
--- a/doc/src/images/qrect-diagram-two.png
+++ b/src/corelib/doc/images/qrect-diagram-two.png
Binary files differ
diff --git a/doc/src/images/qrect-diagram-zero.png b/src/corelib/doc/images/qrect-diagram-zero.png
index 90e3db0c41..90e3db0c41 100644
--- a/doc/src/images/qrect-diagram-zero.png
+++ b/src/corelib/doc/images/qrect-diagram-zero.png
Binary files differ
diff --git a/doc/src/images/qrect-intersect.png b/src/corelib/doc/images/qrect-intersect.png
index db68cd53ad..db68cd53ad 100644
--- a/doc/src/images/qrect-intersect.png
+++ b/src/corelib/doc/images/qrect-intersect.png
Binary files differ
diff --git a/doc/src/images/qrect-unite.png b/src/corelib/doc/images/qrect-unite.png
index 3f6239f405..3f6239f405 100644
--- a/doc/src/images/qrect-unite.png
+++ b/src/corelib/doc/images/qrect-unite.png
Binary files differ
diff --git a/doc/src/images/qrectf-coordinates.png b/src/corelib/doc/images/qrectf-coordinates.png
index ccc6d82063..ccc6d82063 100644
--- a/doc/src/images/qrectf-coordinates.png
+++ b/src/corelib/doc/images/qrectf-coordinates.png
Binary files differ
diff --git a/doc/src/images/qrectf-diagram-one.png b/src/corelib/doc/images/qrectf-diagram-one.png
index 842289ce07..842289ce07 100644
--- a/doc/src/images/qrectf-diagram-one.png
+++ b/src/corelib/doc/images/qrectf-diagram-one.png
Binary files differ
diff --git a/doc/src/images/qrectf-diagram-three.png b/src/corelib/doc/images/qrectf-diagram-three.png
index e05106a7e1..e05106a7e1 100644
--- a/doc/src/images/qrectf-diagram-three.png
+++ b/src/corelib/doc/images/qrectf-diagram-three.png
Binary files differ
diff --git a/doc/src/images/qrectf-diagram-two.png b/src/corelib/doc/images/qrectf-diagram-two.png
index 192d00df79..192d00df79 100644
--- a/doc/src/images/qrectf-diagram-two.png
+++ b/src/corelib/doc/images/qrectf-diagram-two.png
Binary files differ
diff --git a/doc/src/images/qsortfilterproxymodel-sorting.png b/src/corelib/doc/images/qsortfilterproxymodel-sorting.png
index de99d41272..de99d41272 100644
--- a/doc/src/images/qsortfilterproxymodel-sorting.png
+++ b/src/corelib/doc/images/qsortfilterproxymodel-sorting.png
Binary files differ
diff --git a/doc/src/images/qurl-authority.png b/src/corelib/doc/images/qurl-authority.png
index 54de2a792e..54de2a792e 100644
--- a/doc/src/images/qurl-authority.png
+++ b/src/corelib/doc/images/qurl-authority.png
Binary files differ
diff --git a/doc/src/images/qurl-authority2.png b/src/corelib/doc/images/qurl-authority2.png
index fe8d4d87b2..fe8d4d87b2 100644
--- a/doc/src/images/qurl-authority2.png
+++ b/src/corelib/doc/images/qurl-authority2.png
Binary files differ
diff --git a/doc/src/images/qurl-authority3.png b/src/corelib/doc/images/qurl-authority3.png
index 242063e935..242063e935 100644
--- a/doc/src/images/qurl-authority3.png
+++ b/src/corelib/doc/images/qurl-authority3.png
Binary files differ
diff --git a/doc/src/images/qurl-fragment.png b/src/corelib/doc/images/qurl-fragment.png
index e93a252e7a..e93a252e7a 100644
--- a/doc/src/images/qurl-fragment.png
+++ b/src/corelib/doc/images/qurl-fragment.png
Binary files differ
diff --git a/doc/src/images/qurl-ftppath.png b/src/corelib/doc/images/qurl-ftppath.png
index d88df4922b..d88df4922b 100644
--- a/doc/src/images/qurl-ftppath.png
+++ b/src/corelib/doc/images/qurl-ftppath.png
Binary files differ
diff --git a/doc/src/images/qurl-mailtopath.png b/src/corelib/doc/images/qurl-mailtopath.png
index 34ec153b74..34ec153b74 100644
--- a/doc/src/images/qurl-mailtopath.png
+++ b/src/corelib/doc/images/qurl-mailtopath.png
Binary files differ
diff --git a/doc/src/images/qurl-querystring.png b/src/corelib/doc/images/qurl-querystring.png
index 7c3309a5ac..7c3309a5ac 100644
--- a/doc/src/images/qurl-querystring.png
+++ b/src/corelib/doc/images/qurl-querystring.png
Binary files differ
diff --git a/doc/src/images/stliterators1.png b/src/corelib/doc/images/stliterators1.png
index 6d71e4712f..6d71e4712f 100644
--- a/doc/src/images/stliterators1.png
+++ b/src/corelib/doc/images/stliterators1.png
Binary files differ
diff --git a/doc/src/images/thread_clock.png b/src/corelib/doc/images/thread_clock.png
index b8a8aa0a39..b8a8aa0a39 100644
--- a/doc/src/images/thread_clock.png
+++ b/src/corelib/doc/images/thread_clock.png
Binary files differ
diff --git a/doc/src/images/threadsandobjects.png b/src/corelib/doc/images/threadsandobjects.png
index 8357d2532a..8357d2532a 100644
--- a/doc/src/images/threadsandobjects.png
+++ b/src/corelib/doc/images/threadsandobjects.png
Binary files differ
diff --git a/doc/src/images/threadvisual-example.png b/src/corelib/doc/images/threadvisual-example.png
index 2a49874719..2a49874719 100644
--- a/doc/src/images/threadvisual-example.png
+++ b/src/corelib/doc/images/threadvisual-example.png
Binary files differ
diff --git a/src/corelib/doc/qtcore.qdocconf b/src/corelib/doc/qtcore.qdocconf
new file mode 100644
index 0000000000..f788b36cdf
--- /dev/null
+++ b/src/corelib/doc/qtcore.qdocconf
@@ -0,0 +1,90 @@
+include(../../../doc/global/qt-cpp-ignore.qdocconf)
+
+project = QtCore
+description = Qt Core Reference Documentation
+url = http://qt-project.org/doc/qt-5.0/qtcore
+version = 5.0.0
+
+sourceencoding = UTF-8
+outputencoding = UTF-8
+naturallanguage = en_US
+qhp.projects = QtCore
+
+qhp.QtCore.file = qtcore.qhp
+qhp.QtCore.namespace = org.qt-project.qtcore.500
+qhp.QtCore.virtualFolder = qdoc
+qhp.QtCore.indexTitle = Qt Core Reference Documentation
+qhp.QtCore.indexRoot =
+
+qhp.QtCore.filterAttributes = qtcore 5.0.0 qtrefdoc
+qhp.QtCore.customFilters.Qt.name = QtCore 5.0.0
+qhp.QtCore.customFilters.Qt.filterAttributes = qtcore 5.0.0
+qhp.QtCore.subprojects = classes overviews examples
+qhp.QtCore.subprojects.classes.title = Classes
+qhp.QtCore.subprojects.classes.indexTitle = Qt Core's Classes
+qhp.QtCore.subprojects.classes.selectors = class fake:headerfile
+qhp.QtCore.subprojects.classes.sortPages = true
+qhp.QtCore.subprojects.overviews.title = Overviews
+qhp.QtCore.subprojects.overviews.indexTitle = All Overviews and HOWTOs
+qhp.QtCore.subprojects.overviews.selectors = fake:page,group,module
+qhp.QtCore.subprojects.examples.title = Qt Core Examples
+qhp.QtCore.subprojects.examples.indexTitle = Qt Core Examples
+qhp.QtCore.subprojects.examples.selectors = fake:example
+
+dita.metadata.default.author = Qt Project
+dita.metadata.default.permissions = all
+dita.metadata.default.publisher = Qt Project
+dita.metadata.default.copyryear = 2012
+dita.metadata.default.copyrholder = Nokia
+dita.metadata.default.audience = programmer
+
+sources.fileextensions = "*.c++ *.cc *.cpp *.cxx *.mm *.qml *.qdoc"
+headers.fileextensions = "*.ch *.h *.h++ *.hh *.hpp *.hxx"
+
+examples.fileextensions = "*.cpp *.h *.js *.xq *.svg *.xml *.ui *.qhp *.qhcp *.qml *.css"
+examples.imageextensions = "*.png"
+
+outputdir = ../../../doc/qtcore
+tagfile = ../../../doc/qtcore/qtcore.tags
+
+HTML.generatemacrefs = "true"
+HTML.nobreadcrumbs = "true"
+
+HTML.templatedir = .
+
+HTML.stylesheets = ../../../doc/global/style/offline.css
+
+HTML.headerstyles = \
+ " <link rel=\"stylesheet\" type=\"text/css\" href=\"style/offline.css\" />\n"
+
+HTML.endheader = \
+ "</head>\n" \
+
+defines = Q_QDOC \
+ QT_.*_SUPPORT \
+ QT_.*_LIB \
+ QT_COMPAT \
+ QT_KEYPAD_NAVIGATION \
+ QT_NO_EGL \
+ Q_WS_.* \
+ Q_OS_.* \
+ Q_BYTE_ORDER \
+ QT_DEPRECATED \
+ QT_DEPRECATED_* \
+ Q_NO_USING_KEYWORD \
+ __cplusplus \
+ Q_COMPILER_INITIALIZER_LISTS
+
+versionsym = QT_VERSION_STR
+
+codeindent = 1
+
+headerdirs += ..
+
+sourcedirs += ..
+
+exampledirs += ../../../examples \
+ ../ \
+ snippets
+
+imagedirs += images
diff --git a/doc/src/snippets/buffer/buffer.cpp b/src/corelib/doc/snippets/buffer/buffer.cpp
index 681fb56791..681fb56791 100644
--- a/doc/src/snippets/buffer/buffer.cpp
+++ b/src/corelib/doc/snippets/buffer/buffer.cpp
diff --git a/doc/src/snippets/code/doc_src_containers.cpp b/src/corelib/doc/snippets/code/doc_src_containers.cpp
index c74b0f79dc..c74b0f79dc 100644
--- a/doc/src/snippets/code/doc_src_containers.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_containers.cpp
diff --git a/doc/src/snippets/code/doc_src_groups.cpp b/src/corelib/doc/snippets/code/doc_src_groups.cpp
index abfbfc59c0..abfbfc59c0 100644
--- a/doc/src/snippets/code/doc_src_groups.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_groups.cpp
diff --git a/doc/src/snippets/code/doc_src_objecttrees.cpp b/src/corelib/doc/snippets/code/doc_src_objecttrees.cpp
index 62d556057b..62d556057b 100644
--- a/doc/src/snippets/code/doc_src_objecttrees.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_objecttrees.cpp
diff --git a/doc/src/snippets/code/doc_src_properties.cpp b/src/corelib/doc/snippets/code/doc_src_properties.cpp
index b88fc22084..b88fc22084 100644
--- a/doc/src/snippets/code/doc_src_properties.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_properties.cpp
diff --git a/doc/src/snippets/code/doc_src_qalgorithms.cpp b/src/corelib/doc/snippets/code/doc_src_qalgorithms.cpp
index 20e64b61fa..20e64b61fa 100644
--- a/doc/src/snippets/code/doc_src_qalgorithms.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_qalgorithms.cpp
diff --git a/doc/src/snippets/code/doc_src_qcache.cpp b/src/corelib/doc/snippets/code/doc_src_qcache.cpp
index 0ba9e65531..0ba9e65531 100644
--- a/doc/src/snippets/code/doc_src_qcache.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_qcache.cpp
diff --git a/doc/src/snippets/code/doc_src_qiterator.cpp b/src/corelib/doc/snippets/code/doc_src_qiterator.cpp
index b96f9065cb..b96f9065cb 100644
--- a/doc/src/snippets/code/doc_src_qiterator.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_qiterator.cpp
diff --git a/doc/src/snippets/code/doc_src_qnamespace.cpp b/src/corelib/doc/snippets/code/doc_src_qnamespace.cpp
index ec80d011c9..ec80d011c9 100644
--- a/doc/src/snippets/code/doc_src_qnamespace.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_qnamespace.cpp
diff --git a/doc/src/snippets/code/doc_src_qnamespace.qdoc b/src/corelib/doc/snippets/code/doc_src_qnamespace.qdoc
index e67b83a292..e67b83a292 100644
--- a/doc/src/snippets/code/doc_src_qnamespace.qdoc
+++ b/src/corelib/doc/snippets/code/doc_src_qnamespace.qdoc
diff --git a/doc/src/snippets/code/doc_src_qpair.cpp b/src/corelib/doc/snippets/code/doc_src_qpair.cpp
index a29b6d02b2..a29b6d02b2 100644
--- a/doc/src/snippets/code/doc_src_qpair.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_qpair.cpp
diff --git a/doc/src/snippets/code/doc_src_qplugin.cpp b/src/corelib/doc/snippets/code/doc_src_qplugin.cpp
index 1577b2fa61..1577b2fa61 100644
--- a/doc/src/snippets/code/doc_src_qplugin.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_qplugin.cpp
diff --git a/src/corelib/doc/snippets/code/doc_src_qplugin.pro b/src/corelib/doc/snippets/code/doc_src_qplugin.pro
new file mode 100644
index 0000000000..52fb9e3163
--- /dev/null
+++ b/src/corelib/doc/snippets/code/doc_src_qplugin.pro
@@ -0,0 +1,4 @@
+#! [3]
+TEMPLATE = app
+QTPLUGIN += qjpeg qgif # image formats
+#! [3]
diff --git a/doc/src/snippets/code/doc_src_qset.cpp b/src/corelib/doc/snippets/code/doc_src_qset.cpp
index cfd366f639..cfd366f639 100644
--- a/doc/src/snippets/code/doc_src_qset.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_qset.cpp
diff --git a/doc/src/snippets/code/doc_src_qtcore.cpp b/src/corelib/doc/snippets/code/doc_src_qtcore.cpp
index f00c96c6df..f00c96c6df 100644
--- a/doc/src/snippets/code/doc_src_qtcore.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_qtcore.cpp
diff --git a/doc/src/snippets/code/doc_src_qvarlengtharray.cpp b/src/corelib/doc/snippets/code/doc_src_qvarlengtharray.cpp
index 027faa41dc..027faa41dc 100644
--- a/doc/src/snippets/code/doc_src_qvarlengtharray.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_qvarlengtharray.cpp
diff --git a/doc/src/snippets/qlogging/qloggingsnippet.cpp b/src/corelib/doc/snippets/code/qlogging/qlogging.cpp
index 74892cdfba..74892cdfba 100644
--- a/doc/src/snippets/qlogging/qloggingsnippet.cpp
+++ b/src/corelib/doc/snippets/code/qlogging/qlogging.cpp
diff --git a/doc/src/snippets/code/src_corelib_codecs_qtextcodec.cpp b/src/corelib/doc/snippets/code/src_corelib_codecs_qtextcodec.cpp
index 78abd5ba28..78abd5ba28 100644
--- a/doc/src/snippets/code/src_corelib_codecs_qtextcodec.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_codecs_qtextcodec.cpp
diff --git a/doc/src/snippets/code/src_corelib_concurrent_qthreadpool.cpp b/src/corelib/doc/snippets/code/src_corelib_concurrent_qthreadpool.cpp
index a8f9da3a7c..a8f9da3a7c 100644
--- a/doc/src/snippets/code/src_corelib_concurrent_qthreadpool.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_concurrent_qthreadpool.cpp
diff --git a/doc/src/snippets/code/src_corelib_global_qglobal.cpp b/src/corelib/doc/snippets/code/src_corelib_global_qglobal.cpp
index dc6c3aa616..dc6c3aa616 100644
--- a/doc/src/snippets/code/src_corelib_global_qglobal.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_global_qglobal.cpp
diff --git a/doc/src/snippets/code/src_corelib_io_qabstractfileengine.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qabstractfileengine.cpp
index 8893fbd08c..8893fbd08c 100644
--- a/doc/src/snippets/code/src_corelib_io_qabstractfileengine.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qabstractfileengine.cpp
diff --git a/doc/src/snippets/code/src_corelib_io_qdatastream.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qdatastream.cpp
index af2d7d24bf..af2d7d24bf 100644
--- a/doc/src/snippets/code/src_corelib_io_qdatastream.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qdatastream.cpp
diff --git a/doc/src/snippets/code/src_corelib_io_qdir.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qdir.cpp
index 3c333e5642..3c333e5642 100644
--- a/doc/src/snippets/code/src_corelib_io_qdir.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qdir.cpp
diff --git a/doc/src/snippets/code/src_corelib_io_qdiriterator.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qdiriterator.cpp
index bf38bb1627..bf38bb1627 100644
--- a/doc/src/snippets/code/src_corelib_io_qdiriterator.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qdiriterator.cpp
diff --git a/doc/src/snippets/code/src_corelib_io_qfile.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qfile.cpp
index 7ad24b30f1..7ad24b30f1 100644
--- a/doc/src/snippets/code/src_corelib_io_qfile.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qfile.cpp
diff --git a/doc/src/snippets/code/src_corelib_io_qfileinfo.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qfileinfo.cpp
index f565786934..f565786934 100644
--- a/doc/src/snippets/code/src_corelib_io_qfileinfo.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qfileinfo.cpp
diff --git a/doc/src/snippets/code/src_corelib_io_qiodevice.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qiodevice.cpp
index 6018a21f89..6018a21f89 100644
--- a/doc/src/snippets/code/src_corelib_io_qiodevice.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qiodevice.cpp
diff --git a/doc/src/snippets/code/src_corelib_io_qprocess.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qprocess.cpp
index 16878f41e1..16878f41e1 100644
--- a/doc/src/snippets/code/src_corelib_io_qprocess.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qprocess.cpp
diff --git a/doc/src/snippets/code/src_corelib_io_qsettings.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qsettings.cpp
index c9ce7561ff..c9ce7561ff 100644
--- a/doc/src/snippets/code/src_corelib_io_qsettings.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qsettings.cpp
diff --git a/doc/src/snippets/code/src_corelib_io_qtemporarydir.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qtemporarydir.cpp
index 4e855f72f0..4e855f72f0 100644
--- a/doc/src/snippets/code/src_corelib_io_qtemporarydir.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qtemporarydir.cpp
diff --git a/doc/src/snippets/code/src_corelib_io_qtemporaryfile.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qtemporaryfile.cpp
index 2db3aace56..2db3aace56 100644
--- a/doc/src/snippets/code/src_corelib_io_qtemporaryfile.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qtemporaryfile.cpp
diff --git a/doc/src/snippets/code/src_corelib_io_qtextstream.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qtextstream.cpp
index c46cbb23d3..c46cbb23d3 100644
--- a/doc/src/snippets/code/src_corelib_io_qtextstream.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qtextstream.cpp
diff --git a/doc/src/snippets/code/src_corelib_io_qurl.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qurl.cpp
index 8fd4b8ee9f..8fd4b8ee9f 100644
--- a/doc/src/snippets/code/src_corelib_io_qurl.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qurl.cpp
diff --git a/doc/src/snippets/code/src_corelib_kernel_qabstracteventdispatcher.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qabstracteventdispatcher.cpp
index eba007e947..eba007e947 100644
--- a/doc/src/snippets/code/src_corelib_kernel_qabstracteventdispatcher.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qabstracteventdispatcher.cpp
diff --git a/doc/src/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp
index aa5b23265e..aa5b23265e 100644
--- a/doc/src/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp
diff --git a/doc/src/snippets/code/src_corelib_kernel_qcoreapplication.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qcoreapplication.cpp
index 8023e6a218..8023e6a218 100644
--- a/doc/src/snippets/code/src_corelib_kernel_qcoreapplication.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qcoreapplication.cpp
diff --git a/doc/src/snippets/code/src_corelib_kernel_qmetaobject.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qmetaobject.cpp
index 7c0c2c2122..528fdbd329 100644
--- a/doc/src/snippets/code/src_corelib_kernel_qmetaobject.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qmetaobject.cpp
@@ -133,4 +133,8 @@ method.invoke(obj,
Q_ARG(double, 9.7));
//! [8]
+//! [9]
+QMetaMethod destroyedSignal = QMetaMethod::fromSignal(&QObject::destroyed);
+//! [9]
+
}
diff --git a/doc/src/snippets/code/src_corelib_kernel_qmetatype.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qmetatype.cpp
index d0a7a69884..d0a7a69884 100644
--- a/doc/src/snippets/code/src_corelib_kernel_qmetatype.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qmetatype.cpp
diff --git a/doc/src/snippets/code/src_corelib_kernel_qmimedata.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qmimedata.cpp
index de683cf463..de683cf463 100644
--- a/doc/src/snippets/code/src_corelib_kernel_qmimedata.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qmimedata.cpp
diff --git a/doc/src/snippets/code/src_corelib_kernel_qobject.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qobject.cpp
index 5b27775322..95c54169ce 100644
--- a/doc/src/snippets/code/src_corelib_kernel_qobject.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qobject.cpp
@@ -339,8 +339,8 @@ myObject->disconnect(myReceiver);
//! [32]
-if (QLatin1String(signal) == SIGNAL(valueChanged(int))) {
- // signal is valueChanged(int)
+if (signal == QMetaMethod::fromSignal(&MyObject::valueChanged)) {
+ // signal is valueChanged
}
//! [32]
@@ -479,6 +479,14 @@ QObject::disconnect(lineEdit, &QLineEdit::textChanged,
label, &QLabel::setText);
//! [48]
+//! [49]
+if (isSignalConnected(QMethaMethod::fromSignal(&MyObject::valueChanged))) {
+ QByteArray data;
+ data = get_the_value(); // expensive operation
+ emit valueChanged(data);
+}
+//! [49]
+
//! [meta data]
//: This is a comment for the translator.
//= qtn_foo_bar
diff --git a/doc/src/snippets/code/src_corelib_kernel_qsystemsemaphore.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qsystemsemaphore.cpp
index da6e9fca8e..da6e9fca8e 100644
--- a/doc/src/snippets/code/src_corelib_kernel_qsystemsemaphore.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qsystemsemaphore.cpp
diff --git a/doc/src/snippets/code/src_corelib_kernel_qtimer.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qtimer.cpp
index dfdef73e75..dfdef73e75 100644
--- a/doc/src/snippets/code/src_corelib_kernel_qtimer.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qtimer.cpp
diff --git a/doc/src/snippets/code/src_corelib_kernel_qvariant.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qvariant.cpp
index ae38c8372f..ae38c8372f 100644
--- a/doc/src/snippets/code/src_corelib_kernel_qvariant.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qvariant.cpp
diff --git a/doc/src/snippets/code/src_corelib_mimetype_qmimedatabase.cpp b/src/corelib/doc/snippets/code/src_corelib_mimetype_qmimedatabase.cpp
index e59a96b87a..e59a96b87a 100644
--- a/doc/src/snippets/code/src_corelib_mimetype_qmimedatabase.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_mimetype_qmimedatabase.cpp
diff --git a/doc/src/snippets/code/src_corelib_plugin_qlibrary.cpp b/src/corelib/doc/snippets/code/src_corelib_plugin_qlibrary.cpp
index 9de685a7b5..9de685a7b5 100644
--- a/doc/src/snippets/code/src_corelib_plugin_qlibrary.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_plugin_qlibrary.cpp
diff --git a/doc/src/snippets/code/src_corelib_plugin_quuid.cpp b/src/corelib/doc/snippets/code/src_corelib_plugin_quuid.cpp
index 5c8f6ae091..5c8f6ae091 100644
--- a/doc/src/snippets/code/src_corelib_plugin_quuid.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_plugin_quuid.cpp
diff --git a/doc/src/snippets/code/src_corelib_statemachine_qstatemachine.cpp b/src/corelib/doc/snippets/code/src_corelib_statemachine_qstatemachine.cpp
index e212470b75..e212470b75 100644
--- a/doc/src/snippets/code/src_corelib_statemachine_qstatemachine.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_statemachine_qstatemachine.cpp
diff --git a/doc/src/snippets/code/src_corelib_thread_qatomic.cpp b/src/corelib/doc/snippets/code/src_corelib_thread_qatomic.cpp
index 7e3d7dc7e4..7e3d7dc7e4 100644
--- a/doc/src/snippets/code/src_corelib_thread_qatomic.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_thread_qatomic.cpp
diff --git a/doc/src/snippets/code/src_corelib_thread_qmutex.cpp b/src/corelib/doc/snippets/code/src_corelib_thread_qmutex.cpp
index f5fbeb8419..f5fbeb8419 100644
--- a/doc/src/snippets/code/src_corelib_thread_qmutex.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_thread_qmutex.cpp
diff --git a/doc/src/snippets/code/src_corelib_thread_qmutexpool.cpp b/src/corelib/doc/snippets/code/src_corelib_thread_qmutexpool.cpp
index 29076db91c..29076db91c 100644
--- a/doc/src/snippets/code/src_corelib_thread_qmutexpool.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_thread_qmutexpool.cpp
diff --git a/doc/src/snippets/code/src_corelib_thread_qreadwritelock.cpp b/src/corelib/doc/snippets/code/src_corelib_thread_qreadwritelock.cpp
index bd42c01905..bd42c01905 100644
--- a/doc/src/snippets/code/src_corelib_thread_qreadwritelock.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_thread_qreadwritelock.cpp
diff --git a/doc/src/snippets/code/src_corelib_thread_qsemaphore.cpp b/src/corelib/doc/snippets/code/src_corelib_thread_qsemaphore.cpp
index fd4ff98314..fd4ff98314 100644
--- a/doc/src/snippets/code/src_corelib_thread_qsemaphore.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_thread_qsemaphore.cpp
diff --git a/doc/src/snippets/code/src_corelib_thread_qthread.cpp b/src/corelib/doc/snippets/code/src_corelib_thread_qthread.cpp
index 681023c91b..681023c91b 100644
--- a/doc/src/snippets/code/src_corelib_thread_qthread.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_thread_qthread.cpp
diff --git a/doc/src/snippets/code/src_corelib_thread_qwaitcondition_unix.cpp b/src/corelib/doc/snippets/code/src_corelib_thread_qwaitcondition_unix.cpp
index 149cae5bf6..149cae5bf6 100644
--- a/doc/src/snippets/code/src_corelib_thread_qwaitcondition_unix.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_thread_qwaitcondition_unix.cpp
diff --git a/doc/src/snippets/code/src_corelib_tools_qbitarray.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qbitarray.cpp
index cfaa6ef485..cfaa6ef485 100644
--- a/doc/src/snippets/code/src_corelib_tools_qbitarray.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qbitarray.cpp
diff --git a/doc/src/snippets/code/src_corelib_tools_qbytearray.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qbytearray.cpp
index a232f490b2..a232f490b2 100644
--- a/doc/src/snippets/code/src_corelib_tools_qbytearray.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qbytearray.cpp
diff --git a/doc/src/snippets/code/src_corelib_tools_qdatetime.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qdatetime.cpp
index 59cd67fe6d..59cd67fe6d 100644
--- a/doc/src/snippets/code/src_corelib_tools_qdatetime.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qdatetime.cpp
diff --git a/doc/src/snippets/code/src_corelib_tools_qeasingcurve.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qeasingcurve.cpp
index 3aa0d986af..3aa0d986af 100644
--- a/doc/src/snippets/code/src_corelib_tools_qeasingcurve.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qeasingcurve.cpp
diff --git a/doc/src/snippets/code/src_corelib_tools_qhash.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qhash.cpp
index 2fa73bac46..2fa73bac46 100644
--- a/doc/src/snippets/code/src_corelib_tools_qhash.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qhash.cpp
diff --git a/doc/src/snippets/code/src_corelib_tools_qlinkedlist.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qlinkedlist.cpp
index b9861f16c0..b9861f16c0 100644
--- a/doc/src/snippets/code/src_corelib_tools_qlinkedlist.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qlinkedlist.cpp
diff --git a/doc/src/snippets/code/src_corelib_tools_qlistdata.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qlistdata.cpp
index dca5473cd6..dca5473cd6 100644
--- a/doc/src/snippets/code/src_corelib_tools_qlistdata.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qlistdata.cpp
diff --git a/doc/src/snippets/code/src_corelib_tools_qlocale.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qlocale.cpp
index 2e3b599910..2e3b599910 100644
--- a/doc/src/snippets/code/src_corelib_tools_qlocale.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qlocale.cpp
diff --git a/doc/src/snippets/code/src_corelib_tools_qmap.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qmap.cpp
index 2b9c1fb73e..2b9c1fb73e 100644
--- a/doc/src/snippets/code/src_corelib_tools_qmap.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qmap.cpp
diff --git a/doc/src/snippets/code/src_corelib_tools_qpoint.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qpoint.cpp
index 4f48fcbcb1..4f48fcbcb1 100644
--- a/doc/src/snippets/code/src_corelib_tools_qpoint.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qpoint.cpp
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qqueue.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qqueue.cpp
new file mode 100644
index 0000000000..3a1cf7c1a1
--- /dev/null
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qqueue.cpp
@@ -0,0 +1,48 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//! [0]
+QQueue<int> queue;
+queue.enqueue(1);
+queue.enqueue(2);
+queue.enqueue(3);
+while (!queue.isEmpty())
+ cout << queue.dequeue() << endl;
+//! [0]
diff --git a/doc/src/snippets/code/src_corelib_tools_qrect.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qrect.cpp
index ebf9118c20..ebf9118c20 100644
--- a/doc/src/snippets/code/src_corelib_tools_qrect.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qrect.cpp
diff --git a/doc/src/snippets/code/src_corelib_tools_qregexp.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qregexp.cpp
index 002ae96f23..002ae96f23 100644
--- a/doc/src/snippets/code/src_corelib_tools_qregexp.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qregexp.cpp
diff --git a/doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qregularexpression.cpp
index cab89d9c9e..cab89d9c9e 100644
--- a/doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qregularexpression.cpp
diff --git a/doc/src/snippets/code/src_corelib_tools_qscopedpointer.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qscopedpointer.cpp
index fd9cd3e4b0..fd9cd3e4b0 100644
--- a/doc/src/snippets/code/src_corelib_tools_qscopedpointer.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qscopedpointer.cpp
diff --git a/doc/src/snippets/code/src_corelib_tools_qsize.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qsize.cpp
index 8772152ad6..8772152ad6 100644
--- a/doc/src/snippets/code/src_corelib_tools_qsize.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qsize.cpp
diff --git a/doc/src/snippets/code/src_corelib_tools_qstring.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qstring.cpp
index 507e929f47..507e929f47 100644
--- a/doc/src/snippets/code/src_corelib_tools_qstring.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qstring.cpp
diff --git a/doc/src/snippets/code/src_corelib_tools_qtimeline.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qtimeline.cpp
index e33c94efda..e33c94efda 100644
--- a/doc/src/snippets/code/src_corelib_tools_qtimeline.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qtimeline.cpp
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qvector.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qvector.cpp
new file mode 100644
index 0000000000..b3f9a7e675
--- /dev/null
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qvector.cpp
@@ -0,0 +1,183 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//! [0]
+QVector<int> integerVector;
+QVector<QString> stringVector;
+//! [0]
+
+
+//! [1]
+QVector<QString> vector(200);
+//! [1]
+
+
+//! [2]
+QVector<QString> vector(200, "Pass");
+//! [2]
+
+
+//! [3]
+if (vector[0] == "Liz")
+ vector[0] = "Elizabeth";
+//! [3]
+
+
+//! [4]
+for (int i = 0; i < vector.size(); ++i) {
+ if (vector.at(i) == "Alfonso")
+ cout << "Found Alfonso at position " << i << endl;
+}
+//! [4]
+
+
+//! [5]
+int i = vector.indexOf("Harumi");
+if (i != -1)
+ cout << "First occurrence of Harumi is at position " << i << endl;
+//! [5]
+
+
+//! [6]
+QVector<int> vector(10);
+int *data = vector.data();
+for (int i = 0; i < 10; ++i)
+ data[i] = 2 * i;
+//! [6]
+
+
+//! [7]
+QVector<QString> vector(0);
+vector.append("one");
+vector.append("two");
+vector.append("three");
+// vector: ["one", "two", "three"]
+//! [7]
+
+
+//! [8]
+QVector<QString> vector;
+vector.prepend("one");
+vector.prepend("two");
+vector.prepend("three");
+// vector: ["three", "two", "one"]
+//! [8]
+
+
+//! [9]
+QVector<QString> vector;
+vector << "alpha" << "beta" << "delta";
+vector.insert(2, "gamma");
+// vector: ["alpha", "beta", "gamma", "delta"]
+//! [9]
+
+
+//! [10]
+QVector<double> vector;
+vector << 2.718 << 1.442 << 0.4342;
+vector.insert(1, 3, 9.9);
+// vector: [2.718, 9.9, 9.9, 9.9, 1.442, 0.4342]
+//! [10]
+
+
+//! [11]
+QVector<QString> vector(3);
+vector.fill("Yes");
+// vector: ["Yes", "Yes", "Yes"]
+
+vector.fill("oh", 5);
+// vector: ["oh", "oh", "oh", "oh", "oh"]
+//! [11]
+
+
+//! [12]
+QVector<QString> vector;
+vector << "A" << "B" << "C" << "B" << "A";
+vector.indexOf("B"); // returns 1
+vector.indexOf("B", 1); // returns 1
+vector.indexOf("B", 2); // returns 3
+vector.indexOf("X"); // returns -1
+//! [12]
+
+
+//! [13]
+QList<QString> vector;
+vector << "A" << "B" << "C" << "B" << "A";
+vector.lastIndexOf("B"); // returns 3
+vector.lastIndexOf("B", 3); // returns 3
+vector.lastIndexOf("B", 2); // returns 1
+vector.lastIndexOf("X"); // returns -1
+//! [13]
+
+
+//! [14]
+QVector<double> vect;
+vect << "red" << "green" << "blue" << "black";
+
+QList<double> list = vect.toList();
+// list: ["red", "green", "blue", "black"]
+//! [14]
+
+
+//! [15]
+QStringList list;
+list << "Sven" << "Kim" << "Ola";
+
+QVector<QString> vect = QVector<QString>::fromList(list);
+// vect: ["Sven", "Kim", "Ola"]
+//! [15]
+
+
+//! [16]
+std::vector<double> stdvector;
+vector.push_back(1.2);
+vector.push_back(0.5);
+vector.push_back(3.14);
+
+QVector<double> vector = QVector<double>::fromStdVector(stdvector);
+//! [16]
+
+
+//! [17]
+QVector<double> vector;
+vector << 1.2 << 0.5 << 3.14;
+
+std::vector<double> stdvector = vector.toStdVector();
+//! [17]
diff --git a/doc/src/snippets/code/src_corelib_xml_qxmlstream.cpp b/src/corelib/doc/snippets/code/src_corelib_xml_qxmlstream.cpp
index 9f40777df1..9f40777df1 100644
--- a/doc/src/snippets/code/src_corelib_xml_qxmlstream.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_xml_qxmlstream.cpp
diff --git a/doc/src/snippets/code/src_gui_dialogs_qmessagebox.cpp b/src/corelib/doc/snippets/code/src_gui_dialogs_qmessagebox.cpp
index 90bc2e9b0a..90bc2e9b0a 100644
--- a/doc/src/snippets/code/src_gui_dialogs_qmessagebox.cpp
+++ b/src/corelib/doc/snippets/code/src_gui_dialogs_qmessagebox.cpp
diff --git a/doc/src/snippets/code/src_gui_itemviews_qidentityproxymodel.cpp b/src/corelib/doc/snippets/code/src_gui_itemviews_qidentityproxymodel.cpp
index cf4707cbeb..cf4707cbeb 100644
--- a/doc/src/snippets/code/src_gui_itemviews_qidentityproxymodel.cpp
+++ b/src/corelib/doc/snippets/code/src_gui_itemviews_qidentityproxymodel.cpp
diff --git a/doc/src/snippets/code/src_gui_itemviews_qitemselectionmodel.cpp b/src/corelib/doc/snippets/code/src_gui_itemviews_qitemselectionmodel.cpp
index ba81221e9c..ba81221e9c 100644
--- a/doc/src/snippets/code/src_gui_itemviews_qitemselectionmodel.cpp
+++ b/src/corelib/doc/snippets/code/src_gui_itemviews_qitemselectionmodel.cpp
diff --git a/doc/src/snippets/file/file.cpp b/src/corelib/doc/snippets/file/file.cpp
index f03c6e6847..f03c6e6847 100644
--- a/doc/src/snippets/file/file.cpp
+++ b/src/corelib/doc/snippets/file/file.cpp
diff --git a/doc/src/snippets/fileinfo/main.cpp b/src/corelib/doc/snippets/fileinfo/main.cpp
index 48d8223d79..48d8223d79 100644
--- a/doc/src/snippets/fileinfo/main.cpp
+++ b/src/corelib/doc/snippets/fileinfo/main.cpp
diff --git a/doc/src/snippets/ntfsp.cpp b/src/corelib/doc/snippets/ntfsp.cpp
index 8f2ff1fc98..8f2ff1fc98 100644
--- a/doc/src/snippets/ntfsp.cpp
+++ b/src/corelib/doc/snippets/ntfsp.cpp
diff --git a/src/corelib/doc/snippets/pointer/pointer.cpp b/src/corelib/doc/snippets/pointer/pointer.cpp
new file mode 100644
index 0000000000..dd2bc82102
--- /dev/null
+++ b/src/corelib/doc/snippets/pointer/pointer.cpp
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QApplication>
+#include <QLabel>
+#include <QPointer>
+
+int main(int argc, char *argv[])
+{
+ QApplication app(argc, argv);
+
+//! [0]
+ QPointer<QLabel> label = new QLabel;
+ label->setText("&Status:");
+//! [0]
+
+//! [1]
+ if (label)
+//! [1] //! [2]
+ label->show();
+//! [2]
+ return 0;
+}
diff --git a/doc/src/snippets/process/process.cpp b/src/corelib/doc/snippets/process/process.cpp
index 19f241a695..19f241a695 100644
--- a/doc/src/snippets/process/process.cpp
+++ b/src/corelib/doc/snippets/process/process.cpp
diff --git a/doc/src/snippets/qdebug/qdebugsnippet.cpp b/src/corelib/doc/snippets/qdebug/qdebugsnippet.cpp
index 2dbfe49c7d..2dbfe49c7d 100644
--- a/doc/src/snippets/qdebug/qdebugsnippet.cpp
+++ b/src/corelib/doc/snippets/qdebug/qdebugsnippet.cpp
diff --git a/doc/src/snippets/qdir-listfiles/main.cpp b/src/corelib/doc/snippets/qdir-listfiles/main.cpp
index 599046aabd..599046aabd 100644
--- a/doc/src/snippets/qdir-listfiles/main.cpp
+++ b/src/corelib/doc/snippets/qdir-listfiles/main.cpp
diff --git a/doc/src/snippets/qdir-namefilters/main.cpp b/src/corelib/doc/snippets/qdir-namefilters/main.cpp
index 7b48f7eaf7..7b48f7eaf7 100644
--- a/doc/src/snippets/qdir-namefilters/main.cpp
+++ b/src/corelib/doc/snippets/qdir-namefilters/main.cpp
diff --git a/doc/src/snippets/qelapsedtimer/main.cpp b/src/corelib/doc/snippets/qelapsedtimer/main.cpp
index 7b4b6529e7..7b4b6529e7 100644
--- a/doc/src/snippets/qelapsedtimer/main.cpp
+++ b/src/corelib/doc/snippets/qelapsedtimer/main.cpp
diff --git a/doc/src/snippets/qmetaobject-invokable/main.cpp b/src/corelib/doc/snippets/qmetaobject-invokable/main.cpp
index b22df1ea15..b22df1ea15 100644
--- a/doc/src/snippets/qmetaobject-invokable/main.cpp
+++ b/src/corelib/doc/snippets/qmetaobject-invokable/main.cpp
diff --git a/doc/src/snippets/qmetaobject-invokable/qmetaobject-invokable.pro b/src/corelib/doc/snippets/qmetaobject-invokable/qmetaobject-invokable.pro
index 4df19215f0..4df19215f0 100644
--- a/doc/src/snippets/qmetaobject-invokable/qmetaobject-invokable.pro
+++ b/src/corelib/doc/snippets/qmetaobject-invokable/qmetaobject-invokable.pro
diff --git a/doc/src/snippets/qmetaobject-invokable/window.cpp b/src/corelib/doc/snippets/qmetaobject-invokable/window.cpp
index 5ab8d83f63..5ab8d83f63 100644
--- a/doc/src/snippets/qmetaobject-invokable/window.cpp
+++ b/src/corelib/doc/snippets/qmetaobject-invokable/window.cpp
diff --git a/doc/src/snippets/qmetaobject-invokable/window.h b/src/corelib/doc/snippets/qmetaobject-invokable/window.h
index f2f34792e5..f2f34792e5 100644
--- a/doc/src/snippets/qmetaobject-invokable/window.h
+++ b/src/corelib/doc/snippets/qmetaobject-invokable/window.h
diff --git a/doc/src/snippets/qprocess-environment/main.cpp b/src/corelib/doc/snippets/qprocess-environment/main.cpp
index 124668a544..124668a544 100644
--- a/doc/src/snippets/qprocess-environment/main.cpp
+++ b/src/corelib/doc/snippets/qprocess-environment/main.cpp
diff --git a/doc/src/snippets/qprocess/qprocess-simpleexecution.cpp b/src/corelib/doc/snippets/qprocess/qprocess-simpleexecution.cpp
index ea1892078e..ea1892078e 100644
--- a/doc/src/snippets/qprocess/qprocess-simpleexecution.cpp
+++ b/src/corelib/doc/snippets/qprocess/qprocess-simpleexecution.cpp
diff --git a/doc/src/snippets/qsignalmapper/buttonwidget.cpp b/src/corelib/doc/snippets/qsignalmapper/buttonwidget.cpp
index cda905e3a2..cda905e3a2 100644
--- a/doc/src/snippets/qsignalmapper/buttonwidget.cpp
+++ b/src/corelib/doc/snippets/qsignalmapper/buttonwidget.cpp
diff --git a/doc/src/snippets/qsignalmapper/buttonwidget.h b/src/corelib/doc/snippets/qsignalmapper/buttonwidget.h
index 9204de935a..9204de935a 100644
--- a/doc/src/snippets/qsignalmapper/buttonwidget.h
+++ b/src/corelib/doc/snippets/qsignalmapper/buttonwidget.h
diff --git a/doc/src/snippets/qsortfilterproxymodel-details/main.cpp b/src/corelib/doc/snippets/qsortfilterproxymodel-details/main.cpp
index 549d24b249..549d24b249 100644
--- a/doc/src/snippets/qsortfilterproxymodel-details/main.cpp
+++ b/src/corelib/doc/snippets/qsortfilterproxymodel-details/main.cpp
diff --git a/doc/src/snippets/qstack/main.cpp b/src/corelib/doc/snippets/qstack/main.cpp
index cc96f8c55d..cc96f8c55d 100644
--- a/doc/src/snippets/qstack/main.cpp
+++ b/src/corelib/doc/snippets/qstack/main.cpp
diff --git a/doc/src/snippets/qstring/main.cpp b/src/corelib/doc/snippets/qstring/main.cpp
index d7299e80d5..d7299e80d5 100644
--- a/doc/src/snippets/qstring/main.cpp
+++ b/src/corelib/doc/snippets/qstring/main.cpp
diff --git a/doc/src/snippets/qstring/stringbuilder.cpp b/src/corelib/doc/snippets/qstring/stringbuilder.cpp
index 53cf0b7be0..53cf0b7be0 100644
--- a/doc/src/snippets/qstring/stringbuilder.cpp
+++ b/src/corelib/doc/snippets/qstring/stringbuilder.cpp
diff --git a/doc/src/snippets/qstringlist/main.cpp b/src/corelib/doc/snippets/qstringlist/main.cpp
index 8ca463371e..8ca463371e 100644
--- a/doc/src/snippets/qstringlist/main.cpp
+++ b/src/corelib/doc/snippets/qstringlist/main.cpp
diff --git a/doc/src/snippets/qstringlistmodel/main.cpp b/src/corelib/doc/snippets/qstringlistmodel/main.cpp
index 24de0fd0ae..24de0fd0ae 100644
--- a/doc/src/snippets/qstringlistmodel/main.cpp
+++ b/src/corelib/doc/snippets/qstringlistmodel/main.cpp
diff --git a/doc/src/snippets/qtcast/qtcast.cpp b/src/corelib/doc/snippets/qtcast/qtcast.cpp
index f0c3834bf0..f0c3834bf0 100644
--- a/doc/src/snippets/qtcast/qtcast.cpp
+++ b/src/corelib/doc/snippets/qtcast/qtcast.cpp
diff --git a/doc/src/snippets/qxmlstreamwriter/main.cpp b/src/corelib/doc/snippets/qxmlstreamwriter/main.cpp
index 907d779357..907d779357 100644
--- a/doc/src/snippets/qxmlstreamwriter/main.cpp
+++ b/src/corelib/doc/snippets/qxmlstreamwriter/main.cpp
diff --git a/doc/src/snippets/settings/settings.cpp b/src/corelib/doc/snippets/settings/settings.cpp
index 8648843d43..8648843d43 100644
--- a/doc/src/snippets/settings/settings.cpp
+++ b/src/corelib/doc/snippets/settings/settings.cpp
diff --git a/doc/src/snippets/sharedemployee/employee.h b/src/corelib/doc/snippets/sharedemployee/employee.h
index efb1d32000..efb1d32000 100644
--- a/doc/src/snippets/sharedemployee/employee.h
+++ b/src/corelib/doc/snippets/sharedemployee/employee.h
diff --git a/doc/src/snippets/sharedemployee/main.cpp b/src/corelib/doc/snippets/sharedemployee/main.cpp
index 6e840ab5e6..6e840ab5e6 100644
--- a/doc/src/snippets/sharedemployee/main.cpp
+++ b/src/corelib/doc/snippets/sharedemployee/main.cpp
diff --git a/doc/src/snippets/signalmapper/filereader.cpp b/src/corelib/doc/snippets/signalmapper/filereader.cpp
index 067ba8280e..067ba8280e 100644
--- a/doc/src/snippets/signalmapper/filereader.cpp
+++ b/src/corelib/doc/snippets/signalmapper/filereader.cpp
diff --git a/doc/src/snippets/signalsandslots/lcdnumber.h b/src/corelib/doc/snippets/signalsandslots/lcdnumber.h
index 7056254f9f..7056254f9f 100644
--- a/doc/src/snippets/signalsandslots/lcdnumber.h
+++ b/src/corelib/doc/snippets/signalsandslots/lcdnumber.h
diff --git a/doc/src/snippets/signalsandslots/signalsandslots.cpp b/src/corelib/doc/snippets/signalsandslots/signalsandslots.cpp
index 3072650585..3072650585 100644
--- a/doc/src/snippets/signalsandslots/signalsandslots.cpp
+++ b/src/corelib/doc/snippets/signalsandslots/signalsandslots.cpp
diff --git a/doc/src/snippets/signalsandslots/signalsandslots.h b/src/corelib/doc/snippets/signalsandslots/signalsandslots.h
index e18f955a41..e18f955a41 100644
--- a/doc/src/snippets/signalsandslots/signalsandslots.h
+++ b/src/corelib/doc/snippets/signalsandslots/signalsandslots.h
diff --git a/doc/src/snippets/streaming/main.cpp b/src/corelib/doc/snippets/streaming/main.cpp
index 7c992345c2..7c992345c2 100644
--- a/doc/src/snippets/streaming/main.cpp
+++ b/src/corelib/doc/snippets/streaming/main.cpp
diff --git a/doc/src/snippets/streaming/streaming.pro b/src/corelib/doc/snippets/streaming/streaming.pro
index 8c5eb91f05..8c5eb91f05 100644
--- a/doc/src/snippets/streaming/streaming.pro
+++ b/src/corelib/doc/snippets/streaming/streaming.pro
diff --git a/doc/src/snippets/threads/threads.cpp b/src/corelib/doc/snippets/threads/threads.cpp
index 9ef716705a..9ef716705a 100644
--- a/doc/src/snippets/threads/threads.cpp
+++ b/src/corelib/doc/snippets/threads/threads.cpp
diff --git a/doc/src/snippets/threads/threads.h b/src/corelib/doc/snippets/threads/threads.h
index a45a2c92da..a45a2c92da 100644
--- a/doc/src/snippets/threads/threads.h
+++ b/src/corelib/doc/snippets/threads/threads.h
diff --git a/doc/src/snippets/timers/timers.cpp b/src/corelib/doc/snippets/timers/timers.cpp
index 65b1c0d146..65b1c0d146 100644
--- a/doc/src/snippets/timers/timers.cpp
+++ b/src/corelib/doc/snippets/timers/timers.cpp
diff --git a/doc/src/corelib/containers.qdoc b/src/corelib/doc/src/containers.qdoc
index b63cc9df28..8419a92dcf 100644
--- a/doc/src/corelib/containers.qdoc
+++ b/src/corelib/doc/src/containers.qdoc
@@ -205,7 +205,7 @@
Here's an example custom data type that meets the requirement of
an assignable data type:
- \snippet doc/src/snippets/code/doc_src_containers.cpp 0
+ \snippet code/doc_src_containers.cpp 0
If we don't provide a copy constructor or an assignment operator,
C++ provides a default implementation that performs a
@@ -216,7 +216,7 @@
explicit constructors or assignment operator, the following data
type can be stored in a container:
- \snippet doc/src/snippets/streaming/main.cpp 0
+ \snippet streaming/main.cpp 0
Some containers have additional requirements for the data types
they can store. For example, the Key type of a QMap<Key, T> must
@@ -233,9 +233,9 @@
straightforward; here's how we could do it for the Movie struct
above:
- \snippet doc/src/snippets/streaming/main.cpp 1
+ \snippet streaming/main.cpp 1
\codeline
- \snippet doc/src/snippets/streaming/main.cpp 2
+ \snippet streaming/main.cpp 2
\keyword default-constructed values
@@ -301,12 +301,12 @@
iterator positions as red arrows for a list containing four
items:
- \img javaiterators1.png
+ \image javaiterators1.png
Here's a typical loop for iterating through all the elements of a
QList<QString> in order and printing them to the console:
- \snippet doc/src/snippets/code/doc_src_containers.cpp 1
+ \snippet code/doc_src_containers.cpp 1
It works as follows: The QList to iterate over is passed to the
QListIterator constructor. At that point, the iterator is located
@@ -319,7 +319,7 @@
Here's how to iterate backward in a QList:
- \snippet doc/src/snippets/code/doc_src_containers.cpp 2
+ \snippet code/doc_src_containers.cpp 2
The code is symmetric with iterating forward, except that we
start by calling \l{QListIterator::toBack()}{toBack()}
@@ -329,7 +329,7 @@
\l{QListIterator::next()}{next()} and
\l{QListIterator::previous()}{previous()} on an iterator:
- \img javaiterators2.png
+ \image javaiterators2.png
The following table summarizes the QListIterator API:
@@ -358,7 +358,7 @@
QMutableListIterator. Here's an example where we remove all
odd numbers from a QList<int> using QMutableListIterator:
- \snippet doc/src/snippets/code/doc_src_containers.cpp 3
+ \snippet code/doc_src_containers.cpp 3
The next() call in the loop is made every time. It jumps over the
next item in the list. The
@@ -368,13 +368,13 @@
the iterator, so it is safe to continue using it. This works just
as well when iterating backward:
- \snippet doc/src/snippets/code/doc_src_containers.cpp 4
+ \snippet code/doc_src_containers.cpp 4
If we just want to modify the value of an existing item, we can
use \l{QMutableListIterator::setValue()}{setValue()}. In the code
below, we replace any value larger than 128 with 128:
- \snippet doc/src/snippets/code/doc_src_containers.cpp 5
+ \snippet code/doc_src_containers.cpp 5
Just like \l{QMutableListIterator::remove()}{remove()},
\l{QMutableListIterator::setValue()}{setValue()} operates on the
@@ -387,7 +387,7 @@
operations, we don't even need
\l{QMutableListIterator::setValue()}{setValue()}:
- \snippet doc/src/snippets/code/doc_src_containers.cpp 6
+ \snippet code/doc_src_containers.cpp 6
As mentioned above, QLinkedList's, QVector's, and QSet's iterator
classes have exactly the same API as QList's. We will now turn to
@@ -410,7 +410,7 @@
The following example removes all (capital, country) pairs where
the capital's name ends with "City":
- \snippet doc/src/snippets/code/doc_src_containers.cpp 7
+ \snippet code/doc_src_containers.cpp 7
QMapIterator also provides a key() and a value() function that
operate directly on the iterator and that return the key and
@@ -418,7 +418,7 @@
example, the following code copies the contents of a QMap into a
QHash:
- \snippet doc/src/snippets/code/doc_src_containers.cpp 8
+ \snippet code/doc_src_containers.cpp 8
If we want to iterate through all the items with the same
value, we can use \l{QMapIterator::findNext()}{findNext()}
@@ -426,7 +426,7 @@
Here's an example where we remove all the items with a particular
value:
- \snippet doc/src/snippets/code/doc_src_containers.cpp 9
+ \snippet code/doc_src_containers.cpp 9
\section2 STL-Style Iterators
@@ -473,7 +473,7 @@
Here's a typical loop for iterating through all the elements of a
QList<QString> in order and converting them to lowercase:
- \snippet doc/src/snippets/code/doc_src_containers.cpp 10
+ \snippet code/doc_src_containers.cpp 10
Unlike \l{Java-style iterators}, STL-style iterators point
directly at items. The begin() function of a container returns an
@@ -487,13 +487,13 @@
The diagram below shows the valid iterator positions as red
arrows for a vector containing four items:
- \img stliterators1.png
+ \image stliterators1.png
Iterating backward with an STL-style iterator requires us to
decrement the iterator \e before we access the item. This
requires a \c while loop:
- \snippet doc/src/snippets/code/doc_src_containers.cpp 11
+ \snippet code/doc_src_containers.cpp 11
In the code snippets so far, we used the unary \c * operator to
retrieve the item (of type QString) stored at a certain iterator
@@ -504,7 +504,7 @@
For read-only access, you can use const_iterator, constBegin(),
and constEnd(). For example:
- \snippet doc/src/snippets/code/doc_src_containers.cpp 12
+ \snippet code/doc_src_containers.cpp 12
The following table summarizes the STL-style iterators' API:
@@ -536,7 +536,7 @@
value() function to retrieve the value. For example, here's how
we would print all items in a QMap to the console:
- \snippet doc/src/snippets/code/doc_src_containers.cpp 13
+ \snippet code/doc_src_containers.cpp 13
Thanks to \l{implicit sharing}, it is very inexpensive for a
function to return a container per value. The Qt API contains
@@ -545,7 +545,7 @@
using an STL iterator, you should always take a copy of the
container and iterate over the copy. For example:
- \snippet doc/src/snippets/code/doc_src_containers.cpp 14
+ \snippet code/doc_src_containers.cpp 14
This problem doesn't occur with functions that return a const or
non-const reference to a container.
@@ -567,35 +567,35 @@
statement. For example, here's how to use \c foreach to iterate
over a QLinkedList<QString>:
- \snippet doc/src/snippets/code/doc_src_containers.cpp 15
+ \snippet code/doc_src_containers.cpp 15
The \c foreach code is significantly shorter than the equivalent
code that uses iterators:
- \snippet doc/src/snippets/code/doc_src_containers.cpp 16
+ \snippet code/doc_src_containers.cpp 16
Unless the data type contains a comma (e.g., \c{QPair<int,
int>}), the variable used for iteration can be defined within the
\c foreach statement:
- \snippet doc/src/snippets/code/doc_src_containers.cpp 17
+ \snippet code/doc_src_containers.cpp 17
And like any other C++ loop construct, you can use braces around
the body of a \c foreach loop, and you can use \c break to leave
the loop:
- \snippet doc/src/snippets/code/doc_src_containers.cpp 18
+ \snippet code/doc_src_containers.cpp 18
With QMap and QHash, \c foreach accesses the value component of
the (key, value) pairs. If you want to iterate over both the keys
and the values, you can use iterators (which are fastest), or you
can write code like this:
- \snippet doc/src/snippets/code/doc_src_containers.cpp 19
+ \snippet code/doc_src_containers.cpp 19
For a multi-valued map:
- \snippet doc/src/snippets/code/doc_src_containers.cpp 20
+ \snippet code/doc_src_containers.cpp 20
Qt automatically takes a copy of the container when it enters a
\c foreach loop. If you modify the container as you are
@@ -611,12 +611,12 @@
In addition to \c foreach, Qt also provides a \c forever
pseudo-keyword for infinite loops:
- \snippet doc/src/snippets/code/doc_src_containers.cpp 21
+ \snippet code/doc_src_containers.cpp 21
If you're worried about namespace pollution, you can disable
these macros by adding the following line to your \c .pro file:
- \snippet doc/src/snippets/code/doc_src_containers.cpp 22
+ \snippet code/doc_src_containers.cpp 22
\section1 Other Container-Like Classes
@@ -736,7 +736,7 @@
Consider the following code, which builds a QString from another
QString:
- \snippet doc/src/snippets/code/doc_src_containers.cpp 23
+ \snippet code/doc_src_containers.cpp 23
We build the string \c out dynamically by appending one character
to it at a time. Let's assume that we append 15000 characters to
diff --git a/doc/src/network/files-and-resources/datastreamformat.qdoc b/src/corelib/doc/src/datastreamformat.qdoc
index 8ff31371a2..8ff31371a2 100644
--- a/doc/src/network/files-and-resources/datastreamformat.qdoc
+++ b/src/corelib/doc/src/datastreamformat.qdoc
diff --git a/doc/src/corelib/implicit-sharing.qdoc b/src/corelib/doc/src/implicit-sharing.qdoc
index e652e21253..6fc60de35e 100644
--- a/doc/src/corelib/implicit-sharing.qdoc
+++ b/src/corelib/doc/src/implicit-sharing.qdoc
@@ -109,7 +109,7 @@
data in all member functions that change the internal data.
Code fragment:
- \snippet doc/src/snippets/code/doc_src_groups.cpp 0
+ \snippet code/doc_src_groups.cpp 0
\section1 List of Classes
@@ -124,7 +124,7 @@
concern for the copying overhead.
Example:
- \snippet doc/src/snippets/code/doc_src_groups.cpp 1
+ \snippet code/doc_src_groups.cpp 1
In this example, \c p1 and \c p2 share data until QPainter::begin()
is called for \c p2, because painting a pixmap will modify it.
diff --git a/doc/src/corelib/json.qdoc b/src/corelib/doc/src/json.qdoc
index 88b5377074..406135cc45 100644
--- a/doc/src/corelib/json.qdoc
+++ b/src/corelib/doc/src/json.qdoc
@@ -49,7 +49,7 @@
data in a binary format that is directly mmap'able and very fast to
access.
- More details about the JSON data format can be found at \link json.org
+ More details about the JSON data format can be found at \l{http://json.org}{json.org}
and in \l{http://tools.ietf.org/html/rfc4627}{RFC-4627}.
\tableofcontents
diff --git a/doc/src/corelib/objectmodel/metaobjects.qdoc b/src/corelib/doc/src/objectmodel/metaobjects.qdoc
index c92f6f2f09..8e071be91e 100644
--- a/doc/src/corelib/objectmodel/metaobjects.qdoc
+++ b/src/corelib/doc/src/objectmodel/metaobjects.qdoc
@@ -92,32 +92,32 @@
For example, let's assume \c MyWidget inherits from QWidget and
is declared with the Q_OBJECT macro:
- \snippet doc/src/snippets/qtcast/qtcast.cpp 0
+ \snippet qtcast/qtcast.cpp 0
The \c obj variable, of type \c{QObject *}, actually refers to a
\c MyWidget object, so we can cast it appropriately:
- \snippet doc/src/snippets/qtcast/qtcast.cpp 1
+ \snippet qtcast/qtcast.cpp 1
The cast from QObject to QWidget is successful, because the
object is actually a \c MyWidget, which is a subclass of QWidget.
Since we know that \c obj is a \c MyWidget, we can also cast it to
\c{MyWidget *}:
- \snippet doc/src/snippets/qtcast/qtcast.cpp 2
+ \snippet qtcast/qtcast.cpp 2
The cast to \c MyWidget is successful because qobject_cast()
makes no distinction between built-in Qt types and custom types.
- \snippet doc/src/snippets/qtcast/qtcast.cpp 3
- \snippet doc/src/snippets/qtcast/qtcast.cpp 4
+ \snippet qtcast/qtcast.cpp 3
+ \snippet qtcast/qtcast.cpp 4
The cast to QLabel, on the other hand, fails. The pointer is then
set to 0. This makes it possible to handle objects of different
types differently at run-time, based on the type:
- \snippet doc/src/snippets/qtcast/qtcast.cpp 5
- \snippet doc/src/snippets/qtcast/qtcast.cpp 6
+ \snippet qtcast/qtcast.cpp 5
+ \snippet qtcast/qtcast.cpp 6
While it is possible to use QObject as a base class without the
Q_OBJECT macro and without meta-object code, neither signals
diff --git a/doc/src/corelib/objectmodel/object.qdoc b/src/corelib/doc/src/objectmodel/object.qdoc
index 4e212b37dd..4e212b37dd 100644
--- a/doc/src/corelib/objectmodel/object.qdoc
+++ b/src/corelib/doc/src/objectmodel/object.qdoc
diff --git a/doc/src/corelib/objectmodel/objecttrees.qdoc b/src/corelib/doc/src/objectmodel/objecttrees.qdoc
index 3e51eeba83..e03a93ab3d 100644
--- a/doc/src/corelib/objectmodel/objecttrees.qdoc
+++ b/src/corelib/doc/src/objectmodel/objecttrees.qdoc
@@ -77,7 +77,7 @@
behavior applies. Normally, the order of destruction still doesn't
present a problem. Consider the following snippet:
- \snippet doc/src/snippets/code/doc_src_objecttrees.cpp 0
+ \snippet code/doc_src_objecttrees.cpp 0
The parent, \c window, and the child, \c quit, are both \l {QObject}
{QObjects} because QPushButton inherits QWidget, and QWidget inherits
@@ -91,7 +91,7 @@
But now consider what happens if we swap the order of construction, as
shown in this second snippet:
- \snippet doc/src/snippets/code/doc_src_objecttrees.cpp 1
+ \snippet code/doc_src_objecttrees.cpp 1
In this case, the order of destruction causes a problem. The parent's
destructor is called first because it was created last. It then calls
diff --git a/doc/src/corelib/objectmodel/properties.qdoc b/src/corelib/doc/src/objectmodel/properties.qdoc
index 4d090af8fc..9d248f00de 100644
--- a/doc/src/corelib/objectmodel/properties.qdoc
+++ b/src/corelib/doc/src/objectmodel/properties.qdoc
@@ -46,12 +46,12 @@
To declare a property, use the \l {Q_PROPERTY()} {Q_PROPERTY()}
macro in a class that inherits QObject.
- \snippet doc/src/snippets/code/doc_src_properties.cpp 0
+ \snippet code/doc_src_properties.cpp 0
Here are some typical examples of property declarations taken from
class QWidget.
- \snippet doc/src/snippets/code/doc_src_properties.cpp 1
+ \snippet code/doc_src_properties.cpp 1
A property behaves like a class data member, but it has additional
features accessible through the \l {Meta-Object System}.
@@ -135,7 +135,7 @@
be a user-defined type. In this example, class QDate is considered
to be a user-defined type.
- \snippet doc/src/snippets/code/doc_src_properties.cpp 2
+ \snippet code/doc_src_properties.cpp 2
Because QDate is user-defined, you must include the \c{<QDate>}
header file with the property declaration.
@@ -156,7 +156,7 @@
the code snippet below, the call to QAbstractButton::setDown() and
the call to QObject::setProperty() both set property "down".
- \snippet doc/src/snippets/code/doc_src_properties.cpp 3
+ \snippet code/doc_src_properties.cpp 3
Accessing a property through its \c WRITE accessor is the better
of the two, because it is faster and gives better diagnostics at
@@ -166,7 +166,7 @@
can \e discover a class's properties at run time by querying its
QObject, QMetaObject, and \l {QMetaProperty} {QMetaProperties}.
- \snippet doc/src/snippets/code/doc_src_properties.cpp 4
+ \snippet code/doc_src_properties.cpp 4
In the above snippet, QMetaObject::property() is used to get \l
{QMetaProperty} {metadata} about each property defined in some
@@ -193,7 +193,7 @@
for the \c READ and \c WRITE functions. The declaration of MyClass
then might look like this:
- \snippet doc/src/snippets/code/doc_src_properties.cpp 5
+ \snippet code/doc_src_properties.cpp 5
The \c READ function is const and returns the property type. The
\c WRITE function returns void and has exactly one parameter of
@@ -204,7 +204,7 @@
QObject that is an instance of MyClass, we have two ways to set
its priority property:
- \snippet doc/src/snippets/code/doc_src_properties.cpp 6
+ \snippet code/doc_src_properties.cpp 6
In the example, the enumeration type that is the property type is
declared in MyClass and registered with the \l{Meta-Object System}
@@ -266,7 +266,7 @@
Q_CLASSINFO(), that can be used to attach additional
\e{name}--\e{value} pairs to a class's meta-object, for example:
- \snippet doc/src/snippets/code/doc_src_properties.cpp 7
+ \snippet code/doc_src_properties.cpp 7
Like other meta-data, class information is accessible at run-time
through the meta-object; see QMetaObject::classInfo() for details.
diff --git a/doc/src/corelib/objectmodel/signalsandslots.qdoc b/src/corelib/doc/src/objectmodel/signalsandslots.qdoc
index 9100980121..0f12c9c8f2 100644
--- a/doc/src/corelib/objectmodel/signalsandslots.qdoc
+++ b/src/corelib/doc/src/objectmodel/signalsandslots.qdoc
@@ -44,7 +44,7 @@
In GUI programming, when we change one widget, we often want
another widget to be notified. More generally, we want objects of
any kind to be able to communicate with one another. For example,
- if a user clicks a \gui{Close} button, we probably want the
+ if a user clicks a \uicontrol{Close} button, we probably want the
window's \l{QWidget::close()}{close()} function to be called.
Older toolkits achieve this kind of communication using
@@ -70,7 +70,7 @@
practice to subclass widgets and add your own slots so that you
can handle the signals that you are interested in.
- \img abstract-connections.png
+ \image abstract-connections.png
\omit
\caption An abstract view of some signals and slots connections
\endomit
@@ -113,14 +113,14 @@
A minimal C++ class declaration might read:
- \snippet doc/src/snippets/signalsandslots/signalsandslots.h 0
+ \snippet signalsandslots/signalsandslots.h 0
A small QObject-based class might read:
- \snippet doc/src/snippets/signalsandslots/signalsandslots.h 1
+ \snippet signalsandslots/signalsandslots.h 1
\codeline
- \snippet doc/src/snippets/signalsandslots/signalsandslots.h 2
- \snippet doc/src/snippets/signalsandslots/signalsandslots.h 3
+ \snippet signalsandslots/signalsandslots.h 2
+ \snippet signalsandslots/signalsandslots.h 3
The QObject-based version has the same internal state, and provides
public methods to access the state, but in addition it has support
@@ -137,7 +137,7 @@
Here is a possible implementation of the \c{Counter::setValue()}
slot:
- \snippet doc/src/snippets/signalsandslots/signalsandslots.cpp 0
+ \snippet signalsandslots/signalsandslots.cpp 0
The \c{emit} line emits the signal \c valueChanged() from the
object, with the new value as argument.
@@ -146,11 +146,11 @@
and connect the first object's \c valueChanged() signal to the
second object's \c setValue() slot using QObject::connect():
- \snippet doc/src/snippets/signalsandslots/signalsandslots.cpp 1
- \snippet doc/src/snippets/signalsandslots/signalsandslots.cpp 2
+ \snippet signalsandslots/signalsandslots.cpp 1
+ \snippet signalsandslots/signalsandslots.cpp 2
\codeline
- \snippet doc/src/snippets/signalsandslots/signalsandslots.cpp 3
- \snippet doc/src/snippets/signalsandslots/signalsandslots.cpp 4
+ \snippet signalsandslots/signalsandslots.cpp 3
+ \snippet signalsandslots/signalsandslots.cpp 4
Calling \c{a.setValue(12)} makes \c{a} emit a
\c{valueChanged(12)} signal, which \c{b} will receive in its
@@ -276,13 +276,13 @@
also check if an object \link QObject::inherits()
inherits\endlink a specific class, for example:
- \snippet doc/src/snippets/signalsandslots/signalsandslots.cpp 5
- \snippet doc/src/snippets/signalsandslots/signalsandslots.cpp 6
+ \snippet signalsandslots/signalsandslots.cpp 5
+ \snippet signalsandslots/signalsandslots.cpp 6
The meta-object information is also used by qobject_cast<T>(), which
is similar to QObject::inherits() but is less error-prone:
- \snippet doc/src/snippets/signalsandslots/signalsandslots.cpp 7
+ \snippet signalsandslots/signalsandslots.cpp 7
See \l{Meta-Object System} for more information.
@@ -290,14 +290,14 @@
Here is a simple commented example of a widget.
- \snippet doc/src/snippets/signalsandslots/lcdnumber.h 0
- \snippet doc/src/snippets/signalsandslots/lcdnumber.h 1
+ \snippet signalsandslots/lcdnumber.h 0
+ \snippet signalsandslots/lcdnumber.h 1
\codeline
- \snippet doc/src/snippets/signalsandslots/lcdnumber.h 2
+ \snippet signalsandslots/lcdnumber.h 2
\codeline
- \snippet doc/src/snippets/signalsandslots/lcdnumber.h 3
- \snippet doc/src/snippets/signalsandslots/lcdnumber.h 4
- \snippet doc/src/snippets/signalsandslots/lcdnumber.h 5
+ \snippet signalsandslots/lcdnumber.h 3
+ \snippet signalsandslots/lcdnumber.h 4
+ \snippet signalsandslots/lcdnumber.h 5
\c LcdNumber inherits QObject, which has most of the signal-slot
knowledge, via QFrame and QWidget. It is somewhat similar to the
@@ -310,8 +310,8 @@
\l{moc}{run the moc} or to include the moc output in the link
command.
- \snippet doc/src/snippets/signalsandslots/lcdnumber.h 6
- \snippet doc/src/snippets/signalsandslots/lcdnumber.h 7
+ \snippet signalsandslots/lcdnumber.h 6
+ \snippet signalsandslots/lcdnumber.h 7
It's not obviously relevant to the moc, but if you inherit
QWidget you almost certainly want to have the \c parent argument
@@ -320,8 +320,8 @@
Some destructors and member functions are omitted here; the \c
moc ignores member functions.
- \snippet doc/src/snippets/signalsandslots/lcdnumber.h 8
- \snippet doc/src/snippets/signalsandslots/lcdnumber.h 9
+ \snippet signalsandslots/lcdnumber.h 8
+ \snippet signalsandslots/lcdnumber.h 9
\c LcdNumber emits a signal when it is asked to show an impossible
value.
@@ -334,11 +334,11 @@
functions when the number overflows, simply connect the signal to
two different slots. Qt will call both (in the order they were connected).
- \snippet doc/src/snippets/signalsandslots/lcdnumber.h 10
- \snippet doc/src/snippets/signalsandslots/lcdnumber.h 11
- \snippet doc/src/snippets/signalsandslots/lcdnumber.h 12
+ \snippet signalsandslots/lcdnumber.h 10
+ \snippet signalsandslots/lcdnumber.h 11
+ \snippet signalsandslots/lcdnumber.h 12
\codeline
- \snippet doc/src/snippets/signalsandslots/lcdnumber.h 13
+ \snippet signalsandslots/lcdnumber.h 13
A slot is a receiving function used to get information about
state changes in other widgets. \c LcdNumber uses it, as the code
@@ -440,13 +440,13 @@
map all the clicked() signals to a QSignalMapper object. Then you connect
the file's QPushButton::clicked() signal to the QSignalMapper::map() slot.
- \snippet doc/src/snippets/signalmapper/filereader.cpp 0
+ \snippet signalmapper/filereader.cpp 0
Then, you connect the \l{QSignalMapper::}{mapped()} signal to
\c{readFile()} where a different file will be opened, depending on
which push button is pressed.
- \snippet doc/src/snippets/signalmapper/filereader.cpp 1
+ \snippet signalmapper/filereader.cpp 1
\sa {Meta-Object System}, {Qt's Property System}
@@ -457,7 +457,7 @@
You can even use both mechanisms in the same project. Just add the
following line to your qmake project (.pro) file.
- \snippet doc/src/snippets/code/doc_src_containers.cpp 22
+ \snippet code/doc_src_containers.cpp 22
It tells Qt not to define the moc keywords \c{signals}, \c{slots},
and \c{emit}, because these names will be used by a 3rd party
diff --git a/doc/src/corelib/qtcore.qdoc b/src/corelib/doc/src/qtcore.qdoc
index 36d128e3df..66c8704322 100644
--- a/doc/src/corelib/qtcore.qdoc
+++ b/src/corelib/doc/src/qtcore.qdoc
@@ -37,6 +37,6 @@
All other Qt modules rely on this module. To include the
definitions of the module's classes, use the following directive:
- \snippet doc/src/snippets/code/doc_src_qtcore.cpp 0
+ \snippet code/doc_src_qtcore.cpp 0
*/
diff --git a/doc/src/corelib/threads-basics.qdoc b/src/corelib/doc/src/threads-basics.qdoc
index e54f8a7ccb..0f455c01e5 100644
--- a/doc/src/corelib/threads-basics.qdoc
+++ b/src/corelib/doc/src/threads-basics.qdoc
@@ -44,7 +44,7 @@
player reveals that there are again things going on in parallel within one
single process. While the media player is sending music to the audio driver,
the user interface with all its bells and whistles is being constantly
- updated. This is what threads are for \mdash concurrency within one single
+ updated. This is what threads are for -- concurrency within one single
process.
So how is concurrency implemented? Parallel work on single core CPUs is an
@@ -244,18 +244,18 @@
code that generates another thread which says hello in that thread and then
exits.
- \snippet examples/tutorials/threads/hellothread/hellothread.h 1
+ \snippet tutorials/threads/hellothread/hellothread.h 1
We derive a class from QThread and reimplement the \l{QThread::}{run()}
method.
- \snippet examples/tutorials/threads/hellothread/hellothread.cpp 1
+ \snippet tutorials/threads/hellothread/hellothread.cpp 1
The run method contains the code that will be run in a separate thread. In
this example, a message containing the thread ID will be printed.
QThread::start() will call the method in another thread.
- \snippet examples/tutorials/threads/hellothread/main.cpp 1
+ \snippet tutorials/threads/hellothread/main.cpp 1
To start the thread, our thread object needs to be instantiated. The
\l{QThread::}{start()} method creates a new thread and calls the
@@ -453,7 +453,7 @@
another thread needs to be placed in the reimplemented QRunnable::run()
method.
- \snippet examples/tutorials/threads/hellothreadpool/hellothreadpool.cpp 1
+ \snippet tutorials/threads/hellothreadpool/hellothreadpool.cpp 1
We instantiate Work in main(), locate the global thread pool and use the
QThreadPool::start() method. Now the thread pool runs our worker in another
@@ -463,7 +463,7 @@
\section2 Example 2: Using QtConcurrent
- \snippet examples/tutorials/threads/helloconcurrent/helloconcurrent.cpp 1
+ \snippet tutorials/threads/helloconcurrent/helloconcurrent.cpp 1
We write a global function hello() to implement the work. QtConcurrent::run()
is used to run the function in another thread. The result is a QFuture.
@@ -499,17 +499,17 @@
Communication from the GUI to the worker thread is shown in the next
example.
- \snippet examples/tutorials/threads/clock/main.cpp 1
+ \snippet tutorials/threads/clock/main.cpp 1
We've connected the \c clockThread with the label. The connection must be a
queued signal-slot connection because we want to put the call in the event
loop.
- \snippet examples/tutorials/threads/clock/clockthread.h 1
+ \snippet tutorials/threads/clock/clockthread.h 1
We have derived a class from QThread and declared the \c sendTime() signal.
- \snippet examples/tutorials/threads/clock/clockthread.cpp 1
+ \snippet tutorials/threads/clock/clockthread.cpp 1
The trickiest part of this example is that the timer is connected to its
slot via a direct connection. A default connection would produce a queued
@@ -541,7 +541,7 @@
The \c Thread class's code is short but somewhat involved, so we only show
how to use the class.
- \snippet examples/tutorials/threads/movedobject/main.cpp 1
+ \snippet tutorials/threads/movedobject/main.cpp 1
QMetaObject::invokeMethod() calls a slot via the event loop. The worker
object's methods should not be called directly after the object has been
diff --git a/doc/src/corelib/threads.qdoc b/src/corelib/doc/src/threads.qdoc
index 04a5379b2d..80c9445f6f 100644
--- a/doc/src/corelib/threads.qdoc
+++ b/src/corelib/doc/src/threads.qdoc
@@ -129,12 +129,12 @@
To create a thread, subclass QThread and reimplement its
\l{QThread::run()}{run()} function. For example:
- \snippet doc/src/snippets/threads/threads.h 0
+ \snippet threads/threads.h 0
\codeline
- \snippet doc/src/snippets/threads/threads.cpp 0
- \snippet doc/src/snippets/threads/threads.cpp 1
+ \snippet threads/threads.cpp 0
+ \snippet threads/threads.cpp 1
\dots
- \snippet doc/src/snippets/threads/threads.cpp 2
+ \snippet threads/threads.cpp 2
\section1 Starting a Thread
@@ -258,8 +258,8 @@
a member function on the \e{same} instance of the class at the
same time. For example, the \c Counter class below is reentrant:
- \snippet doc/src/snippets/threads/threads.cpp 3
- \snippet doc/src/snippets/threads/threads.cpp 4
+ \snippet threads/threads.cpp 3
+ \snippet threads/threads.cpp 4
The class isn't thread-safe, because if multiple threads try to
modify the data member \c n, the result is undefined. This is
@@ -285,8 +285,8 @@
the class thread-safe is to protect all access to the data
members with a QMutex:
- \snippet doc/src/snippets/threads/threads.cpp 5
- \snippet doc/src/snippets/threads/threads.cpp 6
+ \snippet threads/threads.cpp 5
+ \snippet threads/threads.cpp 6
The QMutexLocker class automatically locks the mutex in its
constructor and unlocks it when the destructor is invoked, at the
diff --git a/src/corelib/global/qcompilerdetection.h b/src/corelib/global/qcompilerdetection.h
index 6d7635ef67..a971bfdf12 100644
--- a/src/corelib/global/qcompilerdetection.h
+++ b/src/corelib/global/qcompilerdetection.h
@@ -40,6 +40,10 @@
**
****************************************************************************/
+#ifndef QGLOBAL_H
+# include <QtCore/qglobal.h>
+#endif
+
#ifndef QCOMPILERDETECTION_H
#define QCOMPILERDETECTION_H
@@ -86,13 +90,19 @@
# define Q_CC_MSVC_NET
# define Q_OUTOFLINE_TEMPLATE inline
# define Q_NO_TEMPLATE_FRIENDS
+# define Q_COMPILER_MANGLES_RETURN_TYPE
+# define Q_FUNC_INFO __FUNCSIG__
# define Q_ALIGNOF(type) __alignof(type)
# define Q_DECL_ALIGN(n) __declspec(align(n))
# define Q_ASSUME(expr) __assume(expr)
# define Q_UNREACHABLE() __assume(0)
# define Q_NORETURN __declspec(noreturn)
+# define Q_DECL_DEPRECATED __declspec(deprecated)
+# define Q_DECL_EXPORT __declspec(dllexport)
+# define Q_DECL_IMPORT __declspec(dllimport)
/* Intel C++ disguising as Visual C++: the `using' keyword avoids warnings */
# if defined(__INTEL_COMPILER)
+# define Q_DECL_VARIABLE_DEPRECATED
# define Q_CC_INTEL
# endif
/* MSVC does not support SSE/MMX on x64 */
@@ -139,6 +149,16 @@
/* work-around for missing compiler intrinsics */
# define __is_empty(X) false
# define __is_pod(X) false
+# define Q_DECL_DEPRECATED __attribute__ ((__deprecated__))
+# ifdef Q_OS_LINUX
+# define Q_DECL_EXPORT __attribute__((visibility("default")))
+# define Q_DECL_IMPORT __attribute__((visibility("default")))
+# define Q_DECL_HIDDEN __attribute__((visibility("hidden")))
+# else
+# define Q_DECL_EXPORT __declspec(dllexport)
+# define Q_DECL_IMPORT __declspec(dllimport)
+# endif
+
#elif defined(__GNUC__)
# define Q_CC_GNU
# define Q_C_CALLBACKS
@@ -163,12 +183,24 @@
# endif
# endif
+# ifdef Q_OS_WIN
+# define Q_DECL_EXPORT __declspec(dllexport)
+# define Q_DECL_IMPORT __declspec(dllimport)
+# elif defined(QT_VISIBILITY_AVAILABLE)
+# define Q_DECL_EXPORT __attribute__((visibility("default")))
+# define Q_DECL_IMPORT __attribute__((visibility("default")))
+# define Q_DECL_HIDDEN __attribute__((visibility("hidden")))
+# endif
+
+# define Q_FUNC_INFO __PRETTY_FUNCTION__
# define Q_ALIGNOF(type) __alignof__(type)
# define Q_TYPEOF(expr) __typeof__(expr)
+# define Q_DECL_DEPRECATED __attribute__ ((__deprecated__))
# define Q_DECL_ALIGN(n) __attribute__((__aligned__(n)))
# define Q_LIKELY(expr) __builtin_expect(!!(expr), true)
# define Q_UNLIKELY(expr) __builtin_expect(!!(expr), false)
# define Q_NORETURN __attribute__((__noreturn__))
+# define Q_REQUIRED_RESULT __attribute__ ((__warn_unused_result__))
# if !defined(QT_MOC_CPP)
# define Q_PACKED __attribute__ ((__packed__))
# define Q_NO_PACKED_REFERENCE
@@ -329,6 +361,7 @@
(see __DCC__ above). This one is for C mode files (__EDG is not defined) */
#elif defined(_DIAB_TOOL)
# define Q_CC_DIAB
+# define Q_FUNC_INFO __PRETTY_FUNCTION__
/* Never tested! */
#elif defined(__HIGHC__)
@@ -336,6 +369,7 @@
#elif defined(__SUNPRO_CC) || defined(__SUNPRO_C)
# define Q_CC_SUN
+# define Q_COMPILER_MANGLES_RETURN_TYPE
/* 5.0 compiler or better
'bool' is enabled by default but can be disabled using -features=nobool
in which case _BOOL is not defined
@@ -381,6 +415,7 @@
# if defined(__HP_aCC) || __cplusplus >= 199707L
# define Q_NO_TEMPLATE_FRIENDS
# define Q_CC_HPACC
+# define Q_FUNC_INFO __PRETTY_FUNCTION__
# if __HP_aCC-0 < 060000
# define QT_NO_TEMPLATE_TEMPLATE_PARAMETERS
# define Q_DECL_EXPORT __declspec(dllexport)
@@ -403,10 +438,6 @@
# error "Qt has not been tested with this compiler - see http://www.qt-project.org/"
#endif
-#ifndef Q_NORETURN
-# define Q_NORETURN
-#endif
-
/*
* C++11 support
*
@@ -474,13 +505,15 @@
#ifdef Q_CC_CLANG
/* General C++ features */
# if !__has_feature(cxx_exceptions)
-# define QT_NO_EXCEPTIONS
+# ifndef QT_NO_EXCEPTIONS
+# define QT_NO_EXCEPTIONS
+# endif
# endif
# if !__has_feature(cxx_rtti)
# define QT_NO_RTTI
# endif
/* C++11 features, see http://clang.llvm.org/cxx_status.html */
-# if __cplusplus >= 201103L || __GXX_EXPERIMENTAL_CXX0X__
+# if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
# if ((__clang_major__ * 100) + __clang_minor__) >= 209 /* since clang 2.9 */
# define Q_COMPILER_AUTO_TYPE
# define Q_COMPILER_DECLTYPE
@@ -573,9 +606,115 @@
//# define Q_COMPILER_INITIALIZER_LISTS
#endif
-#ifndef Q_COMPILER_MANGLES_RETURN_TYPE
-# if defined(Q_CC_MSVC)
-# define Q_COMPILER_MANGLES_RETURN_TYPE
+/*
+ * C++11 keywords and expressions
+ */
+#ifdef Q_COMPILER_NULLPTR
+# define Q_NULLPTR nullptr
+#else
+# define Q_NULLPTR 0
+#endif
+
+#ifdef Q_COMPILER_DEFAULT_DELETE_MEMBERS
+# define Q_DECL_EQ_DELETE = delete
+#else
+# define Q_DECL_EQ_DELETE
+#endif
+
+#ifdef Q_COMPILER_CONSTEXPR
+# define Q_DECL_CONSTEXPR constexpr
+#else
+# define Q_DECL_CONSTEXPR
+#endif
+
+#ifdef Q_COMPILER_EXPLICIT_OVERRIDES
+# define Q_DECL_OVERRIDE override
+# define Q_DECL_FINAL final
+# ifdef Q_COMPILER_DECLTYPE // required for class-level final to compile in qvariant_p.h
+# define Q_DECL_FINAL_CLASS final
+# else
+# define Q_DECL_FINAL_CLASS
+# endif
+#else
+# define Q_DECL_OVERRIDE
+# define Q_DECL_FINAL
+# define Q_DECL_FINAL_CLASS
+#endif
+
+#if defined(Q_COMPILER_ALIGNOF) && !defined(Q_ALIGNOF)
+# define Q_ALIGNOF(x) alignof(x)
+#endif
+
+/*
+ * Fallback macros to certain compiler features
+ */
+
+#ifndef Q_NORETURN
+# define Q_NORETURN
+#endif
+#ifndef Q_PACKED
+# define Q_PACKED
+# undef Q_NO_PACKED_REFERENCE
+#endif
+#ifndef Q_LIKELY
+# define Q_LIKELY(x) (x)
+#endif
+#ifndef Q_UNLIKELY
+# define Q_UNLIKELY(x) (x)
+#endif
+#ifndef Q_ASSUME
+# define Q_ASSUME(expr) qt_noop()
+#endif
+#ifndef Q_UNREACHABLE
+# define Q_UNREACHABLE() qt_noop()
+#endif
+#ifndef Q_ALLOC_SIZE
+# define Q_ALLOC_SIZE(x)
+#endif
+#ifndef Q_REQUIRED_RESULT
+# define Q_REQUIRED_RESULT
+#endif
+#ifndef Q_DECL_DEPRECATED
+# define Q_DECL_DEPRECATED
+#endif
+#ifndef Q_DECL_VARIABLE_DEPRECATED
+# define Q_DECL_VARIABLE_DEPRECATED Q_DECL_DEPRECATED
+#endif
+#ifndef Q_DECL_EXPORT
+# define Q_DECL_EXPORT
+#endif
+#ifndef Q_DECL_IMPORT
+# define Q_DECL_IMPORT
+#endif
+#ifndef Q_DECL_HIDDEN
+# define Q_DECL_HIDDEN
+#endif
+#ifndef Q_FUNC_INFO
+# if defined(Q_OS_SOLARIS) || defined(Q_CC_XLC)
+# define Q_FUNC_INFO __FILE__ "(line number unavailable)"
+# else
+# define Q_FUNC_INFO __FILE__ ":" QT_STRINGIFY(__LINE__)
+# endif
+#endif
+
+/*
+ Workaround for static const members on MSVC++.
+*/
+
+#if defined(Q_CC_MSVC)
+# define QT_STATIC_CONST static
+# define QT_STATIC_CONST_IMPL
+#else
+# define QT_STATIC_CONST static const
+# define QT_STATIC_CONST_IMPL const
+#endif
+
+/*
+ Proper for-scoping in MIPSpro CC
+*/
+#ifndef QT_NO_KEYWORDS
+# if defined(Q_CC_MIPS) || (defined(Q_CC_HPACC) && defined(__ia64))
+# define for if (0) {} else for
# endif
#endif
diff --git a/src/corelib/global/qconfig-medium.h b/src/corelib/global/qconfig-medium.h
index b52b067909..ba91303409 100644
--- a/src/corelib/global/qconfig-medium.h
+++ b/src/corelib/global/qconfig-medium.h
@@ -74,9 +74,6 @@
#ifndef QT_NO_IMAGEFORMAT_PPM
# define QT_NO_IMAGEFORMAT_PPM
#endif
-#ifndef QT_NO_IMAGE_TEXT
-# define QT_NO_IMAGE_TEXT
-#endif
#ifndef QT_NO_MOVIE
# define QT_NO_MOVIE
#endif
diff --git a/src/corelib/global/qconfig-minimal.h b/src/corelib/global/qconfig-minimal.h
index 3244e01c9e..57aa26b381 100644
--- a/src/corelib/global/qconfig-minimal.h
+++ b/src/corelib/global/qconfig-minimal.h
@@ -141,9 +141,6 @@
#ifndef QT_NO_IMAGE_HEURISTIC_MASK
# define QT_NO_IMAGE_HEURISTIC_MASK
#endif
-#ifndef QT_NO_IMAGE_TEXT
-# define QT_NO_IMAGE_TEXT
-#endif
#ifndef QT_NO_MOVIE
# define QT_NO_MOVIE
#endif
diff --git a/src/corelib/global/qconfig-nacl.h b/src/corelib/global/qconfig-nacl.h
index 69980f97a6..7e48afaee3 100644
--- a/src/corelib/global/qconfig-nacl.h
+++ b/src/corelib/global/qconfig-nacl.h
@@ -105,9 +105,6 @@
#ifndef QT_NO_IMAGE_HEURISTIC_MASK
# define QT_NO_IMAGE_HEURISTIC_MASK
#endif
-#ifndef QT_NO_IMAGE_TEXT
-# define QT_NO_IMAGE_TEXT
-#endif
#ifndef QT_NO_MOVIE
# define QT_NO_MOVIE
#endif
diff --git a/src/corelib/global/qconfig-small.h b/src/corelib/global/qconfig-small.h
index e764285e4a..0c0e6aa01a 100644
--- a/src/corelib/global/qconfig-small.h
+++ b/src/corelib/global/qconfig-small.h
@@ -105,9 +105,6 @@
#ifndef QT_NO_IMAGEFORMAT_XPM
# define QT_NO_IMAGEFORMAT_XPM
#endif
-#ifndef QT_NO_IMAGE_TEXT
-# define QT_NO_IMAGE_TEXT
-#endif
#ifndef QT_NO_MOVIE
# define QT_NO_MOVIE
#endif
diff --git a/src/corelib/global/qfeatures.h b/src/corelib/global/qfeatures.h
index 4ce586a858..54c1be8bd3 100644
--- a/src/corelib/global/qfeatures.h
+++ b/src/corelib/global/qfeatures.h
@@ -118,9 +118,6 @@
// QImage::createHeuristicMask()
//#define QT_NO_IMAGE_HEURISTIC_MASK
-// Image Text
-//#define QT_NO_IMAGE_TEXT
-
// QLCDNumber
//#define QT_NO_LCDNUMBER
diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp
index 38ddd7bf97..966d66a038 100644
--- a/src/corelib/global/qglobal.cpp
+++ b/src/corelib/global/qglobal.cpp
@@ -72,7 +72,7 @@
# include <envLib.h>
#endif
-#if defined(Q_OS_MACX) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
#include <CoreServices/CoreServices.h>
#endif
@@ -126,7 +126,7 @@ QT_BEGIN_NAMESPACE
Qt::Alignment parameter, which means that any combination of
Qt::AlignmentFlag values,or 0, is legal:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 0
+ \snippet code/src_corelib_global_qglobal.cpp 0
If you try to pass a value from another enum or just a plain
integer other than 0, the compiler will report an error. If you
@@ -138,7 +138,7 @@ QT_BEGIN_NAMESPACE
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 1
+ \snippet code/src_corelib_global_qglobal.cpp 1
You can then use the \c MyClass::Options type to store
combinations of \c MyClass::Option values.
@@ -150,7 +150,7 @@ QT_BEGIN_NAMESPACE
To make the flags available for these purposes, the Q_FLAGS() macro must
be used:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp meta-object flags
+ \snippet code/src_corelib_global_qglobal.cpp meta-object flags
\section1 Naming Convention
@@ -353,18 +353,18 @@ QT_BEGIN_NAMESPACE
The curious user will have seen that the Qt classes derived
from QObject typically include this macro in a private section:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 43
+ \snippet code/src_corelib_global_qglobal.cpp 43
It declares a copy constructor and an assignment operator in the
private section, so that if you use them by mistake, the compiler
will report an error.
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 44
+ \snippet code/src_corelib_global_qglobal.cpp 44
But even this might not catch absolutely every case. You might be
tempted to do something like this:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 45
+ \snippet code/src_corelib_global_qglobal.cpp 45
First of all, don't do that. Most compilers will generate code that
uses the copy constructor, so the privacy violation error will be
@@ -382,7 +382,7 @@ QT_BEGIN_NAMESPACE
The Q_DECLARE_FLAGS() macro expands to
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 2
+ \snippet code/src_corelib_global_qglobal.cpp 2
\a Enum is the name of an existing enum type, whereas \a Flags is
the name of the QFlags<\e{Enum}> typedef.
@@ -461,7 +461,7 @@ QT_BEGIN_NAMESPACE
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 3
+ \snippet code/src_corelib_global_qglobal.cpp 3
<QtGlobal> also contains functions that generate messages from the
given string argument: qCritical(), qDebug(), qFatal() and
@@ -470,7 +470,7 @@ QT_BEGIN_NAMESPACE
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 4
+ \snippet code/src_corelib_global_qglobal.cpp 4
The remaining functions are qRound() and qRound64(), which both
accept a \l qreal value as their argument returning the value
@@ -532,22 +532,6 @@ QT_BEGIN_NAMESPACE
Convenience typedef for \c{unsigned char}.
*/
-/*!
- \fn qt_set_sequence_auto_mnemonic(bool on)
- \relates <QtGlobal>
-
- Enables automatic mnemonics on Mac if \a on is true; otherwise
- this feature is disabled.
-
- Note that this function is only available on Mac where mnemonics
- are disabled by default.
-
- To access to this function, use an extern declaration:
- extern void qt_set_sequence_auto_mnemonic(bool b);
-
- \sa {QShortcut#mnemonic}{QShortcut}
-*/
-
/*! \typedef ushort
\relates <QtGlobal>
@@ -619,7 +603,7 @@ QT_BEGIN_NAMESPACE
Literals of this type can be created using the Q_INT64_C() macro:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 5
+ \snippet code/src_corelib_global_qglobal.cpp 5
\sa Q_INT64_C(), quint64, qlonglong
*/
@@ -635,7 +619,7 @@ QT_BEGIN_NAMESPACE
Literals of this type can be created using the Q_UINT64_C()
macro:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 6
+ \snippet code/src_corelib_global_qglobal.cpp 6
\sa Q_UINT64_C(), qint64, qulonglong
*/
@@ -712,7 +696,7 @@ QT_BEGIN_NAMESPACE
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 8
+ \snippet code/src_corelib_global_qglobal.cpp 8
\sa qint64, Q_UINT64_C()
*/
@@ -725,7 +709,7 @@ QT_BEGIN_NAMESPACE
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 9
+ \snippet code/src_corelib_global_qglobal.cpp 9
\sa quint64, Q_INT64_C()
*/
@@ -758,7 +742,7 @@ QT_BEGIN_NAMESPACE
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 10
+ \snippet code/src_corelib_global_qglobal.cpp 10
*/
/*! \fn int qRound(qreal value)
@@ -768,7 +752,7 @@ QT_BEGIN_NAMESPACE
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 11
+ \snippet code/src_corelib_global_qglobal.cpp 11
*/
/*! \fn qint64 qRound64(qreal value)
@@ -778,7 +762,7 @@ QT_BEGIN_NAMESPACE
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 12
+ \snippet code/src_corelib_global_qglobal.cpp 12
*/
/*! \fn const T &qMin(const T &value1, const T &value2)
@@ -788,7 +772,7 @@ QT_BEGIN_NAMESPACE
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 13
+ \snippet code/src_corelib_global_qglobal.cpp 13
\sa qMax(), qBound()
*/
@@ -800,7 +784,7 @@ QT_BEGIN_NAMESPACE
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 14
+ \snippet code/src_corelib_global_qglobal.cpp 14
\sa qMin(), qBound()
*/
@@ -813,7 +797,7 @@ QT_BEGIN_NAMESPACE
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 15
+ \snippet code/src_corelib_global_qglobal.cpp 15
\sa qMin(), qMax()
*/
@@ -843,7 +827,7 @@ QT_BEGIN_NAMESPACE
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 16
+ \snippet code/src_corelib_global_qglobal.cpp 16
\sa QT_VERSION_STR, qVersion()
*/
@@ -1602,7 +1586,7 @@ static const unsigned int qt_one = 1;
const int QSysInfo::ByteOrder = ((*((unsigned char *) &qt_one) == 0) ? BigEndian : LittleEndian);
#endif
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
QT_BEGIN_INCLUDE_NAMESPACE
#include "private/qcore_mac_p.h"
@@ -1624,13 +1608,13 @@ Q_CORE_EXPORT void qt_mac_to_pascal_string(QString s, Str255 str, TextEncoding e
Q_CORE_EXPORT QString qt_mac_from_pascal_string(const Str255 pstr) {
return QCFString(CFStringCreateWithPascalString(0, pstr, CFStringGetSystemEncoding()));
}
-#endif // defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#endif // defined(Q_OS_MAC) && !defined(Q_OS_IOS)
#if defined(Q_OS_MAC)
QSysInfo::MacVersion QSysInfo::macVersion()
{
-#ifndef QT_NO_CORESERVICES
+#ifndef Q_OS_IOS
SInt32 gestalt_version;
if (Gestalt(gestaltSystemVersion, &gestalt_version) == noErr) {
return QSysInfo::MacVersion(((gestalt_version & 0x00F0) >> 4) + 2);
@@ -1769,12 +1753,12 @@ const QSysInfo::WinVersion QSysInfo::WindowsVersion = QSysInfo::windowsVersion()
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 17
+ \snippet code/src_corelib_global_qglobal.cpp 17
If \c b is zero, the Q_ASSERT statement will output the following
message using the qFatal() function:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 18
+ \snippet code/src_corelib_global_qglobal.cpp 18
\sa Q_ASSERT_X(), qFatal(), {Debugging Techniques}
*/
@@ -1792,12 +1776,12 @@ const QSysInfo::WinVersion QSysInfo::WindowsVersion = QSysInfo::windowsVersion()
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 19
+ \snippet code/src_corelib_global_qglobal.cpp 19
If \c b is zero, the Q_ASSERT_X statement will output the following
message using the qFatal() function:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 20
+ \snippet code/src_corelib_global_qglobal.cpp 20
\sa Q_ASSERT(), qFatal(), {Debugging Techniques}
*/
@@ -1812,7 +1796,7 @@ const QSysInfo::WinVersion QSysInfo::WindowsVersion = QSysInfo::windowsVersion()
conditions that it would not otherwise know about. However, there is no
guarantee that the compiler will actually use those hints.
- This macro could be considered a "lighter" version of \ref Q_ASSERT. While
+ This macro could be considered a "lighter" version of \l{Q_ASSERT}. While
Q_ASSERT will abort the program's execution if the condition is false,
Q_ASSUME will tell the compiler not to generate code for those conditions.
Therefore, it is important that the assumptions always hold, otherwise
@@ -1841,11 +1825,11 @@ const QSysInfo::WinVersion QSysInfo::WindowsVersion = QSysInfo::windowsVersion()
This macro is useful to mark impossible conditions. For example, given the
following enum:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp qunreachable-enum
+ \snippet code/src_corelib_global_qglobal.cpp qunreachable-enum
One can write a switch table like so:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp qunreachable-switch
+ \snippet code/src_corelib_global_qglobal.cpp qunreachable-switch
The advantage of inserting Q_UNREACHABLE() at that point is that the
compiler is told not to generate code for a shape variable containing that
@@ -1872,7 +1856,7 @@ const QSysInfo::WinVersion QSysInfo::WindowsVersion = QSysInfo::windowsVersion()
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 21
+ \snippet code/src_corelib_global_qglobal.cpp 21
\sa qWarning(), {Debugging Techniques}
*/
@@ -1896,7 +1880,7 @@ const QSysInfo::WinVersion QSysInfo::WindowsVersion = QSysInfo::windowsVersion()
Q_FUNC_INFO can be conveniently used with qDebug(). For example, this function:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 22
+ \snippet code/src_corelib_global_qglobal.cpp 22
when instantiated with the integer type, will with the GCC compiler produce:
@@ -2217,14 +2201,14 @@ int qrand()
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 31
+ \snippet code/src_corelib_global_qglobal.cpp 31
It is equivalent to \c{for (;;)}.
If you're worried about namespace pollution, you can disable this
macro by adding the following line to your \c .pro file:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 32
+ \snippet code/src_corelib_global_qglobal.cpp 32
\sa Q_FOREVER
*/
@@ -2254,7 +2238,7 @@ int qrand()
If you're worried about namespace pollution, you can disable this
macro by adding the following line to your \c .pro file:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 33
+ \snippet code/src_corelib_global_qglobal.cpp 33
\sa Q_FOREACH()
*/
@@ -2283,7 +2267,7 @@ int qrand()
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 34
+ \snippet code/src_corelib_global_qglobal.cpp 34
The macro QT_TR_NOOP_UTF8() is identical except that it tells lupdate
that the source string is encoded in UTF-8. Corresponding variants
@@ -2305,7 +2289,7 @@ int qrand()
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 35
+ \snippet code/src_corelib_global_qglobal.cpp 35
\sa QT_TR_NOOP(), QT_TRANSLATE_NOOP3(), {Internationalization with Qt}
*/
@@ -2326,7 +2310,7 @@ int qrand()
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 36
+ \snippet code/src_corelib_global_qglobal.cpp 36
\sa QT_TR_NOOP(), QT_TRANSLATE_NOOP(), {Internationalization with Qt}
*/
@@ -2354,11 +2338,11 @@ int qrand()
or
- \tt{\begincomment% <C string> \endcomment}
+ \tt{\\begincomment% <C string> \\endcomment}
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp qttrid
+ \snippet code/src_corelib_global_qglobal.cpp qttrid
Creating QM files suitable for use with this function requires passing
the \c -idbased option to the \c lrelease tool.
@@ -2385,7 +2369,7 @@ int qrand()
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp qttrid_noop
+ \snippet code/src_corelib_global_qglobal.cpp qttrid_noop
\sa qtTrId(), {Internationalization with Qt}
*/
@@ -2402,7 +2386,7 @@ int qrand()
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp qlikely
+ \snippet code/src_corelib_global_qglobal.cpp qlikely
\sa Q_UNLIKELY()
*/
@@ -2419,7 +2403,7 @@ int qrand()
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp qunlikely
+ \snippet code/src_corelib_global_qglobal.cpp qunlikely
\sa Q_LIKELY()
*/
@@ -2496,7 +2480,7 @@ int qrand()
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 37
+ \snippet code/src_corelib_global_qglobal.cpp 37
\sa qDebug(), qWarning(), qCritical(), qFatal()
@@ -2528,7 +2512,7 @@ int qrand()
Example of a "primitive" type:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 38
+ \snippet code/src_corelib_global_qglobal.cpp 38
An example of a non-POD "primitive" type is QUuid: Even though
QUuid has constructors (and therefore isn't POD), every bit
@@ -2537,7 +2521,7 @@ int qrand()
Example of a movable type:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 39
+ \snippet code/src_corelib_global_qglobal.cpp 39
*/
/*!
@@ -2607,7 +2591,7 @@ bool QInternal::activateCallbacks(Callback cb, void **parameters)
Use this macro as in the following examples.
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 40
+ \snippet code/src_corelib_global_qglobal.cpp 40
\sa Q_BIG_ENDIAN, Q_LITTLE_ENDIAN
*/
@@ -2622,7 +2606,7 @@ bool QInternal::activateCallbacks(Callback cb, void **parameters)
lowest address. The other bytes follow in increasing order of
significance.
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 41
+ \snippet code/src_corelib_global_qglobal.cpp 41
\sa Q_BYTE_ORDER, Q_BIG_ENDIAN
*/
@@ -2637,7 +2621,7 @@ bool QInternal::activateCallbacks(Callback cb, void **parameters)
lowest address. The other bytes follow in decreasing order of
significance.
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 42
+ \snippet code/src_corelib_global_qglobal.cpp 42
\sa Q_BYTE_ORDER, Q_LITTLE_ENDIAN
*/
@@ -2720,7 +2704,7 @@ bool QInternal::activateCallbacks(Callback cb, void **parameters)
This macro expands to
- \snippet snippets/code/src_corelib_global_qglobal.cpp begin namespace macro
+ \snippet code/src_corelib_global_qglobal.cpp begin namespace macro
if \c QT_NAMESPACE is defined and nothing otherwise. If should always
appear in the file-level scope and be followed by \c QT_END_NAMESPACE
@@ -2754,7 +2738,7 @@ bool QInternal::activateCallbacks(Callback cb, void **parameters)
This macro expands to
- \snippet snippets/code/src_corelib_global_qglobal.cpp end namespace macro
+ \snippet code/src_corelib_global_qglobal.cpp end namespace macro
if \c QT_NAMESPACE is defined and nothing otherwise. It is used to cancel
the effect of \c QT_BEGIN_NAMESPACE.
@@ -2821,7 +2805,7 @@ bool QInternal::activateCallbacks(Callback cb, void **parameters)
Note that comparing values where either \a p1 or \a p2 is 0.0 will not work.
The solution to this is to compare against values greater than or equal to 1.0.
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 46
+ \snippet code/src_corelib_global_qglobal.cpp 46
The two numbers are compared in a relative way, where the
exactness is stronger the smaller the numbers are.
@@ -2856,7 +2840,7 @@ bool QInternal::activateCallbacks(Callback cb, void **parameters)
Example:
- \snippet doc/src/snippets/code/src_gui_dialogs_qmessagebox.cpp 4
+ \snippet code/src_gui_dialogs_qmessagebox.cpp 4
*/
/*!
@@ -2908,12 +2892,12 @@ bool QInternal::activateCallbacks(Callback cb, void **parameters)
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 24
+ \snippet code/src_corelib_global_qglobal.cpp 24
If you include \c <QtDebug>, a more convenient syntax is also
available:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 25
+ \snippet code/src_corelib_global_qglobal.cpp 25
With this syntax, the function returns a QDebug object that is
configured to use the QtDebugMsg message type. It automatically
@@ -2943,12 +2927,12 @@ bool QInternal::activateCallbacks(Callback cb, void **parameters)
string.
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 26
+ \snippet code/src_corelib_global_qglobal.cpp 26
If you include <QtDebug>, a more convenient syntax is
also available:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 27
+ \snippet code/src_corelib_global_qglobal.cpp 27
This syntax inserts a space between each item, and
appends a newline at the end.
@@ -2973,12 +2957,12 @@ bool QInternal::activateCallbacks(Callback cb, void **parameters)
string.
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 28
+ \snippet code/src_corelib_global_qglobal.cpp 28
If you include <QtDebug>, a more convenient syntax is
also available:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 29
+ \snippet code/src_corelib_global_qglobal.cpp 29
A space is inserted between the items, and a newline is
appended at the end.
@@ -3007,7 +2991,7 @@ bool QInternal::activateCallbacks(Callback cb, void **parameters)
similar to the C printf() function.
Example:
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 30
+ \snippet code/src_corelib_global_qglobal.cpp 30
To suppress the output at runtime, install your own message handler
with qInstallMessageHandler().
@@ -3016,110 +3000,4 @@ bool QInternal::activateCallbacks(Callback cb, void **parameters)
{Debugging Techniques}
*/
-/*!
- \typedef QtMsgHandler
- \relates <QtGlobal>
- \deprecated
-
- This is a typedef for a pointer to a function with the following
- signature:
-
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 7
-
- This typedef is deprecated, you should use QtMessageHandler instead.
- \sa QtMsgType, QtMessageHandler, qInstallMsgHandler(), qInstallMessageHandler()
-*/
-
-/*!
- \typedef QtMessageHandler
- \relates <QtGlobal>
- \since 5.0
-
- This is a typedef for a pointer to a function with the following
- signature:
-
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 49
-
- \sa QtMsgType, qInstallMessageHandler()
-*/
-
-/*!
- \fn QtMessageHandler qInstallMessageHandler(QtMessageHandler handler)
- \relates <QtGlobal>
- \since 5.0
-
- Installs a Qt message \a handler which has been defined
- previously. Returns a pointer to the previous message handler
- (which may be 0).
-
- The message handler is a function that prints out debug messages,
- warnings, critical and fatal error messages. The Qt library (debug
- mode) contains hundreds of warning messages that are printed
- when internal errors (usually invalid function arguments)
- occur. Qt built in release mode also contains such warnings unless
- QT_NO_WARNING_OUTPUT and/or QT_NO_DEBUG_OUTPUT have been set during
- compilation. If you implement your own message handler, you get total
- control of these messages.
-
- The default message handler prints the message to the standard
- output under X11 or to the debugger under Windows. If it is a
- fatal message, the application aborts immediately.
-
- Only one message handler can be defined, since this is usually
- done on an application-wide basis to control debug output.
-
- To restore the message handler, call \c qInstallMessageHandler(0).
-
- Example:
-
- \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 23
-
- \sa QtMessageHandler, QtMsgType, qDebug(), qWarning(), qCritical(), qFatal(),
- {Debugging Techniques}
-*/
-
-/*!
- \fn QtMsgHandler qInstallMsgHandler(QtMsgHandler handler)
- \relates <QtGlobal>
- \deprecated
-
- Installs a Qt message \a handler which has been defined
- previously. This method is deprecated, use qInstallMessageHandler
- instead.
- \sa QtMsgHandler, qInstallMessageHandler
-*/
-/*!
- \fn void qSetMessagePattern(const QString &pattern)
- \relates <QtGlobal>
- \since 5.0
-
- \brief Changes the output of the default message handler.
-
- Allows to tweak the output of qDebug(), qWarning(), qCritical() and qFatal().
-
- Following placeholders are supported:
-
- \table
- \header \li Placeholder \li Description
- \row \li \c %{appname} \li QCoreApplication::applicationName()
- \row \li \c %{file} \li Path to source file
- \row \li \c %{function} \li Function
- \row \li \c %{line} \li Line in source file
- \row \li \c %{message} \li The actual message
- \row \li \c %{pid} \li QCoreApplication::applicationPid()
- \row \li \c %{threadid} \li ID of current thread
- \row \li \c %{type} \li "debug", "warning", "critical" or "fatal"
- \endtable
-
- The default pattern is "%{message}".
-
- The pattern can also be changed at runtime by setting the QT_MESSAGE_PATTERN
- environment variable; if both qSetMessagePattern() is called and QT_MESSAGE_PATTERN is
- set, the environment variable takes precedence.
-
- qSetMessagePattern() has no effect if a custom message handler is installed.
-
- \sa qInstallMessageHandler, Debugging Techniques
- */
-
QT_END_NAMESPACE
diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h
index 0828a3dac3..a8547a3ab8 100644
--- a/src/corelib/global/qglobal.h
+++ b/src/corelib/global/qglobal.h
@@ -62,6 +62,10 @@
#include <QtCore/qconfig.h>
#endif
+/* These two macros makes it possible to turn the builtin line expander into a
+ * string literal. */
+#define QT_STRINGIFY2(x) #x
+#define QT_STRINGIFY(x) QT_STRINGIFY2(x)
#include <QtCore/qsystemdetection.h>
#include <QtCore/qcompilerdetection.h>
@@ -150,28 +154,6 @@ namespace QT_NAMESPACE {}
# define QT_LARGEFILE_SUPPORT 64
#endif
-#ifndef Q_PACKED
-# define Q_PACKED
-# undef Q_NO_PACKED_REFERENCE
-#endif
-
-#ifndef Q_LIKELY
-# define Q_LIKELY(x) (x)
-#endif
-#ifndef Q_UNLIKELY
-# define Q_UNLIKELY(x) (x)
-#endif
-#ifndef Q_ASSUME
-# define Q_ASSUME(expr)
-#endif
-#ifndef Q_UNREACHABLE
-# define Q_UNREACHABLE()
-#endif
-
-#ifndef Q_ALLOC_SIZE
-# define Q_ALLOC_SIZE(x)
-#endif
-
#ifndef Q_CONSTRUCTOR_FUNCTION
# define Q_CONSTRUCTOR_FUNCTION0(AFUNC) \
namespace { \
@@ -194,14 +176,6 @@ namespace QT_NAMESPACE {}
# define Q_DESTRUCTOR_FUNCTION(AFUNC) Q_DESTRUCTOR_FUNCTION0(AFUNC)
#endif
-#ifndef Q_REQUIRED_RESULT
-# if defined(Q_CC_GNU)
-# define Q_REQUIRED_RESULT __attribute__ ((warn_unused_result))
-# else
-# define Q_REQUIRED_RESULT
-# endif
-#endif
-
QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
@@ -340,45 +314,6 @@ QT_END_INCLUDE_NAMESPACE
# endif
#endif
-/*
- Proper for-scoping in MIPSpro CC
-*/
-#ifndef QT_NO_KEYWORDS
-# if defined(Q_CC_MIPS) || (defined(Q_CC_HPACC) && defined(__ia64))
-# define for if(0){}else for
-# endif
-#endif
-
-/*
- Workaround for static const members on MSVC++.
-*/
-
-#if defined(Q_CC_MSVC)
-# define QT_STATIC_CONST static
-# define QT_STATIC_CONST_IMPL
-#else
-# define QT_STATIC_CONST static const
-# define QT_STATIC_CONST_IMPL const
-#endif
-
-/*
- Warnings and errors when using deprecated methods
-*/
-#if defined(Q_CC_GNU) || defined(Q_CC_RVCT)
-# define Q_DECL_DEPRECATED __attribute__ ((__deprecated__))
-#elif defined(Q_CC_MSVC)
-# define Q_DECL_DEPRECATED __declspec(deprecated)
-# if defined (Q_CC_INTEL)
-# define Q_DECL_VARIABLE_DEPRECATED
-# else
-# endif
-#else
-# define Q_DECL_DEPRECATED
-#endif
-#ifndef Q_DECL_VARIABLE_DEPRECATED
-# define Q_DECL_VARIABLE_DEPRECATED Q_DECL_DEPRECATED
-#endif
-
#if defined(QT_NO_DEPRECATED)
# undef QT_DEPRECATED
# undef QT_DEPRECATED_VARIABLE
@@ -448,46 +383,10 @@ QT_END_INCLUDE_NAMESPACE
# define QT_FASTCALL
#endif
-#ifdef Q_COMPILER_NULLPTR
-# define Q_NULLPTR nullptr
-#else
-# define Q_NULLPTR 0
-#endif
-
-#ifdef Q_COMPILER_DEFAULT_DELETE_MEMBERS
-# define Q_DECL_EQ_DELETE = delete
-#else
-# define Q_DECL_EQ_DELETE
-#endif
-
-#ifdef Q_COMPILER_CONSTEXPR
-# define Q_DECL_CONSTEXPR constexpr
-#else
-# define Q_DECL_CONSTEXPR
-#endif
-
-#ifdef Q_COMPILER_EXPLICIT_OVERRIDES
-# define Q_DECL_OVERRIDE override
-# define Q_DECL_FINAL final
-# ifdef Q_COMPILER_DECLTYPE // required for class-level final to compile in qvariant_p.h
-# define Q_DECL_FINAL_CLASS final
-# else
-# define Q_DECL_FINAL_CLASS
-# endif
-#else
-# define Q_DECL_OVERRIDE
-# define Q_DECL_FINAL
-# define Q_DECL_FINAL_CLASS
-#endif
-
-#if defined(Q_COMPILER_ALIGNOF) && !defined(Q_ALIGNOF)
-# define Q_ALIGNOF(x) alignof(x)
-#endif
-
//defines the type for the WNDPROC on windows
//the alignment needs to be forced for sse2 to not crash with mingw
#if defined(Q_OS_WIN)
-# if defined(Q_CC_MINGW)
+# if defined(Q_CC_MINGW) && !defined(Q_OS_WIN64)
# define QT_ENSURE_STACK_ALIGNED_FOR_SSE __attribute__ ((force_align_arg_pointer))
# else
# define QT_ENSURE_STACK_ALIGNED_FOR_SSE
@@ -561,35 +460,6 @@ class QDataStream;
#define QT_SUPPORTS(FEATURE) (!defined(QT_NO_##FEATURE))
-#if defined(Q_OS_LINUX) && defined(Q_CC_RVCT)
-# define Q_DECL_EXPORT __attribute__((visibility("default")))
-# define Q_DECL_IMPORT __attribute__((visibility("default")))
-# define Q_DECL_HIDDEN __attribute__((visibility("hidden")))
-#endif
-
-#ifndef Q_DECL_EXPORT
-# if defined(Q_OS_WIN) || defined(Q_CC_RVCT)
-# define Q_DECL_EXPORT __declspec(dllexport)
-# elif defined(QT_VISIBILITY_AVAILABLE)
-# define Q_DECL_EXPORT __attribute__((visibility("default")))
-# define Q_DECL_HIDDEN __attribute__((visibility("hidden")))
-# endif
-# ifndef Q_DECL_EXPORT
-# define Q_DECL_EXPORT
-# endif
-#endif
-#ifndef Q_DECL_IMPORT
-# if defined(Q_OS_WIN) || defined(Q_CC_RVCT)
-# define Q_DECL_IMPORT __declspec(dllimport)
-# else
-# define Q_DECL_IMPORT
-# endif
-#endif
-#ifndef Q_DECL_HIDDEN
-# define Q_DECL_HIDDEN
-#endif
-
-
/*
Create Qt DLL if QT_DLL is defined (Windows only)
*/
@@ -764,58 +634,6 @@ class QDataStream;
# endif
#endif
-// Functions marked as Q_GUI_EXPORT_INLINE were exported and inlined by mistake.
-// Compilers like MinGW complain that the import attribute is ignored.
-#if defined(Q_CC_MINGW)
-# if defined(QT_BUILD_CORE_LIB)
-# define Q_CORE_EXPORT_INLINE Q_CORE_EXPORT inline
-# else
-# define Q_CORE_EXPORT_INLINE inline
-# endif
-# if defined(QT_BUILD_GUI_LIB)
-# define Q_GUI_EXPORT_INLINE Q_GUI_EXPORT inline
-# else
-# define Q_GUI_EXPORT_INLINE inline
-# endif
-# if defined(QT_BUILD_WIDGETS_LIB)
-# define Q_WIDGETS_EXPORT_INLINE Q_WIDGETS_EXPORT inline
-# else
-# define Q_WIDGETS_EXPORT_INLINE inline
-# endif
-# if defined(QT_BUILD_PLATFORMSUPPORT_LIB)
-# define Q_PLATFORMSUPPORT_EXPORT_INLINE Q_PLATFORMSUPPORT_EXPORT inline
-# else
-# define Q_PLATFORMSUPPORT_EXPORT_INLINE inline
-# endif
-# if defined(QT_BUILD_PRINTSUPPORT_LIB)
-# define Q_PRINTSUPPORT_EXPORT_INLINE Q_PRINTSUPPORT_EXPORT inline
-# else
-# define Q_PRINTSUPPORT_EXPORT_INLINE inline
-# endif
-# if defined(QT_BUILD_COMPAT_LIB)
-# define Q_COMPAT_EXPORT_INLINE Q_COMPAT_EXPORT inline
-# else
-# define Q_COMPAT_EXPORT_INLINE inline
-# endif
-#elif defined(Q_CC_RVCT)
-// we force RVCT not to export inlines by passing --visibility_inlines_hidden
-// so we need to just inline it, rather than exporting and inlining
-// note: this affects the contents of the DEF files (ie. these functions do not appear)
-# define Q_CORE_EXPORT_INLINE inline
-# define Q_GUI_EXPORT_INLINE inline
-# define Q_WIDGETS_EXPORT_INLINE inline
-# define Q_PLATFORMSUPPORT_EXPORT_INLINE inline
-# define Q_PRINTSUPPORT_EXPORT_INLINE inline
-# define Q_COMPAT_EXPORT_INLINE inline
-#else
-# define Q_CORE_EXPORT_INLINE Q_CORE_EXPORT inline
-# define Q_GUI_EXPORT_INLINE Q_GUI_EXPORT inline
-# define Q_WIDGETS_EXPORT_INLINE Q_WIDGETS_EXPORT inline
-# define Q_PLATFORMSUPPORT_EXPORT_INLINE Q_PLATFORMSUPPORT_EXPORT inline
-# define Q_PRINTSUPPORT_EXPORT_INLINE Q_PRINTSUPPORT_EXPORT inline
-# define Q_COMPAT_EXPORT_INLINE Q_COMPAT_EXPORT inline
-#endif
-
/*
No, this is not an evil backdoor. QT_BUILD_INTERNAL just exports more symbols
for Qt's internal unit tests. If you want slower loading times and more
@@ -896,6 +714,10 @@ inline void qUnused(T &x) { (void)x; }
class QString;
Q_CORE_EXPORT QString qt_error_string(int errorCode = -1);
+
+#ifndef Q_CC_MSVC
+Q_NORETURN
+#endif
Q_CORE_EXPORT void qt_assert(const char *assertion, const char *file, int line);
#if !defined(Q_ASSERT)
@@ -910,6 +732,9 @@ Q_CORE_EXPORT void qt_assert(const char *assertion, const char *file, int line);
#define QT_NO_PAINT_DEBUG
#endif
+#ifndef Q_CC_MSVC
+Q_NORETURN
+#endif
Q_CORE_EXPORT void qt_assert_x(const char *where, const char *what, const char *file, int line);
#if !defined(Q_ASSERT_X)
@@ -952,29 +777,6 @@ Q_CORE_EXPORT void qBadAlloc();
template <typename T>
inline T *q_check_ptr(T *p) { Q_CHECK_PTR(p); return p; }
-#if (defined(Q_CC_GNU) && !defined(Q_OS_SOLARIS)) || defined(Q_CC_HPACC) || defined(Q_CC_DIAB)
-# define Q_FUNC_INFO __PRETTY_FUNCTION__
-#elif defined(_MSC_VER)
-# define Q_FUNC_INFO __FUNCSIG__
-#else
-# if defined(Q_OS_SOLARIS) || defined(Q_CC_XLC)
-# define Q_FUNC_INFO __FILE__ "(line number unavailable)"
-# else
- /* These two macros makes it possible to turn the builtin line expander into a
- * string literal. */
-# define QT_STRINGIFY2(x) #x
-# define QT_STRINGIFY(x) QT_STRINGIFY2(x)
-# define Q_FUNC_INFO __FILE__ ":" QT_STRINGIFY(__LINE__)
-# endif
- /* The MIPSpro and RVCT compilers postpones macro expansion,
- and therefore macros must be in scope when being used. */
-# if !defined(Q_CC_MIPS) && !defined(Q_CC_RVCT)
-# undef QT_STRINGIFY2
-# undef QT_STRINGIFY
-# endif
-#endif
-
-
typedef void (*QFunctionPointer)();
#if !defined(Q_UNIMPLEMENTED)
diff --git a/src/corelib/global/qlogging.cpp b/src/corelib/global/qlogging.cpp
index 8726c18689..52ffae5f98 100644
--- a/src/corelib/global/qlogging.cpp
+++ b/src/corelib/global/qlogging.cpp
@@ -83,7 +83,7 @@ QT_BEGIN_NAMESPACE
One example of direct use is to forward errors that stem from a scripting language, e.g. QML:
- \snippet doc/src/snippets/code/qlogging/qloggingsnippet.cpp 1
+ \snippet code/qlogging/qlogging.cpp 1
\sa QMessageLogContext, qDebug(), qWarning(), qCritical(), qFatal()
*/
@@ -159,7 +159,6 @@ static void qt_message(QtMsgType msgType, const QMessageLogContext &context, con
}
#undef qDebug
-
void QMessageLogger::debug(const char *msg, ...)
{
va_list ap;
@@ -205,7 +204,6 @@ QDebug QMessageLogger::warning()
#endif
#undef qCritical
-
void QMessageLogger::critical(const char *msg, ...)
{
va_list ap;
@@ -225,12 +223,14 @@ QDebug QMessageLogger::critical()
#endif
#undef qFatal
-
void QMessageLogger::fatal(const char *msg, ...)
{
va_list ap;
va_start(ap, msg); // use variable arg list
qt_message(QtFatalMsg, context, msg, ap);
+#ifndef Q_CC_MSVC
+ Q_UNREACHABLE();
+#endif
va_end(ap);
}
@@ -729,6 +729,112 @@ void qWinMessageHandler2(QtMsgType t, const QMessageLogContext &context,
}
#endif
+/*!
+ \typedef QtMsgHandler
+ \relates <QtGlobal>
+ \deprecated
+
+ This is a typedef for a pointer to a function with the following
+ signature:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 7
+
+ This typedef is deprecated, you should use QtMessageHandler instead.
+ \sa QtMsgType, QtMessageHandler, qInstallMsgHandler(), qInstallMessageHandler()
+*/
+
+/*!
+ \typedef QtMessageHandler
+ \relates <QtGlobal>
+ \since 5.0
+
+ This is a typedef for a pointer to a function with the following
+ signature:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 49
+
+ \sa QtMsgType, qInstallMessageHandler()
+*/
+
+/*!
+ \fn QtMessageHandler qInstallMessageHandler(QtMessageHandler handler)
+ \relates <QtGlobal>
+ \since 5.0
+
+ Installs a Qt message \a handler which has been defined
+ previously. Returns a pointer to the previous message handler
+ (which may be 0).
+
+ The message handler is a function that prints out debug messages,
+ warnings, critical and fatal error messages. The Qt library (debug
+ mode) contains hundreds of warning messages that are printed
+ when internal errors (usually invalid function arguments)
+ occur. Qt built in release mode also contains such warnings unless
+ QT_NO_WARNING_OUTPUT and/or QT_NO_DEBUG_OUTPUT have been set during
+ compilation. If you implement your own message handler, you get total
+ control of these messages.
+
+ The default message handler prints the message to the standard
+ output under X11 or to the debugger under Windows. If it is a
+ fatal message, the application aborts immediately.
+
+ Only one message handler can be defined, since this is usually
+ done on an application-wide basis to control debug output.
+
+ To restore the message handler, call \c qInstallMessageHandler(0).
+
+ Example:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 23
+
+ \sa QtMessageHandler, QtMsgType, qDebug(), qWarning(), qCritical(), qFatal(),
+ {Debugging Techniques}
+*/
+
+/*!
+ \fn QtMsgHandler qInstallMsgHandler(QtMsgHandler handler)
+ \relates <QtGlobal>
+ \deprecated
+
+ Installs a Qt message \a handler which has been defined
+ previously. This method is deprecated, use qInstallMessageHandler
+ instead.
+ \sa QtMsgHandler, qInstallMessageHandler
+*/
+/*!
+ \fn void qSetMessagePattern(const QString &pattern)
+ \relates <QtGlobal>
+ \since 5.0
+
+ \brief Changes the output of the default message handler.
+
+ Allows to tweak the output of qDebug(), qWarning(), qCritical() and qFatal().
+
+ Following placeholders are supported:
+
+ \table
+ \header \li Placeholder \li Description
+ \row \li \c %{appname} \li QCoreApplication::applicationName()
+ \row \li \c %{file} \li Path to source file
+ \row \li \c %{function} \li Function
+ \row \li \c %{line} \li Line in source file
+ \row \li \c %{message} \li The actual message
+ \row \li \c %{pid} \li QCoreApplication::applicationPid()
+ \row \li \c %{threadid} \li ID of current thread
+ \row \li \c %{type} \li "debug", "warning", "critical" or "fatal"
+ \endtable
+
+ The default pattern is "%{message}".
+
+ The pattern can also be changed at runtime by setting the QT_MESSAGE_PATTERN
+ environment variable; if both qSetMessagePattern() is called and QT_MESSAGE_PATTERN is
+ set, the environment variable takes precedence.
+
+ qSetMessagePattern() has no effect if a custom message handler is installed.
+
+ \sa qInstallMessageHandler, Debugging Techniques
+ */
+
QtMessageHandler qInstallMessageHandler(QtMessageHandler h)
{
if (!messageHandler)
diff --git a/src/corelib/global/qlogging.h b/src/corelib/global/qlogging.h
index ae388b0a38..8366a852ab 100644
--- a/src/corelib/global/qlogging.h
+++ b/src/corelib/global/qlogging.h
@@ -113,6 +113,10 @@ public:
__attribute__ ((format (printf, 2, 3)))
#endif
;
+
+#ifndef Q_CC_MSVC
+ Q_NORETURN
+#endif
void fatal(const char *msg, ...)
#if defined(Q_CC_GNU) && !defined(__INSURE__)
__attribute__ ((format (printf, 2, 3)))
diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h
index c238e9a5f3..50f43e3c78 100644
--- a/src/corelib/global/qnamespace.h
+++ b/src/corelib/global/qnamespace.h
@@ -155,12 +155,12 @@ public:
RightButton = 0x00000002,
MidButton = 0x00000004, // ### Qt 6: remove me
MiddleButton = MidButton,
- XButton1 = 0x00000008,
- BackButton = XButton1,
+ BackButton = 0x00000008,
+ XButton1 = BackButton,
ExtraButton1 = XButton1,
- XButton2 = 0x00000010,
- ForwardButton = XButton2,
- ExtraButton2 = XButton2,
+ ForwardButton = 0x00000010,
+ XButton2 = ForwardButton,
+ ExtraButton2 = ForwardButton,
TaskButton = 0x00000020,
ExtraButton3 = TaskButton,
ExtraButton4 = 0x00000040,
diff --git a/src/corelib/global/qnamespace.qdoc b/src/corelib/global/qnamespace.qdoc
index 881b55037d..a613eff6b2 100644
--- a/src/corelib/global/qnamespace.qdoc
+++ b/src/corelib/global/qnamespace.qdoc
@@ -219,7 +219,7 @@
\value ExtraButton21 The 24th non-wheel Mouse Button.
\value ExtraButton22 The 25th non-wheel Mouse Button.
\value ExtraButton23 The 26th non-wheel Mouse Button.
- \value ExtraButton44 The 27th non-wheel Mouse Button.
+ \value ExtraButton24 The 27th non-wheel Mouse Button.
\omitvalue MaxMouseButton
\omitvalue MouseButtonMask
@@ -230,7 +230,7 @@
actual 'Mouse Buttons', the device must be re-configured (using
the vendor's configuration tool).
- \sa KeyboardModifier Modifier
+ \sa KeyboardModifier, Modifier
*/
/*!
@@ -257,7 +257,7 @@
\note On Windows Keyboards, Qt::MetaModifier and Qt::Key_Meta are mapped
to the Windows key.
- \sa MouseButton Modifier
+ \sa MouseButton, Modifier
*/
/*!
@@ -278,7 +278,7 @@
point, not as a Qt Key.
\omitvalue MODIFIER_MASK
- \sa KeyboardModifier MouseButton
+ \sa KeyboardModifier, MouseButton
*/
/*!
@@ -542,7 +542,7 @@
arguments to store them in an event behind the scenes. If you try
to use a queued connection and get the error message:
- \snippet doc/src/snippets/code/doc_src_qnamespace.qdoc 0
+ \snippet code/doc_src_qnamespace.qdoc 0
Call qRegisterMetaType() to register the data type before you
establish the connection.
@@ -1981,8 +1981,6 @@
system supports it, a tool window can be decorated
with a somewhat lighter frame. It can also be
combined with Qt::FramelessWindowHint.
- \br
- \br
On Mac OS X, tool windows correspond to the
\l{http://developer.apple.com/documentation/Carbon/Conceptual/HandlingWindowsControls/hitb-wind_cont_concept/chapter_2_section_2.html}{Floating}
class of windows. This means that the window lives on a
@@ -2174,9 +2172,7 @@
should be taken over by the target application,
i.e., the source application should not delete
the data.
- \br
On X11 this value is used to do a move.
- \br
TargetMoveAction is not used on the Mac.
*/
@@ -2643,7 +2639,7 @@
for other strings (e.g.,
"\l{http://qt.nokia.com/doc/qq/qq09-mac-deployment.html}{Deploying Applications on Ma...}").
- \sa QAbstractItemView::textElideMode, QFontMetrics::elidedText(), AlignmentFlag QTabBar::elideMode
+ \sa QAbstractItemView::textElideMode, QFontMetrics::elidedText(), AlignmentFlag, QTabBar::elideMode
*/
/*!
@@ -2721,7 +2717,7 @@
INT_MIN, inclusive. For example, you can define custom priorities
as being relative to each other:
- \snippet doc/src/snippets/code/doc_src_qnamespace.cpp 1
+ \snippet code/doc_src_qnamespace.cpp 1
\sa QCoreApplication::postEvent()
*/
diff --git a/src/corelib/global/qprocessordetection.h b/src/corelib/global/qprocessordetection.h
index 04e0f19f06..109545c10e 100644
--- a/src/corelib/global/qprocessordetection.h
+++ b/src/corelib/global/qprocessordetection.h
@@ -39,6 +39,10 @@
**
****************************************************************************/
+#ifndef QGLOBAL_H
+# include <QtCore/qglobal.h>
+#endif
+
#ifndef QPROCESSORDETECTION_H
#define QPROCESSORDETECTION_H
diff --git a/src/corelib/global/qsystemdetection.h b/src/corelib/global/qsystemdetection.h
index db5775d021..94ff42a789 100644
--- a/src/corelib/global/qsystemdetection.h
+++ b/src/corelib/global/qsystemdetection.h
@@ -39,6 +39,10 @@
**
****************************************************************************/
+#ifndef QGLOBAL_H
+# include <QtCore/qglobal.h>
+#endif
+
#ifndef QSYSTEMDETECTION_H
#define QSYSTEMDETECTION_H
diff --git a/src/corelib/io/io.pri b/src/corelib/io/io.pri
index d6379bf0fe..9e89f9fdc0 100644
--- a/src/corelib/io/io.pri
+++ b/src/corelib/io/io.pri
@@ -113,7 +113,7 @@ win32 {
SOURCES += io/qsettings_mac.cpp
}
macx-*: {
- contains(QT_CONFIG, coreservices) {
+ !ios {
SOURCES += io/qstandardpaths_mac.cpp
} else {
SOURCES += io/qstandardpaths_unix.cpp
diff --git a/src/corelib/io/qabstractfileengine.cpp b/src/corelib/io/qabstractfileengine.cpp
index 021698115c..6c10c6cb00 100644
--- a/src/corelib/io/qabstractfileengine.cpp
+++ b/src/corelib/io/qabstractfileengine.cpp
@@ -87,7 +87,7 @@ QT_BEGIN_NAMESPACE
For example:
- \snippet doc/src/snippets/code/src_corelib_io_qabstractfileengine.cpp 0
+ \snippet code/src_corelib_io_qabstractfileengine.cpp 0
When the handler is destroyed, it is automatically removed from Qt.
@@ -184,7 +184,7 @@ QAbstractFileEngine *qt_custom_file_engine_handler_create(const QString &path)
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qabstractfileengine.cpp 1
+ \snippet code/src_corelib_io_qabstractfileengine.cpp 1
\sa QAbstractFileEngine::create()
*/
@@ -461,7 +461,7 @@ bool QAbstractFileEngine::isSequential() const
This virtual function must be reimplemented by all subclasses.
- \sa setFileName() rmdir()
+ \sa setFileName(), rmdir()
*/
bool QAbstractFileEngine::remove()
{
@@ -515,7 +515,7 @@ bool QAbstractFileEngine::link(const QString &newName)
This virtual function must be reimplemented by all subclasses.
- \sa setFileName() rmdir() isRelativePath()
+ \sa setFileName(), rmdir(), isRelativePath()
*/
bool QAbstractFileEngine::mkdir(const QString &dirName, bool createParentDirectories) const
{
@@ -535,7 +535,7 @@ bool QAbstractFileEngine::mkdir(const QString &dirName, bool createParentDirecto
This virtual function must be reimplemented by all subclasses.
- \sa setFileName() remove() mkdir() isRelativePath()
+ \sa setFileName(), remove(), mkdir(), isRelativePath()
*/
bool QAbstractFileEngine::rmdir(const QString &dirName, bool recurseParentDirectories) const
{
@@ -671,7 +671,7 @@ QString QAbstractFileEngine::fileName(FileName file) const
This virtual function must be reimplemented by all subclasses.
- \sa owner() setFileName(), FileOwner
+ \sa owner(), setFileName(), FileOwner
*/
uint QAbstractFileEngine::ownerId(FileOwner owner) const
{
@@ -687,7 +687,7 @@ uint QAbstractFileEngine::ownerId(FileOwner owner) const
This virtual function must be reimplemented by all subclasses.
- \sa ownerId() setFileName(), FileOwner
+ \sa ownerId(), setFileName(), FileOwner
*/
QString QAbstractFileEngine::owner(FileOwner owner) const
{
@@ -821,7 +821,7 @@ bool QAbstractFileEngine::unmap(uchar *address)
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qabstractfileengine.cpp 2
+ \snippet code/src_corelib_io_qabstractfileengine.cpp 2
QAbstractFileEngineIterator is associated with a path, name filters, and
entry filters. The path is the directory that the iterator lists entries
@@ -846,7 +846,7 @@ bool QAbstractFileEngine::unmap(uchar *address)
Here is an example of how to implement an iterator that returns each of
three fixed entries in sequence.
- \snippet doc/src/snippets/code/src_corelib_io_qabstractfileengine.cpp 3
+ \snippet code/src_corelib_io_qabstractfileengine.cpp 3
Note: QAbstractFileEngineIterator does not deal with QDir::IteratorFlags;
it simply returns entries for a single directory.
@@ -1080,7 +1080,7 @@ qint64 QAbstractFileEngine::write(const char *data, qint64 len)
}
/*!
- This function reads one line, terminated by a '\n' character, from the
+ This function reads one line, terminated by a '\\n' character, from the
file info \a data. At most \a maxlen characters will be read. The
end-of-line character is included.
*/
diff --git a/src/corelib/io/qbuffer.cpp b/src/corelib/io/qbuffer.cpp
index dfc85a434d..dee4295966 100644
--- a/src/corelib/io/qbuffer.cpp
+++ b/src/corelib/io/qbuffer.cpp
@@ -40,6 +40,7 @@
****************************************************************************/
#include "qbuffer.h"
+#include <QtCore/qmetaobject.h>
#include "private/qiodevice_p.h"
QT_BEGIN_NAMESPACE
@@ -112,7 +113,7 @@ QByteArray QBufferPrivate::peek(qint64 maxSize)
interface. The QByteArray is treated just as a standard random-accessed
file. Example:
- \snippet doc/src/snippets/buffer/buffer.cpp 0
+ \snippet buffer/buffer.cpp 0
By default, an internal QByteArray buffer is created for you when
you create a QBuffer. You can access this buffer directly by
@@ -130,12 +131,12 @@ QByteArray QBufferPrivate::peek(qint64 maxSize)
The following code snippet shows how to write data to a
QByteArray using QDataStream and QBuffer:
- \snippet doc/src/snippets/buffer/buffer.cpp 1
+ \snippet buffer/buffer.cpp 1
Effectively, we convert the application's QPalette into a byte
array. Here's how to read the data from the QByteArray:
- \snippet doc/src/snippets/buffer/buffer.cpp 2
+ \snippet buffer/buffer.cpp 2
QTextStream and QDataStream also provide convenience constructors
that take a QByteArray and that create a QBuffer behind the
@@ -194,7 +195,7 @@ QBuffer::QBuffer(QObject *parent)
Example:
- \snippet doc/src/snippets/buffer/buffer.cpp 3
+ \snippet buffer/buffer.cpp 3
\sa open(), setBuffer(), setData()
*/
@@ -230,7 +231,7 @@ QBuffer::~QBuffer()
Example:
- \snippet doc/src/snippets/buffer/buffer.cpp 4
+ \snippet buffer/buffer.cpp 4
If \a byteArray is 0, the buffer creates its own internal
QByteArray to work on. This byte array is initially empty.
@@ -459,9 +460,11 @@ qint64 QBuffer::writeData(const char *data, qint64 len)
\reimp
\internal
*/
-void QBuffer::connectNotify(const char *signal)
+void QBuffer::connectNotify(const QMetaMethod &signal)
{
- if (strcmp(signal + 1, "readyRead()") == 0 || strcmp(signal + 1, "bytesWritten(qint64)") == 0)
+ static const QMetaMethod readyReadSignal = QMetaMethod::fromSignal(&QBuffer::readyRead);
+ static const QMetaMethod bytesWrittenSignal = QMetaMethod::fromSignal(&QBuffer::bytesWritten);
+ if (signal == readyReadSignal || signal == bytesWrittenSignal)
d_func()->signalConnectionCount++;
}
@@ -469,10 +472,16 @@ void QBuffer::connectNotify(const char *signal)
\reimp
\internal
*/
-void QBuffer::disconnectNotify(const char *signal)
+void QBuffer::disconnectNotify(const QMetaMethod &signal)
{
- if (!signal || strcmp(signal + 1, "readyRead()") == 0 || strcmp(signal + 1, "bytesWritten(qint64)") == 0)
- d_func()->signalConnectionCount--;
+ if (signal.isValid()) {
+ static const QMetaMethod readyReadSignal = QMetaMethod::fromSignal(&QBuffer::readyRead);
+ static const QMetaMethod bytesWrittenSignal = QMetaMethod::fromSignal(&QBuffer::bytesWritten);
+ if (signal == readyReadSignal || signal == bytesWrittenSignal)
+ d_func()->signalConnectionCount--;
+ } else {
+ d_func()->signalConnectionCount = 0;
+ }
}
#endif
diff --git a/src/corelib/io/qbuffer.h b/src/corelib/io/qbuffer.h
index 8b42363f24..ffbc554ec4 100644
--- a/src/corelib/io/qbuffer.h
+++ b/src/corelib/io/qbuffer.h
@@ -88,8 +88,8 @@ public:
protected:
#ifndef QT_NO_QOBJECT
- void connectNotify(const char*);
- void disconnectNotify(const char*);
+ void connectNotify(const QMetaMethod &);
+ void disconnectNotify(const QMetaMethod &);
#endif
qint64 readData(char *data, qint64 maxlen);
qint64 writeData(const char *data, qint64 len);
diff --git a/src/corelib/io/qdatastream.cpp b/src/corelib/io/qdatastream.cpp
index 1fe2a793a6..bb12bc1c5b 100644
--- a/src/corelib/io/qdatastream.cpp
+++ b/src/corelib/io/qdatastream.cpp
@@ -81,11 +81,11 @@ QT_BEGIN_NAMESPACE
Example (write binary data to a stream):
- \snippet doc/src/snippets/code/src_corelib_io_qdatastream.cpp 0
+ \snippet code/src_corelib_io_qdatastream.cpp 0
Example (read binary data from a stream):
- \snippet doc/src/snippets/code/src_corelib_io_qdatastream.cpp 1
+ \snippet code/src_corelib_io_qdatastream.cpp 1
Each item written to the stream is written in a predefined binary
format that varies depending on the item's type. Supported Qt
@@ -119,7 +119,7 @@ QT_BEGIN_NAMESPACE
compatibility, you can hardcode the version number in the
application:
- \snippet doc/src/snippets/code/src_corelib_io_qdatastream.cpp 2
+ \snippet code/src_corelib_io_qdatastream.cpp 2
If you are producing a new binary data format, such as a file
format for documents created by your application, you could use a
@@ -127,11 +127,11 @@ QT_BEGIN_NAMESPACE
would write a brief header containing a magic string and a version
number to give yourself room for future expansion. For example:
- \snippet doc/src/snippets/code/src_corelib_io_qdatastream.cpp 3
+ \snippet code/src_corelib_io_qdatastream.cpp 3
Then read it in with:
- \snippet doc/src/snippets/code/src_corelib_io_qdatastream.cpp 4
+ \snippet code/src_corelib_io_qdatastream.cpp 4
You can select which byte order to use when serializing data. The
default setting is big endian (MSB first). Changing it to little
@@ -187,7 +187,7 @@ QT_BEGIN_NAMESPACE
defined, check the \b {Related Non-Members} section of the
class's documentation page.
- \sa QTextStream QVariant
+ \sa QTextStream, QVariant
*/
/*!
@@ -253,9 +253,6 @@ enum {
DefaultStreamVersion = QDataStream::Qt_5_0
};
-// ### 5.0: when streaming invalid QVariants, just the type should
-// be written, no "data" after it
-
/*!
Constructs a data stream that has no I/O device.
@@ -421,7 +418,7 @@ bool QDataStream::atEnd() const
\since 4.6
- \sa FloatingPointPrecision setFloatingPointPrecision()
+ \sa FloatingPointPrecision, setFloatingPointPrecision()
*/
QDataStream::FloatingPointPrecision QDataStream::floatingPointPrecision() const
{
@@ -455,7 +452,7 @@ void QDataStream::setFloatingPointPrecision(QDataStream::FloatingPointPrecision
/*!
Returns the status of the data stream.
- \sa Status setStatus() resetStatus()
+ \sa Status, setStatus(), resetStatus()
*/
QDataStream::Status QDataStream::status() const
@@ -466,7 +463,7 @@ QDataStream::Status QDataStream::status() const
/*!
Resets the status of the data stream.
- \sa Status status() setStatus()
+ \sa Status, status(), setStatus()
*/
void QDataStream::resetStatus()
{
@@ -479,7 +476,7 @@ void QDataStream::resetStatus()
Subsequent calls to setStatus() are ignored until resetStatus()
is called.
- \sa Status status() resetStatus()
+ \sa Status, status(), resetStatus()
*/
void QDataStream::setStatus(Status status)
{
@@ -540,7 +537,7 @@ void QDataStream::setByteOrder(ByteOrder bo)
\value Qt_4_7 Same as Qt_4_6.
\value Qt_4_8 Same as Qt_4_6.
\value Qt_4_9 Same as Qt_4_6.
- \value Qt_5_0 Same as Qt_4_6.
+ \value Qt_5_0 Version 13 (Qt 5.0)
\sa setVersion(), version()
*/
@@ -589,7 +586,7 @@ void QDataStream::setByteOrder(ByteOrder bo)
The \l Version enum provides symbolic constants for the different
versions of Qt. For example:
- \snippet doc/src/snippets/code/src_corelib_io_qdatastream.cpp 5
+ \snippet code/src_corelib_io_qdatastream.cpp 5
\sa version(), Version
*/
@@ -813,7 +810,7 @@ QDataStream &QDataStream::operator>>(double &f)
/*!
\overload
- Reads the '\0'-terminated string \a s from the stream and returns
+ Reads the '\\0'-terminated string \a s from the stream and returns
a reference to the stream.
Space for the string is allocated using \c new -- the caller must
@@ -1094,7 +1091,7 @@ QDataStream &QDataStream::operator<<(double f)
/*!
\overload
- Writes the '\0'-terminated string \a s to the stream and returns a
+ Writes the '\\0'-terminated string \a s to the stream and returns a
reference to the stream.
The string is serialized using writeBytes().
diff --git a/src/corelib/io/qdebug.cpp b/src/corelib/io/qdebug.cpp
index 6726537842..a9d0fd4b3f 100644
--- a/src/corelib/io/qdebug.cpp
+++ b/src/corelib/io/qdebug.cpp
@@ -63,7 +63,7 @@
In the common case, it is useful to call the qDebug() function to obtain a
default QDebug object to use for writing debugging information.
- \snippet doc/src/snippets/qdebug/qdebugsnippet.cpp 1
+ \snippet qdebug/qdebugsnippet.cpp 1
This constructs a QDebug object using the constructor that accepts a QtMsgType
value of QtDebugMsg. Similarly, the qWarning(), qCritical() and qFatal()
@@ -80,7 +80,7 @@
most Qt value types. To add support for custom types, you need to implement a
streaming operator, as in the following example:
- \snippet doc/src/snippets/qdebug/qdebugsnippet.cpp 0
+ \snippet qdebug/qdebugsnippet.cpp 0
This is described in the \l{Debugging Techniques} and
\l{Creating Custom Qt Types#Making the Type Printable}{Creating Custom Qt Types}
@@ -251,7 +251,7 @@
/*!
\fn QDebug &QDebug::operator<<(const char *s)
- Writes the '\0'-terminated string, \a s, to the stream and returns a
+ Writes the '\\0'-terminated string, \a s, to the stream and returns a
reference to the stream.
*/
diff --git a/src/corelib/io/qdir.cpp b/src/corelib/io/qdir.cpp
index 23bf3c5f4b..222192b11c 100644
--- a/src/corelib/io/qdir.cpp
+++ b/src/corelib/io/qdir.cpp
@@ -358,14 +358,14 @@ inline void QDirPrivate::initFileEngine()
Examples of absolute paths:
- \snippet doc/src/snippets/code/src_corelib_io_qdir.cpp 0
+ \snippet code/src_corelib_io_qdir.cpp 0
On Windows, the second example above will be translated to
\c{C:\Documents and Settings} when used to access files.
Examples of relative paths:
- \snippet doc/src/snippets/code/src_corelib_io_qdir.cpp 1
+ \snippet code/src_corelib_io_qdir.cpp 1
You can use the isRelative() or isAbsolute() functions to check if
a QDir is using a relative or an absolute file path. Call
@@ -382,7 +382,7 @@ inline void QDirPrivate::initFileEngine()
the location of the directory. However, it can also return "." if
the QDir represents the current directory.
- \snippet doc/src/snippets/code/src_corelib_io_qdir.cpp 2
+ \snippet code/src_corelib_io_qdir.cpp 2
The path for a directory can also be changed with the cd() and cdUp()
functions, both of which operate like familiar shell commands.
@@ -418,7 +418,7 @@ inline void QDirPrivate::initFileEngine()
file or directory. Neither of these functions checks for the
existence of files or directory; they only construct paths.
- \snippet doc/src/snippets/code/src_corelib_io_qdir.cpp 3
+ \snippet code/src_corelib_io_qdir.cpp 3
Files can be removed by using the remove() function. Directories
cannot be removed in the same way as files; use rmdir() to remove
@@ -490,19 +490,19 @@ inline void QDirPrivate::initFileEngine()
Check if a directory exists:
- \snippet doc/src/snippets/code/src_corelib_io_qdir.cpp 4
+ \snippet code/src_corelib_io_qdir.cpp 4
(We could also use the static convenience function
QFile::exists().)
Traversing directories and reading a file:
- \snippet doc/src/snippets/code/src_corelib_io_qdir.cpp 5
+ \snippet code/src_corelib_io_qdir.cpp 5
A program that lists all the files in the current directory
(excluding symbolic links), sorted by size, smallest first:
- \snippet doc/src/snippets/qdir-listfiles/main.cpp 0
+ \snippet qdir-listfiles/main.cpp 0
\sa QFileInfo, QFile, QFileDialog, QApplication::applicationDirPath(), {Find Files Example}
*/
@@ -630,7 +630,7 @@ QString QDir::absolutePath() const
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qdir.cpp 6
+ \snippet code/src_corelib_io_qdir.cpp 6
\sa path(), absolutePath(), exists(), cleanPath(), dirName(),
absoluteFilePath()
@@ -669,7 +669,7 @@ QString QDir::dirName() const
be relative. Redundant multiple separators or "." and ".."
directories in \a fileName are not removed (see cleanPath()).
- \sa dirName() absoluteFilePath(), isRelative(), canonicalPath()
+ \sa dirName(), absoluteFilePath(), isRelative(), canonicalPath()
*/
QString QDir::filePath(const QString &fileName) const
{
@@ -692,7 +692,7 @@ QString QDir::filePath(const QString &fileName) const
exists(). Redundant multiple separators or "." and ".."
directories in \a fileName are not removed (see cleanPath()).
- \sa relativeFilePath() filePath() canonicalPath()
+ \sa relativeFilePath(), filePath(), canonicalPath()
*/
QString QDir::absoluteFilePath(const QString &fileName) const
{
@@ -711,9 +711,9 @@ QString QDir::absoluteFilePath(const QString &fileName) const
/*!
Returns the path to \a fileName relative to the directory.
- \snippet doc/src/snippets/code/src_corelib_io_qdir.cpp 7
+ \snippet code/src_corelib_io_qdir.cpp 7
- \sa absoluteFilePath() filePath() canonicalPath()
+ \sa absoluteFilePath(), filePath(), canonicalPath()
*/
QString QDir::relativeFilePath(const QString &fileName) const
{
@@ -941,7 +941,7 @@ QStringList QDir::nameFilters() const
to ensure that only files with extensions typically used for C++
source files are listed:
- \snippet doc/src/snippets/qdir-namefilters/main.cpp 0
+ \snippet qdir-namefilters/main.cpp 0
\sa nameFilters(), setFilter()
*/
@@ -988,7 +988,7 @@ void QDir::addResourceSearchPath(const QString &path)
Qt uses this search path to locate files with a known prefix. The search
path entries are tested in order, starting with the first entry.
- \snippet doc/src/snippets/code/src_corelib_io_qdir.cpp 8
+ \snippet code/src_corelib_io_qdir.cpp 8
File name prefix must be at least 2 characters long to avoid conflicts with
Windows drive letters.
@@ -1146,7 +1146,7 @@ void QDir::setFilter(Filters filters)
/*!
Returns the value set by setSorting()
- \sa setSorting() SortFlag
+ \sa setSorting(), SortFlag
*/
QDir::SortFlags QDir::sorting() const
{
@@ -1190,7 +1190,7 @@ QDir::SortFlags QDir::sorting() const
The \a sort is specified by OR-ing values from the enum
\l{QDir::SortFlag}.
- \sa sorting() SortFlag
+ \sa sorting(), SortFlag
*/
void QDir::setSorting(SortFlags sort)
{
@@ -1561,7 +1561,7 @@ bool QDir::exists() const
this function returns false. If you want to test for this use
canonicalPath(), e.g.
- \snippet doc/src/snippets/code/src_corelib_io_qdir.cpp 9
+ \snippet code/src_corelib_io_qdir.cpp 9
\sa root(), rootPath()
*/
@@ -1578,7 +1578,7 @@ bool QDir::isRoot() const
Returns true if the directory's path is absolute; otherwise
returns false. See isAbsolutePath().
- \sa isRelative() makeAbsolute() cleanPath()
+ \sa isRelative(), makeAbsolute(), cleanPath()
*/
/*!
@@ -1587,7 +1587,7 @@ bool QDir::isRoot() const
Returns true if \a path is absolute; returns false if it is
relative.
- \sa isAbsolute() isRelativePath() makeAbsolute() cleanPath()
+ \sa isAbsolute(), isRelativePath(), makeAbsolute(), cleanPath()
*/
/*!
@@ -1595,7 +1595,7 @@ bool QDir::isRoot() const
false. (Under Unix a path is relative if it does not start with a
"/").
- \sa makeAbsolute() isAbsolute() isAbsolutePath() cleanPath()
+ \sa makeAbsolute(), isAbsolute(), isAbsolutePath(), cleanPath()
*/
bool QDir::isRelative() const
{
@@ -1610,7 +1610,7 @@ bool QDir::isRelative() const
absolute nothing happens. Returns true if the conversion
succeeded; otherwise returns false.
- \sa isAbsolute() isAbsolutePath() isRelative() cleanPath()
+ \sa isAbsolute(), isAbsolutePath(), isRelative(), cleanPath()
*/
bool QDir::makeAbsolute()
{
@@ -1639,7 +1639,7 @@ bool QDir::makeAbsolute()
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qdir.cpp 10
+ \snippet code/src_corelib_io_qdir.cpp 10
*/
bool QDir::operator==(const QDir &dir) const
{
@@ -1718,7 +1718,7 @@ QDir &QDir::operator=(const QString &path)
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qdir.cpp 11
+ \snippet code/src_corelib_io_qdir.cpp 11
*/
/*!
@@ -1873,7 +1873,7 @@ QString QDir::currentPath()
Under Windows this function will return the directory of the
current user's profile. Typically, this is:
- \snippet doc/src/snippets/code/src_corelib_io_qdir.cpp 12
+ \snippet code/src_corelib_io_qdir.cpp 12
Use the toNativeSeparators() function to convert the separators to
the ones that are appropriate for the underlying operating system.
@@ -1966,7 +1966,7 @@ QString QDir::rootPath()
patterns in the list of \a filters; otherwise returns false. The
matching is case insensitive.
- \sa {QRegExp wildcard matching}, QRegExp::exactMatch() entryList() entryInfoList()
+ \sa {QRegExp wildcard matching}, QRegExp::exactMatch(), entryList(), entryInfoList()
*/
bool QDir::match(const QStringList &filters, const QString &fileName)
{
@@ -1984,7 +1984,7 @@ bool QDir::match(const QStringList &filters, const QString &fileName)
contain multiple patterns separated by spaces or semicolons.
The matching is case insensitive.
- \sa {QRegExp wildcard matching}, QRegExp::exactMatch() entryList() entryInfoList()
+ \sa {QRegExp wildcard matching}, QRegExp::exactMatch(), entryList(), entryInfoList()
*/
bool QDir::match(const QString &filter, const QString &fileName)
{
@@ -2001,7 +2001,7 @@ bool QDir::match(const QString &filter, const QString &fileName)
For example, "./local" becomes "local", "local/../bin" becomes
"bin" and "/local/usr/../bin" becomes "/local/bin".
- \sa absolutePath() canonicalPath()
+ \sa absolutePath(), canonicalPath()
*/
QString QDir::cleanPath(const QString &path)
{
@@ -2129,7 +2129,7 @@ QString QDir::cleanPath(const QString &path)
Returns true if \a path is relative; returns false if it is
absolute.
- \sa isRelative() isAbsolutePath() makeAbsolute()
+ \sa isRelative(), isAbsolutePath(), makeAbsolute()
*/
bool QDir::isRelativePath(const QString &path)
{
@@ -2181,7 +2181,7 @@ QStringList QDir::nameFiltersFromString(const QString &nameFilter)
initialized at startup by adding this line to your \c main()
function:
- \snippet doc/src/snippets/code/src_corelib_io_qdir.cpp 13
+ \snippet code/src_corelib_io_qdir.cpp 13
If the file name contains characters that cannot be part of a valid C++ function name
(such as '-'), they have to be replaced by the underscore character ('_').
@@ -2190,7 +2190,7 @@ QStringList QDir::nameFiltersFromString(const QString &nameFilter)
main(). If that is not possible, the following workaround can be used
to init the resource \c myapp from the function \c{MyNamespace::myFunction}:
- \snippet doc/src/snippets/code/src_corelib_io_qdir.cpp 14
+ \snippet code/src_corelib_io_qdir.cpp 14
\sa Q_CLEANUP_RESOURCE(), {The Qt Resource System}
*/
@@ -2213,7 +2213,7 @@ QStringList QDir::nameFiltersFromString(const QString &nameFilter)
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qdir.cpp 15
+ \snippet code/src_corelib_io_qdir.cpp 15
\sa Q_INIT_RESOURCE(), {The Qt Resource System}
*/
diff --git a/src/corelib/io/qdiriterator.cpp b/src/corelib/io/qdiriterator.cpp
index 56912e8706..67ea1c9538 100644
--- a/src/corelib/io/qdiriterator.cpp
+++ b/src/corelib/io/qdiriterator.cpp
@@ -55,7 +55,7 @@
argument. After construction, the iterator is located before the first
directory entry. Here's how to iterate over all the entries sequentially:
- \snippet doc/src/snippets/code/src_corelib_io_qdiriterator.cpp 0
+ \snippet code/src_corelib_io_qdiriterator.cpp 0
The next() function returns the path to the next directory entry and
advances the iterator. You can also call filePath() to get the current
@@ -338,7 +338,8 @@ bool QDirIteratorPrivate::matchesFilters(const QString &fileName, const QFileInf
end = nameRegExps.constEnd();
iter != end; ++iter) {
- if (iter->exactMatch(fileName)) {
+ QRegExp copy = *iter;
+ if (copy.exactMatch(fileName)) {
matched = true;
break;
}
diff --git a/src/corelib/io/qfile.cpp b/src/corelib/io/qfile.cpp
index 120c5a8c23..b3e3bdde53 100644
--- a/src/corelib/io/qfile.cpp
+++ b/src/corelib/io/qfile.cpp
@@ -170,7 +170,7 @@ QAbstractFileEngine *QFilePrivate::engine() const
The following example reads a text file line by line:
- \snippet doc/src/snippets/file/file.cpp 0
+ \snippet file/file.cpp 0
The QIODevice::Text flag passed to open() tells Qt to convert
Windows-style line terminators ("\\r\\n") into C++-style
@@ -182,7 +182,7 @@ QAbstractFileEngine *QFilePrivate::engine() const
The next example uses QTextStream to read a text file
line by line:
- \snippet doc/src/snippets/file/file.cpp 1
+ \snippet file/file.cpp 1
QTextStream takes care of converting the 8-bit data stored on
disk into a 16-bit Unicode QString. By default, it assumes that
@@ -194,7 +194,7 @@ QAbstractFileEngine *QFilePrivate::engine() const
take a QTextStream on the left and various data types (including
QString) on the right:
- \snippet doc/src/snippets/file/file.cpp 2
+ \snippet file/file.cpp 2
QDataStream is similar, in that you can use operator<<() to write
data and operator>>() to read it back. See the class
@@ -217,7 +217,7 @@ QAbstractFileEngine *QFilePrivate::engine() const
read() or readLine() repeatedly until no more data can be read. The next
example uses QTextStream to read \c /proc/modules line by line:
- \snippet doc/src/snippets/file/file.cpp 3
+ \snippet file/file.cpp 3
\section1 Signals
@@ -325,7 +325,7 @@ QString QFile::fileName() const
\e{at the time of the open()} call.
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qfile.cpp 0
+ \snippet code/src_corelib_io_qfile.cpp 0
Note that the directory separator "/" works for all operating
systems supported by Qt.
@@ -363,7 +363,7 @@ QFile::setFileName(const QString &name)
file names that the user chooses. File names hard-coded into the
application should only use 7-bit ASCII filename characters.
- \sa decodeName() setEncodingFunction()
+ \sa decodeName(), setEncodingFunction()
*/
QByteArray
@@ -378,7 +378,7 @@ QFile::encodeName(const QString &fileName)
This is a typedef for a pointer to a function with the following
signature:
- \snippet doc/src/snippets/code/src_corelib_io_qfile.cpp 1
+ \snippet code/src_corelib_io_qfile.cpp 1
\sa setEncodingFunction(), encodeName()
*/
@@ -420,7 +420,7 @@ QFile::setEncodingFunction(EncoderFn f)
This is a typedef for a pointer to a function with the following
signature:
- \snippet doc/src/snippets/code/src_corelib_io_qfile.cpp 2
+ \snippet code/src_corelib_io_qfile.cpp 2
\sa setDecodingFunction()
*/
@@ -485,7 +485,7 @@ QFile::exists(const QString &fileName)
This name may not represent an existing file; it is only a string.
QFile::exists() returns true if the symlink points to an existing file.
- \sa fileName() setFileName()
+ \sa fileName(), setFileName()
*/
/*!
@@ -896,7 +896,7 @@ bool QFile::open(OpenMode mode)
Returns true if successful; otherwise returns false.
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qfile.cpp 3
+ \snippet code/src_corelib_io_qfile.cpp 3
When a QFile is opened using this function, behaviour of close() is
controlled by the AutoCloseHandle flag.
@@ -930,7 +930,7 @@ bool QFile::open(OpenMode mode)
stdin, stdout and stderr streams at the console. To do this, add the
following declaration to your application's project file:
- \snippet doc/src/snippets/code/src_corelib_io_qfile.cpp 4
+ \snippet code/src_corelib_io_qfile.cpp 4
*/
bool QFile::open(FILE *fh, OpenMode mode, FileHandleFlags handleFlags)
{
diff --git a/src/corelib/io/qfileinfo.cpp b/src/corelib/io/qfileinfo.cpp
index 1805e759ab..1dcde0496d 100644
--- a/src/corelib/io/qfileinfo.cpp
+++ b/src/corelib/io/qfileinfo.cpp
@@ -244,14 +244,14 @@ QDateTime &QFileInfoPrivate::getFileTime(QAbstractFileEngine::FileTime request)
transparently; similarly, opening a symlink using QFile
effectively opens the link's target. For example:
- \snippet doc/src/snippets/code/src_corelib_io_qfileinfo.cpp 0
+ \snippet code/src_corelib_io_qfileinfo.cpp 0
On Windows, symlinks (shortcuts) are \c .lnk files. The reported
size() is that of the symlink (not the link's target), and
opening a symlink using QFile opens the \c .lnk file. For
example:
- \snippet doc/src/snippets/code/src_corelib_io_qfileinfo.cpp 1
+ \snippet code/src_corelib_io_qfileinfo.cpp 1
Elements of the file's name can be extracted with path() and
fileName(). The fileName()'s parts can be extracted with
@@ -442,7 +442,7 @@ QFileInfo &QFileInfo::operator=(const QFileInfo &fileinfo)
path relative to the current directory.
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qfileinfo.cpp 2
+ \snippet code/src_corelib_io_qfileinfo.cpp 2
\sa isRelative(), QDir::setCurrent(), QDir::isRelativePath()
*/
@@ -496,7 +496,7 @@ void QFileInfo::setFile(const QDir &dir, const QString &file)
QFileInfo will uppercase drive letters. Note that QDir does not do
this. The code snippet below shows this.
- \snippet doc/src/snippets/code/src_corelib_io_qfileinfo.cpp newstuff
+ \snippet code/src_corelib_io_qfileinfo.cpp newstuff
This function returns the same as filePath(), unless isRelative()
is true. In contrast to canonicalFilePath(), symbolic links or
@@ -688,7 +688,7 @@ QString QFileInfo::filePath() const
Returns the name of the file, excluding the path.
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qfileinfo.cpp 3
+ \snippet code/src_corelib_io_qfileinfo.cpp 3
Note that, if this QFileInfo object is given a path ending in a
slash, the name of the file is considered empty.
@@ -711,7 +711,7 @@ QString QFileInfo::fileName() const
path isBundle(). On all other platforms an empty QString is returned.
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qfileinfo.cpp 4
+ \snippet code/src_corelib_io_qfileinfo.cpp 4
\sa isBundle(), filePath(), baseName(), extension()
*/
@@ -730,7 +730,7 @@ QString QFileInfo::bundleName() const
not including) the \e first '.' character.
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qfileinfo.cpp 5
+ \snippet code/src_corelib_io_qfileinfo.cpp 5
The base name of a file is computed equally on all platforms, independent
@@ -754,7 +754,7 @@ QString QFileInfo::baseName() const
to (but not including) the \e last '.' character.
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qfileinfo.cpp 6
+ \snippet code/src_corelib_io_qfileinfo.cpp 6
\sa fileName(), suffix(), completeSuffix(), baseName()
*/
@@ -773,7 +773,7 @@ QString QFileInfo::completeBaseName() const
(but not including) the first '.'.
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qfileinfo.cpp 7
+ \snippet code/src_corelib_io_qfileinfo.cpp 7
\sa fileName(), suffix(), baseName(), completeBaseName()
*/
@@ -792,7 +792,7 @@ QString QFileInfo::completeSuffix() const
including) the last '.'.
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qfileinfo.cpp 8
+ \snippet code/src_corelib_io_qfileinfo.cpp 8
The suffix of a file is computed equally on all platforms, independent of
file naming conventions (e.g., ".bashrc" on Unix has an empty base name,
@@ -818,12 +818,12 @@ QString QFileInfo::suffix() const
For each of the following, dir() returns a QDir for
\c{"~/examples/191697"}.
- \snippet doc/src/snippets/fileinfo/main.cpp 0
+ \snippet fileinfo/main.cpp 0
For each of the following, dir() returns a QDir for
\c{"."}.
- \snippet doc/src/snippets/fileinfo/main.cpp 1
+ \snippet fileinfo/main.cpp 1
\sa absolutePath(), filePath(), fileName(), isRelative(), absoluteDir()
*/
@@ -1010,7 +1010,7 @@ bool QFileInfo::isBundle() const
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qfileinfo.cpp 9
+ \snippet code/src_corelib_io_qfileinfo.cpp 9
\note If the symlink points to a non existing file, exists() returns
false.
@@ -1172,7 +1172,7 @@ uint QFileInfo::groupId() const
always returns true.
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qfileinfo.cpp 10
+ \snippet code/src_corelib_io_qfileinfo.cpp 10
\sa isReadable(), isWritable(), isExecutable()
*/
@@ -1243,7 +1243,7 @@ qint64 QFileInfo::size() const
If neither creation time nor "last status change" time are not
available, returns the same as lastModified().
- \sa lastModified() lastRead()
+ \sa lastModified(), lastRead()
*/
QDateTime QFileInfo::created() const
{
@@ -1261,7 +1261,7 @@ QDateTime QFileInfo::created() const
/*!
Returns the date and time when the file was last modified.
- \sa created() lastRead()
+ \sa created(), lastRead()
*/
QDateTime QFileInfo::lastModified() const
{
@@ -1282,7 +1282,7 @@ QDateTime QFileInfo::lastModified() const
On platforms where this information is not available, returns the
same as lastModified().
- \sa created() lastModified()
+ \sa created(), lastModified()
*/
QDateTime QFileInfo::lastRead() const
{
diff --git a/src/corelib/io/qfilesystemengine.cpp b/src/corelib/io/qfilesystemengine.cpp
index 21436c1cfc..c2ac85bd80 100644
--- a/src/corelib/io/qfilesystemengine.cpp
+++ b/src/corelib/io/qfilesystemengine.cpp
@@ -259,7 +259,7 @@ void QFileSystemMetaData::fillFromStatBuf(const QT_STATBUF &statBuffer)
// Attributes
entryFlags |= QFileSystemMetaData::ExistsAttribute;
size_ = statBuffer.st_size;
-#if defined (Q_OS_MAC) && !defined(QT_NO_CORESERVICES) \
+#if defined (Q_OS_MAC) && !defined(Q_OS_IOS) \
&& MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
if (statBuffer.st_flags & UF_HIDDEN) {
entryFlags |= QFileSystemMetaData::HiddenAttribute;
diff --git a/src/corelib/io/qfilesystemengine_p.h b/src/corelib/io/qfilesystemengine_p.h
index 17413d9c76..b5d28f9a5b 100644
--- a/src/corelib/io/qfilesystemengine_p.h
+++ b/src/corelib/io/qfilesystemengine_p.h
@@ -83,7 +83,7 @@ public:
static QString resolveGroupName(uint groupId);
#endif
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
static QString bundleName(const QFileSystemEntry &entry);
#else
static QString bundleName(const QFileSystemEntry &entry) { Q_UNUSED(entry) return QString(); }
diff --git a/src/corelib/io/qfilesystemengine_unix.cpp b/src/corelib/io/qfilesystemengine_unix.cpp
index 00e116b58f..d1a0621cbe 100644
--- a/src/corelib/io/qfilesystemengine_unix.cpp
+++ b/src/corelib/io/qfilesystemengine_unix.cpp
@@ -58,7 +58,7 @@
QT_BEGIN_NAMESPACE
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
static inline bool _q_isMacHidden(const char *nativePath)
{
OSErr err;
@@ -142,7 +142,7 @@ QFileSystemEntry QFileSystemEngine::getLinkTarget(const QFileSystemEntry &link,
ret.chop(1);
return QFileSystemEntry(ret);
}
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
{
FSRef fref;
if (FSPathMakeRef((const UInt8 *)QFile::encodeName(QDir::cleanPath(link.filePath())).data(), &fref, 0) == noErr) {
@@ -174,7 +174,7 @@ QFileSystemEntry QFileSystemEngine::canonicalName(const QFileSystemEntry &entry,
return QFileSystemEntry(slowCanonicalized(absoluteName(entry).filePath()));
#else
char *ret = 0;
-# if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+# if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
// Mac OS X 10.5.x doesn't support the realpath(X,0) extension we use here.
if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_6) {
ret = realpath(entry.nativeFilePath().constData(), (char*)0);
@@ -192,7 +192,12 @@ QFileSystemEntry QFileSystemEngine::canonicalName(const QFileSystemEntry &entry,
}
}
# else
+# if _POSIX_VERSION >= 200801L
ret = realpath(entry.nativeFilePath().constData(), (char*)0);
+# else
+ ret = (char*)malloc(PATH_MAX);
+ realpath(entry.nativeFilePath().constData(), (char*)ret);
+# endif
# endif
if (ret) {
data.knownFlagsMask |= QFileSystemMetaData::ExistsAttribute;
@@ -303,7 +308,7 @@ QString QFileSystemEngine::resolveGroupName(uint groupId)
return QString();
}
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
//static
QString QFileSystemEngine::bundleName(const QFileSystemEntry &entry)
{
@@ -323,7 +328,7 @@ QString QFileSystemEngine::bundleName(const QFileSystemEntry &entry)
bool QFileSystemEngine::fillMetaData(const QFileSystemEntry &entry, QFileSystemMetaData &data,
QFileSystemMetaData::MetaDataFlags what)
{
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
if (what & QFileSystemMetaData::BundleType) {
if (!data.hasFlags(QFileSystemMetaData::DirectoryType))
what |= QFileSystemMetaData::DirectoryType;
@@ -334,7 +339,7 @@ bool QFileSystemEngine::fillMetaData(const QFileSystemEntry &entry, QFileSystemM
what |= QFileSystemMetaData::PosixStatFlags;
}
# endif // MAC_OS_X_VERSION_MAX_ALLOWED...
-#endif // defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#endif // defined(Q_OS_MAC) && !defined(Q_OS_IOS)
if (what & QFileSystemMetaData::PosixStatFlags)
what |= QFileSystemMetaData::PosixStatFlags;
@@ -395,7 +400,7 @@ bool QFileSystemEngine::fillMetaData(const QFileSystemEntry &entry, QFileSystemM
| QFileSystemMetaData::ExistsAttribute;
}
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
if (what & QFileSystemMetaData::AliasType)
{
if (entryExists) {
@@ -441,7 +446,7 @@ bool QFileSystemEngine::fillMetaData(const QFileSystemEntry &entry, QFileSystemM
data.knownFlagsMask |= QFileSystemMetaData::HiddenAttribute;
}
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
if (what & QFileSystemMetaData::BundleType) {
if (entryExists && data.isDirectory()) {
QCFType<CFStringRef> path = CFStringCreateWithBytes(0,
diff --git a/src/corelib/io/qfilesystemmetadata_p.h b/src/corelib/io/qfilesystemmetadata_p.h
index 6053b16752..3a53eb56e9 100644
--- a/src/corelib/io/qfilesystemmetadata_p.h
+++ b/src/corelib/io/qfilesystemmetadata_p.h
@@ -100,7 +100,7 @@ public:
LinkType = 0x00010000,
FileType = 0x00020000,
DirectoryType = 0x00040000,
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
BundleType = 0x00080000,
AliasType = 0x08000000,
#else
@@ -248,7 +248,7 @@ private:
Q_DECLARE_OPERATORS_FOR_FLAGS(QFileSystemMetaData::MetaDataFlags)
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
inline bool QFileSystemMetaData::isBundle() const { return (entryFlags & BundleType); }
inline bool QFileSystemMetaData::isAlias() const { return (entryFlags & AliasType); }
#else
diff --git a/src/corelib/io/qiodevice.cpp b/src/corelib/io/qiodevice.cpp
index 1cdfc61627..3c2da7fa85 100644
--- a/src/corelib/io/qiodevice.cpp
+++ b/src/corelib/io/qiodevice.cpp
@@ -215,7 +215,7 @@ QIODevicePrivate::~QIODevicePrivate()
Calling these functions from the main, GUI thread, may cause your
user interface to freeze. Example:
- \snippet doc/src/snippets/code/src_corelib_io_qiodevice.cpp 0
+ \snippet code/src_corelib_io_qiodevice.cpp 0
By subclassing QIODevice, you can provide the same interface to
your own I/O devices. Subclasses of QIODevice are only required to
@@ -239,7 +239,7 @@ QIODevicePrivate::~QIODevicePrivate()
subclassing QIODevice, remember to bypass any buffer you may use
when the device is open in Unbuffered mode.
- \sa QBuffer QFile QTcpSocket
+ \sa QBuffer, QFile, QTcpSocket
*/
/*!
@@ -257,9 +257,9 @@ QIODevicePrivate::~QIODevicePrivate()
\value Truncate If possible, the device is truncated before it is opened.
All earlier contents of the device are lost.
\value Text When reading, the end-of-line terminators are
- translated to '\n'. When writing, the end-of-line
+ translated to '\\n'. When writing, the end-of-line
terminators are translated to the local encoding, for
- example '\r\n' for Win32.
+ example '\\r\\n' for Win32.
\value Unbuffered Any buffer in the device is bypassed.
Certain flags, such as \c Unbuffered and \c Truncate, are
@@ -431,7 +431,7 @@ QIODevice::OpenMode QIODevice::openMode() const
function to set the open mode if the flags change after the device
has been opened.
- \sa openMode() OpenMode
+ \sa openMode(), OpenMode
*/
void QIODevice::setOpenMode(OpenMode openMode)
{
@@ -484,7 +484,7 @@ bool QIODevice::isTextModeEnabled() const
default, this function returns false if openMode() returns
\c NotOpen.
- \sa openMode() OpenMode
+ \sa openMode(), OpenMode
*/
bool QIODevice::isOpen() const
{
@@ -498,7 +498,7 @@ bool QIODevice::isOpen() const
This is a convenience function which checks if the OpenMode of the
device contains the ReadOnly flag.
- \sa openMode() OpenMode
+ \sa openMode(), OpenMode
*/
bool QIODevice::isReadable() const
{
@@ -512,7 +512,7 @@ bool QIODevice::isReadable() const
This is a convenience function which checks if the OpenMode of the
device contains the WriteOnly flag.
- \sa openMode() OpenMode
+ \sa openMode(), OpenMode
*/
bool QIODevice::isWritable() const
{
@@ -524,7 +524,7 @@ bool QIODevice::isWritable() const
otherwise returns false. This function should be called from any
reimplementations of open() or other functions that open the device.
- \sa openMode() OpenMode
+ \sa openMode(), OpenMode
*/
bool QIODevice::open(OpenMode mode)
{
@@ -544,7 +544,7 @@ bool QIODevice::open(OpenMode mode)
First emits aboutToClose(), then closes the device and sets its
OpenMode to NotOpen. The error string is also reset.
- \sa setOpenMode() OpenMode
+ \sa setOpenMode(), OpenMode
*/
void QIODevice::close()
{
@@ -704,7 +704,7 @@ bool QIODevice::reset()
Subclasses that reimplement this function must call the base
implementation in order to include the size of QIODevices' buffer. Example:
- \snippet doc/src/snippets/code/src_corelib_io_qiodevice.cpp 1
+ \snippet code/src_corelib_io_qiodevice.cpp 1
\sa bytesToWrite(), readyRead(), isSequential()
*/
@@ -745,7 +745,7 @@ qint64 QIODevice::bytesToWrite() const
function returns -1 in those cases (that is, reading on a closed
socket or after a process has died).
- \sa readData() readLine() write()
+ \sa readData(), readLine(), write()
*/
qint64 QIODevice::read(char *data, qint64 maxSize)
{
@@ -1032,13 +1032,13 @@ QByteArray QIODevice::readAll()
occurs, this function returns the length of what could be read, or
-1 if nothing was read.
- A terminating '\0' byte is always appended to \a data, so \a
+ A terminating '\\0' byte is always appended to \a data, so \a
maxSize must be larger than 1.
Data is read until either of the following conditions are met:
\list
- \li The first '\n' character is read.
+ \li The first '\\n' character is read.
\li \a maxSize - 1 bytes are read.
\li The end of the device data is detected.
\endlist
@@ -1046,12 +1046,12 @@ QByteArray QIODevice::readAll()
For example, the following code reads a line of characters from a
file:
- \snippet doc/src/snippets/code/src_corelib_io_qiodevice.cpp 2
+ \snippet code/src_corelib_io_qiodevice.cpp 2
- The newline character ('\n') is included in the buffer. If a
+ The newline character ('\\n') is included in the buffer. If a
newline is not encountered before maxSize - 1 bytes are read, a
newline will not be inserted into the buffer. On windows newline
- characters are replaced with '\n'.
+ characters are replaced with '\\n'.
This function calls readLineData(), which is implemented using
repeated calls to getChar(). You can provide a more efficient
@@ -1208,7 +1208,7 @@ QByteArray QIODevice::readLine(qint64 maxSize)
implementation, using getChar(). Buffered devices can improve the
performance of readLine() by reimplementing this function.
- readLine() appends a '\0' byte to \a data; readLineData() does not
+ readLine() appends a '\\0' byte to \a data; readLineData() does not
need to do this.
If you reimplement this function, be careful to return the correct
@@ -1258,7 +1258,7 @@ qint64 QIODevice::readLineData(char *data, qint64 maxSize)
Subclasses that reimplement this function must call the base
implementation in order to include the contents of the QIODevice's buffer. Example:
- \snippet doc/src/snippets/code/src_corelib_io_qiodevice.cpp 3
+ \snippet code/src_corelib_io_qiodevice.cpp 3
\sa readyRead(), readLine()
*/
@@ -1272,7 +1272,7 @@ bool QIODevice::canReadLine() const
device. Returns the number of bytes that were actually written, or
-1 if an error occurred.
- \sa read() writeData()
+ \sa read(), writeData()
*/
qint64 QIODevice::write(const char *data, qint64 maxSize)
{
@@ -1362,7 +1362,7 @@ qint64 QIODevice::write(const char *data, qint64 maxSize)
...
\endcode
- \sa read() writeData()
+ \sa read(), writeData()
*/
qint64 QIODevice::write(const char *data)
{
@@ -1376,7 +1376,7 @@ qint64 QIODevice::write(const char *data)
Writes the content of \a byteArray to the device. Returns the number of
bytes that were actually written, or -1 if an error occurred.
- \sa read() writeData()
+ \sa read(), writeData()
*/
/*!
@@ -1407,7 +1407,7 @@ void QIODevice::ungetChar(char c)
Writes the character \a c to the device. Returns true on success;
otherwise returns false.
- \sa write() getChar() ungetChar()
+ \sa write(), getChar(), ungetChar()
*/
bool QIODevice::putChar(char c)
{
@@ -1457,7 +1457,7 @@ QByteArray QIODevicePrivate::peek(qint64 maxSize)
is 0, the character is discarded. Returns true on success;
otherwise returns false.
- \sa read() putChar() ungetChar()
+ \sa read(), putChar(), ungetChar()
*/
bool QIODevice::getChar(char *c)
{
@@ -1479,7 +1479,7 @@ bool QIODevice::getChar(char *c)
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qiodevice.cpp 4
+ \snippet code/src_corelib_io_qiodevice.cpp 4
\sa read()
*/
@@ -1497,7 +1497,7 @@ qint64 QIODevice::peek(char *data, qint64 maxSize)
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qiodevice.cpp 5
+ \snippet code/src_corelib_io_qiodevice.cpp 5
This function has no way of reporting errors; returning an empty
QByteArray() can mean either that no data was currently available
@@ -1620,7 +1620,7 @@ QString QIODevice::errorString() const
all the requested information was read and therefore does not retry reading
if there was a problem.
- \sa read() readLine() writeData()
+ \sa read(), readLine(), writeData()
*/
/*!
@@ -1638,7 +1638,7 @@ QString QIODevice::errorString() const
all the information was written and therefore does not retry writing if
there was a problem.
- \sa read() write()
+ \sa read(), write()
*/
diff --git a/src/corelib/io/qiodevice_p.h b/src/corelib/io/qiodevice_p.h
index a510f5390c..4819ec11a0 100644
--- a/src/corelib/io/qiodevice_p.h
+++ b/src/corelib/io/qiodevice_p.h
@@ -110,6 +110,11 @@ public:
first += r;
return r;
}
+ int peek(char* target, int size) {
+ int r = qMin(size, len);
+ memcpy(target, first, r);
+ return r;
+ }
char* reserve(int size) {
makeSpace(size + len, freeSpaceAtEnd);
char* writePtr = first + len;
diff --git a/src/corelib/io/qprocess.cpp b/src/corelib/io/qprocess.cpp
index 640704ec86..b75c9c1974 100644
--- a/src/corelib/io/qprocess.cpp
+++ b/src/corelib/io/qprocess.cpp
@@ -451,10 +451,10 @@ void QProcessPrivate::Channel::clear()
containing "-style" and "motif" as two items in the list of
arguments:
- \snippet doc/src/snippets/qprocess/qprocess-simpleexecution.cpp 0
+ \snippet qprocess/qprocess-simpleexecution.cpp 0
\dots
- \snippet doc/src/snippets/qprocess/qprocess-simpleexecution.cpp 1
- \snippet doc/src/snippets/qprocess/qprocess-simpleexecution.cpp 2
+ \snippet qprocess/qprocess-simpleexecution.cpp 1
+ \snippet qprocess/qprocess-simpleexecution.cpp 2
QProcess then enters the \l Starting state, and when the program
has started, QProcess enters the \l Running state and emits
@@ -550,7 +550,7 @@ void QProcessPrivate::Channel::clear()
The following example runs \c gzip to compress the string "Qt
rocks!", without an event loop:
- \snippet doc/src/snippets/process/process.cpp 0
+ \snippet process/process.cpp 0
\section1 Notes for Windows Users
@@ -1184,7 +1184,7 @@ QProcess::ProcessChannelMode QProcess::processChannelMode() const
error channels to the \a mode specified.
This mode will be used the next time start() is called. For example:
- \snippet doc/src/snippets/code/src_corelib_io_qprocess.cpp 0
+ \snippet code/src_corelib_io_qprocess.cpp 0
\sa processChannelMode(), ProcessChannelMode, setReadChannel()
*/
@@ -1261,7 +1261,7 @@ void QProcess::closeReadChannel(ProcessChannel channel)
Unix and Windows. But it will not display the text data until
QProcess's write channel has been closed. Example:
- \snippet doc/src/snippets/code/src_corelib_io_qprocess.cpp 1
+ \snippet code/src_corelib_io_qprocess.cpp 1
The write channel is implicitly opened when start() is called.
@@ -1363,10 +1363,10 @@ void QProcess::setStandardErrorFile(const QString &fileName, OpenMode mode)
destination process' standard input.
The following shell command:
- \snippet doc/src/snippets/code/src_corelib_io_qprocess.cpp 2
+ \snippet code/src_corelib_io_qprocess.cpp 2
Can be accomplished with QProcesses with the following code:
- \snippet doc/src/snippets/code/src_corelib_io_qprocess.cpp 3
+ \snippet code/src_corelib_io_qprocess.cpp 3
*/
void QProcess::setStandardOutputProcess(QProcess *destination)
{
@@ -1567,7 +1567,7 @@ QProcess::ProcessState QProcess::state() const
For example, the following code adds the \c{C:\\BIN} directory to the list of
executable paths (\c{PATHS}) on Windows:
- \snippet doc/src/snippets/qprocess-environment/main.cpp 0
+ \snippet qprocess-environment/main.cpp 0
\note This function is less efficient than the setProcessEnvironment()
function.
@@ -1605,7 +1605,7 @@ QStringList QProcess::environment() const
For example, the following code adds the \c{C:\\BIN} directory to the list of
executable paths (\c{PATHS}) on Windows and sets \c{TMPDIR}:
- \snippet doc/src/snippets/qprocess-environment/main.cpp 1
+ \snippet qprocess-environment/main.cpp 1
Note how, on Windows, environment variable names are case-insensitive.
@@ -1755,7 +1755,7 @@ void QProcess::setProcessState(ProcessState state)
\e execve()). Reimplement this function to do last minute initialization
of the child process. Example:
- \snippet doc/src/snippets/code/src_corelib_io_qprocess.cpp 4
+ \snippet code/src_corelib_io_qprocess.cpp 4
You cannot exit the process (by calling exit(), for instance) from
this function. If you need to stop the program before it starts
@@ -2002,12 +2002,12 @@ static QStringList parseCombinedArgString(const QString &program)
program name and its arguments. The arguments are separated by one or
more spaces. For example:
- \snippet doc/src/snippets/code/src_corelib_io_qprocess.cpp 5
+ \snippet code/src_corelib_io_qprocess.cpp 5
The \a program string can also contain quotes, to ensure that arguments
containing spaces are correctly supplied to the new process. For example:
- \snippet doc/src/snippets/code/src_corelib_io_qprocess.cpp 6
+ \snippet code/src_corelib_io_qprocess.cpp 6
If the QProcess object is already running a process, a warning may be
printed at the console, and the existing process will continue running.
@@ -2017,7 +2017,7 @@ static QStringList parseCombinedArgString(const QString &program)
way to ensure that \c{"My Documents"} is used as the argument to
the \c dir executable:
- \snippet doc/src/snippets/code/src_corelib_io_qprocess.cpp 7
+ \snippet code/src_corelib_io_qprocess.cpp 7
The OpenMode is set to \a mode.
*/
@@ -2218,10 +2218,10 @@ bool QProcess::startDetached(const QString &program)
}
QT_BEGIN_INCLUDE_NAMESPACE
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
# include <crt_externs.h>
# define environ (*_NSGetEnviron())
-#elif defined(Q_OS_WINCE) || (defined(Q_OS_MAC) && defined(QT_NO_CORESERVICES))
+#elif defined(Q_OS_WINCE) || defined(Q_OS_IOS)
static char *qt_empty_environ[] = { 0 };
#define environ qt_empty_environ
#elif !defined(Q_OS_WIN)
@@ -2235,7 +2235,7 @@ QT_END_INCLUDE_NAMESPACE
Returns the environment of the calling process as a list of
key=value pairs. Example:
- \snippet doc/src/snippets/code/src_corelib_io_qprocess.cpp 8
+ \snippet code/src_corelib_io_qprocess.cpp 8
This function does not cache the system environment. Therefore, it's
possible to obtain an updated version of the environment if low-level C
diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp
index bfa132f353..17dae7b6ca 100644
--- a/src/corelib/io/qprocess_unix.cpp
+++ b/src/corelib/io/qprocess_unix.cpp
@@ -117,13 +117,6 @@ QT_BEGIN_NAMESPACE
// so we will use 512
static const int errorBufferMax = 512;
-#ifdef Q_OS_INTEGRITY
-static inline char *strdup(const char *data)
-{
- return qstrdup(data);
-}
-#endif
-
static int qt_qprocess_deadChild_pipe[2];
static struct sigaction qt_sa_old_sigchld_handler;
static void qt_sa_sigchld_handler(int signum)
@@ -476,7 +469,7 @@ bool QProcessPrivate::createChannel(Channel &channel)
}
QT_BEGIN_INCLUDE_NAMESPACE
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
# include <crt_externs.h>
# define environ (*_NSGetEnviron())
#else
@@ -487,7 +480,7 @@ QT_END_INCLUDE_NAMESPACE
QProcessEnvironment QProcessEnvironment::systemEnvironment()
{
QProcessEnvironment env;
-#if !defined(Q_OS_MAC) || !defined(QT_NO_CORESERVICES)
+#if !defined(Q_OS_IOS)
const char *entry;
for (int count = 0; (entry = environ[count]); ++count) {
const char *equal = strchr(entry, '=');
diff --git a/src/corelib/io/qresource.cpp b/src/corelib/io/qresource.cpp
index 4a0211c00a..0937e1e795 100644
--- a/src/corelib/io/qresource.cpp
+++ b/src/corelib/io/qresource.cpp
@@ -584,7 +584,7 @@ QResource::addSearchPath(const QString &path)
Returns the current search path list. This list is consulted when
creating a relative resource.
- \sa QDir::addSearchPath() QDir::setSearchPaths()
+ \sa QDir::addSearchPath(), QDir::setSearchPaths()
*/
QStringList
diff --git a/src/corelib/io/qsettings.cpp b/src/corelib/io/qsettings.cpp
index 1ec0390235..33c1d4301d 100644
--- a/src/corelib/io/qsettings.cpp
+++ b/src/corelib/io/qsettings.cpp
@@ -775,8 +775,6 @@ void QSettingsPrivate::iniEscapedStringList(const QStringList &strs, QByteArray
with Qt 4.0. @Invalid() stands for QVariant(), and
QVariant().toStringList() returns an empty QStringList,
so we're in good shape.
-
- ### Qt 5: Use a nicer syntax, e.g. @List, for variant lists
*/
result += "@Invalid()";
} else {
@@ -2030,7 +2028,7 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
company is called MySoft, you would construct the QSettings
object as follows:
- \snippet doc/src/snippets/settings/settings.cpp 0
+ \snippet settings/settings.cpp 0
QSettings objects can be created either on the stack or on
the heap (i.e. using \c new). Constructing and destroying a
@@ -2042,11 +2040,11 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
QCoreApplication::setApplicationName(), and then use the default
QSettings constructor:
- \snippet doc/src/snippets/settings/settings.cpp 1
- \snippet doc/src/snippets/settings/settings.cpp 2
- \snippet doc/src/snippets/settings/settings.cpp 3
+ \snippet settings/settings.cpp 1
+ \snippet settings/settings.cpp 2
+ \snippet settings/settings.cpp 3
\dots
- \snippet doc/src/snippets/settings/settings.cpp 4
+ \snippet settings/settings.cpp 4
(Here, we also specify the organization's Internet domain. When
the Internet domain is set, it is used on Mac OS X instead of the
@@ -2060,7 +2058,7 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
that stores the data associated with the key. To write a setting,
use setValue(). For example:
- \snippet doc/src/snippets/settings/settings.cpp 5
+ \snippet settings/settings.cpp 5
If there already exists a setting with the same key, the existing
value is overwritten by the new value. For efficiency, the
@@ -2069,14 +2067,14 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
You can get a setting's value back using value():
- \snippet doc/src/snippets/settings/settings.cpp 6
+ \snippet settings/settings.cpp 6
If there is no setting with the specified name, QSettings
returns a null QVariant (which can be converted to the integer 0).
You can specify another default value by passing a second
argument to value():
- \snippet doc/src/snippets/settings/settings.cpp 7
+ \snippet settings/settings.cpp 7
To test whether a given key exists, call contains(). To remove
the setting associated with a key, call remove(). To obtain the
@@ -2093,13 +2091,13 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
Instead, you can use the QVariant::value() or the qVariantValue()
template function. For example:
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 0
+ \snippet code/src_corelib_io_qsettings.cpp 0
The inverse conversion (e.g., from QColor to QVariant) is
automatic for all data types supported by QVariant, including
GUI-related types:
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 1
+ \snippet code/src_corelib_io_qsettings.cpp 1
Custom types registered using qRegisterMetaType() and
qRegisterMetaTypeStreamOperators() can be stored using QSettings.
@@ -2129,18 +2127,18 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
You can form hierarchical keys using the '/' character as a
separator, similar to Unix file paths. For example:
- \snippet doc/src/snippets/settings/settings.cpp 8
- \snippet doc/src/snippets/settings/settings.cpp 9
- \snippet doc/src/snippets/settings/settings.cpp 10
+ \snippet settings/settings.cpp 8
+ \snippet settings/settings.cpp 9
+ \snippet settings/settings.cpp 10
If you want to save or restore many settings with the same
prefix, you can specify the prefix using beginGroup() and call
endGroup() at the end. Here's the same example again, but this
time using the group mechanism:
- \snippet doc/src/snippets/settings/settings.cpp 11
+ \snippet settings/settings.cpp 11
\codeline
- \snippet doc/src/snippets/settings/settings.cpp 12
+ \snippet settings/settings.cpp 12
If a group is set using beginGroup(), the behavior of most
functions changes consequently. Groups can be set recursively.
@@ -2180,8 +2178,8 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
Let's see with an example:
- \snippet doc/src/snippets/settings/settings.cpp 13
- \snippet doc/src/snippets/settings/settings.cpp 14
+ \snippet settings/settings.cpp 13
+ \snippet settings/settings.cpp 14
The table below summarizes which QSettings objects access
which location. "\b{X}" means that the location is the main
@@ -2207,7 +2205,7 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
argument to the QSettings constructor, followed by the scope, the
organization name, and the application name:
- \snippet doc/src/snippets/settings/settings.cpp 15
+ \snippet settings/settings.cpp 15
The \l{tools/settingseditor}{Settings Editor} example lets you
experiment with different settings location and with fallbacks
@@ -2219,9 +2217,9 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
application. The following example illustrates how to use QSettings
to save and restore the geometry of an application's main window.
- \snippet doc/src/snippets/settings/settings.cpp 16
+ \snippet settings/settings.cpp 16
\codeline
- \snippet doc/src/snippets/settings/settings.cpp 17
+ \snippet settings/settings.cpp 17
See \l{Window Geometry} for a discussion on why it is better to
call QWidget::resize() and QWidget::move() rather than QWidget::setGeometry()
@@ -2231,12 +2229,12 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
called from the main window's constructor and close event handler
as follows:
- \snippet doc/src/snippets/settings/settings.cpp 18
+ \snippet settings/settings.cpp 18
\dots
- \snippet doc/src/snippets/settings/settings.cpp 19
- \snippet doc/src/snippets/settings/settings.cpp 20
+ \snippet settings/settings.cpp 19
+ \snippet settings/settings.cpp 20
\codeline
- \snippet doc/src/snippets/settings/settings.cpp 21
+ \snippet settings/settings.cpp 21
See the \l{mainwindows/application}{Application} example for a
self-contained example that uses QSettings.
@@ -2343,7 +2341,7 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
takes a file name as first argument and pass QSettings::IniFormat
as second argument. For example:
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 2
+ \snippet code/src_corelib_io_qsettings.cpp 2
You can then use the QSettings object to read and write settings
in the file.
@@ -2351,7 +2349,7 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
On Mac OS X, you can access XML-based \c .plist files by passing
QSettings::NativeFormat as second argument. For example:
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 3
+ \snippet code/src_corelib_io_qsettings.cpp 3
\section2 Accessing the Windows Registry Directly
@@ -2362,13 +2360,13 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
For example:
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 4
+ \snippet code/src_corelib_io_qsettings.cpp 4
All the registry entries that appear under the specified path can
be read or written through the QSettings object as usual (using
forward slashes instead of backslashes). For example:
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 5
+ \snippet code/src_corelib_io_qsettings.cpp 5
Note that the backslash character is, as mentioned, used by
QSettings to separate subkeys. As a result, you cannot read or
@@ -2382,7 +2380,7 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
Its default value is accessed by using "Default" or "." in
place of a subkey:
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 6
+ \snippet code/src_corelib_io_qsettings.cpp 6
On other platforms than Windows, "Default" and "." would be
treated as regular subkeys.
@@ -2423,7 +2421,7 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
Another solution is to use preprocessor directives, for
example:
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 7
+ \snippet code/src_corelib_io_qsettings.cpp 7
\li On Unix and Mac OS X systems, the advisory file locking is disabled
if NFS (or AutoFS or CacheFS) is detected to work around a bug in the
@@ -2489,7 +2487,7 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
(e.g., QPoint, QRect, and QSize), Qt uses an \c{@}-based
syntax to encode the type. For example:
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 8
+ \snippet code/src_corelib_io_qsettings.cpp 8
To minimize compatibility issues, any \c @ that doesn't
appear at the first position in the value or that isn't
@@ -2500,7 +2498,7 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
Windows applications don't escape backslashes (\c{\}) in file
paths:
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 9
+ \snippet code/src_corelib_io_qsettings.cpp 9
QSettings always treats backslash as a special character and
provides no API for reading or writing such entries.
@@ -2549,7 +2547,7 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
organization, and with parent \a parent.
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 10
+ \snippet code/src_corelib_io_qsettings.cpp 10
The scope is set to QSettings::UserScope, and the format is
set to QSettings::NativeFormat (i.e. calling setDefaultFormat()
@@ -2661,11 +2659,11 @@ QSettings::QSettings(const QString &fileName, Format format, QObject *parent)
The code
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 11
+ \snippet code/src_corelib_io_qsettings.cpp 11
is equivalent to
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 12
+ \snippet code/src_corelib_io_qsettings.cpp 12
If QCoreApplication::setOrganizationName() and
QCoreApplication::setApplicationName() has not been previously
@@ -2928,7 +2926,7 @@ QSettings::Status QSettings::status() const
Groups are useful to avoid typing in the same setting paths over
and over. For example:
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 13
+ \snippet code/src_corelib_io_qsettings.cpp 13
This will set the value of three settings:
@@ -2955,7 +2953,7 @@ void QSettings::beginGroup(const QString &prefix)
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 14
+ \snippet code/src_corelib_io_qsettings.cpp 14
\sa beginGroup(), group()
*/
@@ -2993,7 +2991,7 @@ QString QSettings::group() const
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 15
+ \snippet code/src_corelib_io_qsettings.cpp 15
Use beginWriteArray() to write the array in the first place.
@@ -3016,7 +3014,7 @@ int QSettings::beginReadArray(const QString &prefix)
that you want to save a variable-length list of user names and
passwords. You could then write:
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 16
+ \snippet code/src_corelib_io_qsettings.cpp 16
The generated keys will have the form
@@ -3101,12 +3099,12 @@ void QSettings::setArrayIndex(int i)
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 17
+ \snippet code/src_corelib_io_qsettings.cpp 17
If a group is set using beginGroup(), only the keys in the group
are returned, without the group prefix:
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 18
+ \snippet code/src_corelib_io_qsettings.cpp 18
\sa childGroups(), childKeys()
*/
@@ -3122,12 +3120,12 @@ QStringList QSettings::allKeys() const
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 19
+ \snippet code/src_corelib_io_qsettings.cpp 19
If a group is set using beginGroup(), the top-level keys in that
group are returned, without the group prefix:
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 20
+ \snippet code/src_corelib_io_qsettings.cpp 20
You can navigate through the entire setting hierarchy using
childKeys() and childGroups() recursively.
@@ -3146,12 +3144,12 @@ QStringList QSettings::childKeys() const
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 21
+ \snippet code/src_corelib_io_qsettings.cpp 21
If a group is set using beginGroup(), the first-level keys in
that group are returned, without the group prefix.
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 22
+ \snippet code/src_corelib_io_qsettings.cpp 22
You can navigate through the entire setting hierarchy using
childKeys() and childGroups() recursively.
@@ -3194,7 +3192,7 @@ bool QSettings::isWritable() const
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 23
+ \snippet code/src_corelib_io_qsettings.cpp 23
\sa value(), remove(), contains()
*/
@@ -3211,7 +3209,7 @@ void QSettings::setValue(const QString &key, const QVariant &value)
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 24
+ \snippet code/src_corelib_io_qsettings.cpp 24
Be aware that if one of the fallback locations contains a setting
with the same key, that setting will be visible after calling
@@ -3220,7 +3218,7 @@ void QSettings::setValue(const QString &key, const QVariant &value)
If \a key is an empty string, all keys in the current group() are
removed. For example:
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 25
+ \snippet code/src_corelib_io_qsettings.cpp 25
Note that the Windows registry and INI files use case-insensitive
keys, whereas the Carbon Preferences API on Mac OS X uses
@@ -3326,7 +3324,7 @@ bool QSettings::event(QEvent *event)
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 26
+ \snippet code/src_corelib_io_qsettings.cpp 26
\sa setValue(), contains(), remove()
*/
@@ -3459,7 +3457,7 @@ void QSettings::setPath(Format format, Scope scope, const QString &path)
Typedef for a pointer to a function with the following signature:
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 27
+ \snippet code/src_corelib_io_qsettings.cpp 27
\c ReadFunc is used in \c registerFormat() as a pointer to a function
that reads a set of key/value pairs. \c ReadFunc should read all the
@@ -3474,7 +3472,7 @@ void QSettings::setPath(Format format, Scope scope, const QString &path)
Typedef for a pointer to a function with the following signature:
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 28
+ \snippet code/src_corelib_io_qsettings.cpp 28
\c WriteFunc is used in \c registerFormat() as a pointer to a function
that writes a set of key/value pairs. \c WriteFunc is only called once,
@@ -3510,7 +3508,7 @@ void QSettings::setPath(Format format, Scope scope, const QString &path)
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 29
+ \snippet code/src_corelib_io_qsettings.cpp 29
\sa setPath()
*/
diff --git a/src/corelib/io/qsettings_mac.cpp b/src/corelib/io/qsettings_mac.cpp
index c572fa7b72..ddb9ab581a 100644
--- a/src/corelib/io/qsettings_mac.cpp
+++ b/src/corelib/io/qsettings_mac.cpp
@@ -604,7 +604,7 @@ QSettingsPrivate *QSettingsPrivate::create(QSettings::Format format,
const QString &application)
{
#ifndef QT_BOOTSTRAPPED
- if (organization == QLatin1String("Trolltech"))
+ if (organization == QLatin1String("Qt"))
{
QString organizationDomain = QCoreApplication::organizationDomain();
QString applicationName = QCoreApplication::applicationName();
diff --git a/src/corelib/io/qstandardpaths.cpp b/src/corelib/io/qstandardpaths.cpp
index c6103b3f2f..700b80b062 100644
--- a/src/corelib/io/qstandardpaths.cpp
+++ b/src/corelib/io/qstandardpaths.cpp
@@ -94,7 +94,7 @@ QT_BEGIN_NAMESPACE
\value DownloadLocation Returns a directory for user's downloaded files.
- \sa writableLocation() standardLocations() displayName() locate() locateAll()
+ \sa writableLocation(), standardLocations(), displayName(), locate(), locateAll()
*/
/*!
diff --git a/src/corelib/io/qstandardpaths_json.cpp b/src/corelib/io/qstandardpaths_json.cpp
index c7cb858f0f..8542371848 100644
--- a/src/corelib/io/qstandardpaths_json.cpp
+++ b/src/corelib/io/qstandardpaths_json.cpp
@@ -193,7 +193,7 @@ QString QStandardPaths::writableLocation(StandardLocation type)
QString value = iter.value().toString();
// optimize for a common case
- value.replace(QLatin1String("${HOME}"), QFile::decodeName(qgetenv("HOME")));
+ value.replace(QLatin1String("${HOME}"), QDir::homePath());
// Do ${} format environment variable substitution if necessary
if (!value.isEmpty() && value.contains(QLatin1String("${"))) {
diff --git a/src/corelib/io/qtemporarydir.cpp b/src/corelib/io/qtemporarydir.cpp
index 579d569a01..86c7ed51aa 100644
--- a/src/corelib/io/qtemporarydir.cpp
+++ b/src/corelib/io/qtemporarydir.cpp
@@ -52,7 +52,7 @@
#endif
#include <stdlib.h> // mkdtemp
-#if defined(Q_OS_QNX) || defined(Q_OS_WIN)
+#if defined(Q_OS_QNX) || defined(Q_OS_WIN) || defined(Q_OS_LINUX_ANDROID)
#include <private/qfilesystemengine_p.h>
#endif
@@ -94,7 +94,7 @@ static QString defaultTemplateName()
return QDir::tempPath() + QLatin1Char('/') + baseName + QLatin1String("-XXXXXX");
}
-#if defined(Q_OS_QNX ) || defined(Q_OS_WIN)
+#if defined(Q_OS_QNX ) || defined(Q_OS_WIN) || defined(Q_OS_LINUX_ANDROID)
static char *mkdtemp(char *templateName)
{
static const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
@@ -171,7 +171,7 @@ void QTemporaryDirPrivate::create(const QString &templateName)
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qtemporarydir.cpp 0
+ \snippet code/src_corelib_io_qtemporarydir.cpp 0
It is very important to test that the temporary directory could be
created, using isValid(). Do not use exists(), since a default-constructed
diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp
index 75681dadff..cb8b5dbefc 100644
--- a/src/corelib/io/qtemporaryfile.cpp
+++ b/src/corelib/io/qtemporaryfile.cpp
@@ -466,7 +466,7 @@ static QString defaultTemplateName()
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qtemporaryfile.cpp 0
+ \snippet code/src_corelib_io_qtemporaryfile.cpp 0
Reopening a QTemporaryFile after calling close() is safe. For as long as
the QTemporaryFile object itself is not destroyed, the unique temporary
diff --git a/src/corelib/io/qtextstream.cpp b/src/corelib/io/qtextstream.cpp
index 0411b463b3..ae40f777d8 100644
--- a/src/corelib/io/qtextstream.cpp
+++ b/src/corelib/io/qtextstream.cpp
@@ -58,13 +58,13 @@ static const int QTEXTSTREAM_BUFFERSIZE = 16384;
generating text, QTextStream supports formatting options for field
padding and alignment, and formatting of numbers. Example:
- \snippet doc/src/snippets/code/src_corelib_io_qtextstream.cpp 0
+ \snippet code/src_corelib_io_qtextstream.cpp 0
It's also common to use QTextStream to read console input and write
console output. QTextStream is locale aware, and will automatically decode
standard input using the correct codec. Example:
- \snippet doc/src/snippets/code/src_corelib_io_qtextstream.cpp 1
+ \snippet code/src_corelib_io_qtextstream.cpp 1
Besides using QTextStream's constructors, you can also set the
device or string QTextStream operates on by calling setDevice() or
@@ -117,7 +117,7 @@ static const int QTEXTSTREAM_BUFFERSIZE = 16384;
the integer base, thereby disabling the automatic detection, by
calling setIntegerBase(). Example:
- \snippet doc/src/snippets/code/src_corelib_io_qtextstream.cpp 2
+ \snippet code/src_corelib_io_qtextstream.cpp 2
QTextStream supports many formatting options for generating text.
You can set the field width and pad character by calling
@@ -154,7 +154,7 @@ static const int QTEXTSTREAM_BUFFERSIZE = 16384;
\row \li \c left \li Same as setFieldAlignment(AlignLeft).
\row \li \c right \li Same as setFieldAlignment(AlignRight).
\row \li \c center \li Same as setFieldAlignment(AlignCenter).
- \row \li \c endl \li Same as operator<<('\n') and flush().
+ \row \li \c endl \li Same as operator<<('\\n') and flush().
\row \li \c flush \li Same as flush().
\row \li \c reset \li Same as reset().
\row \li \c ws \li Same as skipWhiteSpace().
@@ -1081,7 +1081,7 @@ QTextStream::QTextStream(QByteArray *array, QIODevice::OpenMode openMode)
This constructor is convenient for working on constant
strings. Example:
- \snippet doc/src/snippets/code/src_corelib_io_qtextstream.cpp 3
+ \snippet code/src_corelib_io_qtextstream.cpp 3
*/
QTextStream::QTextStream(const QByteArray &array, QIODevice::OpenMode openMode)
: d_ptr(new QTextStreamPrivate(this))
@@ -1111,7 +1111,7 @@ QTextStream::QTextStream(const QByteArray &array, QIODevice::OpenMode openMode)
This constructor is useful for working directly with the common
FILE based input and output streams: stdin, stdout and stderr. Example:
- \snippet doc/src/snippets/code/src_corelib_io_qtextstream.cpp 4
+ \snippet code/src_corelib_io_qtextstream.cpp 4
*/
QTextStream::QTextStream(FILE *fileHandle, QIODevice::OpenMode openMode)
@@ -1404,11 +1404,11 @@ QTextStream::FieldAlignment QTextStream::fieldAlignment() const
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qtextstream.cpp 5
+ \snippet code/src_corelib_io_qtextstream.cpp 5
The string \c s contains:
- \snippet doc/src/snippets/code/src_corelib_io_qtextstream.cpp 6
+ \snippet code/src_corelib_io_qtextstream.cpp 6
\sa padChar(), setFieldWidth()
*/
@@ -1601,7 +1601,7 @@ void QTextStream::resetStatus()
Subsequent calls to setStatus() are ignored until resetStatus()
is called.
- \sa Status status() resetStatus()
+ \sa Status, status(), resetStatus()
*/
void QTextStream::setStatus(Status status)
{
@@ -2023,7 +2023,7 @@ bool QTextStreamPrivate::getReal(double *f)
reference to the QTextStream, so several operators can be
nested. Example:
- \snippet doc/src/snippets/code/src_corelib_io_qtextstream.cpp 7
+ \snippet code/src_corelib_io_qtextstream.cpp 7
Whitespace is \e not skipped.
*/
@@ -2241,8 +2241,8 @@ QTextStream &QTextStream::operator>>(QByteArray &array)
/*!
\overload
- Stores the word in \a c, terminated by a '\0' character. If no word is
- available, only the '\0' character is stored.
+ Stores the word in \a c, terminated by a '\\0' character. If no word is
+ available, only the '\\0' character is stored.
Warning: Although convenient, this operator is dangerous and must
be used with care. QTextStream assumes that \a c points to a
@@ -2294,7 +2294,7 @@ void QTextStreamPrivate::putNumber(qulonglong number, bool negative)
if (locale != QLocale::c())
flags |= QLocalePrivate::ThousandsGroup;
- const QLocalePrivate *dd = locale.d();
+ const QLocalePrivate *dd = locale.d;
int base = integerBase ? integerBase : 10;
if (negative && base == 10) {
result = dd->longLongToString(-static_cast<qlonglong>(number), -1,
@@ -2503,7 +2503,7 @@ QTextStream &QTextStream::operator<<(double f)
if (numberFlags() & ForcePoint)
flags |= QLocalePrivate::Alternate;
- const QLocalePrivate *dd = d->locale.d();
+ const QLocalePrivate *dd = d->locale.d;
QString num = dd->doubleToString(f, d->realNumberPrecision, form, -1, flags);
d->putString(num, true);
return *this;
@@ -2561,11 +2561,11 @@ QTextStream &QTextStream::operator<<(const QByteArray &array)
string is assumed to be in ISO-8859-1 encoding. This operator
is convenient when working with constant string data. Example:
- \snippet doc/src/snippets/code/src_corelib_io_qtextstream.cpp 8
+ \snippet code/src_corelib_io_qtextstream.cpp 8
Warning: QTextStream assumes that \a string points to a string of
- text, terminated by a '\0' character. If there is no terminating
- '\0' character, your application may crash.
+ text, terminated by a '\\0' character. If there is no terminating
+ '\\0' character, your application may crash.
*/
QTextStream &QTextStream::operator<<(const char *string)
{
@@ -2865,13 +2865,13 @@ QTextStream &center(QTextStream &stream)
/*!
\relates QTextStream
- Writes '\n' to the \a stream and flushes the stream.
+ Writes '\\n' to the \a stream and flushes the stream.
Equivalent to
- \snippet doc/src/snippets/code/src_corelib_io_qtextstream.cpp 9
+ \snippet code/src_corelib_io_qtextstream.cpp 9
- Note: On Windows, all '\n' characters are written as '\r\n' if
+ Note: On Windows, all '\\n' characters are written as '\\r\\n' if
QTextStream's device or string is opened using the QIODevice::Text flag.
\sa flush(), reset(), {QTextStream manipulators}
@@ -2993,7 +2993,7 @@ void QTextStream::setCodec(QTextCodec *codec)
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qtextstream.cpp 10
+ \snippet code/src_corelib_io_qtextstream.cpp 10
\sa QTextCodec::codecForName(), setLocale()
*/
diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp
index fbc8d761c2..aed1be2ffb 100644
--- a/src/corelib/io/qurl.cpp
+++ b/src/corelib/io/qurl.cpp
@@ -64,7 +64,7 @@
unencoded representation is suitable for showing to users, but
the encoded representation is typically what you would send to
a web server. For example, the unencoded URL
- "http://b\uuml\c{}hler.example.com" would be sent to the server as
+ "http://b\\uuml\c{}hler.example.com" would be sent to the server as
"http://xn--bhler-kva.example.com/List%20of%20applicants.xml".
A URL can also be constructed piece by piece by calling
@@ -126,36 +126,51 @@
The parsing mode controls the way QUrl parses strings.
\value TolerantMode QUrl will try to correct some common errors in URLs.
- This mode is useful when processing URLs entered by
- users.
+ This mode is useful for parsing URLs coming from sources
+ not known to be strictly standards-conforming.
\value StrictMode Only valid URLs are accepted. This mode is useful for
general URL validation.
- In TolerantMode, the parser corrects the following invalid input:
+ In TolerantMode, the parser has the following behaviour:
\list
- \li Spaces and "%20": If an encoded URL contains a space, this will be
- replaced with "%20". If a decoded URL contains "%20", this will be
- replaced with a single space before the URL is parsed.
+ \li Spaces and "%20": unencoded space characters will be accepted and will
+ be treated as equivalent to "%20".
\li Single "%" characters: Any occurrences of a percent character "%" not
followed by exactly two hexadecimal characters (e.g., "13% coverage.html")
- will be replaced by "%25".
+ will be replaced by "%25". Note that one lone "%" character will trigger
+ the correction mode for all percent characters.
\li Reserved and unreserved characters: An encoded URL should only
contain a few characters as literals; all other characters should
be percent-encoded. In TolerantMode, these characters will be
automatically percent-encoded where they are not allowed:
- space / double-quote / "<" / ">" / "[" / "\" /
- "]" / "^" / "`" / "{" / "|" / "}"
+ space / double-quote / "<" / ">" / "\" /
+ "^" / "`" / "{" / "|" / "}"
+ Those same characters can be decoded again by passing QUrl::DecodeReserved
+ to toString() or toEncoded().
\endlist
+
+ When in StrictMode, if a parsing error is found, isValid() will return \c
+ false and errorString() will return a simple message describing the error.
+ If more than one error is detected, it is undefined which error gets
+ reported.
+
+ Note that TolerantMode is not usually enough for parsing user input, which
+ often contains more errors and expectations than the parser can deal with.
+ When dealing with data coming directly from the user -- as opposed to data
+ coming from data-transfer sources, such as other programs -- it is
+ recommended to use fromUserInput().
+
+ \sa fromUserInput(), setUrl(), toString(), toEncoded(), QUrl::FormattingOptions
*/
/*!
- \enum QUrl::FormattingOption
+ \enum QUrl::FormattingOptions
The formatting options define how the URL is formatted when written out
as text.
@@ -178,6 +193,62 @@
Note that the case folding rules in \l{RFC 3491}{Nameprep}, which QUrl
conforms to, require host names to always be converted to lower case,
regardless of the Qt::FormattingOptions used.
+
+ The options from QUrl::ComponentFormattingOptions are also possible.
+
+ \sa QUrl::ComponentFormattingOptions
+*/
+
+/*!
+ \enum QUrl::ComponentFormattingOptions
+ \since 5.0
+
+ The component formatting options define how the components of an URL will
+ be formatted when written out as text. They can be combined with the
+ options from QUrl::FormattingOptions when used in toString() and
+ toEncoded().
+
+ \value PrettyDecoded The component is returned in a "pretty form", with
+ most percent-encoded characters decoded. The exact
+ behavior of PrettyDecoded varies from component to
+ component and may also change from Qt release to Qt
+ release. This is the default.
+
+ \value EncodeSpaces Leave space characters in their encoded form ("%20").
+
+ \value EncodeUnicode Leave non-US-ASCII characters encoded in their UTF-8
+ percent-encoded form (e.g., "%C3%A9" for the U+00E9
+ codepoint, LATIN SMALL LETTER E WITH ACUTE).
+
+ \value EncodeDelimiters Leave certain delimiters in their encoded form, as
+ would appear in the URL when the full URL is
+ represented as text. The delimiters are affected
+ by this option change from component to component.
+
+ \value EncodeReserved Leave the US-ASCII reserved characters in their encoded
+ forms.
+
+ \value DecodeReseved Decode the US-ASCII reserved characters.
+
+ \value FullyEncoded Leave all characters in their properly-encoded form,
+ as this component would appear as part of a URL. When
+ used with toString(), this produces a fully-compliant
+ URL in QString form, exactly equal to the result of
+ toEncoded()
+
+ \value MostDecoded Attempt to decode as much as possible. For individual
+ components of the URL, this decodes every percent
+ encoding sequence, control characters (U+0000 to U+001F)
+ and non-US-ASCII sequences that aren't valid UTF-8
+ sequences.
+
+ The values of EncodeReserved and DecodeReserved should not be used together
+ in one call. The behaviour is undefined if that happens. They are provided
+ as separate values because the behaviour of the "pretty mode" with regards
+ to reserved characters is different on certain components and specially on
+ the full URL.
+
+ \sa QUrl::FormattingOptions
*/
#include "qurl.h"
@@ -208,6 +279,12 @@ static inline char toHex(quint8 c)
return c > 9 ? c - 10 + 'A' : c + '0';
}
+static inline quint8 fromHex(quint8 c)
+{
+ c |= 0x20;
+ return c >= 'a' ? c - 'a' + 10 : c - '0';
+}
+
static inline QString ftpScheme()
{
return QStringLiteral("ftp");
@@ -246,24 +323,6 @@ QUrlPrivate::QUrlPrivate(const QUrlPrivate &copy)
{
}
-void QUrlPrivate::clear()
-{
- scheme.clear();
- userName.clear();
- password.clear();
- host.clear();
- port = -1;
- path.clear();
- query.clear();
- fragment.clear();
-
- errorCode = NoError;
- errorSupplement = 0;
- sectionIsPresent = 0;
- sectionHasError = 0;
-}
-
-
// From RFC 3896, Appendix A Collected ABNF for URI
// URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
//[...]
@@ -1391,20 +1450,25 @@ const QByteArray &QUrlPrivate::normalized() const
/*!
- Constructs a URL by parsing \a url. \a url is assumed to be in human
- readable representation, with no percent encoding. QUrl will automatically
- percent encode all characters that are not allowed in a URL.
- The default parsing mode is TolerantMode.
-
- Parses the \a url using the parser mode \a parsingMode.
+ Constructs a URL by parsing \a url. QUrl will automatically percent encode
+ all characters that are not allowed in a URL and decode the percent-encoded
+ sequences that represent a character that is allowed in a URL.
+
+ Parses the \a url using the parser mode \a parsingMode. In TolerantMode
+ (the default), QUrl will correct certain mistakes, notably the presence of
+ a percent character ('%') not followed by two hexadecimal digits, and it
+ will accept any character in any position. In StrictMode, encoding mistakes
+ will not be tolerated and QUrl will also check that certain forbidden
+ characters are not present in unencoded form. If an error is detected in
+ StrictMode, isValid() will return false.
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qurl.cpp 0
+ \snippet code/src_corelib_io_qurl.cpp 0
To construct a URL from an encoded string, call fromEncoded():
- \snippet doc/src/snippets/code/src_corelib_io_qurl.cpp 1
+ \snippet code/src_corelib_io_qurl.cpp 1
\sa setUrl(), setEncodedUrl(), fromEncoded(), TolerantMode
*/
@@ -1445,7 +1509,7 @@ QUrl::~QUrl()
must conform to the standard encoding rules of the URI standard
for the URL to be reported as valid.
- \snippet doc/src/snippets/code/src_corelib_io_qurl.cpp 2
+ \snippet code/src_corelib_io_qurl.cpp 2
*/
bool QUrl::isValid() const
{
@@ -1475,12 +1539,18 @@ void QUrl::clear()
}
/*!
- Parses \a url using the parsing mode \a parsingMode.
-
- \a url is assumed to be in unicode format, with no percent
- encoding.
-
- Calling isValid() will tell whether or not a valid URL was constructed.
+ Parses \a url and sets this object to that value. QUrl will automatically
+ percent encode all characters that are not allowed in a URL and decode the
+ percent-encoded sequences that represent a character that is allowed in a
+ URL.
+
+ Parses the \a url using the parser mode \a parsingMode. In TolerantMode
+ (the default), QUrl will correct certain mistakes, notably the presence of
+ a percent character ('%') not followed by two hexadecimal digits, and it
+ will accept any character in any position. In StrictMode, encoding mistakes
+ will not be tolerated and QUrl will also check that certain forbidden
+ characters are not present in unencoded form. If an error is detected in
+ StrictMode, isValid() will return false.
\sa setEncodedUrl()
*/
@@ -1501,7 +1571,7 @@ void QUrl::setUrl(const QString &url, ParsingMode parsingMode)
and is followed by a ':'. The following example shows a URL where
the scheme is "ftp":
- \img qurl-authority2.png
+ \image qurl-authority2.png
The scheme can also be empty, in which case the URL is interpreted
as relative.
@@ -1548,7 +1618,7 @@ QString QUrl::scheme() const
The following example shows a valid authority string:
- \img qurl-authority.png
+ \image qurl-authority.png
*/
void QUrl::setAuthority(const QString &authority)
{
@@ -1585,7 +1655,7 @@ QString QUrl::authority(ComponentFormattingOptions options) const
separated by a ':'. If the password is empty, the colon must be
omitted. The following example shows a valid user info string:
- \img qurl-authority3.png
+ \image qurl-authority3.png
\sa userInfo(), setUserName(), setPassword(), setAuthority()
*/
@@ -1746,7 +1816,7 @@ void QUrl::setPort(int port)
Example:
- \snippet doc/src/snippets/code/src_corelib_io_qurl.cpp 3
+ \snippet code/src_corelib_io_qurl.cpp 3
*/
int QUrl::port(int defaultPort) const
{
@@ -1758,12 +1828,12 @@ int QUrl::port(int defaultPort) const
Sets the path of the URL to \a path. The path is the part of the
URL that comes after the authority but before the query string.
- \img qurl-ftppath.png
+ \image qurl-ftppath.png
For non-hierarchical schemes, the path will be everything
following the scheme declaration, as in the following example:
- \img qurl-mailtopath.png
+ \image qurl-mailtopath.png
\sa path()
*/
@@ -1862,7 +1932,7 @@ QString QUrl::query(ComponentFormattingOptions options) const
characters. It is typically used in HTTP for referring to a
certain link or point on a page:
- \img qurl-fragment.png
+ \image qurl-fragment.png
The fragment is sometimes also referred to as the URL "reference".
@@ -1938,7 +2008,7 @@ QString QUrl::topLevelDomain(ComponentFormattingOptions options) const
the base URL, but with the merged path, as in the following
example:
- \snippet doc/src/snippets/code/src_corelib_io_qurl.cpp 5
+ \snippet code/src_corelib_io_qurl.cpp 5
Calling resolved() with ".." returns a QUrl whose directory is
one level higher than the original. Similarly, calling resolved()
@@ -2012,14 +2082,16 @@ QUrl QUrl::resolved(const QUrl &relative) const
}
/*!
- Returns true if the URL is relative; otherwise returns false. A
- URL is relative if its scheme is undefined; this function is
- therefore equivalent to calling scheme().isEmpty().
+ Returns true if the URL is relative; otherwise returns false. A URL is
+ relative reference if its scheme is undefined; this function is therefore
+ equivalent to calling scheme().isEmpty().
+
+ Relative references are defined in RFC 3986 section 4.2.
*/
bool QUrl::isRelative() const
{
if (!d) return true;
- return !d->hasScheme() && !d->path.startsWith(QLatin1Char('/'));
+ return !d->hasScheme();
}
/*!
@@ -2173,7 +2245,7 @@ QString QUrl::fromPercentEncoding(const QByteArray &input)
Unreserved is defined as:
ALPHA / DIGIT / "-" / "." / "_" / "~"
- \snippet doc/src/snippets/code/src_corelib_io_qurl.cpp 6
+ \snippet code/src_corelib_io_qurl.cpp 6
*/
QByteArray QUrl::toPercentEncoding(const QString &input, const QByteArray &exclude, const QByteArray &include)
{
@@ -2429,6 +2501,9 @@ QUrl QUrl::fromLocalFile(const QString &localFile)
returned value in the form found on SMB networks (for example,
"//servername/path/to/file.txt").
+ Note: if the path component of this URL contains a non-UTF-8 binary
+ sequence (such as %80), the behaviour of this function is undefined.
+
\sa fromLocalFile(), isLocalFile()
*/
QString QUrl::toLocalFile() const
@@ -2438,19 +2513,35 @@ QString QUrl::toLocalFile() const
return QString();
QString tmp;
- QString ourPath = path();
+ QString ourPath = path(QUrl::MostDecoded);
// magic for shared drive on windows
if (!d->host.isEmpty()) {
- tmp = QStringLiteral("//") + d->host + (ourPath.length() > 0 && ourPath.at(0) != QLatin1Char('/')
+ tmp = QStringLiteral("//") + host() + (ourPath.length() > 0 && ourPath.at(0) != QLatin1Char('/')
? QLatin1Char('/') + ourPath : ourPath);
} else {
tmp = ourPath;
+#ifdef Q_OS_WIN
// magic for drives on windows
if (ourPath.length() > 2 && ourPath.at(0) == QLatin1Char('/') && ourPath.at(2) == QLatin1Char(':'))
tmp.remove(0, 1);
+#endif
}
+ // check if we need to do one more decoding pass
+ int pct = tmp.indexOf(QLatin1Char('%'));
+ while (pct != -1) {
+ Q_ASSERT(tmp.size() >= pct + 2);
+ ushort char1 = tmp.at(pct + 1).unicode();
+ ushort char2 = tmp.at(pct + 2).unicode();
+
+ Q_ASSERT(isHex(char1) && char1 < 0x80u);
+ Q_ASSERT(isHex(char2) && char2 < 0x80u);
+ tmp.replace(pct, 3, QChar(fromHex(char1) << 4 | fromHex(char2)));
+
+ // next iteration
+ pct = tmp.indexOf(QLatin1Char('%'), pct + 1);
+ }
return tmp;
}
diff --git a/src/corelib/io/qurl_p.h b/src/corelib/io/qurl_p.h
index 201ee66238..3a0d80d7ef 100644
--- a/src/corelib/io/qurl_p.h
+++ b/src/corelib/io/qurl_p.h
@@ -108,7 +108,6 @@ public:
QUrlPrivate(const QUrlPrivate &copy);
void parse(const QString &url, QUrl::ParsingMode parsingMode);
- void clear();
bool isEmpty() const
{ return sectionIsPresent == 0 && port == -1 && path.isEmpty(); }
diff --git a/src/corelib/itemmodels/qabstractitemmodel.cpp b/src/corelib/itemmodels/qabstractitemmodel.cpp
index 3d9af90682..dc53021432 100644
--- a/src/corelib/itemmodels/qabstractitemmodel.cpp
+++ b/src/corelib/itemmodels/qabstractitemmodel.cpp
@@ -339,7 +339,7 @@ qint64 QPersistentModelIndex::internalId() const
Returns the parent QModelIndex for this persistent index, or an invalid
QModelIndex if it has no parent.
- \sa child() sibling() model()
+ \sa child(), sibling(), model()
*/
QModelIndex QPersistentModelIndex::parent() const
{
@@ -352,7 +352,7 @@ QModelIndex QPersistentModelIndex::parent() const
Returns the sibling at \a row and \a column or an invalid QModelIndex if
there is no sibling at this position.
- \sa parent() child()
+ \sa parent(), child()
*/
QModelIndex QPersistentModelIndex::sibling(int row, int column) const
@@ -366,7 +366,7 @@ QModelIndex QPersistentModelIndex::sibling(int row, int column) const
Returns the child of the model index that is stored in the given \a row
and \a column.
- \sa parent() sibling()
+ \sa parent(), sibling()
*/
QModelIndex QPersistentModelIndex::child(int row, int column) const
@@ -906,7 +906,7 @@ void QAbstractItemModelPrivate::columnsRemoved(const QModelIndex &parent,
Creates a new empty model index. This type of model index is used to
indicate that the position in the model is invalid.
- \sa isValid() QAbstractItemModel
+ \sa isValid(), QAbstractItemModel
*/
/*!
@@ -1217,7 +1217,7 @@ void QAbstractItemModelPrivate::columnsRemoved(const QModelIndex &parent,
Returns true if the column is inserted; otherwise returns false.
- \sa insertColumns() insertRow() removeColumn()
+ \sa insertColumns(), insertRow(), removeColumn()
*/
/*!
@@ -1230,7 +1230,7 @@ void QAbstractItemModelPrivate::columnsRemoved(const QModelIndex &parent,
Returns true if the row is inserted; otherwise returns false.
- \sa insertRows() insertColumn() removeRow()
+ \sa insertRows(), insertColumn(), removeRow()
*/
/*!
@@ -1407,7 +1407,7 @@ QAbstractItemModel::~QAbstractItemModel()
For example:
- \snippet examples/itemviews/simpledommodel/dommodel.cpp 2
+ \snippet itemviews/simpledommodel/dommodel.cpp 2
\note When implementing a table based model, columnCount() should return 0
when the parent is valid.
@@ -1627,7 +1627,7 @@ bool QAbstractItemModel::hasIndex(int row, int column, const QModelIndex &parent
Use rowCount() on the parent to find out the number of children.
- \sa parent() index()
+ \sa parent(), index()
*/
bool QAbstractItemModel::hasChildren(const QModelIndex &parent) const
{
@@ -1696,7 +1696,7 @@ bool QAbstractItemModel::setData(const QModelIndex &index, const QVariant &value
Roles that are not in \a roles will not be modified.
- \sa setData() data() itemData()
+ \sa setData(), data(), itemData()
*/
bool QAbstractItemModel::setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles)
{
@@ -2195,6 +2195,7 @@ QSize QAbstractItemModel::span(const QModelIndex &) const
}
/*!
+ \fn void QAbstractItemModel::setRoleNames(const QHash<int,QByteArray> &theRoleNames)
\since 4.6
\obsolete
@@ -2445,7 +2446,7 @@ bool QAbstractItemModel::decodeData(int row, int column, const QModelIndex &pare
For example, as shown in the diagram, we insert three rows before
row 2, so \a first is 2 and \a last is 4:
- \snippet doc/src/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp 0
+ \snippet code/src_corelib_kernel_qabstractitemmodel.cpp 0
This inserts the three new rows as rows 2, 3, and 4.
\row
@@ -2456,7 +2457,7 @@ bool QAbstractItemModel::decodeData(int row, int column, const QModelIndex &pare
collection of 4 existing rows (ending in row 3), so \a first is 4
and \a last is 5:
- \snippet doc/src/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp 1
+ \snippet code/src_corelib_kernel_qabstractitemmodel.cpp 1
This appends the two new rows as rows 4 and 5.
\endtable
@@ -2511,7 +2512,7 @@ void QAbstractItemModel::endInsertRows()
For example, as shown in the diagram, we remove the two rows from
row 2 to row 3, so \a first is 2 and \a last is 3:
- \snippet doc/src/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp 2
+ \snippet code/src_corelib_kernel_qabstractitemmodel.cpp 2
\endtable
\note This function emits the rowsAboutToBeRemoved() signal which connected
@@ -2626,7 +2627,7 @@ bool QAbstractItemModelPrivate::allowMove(const QModelIndex &srcParent, int star
row 2 to 4 in the source, so \a sourceFirst is 2 and \a sourceLast is 4.
We move those items to above row 2 in the destination, so \a destinationChild is 2.
- \snippet doc/src/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp 6
+ \snippet code/src_corelib_kernel_qabstractitemmodel.cpp 6
This moves the three rows rows 2, 3, and 4 in the source to become 2, 3 and 4 in
the destination. Other affected siblings are displaced accordingly.
@@ -2637,7 +2638,7 @@ bool QAbstractItemModelPrivate::allowMove(const QModelIndex &srcParent, int star
For example, as shown in the diagram, we move three rows to a
collection of 6 existing rows (ending in row 5), so \a destinationChild is 6:
- \snippet doc/src/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp 7
+ \snippet code/src_corelib_kernel_qabstractitemmodel.cpp 7
This moves the target rows to the end of the target parent as 6, 7 and 8.
\row
@@ -2647,7 +2648,7 @@ bool QAbstractItemModelPrivate::allowMove(const QModelIndex &srcParent, int star
For example, as shown in the diagram, we move one item from row 2 to row 0,
so \a sourceFirst and \a sourceLast are 2 and \a destinationChild is 0.
- \snippet doc/src/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp 8
+ \snippet code/src_corelib_kernel_qabstractitemmodel.cpp 8
Note that other rows may be displaced accordingly. Note also that when moving
items within the same parent you should not attempt invalid or no-op moves. In
@@ -2662,7 +2663,7 @@ bool QAbstractItemModelPrivate::allowMove(const QModelIndex &srcParent, int star
For example, as shown in the diagram, we move one item from row 2 to row 4,
so \a sourceFirst and \a sourceLast are 2 and \a destinationChild is 4.
- \snippet doc/src/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp 9
+ \snippet code/src_corelib_kernel_qabstractitemmodel.cpp 9
Note that other rows may be displaced accordingly.
\endtable
@@ -2745,7 +2746,7 @@ void QAbstractItemModel::endMoveRows()
For example, as shown in the diagram, we insert three columns
before column 4, so \a first is 4 and \a last is 6:
- \snippet doc/src/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp 3
+ \snippet code/src_corelib_kernel_qabstractitemmodel.cpp 3
This inserts the three new columns as columns 4, 5, and 6.
\row
@@ -2756,7 +2757,7 @@ void QAbstractItemModel::endMoveRows()
collection of six existing columns (ending in column 5), so
\a first is 6 and \a last is 8:
- \snippet doc/src/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp 4
+ \snippet code/src_corelib_kernel_qabstractitemmodel.cpp 4
This appends the two new columns as columns 6, 7, and 8.
\endtable
@@ -2813,7 +2814,7 @@ void QAbstractItemModel::endInsertColumns()
For example, as shown in the diagram, we remove the three columns
from column 4 to column 6, so \a first is 4 and \a last is 6:
- \snippet doc/src/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp 5
+ \snippet code/src_corelib_kernel_qabstractitemmodel.cpp 5
\endtable
\note This function emits the columnsAboutToBeRemoved() signal which
@@ -2945,6 +2946,7 @@ void QAbstractItemModel::endMoveColumns()
}
/*!
+ \fn void QAbstractItemModel::reset()
\obsolete
Resets the model to its original state in any attached views.
@@ -2958,11 +2960,11 @@ void QAbstractItemModel::endMoveColumns()
For example, in this code both signals modelAboutToBeReset() and modelReset()
are emitted \e after the data changes:
- \snippet doc/src/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp 10
+ \snippet code/src_corelib_kernel_qabstractitemmodel.cpp 10
Instead you should use:
- \snippet doc/src/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp 11
+ \snippet code/src_corelib_kernel_qabstractitemmodel.cpp 11
*/
/*!
@@ -3208,7 +3210,7 @@ QModelIndex QAbstractTableModel::index(int row, int column, const QModelIndex &p
Returns the parent of the model item with the given \a index.
- \sa index() hasChildren()
+ \sa index(), hasChildren()
*/
QModelIndex QAbstractTableModel::parent(const QModelIndex &) const
@@ -3334,7 +3336,7 @@ QModelIndex QAbstractListModel::index(int row, int column, const QModelIndex &pa
/*!
Returns the parent of the model item with the given \a index.
- \sa index() hasChildren()
+ \sa index(), hasChildren()
*/
QModelIndex QAbstractListModel::parent(const QModelIndex & /* index */) const
diff --git a/src/corelib/itemmodels/qidentityproxymodel.cpp b/src/corelib/itemmodels/qidentityproxymodel.cpp
index 9cac40469a..c7a5200933 100644
--- a/src/corelib/itemmodels/qidentityproxymodel.cpp
+++ b/src/corelib/itemmodels/qidentityproxymodel.cpp
@@ -102,7 +102,7 @@ class QIdentityProxyModelPrivate : public QAbstractProxyModelPrivate
This also provides a way to change the data in the case where a source model is supplied by a third party which can not be modified.
- \snippet doc/src/snippets/code/src_gui_itemviews_qidentityproxymodel.cpp 0
+ \snippet code/src_gui_itemviews_qidentityproxymodel.cpp 0
\sa QAbstractProxyModel, {Model/View Programming}, QAbstractItemModel
diff --git a/src/corelib/itemmodels/qitemselectionmodel.cpp b/src/corelib/itemmodels/qitemselectionmodel.cpp
index fa34acdd18..9cc9502577 100644
--- a/src/corelib/itemmodels/qitemselectionmodel.cpp
+++ b/src/corelib/itemmodels/qitemselectionmodel.cpp
@@ -347,13 +347,13 @@ QModelIndexList QItemSelectionRange::indexes() const
a selection that contains a range of items from the given \c model,
beginning at the \c topLeft, and ending at the \c bottomRight.
- \snippet doc/src/snippets/code/src_gui_itemviews_qitemselectionmodel.cpp 0
+ \snippet code/src_gui_itemviews_qitemselectionmodel.cpp 0
An empty item selection can be constructed, and later populated as
required. So, if the model is going to be unavailable when we construct
the item selection, we can rewrite the above code in the following way:
- \snippet doc/src/snippets/code/src_gui_itemviews_qitemselectionmodel.cpp 1
+ \snippet code/src_gui_itemviews_qitemselectionmodel.cpp 1
QItemSelection saves memory, and avoids unnecessary work, by working with
selection ranges rather than recording the model item index for each
@@ -1005,7 +1005,7 @@ void QItemSelectionModel::select(const QModelIndex &index, QItemSelectionModel::
Note that this signal will not be emitted when the item model is reset.
- \sa currentIndex() setCurrentIndex() selectionChanged()
+ \sa currentIndex(), setCurrentIndex(), selectionChanged()
*/
/*!
@@ -1016,7 +1016,7 @@ void QItemSelectionModel::select(const QModelIndex &index, QItemSelectionModel::
Note that this signal will not be emitted when the item model is reset.
- \sa currentChanged() currentRowChanged() currentIndex() setCurrentIndex()
+ \sa currentChanged(), currentRowChanged(), currentIndex(), setCurrentIndex()
*/
/*!
@@ -1027,7 +1027,7 @@ void QItemSelectionModel::select(const QModelIndex &index, QItemSelectionModel::
Note that this signal will not be emitted when the item model is reset.
- \sa currentChanged() currentColumnChanged() currentIndex() setCurrentIndex()
+ \sa currentChanged(), currentColumnChanged(), currentIndex(), setCurrentIndex()
*/
/*!
@@ -1040,7 +1040,7 @@ void QItemSelectionModel::select(const QModelIndex &index, QItemSelectionModel::
Note the that the current index changes independently from the selection.
Also note that this signal will not be emitted when the item model is reset.
- \sa select() currentChanged()
+ \sa select(), currentChanged()
*/
/*!
diff --git a/src/corelib/itemmodels/qsortfilterproxymodel.cpp b/src/corelib/itemmodels/qsortfilterproxymodel.cpp
index ae9affb862..68e5e89db3 100644
--- a/src/corelib/itemmodels/qsortfilterproxymodel.cpp
+++ b/src/corelib/itemmodels/qsortfilterproxymodel.cpp
@@ -1511,14 +1511,14 @@ void QSortFilterProxyModelPrivate::_q_sourceColumnsMoved(
model. The code to set up the model and the view, \e without sorting and
filtering, would look like this:
- \snippet doc/src/snippets/qsortfilterproxymodel-details/main.cpp 1
+ \snippet qsortfilterproxymodel-details/main.cpp 1
To add sorting and filtering support to \c MyItemModel, we need to create
a QSortFilterProxyModel, call setSourceModel() with the \c MyItemModel as
argument, and install the QSortFilterProxyModel on the view:
- \snippet doc/src/snippets/qsortfilterproxymodel-details/main.cpp 0
- \snippet doc/src/snippets/qsortfilterproxymodel-details/main.cpp 2
+ \snippet qsortfilterproxymodel-details/main.cpp 0
+ \snippet qsortfilterproxymodel-details/main.cpp 2
At this point, neither sorting nor filtering is enabled; the original data
is displayed in the view. Any changes made through the
@@ -1546,7 +1546,7 @@ void QSortFilterProxyModelPrivate::_q_sourceColumnsMoved(
whether the user can sort the view by clicking the view's horizontal
header. For example:
- \snippet doc/src/snippets/qsortfilterproxymodel-details/main.cpp 3
+ \snippet qsortfilterproxymodel-details/main.cpp 3
When this feature is on (the default is off), clicking on a header section
sorts the items according to that column. By clicking repeatedly, the user
@@ -1569,7 +1569,7 @@ void QSortFilterProxyModelPrivate::_q_sourceColumnsMoved(
QSortFilterProxyModel and reimplementing lessThan(), which is
used to compare items. For example:
- \snippet examples/itemviews/customsortfiltermodel/mysortfilterproxymodel.cpp 5
+ \snippet itemviews/customsortfiltermodel/mysortfilterproxymodel.cpp 5
(This code snippet comes from the
\l{itemviews/customsortfiltermodel}{Custom Sort/Filter Model}
@@ -1581,7 +1581,7 @@ void QSortFilterProxyModelPrivate::_q_sourceColumnsMoved(
QSortFilterProxyModel (or on the original model if it implements sort()).
For example:
- \snippet doc/src/snippets/qsortfilterproxymodel-details/main.cpp 4
+ \snippet qsortfilterproxymodel-details/main.cpp 4
QSortFilterProxyModel can be sorted by column -1, in which case it returns
to the sort order of the underlying source model.
@@ -1594,7 +1594,7 @@ void QSortFilterProxyModelPrivate::_q_sourceColumnsMoved(
each item, for a given column. The QRegExp object can be used to match a
regular expression, a wildcard pattern, or a fixed string. For example:
- \snippet doc/src/snippets/qsortfilterproxymodel-details/main.cpp 5
+ \snippet qsortfilterproxymodel-details/main.cpp 5
For hierarchical models, the filter is applied recursively to all children.
If a parent item doesn't match the filter, none of its children will be
@@ -1612,7 +1612,7 @@ void QSortFilterProxyModelPrivate::_q_sourceColumnsMoved(
the \l{QSortFilterProxyModel::filterKeyColumn}{filterKeyColumn} property
and performs filtering on columns 0, 1, and 2:
- \snippet examples/itemviews/customsortfiltermodel/mysortfilterproxymodel.cpp 3
+ \snippet itemviews/customsortfiltermodel/mysortfilterproxymodel.cpp 3
(This code snippet comes from the
\l{itemviews/customsortfiltermodel}{Custom Sort/Filter Model}
diff --git a/src/corelib/itemmodels/qstringlistmodel.cpp b/src/corelib/itemmodels/qstringlistmodel.cpp
index b13e825c05..e7f219f471 100644
--- a/src/corelib/itemmodels/qstringlistmodel.cpp
+++ b/src/corelib/itemmodels/qstringlistmodel.cpp
@@ -83,7 +83,7 @@ QT_BEGIN_NAMESPACE
An example usage of QStringListModel:
- \snippet doc/src/snippets/qstringlistmodel/main.cpp 0
+ \snippet qstringlistmodel/main.cpp 0
\sa QAbstractListModel, QAbstractItemModel, {Model Classes}
*/
diff --git a/src/corelib/json/qjsonarray.cpp b/src/corelib/json/qjsonarray.cpp
index 0884f10354..e1ed53a840 100644
--- a/src/corelib/json/qjsonarray.cpp
+++ b/src/corelib/json/qjsonarray.cpp
@@ -500,13 +500,13 @@ bool QJsonArray::operator!=(const QJsonArray &other) const
\sa constBegin(), end()
*/
-/*! \fn void QJsonArray::push_back(const T &value)
+/*! \fn void QJsonArray::push_back(const QJsonValue &value)
This function is provided for STL compatibility. It is equivalent
to \l{QJsonArray::append()}{append(\a value)}.
*/
-/*! \fn void QJsonArray::push_front(const T &value)
+/*! \fn void QJsonArray::push_front(const QJsonValue &value)
This function is provided for STL compatibility. It is equivalent
to \l{QJsonArray::prepend()}{prepend(\a value)}.
@@ -589,12 +589,7 @@ bool QJsonArray::operator!=(const QJsonArray &other) const
on an uninitialized iterator. Use operator=() to assign a value
to it before using it.
- \sa QJsonArray::begin() QJsonArray::end()
-*/
-
-/*! \fn QJsonArray::iterator::iterator(const iterator &other)
-
- Constructs a copy of \a other.
+ \sa QJsonArray::begin(), QJsonArray::end()
*/
/*! \fn QJsonValueRef QJsonArray::iterator::operator*() const
@@ -791,7 +786,7 @@ bool QJsonArray::operator!=(const QJsonArray &other) const
on an uninitialized iterator. Use operator=() to assign a value
to it before using it.
- \sa QJsonArray::constBegin() QJsonArray::constEnd()
+ \sa QJsonArray::constBegin(), QJsonArray::constEnd()
*/
/*! \typedef QJsonArray::const_iterator::iterator_category
diff --git a/src/corelib/json/qjsondocument.cpp b/src/corelib/json/qjsondocument.cpp
index be241bc3fc..ae59847dc6 100644
--- a/src/corelib/json/qjsondocument.cpp
+++ b/src/corelib/json/qjsondocument.cpp
@@ -176,7 +176,7 @@ QJsonDocument &QJsonDocument::operator =(const QJsonDocument &other)
Returns a QJsonDocument representing the data.
- \sa rawData fromBinaryData isNull DataValidation
+ \sa rawData, fromBinaryData, isNull, DataValidation
*/
QJsonDocument QJsonDocument::fromRawData(const char *data, int size, DataValidation validation)
{
@@ -220,7 +220,7 @@ const char *QJsonDocument::rawData(int *size) const
By default the data is validated. If the \a data is not valid, the method returns
a null document.
- \sa toBinaryData fromRawData isNull DataValidation
+ \sa toBinaryData, fromRawData, isNull, DataValidation
*/
QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, DataValidation validation)
{
@@ -361,7 +361,7 @@ QByteArray QJsonDocument::toBinaryData() const
/*!
Returns true if the document contains an array.
- \sa array() isObject()
+ \sa array(), isObject()
*/
bool QJsonDocument::isArray() const
{
@@ -375,7 +375,7 @@ bool QJsonDocument::isArray() const
/*!
Returns true if the document contains an object.
- \sa object() isArray()
+ \sa object(), isArray()
*/
bool QJsonDocument::isObject() const
{
@@ -392,7 +392,7 @@ bool QJsonDocument::isObject() const
Returns an empty object if the document contains an
array.
- \sa isObject array setObject
+ \sa isObject, array, setObject
*/
QJsonObject QJsonDocument::object() const
{
@@ -410,7 +410,7 @@ QJsonObject QJsonDocument::object() const
Returns an empty array if the document contains an
object.
- \sa isArray object setArray
+ \sa isArray, object, setArray
*/
QJsonArray QJsonDocument::array() const
{
@@ -425,7 +425,7 @@ QJsonArray QJsonDocument::array() const
/*!
Sets \a object as the main object of this document.
- \sa setArray object
+ \sa setArray, object
*/
void QJsonDocument::setObject(const QJsonObject &object)
{
@@ -452,7 +452,7 @@ void QJsonDocument::setObject(const QJsonObject &object)
/*!
Sets \a array as the main object of this document.
- \sa setObject array
+ \sa setObject, array
*/
void QJsonDocument::setArray(const QJsonArray &array)
{
diff --git a/src/corelib/json/qjsonobject.cpp b/src/corelib/json/qjsonobject.cpp
index e880078195..5439855b90 100644
--- a/src/corelib/json/qjsonobject.cpp
+++ b/src/corelib/json/qjsonobject.cpp
@@ -74,7 +74,7 @@ QT_BEGIN_NAMESPACE
/*!
Constructs an empty JSON object
- \sa isEmpty
+ \sa isEmpty()
*/
QJsonObject::QJsonObject()
: d(0), o(0)
@@ -139,7 +139,7 @@ QJsonObject &QJsonObject::operator =(const QJsonObject &other)
The keys in \a map will be used as the keys in the JSON object,
and the QVariant values will be converted to JSON values.
- \sa toVariantMap, QJsonValue::fromVariant
+ \sa toVariantMap(), QJsonValue::fromVariant()
*/
QJsonObject QJsonObject::fromVariantMap(const QVariantMap &map)
{
@@ -200,7 +200,7 @@ int QJsonObject::size() const
/*!
Returns \c true if the object is empty. This is the same as size() == 0.
- \sa size
+ \sa size()
*/
bool QJsonObject::isEmpty() const
{
@@ -215,7 +215,7 @@ bool QJsonObject::isEmpty() const
The returned QJsonValue is \c Undefined, if the key does not exist.
- \sa setValue, QJsonValue, QJsonValue::isUndefined
+ \sa QJsonValue, QJsonValue::isUndefined()
*/
QJsonValue QJsonObject::value(const QString &key) const
{
@@ -236,7 +236,7 @@ QJsonValue QJsonObject::value(const QString &key) const
The returned QJsonValue is \c Undefined, if the key does not exist.
- \sa value, setValue, QJsonValue, QJsonValue::isUndefined
+ \sa value(), QJsonValue, QJsonValue::isUndefined()
*/
QJsonValue QJsonObject::operator [](const QString &key) const
{
@@ -252,7 +252,7 @@ QJsonValue QJsonObject::operator [](const QString &key) const
the assignment will apply to the character in the QJsonArray of QJsonObject
from which you got the reference.
- \sa setValue, value
+ \sa value()
*/
QJsonValueRef QJsonObject::operator [](const QString &key)
{
@@ -277,7 +277,7 @@ QJsonValueRef QJsonObject::operator [](const QString &key)
If the value is QJsonValue::Undefined, it will cause the key to get removed
from the object. The returned iterator will then point to end()
- \sa remove, take, QJsonObject::iterator, end
+ \sa remove(), take(), QJsonObject::iterator, end()
*/
QJsonObject::iterator QJsonObject::insert(const QString &key, const QJsonValue &value)
{
@@ -320,7 +320,7 @@ QJsonObject::iterator QJsonObject::insert(const QString &key, const QJsonValue &
/*!
Removes \a key from the object.
- \sa insert, take
+ \sa insert(), take()
*/
void QJsonObject::remove(const QString &key)
{
@@ -346,7 +346,7 @@ void QJsonObject::remove(const QString &key)
If \a key was not contained in the object, the returned QJsonValue
is Undefined.
- \sa insert, remove, QJsonValue
+ \sa insert(), remove(), QJsonValue
*/
QJsonValue QJsonObject::take(const QString &key)
{
@@ -370,7 +370,7 @@ QJsonValue QJsonObject::take(const QString &key)
/*!
Returns \c true if the object contains key \a key.
- \sa insert, remove, take
+ \sa insert(), remove(), take()
*/
bool QJsonObject::contains(const QString &key) const
{
@@ -455,7 +455,7 @@ QJsonObject::iterator QJsonObject::find(const QString &key)
return iterator(this, index);
}
-/*! \fn QJsonObject::const_iterator QJsonObject::find(const Key &key) const
+/*! \fn QJsonObject::const_iterator QJsonObject::find(const QString &key) const
\overload
*/
@@ -541,6 +541,10 @@ QJsonObject::const_iterator QJsonObject::constFind(const QString &key) const
*/
/*! \class QJsonObject::iterator
+ \ingroup json
+ \reentrant
+ \since 5.0
+
\brief The QJsonObject::iterator class provides an STL-style non-const iterator for QJsonObject.
QJsonObject::iterator allows you to iterate over a QJsonObject
@@ -591,7 +595,7 @@ QJsonObject::const_iterator QJsonObject::constFind(const QString &key) const
called on an uninitialized iterator. Use operator=() to assign a
value to it before using it.
- \sa QJsonObject::begin() QJsonObject::end()
+ \sa QJsonObject::begin(), QJsonObject::end()
*/
/*! \fn QString QJsonObject::iterator::key() const
@@ -729,7 +733,8 @@ QJsonObject::const_iterator QJsonObject::constFind(const QString &key) const
\sa operator+=(), operator-()
*/
-/*! \class QJsonObject::const_iterator
+/*!
+ \class QJsonObject::const_iterator
\brief The QJsonObject::const_iterator class provides an STL-style const iterator for QJsonObject.
QJsonObject::const_iterator allows you to iterate over a QJsonObject.
@@ -780,7 +785,7 @@ QJsonObject::const_iterator QJsonObject::constFind(const QString &key) const
called on an uninitialized iterator. Use operator=() to assign a
value to it before using it.
- \sa QJsonObject::constBegin() QJsonObject::constEnd()
+ \sa QJsonObject::constBegin(), QJsonObject::constEnd()
*/
/*! \fn QJsonObject::const_iterator::const_iterator(const iterator &other)
@@ -987,17 +992,6 @@ void QJsonObject::setValueAt(int i, const QJsonValue &val)
Qt-style synonym for QJsonObject::const_iterator.
*/
-
-/*! \class QJsonObject::iterator
- \ingroup json
- \reentrant
- \since 5.0
-
- \brief The QJsonDocument::iterator class provides a way to iterate over q QJsonObject
-
-
- */
-
#ifndef QT_NO_DEBUG_STREAM
QDebug operator<<(QDebug dbg, const QJsonObject &o)
{
diff --git a/src/corelib/kernel/kernel.pri b/src/corelib/kernel/kernel.pri
index 4b81087e2f..b645d480d7 100644
--- a/src/corelib/kernel/kernel.pri
+++ b/src/corelib/kernel/kernel.pri
@@ -14,6 +14,7 @@ HEADERS += \
kernel/qobject.h \
kernel/qobject_impl.h \
kernel/qobjectdefs.h \
+ kernel/qobjectdefs_impl.h \
kernel/qsignalmapper.h \
kernel/qsocketnotifier.h \
kernel/qtimer.h \
@@ -136,3 +137,10 @@ vxworks {
kernel/qfunctions_vxworks.h
}
+blackberry {
+ SOURCES += \
+ kernel/qeventdispatcher_blackberry.cpp
+ HEADERS += \
+ kernel/qeventdispatcher_blackberry_p.h
+}
+
diff --git a/src/corelib/kernel/qabstracteventdispatcher.cpp b/src/corelib/kernel/qabstracteventdispatcher.cpp
index cf9b0cea4f..2ef98dba0f 100644
--- a/src/corelib/kernel/qabstracteventdispatcher.cpp
+++ b/src/corelib/kernel/qabstracteventdispatcher.cpp
@@ -374,7 +374,7 @@ void QAbstractEventDispatcher::closingDown()
Typedef for a function with the signature
- \snippet doc/src/snippets/code/src_corelib_kernel_qabstracteventdispatcher.cpp 0
+ \snippet code/src_corelib_kernel_qabstracteventdispatcher.cpp 0
Note that the type of the \a message is platform dependent. The
following table shows the \a {message}'s type on Windows, Mac, and
@@ -460,7 +460,7 @@ bool QAbstractEventDispatcher::filterEvent(void *message)
This signal is emitted after the event loop returns from a
function that could block.
- \sa wakeUp() aboutToBlock()
+ \sa wakeUp(), aboutToBlock()
*/
/*! \fn void QAbstractEventDispatcher::aboutToBlock()
diff --git a/src/corelib/kernel/qbasictimer.cpp b/src/corelib/kernel/qbasictimer.cpp
index 621223eb88..76db945c45 100644
--- a/src/corelib/kernel/qbasictimer.cpp
+++ b/src/corelib/kernel/qbasictimer.cpp
@@ -92,7 +92,7 @@ QT_BEGIN_NAMESPACE
Returns true if the timer is running and has not been stopped; otherwise
returns false.
- \sa start() stop()
+ \sa start(), stop()
*/
/*!
@@ -112,7 +112,7 @@ QT_BEGIN_NAMESPACE
The given \a object will receive timer events.
- \sa stop() isActive() QObject::timerEvent() Qt::CoarseTimer
+ \sa stop(), isActive(), QObject::timerEvent(), Qt::CoarseTimer
*/
void QBasicTimer::start(int msec, QObject *obj)
{
@@ -139,7 +139,7 @@ void QBasicTimer::start(int msec, QObject *obj)
The given \a object will receive timer events.
- \sa stop() isActive() QObject::timerEvent() Qt::TimerType
+ \sa stop(), isActive(), QObject::timerEvent(), Qt::TimerType
*/
void QBasicTimer::start(int msec, Qt::TimerType timerType, QObject *obj)
{
@@ -160,7 +160,7 @@ void QBasicTimer::start(int msec, Qt::TimerType timerType, QObject *obj)
/*!
Stops the timer.
- \sa start() isActive()
+ \sa start(), isActive()
*/
void QBasicTimer::stop()
{
diff --git a/src/corelib/kernel/qcore_mac_p.h b/src/corelib/kernel/qcore_mac_p.h
index 048d746183..3fc1b7f801 100644
--- a/src/corelib/kernel/qcore_mac_p.h
+++ b/src/corelib/kernel/qcore_mac_p.h
@@ -63,7 +63,7 @@
#include <CoreFoundation/CoreFoundation.h>
#endif
-#ifndef QT_NO_CORESERVICES
+#ifndef Q_OS_IOS
#include <CoreServices/CoreServices.h>
#endif
diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp
index 56674bc08e..5d70c4c5d8 100644
--- a/src/corelib/kernel/qcoreapplication.cpp
+++ b/src/corelib/kernel/qcoreapplication.cpp
@@ -67,10 +67,14 @@
#include <private/qlocale_p.h>
#if defined(Q_OS_UNIX)
-# if !defined(QT_NO_GLIB)
-# include "qeventdispatcher_glib_p.h"
+# if defined(Q_OS_BLACKBERRY)
+# include "qeventdispatcher_blackberry_p.h"
+# else
+# if !defined(QT_NO_GLIB)
+# include "qeventdispatcher_glib_p.h"
+# endif
+# include "qeventdispatcher_unix_p.h"
# endif
-# include "qeventdispatcher_unix_p.h"
#endif
#ifdef Q_OS_WIN
@@ -328,12 +332,16 @@ void QCoreApplicationPrivate::createEventDispatcher()
{
Q_Q(QCoreApplication);
#if defined(Q_OS_UNIX)
+# if defined(Q_OS_BLACKBERRY)
+ eventDispatcher = new QEventDispatcherBlackberry(q);
+# else
# if !defined(QT_NO_GLIB)
if (qgetenv("QT_NO_GLIB").isEmpty() && QEventDispatcherGlib::versionSupported())
eventDispatcher = new QEventDispatcherGlib(q);
else
# endif
eventDispatcher = new QEventDispatcherUNIX(q);
+# endif
#elif defined(Q_OS_WIN)
eventDispatcher = new QEventDispatcherWin32(q);
#else
@@ -1000,7 +1008,7 @@ void QCoreApplication::exit(int returnCode)
The event is \e not deleted when the event has been sent. The normal
approach is to create the event on the stack, for example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qcoreapplication.cpp 0
+ \snippet code/src_corelib_kernel_qcoreapplication.cpp 0
\sa postEvent(), notify()
*/
@@ -1473,7 +1481,7 @@ void QCoreApplicationPrivate::maybeQuit()
Example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qcoreapplication.cpp 1
+ \snippet code/src_corelib_kernel_qcoreapplication.cpp 1
\sa exit(), aboutToQuit(), QApplication::lastWindowClosed()
*/
@@ -1521,7 +1529,7 @@ void QCoreApplication::quit()
The function returns true on success and false on failure.
- \sa removeTranslator() translate() QTranslator::load() {Dynamic Translation}
+ \sa removeTranslator(), translate(), QTranslator::load(), {Dynamic Translation}
*/
bool QCoreApplication::installTranslator(QTranslator *translationFile)
@@ -1634,7 +1642,7 @@ static void replacePercentN(QString *result, int n)
so will most likely result in crashes or other undesirable
behavior.
- \sa QObject::tr() installTranslator()
+ \sa QObject::tr(), installTranslator()
*/
@@ -1910,7 +1918,7 @@ QStringList QCoreApplication::arguments()
organizationName(). On all other platforms, QSettings uses
organizationName() as the organization.
- \sa organizationDomain applicationName
+ \sa organizationDomain, applicationName
*/
void QCoreApplication::setOrganizationName(const QString &orgName)
@@ -1936,7 +1944,7 @@ QString QCoreApplication::organizationName()
On all other platforms, QSettings uses organizationName() as the
organization.
- \sa organizationName applicationName applicationVersion
+ \sa organizationName, applicationName, applicationVersion
*/
void QCoreApplication::setOrganizationDomain(const QString &orgDomain)
{
@@ -1958,7 +1966,7 @@ QString QCoreApplication::organizationDomain()
If not set, the application name defaults to the executable name (since 5.0).
- \sa organizationName organizationDomain applicationVersion applicationFilePath
+ \sa organizationName, organizationDomain, applicationVersion, applicationFilePath
*/
void QCoreApplication::setApplicationName(const QString &application)
{
@@ -1984,7 +1992,7 @@ Q_CORE_EXPORT QString qt_applicationName_noFallback()
\since 4.4
\brief the version of this application
- \sa applicationName organizationName organizationDomain
+ \sa applicationName, organizationName, organizationDomain
*/
void QCoreApplication::setApplicationVersion(const QString &version)
{
@@ -2018,7 +2026,7 @@ Q_GLOBAL_STATIC_WITH_ARGS(QMutex, libraryPathMutex, (QMutex::Recursive))
If you want to iterate over the list, you can use the \l foreach
pseudo-keyword:
- \snippet doc/src/snippets/code/src_corelib_kernel_qcoreapplication.cpp 2
+ \snippet code/src_corelib_kernel_qcoreapplication.cpp 2
\sa setLibraryPaths(), addLibraryPath(), removeLibraryPath(), QLibrary,
{How to Create Qt Plugins}
@@ -2140,7 +2148,7 @@ void QCoreApplication::removeLibraryPath(const QString &path)
A function with the following signature that can be used as an
event filter:
- \snippet doc/src/snippets/code/src_corelib_kernel_qcoreapplication.cpp 3
+ \snippet code/src_corelib_kernel_qcoreapplication.cpp 3
\sa setEventFilter()
*/
@@ -2275,7 +2283,7 @@ void QCoreApplication::setEventDispatcher(QAbstractEventDispatcher *eventDispatc
The function specified by \a ptr should take no arguments and should
return nothing. For example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qcoreapplication.cpp 4
+ \snippet code/src_corelib_kernel_qcoreapplication.cpp 4
Note that for an application- or module-wide cleanup,
qAddPostRoutine() is often not suitable. For example, if the
@@ -2289,7 +2297,7 @@ void QCoreApplication::setEventDispatcher(QAbstractEventDispatcher *eventDispatc
parent-child mechanism to call a cleanup function at the right
time:
- \snippet doc/src/snippets/code/src_corelib_kernel_qcoreapplication.cpp 5
+ \snippet code/src_corelib_kernel_qcoreapplication.cpp 5
By selecting the right parent object, this can often be made to
clean up the module's data at the right moment.
@@ -2303,7 +2311,7 @@ void QCoreApplication::setEventDispatcher(QAbstractEventDispatcher *eventDispatc
translation functions, \c tr() and \c trUtf8(), with these
signatures:
- \snippet doc/src/snippets/code/src_corelib_kernel_qcoreapplication.cpp 6
+ \snippet code/src_corelib_kernel_qcoreapplication.cpp 6
This macro is useful if you want to use QObject::tr() or
QObject::trUtf8() in classes that don't inherit from QObject.
@@ -2312,7 +2320,7 @@ void QCoreApplication::setEventDispatcher(QAbstractEventDispatcher *eventDispatc
class definition (before the first \c{public:} or \c{protected:}).
For example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qcoreapplication.cpp 7
+ \snippet code/src_corelib_kernel_qcoreapplication.cpp 7
The \a context parameter is normally the class name, but it can
be any string.
diff --git a/src/corelib/kernel/qeventdispatcher_blackberry.cpp b/src/corelib/kernel/qeventdispatcher_blackberry.cpp
new file mode 100644
index 0000000000..462e359bf3
--- /dev/null
+++ b/src/corelib/kernel/qeventdispatcher_blackberry.cpp
@@ -0,0 +1,262 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Research In Motion
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qeventdispatcher_blackberry_p.h"
+#include "qsocketnotifier.h"
+#include "qdebug.h"
+
+#include <bps/bps.h>
+#include <bps/event.h>
+
+struct bpsIOHandlerData {
+ bpsIOHandlerData()
+ : count(0), readfds(0), writefds(0), exceptfds(0)
+ {
+ }
+
+ int count;
+ fd_set *readfds;
+ fd_set *writefds;
+ fd_set *exceptfds;
+};
+
+static int bpsIOReadyDomain = -1;
+
+static int bpsIOHandler(int fd, int io_events, void *data)
+{
+ // decode callback payload
+ bpsIOHandlerData *ioData = static_cast<bpsIOHandlerData*>(data);
+
+ // check if first file is ready
+ bool firstReady = (ioData->count == 0);
+
+ // update ready state of file
+ if (io_events & BPS_IO_INPUT) {
+ FD_SET(fd, ioData->readfds);
+ ioData->count++;
+ }
+
+ if (io_events & BPS_IO_OUTPUT) {
+ FD_SET(fd, ioData->writefds);
+ ioData->count++;
+ }
+
+ if (io_events & BPS_IO_EXCEPT) {
+ FD_SET(fd, ioData->exceptfds);
+ ioData->count++;
+ }
+
+ // force bps_get_event() to return immediately by posting an event to ourselves;
+ // but this only needs to happen once if multiple files become ready at the same time
+ if (firstReady) {
+ // create IO ready event
+ bps_event_t *event;
+ int result = bps_event_create(&event, bpsIOReadyDomain, 0, NULL, NULL);
+ if (result != BPS_SUCCESS) {
+ qWarning("QEventDispatcherBlackberryPrivate::QEventDispatcherBlackberry: bps_event_create() failed");
+ return BPS_FAILURE;
+ }
+
+ // post IO ready event to our thread
+ result = bps_push_event(event);
+ if (result != BPS_SUCCESS) {
+ qWarning("QEventDispatcherBlackberryPrivate::QEventDispatcherBlackberry: bps_push_event() failed");
+ bps_event_destroy(event);
+ return BPS_FAILURE;
+ }
+ }
+
+ return BPS_SUCCESS;
+}
+
+QEventDispatcherBlackberryPrivate::QEventDispatcherBlackberryPrivate()
+ : ioData(new bpsIOHandlerData)
+{
+ // prepare to use BPS
+ int result = bps_initialize();
+ if (result != BPS_SUCCESS)
+ qFatal("QEventDispatcherBlackberryPrivate::QEventDispatcherBlackberry: bps_initialize() failed");
+
+ // get domain for IO ready events - ignoring race condition here for now
+ if (bpsIOReadyDomain == -1) {
+ bpsIOReadyDomain = bps_register_domain();
+ if (bpsIOReadyDomain == -1)
+ qWarning("QEventDispatcherBlackberryPrivate::QEventDispatcherBlackberry: bps_register_domain() failed");
+ }
+
+ // \TODO Reinstate this when bps is fixed. See comment in select() below.
+ // Register thread_pipe[0] with bps
+ /*
+ int io_events = BPS_IO_INPUT;
+ result = bps_add_fd(thread_pipe[0], io_events, &bpsIOHandler, ioData.data());
+ if (result != BPS_SUCCESS)
+ qWarning() << Q_FUNC_INFO << "bps_add_fd() failed";
+ */
+}
+
+QEventDispatcherBlackberryPrivate::~QEventDispatcherBlackberryPrivate()
+{
+ // we're done using BPS
+ bps_shutdown();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+QEventDispatcherBlackberry::QEventDispatcherBlackberry(QObject *parent)
+ : QEventDispatcherUNIX(*new QEventDispatcherBlackberryPrivate, parent)
+{
+}
+
+QEventDispatcherBlackberry::QEventDispatcherBlackberry(QEventDispatcherBlackberryPrivate &dd, QObject *parent)
+ : QEventDispatcherUNIX(dd, parent)
+{
+}
+
+QEventDispatcherBlackberry::~QEventDispatcherBlackberry()
+{
+}
+
+void QEventDispatcherBlackberry::registerSocketNotifier(QSocketNotifier *notifier)
+{
+ Q_ASSERT(notifier);
+
+ // Call the base Unix implementation. Needed to allow select() to be called correctly
+ QEventDispatcherUNIX::registerSocketNotifier(notifier);
+
+ // Register the fd with bps
+ int sockfd = notifier->socket();
+ int type = notifier->type();
+
+ int io_events = 0;
+ switch (type) {
+ case QSocketNotifier::Read:
+ io_events |= BPS_IO_INPUT;
+ break;
+ case QSocketNotifier::Write:
+ io_events |= BPS_IO_OUTPUT;
+ break;
+ case QSocketNotifier::Exception:
+ default:
+ io_events |= BPS_IO_EXCEPT;
+ break;
+ }
+
+ Q_D(QEventDispatcherBlackberry);
+ int result = bps_add_fd(sockfd, io_events, &bpsIOHandler, d->ioData.data());
+ if (result != BPS_SUCCESS)
+ qWarning() << Q_FUNC_INFO << "bps_add_fd() failed";
+}
+
+void QEventDispatcherBlackberry::unregisterSocketNotifier(QSocketNotifier *notifier)
+{
+ // Unregister the fd with bps
+ int sockfd = notifier->socket();
+ int result = bps_remove_fd(sockfd);
+ if (result != BPS_SUCCESS)
+ qWarning() << Q_FUNC_INFO << "bps_remove_fd() failed";
+
+ // Allow the base Unix implementation to unregister the fd too
+ QEventDispatcherUNIX::unregisterSocketNotifier(notifier);
+}
+
+int QEventDispatcherBlackberry::select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
+ timeval *timeout)
+{
+ Q_UNUSED(nfds);
+
+ // prepare file sets for bps callback
+ Q_D(QEventDispatcherBlackberry);
+ d->ioData->count = 0;
+ d->ioData->readfds = readfds;
+ d->ioData->writefds = writefds;
+ d->ioData->exceptfds = exceptfds;
+
+ // \TODO Remove this when bps is fixed
+ //
+ // Work around a bug in BPS with which if we register the thread_pipe[0] fd with bps in the
+ // private class' ctor once only then we get spurious notifications that thread_pipe[0] is
+ // ready for reading. The first time the notification is correct and the pipe is emptied in
+ // the calling doSelect() function. The 2nd notification is an error and the resulting attempt
+ // to read and call to wakeUps.testAndSetRelease(1, 0) fails as there has been no intervening
+ // call to QEventDispatcherUNIX::wakeUp().
+ //
+ // Registering thread_pipe[0] here and unregistering it at the end of this call works around
+ // this issue.
+ int io_events = BPS_IO_INPUT;
+ int result = bps_add_fd(d->thread_pipe[0], io_events, &bpsIOHandler, d->ioData.data());
+ if (result != BPS_SUCCESS)
+ qWarning() << Q_FUNC_INFO << "bps_add_fd() failed";
+
+ // reset all file sets
+ if (readfds)
+ FD_ZERO(readfds);
+
+ if (writefds)
+ FD_ZERO(writefds);
+
+ if (exceptfds)
+ FD_ZERO(exceptfds);
+
+ // convert timeout to milliseconds
+ int timeout_ms = -1;
+ if (timeout)
+ timeout_ms = (timeout->tv_sec * 1000) + (timeout->tv_usec / 1000);
+
+ // wait for event or file to be ready
+ bps_event_t *event = NULL;
+ result = bps_get_event(&event, timeout_ms);
+ if (result != BPS_SUCCESS)
+ qWarning("QEventDispatcherBlackberry::select: bps_get_event() failed");
+
+ // pass all received events through filter - except IO ready events
+ if (event && bps_event_get_domain(event) != bpsIOReadyDomain)
+ filterEvent((void*)event);
+
+ // \TODO Remove this when bps is fixed (see comment above)
+ result = bps_remove_fd(d->thread_pipe[0]);
+ if (result != BPS_SUCCESS)
+ qWarning() << Q_FUNC_INFO << "bps_remove_fd() failed";
+
+ // the number of bits set in the file sets
+ return d->ioData->count;
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/openvglite/qwindowsurface_vglite.h b/src/corelib/kernel/qeventdispatcher_blackberry_p.h
index b3ee1df325..b996bc7ee7 100644
--- a/src/plugins/platforms/openvglite/qwindowsurface_vglite.h
+++ b/src/corelib/kernel/qeventdispatcher_blackberry_p.h
@@ -1,9 +1,9 @@
/****************************************************************************
**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2012 Research In Motion
** Contact: http://www.qt-project.org/
**
-** This file is part of the plugins of the Qt Toolkit.
+** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
@@ -39,8 +39,8 @@
**
****************************************************************************/
-#ifndef QWINDOWSURFACE_VGLITE_H
-#define QWINDOWSURFACE_VGLITE_H
+#ifndef QEVENTDISPATCHER_BLACKBERRY_P_H
+#define QEVENTDISPATCHER_BLACKBERRY_P_H
//
// W A R N I N G
@@ -53,39 +53,44 @@
// We mean it.
//
-#include <QtGui/private/qwindowsurface_p.h>
-#include <QtGui/private/qegl_p.h>
+#include "private/qeventdispatcher_unix_p.h"
QT_BEGIN_NAMESPACE
-class QVGLiteGraphicsSystem;
-class QVGPaintEngine;
+class QEventDispatcherBlackberryPrivate;
-class Q_OPENVG_EXPORT QVGLiteWindowSurface : public QWindowSurface, public QPaintDevice
+class Q_CORE_EXPORT QEventDispatcherBlackberry : public QEventDispatcherUNIX
{
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(QEventDispatcherBlackberry)
+
public:
- QVGLiteWindowSurface(QVGLiteGraphicsSystem *gs, QWidget *window);
- ~QVGLiteWindowSurface();
+ explicit QEventDispatcherBlackberry(QObject *parent = 0);
+ ~QEventDispatcherBlackberry();
- QPaintDevice *paintDevice();
- void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
- void setGeometry(const QRect &rect);
- bool scroll(const QRegion &area, int dx, int dy);
+ void registerSocketNotifier(QSocketNotifier *notifier);
+ void unregisterSocketNotifier(QSocketNotifier *notifier);
- void beginPaint(const QRegion &region);
- void endPaint(const QRegion &region);
+protected:
+ QEventDispatcherBlackberry(QEventDispatcherBlackberryPrivate &dd, QObject *parent = 0);
- QPaintEngine *paintEngine() const;
+ int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
+ timeval *timeout);
+};
-protected:
- int metric(PaintDeviceMetric metric) const;
+struct bpsIOHandlerData;
+
+class Q_CORE_EXPORT QEventDispatcherBlackberryPrivate : public QEventDispatcherUNIXPrivate
+{
+ Q_DECLARE_PUBLIC(QEventDispatcherBlackberry)
+
+public:
+ QEventDispatcherBlackberryPrivate();
+ ~QEventDispatcherBlackberryPrivate();
-private:
- QVGLiteGraphicsSystem *graphicsSystem;
- bool isPaintingActive;
- mutable QVGPaintEngine *engine;
+ QScopedPointer<bpsIOHandlerData> ioData;
};
QT_END_NAMESPACE
-#endif // QWINDOWSURFACE_VGLITE_H
+#endif // QEVENTDISPATCHER_BLACKBERRY_P_H
diff --git a/src/corelib/kernel/qeventloop.cpp b/src/corelib/kernel/qeventloop.cpp
index d3a64aae04..deea463061 100644
--- a/src/corelib/kernel/qeventloop.cpp
+++ b/src/corelib/kernel/qeventloop.cpp
@@ -275,7 +275,7 @@ void QEventLoop::exit(int returnCode)
false. The event loop is considered running from the time when
exec() is called until exit() is called.
- \sa exec() exit()
+ \sa exec(), exit()
*/
bool QEventLoop::isRunning() const
{
diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp
index e3b0b15e26..4e05b63c82 100644
--- a/src/corelib/kernel/qmetaobject.cpp
+++ b/src/corelib/kernel/qmetaobject.cpp
@@ -146,23 +146,17 @@ QT_BEGIN_NAMESPACE
static inline const QMetaObjectPrivate *priv(const uint* data)
{ return reinterpret_cast<const QMetaObjectPrivate*>(data); }
-static inline const QByteArrayData &stringData(const QMetaObject *mo, int index)
+static inline const QByteArray stringData(const QMetaObject *mo, int index)
{
Q_ASSERT(priv(mo->d.data)->revision >= 7);
- const QByteArrayData &data = mo->d.stringdata[index];
- Q_ASSERT(data.ref.isStatic());
- Q_ASSERT(data.alloc == 0);
- Q_ASSERT(data.capacityReserved == 0);
- Q_ASSERT(data.size >= 0);
+ const QByteArrayDataPtr data = { const_cast<QByteArrayData*>(&mo->d.stringdata[index]) };
+ Q_ASSERT(data.ptr->ref.isStatic());
+ Q_ASSERT(data.ptr->alloc == 0);
+ Q_ASSERT(data.ptr->capacityReserved == 0);
+ Q_ASSERT(data.ptr->size >= 0);
return data;
}
-static inline QByteArray toByteArray(const QByteArrayData &d)
-{
- QByteArrayDataPtr holder = { const_cast<QByteArrayData *>(&d) };
- return QByteArray(holder);
-}
-
static inline const char *rawStringData(const QMetaObject *mo, int index)
{
return stringData(mo, index).data();
@@ -170,13 +164,13 @@ static inline const char *rawStringData(const QMetaObject *mo, int index)
static inline int stringSize(const QMetaObject *mo, int index)
{
- return stringData(mo, index).size;
+ return stringData(mo, index).size();
}
static inline QByteArray typeNameFromTypeInfo(const QMetaObject *mo, uint typeInfo)
{
if (typeInfo & IsUnresolvedType) {
- return toByteArray(stringData(mo, typeInfo & TypeNameIndexMask));
+ return stringData(mo, typeInfo & TypeNameIndexMask);
} else {
// ### Use the QMetaType::typeName() that returns QByteArray
const char *t = QMetaType::typeName(typeInfo);
@@ -193,7 +187,7 @@ static inline int typeFromTypeInfo(const QMetaObject *mo, uint typeInfo)
{
if (!(typeInfo & IsUnresolvedType))
return typeInfo;
- return QMetaType::type(toByteArray(stringData(mo, typeInfo & TypeNameIndexMask)));
+ return QMetaType::type(stringData(mo, typeInfo & TypeNameIndexMask));
}
class QMetaMethodPrivate : public QMetaMethod
@@ -294,11 +288,10 @@ QObject *QMetaObject::newInstance(QGenericArgument val0,
*/
int QMetaObject::static_metacall(Call cl, int idx, void **argv) const
{
- const QMetaObjectExtraData *extra = reinterpret_cast<const QMetaObjectExtraData *>(d.extradata);
Q_ASSERT(priv(d.data)->revision >= 6);
- if (!extra || !extra->static_metacall)
+ if (!d.static_metacall)
return 0;
- extra->static_metacall(0, cl, idx, argv);
+ d.static_metacall(0, cl, idx, argv);
return -1;
}
@@ -492,7 +485,7 @@ int QMetaObject::constructorCount() const
Use code like the following to obtain a QStringList containing the methods
specific to a given class:
- \snippet doc/src/snippets/code/src_corelib_kernel_qmetaobject.cpp methodCount
+ \snippet code/src_corelib_kernel_qmetaobject.cpp methodCount
\sa method(), methodOffset(), indexOfMethod()
*/
@@ -530,7 +523,7 @@ int QMetaObject::enumeratorCount() const
Use code like the following to obtain a QStringList containing the properties
specific to a given class:
- \snippet doc/src/snippets/code/src_corelib_kernel_qmetaobject.cpp propertyCount
+ \snippet code/src_corelib_kernel_qmetaobject.cpp propertyCount
\sa property(), propertyOffset(), indexOfProperty()
*/
@@ -572,7 +565,7 @@ static bool methodMatch(const QMetaObject *m, int handle,
if (int(m->d.data[handle + 1]) != argc)
return false;
- if (toByteArray(stringData(m, m->d.data[handle])) != name)
+ if (stringData(m, m->d.data[handle]) != name)
return false;
int paramsIndex = m->d.data[handle + 2] + 1;
@@ -659,6 +652,7 @@ int QMetaObject::indexOfMethod(const char *method) const
}
// Parses a string of comma-separated types into QArgumentTypes.
+// No normalization of the type names is performed.
static void argumentTypesFromString(const char *str, const char *end,
QArgumentTypeArray &types)
{
@@ -812,6 +806,35 @@ int QMetaObjectPrivate::indexOfConstructor(const QMetaObject *m, const QByteArra
return -1;
}
+/*! \internal
+ Returns the signal for the given \a metaObject at \a signal_index.
+
+ It it different from QMetaObject::method(); the index should not include
+ non-signal methods.
+
+ The index must correspond to a signal defined in \ a metaObject itself;
+ it should not be an inherited signal.
+*/
+QMetaMethod QMetaObjectPrivate::signal(const QMetaObject *metaObject, int signal_index)
+{
+ QMetaMethod result;
+ if (signal_index < 0)
+ return result;
+ Q_ASSERT(metaObject != 0);
+
+ int signalOffset = 0;
+ for (const QMetaObject *m = metaObject->d.superdata; m; m = m->d.superdata)
+ signalOffset += priv(m->d.data)->signalCount;
+
+ Q_ASSERT(signal_index >= signalOffset);
+ int signal_index_relative = signal_index - signalOffset;
+ if (signal_index_relative < priv(metaObject->d.data)->signalCount) {
+ result.mobj = metaObject;
+ result.handle = priv(metaObject->d.data)->methodData + 5*signal_index_relative;
+ }
+ return result;
+}
+
/*!
\internal
@@ -869,11 +892,9 @@ static const QMetaObject *QMetaObject_findMetaObject(const QMetaObject *self, co
while (self) {
if (strcmp(rawStringData(self, 0), name) == 0)
return self;
- if (self->d.extradata) {
- const QMetaObject **e;
+ if (self->d.relatedMetaObjects) {
Q_ASSERT(priv(self->d.data)->revision >= 2);
- const QMetaObjectExtraData *extra = (const QMetaObjectExtraData*)(self->d.extradata);
- e = extra->objects;
+ const QMetaObject **e = self->d.relatedMetaObjects;
if (e) {
while (*e) {
if (const QMetaObject *m =QMetaObject_findMetaObject((*e), name))
@@ -1102,7 +1123,7 @@ QMetaProperty QMetaObject::userProperty() const
Example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qmetaobject.cpp 0
+ \snippet code/src_corelib_kernel_qmetaobject.cpp 0
\sa classInfoCount(), classInfoOffset(), indexOfClassInfo()
*/
@@ -1207,7 +1228,7 @@ static char *qNormalizeType(char *d, int &templdepth, QByteArray &result)
Example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qmetaobject.cpp 1
+ \snippet code/src_corelib_kernel_qmetaobject.cpp 1
\sa normalizedSignature()
*/
@@ -1312,7 +1333,7 @@ enum { MaximumParamCount = 11 }; // up to 10 arguments + 1 return value
the \l{QPushButton::animateClick()}{animateClick()} slot on a
QPushButton, use the following code:
- \snippet doc/src/snippets/code/src_corelib_kernel_qmetaobject.cpp 2
+ \snippet code/src_corelib_kernel_qmetaobject.cpp 2
With asynchronous method invocations, the parameters must be of
types that are known to Qt's meta-object system, because Qt needs
@@ -1320,7 +1341,7 @@ enum { MaximumParamCount = 11 }; // up to 10 arguments + 1 return value
scenes. If you try to use a queued connection and get the error
message
- \snippet doc/src/snippets/code/src_corelib_kernel_qmetaobject.cpp 3
+ \snippet code/src_corelib_kernel_qmetaobject.cpp 3
call qRegisterMetaType() to register the data type before you
call invokeMethod().
@@ -1328,7 +1349,7 @@ enum { MaximumParamCount = 11 }; // up to 10 arguments + 1 return value
To synchronously invoke the \c compute(QString, int, double) slot on
some arbitrary object \c obj retrieve its return value:
- \snippet doc/src/snippets/code/src_corelib_kernel_qmetaobject.cpp 4
+ \snippet code/src_corelib_kernel_qmetaobject.cpp 4
If the "compute" slot does not take exactly one QString, one int
and one double in the specified order, the call will fail.
@@ -1483,6 +1504,24 @@ bool QMetaObject::invokeMethod(QObject *obj,
invoked), otherwise returns false.
*/
+/*! \fn bool operator==(const QMetaMethod &m1, const QMetaMethod &m2)
+ \since 5.0
+ \relates QMetaMethod
+ \overload
+
+ Returns true if method \a m1 is equal to method \a m2,
+ otherwise returns false.
+*/
+
+/*! \fn bool operator!=(const QMetaMethod &m1, const QMetaMethod &m2)
+ \since 5.0
+ \relates QMetaMethod
+ \overload
+
+ Returns true if method \a m1 is not equal to method \a m2,
+ otherwise returns false.
+*/
+
/*!
\fn const QMetaObject *QMetaMethod::enclosingMetaObject() const
\internal
@@ -1522,7 +1561,7 @@ QByteArray QMetaMethodPrivate::signature() const
QByteArray QMetaMethodPrivate::name() const
{
Q_ASSERT(priv(mobj->d.data)->revision >= 7);
- return toByteArray(stringData(mobj, mobj->d.data[handle]));
+ return stringData(mobj, mobj->d.data[handle]);
}
int QMetaMethodPrivate::typesDataIndex() const
@@ -1599,14 +1638,14 @@ QList<QByteArray> QMetaMethodPrivate::parameterNames() const
int argc = parameterCount();
int namesIndex = parametersDataIndex() + argc;
for (int i = 0; i < argc; ++i)
- list += toByteArray(stringData(mobj, mobj->d.data[namesIndex + i]));
+ list += stringData(mobj, mobj->d.data[namesIndex + i]);
return list;
}
QByteArray QMetaMethodPrivate::tag() const
{
Q_ASSERT(priv(mobj->d.data)->revision >= 7);
- return toByteArray(stringData(mobj, mobj->d.data[handle + 3]));
+ return stringData(mobj, mobj->d.data[handle + 3]);
}
/*!
@@ -1848,6 +1887,41 @@ QMetaMethod::MethodType QMetaMethod::methodType() const
}
/*!
+ \fn QMetaMethod QMetaMethod::fromSignal(PointerToMemberFunction signal)
+ \since 5.0
+
+ Returns the meta-method that corresponds to the given \a signal, or an
+ invalid QMetaMethod if \a signal is not a signal of the class.
+
+ Example:
+
+ \snippet code/src_corelib_kernel_qmetaobject.cpp 9
+*/
+
+/*! \internal
+
+ Implementation of the fromSignal() function.
+
+ \a metaObject is the class's meta-object
+ \a signal is a pointer to a pointer to a member signal of the class
+*/
+QMetaMethod QMetaMethod::fromSignalImpl(const QMetaObject *metaObject, void **signal)
+{
+ int i = -1;
+ void *args[] = { &i, signal };
+ QMetaMethod result;
+ for (const QMetaObject *m = metaObject; m; m = m->d.superdata) {
+ m->static_metacall(QMetaObject::IndexOfMethod, 0, args);
+ if (i >= 0) {
+ result.mobj = m;
+ result.handle = priv(m->d.data)->methodData + 5*i;
+ break;
+ }
+ }
+ return result;
+}
+
+/*!
Invokes this method on the object \a object. Returns true if the member could be invoked.
Returns false if there is no such member or the parameters did not match.
@@ -1883,7 +1957,7 @@ QMetaMethod::MethodType QMetaMethod::methodType() const
\l{QPushButton::animateClick()}{animateClick()} slot on a
QPushButton:
- \snippet doc/src/snippets/code/src_corelib_kernel_qmetaobject.cpp 6
+ \snippet code/src_corelib_kernel_qmetaobject.cpp 6
With asynchronous method invocations, the parameters must be of
types that are known to Qt's meta-object system, because Qt needs
@@ -1891,7 +1965,7 @@ QMetaMethod::MethodType QMetaMethod::methodType() const
scenes. If you try to use a queued connection and get the error
message
- \snippet doc/src/snippets/code/src_corelib_kernel_qmetaobject.cpp 7
+ \snippet code/src_corelib_kernel_qmetaobject.cpp 7
call qRegisterMetaType() to register the data type before you
call QMetaMethod::invoke().
@@ -1899,7 +1973,7 @@ QMetaMethod::MethodType QMetaMethod::methodType() const
To synchronously invoke the \c compute(QString, int, double) slot on
some arbitrary object \c obj retrieve its return value:
- \snippet doc/src/snippets/code/src_corelib_kernel_qmetaobject.cpp 8
+ \snippet code/src_corelib_kernel_qmetaobject.cpp 8
QMetaObject::normalizedSignature() is used here to ensure that the format
of the signature is what invoke() expects. E.g. extra whitespace is
@@ -2012,8 +2086,7 @@ bool QMetaMethod::invoke(QObject *object,
int idx_relative = ((handle - priv(mobj->d.data)->methodData) / 5);
int idx_offset = mobj->methodOffset();
Q_ASSERT(QMetaObjectPrivate::get(mobj)->revision >= 6);
- QObjectPrivate::StaticMetaCallFunction callFunction = mobj->d.extradata
- ? reinterpret_cast<const QMetaObjectExtraData *>(mobj->d.extradata)->static_metacall : 0;
+ QObjectPrivate::StaticMetaCallFunction callFunction = mobj->d.static_metacall;
if (connectionType == Qt::DirectConnection) {
if (callFunction) {
@@ -2391,7 +2464,7 @@ QByteArray QMetaEnum::valueToKeys(int value) const
v = v & ~k;
if (!keys.isEmpty())
keys += '|';
- keys += toByteArray(stringData(mobj, mobj->d.data[data + 2*i]));
+ keys += stringData(mobj, mobj->d.data[data + 2*i]);
}
}
return keys;
@@ -3058,7 +3131,7 @@ bool QMetaProperty::isEditable(const QObject *object) const
are specified using Q_CLASSINFO() in the source code. The
information can be retrieved using name() and value(). For example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qmetaobject.cpp 5
+ \snippet code/src_corelib_kernel_qmetaobject.cpp 5
This mechanism is free for you to use in your Qt applications. Qt
doesn't use it for any of its classes.
diff --git a/src/corelib/kernel/qmetaobject.h b/src/corelib/kernel/qmetaobject.h
index 095b196dca..1c49506926 100644
--- a/src/corelib/kernel/qmetaobject.h
+++ b/src/corelib/kernel/qmetaobject.h
@@ -141,6 +141,20 @@ public:
inline bool isValid() const { return mobj != 0; }
+#ifdef Q_QDOC
+ static QMetaMethod fromSignal(PointerToMemberFunction signal);
+#else
+ template <typename Func>
+ static inline QMetaMethod fromSignal(Func signal)
+ {
+ typedef QtPrivate::FunctionPointer<Func> SignalType;
+ reinterpret_cast<typename SignalType::Object *>(0)->qt_check_for_QOBJECT_macro(
+ *reinterpret_cast<typename SignalType::Object *>(0));
+ return fromSignalImpl(&SignalType::Object::staticMetaObject,
+ reinterpret_cast<void **>(&signal));
+ }
+#endif
+
private:
#if QT_DEPRECATED_SINCE(5,0)
// signature() has been renamed to methodSignature() in Qt 5.
@@ -148,6 +162,7 @@ private:
// you convert to char*.
char *signature(struct renamedInQt5_warning_checkTheLifeTime * = 0) Q_DECL_EQ_DELETE;
#endif
+ static QMetaMethod fromSignalImpl(const QMetaObject *, void **);
const QMetaObject *mobj;
uint handle;
@@ -155,9 +170,16 @@ private:
friend struct QMetaObject;
friend struct QMetaObjectPrivate;
friend class QObject;
+ friend bool operator==(const QMetaMethod &m1, const QMetaMethod &m2);
+ friend bool operator!=(const QMetaMethod &m1, const QMetaMethod &m2);
};
Q_DECLARE_TYPEINFO(QMetaMethod, Q_MOVABLE_TYPE);
+inline bool operator==(const QMetaMethod &m1, const QMetaMethod &m2)
+{ return m1.mobj == m2.mobj && m1.handle == m2.handle; }
+inline bool operator!=(const QMetaMethod &m1, const QMetaMethod &m2)
+{ return !(m1 == m2); }
+
class Q_CORE_EXPORT QMetaEnum
{
public:
diff --git a/src/corelib/kernel/qmetaobject_p.h b/src/corelib/kernel/qmetaobject_p.h
index 3b732b4b93..5877ab18e4 100644
--- a/src/corelib/kernel/qmetaobject_p.h
+++ b/src/corelib/kernel/qmetaobject_p.h
@@ -110,6 +110,8 @@ enum MetaDataFlags {
TypeNameIndexMask = 0x7FFFFFFF
};
+extern int qMetaTypeTypeInternal(const char *);
+
class QArgumentType
{
public:
@@ -117,7 +119,7 @@ public:
: _type(type)
{}
QArgumentType(const QByteArray &name)
- : _type(QMetaType::type(name.constData())), _name(name)
+ : _type(qMetaTypeTypeInternal(name.constData())), _name(name)
{}
QArgumentType()
: _type(0)
@@ -198,6 +200,7 @@ struct QMetaObjectPrivate
int argc, const QArgumentType *types);
static int indexOfConstructor(const QMetaObject *m, const QByteArray &name,
int argc, const QArgumentType *types);
+ static QMetaMethod signal(const QMetaObject *m, int signal_index);
static bool checkConnectArgs(int signalArgc, const QArgumentType *signalTypes,
int methodArgc, const QArgumentType *methodTypes);
static bool checkConnectArgs(const QMetaMethodPrivate *signal,
@@ -211,10 +214,12 @@ struct QMetaObjectPrivate
static void memberIndexes(const QObject *obj, const QMetaMethod &member,
int *signalIndex, int *methodIndex);
static QObjectPrivate::Connection *connect(const QObject *sender, int signal_index,
+ const QMetaObject *smeta,
const QObject *receiver, int method_index_relative,
const QMetaObject *rmeta = 0,
int type = 0, int *types = 0);
static bool disconnect(const QObject *sender, int signal_index,
+ const QMetaObject *smeta,
const QObject *receiver, int method_index, void **slot,
DisconnectType = DisconnectAll);
static inline bool disconnectHelper(QObjectPrivate::Connection *c,
diff --git a/src/corelib/kernel/qmetaobjectbuilder.cpp b/src/corelib/kernel/qmetaobjectbuilder.cpp
index d262d6a61b..16ff58e1ca 100644
--- a/src/corelib/kernel/qmetaobjectbuilder.cpp
+++ b/src/corelib/kernel/qmetaobjectbuilder.cpp
@@ -609,7 +609,7 @@ QMetaPropertyBuilder QMetaObjectBuilder::addProperty(const QMetaProperty& protot
\a name. Returns an object that can be used to adjust
the other attributes of the enumerator.
- \sa enumerator(), enumeratorCount(), removeEnumerator(),
+ \sa enumerator(), enumeratorCount(), removeEnumerator()
\sa indexOfEnumerator()
*/
QMetaEnumBuilder QMetaObjectBuilder::addEnumerator(const QByteArray& name)
@@ -625,7 +625,7 @@ QMetaEnumBuilder QMetaObjectBuilder::addEnumerator(const QByteArray& name)
QMetaObject. Returns an object that can be used to adjust the
attributes of the enumerator.
- \sa enumerator(), enumeratorCount(), removeEnumerator(),
+ \sa enumerator(), enumeratorCount(), removeEnumerator()
\sa indexOfEnumerator()
*/
QMetaEnumBuilder QMetaObjectBuilder::addEnumerator(const QMetaEnum& prototype)
@@ -737,13 +737,8 @@ void QMetaObjectBuilder::addMetaObject
}
if ((members & RelatedMetaObjects) != 0) {
- const QMetaObject **objects;
Q_ASSERT(priv(prototype->d.data)->revision >= 2);
- const QMetaObjectExtraData *extra = (const QMetaObjectExtraData *)(prototype->d.extradata);
- if (extra)
- objects = extra->objects;
- else
- objects = 0;
+ const QMetaObject **objects = prototype->d.relatedMetaObjects;
if (objects) {
while (*objects != 0) {
addRelatedMetaObject(*objects);
@@ -754,10 +749,8 @@ void QMetaObjectBuilder::addMetaObject
if ((members & StaticMetacall) != 0) {
Q_ASSERT(priv(prototype->d.data)->revision >= 6);
- const QMetaObjectExtraData *extra =
- (const QMetaObjectExtraData *)(prototype->d.extradata);
- if (extra && extra->static_metacall)
- setStaticMetacallFunction(extra->static_metacall);
+ if (prototype->d.static_metacall)
+ setStaticMetacallFunction(prototype->d.static_metacall);
}
}
@@ -1150,7 +1143,7 @@ static int aggregateParameterCount(const QList<QMetaMethodBuilderPrivate> &metho
// Build a QMetaObject in "buf" based on the information in "d".
// If "buf" is null, then return the number of bytes needed to
// build the QMetaObject. Returns -1 if the metaobject if
-// relocatable is set, but the metaobject contains extradata.
+// relocatable is set, but the metaobject contains relatedMetaObjects.
static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
int expectedSize, bool relocatable)
{
@@ -1174,7 +1167,9 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
ALIGN(size, int);
if (buf) {
if (!relocatable) meta->d.superdata = d->superClass;
+ meta->d.relatedMetaObjects = 0;
meta->d.extradata = 0;
+ meta->d.static_metacall = d->staticMetacallFunction;
}
// Populate the QMetaObjectPrivate structure.
@@ -1446,30 +1441,18 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
if (buf)
data[enumIndex] = 0;
- // Create the extradata block if we need one.
- if (d->relatedMetaObjects.size() > 0 || d->staticMetacallFunction) {
- ALIGN(size, QMetaObject **);
- ALIGN(size, QMetaObjectBuilder::StaticMetacallFunction);
- QMetaObjectExtraData *extra =
- reinterpret_cast<QMetaObjectExtraData *>(buf + size);
- size += sizeof(QMetaObjectExtraData);
+ // Create the relatedMetaObjects block if we need one.
+ if (d->relatedMetaObjects.size() > 0) {
ALIGN(size, QMetaObject *);
const QMetaObject **objects =
reinterpret_cast<const QMetaObject **>(buf + size);
if (buf) {
- if (d->relatedMetaObjects.size() > 0) {
- extra->objects = objects;
- for (index = 0; index < d->relatedMetaObjects.size(); ++index)
- objects[index] = d->relatedMetaObjects[index];
- objects[index] = 0;
- } else {
- extra->objects = 0;
- }
- extra->static_metacall = d->staticMetacallFunction;
- meta->d.extradata = reinterpret_cast<void *>(extra);
+ meta->d.relatedMetaObjects = objects;
+ for (index = 0; index < d->relatedMetaObjects.size(); ++index)
+ objects[index] = d->relatedMetaObjects[index];
+ objects[index] = 0;
}
- if (d->relatedMetaObjects.size() > 0)
- size += sizeof(QMetaObject *) * (d->relatedMetaObjects.size() + 1);
+ size += sizeof(QMetaObject *) * (d->relatedMetaObjects.size() + 1);
}
// Align the final size and return it.
@@ -1552,6 +1535,8 @@ void QMetaObjectBuilder::fromRelocatableData(QMetaObject *output,
output->d.stringdata = reinterpret_cast<const QByteArrayData *>(buf + stringdataOffset);
output->d.data = reinterpret_cast<const uint *>(buf + dataOffset);
output->d.extradata = 0;
+ output->d.relatedMetaObjects = 0;
+ output->d.static_metacall = 0;
}
/*!
diff --git a/src/corelib/kernel/qmetaobjectbuilder_p.h b/src/corelib/kernel/qmetaobjectbuilder_p.h
index 4d766a9197..7c18298d35 100644
--- a/src/corelib/kernel/qmetaobjectbuilder_p.h
+++ b/src/corelib/kernel/qmetaobjectbuilder_p.h
@@ -165,7 +165,7 @@ public:
int indexOfEnumerator(const QByteArray& name);
int indexOfClassInfo(const QByteArray& name);
- typedef QMetaObjectExtraData::StaticMetacallFunction StaticMetacallFunction;
+ typedef void (*StaticMetacallFunction)(QObject *, QMetaObject::Call, int, void **);
QMetaObjectBuilder::StaticMetacallFunction staticMetacallFunction() const;
void setStaticMetacallFunction(QMetaObjectBuilder::StaticMetacallFunction value);
diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp
index 53b22958c3..2756dd5241 100644
--- a/src/corelib/kernel/qmetatype.cpp
+++ b/src/corelib/kernel/qmetatype.cpp
@@ -125,16 +125,16 @@ struct DefinedTypesFilter {
This example shows a typical use case of Q_DECLARE_METATYPE():
- \snippet doc/src/snippets/code/src_corelib_kernel_qmetatype.cpp 0
+ \snippet code/src_corelib_kernel_qmetatype.cpp 0
If \c MyStruct is in a namespace, the Q_DECLARE_METATYPE() macro
has to be outside the namespace:
- \snippet doc/src/snippets/code/src_corelib_kernel_qmetatype.cpp 1
+ \snippet code/src_corelib_kernel_qmetatype.cpp 1
Since \c{MyStruct} is now known to QMetaType, it can be used in QVariant:
- \snippet doc/src/snippets/code/src_corelib_kernel_qmetatype.cpp 2
+ \snippet code/src_corelib_kernel_qmetatype.cpp 2
\sa qRegisterMetaType()
*/
@@ -220,21 +220,13 @@ struct DefinedTypesFilter {
\value User Base value for user types
\value UnknownType This is an invalid type id. It is returned from QMetaType for types that are not registered
- \omitvalue FirstGuiType
- \omitvalue FirstWidgetsType
- \omitvalue LastCoreType
- \omitvalue LastGuiType
- \omitvalue LastWidgetsType
- \omitvalue QReal
- \omitvalue HighestInternalId
-
Additional types can be registered using Q_DECLARE_METATYPE().
\sa type(), typeName()
*/
/*!
- \enum QMetaType::TypeFlags
+ \enum QMetaType::TypeFlag
The enum describes attributes of a type supported by QMetaType.
@@ -265,7 +257,7 @@ struct DefinedTypesFilter {
The following code allocates and destructs an instance of
\c{MyClass}:
- \snippet doc/src/snippets/code/src_corelib_kernel_qmetatype.cpp 3
+ \snippet code/src_corelib_kernel_qmetatype.cpp 3
If we want the stream operators \c operator<<() and \c
operator>>() to work on QVariant objects that store custom types,
@@ -449,16 +441,37 @@ int QMetaType::registerType(const char *typeName, Deleter deleter,
int size, TypeFlags flags, const QMetaObject *metaObject)
{
Q_UNUSED(metaObject);
- QVector<QCustomTypeInfo> *ct = customTypes();
- if (!ct || !typeName || !deleter || !creator || !destructor || !constructor)
- return -1;
-
#ifdef QT_NO_QOBJECT
NS(QByteArray) normalizedTypeName = typeName;
#else
NS(QByteArray) normalizedTypeName = QMetaObject::normalizedType(typeName);
#endif
+ return registerNormalizedType(normalizedTypeName, deleter, creator, destructor, constructor, size, flags, metaObject);
+}
+
+
+/*! \internal
+ \since 5.0
+
+ Registers a user type for marshalling, with \a normalizedTypeName, a \a
+ deleter, a \a creator, a \a destructor, a \a constructor, and
+ a \a size. Returns the type's handle, or -1 if the type could
+ not be registered. Note that normalizedTypeName is not checked for
+ conformance with Qt's normalized format, so it must already
+ conform.
+ */
+int QMetaType::registerNormalizedType(const NS(QByteArray) &normalizedTypeName, Deleter deleter,
+ Creator creator,
+ Destructor destructor,
+ Constructor constructor,
+ int size, TypeFlags flags, const QMetaObject *metaObject)
+{
+ Q_UNUSED(metaObject);
+ QVector<QCustomTypeInfo> *ct = customTypes();
+ if (!ct || normalizedTypeName.isEmpty() || !deleter || !creator || !destructor || !constructor)
+ return -1;
+
int idx = qMetaTypeStaticType(normalizedTypeName.constData(),
normalizedTypeName.size());
@@ -521,16 +534,28 @@ int QMetaType::registerType(const char *typeName, Deleter deleter,
*/
int QMetaType::registerTypedef(const char* typeName, int aliasId)
{
- QVector<QCustomTypeInfo> *ct = customTypes();
- if (!ct || !typeName)
- return -1;
-
#ifdef QT_NO_QOBJECT
NS(QByteArray) normalizedTypeName = typeName;
#else
NS(QByteArray) normalizedTypeName = QMetaObject::normalizedType(typeName);
#endif
+ return registerNormalizedTypedef(normalizedTypeName, aliasId);
+}
+
+/*! \internal
+ \since 5.0
+
+ Registers a user type for marshalling, as an alias of another type (typedef).
+ Note that normalizedTypeName is not checked for conformance with Qt's normalized format,
+ so it must already conform.
+*/
+int QMetaType::registerNormalizedTypedef(const NS(QByteArray) &normalizedTypeName, int aliasId)
+{
+ QVector<QCustomTypeInfo> *ct = customTypes();
+ if (!ct || normalizedTypeName.isEmpty())
+ return -1;
+
int idx = qMetaTypeStaticType(normalizedTypeName.constData(),
normalizedTypeName.size());
@@ -581,26 +606,26 @@ bool QMetaType::isRegistered(int type)
}
/*!
- Returns a handle to the type called \a typeName, or QMetaType::UnknownType if there is
- no such type.
+ \internal
- \sa isRegistered(), typeName(), Type
+ Implementation of QMetaType::type().
*/
-int QMetaType::type(const char *typeName)
+template <int tryNormalizedType>
+static inline int qMetaTypeTypeImpl(const char *typeName)
{
int length = qstrlen(typeName);
if (!length)
- return UnknownType;
+ return QMetaType::UnknownType;
int type = qMetaTypeStaticType(typeName, length);
- if (type == UnknownType) {
+ if (type == QMetaType::UnknownType) {
QReadLocker locker(customTypesLock());
type = qMetaTypeCustomType_unlocked(typeName, length);
#ifndef QT_NO_QOBJECT
- if (type == UnknownType) {
+ if ((type == QMetaType::UnknownType) && tryNormalizedType) {
const NS(QByteArray) normalizedTypeName = QMetaObject::normalizedType(typeName);
type = qMetaTypeStaticType(normalizedTypeName.constData(),
normalizedTypeName.size());
- if (type == UnknownType) {
+ if (type == QMetaType::UnknownType) {
type = qMetaTypeCustomType_unlocked(normalizedTypeName.constData(),
normalizedTypeName.size());
}
@@ -610,6 +635,29 @@ int QMetaType::type(const char *typeName)
return type;
}
+/*!
+ Returns a handle to the type called \a typeName, or QMetaType::UnknownType if there is
+ no such type.
+
+ \sa isRegistered(), typeName(), Type
+*/
+int QMetaType::type(const char *typeName)
+{
+ return qMetaTypeTypeImpl</*tryNormalizedType=*/true>(typeName);
+}
+
+/*!
+ \a internal
+
+ Similar to QMetaType::type(); the only difference is that this function
+ doesn't attempt to normalize the type name (i.e., the lookup will fail
+ for type names in non-normalized form).
+*/
+int qMetaTypeTypeInternal(const char *typeName)
+{
+ return qMetaTypeTypeImpl</*tryNormalizedType=*/false>(typeName);
+}
+
#ifndef QT_NO_DATASTREAM
/*!
Writes the object pointed to by \a data with the ID \a type to
@@ -1486,12 +1534,12 @@ QMetaType::TypeFlags QMetaType::typeFlags(int type)
This example registers the class \c{MyClass}:
- \snippet doc/src/snippets/code/src_corelib_kernel_qmetatype.cpp 4
+ \snippet code/src_corelib_kernel_qmetatype.cpp 4
This function is useful to register typedefs so they can be used
by QMetaProperty, or in QueuedConnections
- \snippet doc/src/snippets/code/src_corelib_kernel_qmetatype.cpp 9
+ \snippet code/src_corelib_kernel_qmetatype.cpp 9
\sa qRegisterMetaTypeStreamOperators(), QMetaType::isRegistered(),
Q_DECLARE_METATYPE()
@@ -1509,11 +1557,11 @@ QMetaType::TypeFlags QMetaType::typeFlags(int type)
QMetaType::save(). These functions are used when streaming a
QVariant.
- \snippet doc/src/snippets/code/src_corelib_kernel_qmetatype.cpp 5
+ \snippet code/src_corelib_kernel_qmetatype.cpp 5
The stream operators should have the following signatures:
- \snippet doc/src/snippets/code/src_corelib_kernel_qmetatype.cpp 6
+ \snippet code/src_corelib_kernel_qmetatype.cpp 6
\sa qRegisterMetaType(), QMetaType::isRegistered(), Q_DECLARE_METATYPE()
*/
@@ -1548,7 +1596,7 @@ QMetaType::TypeFlags QMetaType::typeFlags(int type)
Example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qmetatype.cpp 7
+ \snippet code/src_corelib_kernel_qmetatype.cpp 7
To use the type \c T in QVariant, using Q_DECLARE_METATYPE() is
sufficient. To use the type \c T in queued signal and slot connections,
@@ -1574,7 +1622,7 @@ QMetaType::TypeFlags QMetaType::typeFlags(int type)
Typical usage:
- \snippet doc/src/snippets/code/src_corelib_kernel_qmetatype.cpp 8
+ \snippet code/src_corelib_kernel_qmetatype.cpp 8
QMetaType::type() returns the same ID as qMetaTypeId(), but does
a lookup at runtime based on the name of the type.
diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h
index 21f4bc7afe..595da53562 100644
--- a/src/corelib/kernel/qmetatype.h
+++ b/src/corelib/kernel/qmetatype.h
@@ -45,8 +45,11 @@
#include <QtCore/qglobal.h>
#include <QtCore/qatomic.h>
#include <QtCore/qbytearray.h>
+#include <QtCore/qvarlengtharray.h>
#include <QtCore/qisenum.h>
-
+#ifndef QT_NO_QOBJECT
+#include <QtCore/qobjectdefs.h>
+#endif
#include <new>
#ifdef Bool
@@ -195,6 +198,8 @@ class Q_CORE_EXPORT QMetaType {
FlagsEx = 0x100
};
public:
+#ifndef Q_QDOC
+ // The code that actually gets compiled.
enum Type {
// these are merged with QVariant
QT_FOR_EACH_STATIC_TYPE(QT_DEFINE_METATYPE_ID)
@@ -212,6 +217,29 @@ public:
UnknownType = 0,
User = 1024
};
+#else
+ // If we are using QDoc it fakes the Type enum looks like this.
+ enum Type {
+ Void = 0, Bool = 1, Int = 2, UInt = 3, LongLong = 4, ULongLong = 5,
+ Double = 6, Long = 32, Short = 33, Char = 34, ULong = 35, UShort = 36,
+ UChar = 37, Float = 38,
+ VoidStar = 31,
+ QChar = 7, QString = 10, QStringList = 11, QByteArray = 12,
+ QBitArray = 13, QDate = 14, QTime = 15, QDateTime = 16, QUrl = 17,
+ QLocale = 18, QRect = 19, QRectF = 20, QSize = 21, QSizeF = 22,
+ QLine = 23, QLineF = 24, QPoint = 25, QPointF = 26, QRegExp = 27,
+ QEasingCurve = 29, QUuid = 30, QVariant = 41, QModelIndex = 42,
+ QObjectStar = 39, QWidgetStar = 40,
+ QVariantMap = 8, QVariantList = 9, QVariantHash = 28,
+ QFont = 64, QPixmap = 65, QBrush = 66, QColor = 67, QPalette = 68,
+ QImage = 69, QPolygon = 70, QRegion = 71, QBitmap = 72, QCursor = 73,
+ QKeySequence = 74, QPen = 75, QTextLength = 76, QTextFormat = 77,
+ QMatrix = 78, QTransform = 79, QMatrix4x4 = 80, QVector2D = 81,
+ QVector3D = 82, QVector4D = 83, QQuaternion = 84, QPolygonF = 85,
+ QIcon = 120, QSizePolicy = 121,
+ User = 256
+ };
+#endif
enum TypeFlag {
NeedsConstruction = 0x1,
@@ -245,7 +273,15 @@ public:
int size,
QMetaType::TypeFlags flags,
const QMetaObject *metaObject);
+ static int registerNormalizedType(const QT_PREPEND_NAMESPACE(QByteArray) &normalizedTypeName, Deleter deleter,
+ Creator creator,
+ Destructor destructor,
+ Constructor constructor,
+ int size,
+ QMetaType::TypeFlags flags,
+ const QMetaObject *metaObject);
static int registerTypedef(const char *typeName, int aliasId);
+ static int registerNormalizedTypedef(const QT_PREPEND_NAMESPACE(QByteArray) &normalizedTypeName, int aliasId);
static int type(const char *typeName);
static const char *typeName(int type);
static int sizeOf(int type);
@@ -480,7 +516,7 @@ namespace QtPrivate {
}
template <typename T>
-int qRegisterMetaType(const char *typeName
+int qRegisterNormalizedMetaType(const QT_PREPEND_NAMESPACE(QByteArray) &normalizedTypeName
#ifndef qdoc
, T * dummy = 0
#endif
@@ -488,10 +524,10 @@ int qRegisterMetaType(const char *typeName
{
const int typedefOf = dummy ? -1 : QtPrivate::QMetaTypeIdHelper<T>::qt_metatype_id();
if (typedefOf != -1)
- return QMetaType::registerTypedef(typeName, typedefOf);
+ return QMetaType::registerNormalizedTypedef(normalizedTypeName, typedefOf);
QMetaType::TypeFlags flags(QtPrivate::QMetaTypeTypeFlags<T>::Flags);
- return QMetaType::registerType(typeName, qMetaTypeDeleteHelper<T>,
+ return QMetaType::registerNormalizedType(normalizedTypeName, qMetaTypeDeleteHelper<T>,
qMetaTypeCreateHelper<T>,
qMetaTypeDestructHelper<T>,
qMetaTypeConstructHelper<T>,
@@ -500,6 +536,21 @@ int qRegisterMetaType(const char *typeName
QtPrivate::MetaObjectForType<T>::value());
}
+template <typename T>
+int qRegisterMetaType(const char *typeName
+#ifndef qdoc
+ , T * dummy = 0
+#endif
+)
+{
+#ifdef QT_NO_QOBJECT
+ QT_PREPEND_NAMESPACE(QByteArray) normalizedTypeName = typeName;
+#else
+ QT_PREPEND_NAMESPACE(QByteArray) normalizedTypeName = QMetaObject::normalizedType(typeName);
+#endif
+ return qRegisterNormalizedMetaType<T>(normalizedTypeName, dummy);
+}
+
#ifndef QT_NO_DATASTREAM
template <typename T>
void qRegisterMetaTypeStreamOperators(const char *typeName
@@ -548,9 +599,14 @@ struct QMetaTypeIdQObject<T*, /* isPointerToTypeDerivedFromQObject */ true>
static int qt_metatype_id()
{
static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0);
- if (!metatype_id.load())
- metatype_id.storeRelease(qRegisterMetaType<T*>(QByteArray(T::staticMetaObject.className() + QByteArrayLiteral("*")).constData(),
+ if (!metatype_id.load()) {
+ const int len = int(strlen(T::staticMetaObject.className()));
+ QVarLengthArray<char, 16> classNameStar;
+ classNameStar.append(T::staticMetaObject.className(), len);
+ classNameStar.append("*\0", 2);
+ metatype_id.storeRelease(qRegisterMetaType<T*>(classNameStar.constData(),
reinterpret_cast<T**>(quintptr(-1))));
+ }
return metatype_id.loadAcquire();
}
};
@@ -687,6 +743,7 @@ inline QMetaType::QMetaType(const ExtensionFlag extensionFlags, const QMetaTypeI
, m_loadOp(loadOp)
, m_constructor(constructor)
, m_destructor(destructor)
+ , m_extension(0)
, m_size(size)
, m_typeFlags(theTypeFlags)
, m_extensionFlags(extensionFlags)
diff --git a/src/corelib/kernel/qmetatype_p.h b/src/corelib/kernel/qmetatype_p.h
index 74229d3f3c..b593489963 100644
--- a/src/corelib/kernel/qmetatype_p.h
+++ b/src/corelib/kernel/qmetatype_p.h
@@ -60,7 +60,7 @@ QT_BEGIN_NAMESPACE
namespace QModulesPrivate {
enum Names { Core, Gui, Widgets, Unknown, ModulesCount /* ModulesCount has to be at the end */ };
-static inline int moduleForType(const int typeId)
+static inline int moduleForType(const uint typeId)
{
if (typeId <= QMetaType::LastCoreType)
return Core;
diff --git a/src/corelib/kernel/qmimedata.cpp b/src/corelib/kernel/qmimedata.cpp
index 3a3464e43e..c18ce22247 100644
--- a/src/corelib/kernel/qmimedata.cpp
+++ b/src/corelib/kernel/qmimedata.cpp
@@ -257,7 +257,7 @@ QVariant QMimeDataPrivate::retrieveTypedData(const QString &format, QVariant::Ty
For example, if your write a widget that accepts URL drags, you
would end up writing code like this:
- \snippet doc/src/snippets/code/src_corelib_kernel_qmimedata.cpp 0
+ \snippet code/src_corelib_kernel_qmimedata.cpp 0
There are three approaches for storing custom data in a QMimeData
object:
@@ -266,7 +266,7 @@ QVariant QMimeDataPrivate::retrieveTypedData(const QString &format, QVariant::Ty
\li Custom data can be stored directly in a QMimeData object as a
QByteArray using setData(). For example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qmimedata.cpp 1
+ \snippet code/src_corelib_kernel_qmimedata.cpp 1
\li We can subclass QMimeData and reimplement hasFormat(),
formats(), and retrieveData().
@@ -276,7 +276,7 @@ QVariant QMimeDataPrivate::retrieveTypedData(const QString &format, QVariant::Ty
it, and use a qobject_cast() in the receiver's drop event
handler. For example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qmimedata.cpp 2
+ \snippet code/src_corelib_kernel_qmimedata.cpp 2
\endlist
\section1 Platform-Specific MIME Types
@@ -286,11 +286,11 @@ QVariant QMimeDataPrivate::retrieveTypedData(const QString &format, QVariant::Ty
indicate that they represent data in non-standard formats.
The formats will take the following form:
- \snippet doc/src/snippets/code/src_corelib_kernel_qmimedata.cpp 3
+ \snippet code/src_corelib_kernel_qmimedata.cpp 3
The following are examples of custom MIME types:
- \snippet doc/src/snippets/code/src_corelib_kernel_qmimedata.cpp 4
+ \snippet code/src_corelib_kernel_qmimedata.cpp 4
The \c value declaration of each format describes the way in which the
data is encoded.
@@ -458,7 +458,7 @@ bool QMimeData::hasHtml() const
library, whereas QImage belongs to \l QtGui. To convert the
QVariant to a QImage, simply use qvariant_cast(). For example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qmimedata.cpp 5
+ \snippet code/src_corelib_kernel_qmimedata.cpp 5
\sa hasImage()
*/
@@ -475,7 +475,7 @@ QVariant QMimeData::imageData() const
library, whereas QImage belongs to \l QtGui. The conversion
from QImage to QVariant is implicit. For example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qmimedata.cpp 6
+ \snippet code/src_corelib_kernel_qmimedata.cpp 6
\sa hasImage(), setData()
*/
@@ -505,7 +505,7 @@ bool QMimeData::hasImage() const
library, whereas QColor belongs to \l QtGui. To convert the
QVariant to a QColor, simply use qvariant_cast(). For example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qmimedata.cpp 7
+ \snippet code/src_corelib_kernel_qmimedata.cpp 7
\sa hasColor(), setColorData(), data()
*/
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index fb3e4e396b..49a9beb298 100644
--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -184,6 +184,7 @@ void (*QAbstractDeclarativeData::destroyed)(QAbstractDeclarativeData *, QObject
void (*QAbstractDeclarativeData::parentChanged)(QAbstractDeclarativeData *, QObject *, QObject *) = 0;
void (*QAbstractDeclarativeData::objectNameChanged)(QAbstractDeclarativeData *, QObject *) = 0;
void (*QAbstractDeclarativeData::signalEmitted)(QAbstractDeclarativeData *, QObject *, int, void **) = 0;
+int (*QAbstractDeclarativeData::receivers)(QAbstractDeclarativeData *, const QObject *, int) = 0;
QObjectData::~QObjectData() {}
@@ -568,9 +569,9 @@ void QMetaCallEvent::placeMetaCall(QObject *object)
\l uic generates code that invokes this function to enable
auto-connection to be performed between widgets on forms created
- with \QD. More information about using auto-connection with \QD is
+ with \e{Qt Designer}. More information about using auto-connection with \e{Qt Designer} is
given in the \l{Using a Designer UI File in Your Application} section of
- the \QD manual.
+ the \e{Qt Designer} manual.
\section1 Dynamic Properties
@@ -606,7 +607,7 @@ void QMetaCallEvent::placeMetaCall(QObject *object)
Returns 0 if there is no such child.
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 0
+ \snippet code/src_corelib_kernel_qobject.cpp 0
*/
void *qt_find_obj_child(QObject *parent, const char *type, const QString &name)
@@ -651,8 +652,8 @@ static bool check_parent_thread(QObject *parent,
Constructs an object with parent object \a parent.
The parent of an object may be viewed as the object's owner. For
- instance, a \l{QDialog}{dialog box} is the parent of the \gui OK
- and \gui Cancel buttons it contains.
+ instance, a \l{QDialog}{dialog box} is the parent of the \uicontrol{OK}
+ and \uicontrol{Cancel} buttons it contains.
The destructor of a parent object destroys all child objects.
@@ -881,7 +882,7 @@ QObjectPrivate::Connection::~Connection()
Example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 1
+ \snippet code/src_corelib_kernel_qobject.cpp 1
\sa staticMetaObject
*/
@@ -905,7 +906,7 @@ QObjectPrivate::Connection::~Connection()
Example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 2
+ \snippet code/src_corelib_kernel_qobject.cpp 2
\sa metaObject()
*/
@@ -924,7 +925,7 @@ QObjectPrivate::Connection::~Connection()
Example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 3
+ \snippet code/src_corelib_kernel_qobject.cpp 3
The qobject_cast() function behaves similarly to the standard C++
\c dynamic_cast(), with the advantages that it doesn't require
@@ -950,7 +951,7 @@ QObjectPrivate::Connection::~Connection()
Example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 4
+ \snippet code/src_corelib_kernel_qobject.cpp 4
If you need to determine whether an object is an instance of a particular
class for the purpose of casting it, consider using qobject_cast<Type *>(object)
@@ -967,7 +968,7 @@ QObjectPrivate::Connection::~Connection()
You can find an object by name (and type) using findChild().
You can find a set of objects with findChildren().
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 5
+ \snippet code/src_corelib_kernel_qobject.cpp 5
By default, this property contains an empty string.
@@ -988,7 +989,7 @@ void QObject::setObjectName(const QString &name)
Q_D(QObject);
if (d->objectName != name) {
d->objectName = name;
- if (d->declarativeData)
+ if (d->declarativeData && d->declarativeData->objectNameChanged)
d->declarativeData->objectNameChanged(d->declarativeData, this);
emit objectNameChanged(d->objectName);
}
@@ -1155,7 +1156,7 @@ void QObject::customEvent(QEvent * /* event */)
true; otherwise return false.
Example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 6
+ \snippet code/src_corelib_kernel_qobject.cpp 6
Notice in the example above that unhandled events are passed to
the base class's eventFilter() function, since the base class
@@ -1225,7 +1226,7 @@ QThread *QObject::thread() const
QApplication::thread() to retrieve the thread in which the
application lives. For example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 7
+ \snippet code/src_corelib_kernel_qobject.cpp 7
If \a targetThread is zero, all event processing for this object
and its children stops.
@@ -1390,7 +1391,7 @@ void QObjectPrivate::_q_reregisterTimers(void *pointer)
Example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 8
+ \snippet code/src_corelib_kernel_qobject.cpp 8
Note that QTimer's accuracy depends on the underlying operating system and
hardware. The \a timerType argument allows you to customize the accuracy of
@@ -1472,7 +1473,7 @@ void QObject::killTimer(int id)
The QObjectList class is defined in the \c{<QObject>} header
file as the following:
- \quotefromfile src/corelib/kernel/qobject.h
+ \quotefromfile kernel/qobject.h
\skipto /typedef .*QObjectList/
\printuntil QObjectList
@@ -1507,21 +1508,21 @@ void QObject::killTimer(int id)
named \c{"button1"}, even if the button isn't a direct child of
the parent:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 10
+ \snippet code/src_corelib_kernel_qobject.cpp 10
This example returns a \l{QListWidget} child of \c{parentWidget}:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 11
+ \snippet code/src_corelib_kernel_qobject.cpp 11
This example returns a child \l{QPushButton} of \c{parentWidget}
(its direct parent) named \c{"button1"}:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 41
+ \snippet code/src_corelib_kernel_qobject.cpp 41
This example returns a \l{QListWidget} child of \c{parentWidget},
its direct parent:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 42
+ \snippet code/src_corelib_kernel_qobject.cpp 42
\sa findChildren()
*/
@@ -1538,15 +1539,15 @@ void QObject::killTimer(int id)
The following example shows how to find a list of child \l{QWidget}s of
the specified \c{parentWidget} named \c{widgetname}:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 12
+ \snippet code/src_corelib_kernel_qobject.cpp 12
This example returns all \c{QPushButton}s that are children of \c{parentWidget}:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 13
+ \snippet code/src_corelib_kernel_qobject.cpp 13
This example returns all \c{QPushButton}s that are immediate children of \c{parentWidget}:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 43
+ \snippet code/src_corelib_kernel_qobject.cpp 43
\sa findChild()
*/
@@ -1653,10 +1654,11 @@ void qt_qFindChildren_helper(const QObject *parent, const QRegExp &re,
if (!parent || !list)
return;
const QObjectList &children = parent->children();
+ QRegExp reCopy = re;
QObject *obj;
for (int i = 0; i < children.size(); ++i) {
obj = children.at(i);
- if (mo.cast(obj) && re.indexIn(obj->objectName()) != -1)
+ if (mo.cast(obj) && reCopy.indexIn(obj->objectName()) != -1)
list->append(obj);
if (options & Qt::FindChildrenRecursively)
@@ -1791,7 +1793,7 @@ void QObjectPrivate::setParent_helper(QObject *o)
\fn void QObject::installEventFilter(QObject *filterObj)
Installs an event filter \a filterObj on this object. For example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 14
+ \snippet code/src_corelib_kernel_qobject.cpp 14
An event filter is an object that receives all events that are
sent to this object. The filter can either stop the event or
@@ -1806,11 +1808,11 @@ void QObjectPrivate::setParent_helper(QObject *o)
Here's a \c KeyPressEater class that eats the key presses of its
monitored objects:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 15
+ \snippet code/src_corelib_kernel_qobject.cpp 15
And here's how to install it on two widgets:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 16
+ \snippet code/src_corelib_kernel_qobject.cpp 16
The QShortcut class, for example, uses this technique to intercept
shortcut key presses.
@@ -1925,7 +1927,7 @@ void QObject::deleteLater()
Example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 17
+ \snippet code/src_corelib_kernel_qobject.cpp 17
\dots
See \l{Writing Source Code for Translation} for a detailed description of
@@ -1959,7 +1961,7 @@ void QObject::deleteLater()
escape sequences for specifying non-ASCII characters in string
literals to trUtf8(). For example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 20
+ \snippet code/src_corelib_kernel_qobject.cpp 20
\sa tr(), QApplication::translate(), {Internationalization with Qt}
*/
@@ -2153,15 +2155,14 @@ int QObject::senderSignalIndex() const
When calling this function, you can use the \c SIGNAL() macro to
pass a specific signal:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 21
-
- As the code snippet above illustrates, you can use this function
- to avoid emitting a signal that nobody listens to.
+ \snippet code/src_corelib_kernel_qobject.cpp 21
\warning This function violates the object-oriented principle of
modularity. However, it might be useful when you need to perform
expensive initialization only if something is connected to a
signal.
+
+ \sa isSignalConnected()
*/
int QObject::receivers(const char *signal) const
@@ -2181,10 +2182,17 @@ int QObject::receivers(const char *signal) const
#ifndef QT_NO_DEBUG
err_method_notfound(this, signal-1, "receivers");
#endif
- return false;
+ return 0;
}
- Q_D(const QObject);
+ if (d->declarativeData && QAbstractDeclarativeData::receivers) {
+ receivers += QAbstractDeclarativeData::receivers(d->declarativeData, this,
+ metaObject()->indexOfMethod(signal));
+ }
+
+ if (!d->isSignalConnected(signal_index))
+ return receivers;
+
QMutexLocker locker(signalSlotLock(this));
if (d->connectionLists) {
if (signal_index < d->connectionLists->count()) {
@@ -2201,6 +2209,60 @@ int QObject::receivers(const char *signal) const
}
/*!
+ \since 5.0
+ Returns true if the \a signal is connected to at least one receiver,
+ otherwise returns false.
+
+ \a signal must be a signal member of this object, otherwise the behaviour
+ is undefined.
+
+ \snippet code/src_corelib_kernel_qobject.cpp 21
+
+ As the code snippet above illustrates, you can use this function
+ to avoid emitting a signal that nobody listens to.
+
+ \warning This function violates the object-oriented principle of
+ modularity. However, it might be useful when you need to perform
+ expensive initialization only if something is connected to a
+ signal.
+*/
+bool QObject::isSignalConnected(const QMetaMethod &signal) const
+{
+ Q_D(const QObject);
+ if (!signal.mobj)
+ return false;
+
+ Q_ASSERT_X(signal.mobj->cast(this) && signal.methodType() == QMetaMethod::Signal,
+ "QObject::isSignalConnected" , "the parametter must be a signal member of the object");
+ uint signalIndex = (signal.handle - QMetaObjectPrivate::get(signal.mobj)->methodData)/5;
+
+ if (signal.mobj->d.data[signal.handle + 4] & MethodCloned)
+ signalIndex = QMetaObjectPrivate::originalClone(signal.mobj, signalIndex);
+
+ int signalOffset;
+ int methodOffset;
+ computeOffsets(signal.mobj, &signalOffset, &methodOffset);
+ signalIndex += signalOffset;
+
+ if (signalIndex < sizeof(d->connectedSignals) * 8)
+ return d->isSignalConnected(signalIndex);
+
+ QMutexLocker locker(signalSlotLock(this));
+ if (d->connectionLists) {
+ if (signalIndex < uint(d->connectionLists->count())) {
+ const QObjectPrivate::Connection *c =
+ d->connectionLists->at(signalIndex).first;
+ while (c) {
+ if (c->receiver)
+ return true;
+ c = c->nextConnectionList;
+ }
+ }
+ }
+ return false;
+}
+
+/*!
\internal
This helper function calculates signal and method index for the given
@@ -2278,18 +2340,18 @@ static inline void check_and_warn_compat(const QMetaObject *sender, const QMetaM
You must use the \c SIGNAL() and \c SLOT() macros when specifying
the \a signal and the \a method, for example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 22
+ \snippet code/src_corelib_kernel_qobject.cpp 22
This example ensures that the label always displays the current
scroll bar value. Note that the signal and slots parameters must not
contain any variable names, only the type. E.g. the following would
not work and return false:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 23
+ \snippet code/src_corelib_kernel_qobject.cpp 23
A signal can also be connected to another signal:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 24
+ \snippet code/src_corelib_kernel_qobject.cpp 24
In this example, the \c MyWidget constructor relays a signal from
a private member variable, and makes it available under a name
@@ -2326,7 +2388,7 @@ static inline void check_and_warn_compat(const QMetaObject *sender, const QMetaM
scenes. If you try to use a queued connection and get the error
message
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 25
+ \snippet code/src_corelib_kernel_qobject.cpp 25
call qRegisterMetaType() to register the data type before you
establish the connection.
@@ -2376,7 +2438,6 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const char *sign
signal_index = QMetaObjectPrivate::originalClone(smeta, signal_index);
int signalOffset, methodOffset;
computeOffsets(smeta, &signalOffset, &methodOffset);
- int signal_absolute_index = signal_index + methodOffset;
signal_index += signalOffset;
QByteArray tmp_method_name;
@@ -2445,12 +2506,12 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const char *sign
}
#ifndef QT_NO_DEBUG
- QMetaMethod smethod = smeta->method(signal_absolute_index);
+ QMetaMethod smethod = QMetaObjectPrivate::signal(smeta, signal_index);
QMetaMethod rmethod = rmeta->method(method_index_relative + rmeta->methodOffset());
check_and_warn_compat(smeta, smethod, rmeta, rmethod);
#endif
QMetaObject::Connection handle = QMetaObject::Connection(QMetaObjectPrivate::connect(
- sender, signal_index, receiver, method_index_relative, rmeta ,type, types));
+ sender, signal_index, smeta, receiver, method_index_relative, rmeta ,type, types));
if (handle)
const_cast<QObject*>(sender)->connectNotify(signal - 1);
return handle;
@@ -2538,7 +2599,7 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMetho
check_and_warn_compat(smeta, signal, rmeta, method);
#endif
QMetaObject::Connection handle = QMetaObject::Connection(QMetaObjectPrivate::connect(
- sender, signal_index, receiver, method_index, 0, type, types));
+ sender, signal_index, signal.enclosingMetaObject(), receiver, method_index, 0, type, types));
if (handle)
const_cast<QObject*>(sender)->connectNotify(signalSignature.constData());
return handle;
@@ -2575,27 +2636,27 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMetho
\list 1
\li Disconnect everything connected to an object's signals:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 26
+ \snippet code/src_corelib_kernel_qobject.cpp 26
equivalent to the non-static overloaded function
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 27
+ \snippet code/src_corelib_kernel_qobject.cpp 27
\li Disconnect everything connected to a specific signal:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 28
+ \snippet code/src_corelib_kernel_qobject.cpp 28
equivalent to the non-static overloaded function
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 29
+ \snippet code/src_corelib_kernel_qobject.cpp 29
\li Disconnect a specific receiver:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 30
+ \snippet code/src_corelib_kernel_qobject.cpp 30
equivalent to the non-static overloaded function
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 31
+ \snippet code/src_corelib_kernel_qobject.cpp 31
\endlist
@@ -2697,7 +2758,7 @@ bool QObject::disconnect(const QObject *sender, const char *signal,
}
if (!method) {
- res |= QMetaObjectPrivate::disconnect(sender, signal_index, receiver, -1, 0);
+ res |= QMetaObjectPrivate::disconnect(sender, signal_index, smeta, receiver, -1, 0);
} else {
const QMetaObject *rmeta = receiver->metaObject();
do {
@@ -2708,7 +2769,7 @@ bool QObject::disconnect(const QObject *sender, const char *signal,
rmeta = rmeta->superClass();
if (method_index < 0)
break;
- res |= QMetaObjectPrivate::disconnect(sender, signal_index, receiver, method_index, 0);
+ res |= QMetaObjectPrivate::disconnect(sender, signal_index, smeta, receiver, method_index, 0);
method_found = true;
} while ((rmeta = rmeta->superClass()));
}
@@ -2721,8 +2782,11 @@ bool QObject::disconnect(const QObject *sender, const char *signal,
err_method_notfound(receiver, method_arg, "disconnect");
err_info_about_objects("disconnect", sender, receiver);
}
- if (res)
+ if (res) {
+ if (!signal)
+ const_cast<QObject*>(sender)->disconnectNotify(QMetaMethod());
const_cast<QObject*>(sender)->disconnectNotify(signal ? (signal - 1) : 0);
+ }
return res;
}
@@ -2807,9 +2871,16 @@ bool QObject::disconnect(const QObject *sender, const QMetaMethod &signal,
return false;
}
- if (!QMetaObjectPrivate::disconnect(sender, signal_index, receiver, method_index, 0))
+ if (!QMetaObjectPrivate::disconnect(sender, signal_index, signal.mobj, receiver, method_index, 0))
return false;
+ if (!signal.isValid()) {
+ // The signal is a wildcard, meaning all signals were disconnected.
+ // QMetaObjectPrivate::disconnect() doesn't call disconnectNotify()
+ // per connection in this case. Call it once now, with an invalid
+ // QMetaMethod as argument, as documented.
+ const_cast<QObject*>(sender)->disconnectNotify(signal);
+ }
const_cast<QObject*>(sender)->disconnectNotify(method.mobj ? signalSignature.constData() : 0);
return true;
}
@@ -2840,18 +2911,30 @@ bool QObject::disconnect(const QObject *sender, const QMetaMethod &signal,
/*!
\fn void QObject::connectNotify(const char *signal)
+ \obsolete
+*/
+void QObject::connectNotify(const char *)
+{
+}
+
+/*!
+ \fn void QObject::disconnectNotify(const char *signal)
+ \obsolete
+*/
+void QObject::disconnectNotify(const char *)
+{
+}
+
+/*!
+ \since 5.0
This virtual function is called when something has been connected
to \a signal in this object.
- If you want to compare \a signal with a specific signal, use
- QLatin1String and the \c SIGNAL() macro as follows:
-
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 32
+ If you want to compare \a signal with a specific signal, you can
+ use QMetaMethod::fromSignal() as follows:
- If the signal contains multiple parameters or parameters that
- contain spaces, call QMetaObject::normalizedSignature() on
- the result of the \c SIGNAL() macro.
+ \snippet code/src_corelib_kernel_qobject.cpp 32
\warning This function violates the object-oriented principle of
modularity. However, it might be useful when you need to perform
@@ -2861,12 +2944,13 @@ bool QObject::disconnect(const QObject *sender, const QMetaMethod &signal,
\sa connect(), disconnectNotify()
*/
-void QObject::connectNotify(const char *)
+void QObject::connectNotify(const QMetaMethod &signal)
{
+ Q_UNUSED(signal);
}
/*!
- \fn void QObject::disconnectNotify(const char *signal)
+ \since 5.0
This virtual function is called when something has been
disconnected from \a signal in this object.
@@ -2874,6 +2958,11 @@ void QObject::connectNotify(const char *)
See connectNotify() for an example of how to compare
\a signal with a specific signal.
+ If all signals were disconnected from this object (e.g., the
+ signal argument to disconnect() was 0), disconnectNotify()
+ is only called once, and the \a signal will be an invalid
+ QMetaMethod (QMetaMethod::isValid() returns false).
+
\warning This function violates the object-oriented principle of
modularity. However, it might be useful for optimizing access to
expensive resources.
@@ -2881,17 +2970,19 @@ void QObject::connectNotify(const char *)
\sa disconnect(), connectNotify()
*/
-void QObject::disconnectNotify(const char *)
+void QObject::disconnectNotify(const QMetaMethod &signal)
{
+ Q_UNUSED(signal);
}
/* \internal
convert a signal index from the method range to the signal range
*/
-static int methodIndexToSignalIndex(const QMetaObject *metaObject, int signal_index)
+static int methodIndexToSignalIndex(const QMetaObject **base, int signal_index)
{
if (signal_index < 0)
return signal_index;
+ const QMetaObject *metaObject = *base;
while (metaObject && metaObject->methodOffset() > signal_index)
metaObject = metaObject->superClass();
@@ -2902,6 +2993,7 @@ static int methodIndexToSignalIndex(const QMetaObject *metaObject, int signal_in
signal_index = QMetaObjectPrivate::originalClone(metaObject, signal_index - methodOffset) + signalOffset;
else
signal_index = signal_index - methodOffset + signalOffset;
+ *base = metaObject;
}
return signal_index;
}
@@ -2916,8 +3008,9 @@ static int methodIndexToSignalIndex(const QMetaObject *metaObject, int signal_in
QMetaObject::Connection QMetaObject::connect(const QObject *sender, int signal_index,
const QObject *receiver, int method_index, int type, int *types)
{
- signal_index = methodIndexToSignalIndex(sender->metaObject(), signal_index);
- return Connection(QMetaObjectPrivate::connect(sender, signal_index,
+ const QMetaObject *smeta = sender->metaObject();
+ signal_index = methodIndexToSignalIndex(&smeta, signal_index);
+ return Connection(QMetaObjectPrivate::connect(sender, signal_index, smeta,
receiver, method_index,
0, //FIXME, we could speed this connection up by computing the relative index
type, types));
@@ -2930,7 +3023,8 @@ QMetaObject::Connection QMetaObject::connect(const QObject *sender, int signal_i
the QObjectPrivate::Connection* has a refcount of 2, so it must be passed to a QMetaObject::Connection
*/
-QObjectPrivate::Connection *QMetaObjectPrivate::connect(const QObject *sender, int signal_index,
+QObjectPrivate::Connection *QMetaObjectPrivate::connect(const QObject *sender,
+ int signal_index, const QMetaObject *smeta,
const QObject *receiver, int method_index,
const QMetaObject *rmeta, int type, int *types)
{
@@ -2940,8 +3034,7 @@ QObjectPrivate::Connection *QMetaObjectPrivate::connect(const QObject *sender, i
int method_offset = rmeta ? rmeta->methodOffset() : 0;
Q_ASSERT(!rmeta || QMetaObjectPrivate::get(rmeta)->revision >= 6);
QObjectPrivate::StaticMetaCallFunction callFunction =
- (rmeta && rmeta->d.extradata)
- ? reinterpret_cast<const QMetaObjectExtraData *>(rmeta->d.extradata)->static_metacall : 0;
+ rmeta ? rmeta->d.static_metacall : 0;
QOrderedMutexLocker locker(signalSlotLock(sender),
signalSlotLock(receiver));
@@ -2975,6 +3068,12 @@ QObjectPrivate::Connection *QMetaObjectPrivate::connect(const QObject *sender, i
c->callFunction = callFunction;
QObjectPrivate::get(s)->addConnection(signal_index, c.data());
+
+ locker.unlock();
+ QMetaMethod smethod = QMetaObjectPrivate::signal(smeta, signal_index);
+ if (smethod.isValid())
+ s->connectNotify(smethod);
+
return c.take();
}
@@ -2983,8 +3082,9 @@ QObjectPrivate::Connection *QMetaObjectPrivate::connect(const QObject *sender, i
bool QMetaObject::disconnect(const QObject *sender, int signal_index,
const QObject *receiver, int method_index)
{
- signal_index = methodIndexToSignalIndex(sender->metaObject(), signal_index);
- return QMetaObjectPrivate::disconnect(sender, signal_index,
+ const QMetaObject *smeta = sender->metaObject();
+ signal_index = methodIndexToSignalIndex(&smeta, signal_index);
+ return QMetaObjectPrivate::disconnect(sender, signal_index, smeta,
receiver, method_index, 0);
}
@@ -2997,8 +3097,9 @@ one of these connections will be removed.
bool QMetaObject::disconnectOne(const QObject *sender, int signal_index,
const QObject *receiver, int method_index)
{
- signal_index = methodIndexToSignalIndex(sender->metaObject(), signal_index);
- return QMetaObjectPrivate::disconnect(sender, signal_index,
+ const QMetaObject *smeta = sender->metaObject();
+ signal_index = methodIndexToSignalIndex(&smeta, signal_index);
+ return QMetaObjectPrivate::disconnect(sender, signal_index, smeta,
receiver, method_index, 0,
QMetaObjectPrivate::DisconnectOne);
}
@@ -3047,7 +3148,8 @@ bool QMetaObjectPrivate::disconnectHelper(QObjectPrivate::Connection *c,
/*! \internal
Same as the QMetaObject::disconnect, but \a signal_index must be the result of QObjectPrivate::signalIndex
*/
-bool QMetaObjectPrivate::disconnect(const QObject *sender, int signal_index,
+bool QMetaObjectPrivate::disconnect(const QObject *sender,
+ int signal_index, const QMetaObject *smeta,
const QObject *receiver, int method_index, void **slot,
DisconnectType disconnectType)
{
@@ -3070,9 +3172,9 @@ bool QMetaObjectPrivate::disconnect(const QObject *sender, int signal_index,
bool success = false;
if (signal_index < 0) {
// remove from all connection lists
- for (signal_index = -1; signal_index < connectionLists->count(); ++signal_index) {
+ for (int sig_index = -1; sig_index < connectionLists->count(); ++sig_index) {
QObjectPrivate::Connection *c =
- (*connectionLists)[signal_index].first;
+ (*connectionLists)[sig_index].first;
if (disconnectHelper(c, receiver, method_index, slot, senderMutex, disconnectType)) {
success = true;
connectionLists->dirty = true;
@@ -3092,6 +3194,13 @@ bool QMetaObjectPrivate::disconnect(const QObject *sender, int signal_index,
if (connectionLists->orphaned && !connectionLists->inUse)
delete connectionLists;
+ locker.unlock();
+ if (success) {
+ QMetaMethod smethod = QMetaObjectPrivate::signal(smeta, signal_index);
+ if (smethod.isValid())
+ s->disconnectNotify(smethod);
+ }
+
return success;
}
@@ -3101,13 +3210,13 @@ bool QMetaObjectPrivate::disconnect(const QObject *sender, int signal_index,
Searches recursively for all child objects of the given \a object, and connects
matching signals from them to slots of \a object that follow the following form:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 33
+ \snippet code/src_corelib_kernel_qobject.cpp 33
Let's assume our object has a child object of type QPushButton with
the \l{QObject::objectName}{object name} \c{button1}. The slot to catch the
button's \c{clicked()} signal would be:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 34
+ \snippet code/src_corelib_kernel_qobject.cpp 34
\sa QObject::setObjectName()
*/
@@ -3131,7 +3240,8 @@ void QMetaObject::connectSlotsByName(QObject *o)
int len = objName.length();
if (!len || qstrncmp(slot + 3, objName.data(), len) || slot[len+3] != '_')
continue;
- int sigIndex = co->d_func()->signalIndex(slot + len + 4);
+ const QMetaObject *smeta;
+ int sigIndex = co->d_func()->signalIndex(slot + len + 4, &smeta);
if (sigIndex < 0) { // search for compatible signals
const QMetaObject *smo = co->metaObject();
int slotlen = qstrlen(slot + len + 4) - 1;
@@ -3141,8 +3251,9 @@ void QMetaObject::connectSlotsByName(QObject *o)
continue;
if (!qstrncmp(method.methodSignature().constData(), slot + len + 4, slotlen)) {
+ smeta = method.enclosingMetaObject();
int signalOffset, methodOffset;
- computeOffsets(method.enclosingMetaObject(), &signalOffset, &methodOffset);
+ computeOffsets(smeta, &signalOffset, &methodOffset);
sigIndex = k + - methodOffset + signalOffset;
break;
}
@@ -3150,7 +3261,8 @@ void QMetaObject::connectSlotsByName(QObject *o)
}
if (sigIndex < 0)
continue;
- if (Connection(QMetaObjectPrivate::connect(co, sigIndex, o, i))) {
+
+ if (Connection(QMetaObjectPrivate::connect(co, sigIndex, smeta, o, i))) {
foundIt = true;
break;
}
@@ -3381,8 +3493,11 @@ void QMetaObject::activate(QObject *sender, int signal_index, void **argv)
It is different from QMetaObject::indexOfSignal(): indexOfSignal is the same as indexOfMethod
while QObjectPrivate::signalIndex is smaller because it doesn't give index to slots.
+
+ If \a meta is not 0, it is set to the meta-object where the signal was found.
*/
-int QObjectPrivate::signalIndex(const char *signalName) const
+int QObjectPrivate::signalIndex(const char *signalName,
+ const QMetaObject **meta) const
{
Q_Q(const QObject);
const QMetaObject *base = q->metaObject();
@@ -3396,6 +3511,8 @@ int QObjectPrivate::signalIndex(const char *signalName) const
relative_index = QMetaObjectPrivate::originalClone(base, relative_index);
int signalOffset, methodOffset;
computeOffsets(base, &signalOffset, &methodOffset);
+ if (meta)
+ *meta = base;
return relative_index + signalOffset;
}
@@ -3722,7 +3839,7 @@ QDebug operator<<(QDebug dbg, const QObject *o) {
Example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 35
+ \snippet code/src_corelib_kernel_qobject.cpp 35
\sa QMetaObject::classInfo()
*/
@@ -3736,9 +3853,9 @@ QDebug operator<<(QDebug dbg, const QObject *o) {
Example:
- \snippet examples/tools/plugandpaintplugins/basictools/basictoolsplugin.h 1
+ \snippet tools/plugandpaintplugins/basictools/basictoolsplugin.h 1
\dots
- \snippet examples/tools/plugandpaintplugins/basictools/basictoolsplugin.h 3
+ \snippet tools/plugandpaintplugins/basictools/basictoolsplugin.h 3
See the \l{tools/plugandpaintplugins/basictools}{Plug & Paint
Basic Tools} example for details.
@@ -3755,7 +3872,7 @@ QDebug operator<<(QDebug dbg, const QObject *o) {
they have additional features accessible through the \l
{Meta-Object System}.
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 36
+ \snippet code/src_corelib_kernel_qobject.cpp 36
The property name and type and the \c READ function are required.
The type can be any type supported by QVariant, or it can be a
@@ -3765,7 +3882,7 @@ QDebug operator<<(QDebug dbg, const QObject *o) {
For example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 37
+ \snippet code/src_corelib_kernel_qobject.cpp 37
For more details about how to use this macro, and a more detailed
example of its use, see the discussion on \l {Qt's Property System}.
@@ -3782,7 +3899,7 @@ QDebug operator<<(QDebug dbg, const QObject *o) {
For example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 38
+ \snippet code/src_corelib_kernel_qobject.cpp 38
If you want to register an enum that is declared in another class,
the enum must be fully qualified with the name of the class
@@ -3804,12 +3921,12 @@ QDebug operator<<(QDebug dbg, const QObject *o) {
For example, in QLibrary, the \l{QLibrary::LoadHints}{LoadHints} flag is
declared in the following way:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 39a
+ \snippet code/src_corelib_kernel_qobject.cpp 39a
The declaration of the flags themselves is performed in the public section
of the QLibrary class itself, using the \l Q_DECLARE_FLAGS() macro:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 39b
+ \snippet code/src_corelib_kernel_qobject.cpp 39b
\note This macro takes care of registering individual flag values
with the meta-object system, so it is unnecessary to use Q_ENUMS()
@@ -3828,10 +3945,10 @@ QDebug operator<<(QDebug dbg, const QObject *o) {
For example:
- \snippet doc/src/snippets/signalsandslots/signalsandslots.h 1
+ \snippet signalsandslots/signalsandslots.h 1
\codeline
- \snippet doc/src/snippets/signalsandslots/signalsandslots.h 2
- \snippet doc/src/snippets/signalsandslots/signalsandslots.h 3
+ \snippet signalsandslots/signalsandslots.h 2
+ \snippet signalsandslots/signalsandslots.h 3
\note This macro requires the class to be a subclass of QObject. Use
Q_GADGET instead of Q_OBJECT to enable the meta object system's support
@@ -3927,7 +4044,7 @@ QDebug operator<<(QDebug dbg, const QObject *o) {
be invoked via the meta-object system. The macro is written before
the return type, as shown in the following example:
- \snippet snippets/qmetaobject-invokable/window.h Window class with invokable method
+ \snippet qmetaobject-invokable/window.h Window class with invokable method
The \c invokableMethod() function is marked up using Q_INVOKABLE, causing
it to be registered with the meta-object system and enabling it to be
@@ -3968,7 +4085,7 @@ void qDeleteInEventHandler(QObject *o)
Example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 44
+ \snippet code/src_corelib_kernel_qobject.cpp 44
This example ensures that the label always displays the current
line edit text.
@@ -4003,7 +4120,7 @@ void qDeleteInEventHandler(QObject *o)
scenes. If you try to use a queued connection and get the error
message
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 25
+ \snippet code/src_corelib_kernel_qobject.cpp 25
make sure to declare the argument type with Q_DECLARE_METATYPE
*/
@@ -4029,11 +4146,11 @@ void qDeleteInEventHandler(QObject *o)
Example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 45
+ \snippet code/src_corelib_kernel_qobject.cpp 45
If your compiler support C++11 lambda expressions, you can use them:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 46
+ \snippet code/src_corelib_kernel_qobject.cpp 46
The connection will automatically disconnect if the sender is destroyed.
*/
@@ -4120,9 +4237,13 @@ QMetaObject::Connection QObject::connectImpl(const QObject *sender, void **signa
QMetaObject::Connection ret(c.take());
locker.unlock();
+ QMetaMethod method = QMetaObjectPrivate::signal(senderMetaObject, signal_index);
+ Q_ASSERT(method.isValid());
+ s->connectNotify(method);
+
// reconstruct the signature to call connectNotify
const char *sig;
- QByteArray tmp_sig = senderMetaObject->method(signal_index - signalOffset + methodOffset).methodSignature();
+ QByteArray tmp_sig = method.methodSignature();
sig = tmp_sig.constData();
QVarLengthArray<char> signalSignature(qstrlen(sig) + 2);
signalSignature.data()[0] = char(QSIGNAL_CODE + '0');
@@ -4159,6 +4280,8 @@ bool QObject::disconnect(const QMetaObject::Connection &connection)
if (c->next)
c->next->prev = c->prev;
c->receiver = 0;
+ // disconnectNotify() not called (the signal index is unknown).
+
return true;
}
@@ -4178,19 +4301,19 @@ bool QObject::disconnect(const QMetaObject::Connection &connection)
\list 1
\li Disconnect everything connected to an object's signals:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 26
+ \snippet code/src_corelib_kernel_qobject.cpp 26
\li Disconnect everything connected to a specific signal:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 47
+ \snippet code/src_corelib_kernel_qobject.cpp 47
\li Disconnect a specific receiver:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 30
+ \snippet code/src_corelib_kernel_qobject.cpp 30
\li Disconnect a connection from one specific signal to a specific slot:
- \snippet doc/src/snippets/code/src_corelib_kernel_qobject.cpp 48
+ \snippet code/src_corelib_kernel_qobject.cpp 48
\endlist
@@ -4242,7 +4365,7 @@ bool QObject::disconnectImpl(const QObject *sender, void **signal, const QObject
signal_index += signalOffset;
}
- return QMetaObjectPrivate::disconnect(sender, signal_index, receiver, -1, slot);
+ return QMetaObjectPrivate::disconnect(sender, signal_index, senderMetaObject, receiver, -1, slot);
}
/*! \class QMetaObject::Connection
diff --git a/src/corelib/kernel/qobject.h b/src/corelib/kernel/qobject.h
index 11b1a19e0b..5e969d67f6 100644
--- a/src/corelib/kernel/qobject.h
+++ b/src/corelib/kernel/qobject.h
@@ -365,11 +365,15 @@ protected:
QObject *sender() const;
int senderSignalIndex() const;
int receivers(const char* signal) const;
+ bool isSignalConnected(const QMetaMethod &signal) const;
virtual void timerEvent(QTimerEvent *);
virtual void childEvent(QChildEvent *);
virtual void customEvent(QEvent *);
+ virtual void connectNotify(const QMetaMethod &signal);
+ virtual void disconnectNotify(const QMetaMethod &signal);
+ // Deprecated; to be removed before Qt 5.0
virtual void connectNotify(const char *signal);
virtual void disconnectNotify(const char *signal);
@@ -382,6 +386,7 @@ protected:
static const QMetaObject staticQtMetaObject;
friend struct QMetaObject;
+ friend struct QMetaObjectPrivate;
friend class QMetaCallEvent;
friend class QApplication;
friend class QApplicationPrivate;
diff --git a/src/corelib/kernel/qobject_impl.h b/src/corelib/kernel/qobject_impl.h
index 419fcc1dd4..e016002afa 100644
--- a/src/corelib/kernel/qobject_impl.h
+++ b/src/corelib/kernel/qobject_impl.h
@@ -51,431 +51,6 @@ QT_BEGIN_NAMESPACE
namespace QtPrivate {
- template <typename T> struct RemoveRef { typedef T Type; };
- template <typename T> struct RemoveRef<T&> { typedef T Type; };
- template <typename T> struct RemoveConstRef { typedef T Type; };
- template <typename T> struct RemoveConstRef<const T&> { typedef T Type; };
-
- /*
- The following List classes are used to help to handle the list of arguments.
- It follow the same principles as the lisp lists.
- List_Left<L,N> take a list and a number as a parametter and returns (via the Value typedef,
- the list composed of the first N element of the list
- */
-#ifndef Q_COMPILER_VARIADIC_TEMPLATES
- template <typename Head, typename Tail> struct List { typedef Head Car; typedef Tail Cdr; };
- template <typename L, int N> struct List_Left { typedef List<typename L::Car, typename List_Left<typename L::Cdr, N - 1>::Value > Value; };
- template <typename L> struct List_Left<L,0> { typedef void Value; };
-#else
- // With variadic template, lists are represented using a variadic template argument instead of the lisp way
- template <typename...> struct List {};
- template <typename Head, typename... Tail> struct List<Head, Tail...> { typedef Head Car; typedef List<Tail...> Cdr; };
- template <typename, typename> struct List_Append;
- template <typename... L1, typename...L2> struct List_Append<List<L1...>, List<L2...>> { typedef List<L1..., L2...> Value; };
- template <typename L, int N> struct List_Left {
- typedef typename List_Append<List<typename L::Car>,typename List_Left<typename L::Cdr, N - 1>::Value>::Value Value;
- };
- template <typename L> struct List_Left<L, 0> { typedef List<> Value; };
-#endif
- // List_Select<L,N> returns (via typedef Value) the Nth element of the list L
- template <typename L, int N> struct List_Select { typedef typename List_Select<typename L::Cdr, N - 1>::Value Value; };
- template <typename L> struct List_Select<L,0> { typedef typename L::Car Value; };
-
- /*
- trick to set the return value of a slot that works even if the signal or the slot returns void
- to be used like function(), ApplyReturnValue<ReturnType>(&return_value)
- if function() returns a value, the operator,(T, ApplyReturnValue<ReturnType>) is called, but if it
- returns void, the builtin one is used without an error.
- */
- template <typename T>
- struct ApplyReturnValue {
- void *data;
- ApplyReturnValue(void *data_) : data(data_) {}
- };
- template<typename T, typename U>
- void operator,(const T &value, const ApplyReturnValue<U> &container) {
- if (container.data)
- *reinterpret_cast<U*>(container.data) = value;
- }
-#ifdef Q_COMPILER_RVALUE_REFS
- template<typename T, typename U>
- void operator,(T &&value, const ApplyReturnValue<U> &container) {
- if (container.data)
- *reinterpret_cast<U*>(container.data) = value;
- }
-#endif
- template<typename T>
- void operator,(T, const ApplyReturnValue<void> &) {}
-
-
- /*
- The FunctionPointer<Func> struct is a type trait for function pointer.
- - ArgumentCount is the number of argument, or -1 if it is unknown
- - the Object typedef is the Object of a pointer to member function
- - the Arguments typedef is the list of argument (in a QtPrivate::List)
- - the Function typedef is an alias to the template parametter Func
- - the call<Args, R>(f,o,args) method is used to call that slot
- Args is the list of argument of the signal
- R is the return type of the signal
- f is the function pointer
- o is the receiver object
- and args is the array of pointer to arguments, as used in qt_metacall
-
- The Functor<Func,N> struct is the helper to call a functor of N argument.
- its call function is the same as the FunctionPointer::call function.
- */
-#ifndef Q_COMPILER_VARIADIC_TEMPLATES
- template<typename Func> struct FunctionPointer { enum {ArgumentCount = -1}; };
- template<class Obj, typename Ret> struct FunctionPointer<Ret (Obj::*) ()>
- {
- typedef Obj Object;
- typedef void Arguments;
- typedef Ret ReturnType;
- typedef Ret (Obj::*Function) ();
- enum {ArgumentCount = 0};
- template <typename Args, typename R>
- static void call(Function f, Obj *o, void **arg) { (o->*f)(), ApplyReturnValue<R>(arg[0]); }
- };
- template<class Obj, typename Ret, typename Arg1> struct FunctionPointer<Ret (Obj::*) (Arg1)>
- {
- typedef Obj Object;
- typedef List<Arg1, void> Arguments;
- typedef Ret ReturnType;
- typedef Ret (Obj::*Function) (Arg1);
- enum {ArgumentCount = 1};
- template <typename Args, typename R>
- static void call(Function f, Obj *o, void **arg) {
- (o->*f)((*reinterpret_cast<typename RemoveRef<typename Args::Car>::Type *>(arg[1]))), ApplyReturnValue<R>(arg[0]);
- }
- };
- template<class Obj, typename Ret, typename Arg1, typename Arg2> struct FunctionPointer<Ret (Obj::*) (Arg1, Arg2)>
- {
- typedef Obj Object;
- typedef List<Arg1, List<Arg2, void> > Arguments;
- typedef Ret ReturnType;
- typedef Ret (Obj::*Function) (Arg1, Arg2);
- enum {ArgumentCount = 2};
- template <typename Args, typename R>
- static void call(Function f, Obj *o, void **arg) {
- (o->*f)( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2])), ApplyReturnValue<R>(arg[0]);
- }
- };
- template<class Obj, typename Ret, typename Arg1, typename Arg2, typename Arg3> struct FunctionPointer<Ret (Obj::*) (Arg1, Arg2, Arg3)>
- {
- typedef Obj Object;
- typedef List<Arg1, List<Arg2, List<Arg3, void> > > Arguments;
- typedef Ret ReturnType;
- typedef Ret (Obj::*Function) (Arg1, Arg2, Arg3);
- enum {ArgumentCount = 3};
- template <typename Args, typename R>
- static void call(Function f, Obj *o, void **arg) {
- (o->*f)( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 2>::Value>::Type *>(arg[3])), ApplyReturnValue<R>(arg[0]);
- }
- };
- template<class Obj, typename Ret, typename Arg1, typename Arg2, typename Arg3, typename Arg4> struct FunctionPointer<Ret (Obj::*) (Arg1, Arg2, Arg3, Arg4)>
- {
- typedef Obj Object;
- typedef List<Arg1, List<Arg2, List<Arg3, List<Arg4, void> > > > Arguments;
- typedef Ret ReturnType;
- typedef Ret (Obj::*Function) (Arg1, Arg2, Arg3, Arg4);
- enum {ArgumentCount = 4};
- template <typename Args, typename R>
- static void call(Function f, Obj *o, void **arg) {
- (o->*f)( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 2>::Value>::Type *>(arg[3]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 3>::Value>::Type *>(arg[4])), ApplyReturnValue<R>(arg[0]);
- }
- };
- template<class Obj, typename Ret, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5> struct FunctionPointer<Ret (Obj::*) (Arg1, Arg2, Arg3, Arg4, Arg5)>
- {
- typedef Obj Object;
- typedef List<Arg1, List<Arg2, List<Arg3, List<Arg4, List<Arg5, void> > > > > Arguments;
- typedef Ret ReturnType;
- typedef Ret (Obj::*Function) (Arg1, Arg2, Arg3, Arg4, Arg5);
- enum {ArgumentCount = 5};
- template <typename Args, typename R>
- static void call(Function f, Obj *o, void **arg) {
- (o->*f)( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 2>::Value>::Type *>(arg[3]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 3>::Value>::Type *>(arg[4]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 4>::Value>::Type *>(arg[5])), ApplyReturnValue<R>(arg[0]);
- }
- };
- template<class Obj, typename Ret, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6>
- struct FunctionPointer<Ret (Obj::*) (Arg1, Arg2, Arg3, Arg4, Arg5, Arg6)>
- {
- typedef Obj Object;
- typedef List<Arg1, List<Arg2, List<Arg3, List<Arg4, List<Arg5, List<Arg6, void> > > > > > Arguments;
- typedef Ret ReturnType;
- typedef Ret (Obj::*Function) (Arg1, Arg2, Arg3, Arg4, Arg5, Arg6);
- enum {ArgumentCount = 6};
- template <typename Args, typename R>
- static void call(Function f, Obj *o, void **arg) {
- (o->*f)( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 2>::Value>::Type *>(arg[3]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 3>::Value>::Type *>(arg[4]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 4>::Value>::Type *>(arg[5]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 5>::Value>::Type *>(arg[6])), ApplyReturnValue<R>(arg[0]);
- }
- };
-
- template<typename Ret> struct FunctionPointer<Ret (*) ()>
- {
- typedef void Arguments;
- typedef Ret (*Function) ();
- typedef Ret ReturnType;
- enum {ArgumentCount = 0};
- template <typename Args, typename R>
- static void call(Function f, void *, void **arg) { f(), ApplyReturnValue<R>(arg[0]); }
- };
- template<typename Ret, typename Arg1> struct FunctionPointer<Ret (*) (Arg1)>
- {
- typedef List<Arg1, void> Arguments;
- typedef Ret ReturnType;
- typedef Ret (*Function) (Arg1);
- enum {ArgumentCount = 1};
- template <typename Args, typename R>
- static void call(Function f, void *, void **arg)
- { f(*reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1])), ApplyReturnValue<R>(arg[0]); }
- };
- template<typename Ret, typename Arg1, typename Arg2> struct FunctionPointer<Ret (*) (Arg1, Arg2)>
- {
- typedef List<Arg1, List<Arg2, void> > Arguments;
- typedef Ret ReturnType;
- typedef Ret (*Function) (Arg1, Arg2);
- enum {ArgumentCount = 2};
- template <typename Args, typename R>
- static void call(Function f, void *, void **arg) {
- f(*reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2])), ApplyReturnValue<R>(arg[0]); }
- };
- template<typename Ret, typename Arg1, typename Arg2, typename Arg3> struct FunctionPointer<Ret (*) (Arg1, Arg2, Arg3)>
- {
- typedef List<Arg1, List<Arg2, List<Arg3, void> > > Arguments;
- typedef Ret ReturnType;
- typedef Ret (*Function) (Arg1, Arg2, Arg3);
- enum {ArgumentCount = 3};
- template <typename Args, typename R>
- static void call(Function f, void *, void **arg) {
- f( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 2>::Value>::Type *>(arg[3])), ApplyReturnValue<R>(arg[0]);
- }
- };
- template<typename Ret, typename Arg1, typename Arg2, typename Arg3, typename Arg4> struct FunctionPointer<Ret (*) (Arg1, Arg2, Arg3, Arg4)>
- {
- typedef List<Arg1, List<Arg2, List<Arg3, List<Arg4, void> > > > Arguments;
- typedef Ret ReturnType;
- typedef Ret (*Function) (Arg1, Arg2, Arg3, Arg4);
- enum {ArgumentCount = 4};
- template <typename Args, typename R>
- static void call(Function f, void *, void **arg) {
- f( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 2>::Value>::Type *>(arg[3]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 3>::Value>::Type *>(arg[4])), ApplyReturnValue<R>(arg[0]);
- }
- };
- template<typename Ret, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5> struct FunctionPointer<Ret (*) (Arg1, Arg2, Arg3, Arg4, Arg5)>
- {
- typedef List<Arg1, List<Arg2, List<Arg3,
- List<Arg4, List<Arg5, void > > > > > Arguments;
- typedef Ret ReturnType;
- typedef Ret (*Function) (Arg1, Arg2, Arg3, Arg4, Arg5);
- enum {ArgumentCount = 5};
- template <typename Args, typename R>
- static void call(Function f, void *, void **arg) {
- f( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 2>::Value>::Type *>(arg[3]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 3>::Value>::Type *>(arg[4]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 4>::Value>::Type *>(arg[5])), ApplyReturnValue<R>(arg[0]);
- }
- };
- template<typename Ret, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6> struct FunctionPointer<Ret (*) (Arg1, Arg2, Arg3, Arg4, Arg5, Arg6)>
- {
- typedef List<Arg1, List<Arg2, List<Arg3, List<Arg4, List<Arg5, List<Arg6, void> > > > > > Arguments;
- typedef Ret ReturnType;
- typedef Ret (*Function) (Arg1, Arg2, Arg3, Arg4, Arg5, Arg6);
- enum {ArgumentCount = 6};
- template <typename Args, typename R>
- static void call(Function f, void *, void **arg) {
- f( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 2>::Value>::Type *>(arg[3]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 3>::Value>::Type *>(arg[4]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 4>::Value>::Type *>(arg[5]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 5>::Value>::Type *>(arg[6])), ApplyReturnValue<R>(arg[0]);
- }
- };
-
- template<typename F, int N> struct Functor;
- template<typename Function> struct Functor<Function, 0>
- {
- template <typename Args, typename R>
- static void call(Function &f, void *, void **arg) { f(), ApplyReturnValue<R>(arg[0]); }
- };
- template<typename Function> struct Functor<Function, 1>
- {
- template <typename Args, typename R>
- static void call(Function &f, void *, void **arg) {
- f(*reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1])), ApplyReturnValue<R>(arg[0]);
- }
- };
- template<typename Function> struct Functor<Function, 2>
- {
- template <typename Args, typename R>
- static void call(Function &f, void *, void **arg) {
- f( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2])), ApplyReturnValue<R>(arg[0]);
- }
- };
- template<typename Function> struct Functor<Function, 3>
- {
- template <typename Args, typename R>
- static void call(Function &f, void *, void **arg) {
- f( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 2>::Value>::Type *>(arg[4])), ApplyReturnValue<R>(arg[0]);
- }
- };
- template<typename Function> struct Functor<Function, 4>
- {
- template <typename Args, typename R>
- static void call(Function &f, void *, void **arg) {
- f( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 2>::Value>::Type *>(arg[3]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 3>::Value>::Type *>(arg[4])), ApplyReturnValue<R>(arg[0]);
- }
- };
- template<typename Function> struct Functor<Function, 5>
- {
- template <typename Args, typename R>
- static void call(Function &f, void *, void **arg) {
- f( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 2>::Value>::Type *>(arg[3]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 3>::Value>::Type *>(arg[4]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 4>::Value>::Type *>(arg[5])), ApplyReturnValue<R>(arg[0]);
- }
- };
- template<typename Function> struct Functor<Function, 6>
- {
- template <typename Args, typename R>
- static void call(Function &f, void *, void **arg) {
- f( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 2>::Value>::Type *>(arg[3]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 3>::Value>::Type *>(arg[4]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 4>::Value>::Type *>(arg[5]),
- *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 5>::Value>::Type *>(arg[6])), ApplyReturnValue<R>(arg[0]);
- }
- };
-#else
- template <int...> struct IndexesList {};
- template <typename IndexList, int Right> struct IndexesAppend;
- template <int... Left, int Right> struct IndexesAppend<IndexesList<Left...>, Right>
- { typedef IndexesList<Left..., Right> Value; };
- template <int N> struct Indexes
- { typedef typename IndexesAppend<typename Indexes<N - 1>::Value, N - 1>::Value Value; };
- template <> struct Indexes<0> { typedef IndexesList<> Value; };
- template<typename Func> struct FunctionPointer { enum {ArgumentCount = -1}; };
-
- template <typename, typename, typename, typename> struct FunctorCall;
- template <int... I, typename... SignalArgs, typename R, typename Function>
- struct FunctorCall<IndexesList<I...>, List<SignalArgs...>, R, Function> {
- static void call(Function f, void **arg) {
- f((*reinterpret_cast<typename RemoveRef<SignalArgs>::Type *>(arg[I+1]))...), ApplyReturnValue<R>(arg[0]);
- }
- };
- template <int... I, typename... SignalArgs, typename R, typename... SlotArgs, typename SlotRet, class Obj>
- struct FunctorCall<IndexesList<I...>, List<SignalArgs...>, R, SlotRet (Obj::*)(SlotArgs...)> {
- static void call(SlotRet (Obj::*f)(SlotArgs...), Obj *o, void **arg) {
- (o->*f)((*reinterpret_cast<typename RemoveRef<SignalArgs>::Type *>(arg[I+1]))...), ApplyReturnValue<R>(arg[0]);
- }
- };
-
- template<class Obj, typename Ret, typename... Args> struct FunctionPointer<Ret (Obj::*) (Args...)>
- {
- typedef Obj Object;
- typedef List<Args...> Arguments;
- typedef Ret ReturnType;
- typedef Ret (Obj::*Function) (Args...);
- enum {ArgumentCount = sizeof...(Args)};
- template <typename SignalArgs, typename R>
- static void call(Function f, Obj *o, void **arg) {
- FunctorCall<typename Indexes<ArgumentCount>::Value, SignalArgs, R, Function>::call(f, o, arg);
- }
- };
-
- template<typename Ret, typename... Args> struct FunctionPointer<Ret (*) (Args...)>
- {
- typedef List<Args...> Arguments;
- typedef Ret ReturnType;
- typedef Ret (*Function) (Args...);
- enum {ArgumentCount = sizeof...(Args)};
- template <typename SignalArgs, typename R>
- static void call(Function f, void *, void **arg) {
- FunctorCall<typename Indexes<ArgumentCount>::Value, SignalArgs, R, Function>::call(f, arg);
- }
- };
-
- template<typename Function, int N> struct Functor
- {
- template <typename SignalArgs, typename R>
- static void call(Function &f, void *, void **arg) {
- FunctorCall<typename Indexes<N>::Value, SignalArgs, R, Function>::call(f, arg);
- }
- };
-#endif
-
- /*
- Logic that check if the arguments of the slot matches the argument of the signal.
- To be used like this:
- Q_STATIC_ASSERT(CheckCompatibleArguments<FunctionPointer<Signal>::Arguments, FunctionPointer<Slot>::Arguments>::value)
- */
- template<typename A1, typename A2> struct AreArgumentsCompatible {
- static int test(A2);
- static char test(...);
- static A1 dummy();
- enum { value = sizeof(test(dummy())) == sizeof(int) };
- };
- template<typename A1, typename A2> struct AreArgumentsCompatible<A1, A2&> { enum { value = false }; };
- template<typename A> struct AreArgumentsCompatible<A&, A&> { enum { value = true }; };
- // void as a return value
- template<typename A> struct AreArgumentsCompatible<void, A> { enum { value = true }; };
- template<typename A> struct AreArgumentsCompatible<A, void> { enum { value = true }; };
- template<> struct AreArgumentsCompatible<void, void> { enum { value = true }; };
-
-#ifndef Q_COMPILER_VARIADIC_TEMPLATES
- template <typename List1, typename List2> struct CheckCompatibleArguments { enum { value = false }; };
- template <> struct CheckCompatibleArguments<void, void> { enum { value = true }; };
- template <typename List1> struct CheckCompatibleArguments<List1, void> { enum { value = true }; };
- template <typename Arg1, typename Arg2, typename Tail1, typename Tail2> struct CheckCompatibleArguments<List<Arg1, Tail1>, List<Arg2, Tail2> >
- {
- enum { value = AreArgumentsCompatible<typename RemoveConstRef<Arg1>::Type, typename RemoveConstRef<Arg2>::Type>::value
- && CheckCompatibleArguments<Tail1, Tail2>::value };
- };
-#else
- template <typename List1, typename List2> struct CheckCompatibleArguments { enum { value = false }; };
- template <> struct CheckCompatibleArguments<List<>, List<>> { enum { value = true }; };
- template <typename List1> struct CheckCompatibleArguments<List1, List<>> { enum { value = true }; };
- template <typename Arg1, typename Arg2, typename... Tail1, typename... Tail2>
- struct CheckCompatibleArguments<List<Arg1, Tail1...>, List<Arg2, Tail2...>>
- {
- enum { value = AreArgumentsCompatible<typename RemoveConstRef<Arg1>::Type, typename RemoveConstRef<Arg2>::Type>::value
- && CheckCompatibleArguments<List<Tail1...>, List<Tail2...>>::value };
- };
-
-#endif
-
/*
Logic to statically generate the array of qMetaTypeId
ConnectionTypes<FunctionPointer<Signal>::Arguments>::types() returns an array
diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h
index c8edadce9d..a31e091ae8 100644
--- a/src/corelib/kernel/qobject_p.h
+++ b/src/corelib/kernel/qobject_p.h
@@ -91,6 +91,7 @@ public:
static void (*parentChanged)(QAbstractDeclarativeData *, QObject *, QObject *);
static void (*objectNameChanged)(QAbstractDeclarativeData *, QObject *);
static void (*signalEmitted)(QAbstractDeclarativeData *, QObject *, int, void **);
+ static int (*receivers)(QAbstractDeclarativeData *, const QObject *, int);
};
class Q_CORE_EXPORT QObjectPrivate : public QObjectData
@@ -175,7 +176,7 @@ public:
return o->d_func();
}
- int signalIndex(const char *signalName) const;
+ int signalIndex(const char *signalName, const QMetaObject **meta = 0) const;
inline bool isSignalConnected(uint signalIdx) const;
public:
diff --git a/src/corelib/kernel/qobjectcleanuphandler.cpp b/src/corelib/kernel/qobjectcleanuphandler.cpp
index 166a90a74f..f165ec96ca 100644
--- a/src/corelib/kernel/qobjectcleanuphandler.cpp
+++ b/src/corelib/kernel/qobjectcleanuphandler.cpp
@@ -121,7 +121,7 @@ void QObjectCleanupHandler::remove(QObject *object)
Returns true if this cleanup handler is empty or if all objects in
this cleanup handler have been destroyed; otherwise return false.
- \sa add() remove() clear()
+ \sa add(), remove(), clear()
*/
bool QObjectCleanupHandler::isEmpty() const
{
diff --git a/src/corelib/kernel/qobjectdefs.h b/src/corelib/kernel/qobjectdefs.h
index 9bcb8b9211..cc442457b0 100644
--- a/src/corelib/kernel/qobjectdefs.h
+++ b/src/corelib/kernel/qobjectdefs.h
@@ -44,6 +44,8 @@
#include <QtCore/qnamespace.h>
+#include <QtCore/qobjectdefs_impl.h>
+
QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
@@ -55,7 +57,7 @@ struct QByteArrayData;
class QString;
#ifndef Q_MOC_OUTPUT_REVISION
-#define Q_MOC_OUTPUT_REVISION 65
+#define Q_MOC_OUTPUT_REVISION 66
#endif
// The following macros are our "extensions" to C++
@@ -158,7 +160,6 @@ public: \
QT_TR_FUNCTIONS \
virtual int qt_metacall(QMetaObject::Call, int, void **); \
private: \
- Q_DECL_HIDDEN static const QMetaObjectExtraData staticMetaObjectExtraData; \
Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **);
/* tmake ignore Q_OBJECT */
@@ -451,7 +452,10 @@ struct Q_CORE_EXPORT QMetaObject
const QMetaObject *superdata;
const QByteArrayData *stringdata;
const uint *data;
- const void *extradata;
+ typedef void (*StaticMetacallFunction)(QObject *, QMetaObject::Call, int, void **);
+ StaticMetacallFunction static_metacall;
+ const QMetaObject **relatedMetaObjects;
+ void *extradata; //reserved for future use
} d;
};
@@ -479,17 +483,6 @@ public:
#endif
};
-typedef const QMetaObject& (*QMetaObjectAccessor)();
-
-struct QMetaObjectExtraData
-{
- const QMetaObject **objects;
-
- typedef void (*StaticMetacallFunction)(QObject *, QMetaObject::Call, int, void **); //from revision 6
- //typedef int (*StaticMetaCall)(QMetaObject::Call, int, void **); //used from revison 2 until revison 5
- StaticMetacallFunction static_metacall;
-};
-
inline const QMetaObject *QMetaObject::superClass() const
{ return d.superdata; }
diff --git a/src/corelib/kernel/qobjectdefs_impl.h b/src/corelib/kernel/qobjectdefs_impl.h
new file mode 100644
index 0000000000..5efe08b3e5
--- /dev/null
+++ b/src/corelib/kernel/qobjectdefs_impl.h
@@ -0,0 +1,485 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q_QDOC
+
+#ifndef QOBJECTDEFS_H
+#error Do not include qobjectdefs_impl.h directly
+#endif
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+
+namespace QtPrivate {
+ template <typename T> struct RemoveRef { typedef T Type; };
+ template <typename T> struct RemoveRef<T&> { typedef T Type; };
+ template <typename T> struct RemoveConstRef { typedef T Type; };
+ template <typename T> struct RemoveConstRef<const T&> { typedef T Type; };
+
+ /*
+ The following List classes are used to help to handle the list of arguments.
+ It follow the same principles as the lisp lists.
+ List_Left<L,N> take a list and a number as a parametter and returns (via the Value typedef,
+ the list composed of the first N element of the list
+ */
+#ifndef Q_COMPILER_VARIADIC_TEMPLATES
+ template <typename Head, typename Tail> struct List { typedef Head Car; typedef Tail Cdr; };
+ template <typename L, int N> struct List_Left { typedef List<typename L::Car, typename List_Left<typename L::Cdr, N - 1>::Value > Value; };
+ template <typename L> struct List_Left<L,0> { typedef void Value; };
+#else
+ // With variadic template, lists are represented using a variadic template argument instead of the lisp way
+ template <typename...> struct List {};
+ template <typename Head, typename... Tail> struct List<Head, Tail...> { typedef Head Car; typedef List<Tail...> Cdr; };
+ template <typename, typename> struct List_Append;
+ template <typename... L1, typename...L2> struct List_Append<List<L1...>, List<L2...>> { typedef List<L1..., L2...> Value; };
+ template <typename L, int N> struct List_Left {
+ typedef typename List_Append<List<typename L::Car>,typename List_Left<typename L::Cdr, N - 1>::Value>::Value Value;
+ };
+ template <typename L> struct List_Left<L, 0> { typedef List<> Value; };
+#endif
+ // List_Select<L,N> returns (via typedef Value) the Nth element of the list L
+ template <typename L, int N> struct List_Select { typedef typename List_Select<typename L::Cdr, N - 1>::Value Value; };
+ template <typename L> struct List_Select<L,0> { typedef typename L::Car Value; };
+
+ /*
+ trick to set the return value of a slot that works even if the signal or the slot returns void
+ to be used like function(), ApplyReturnValue<ReturnType>(&return_value)
+ if function() returns a value, the operator,(T, ApplyReturnValue<ReturnType>) is called, but if it
+ returns void, the builtin one is used without an error.
+ */
+ template <typename T>
+ struct ApplyReturnValue {
+ void *data;
+ ApplyReturnValue(void *data_) : data(data_) {}
+ };
+ template<typename T, typename U>
+ void operator,(const T &value, const ApplyReturnValue<U> &container) {
+ if (container.data)
+ *reinterpret_cast<U*>(container.data) = value;
+ }
+#ifdef Q_COMPILER_RVALUE_REFS
+ template<typename T, typename U>
+ void operator,(T &&value, const ApplyReturnValue<U> &container) {
+ if (container.data)
+ *reinterpret_cast<U*>(container.data) = value;
+ }
+#endif
+ template<typename T>
+ void operator,(T, const ApplyReturnValue<void> &) {}
+
+
+ /*
+ The FunctionPointer<Func> struct is a type trait for function pointer.
+ - ArgumentCount is the number of argument, or -1 if it is unknown
+ - the Object typedef is the Object of a pointer to member function
+ - the Arguments typedef is the list of argument (in a QtPrivate::List)
+ - the Function typedef is an alias to the template parametter Func
+ - the call<Args, R>(f,o,args) method is used to call that slot
+ Args is the list of argument of the signal
+ R is the return type of the signal
+ f is the function pointer
+ o is the receiver object
+ and args is the array of pointer to arguments, as used in qt_metacall
+
+ The Functor<Func,N> struct is the helper to call a functor of N argument.
+ its call function is the same as the FunctionPointer::call function.
+ */
+#ifndef Q_COMPILER_VARIADIC_TEMPLATES
+ template<typename Func> struct FunctionPointer { enum {ArgumentCount = -1}; };
+ template<class Obj, typename Ret> struct FunctionPointer<Ret (Obj::*) ()>
+ {
+ typedef Obj Object;
+ typedef void Arguments;
+ typedef Ret ReturnType;
+ typedef Ret (Obj::*Function) ();
+ enum {ArgumentCount = 0};
+ template <typename Args, typename R>
+ static void call(Function f, Obj *o, void **arg) { (o->*f)(), ApplyReturnValue<R>(arg[0]); }
+ };
+ template<class Obj, typename Ret, typename Arg1> struct FunctionPointer<Ret (Obj::*) (Arg1)>
+ {
+ typedef Obj Object;
+ typedef List<Arg1, void> Arguments;
+ typedef Ret ReturnType;
+ typedef Ret (Obj::*Function) (Arg1);
+ enum {ArgumentCount = 1};
+ template <typename Args, typename R>
+ static void call(Function f, Obj *o, void **arg) {
+ (o->*f)((*reinterpret_cast<typename RemoveRef<typename Args::Car>::Type *>(arg[1]))), ApplyReturnValue<R>(arg[0]);
+ }
+ };
+ template<class Obj, typename Ret, typename Arg1, typename Arg2> struct FunctionPointer<Ret (Obj::*) (Arg1, Arg2)>
+ {
+ typedef Obj Object;
+ typedef List<Arg1, List<Arg2, void> > Arguments;
+ typedef Ret ReturnType;
+ typedef Ret (Obj::*Function) (Arg1, Arg2);
+ enum {ArgumentCount = 2};
+ template <typename Args, typename R>
+ static void call(Function f, Obj *o, void **arg) {
+ (o->*f)( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2])), ApplyReturnValue<R>(arg[0]);
+ }
+ };
+ template<class Obj, typename Ret, typename Arg1, typename Arg2, typename Arg3> struct FunctionPointer<Ret (Obj::*) (Arg1, Arg2, Arg3)>
+ {
+ typedef Obj Object;
+ typedef List<Arg1, List<Arg2, List<Arg3, void> > > Arguments;
+ typedef Ret ReturnType;
+ typedef Ret (Obj::*Function) (Arg1, Arg2, Arg3);
+ enum {ArgumentCount = 3};
+ template <typename Args, typename R>
+ static void call(Function f, Obj *o, void **arg) {
+ (o->*f)( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 2>::Value>::Type *>(arg[3])), ApplyReturnValue<R>(arg[0]);
+ }
+ };
+ template<class Obj, typename Ret, typename Arg1, typename Arg2, typename Arg3, typename Arg4> struct FunctionPointer<Ret (Obj::*) (Arg1, Arg2, Arg3, Arg4)>
+ {
+ typedef Obj Object;
+ typedef List<Arg1, List<Arg2, List<Arg3, List<Arg4, void> > > > Arguments;
+ typedef Ret ReturnType;
+ typedef Ret (Obj::*Function) (Arg1, Arg2, Arg3, Arg4);
+ enum {ArgumentCount = 4};
+ template <typename Args, typename R>
+ static void call(Function f, Obj *o, void **arg) {
+ (o->*f)( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 2>::Value>::Type *>(arg[3]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 3>::Value>::Type *>(arg[4])), ApplyReturnValue<R>(arg[0]);
+ }
+ };
+ template<class Obj, typename Ret, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5> struct FunctionPointer<Ret (Obj::*) (Arg1, Arg2, Arg3, Arg4, Arg5)>
+ {
+ typedef Obj Object;
+ typedef List<Arg1, List<Arg2, List<Arg3, List<Arg4, List<Arg5, void> > > > > Arguments;
+ typedef Ret ReturnType;
+ typedef Ret (Obj::*Function) (Arg1, Arg2, Arg3, Arg4, Arg5);
+ enum {ArgumentCount = 5};
+ template <typename Args, typename R>
+ static void call(Function f, Obj *o, void **arg) {
+ (o->*f)( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 2>::Value>::Type *>(arg[3]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 3>::Value>::Type *>(arg[4]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 4>::Value>::Type *>(arg[5])), ApplyReturnValue<R>(arg[0]);
+ }
+ };
+ template<class Obj, typename Ret, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6>
+ struct FunctionPointer<Ret (Obj::*) (Arg1, Arg2, Arg3, Arg4, Arg5, Arg6)>
+ {
+ typedef Obj Object;
+ typedef List<Arg1, List<Arg2, List<Arg3, List<Arg4, List<Arg5, List<Arg6, void> > > > > > Arguments;
+ typedef Ret ReturnType;
+ typedef Ret (Obj::*Function) (Arg1, Arg2, Arg3, Arg4, Arg5, Arg6);
+ enum {ArgumentCount = 6};
+ template <typename Args, typename R>
+ static void call(Function f, Obj *o, void **arg) {
+ (o->*f)( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 2>::Value>::Type *>(arg[3]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 3>::Value>::Type *>(arg[4]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 4>::Value>::Type *>(arg[5]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 5>::Value>::Type *>(arg[6])), ApplyReturnValue<R>(arg[0]);
+ }
+ };
+
+ template<typename Ret> struct FunctionPointer<Ret (*) ()>
+ {
+ typedef void Arguments;
+ typedef Ret (*Function) ();
+ typedef Ret ReturnType;
+ enum {ArgumentCount = 0};
+ template <typename Args, typename R>
+ static void call(Function f, void *, void **arg) { f(), ApplyReturnValue<R>(arg[0]); }
+ };
+ template<typename Ret, typename Arg1> struct FunctionPointer<Ret (*) (Arg1)>
+ {
+ typedef List<Arg1, void> Arguments;
+ typedef Ret ReturnType;
+ typedef Ret (*Function) (Arg1);
+ enum {ArgumentCount = 1};
+ template <typename Args, typename R>
+ static void call(Function f, void *, void **arg)
+ { f(*reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1])), ApplyReturnValue<R>(arg[0]); }
+ };
+ template<typename Ret, typename Arg1, typename Arg2> struct FunctionPointer<Ret (*) (Arg1, Arg2)>
+ {
+ typedef List<Arg1, List<Arg2, void> > Arguments;
+ typedef Ret ReturnType;
+ typedef Ret (*Function) (Arg1, Arg2);
+ enum {ArgumentCount = 2};
+ template <typename Args, typename R>
+ static void call(Function f, void *, void **arg) {
+ f(*reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2])), ApplyReturnValue<R>(arg[0]); }
+ };
+ template<typename Ret, typename Arg1, typename Arg2, typename Arg3> struct FunctionPointer<Ret (*) (Arg1, Arg2, Arg3)>
+ {
+ typedef List<Arg1, List<Arg2, List<Arg3, void> > > Arguments;
+ typedef Ret ReturnType;
+ typedef Ret (*Function) (Arg1, Arg2, Arg3);
+ enum {ArgumentCount = 3};
+ template <typename Args, typename R>
+ static void call(Function f, void *, void **arg) {
+ f( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 2>::Value>::Type *>(arg[3])), ApplyReturnValue<R>(arg[0]);
+ }
+ };
+ template<typename Ret, typename Arg1, typename Arg2, typename Arg3, typename Arg4> struct FunctionPointer<Ret (*) (Arg1, Arg2, Arg3, Arg4)>
+ {
+ typedef List<Arg1, List<Arg2, List<Arg3, List<Arg4, void> > > > Arguments;
+ typedef Ret ReturnType;
+ typedef Ret (*Function) (Arg1, Arg2, Arg3, Arg4);
+ enum {ArgumentCount = 4};
+ template <typename Args, typename R>
+ static void call(Function f, void *, void **arg) {
+ f( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 2>::Value>::Type *>(arg[3]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 3>::Value>::Type *>(arg[4])), ApplyReturnValue<R>(arg[0]);
+ }
+ };
+ template<typename Ret, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5> struct FunctionPointer<Ret (*) (Arg1, Arg2, Arg3, Arg4, Arg5)>
+ {
+ typedef List<Arg1, List<Arg2, List<Arg3,
+ List<Arg4, List<Arg5, void > > > > > Arguments;
+ typedef Ret ReturnType;
+ typedef Ret (*Function) (Arg1, Arg2, Arg3, Arg4, Arg5);
+ enum {ArgumentCount = 5};
+ template <typename Args, typename R>
+ static void call(Function f, void *, void **arg) {
+ f( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 2>::Value>::Type *>(arg[3]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 3>::Value>::Type *>(arg[4]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 4>::Value>::Type *>(arg[5])), ApplyReturnValue<R>(arg[0]);
+ }
+ };
+ template<typename Ret, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6> struct FunctionPointer<Ret (*) (Arg1, Arg2, Arg3, Arg4, Arg5, Arg6)>
+ {
+ typedef List<Arg1, List<Arg2, List<Arg3, List<Arg4, List<Arg5, List<Arg6, void> > > > > > Arguments;
+ typedef Ret ReturnType;
+ typedef Ret (*Function) (Arg1, Arg2, Arg3, Arg4, Arg5, Arg6);
+ enum {ArgumentCount = 6};
+ template <typename Args, typename R>
+ static void call(Function f, void *, void **arg) {
+ f( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 2>::Value>::Type *>(arg[3]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 3>::Value>::Type *>(arg[4]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 4>::Value>::Type *>(arg[5]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 5>::Value>::Type *>(arg[6])), ApplyReturnValue<R>(arg[0]);
+ }
+ };
+
+ template<typename F, int N> struct Functor;
+ template<typename Function> struct Functor<Function, 0>
+ {
+ template <typename Args, typename R>
+ static void call(Function &f, void *, void **arg) { f(), ApplyReturnValue<R>(arg[0]); }
+ };
+ template<typename Function> struct Functor<Function, 1>
+ {
+ template <typename Args, typename R>
+ static void call(Function &f, void *, void **arg) {
+ f(*reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1])), ApplyReturnValue<R>(arg[0]);
+ }
+ };
+ template<typename Function> struct Functor<Function, 2>
+ {
+ template <typename Args, typename R>
+ static void call(Function &f, void *, void **arg) {
+ f( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2])), ApplyReturnValue<R>(arg[0]);
+ }
+ };
+ template<typename Function> struct Functor<Function, 3>
+ {
+ template <typename Args, typename R>
+ static void call(Function &f, void *, void **arg) {
+ f( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 2>::Value>::Type *>(arg[4])), ApplyReturnValue<R>(arg[0]);
+ }
+ };
+ template<typename Function> struct Functor<Function, 4>
+ {
+ template <typename Args, typename R>
+ static void call(Function &f, void *, void **arg) {
+ f( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 2>::Value>::Type *>(arg[3]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 3>::Value>::Type *>(arg[4])), ApplyReturnValue<R>(arg[0]);
+ }
+ };
+ template<typename Function> struct Functor<Function, 5>
+ {
+ template <typename Args, typename R>
+ static void call(Function &f, void *, void **arg) {
+ f( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 2>::Value>::Type *>(arg[3]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 3>::Value>::Type *>(arg[4]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 4>::Value>::Type *>(arg[5])), ApplyReturnValue<R>(arg[0]);
+ }
+ };
+ template<typename Function> struct Functor<Function, 6>
+ {
+ template <typename Args, typename R>
+ static void call(Function &f, void *, void **arg) {
+ f( *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 0>::Value>::Type *>(arg[1]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 1>::Value>::Type *>(arg[2]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 2>::Value>::Type *>(arg[3]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 3>::Value>::Type *>(arg[4]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 4>::Value>::Type *>(arg[5]),
+ *reinterpret_cast<typename RemoveRef<typename List_Select<Args, 5>::Value>::Type *>(arg[6])), ApplyReturnValue<R>(arg[0]);
+ }
+ };
+#else
+ template <int...> struct IndexesList {};
+ template <typename IndexList, int Right> struct IndexesAppend;
+ template <int... Left, int Right> struct IndexesAppend<IndexesList<Left...>, Right>
+ { typedef IndexesList<Left..., Right> Value; };
+ template <int N> struct Indexes
+ { typedef typename IndexesAppend<typename Indexes<N - 1>::Value, N - 1>::Value Value; };
+ template <> struct Indexes<0> { typedef IndexesList<> Value; };
+ template<typename Func> struct FunctionPointer { enum {ArgumentCount = -1}; };
+
+ template <typename, typename, typename, typename> struct FunctorCall;
+ template <int... I, typename... SignalArgs, typename R, typename Function>
+ struct FunctorCall<IndexesList<I...>, List<SignalArgs...>, R, Function> {
+ static void call(Function f, void **arg) {
+ f((*reinterpret_cast<typename RemoveRef<SignalArgs>::Type *>(arg[I+1]))...), ApplyReturnValue<R>(arg[0]);
+ }
+ };
+ template <int... I, typename... SignalArgs, typename R, typename... SlotArgs, typename SlotRet, class Obj>
+ struct FunctorCall<IndexesList<I...>, List<SignalArgs...>, R, SlotRet (Obj::*)(SlotArgs...)> {
+ static void call(SlotRet (Obj::*f)(SlotArgs...), Obj *o, void **arg) {
+ (o->*f)((*reinterpret_cast<typename RemoveRef<SignalArgs>::Type *>(arg[I+1]))...), ApplyReturnValue<R>(arg[0]);
+ }
+ };
+
+ template<class Obj, typename Ret, typename... Args> struct FunctionPointer<Ret (Obj::*) (Args...)>
+ {
+ typedef Obj Object;
+ typedef List<Args...> Arguments;
+ typedef Ret ReturnType;
+ typedef Ret (Obj::*Function) (Args...);
+ enum {ArgumentCount = sizeof...(Args)};
+ template <typename SignalArgs, typename R>
+ static void call(Function f, Obj *o, void **arg) {
+ FunctorCall<typename Indexes<ArgumentCount>::Value, SignalArgs, R, Function>::call(f, o, arg);
+ }
+ };
+
+ template<typename Ret, typename... Args> struct FunctionPointer<Ret (*) (Args...)>
+ {
+ typedef List<Args...> Arguments;
+ typedef Ret ReturnType;
+ typedef Ret (*Function) (Args...);
+ enum {ArgumentCount = sizeof...(Args)};
+ template <typename SignalArgs, typename R>
+ static void call(Function f, void *, void **arg) {
+ FunctorCall<typename Indexes<ArgumentCount>::Value, SignalArgs, R, Function>::call(f, arg);
+ }
+ };
+
+ template<typename Function, int N> struct Functor
+ {
+ template <typename SignalArgs, typename R>
+ static void call(Function &f, void *, void **arg) {
+ FunctorCall<typename Indexes<N>::Value, SignalArgs, R, Function>::call(f, arg);
+ }
+ };
+#endif
+
+ /*
+ Logic that check if the arguments of the slot matches the argument of the signal.
+ To be used like this:
+ Q_STATIC_ASSERT(CheckCompatibleArguments<FunctionPointer<Signal>::Arguments, FunctionPointer<Slot>::Arguments>::value)
+ */
+ template<typename A1, typename A2> struct AreArgumentsCompatible {
+ static int test(A2);
+ static char test(...);
+ static A1 dummy();
+ enum { value = sizeof(test(dummy())) == sizeof(int) };
+ };
+ template<typename A1, typename A2> struct AreArgumentsCompatible<A1, A2&> { enum { value = false }; };
+ template<typename A> struct AreArgumentsCompatible<A&, A&> { enum { value = true }; };
+ // void as a return value
+ template<typename A> struct AreArgumentsCompatible<void, A> { enum { value = true }; };
+ template<typename A> struct AreArgumentsCompatible<A, void> { enum { value = true }; };
+ template<> struct AreArgumentsCompatible<void, void> { enum { value = true }; };
+
+#ifndef Q_COMPILER_VARIADIC_TEMPLATES
+ template <typename List1, typename List2> struct CheckCompatibleArguments { enum { value = false }; };
+ template <> struct CheckCompatibleArguments<void, void> { enum { value = true }; };
+ template <typename List1> struct CheckCompatibleArguments<List1, void> { enum { value = true }; };
+ template <typename Arg1, typename Arg2, typename Tail1, typename Tail2> struct CheckCompatibleArguments<List<Arg1, Tail1>, List<Arg2, Tail2> >
+ {
+ enum { value = AreArgumentsCompatible<typename RemoveConstRef<Arg1>::Type, typename RemoveConstRef<Arg2>::Type>::value
+ && CheckCompatibleArguments<Tail1, Tail2>::value };
+ };
+#else
+ template <typename List1, typename List2> struct CheckCompatibleArguments { enum { value = false }; };
+ template <> struct CheckCompatibleArguments<List<>, List<>> { enum { value = true }; };
+ template <typename List1> struct CheckCompatibleArguments<List1, List<>> { enum { value = true }; };
+ template <typename Arg1, typename Arg2, typename... Tail1, typename... Tail2>
+ struct CheckCompatibleArguments<List<Arg1, Tail1...>, List<Arg2, Tail2...>>
+ {
+ enum { value = AreArgumentsCompatible<typename RemoveConstRef<Arg1>::Type, typename RemoveConstRef<Arg2>::Type>::value
+ && CheckCompatibleArguments<List<Tail1...>, List<Tail2...>>::value };
+ };
+
+#endif
+}
+
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif
diff --git a/src/corelib/kernel/qpointer.cpp b/src/corelib/kernel/qpointer.cpp
index e0e14e5b79..cd88baf9bf 100644
--- a/src/corelib/kernel/qpointer.cpp
+++ b/src/corelib/kernel/qpointer.cpp
@@ -74,10 +74,10 @@
Example:
- \snippet doc/src/snippets/pointer/pointer.cpp 0
+ \snippet pointer/pointer.cpp 0
\dots
- \snippet doc/src/snippets/pointer/pointer.cpp 1
- \snippet doc/src/snippets/pointer/pointer.cpp 2
+ \snippet pointer/pointer.cpp 1
+ \snippet pointer/pointer.cpp 2
If the QLabel is deleted in the meantime, the \c label variable
will hold 0 instead of an invalid address, and the last line will
diff --git a/src/corelib/kernel/qsharedmemory.cpp b/src/corelib/kernel/qsharedmemory.cpp
index d8578a8059..50c24ba169 100644
--- a/src/corelib/kernel/qsharedmemory.cpp
+++ b/src/corelib/kernel/qsharedmemory.cpp
@@ -174,7 +174,7 @@ QSharedMemory::QSharedMemory(const QString &key, QObject *parent)
the shared memory segment, the detach() operation destroys the
shared memory segment.
- \sa detach() isAttached()
+ \sa detach(), isAttached()
*/
QSharedMemory::~QSharedMemory()
{
@@ -193,7 +193,7 @@ QSharedMemory::~QSharedMemory()
segment, it will \l {detach()} {detach} from it before setting the new key.
This function does not do an attach().
- \sa key() nativeKey() isAttached()
+ \sa key(), nativeKey(), isAttached()
*/
void QSharedMemory::setKey(const QString &key)
{
@@ -225,7 +225,7 @@ void QSharedMemory::setKey(const QString &key)
The application will not be portable if you set a native key.
- \sa nativeKey() key() isAttached()
+ \sa nativeKey(), key(), isAttached()
*/
void QSharedMemory::setNativeKey(const QString &key)
{
@@ -288,7 +288,7 @@ bool QSharedMemoryPrivate::initKey()
You can find the native, platform specific, key used by the operating system
by calling nativeKey().
- \sa setKey() setNativeKey()
+ \sa setKey(), setNativeKey()
*/
QString QSharedMemory::key() const
{
@@ -306,7 +306,7 @@ QString QSharedMemory::key() const
You can use the native key to access shared memory segments that have not
been created by Qt, or to grant shared memory access to non-Qt applications.
- \sa setKey() setNativeKey()
+ \sa setKey(), setNativeKey()
*/
QString QSharedMemory::nativeKey() const
{
@@ -363,7 +363,7 @@ bool QSharedMemory::create(int size, AccessMode mode)
Returns the size of the attached shared memory segment. If no shared
memory segment is attached, 0 is returned.
- \sa create() attach()
+ \sa create(), attach()
*/
int QSharedMemory::size() const
{
@@ -472,7 +472,7 @@ void *QSharedMemory::data()
the shared memory, and remember to release the lock with unlock()
after you are done.
- \sa attach() create()
+ \sa attach(), create()
*/
const void* QSharedMemory::constData() const
{
diff --git a/src/corelib/kernel/qsignalmapper.cpp b/src/corelib/kernel/qsignalmapper.cpp
index 27340020d8..c668047bd2 100644
--- a/src/corelib/kernel/qsignalmapper.cpp
+++ b/src/corelib/kernel/qsignalmapper.cpp
@@ -91,14 +91,14 @@ public:
signal, \c clicked(), which is emitted with the text of the button
that was clicked:
- \snippet doc/src/snippets/qsignalmapper/buttonwidget.h 0
- \snippet doc/src/snippets/qsignalmapper/buttonwidget.h 1
+ \snippet qsignalmapper/buttonwidget.h 0
+ \snippet qsignalmapper/buttonwidget.h 1
The only function that we need to implement is the constructor:
- \snippet doc/src/snippets/qsignalmapper/buttonwidget.cpp 0
- \snippet doc/src/snippets/qsignalmapper/buttonwidget.cpp 1
- \snippet doc/src/snippets/qsignalmapper/buttonwidget.cpp 2
+ \snippet qsignalmapper/buttonwidget.cpp 0
+ \snippet qsignalmapper/buttonwidget.cpp 1
+ \snippet qsignalmapper/buttonwidget.cpp 2
A list of texts is passed to the constructor. A signal mapper is
constructed and for each text in the list a QPushButton is
diff --git a/src/corelib/kernel/qsystemsemaphore.cpp b/src/corelib/kernel/qsystemsemaphore.cpp
index 0558f3cb59..70e75b54b9 100644
--- a/src/corelib/kernel/qsystemsemaphore.cpp
+++ b/src/corelib/kernel/qsystemsemaphore.cpp
@@ -79,7 +79,7 @@ QT_BEGIN_NAMESPACE
can use to use the same semaphore.
Example: Create a system semaphore
- \snippet doc/src/snippets/code/src_corelib_kernel_qsystemsemaphore.cpp 0
+ \snippet code/src_corelib_kernel_qsystemsemaphore.cpp 0
A typical application of system semaphores is for controlling access
to a circular buffer shared by a producer process and a consumer
@@ -283,13 +283,13 @@ bool QSystemSemaphore::acquire()
Example: Create a system semaphore having five resources; acquire
them all and then release them all.
- \snippet doc/src/snippets/code/src_corelib_kernel_qsystemsemaphore.cpp 1
+ \snippet code/src_corelib_kernel_qsystemsemaphore.cpp 1
This function can also "create" resources. For example, immediately
following the sequence of statements above, suppose we add the
statement:
- \snippet doc/src/snippets/code/src_corelib_kernel_qsystemsemaphore.cpp 2
+ \snippet code/src_corelib_kernel_qsystemsemaphore.cpp 2
Ten new resources are now guarded by the semaphore, in addition to
the five that already existed. You would not normally use this
diff --git a/src/corelib/kernel/qtimer.cpp b/src/corelib/kernel/qtimer.cpp
index 2131188439..23e1826006 100644
--- a/src/corelib/kernel/qtimer.cpp
+++ b/src/corelib/kernel/qtimer.cpp
@@ -61,9 +61,9 @@ QT_BEGIN_NAMESPACE
Example for a one second (1000 millisecond) timer (from the
\l{widgets/analogclock}{Analog Clock} example):
- \snippet examples/widgets/analogclock/analogclock.cpp 4
- \snippet examples/widgets/analogclock/analogclock.cpp 5
- \snippet examples/widgets/analogclock/analogclock.cpp 6
+ \snippet widgets/analogclock/analogclock.cpp 4
+ \snippet widgets/analogclock/analogclock.cpp 5
+ \snippet widgets/analogclock/analogclock.cpp 6
From then on, the \c update() slot is called every second.
@@ -72,7 +72,7 @@ QT_BEGIN_NAMESPACE
QTimer::singleShot() function to call a slot after a specified
interval:
- \snippet doc/src/snippets/timers/timers.cpp 3
+ \snippet timers/timers.cpp 3
In multithreaded applications, you can use QTimer in any thread
that has an event loop. To start an event loop from a non-GUI
@@ -87,9 +87,9 @@ QT_BEGIN_NAMESPACE
been processed. This can be used to do heavy work while providing
a snappy user interface:
- \snippet doc/src/snippets/timers/timers.cpp 4
- \snippet doc/src/snippets/timers/timers.cpp 5
- \snippet doc/src/snippets/timers/timers.cpp 6
+ \snippet timers/timers.cpp 4
+ \snippet timers/timers.cpp 5
+ \snippet timers/timers.cpp 6
\c processOneThing() will from then on be called repeatedly. It
should be written in such a way that it always returns quickly
@@ -304,7 +304,7 @@ QT_END_INCLUDE_NAMESPACE
create a local QTimer object.
Example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qtimer.cpp 0
+ \snippet code/src_corelib_kernel_qtimer.cpp 0
This sample program automatically terminates after 10 minutes
(600,000 milliseconds).
@@ -343,7 +343,7 @@ void QTimer::singleShot(int msec, Qt::TimerType timerType, QObject *receiver, co
if (msec == 0) {
// special code shortpath for 0-timers
const char* bracketPosition = strchr(member, '(');
- if (!bracketPosition || !(member[0] >= '0' && member[0] <= '3')) {
+ if (!bracketPosition || !(member[0] >= '0' && member[0] <= '2')) {
qWarning("QTimer::singleShot: Invalid slot specification");
return;
}
diff --git a/src/corelib/kernel/qtranslator.cpp b/src/corelib/kernel/qtranslator.cpp
index 892883bacd..c34a3acb70 100644
--- a/src/corelib/kernel/qtranslator.cpp
+++ b/src/corelib/kernel/qtranslator.cpp
@@ -338,7 +338,7 @@ public:
it via QObject::tr(). Here's the \c main() function from the
\l{linguist/hellotr}{Hello tr()} example:
- \snippet examples/linguist/hellotr/main.cpp 2
+ \snippet linguist/hellotr/main.cpp 2
Note that the translator must be created \e before the
application's widgets.
diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp
index 10b86bcb48..7ccc5e500e 100644
--- a/src/corelib/kernel/qvariant.cpp
+++ b/src/corelib/kernel/qvariant.cpp
@@ -87,7 +87,7 @@ class HandlersManager
{
static const QVariant::Handler *Handlers[QModulesPrivate::ModulesCount];
public:
- const QVariant::Handler *operator[] (const int typeId) const
+ const QVariant::Handler *operator[] (const uint typeId) const
{
return Handlers[QModulesPrivate::moduleForType(typeId)];
}
@@ -776,6 +776,7 @@ static void customConstruct(QVariant::Private *d, const void *copy)
const QMetaType type(d->type);
const uint size = type.sizeOf();
if (!size) {
+ qWarning("Trying to construct an instance of an invalid type, type id: %i", d->type);
d->type = QVariant::Invalid;
return;
}
@@ -839,6 +840,9 @@ static void customStreamDebug(QDebug dbg, const QVariant &variant) {
QMetaType::TypeFlags flags = QMetaType::typeFlags(variant.userType());
if (flags & QMetaType::PointerToQObject)
dbg.nospace() << variant.value<QObject*>();
+#else
+ Q_UNUSED(dbg);
+ Q_UNUSED(variant);
#endif
}
#endif
@@ -909,7 +913,7 @@ Q_CORE_EXPORT void QVariantPrivate::registerHandler(const int /* Modules::Names
Here is some example code to demonstrate the use of QVariant:
- \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 0
+ \snippet code/src_corelib_kernel_qvariant.cpp 0
You can even store QList<QVariant> and QMap<QString, QVariant>
values in a variant, so you can easily construct arbitrarily
@@ -921,7 +925,7 @@ Q_CORE_EXPORT void QVariantPrivate::registerHandler(const int /* Modules::Names
have a defined type with no value set. However, note that QVariant
types can only be cast when they have had a value set.
- \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 1
+ \snippet code/src_corelib_kernel_qvariant.cpp 1
QVariant can be extended to support other types than those
mentioned in the \l Type enum. See the \l QMetaType documentation
@@ -935,13 +939,13 @@ Q_CORE_EXPORT void QVariantPrivate::registerHandler(const int /* Modules::Names
toColor() function. Instead, you can use the QVariant::value() or
the qvariant_cast() template function. For example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 2
+ \snippet code/src_corelib_kernel_qvariant.cpp 2
The inverse conversion (e.g., from QColor to QVariant) is
automatic for all data types supported by QVariant, including
GUI-related types:
- \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 3
+ \snippet code/src_corelib_kernel_qvariant.cpp 3
\section1 Using canConvert() and convert() Consecutively
@@ -1677,13 +1681,15 @@ void QVariant::load(QDataStream &s)
return;
}
}
- create(static_cast<int>(typeId), 0);
+ create(typeId, 0);
d.is_null = is_null;
if (!isValid()) {
+ if (s.version() < QDataStream::Qt_5_0) {
// Since we wrote something, we should read something
- QString x;
- s >> x;
+ QString x;
+ s >> x;
+ }
d.is_null = true;
return;
}
@@ -1745,7 +1751,8 @@ void QVariant::save(QDataStream &s) const
}
if (!isValid()) {
- s << QString();
+ if (s.version() < QDataStream::Qt_5_0)
+ s << QString();
return;
}
@@ -2172,7 +2179,6 @@ inline T qNumVariantToHelper(const QVariant::Private &d,
\b{Warning:} If the value is convertible to a \l LongLong but is too
large to be represented in an int, the resulting arithmetic overflow will
not be reflected in \a ok. A simple workaround is to use QString::toInt().
- Fixing this bug has been postponed to Qt 5 in order to avoid breaking existing code.
\sa canConvert(), convert()
*/
@@ -2192,7 +2198,6 @@ int QVariant::toInt(bool *ok) const
\b{Warning:} If the value is convertible to a \l ULongLong but is too
large to be represented in an unsigned int, the resulting arithmetic overflow will
not be reflected in \a ok. A simple workaround is to use QString::toUInt().
- Fixing this bug has been postponed to Qt 5 in order to avoid breaking existing code.
\sa canConvert(), convert()
*/
@@ -2527,7 +2532,7 @@ bool QVariant::convert(int targetTypeId)
}
/*!
- \fn convert(const int type, void *ptr) const
+ \fn bool QVariant::convert(const int type, void *ptr) const
\internal
Created for qvariant_cast() usage
*/
@@ -2671,7 +2676,7 @@ QDebug operator<<(QDebug dbg, const QVariant::Type p)
Example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 4
+ \snippet code/src_corelib_kernel_qvariant.cpp 4
\sa value(), fromValue(), canConvert()
*/
@@ -2688,7 +2693,7 @@ QDebug operator<<(QDebug dbg, const QVariant::Type p)
Example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 5
+ \snippet code/src_corelib_kernel_qvariant.cpp 5
\sa setValue(), fromValue(), canConvert()
*/
@@ -2700,7 +2705,7 @@ QDebug operator<<(QDebug dbg, const QVariant::Type p)
Example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 6
+ \snippet code/src_corelib_kernel_qvariant.cpp 6
\sa convert()
*/
@@ -2712,7 +2717,7 @@ QDebug operator<<(QDebug dbg, const QVariant::Type p)
Example:
- \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 7
+ \snippet code/src_corelib_kernel_qvariant.cpp 7
\note If you are working with custom types, you should use
the Q_DECLARE_METATYPE() macro to register your custom type.
@@ -2737,7 +2742,7 @@ QDebug operator<<(QDebug dbg, const QVariant::Type p)
For example, a QObject pointer can be stored in a variant with the
following code:
- \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 8
+ \snippet code/src_corelib_kernel_qvariant.cpp 8
\sa QVariant::fromValue()
*/
diff --git a/src/corelib/kernel/qwineventnotifier.cpp b/src/corelib/kernel/qwineventnotifier.cpp
index 8af1ab2161..b48bd0c8cc 100644
--- a/src/corelib/kernel/qwineventnotifier.cpp
+++ b/src/corelib/kernel/qwineventnotifier.cpp
@@ -48,6 +48,19 @@
QT_BEGIN_NAMESPACE
+class QWinEventNotifierPrivate : public QObjectPrivate
+{
+ Q_DECLARE_PUBLIC(QWinEventNotifier)
+public:
+ QWinEventNotifierPrivate()
+ : handleToEvent(0), enabled(false) {}
+ QWinEventNotifierPrivate(HANDLE h, bool e)
+ : handleToEvent(h), enabled(e) {}
+
+ HANDLE handleToEvent;
+ bool enabled;
+};
+
/*!
\class QWinEventNotifier
\since 5.0
@@ -103,7 +116,7 @@ QT_BEGIN_NAMESPACE
*/
QWinEventNotifier::QWinEventNotifier(QObject *parent)
- : QObject(parent), handleToEvent(0), enabled(false)
+ : QObject(*new QWinEventNotifierPrivate, parent)
{}
/*!
@@ -118,14 +131,14 @@ QWinEventNotifier::QWinEventNotifier(QObject *parent)
*/
QWinEventNotifier::QWinEventNotifier(HANDLE hEvent, QObject *parent)
- : QObject(parent), handleToEvent(hEvent), enabled(false)
+ : QObject(*new QWinEventNotifierPrivate(hEvent, false), parent)
{
- Q_D(QObject);
+ Q_D(QWinEventNotifier);
QEventDispatcherWin32 *eventDispatcher = qobject_cast<QEventDispatcherWin32 *>(d->threadData->eventDispatcher);
Q_ASSERT_X(eventDispatcher, "QWinEventNotifier::QWinEventNotifier()",
"Cannot create a win event notifier without a QEventDispatcherWin32");
eventDispatcher->registerEventNotifier(this);
- enabled = true;
+ d->enabled = true;
}
/*!
@@ -149,8 +162,9 @@ QWinEventNotifier::~QWinEventNotifier()
void QWinEventNotifier::setHandle(HANDLE hEvent)
{
+ Q_D(QWinEventNotifier);
setEnabled(false);
- handleToEvent = hEvent;
+ d->handleToEvent = hEvent;
}
/*!
@@ -161,7 +175,8 @@ void QWinEventNotifier::setHandle(HANDLE hEvent)
HANDLE QWinEventNotifier::handle() const
{
- return handleToEvent;
+ Q_D(const QWinEventNotifier);
+ return d->handleToEvent;
}
/*!
@@ -172,7 +187,8 @@ HANDLE QWinEventNotifier::handle() const
bool QWinEventNotifier::isEnabled() const
{
- return enabled;
+ Q_D(const QWinEventNotifier);
+ return d->enabled;
}
/*!
@@ -184,16 +200,16 @@ bool QWinEventNotifier::isEnabled() const
void QWinEventNotifier::setEnabled(bool enable)
{
- if (enabled == enable) // no change
+ Q_D(QWinEventNotifier);
+ if (d->enabled == enable) // no change
return;
- enabled = enable;
+ d->enabled = enable;
- Q_D(QObject);
QEventDispatcherWin32 *eventDispatcher = qobject_cast<QEventDispatcherWin32 *>(d->threadData->eventDispatcher);
if (!eventDispatcher) // perhaps application is shutting down
return;
- if (enabled)
+ if (enable)
eventDispatcher->registerEventNotifier(this);
else
eventDispatcher->unregisterEventNotifier(this);
@@ -205,16 +221,17 @@ void QWinEventNotifier::setEnabled(bool enable)
bool QWinEventNotifier::event(QEvent * e)
{
+ Q_D(QWinEventNotifier);
if (e->type() == QEvent::ThreadChange) {
- if (enabled) {
+ if (d->enabled) {
QMetaObject::invokeMethod(this, "setEnabled", Qt::QueuedConnection,
- Q_ARG(bool, enabled));
+ Q_ARG(bool, true));
setEnabled(false);
}
}
QObject::event(e); // will activate filters
if (e->type() == QEvent::WinEventAct) {
- emit activated(handleToEvent);
+ emit activated(d->handleToEvent);
return true;
}
return false;
diff --git a/src/corelib/kernel/qwineventnotifier.h b/src/corelib/kernel/qwineventnotifier.h
index b364c68e05..36ec415124 100644
--- a/src/corelib/kernel/qwineventnotifier.h
+++ b/src/corelib/kernel/qwineventnotifier.h
@@ -54,11 +54,11 @@ QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
-
+class QWinEventNotifierPrivate;
class Q_CORE_EXPORT QWinEventNotifier : public QObject
{
Q_OBJECT
- Q_DECLARE_PRIVATE(QObject)
+ Q_DECLARE_PRIVATE(QWinEventNotifier)
public:
explicit QWinEventNotifier(QObject *parent = 0);
@@ -78,10 +78,6 @@ Q_SIGNALS:
protected:
bool event(QEvent * e);
-
-private:
- HANDLE handleToEvent;
- bool enabled;
};
QT_END_NAMESPACE
diff --git a/src/corelib/mimetypes/qmimedatabase.cpp b/src/corelib/mimetypes/qmimedatabase.cpp
index 2c84a937d5..2ac1978c2a 100644
--- a/src/corelib/mimetypes/qmimedatabase.cpp
+++ b/src/corelib/mimetypes/qmimedatabase.cpp
@@ -289,7 +289,7 @@ bool QMimeDatabasePrivate::inherits(const QString &mime, const QString &parent)
\threadsafe
- \snippet doc/src/snippets/code/src_corelib_mimetype_qmimedatabase.cpp 0
+ \snippet code/src_corelib_mimetype_qmimedatabase.cpp 0
\sa QMimeType
*/
diff --git a/src/corelib/mimetypes/qmimeglobpattern.cpp b/src/corelib/mimetypes/qmimeglobpattern.cpp
index de26dbaf15..77d688d5bf 100644
--- a/src/corelib/mimetypes/qmimeglobpattern.cpp
+++ b/src/corelib/mimetypes/qmimeglobpattern.cpp
@@ -135,7 +135,7 @@ bool QMimeGlobPattern::matchFileName(const QString &inputFilename) const
return (m_pattern == filename);
// Other (quite rare) patterns, like "*.anim[1-9j]": use slow but correct method
- const QRegExp rx(m_pattern, Qt::CaseSensitive, QRegExp::WildcardUnix);
+ QRegExp rx(m_pattern, Qt::CaseSensitive, QRegExp::WildcardUnix);
return rx.exactMatch(filename);
}
diff --git a/src/corelib/plugin/qfactoryloader.cpp b/src/corelib/plugin/qfactoryloader.cpp
index 3f192ea477..fc9e94037f 100644
--- a/src/corelib/plugin/qfactoryloader.cpp
+++ b/src/corelib/plugin/qfactoryloader.cpp
@@ -326,20 +326,29 @@ QObject *QFactoryLoader::instance(const QString &key) const
QObject *QFactoryLoader::instance(int index) const
{
Q_D(const QFactoryLoader);
- if (index < 0 || index >= d->libraryList.size())
+ if (index < 0)
return 0;
- QLibraryPrivate *library = d->libraryList.at(index);
- if (library->instance || library->loadPlugin()) {
- if (!library->inst)
- library->inst = library->instance();
- QObject *obj = library->inst.data();
- if (obj) {
- if (!obj->parent())
- obj->moveToThread(QCoreApplicationPrivate::mainThread());
- return obj;
+ if (index < d->libraryList.size()) {
+ QLibraryPrivate *library = d->libraryList.at(index);
+ if (library->instance || library->loadPlugin()) {
+ if (!library->inst)
+ library->inst = library->instance();
+ QObject *obj = library->inst.data();
+ if (obj) {
+ if (!obj->parent())
+ obj->moveToThread(QCoreApplicationPrivate::mainThread());
+ return obj;
+ }
}
+ return 0;
}
+
+ index -= d->libraryList.size();
+ QVector<QStaticPlugin> staticPlugins = QLibraryPrivate::staticPlugins();
+ if (index < staticPlugins.size())
+ return staticPlugins.at(index).instance();
+
return 0;
}
diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp
index 216e6e1e7c..a704b8f02d 100644
--- a/src/corelib/plugin/qlibrary.cpp
+++ b/src/corelib/plugin/qlibrary.cpp
@@ -127,7 +127,7 @@ static QBasicMutex qt_library_mutex;
symbol is not defined, the function pointer will be 0 and won't be
called.
- \snippet doc/src/snippets/code/src_corelib_plugin_qlibrary.cpp 0
+ \snippet code/src_corelib_plugin_qlibrary.cpp 0
The symbol must be exported as a C function from the library for
resolve() to work. This means that the function must be wrapped in
@@ -138,7 +138,7 @@ static QBasicMutex qt_library_mutex;
use if you just want to call a function in a library without
explicitly loading the library first:
- \snippet doc/src/snippets/code/src_corelib_plugin_qlibrary.cpp 1
+ \snippet code/src_corelib_plugin_qlibrary.cpp 1
\sa QPluginLoader
*/
@@ -163,6 +163,10 @@ static QBasicMutex qt_library_mutex;
If this hint is given, the filename of the library consists of
a path, which is a reference to an archive file, followed by
a reference to the archive member.
+ \value PreventUnloadHint
+ Prevents the library from being unloaded from the address space if close()
+ is called. The library's static variables are not reinitialized if open()
+ is called at a later time.
\sa loadHints
*/
@@ -1118,7 +1122,7 @@ void QLibrary::setFileNameAndVersion(const QString &fileName, const QString &ver
not be resolved or if the library could not be loaded.
Example:
- \snippet doc/src/snippets/code/src_corelib_plugin_qlibrary.cpp 2
+ \snippet code/src_corelib_plugin_qlibrary.cpp 2
The symbol must be exported as a C function from the library. This
means that the function must be wrapped in an \c{extern "C"} if
@@ -1126,11 +1130,11 @@ void QLibrary::setFileNameAndVersion(const QString &fileName, const QString &ver
also explicitly export the function from the DLL using the
\c{__declspec(dllexport)} compiler directive, for example:
- \snippet doc/src/snippets/code/src_corelib_plugin_qlibrary.cpp 3
+ \snippet code/src_corelib_plugin_qlibrary.cpp 3
with \c MY_EXPORT defined as
- \snippet doc/src/snippets/code/src_corelib_plugin_qlibrary.cpp 4
+ \snippet code/src_corelib_plugin_qlibrary.cpp 4
*/
QFunctionPointer QLibrary::resolve(const char *symbol)
{
@@ -1230,6 +1234,8 @@ QString QLibrary::errorString() const
to the library \c shr_64.o in the archive file named \c libGL.a. This
is only supported on the AIX platform.
+ Setting PreventUnloadHint will only apply on Unix platforms.
+
The interpretation of the load hints is platform dependent, and if
you use it you are probably making some assumptions on which platform
you are compiling for, so use them only if you understand the consequences
diff --git a/src/corelib/plugin/qlibrary.h b/src/corelib/plugin/qlibrary.h
index f373ad06b6..80e6fd3d4c 100644
--- a/src/corelib/plugin/qlibrary.h
+++ b/src/corelib/plugin/qlibrary.h
@@ -68,7 +68,8 @@ public:
enum LoadHint {
ResolveAllSymbolsHint = 0x01,
ExportExternalSymbolsHint = 0x02,
- LoadArchiveMemberHint = 0x04
+ LoadArchiveMemberHint = 0x04,
+ PreventUnloadHint = 0x08
};
Q_DECLARE_FLAGS(LoadHints, LoadHint)
diff --git a/src/corelib/plugin/qlibrary_unix.cpp b/src/corelib/plugin/qlibrary_unix.cpp
index cb81440c7e..0ad7a87c97 100644
--- a/src/corelib/plugin/qlibrary_unix.cpp
+++ b/src/corelib/plugin/qlibrary_unix.cpp
@@ -167,6 +167,18 @@ bool QLibraryPrivate::load_sys()
dlFlags |= RTLD_LOCAL;
}
#endif
+
+ // Provide access to RTLD_NODELETE flag on Unix
+ // From GNU documentation on RTLD_NODELETE:
+ // Do not unload the library during dlclose(). Consequently, the
+ // library's specific static variables are not reinitialized if the
+ // library is reloaded with dlopen() at a later time.
+#ifdef RTLD_NODELETE
+ if (loadHints & QLibrary::PreventUnloadHint) {
+ dlFlags |= RTLD_NODELETE;
+ }
+#endif
+
#if defined(Q_OS_AIX) // Not sure if any other platform actually support this thing.
if (loadHints & QLibrary::LoadArchiveMemberHint) {
dlFlags |= RTLD_MEMBER;
diff --git a/src/corelib/plugin/qplugin.qdoc b/src/corelib/plugin/qplugin.qdoc
index 77069e6dfd..001b0d5932 100644
--- a/src/corelib/plugin/qplugin.qdoc
+++ b/src/corelib/plugin/qplugin.qdoc
@@ -42,7 +42,7 @@
to the interface class called \a ClassName. The \a Identifier must
be unique. For example:
- \snippet examples/tools/plugandpaint/interfaces.h 3
+ \snippet tools/plugandpaint/interfaces.h 3
This macro is normally used right after the class definition for
\a ClassName, in a header file. See the
@@ -51,7 +51,7 @@
If you want to use Q_DECLARE_INTERFACE with interface classes
declared in a namespace then you have to make sure the Q_DECLARE_INTERFACE
is not inside a namespace though. For example:
- \snippet doc/src/snippets/code/doc_src_qplugin.cpp 0
+ \snippet code/doc_src_qplugin.cpp 0
\sa Q_INTERFACES(), Q_EXPORT_PLUGIN2(), {How to Create Qt Plugins}
*/
@@ -82,7 +82,7 @@
Example:
- \snippet doc/src/snippets/code/doc_src_qplugin.cpp 1
+ \snippet code/doc_src_qplugin.cpp 1
See the \l{tools/plugandpaint}{Plug & Paint} example for details.
@@ -102,14 +102,14 @@
Example:
- \snippet doc/src/snippets/code/doc_src_qplugin.cpp 2
+ \snippet code/doc_src_qplugin.cpp 2
Static plugins must also be included by the linker when your
application is built. For Qt's predefined plugins,
you can use the \c QTPLUGIN to add
the required plugins to your build. For example:
- \snippet doc/src/snippets/code/doc_src_qplugin.pro 3
+ \snippet code/doc_src_qplugin.pro 3
\sa {Static Plugins}, {How to Create Qt Plugins}, {Using qmake}
*/
diff --git a/src/corelib/plugin/qpluginloader.h b/src/corelib/plugin/qpluginloader.h
index 6ca1892fa9..0e62d3660b 100644
--- a/src/corelib/plugin/qpluginloader.h
+++ b/src/corelib/plugin/qpluginloader.h
@@ -69,7 +69,7 @@ public:
QObject *instance();
- QT_DEPRECATED static QObjectList staticInstances();
+ static QObjectList staticInstances();
bool load();
bool unload();
diff --git a/src/corelib/plugin/quuid.cpp b/src/corelib/plugin/quuid.cpp
index 26032323e0..b1805afd53 100644
--- a/src/corelib/plugin/quuid.cpp
+++ b/src/corelib/plugin/quuid.cpp
@@ -337,7 +337,7 @@ static QUuid createFromName(const QUuid &ns, const QByteArray &baseData, QCrypto
b8.
Example:
- \snippet doc/src/snippets/code/src_corelib_plugin_quuid.cpp 0
+ \snippet code/src_corelib_plugin_quuid.cpp 0
*/
#ifndef QT_NO_QUUID_STRING
@@ -425,7 +425,7 @@ QUuid::QUuid(const QByteArray &text)
/*!
\since 5.0
- \fn QUuid::createUuidV3()
+ \fn QUuid QUuid::createUuidV3(const QUuid &ns, const QByteArray &baseData);
This functions returns a new UUID with variant QUuid::DCE and version QUuid::MD5.
\a ns is the namespace and \a name is the name as described by RFC 4122.
@@ -435,7 +435,7 @@ QUuid::QUuid(const QByteArray &text)
/*!
\since 5.0
- \fn QUuid::createUuidV5()
+ \fn QUuid QUuid::createUuidV5(const QUuid &ns, const QByteArray &baseData);
This functions returns a new UUID with variant QUuid::DCE and version QUuid::SHA1.
\a ns is the namespace and \a name is the name as described by RFC 4122.
diff --git a/src/corelib/statemachine/qstatemachine.cpp b/src/corelib/statemachine/qstatemachine.cpp
index ad2cb02213..b8f7954e33 100644
--- a/src/corelib/statemachine/qstatemachine.cpp
+++ b/src/corelib/statemachine/qstatemachine.cpp
@@ -126,7 +126,7 @@ QT_BEGIN_NAMESPACE
The following snippet shows a state machine that will finish when a button
is clicked:
- \snippet doc/src/snippets/code/src_corelib_statemachine_qstatemachine.cpp simple state machine
+ \snippet code/src_corelib_statemachine_qstatemachine.cpp simple state machine
This code example uses QState, which inherits QAbstractState. The
QState class provides a state that you can use to set properties
@@ -1747,7 +1747,7 @@ QStateMachine::~QStateMachine()
\value RestoreProperties The state machine should save the initial values of properties
and restore them later.
- \sa QStateMachine::globalRestorePolicy QState::assignProperty()
+ \sa QStateMachine::globalRestorePolicy, QState::assignProperty()
*/
@@ -2265,13 +2265,9 @@ void QSignalEventGenerator::qt_static_metacall(QObject *_o, QMetaObject::Call _c
Q_UNUSED(_a);
}
-const QMetaObjectExtraData QSignalEventGenerator::staticMetaObjectExtraData = {
- 0, qt_static_metacall
-};
-
const QMetaObject QSignalEventGenerator::staticMetaObject = {
{ &QObject::staticMetaObject, qt_meta_stringdata_QSignalEventGenerator.data,
- qt_meta_data_QSignalEventGenerator, &staticMetaObjectExtraData }
+ qt_meta_data_QSignalEventGenerator, qt_static_metacall, 0, 0 }
};
const QMetaObject *QSignalEventGenerator::metaObject() const
diff --git a/src/corelib/thread/qatomic.cpp b/src/corelib/thread/qatomic.cpp
index 2e3029f3fa..abd2cc1c93 100644
--- a/src/corelib/thread/qatomic.cpp
+++ b/src/corelib/thread/qatomic.cpp
@@ -68,7 +68,7 @@
functions allow you to implement your own implicitly shared
classes.
- \snippet doc/src/snippets/code/src_corelib_thread_qatomic.cpp 0
+ \snippet code/src_corelib_thread_qatomic.cpp 0
\section2 Memory ordering
@@ -104,7 +104,7 @@
nothing and return false. This operation equates to the following
code:
- \snippet doc/src/snippets/code/src_corelib_thread_qatomic.cpp 1
+ \snippet code/src_corelib_thread_qatomic.cpp 1
There are 4 test-and-set functions: testAndSetRelaxed(),
testAndSetAcquire(), testAndSetRelease(), and
@@ -117,7 +117,7 @@
QAtomicInt and then assign a new value, returning the original
value. This operation equates to the following code:
- \snippet doc/src/snippets/code/src_corelib_thread_qatomic.cpp 2
+ \snippet code/src_corelib_thread_qatomic.cpp 2
There are 4 fetch-and-store functions: fetchAndStoreRelaxed(),
fetchAndStoreAcquire(), fetchAndStoreRelease(), and
@@ -131,7 +131,7 @@
returning the original value. This operation equates to the
following code:
- \snippet doc/src/snippets/code/src_corelib_thread_qatomic.cpp 3
+ \snippet code/src_corelib_thread_qatomic.cpp 3
There are 4 fetch-and-add functions: fetchAndAddRelaxed(),
fetchAndAddAcquire(), fetchAndAddRelease(), and
@@ -215,41 +215,12 @@
Constructs a copy of \a other.
*/
-/*! \fn QAtomicInt &QAtomicInt::operator=(int value)
-
- Assigns the \a value to this QAtomicInt and returns a reference to
- this QAtomicInt.
-*/
-
/*! \fn QAtomicInt &QAtomicInt::operator=(const QAtomicInt &other)
Assigns \a other to this QAtomicInt and returns a reference to
this QAtomicInt.
*/
-/*! \fn bool QAtomicInt::operator==(int value) const
-
- Returns true if the \a value is equal to the value in this
- QAtomicInt; otherwise returns false.
-*/
-
-/*! \fn bool QAtomicInt::operator!=(int value) const
-
- Returns true if the value of this QAtomicInt is not equal to \a
- value; otherwise returns false.
-*/
-
-/*! \fn bool QAtomicInt::operator!() const
-
- Returns true is the value of this QAtomicInt is zero; otherwise
- returns false.
-*/
-
-/*! \fn QAtomicInt::operator int() const
-
- Returns the value stored by the QAtomicInt object as an integer.
-*/
-
/*! \fn bool QAtomicInt::isReferenceCountingNative()
Returns true if reference counting is implemented using atomic
@@ -679,7 +650,7 @@
these functions do nothing and return false. This operation
equates to the following code:
- \snippet doc/src/snippets/code/src_corelib_thread_qatomic.cpp 4
+ \snippet code/src_corelib_thread_qatomic.cpp 4
There are 4 test-and-set functions: testAndSetRelaxed(),
testAndSetAcquire(), testAndSetRelease(), and
@@ -692,7 +663,7 @@
QAtomicPointer and then assign a new value, returning the original
value. This operation equates to the following code:
- \snippet doc/src/snippets/code/src_corelib_thread_qatomic.cpp 5
+ \snippet code/src_corelib_thread_qatomic.cpp 5
There are 4 fetch-and-store functions: fetchAndStoreRelaxed(),
fetchAndStoreAcquire(), fetchAndStoreRelease(), and
@@ -706,7 +677,7 @@
returning the original value. This operation equates to the
following code:
- \snippet doc/src/snippets/code/src_corelib_thread_qatomic.cpp 6
+ \snippet code/src_corelib_thread_qatomic.cpp 6
There are 4 fetch-and-add functions: fetchAndAddRelaxed(),
fetchAndAddAcquire(), fetchAndAddRelease(), and
@@ -783,46 +754,12 @@
Constructs a copy of \a other.
*/
-/*! \fn QAtomicPointer<T> &QAtomicPointer::operator=(T *value)
-
- Assigns the \a value to this QAtomicPointer and returns a
- reference to this QAtomicPointer.
-*/
-
/*! \fn QAtomicPointer<T> &QAtomicPointer::operator=(const QAtomicPointer<T> &other)
Assigns \a other to this QAtomicPointer and returns a reference to
this QAtomicPointer.
*/
-/*! \fn bool QAtomicPointer::operator==(T *value) const
-
- Returns true if the \a value is equal to the value in this
- QAtomicPointer; otherwise returns false.
-*/
-
-/*! \fn bool QAtomicPointer::operator!=(T *value) const
-
- Returns true if the value of this QAtomicPointer is not equal to
- \a value; otherwise returns false.
-*/
-
-/*! \fn bool QAtomicPointer::operator!() const
-
- Returns true is the current value of this QAtomicPointer is zero;
- otherwise returns false.
-*/
-
-/*! \fn QAtomicPointer::operator T *() const
-
- Returns the current pointer value stored by this QAtomicPointer
- object.
-*/
-
-/*! \fn T *QAtomicPointer::operator->() const
-
-*/
-
/*! \fn bool QAtomicPointer::isTestAndSetNative()
Returns true if test-and-set is implemented using atomic processor
diff --git a/src/corelib/thread/qatomic.h b/src/corelib/thread/qatomic.h
index a8e321b46a..5cd9a6a5c4 100644
--- a/src/corelib/thread/qatomic.h
+++ b/src/corelib/thread/qatomic.h
@@ -165,7 +165,7 @@ public:
This is a helper for the assignment operators of implicitly
shared classes. Your assignment operator should look like this:
- \snippet doc/src/snippets/code/src.corelib.thread.qatomic.h 0
+ \snippet code/src.corelib.thread.qatomic.h 0
*/
template <typename T>
inline void qAtomicAssign(T *&d, T *x)
@@ -184,7 +184,7 @@ inline void qAtomicAssign(T *&d, T *x)
the members and sets the refcount to 1. After that, your detach
function should look like this:
- \snippet doc/src/snippets/code/src.corelib.thread.qatomic.h 1
+ \snippet code/src.corelib.thread.qatomic.h 1
*/
template <typename T>
inline void qAtomicDetach(T *&d)
diff --git a/src/corelib/thread/qmutex.cpp b/src/corelib/thread/qmutex.cpp
index 049230f7a4..145916d750 100644
--- a/src/corelib/thread/qmutex.cpp
+++ b/src/corelib/thread/qmutex.cpp
@@ -55,7 +55,7 @@
QT_BEGIN_NAMESPACE
-/*!
+/*
\class QBasicMutex
\brief QMutex POD
\internal
@@ -86,20 +86,20 @@ QT_BEGIN_NAMESPACE
For example, say there is a method that prints a message to the
user on two lines:
- \snippet doc/src/snippets/code/src_corelib_thread_qmutex.cpp 0
+ \snippet code/src_corelib_thread_qmutex.cpp 0
If these two methods are called in succession, the following happens:
- \snippet doc/src/snippets/code/src_corelib_thread_qmutex.cpp 1
+ \snippet code/src_corelib_thread_qmutex.cpp 1
If these two methods are called simultaneously from two threads then the
following sequence could result:
- \snippet doc/src/snippets/code/src_corelib_thread_qmutex.cpp 2
+ \snippet code/src_corelib_thread_qmutex.cpp 2
If we add a mutex, we should get the result we want:
- \snippet doc/src/snippets/code/src_corelib_thread_qmutex.cpp 3
+ \snippet code/src_corelib_thread_qmutex.cpp 3
Then only one thread can modify \c number at any given time and
the result is correct. This is a trivial example, of course, but
@@ -178,26 +178,7 @@ QMutex::~QMutex()
\sa unlock()
*/
-/*!\fn bool QMutex::trylock()
- Attempts to lock the mutex. If the lock was obtained, this function
- returns true. If another thread has locked the mutex, this
- function returns false immediately.
-
- If the lock was obtained, the mutex must be unlocked with unlock()
- before another thread can successfully lock it.
-
- Calling this function multiple times on the same mutex from the
- same thread is allowed if this mutex is a
- \l{QMutex::Recursive}{recursive mutex}. If this mutex is a
- \l{QMutex::NonRecursive}{non-recursive mutex}, this function will
- \e always return false when attempting to lock the mutex
- recursively.
-
- \sa lock(), unlock()
-*/
-
/*! \fn bool QMutex::tryLock(int timeout)
- \overload
Attempts to lock the mutex. This function returns true if the lock
was obtained; otherwise it returns false. If another thread has
@@ -268,7 +249,7 @@ bool QBasicMutex::isRecursive() {
For example, this complex function locks a QMutex upon entering
the function and unlocks the mutex at all the exit points:
- \snippet doc/src/snippets/code/src_corelib_thread_qmutex.cpp 4
+ \snippet code/src_corelib_thread_qmutex.cpp 4
This example function will get more complicated as it is
developed, which increases the likelihood that errors will occur.
@@ -276,7 +257,7 @@ bool QBasicMutex::isRecursive() {
Using QMutexLocker greatly simplifies the code, and makes it more
readable:
- \snippet doc/src/snippets/code/src_corelib_thread_qmutex.cpp 5
+ \snippet code/src_corelib_thread_qmutex.cpp 5
Now, the mutex will always be unlocked when the QMutexLocker
object is destroyed (when the function returns since \c locker is
@@ -292,7 +273,7 @@ bool QBasicMutex::isRecursive() {
for code that needs access to the mutex, such as
QWaitCondition::wait(). For example:
- \snippet doc/src/snippets/code/src_corelib_thread_qmutex.cpp 6
+ \snippet code/src_corelib_thread_qmutex.cpp 6
\sa QReadLocker, QWriteLocker, QMutex
*/
@@ -317,13 +298,6 @@ bool QBasicMutex::isRecursive() {
*/
/*!
- \fn QMutex *QMutexLocker::mutex() const
-
- Returns a pointer to the mutex that was locked in the
- constructor.
-*/
-
-/*!
\fn void QMutexLocker::unlock()
Unlocks this mutex locker. You can use \c relock() to lock
diff --git a/src/corelib/thread/qmutex.h b/src/corelib/thread/qmutex.h
index 9a81b3d4bd..0743c36457 100644
--- a/src/corelib/thread/qmutex.h
+++ b/src/corelib/thread/qmutex.h
@@ -158,7 +158,6 @@ private:
#else // QT_NO_THREAD or qdoc
-
class Q_CORE_EXPORT QMutex
{
public:
diff --git a/src/corelib/thread/qmutex_linux.cpp b/src/corelib/thread/qmutex_linux.cpp
index 1bb5e77e77..a10bd35eff 100644
--- a/src/corelib/thread/qmutex_linux.cpp
+++ b/src/corelib/thread/qmutex_linux.cpp
@@ -51,6 +51,7 @@
#include <sys/syscall.h>
#include <unistd.h>
#include <errno.h>
+#include <asm/unistd.h>
#ifndef QT_LINUX_FUTEX
# error "Qt build is broken: qmutex_linux.cpp is being built but futex support is not wanted"
@@ -71,7 +72,7 @@ static inline int futexFlags()
// try an operation that has no side-effects: wake up 42 threads
// futex will return -1 (errno==ENOSYS) if the flag isn't supported
// there should be no other error conditions
- value = syscall(SYS_futex, &futexFlagSupport,
+ value = syscall(__NR_futex, &futexFlagSupport,
FUTEX_WAKE | FUTEX_PRIVATE_FLAG,
42, 0, 0, 0);
if (value != -1) {
@@ -95,7 +96,9 @@ static inline int _q_futex(void *addr, int op, int val, const struct timespec *t
int *addr2 = 0;
int val2 = 0;
- return syscall(SYS_futex, int_addr, op | futexFlags(), val, timeout, addr2, val2);
+ // we use __NR_futex because some libcs (like Android's bionic) don't
+ // provide SYS_futex etc.
+ return syscall(__NR_futex, int_addr, op | futexFlags(), val, timeout, addr2, val2);
}
static inline QMutexData *dummyFutexValue()
@@ -121,7 +124,7 @@ bool QBasicMutex::lockInternal(int timeout)
struct timespec ts, *pts = 0;
if (timeout >= 1) {
// recalculate the timeout
- qint64 xtimeout = timeout * 1000 * 1000;
+ qint64 xtimeout = qint64(timeout) * 1000 * 1000;
xtimeout -= elapsedTimer.nsecsElapsed();
if (xtimeout <= 0) {
// timer expired after we returned
diff --git a/src/corelib/thread/qmutexpool.cpp b/src/corelib/thread/qmutexpool.cpp
index 6b6674ccdf..4d24f8c7c7 100644
--- a/src/corelib/thread/qmutexpool.cpp
+++ b/src/corelib/thread/qmutexpool.cpp
@@ -66,7 +66,7 @@ Q_GLOBAL_STATIC_WITH_ARGS(QMutexPool, globalMutexPool, (QMutex::Recursive))
For example, consider this simple class:
- \snippet doc/src/snippets/code/src_corelib_thread_qmutexpool.cpp 0
+ \snippet code/src_corelib_thread_qmutexpool.cpp 0
Adding a QMutex member to the Number class does not make sense,
because it is so small. However, in order to ensure that access to
@@ -76,7 +76,7 @@ Q_GLOBAL_STATIC_WITH_ARGS(QMutexPool, globalMutexPool, (QMutex::Recursive))
Code to calculate the square of a number would then look something
like this:
- \snippet doc/src/snippets/code/src_corelib_thread_qmutexpool.cpp 1
+ \snippet code/src_corelib_thread_qmutexpool.cpp 1
This function will safely calculate the square of a number, since
it uses a mutex from a QMutexPool. The mutex is locked and
diff --git a/src/corelib/thread/qreadwritelock.cpp b/src/corelib/thread/qreadwritelock.cpp
index 519bae9fa6..1aba2f537e 100644
--- a/src/corelib/thread/qreadwritelock.cpp
+++ b/src/corelib/thread/qreadwritelock.cpp
@@ -71,7 +71,7 @@ QT_BEGIN_NAMESPACE
Example:
- \snippet doc/src/snippets/code/src_corelib_thread_qreadwritelock.cpp 0
+ \snippet code/src_corelib_thread_qreadwritelock.cpp 0
To ensure that writers aren't blocked forever by readers, readers
attempting to obtain a lock will not succeed if there is a blocked
@@ -135,7 +135,7 @@ QReadWriteLock::~QReadWriteLock()
thread if any thread (including the current) has locked for
writing.
- \sa unlock() lockForWrite() tryLockForRead()
+ \sa unlock(), lockForWrite(), tryLockForRead()
*/
void QReadWriteLock::lockForRead()
{
@@ -178,7 +178,7 @@ void QReadWriteLock::lockForRead()
If the lock was obtained, the lock must be unlocked with unlock()
before another thread can successfully lock it.
- \sa unlock() lockForRead()
+ \sa unlock(), lockForRead()
*/
bool QReadWriteLock::tryLockForRead()
{
@@ -223,7 +223,7 @@ bool QReadWriteLock::tryLockForRead()
If the lock was obtained, the lock must be unlocked with unlock()
before another thread can successfully lock it.
- \sa unlock() lockForRead()
+ \sa unlock(), lockForRead()
*/
bool QReadWriteLock::tryLockForRead(int timeout)
{
@@ -263,7 +263,7 @@ bool QReadWriteLock::tryLockForRead(int timeout)
Locks the lock for writing. This function will block the current
thread if another thread has locked for reading or writing.
- \sa unlock() lockForRead() tryLockForWrite()
+ \sa unlock(), lockForRead(), tryLockForWrite()
*/
void QReadWriteLock::lockForWrite()
{
@@ -303,7 +303,7 @@ void QReadWriteLock::lockForWrite()
If the lock was obtained, the lock must be unlocked with unlock()
before another thread can successfully lock it.
- \sa unlock() lockForWrite()
+ \sa unlock(), lockForWrite()
*/
bool QReadWriteLock::tryLockForWrite()
{
@@ -347,7 +347,7 @@ bool QReadWriteLock::tryLockForWrite()
If the lock was obtained, the lock must be unlocked with unlock()
before another thread can successfully lock it.
- \sa unlock() lockForWrite()
+ \sa unlock(), lockForWrite()
*/
bool QReadWriteLock::tryLockForWrite(int timeout)
{
@@ -389,7 +389,7 @@ bool QReadWriteLock::tryLockForWrite(int timeout)
Attempting to unlock a lock that is not locked is an error, and will result
in program termination.
- \sa lockForRead() lockForWrite() tryLockForRead() tryLockForWrite()
+ \sa lockForRead(), lockForWrite(), tryLockForRead(), tryLockForWrite()
*/
void QReadWriteLock::unlock()
{
@@ -443,11 +443,11 @@ void QReadWriteLock::unlock()
Here's an example that uses QReadLocker to lock and unlock a
read-write lock for reading:
- \snippet doc/src/snippets/code/src_corelib_thread_qreadwritelock.cpp 1
+ \snippet code/src_corelib_thread_qreadwritelock.cpp 1
It is equivalent to the following code:
- \snippet doc/src/snippets/code/src_corelib_thread_qreadwritelock.cpp 2
+ \snippet code/src_corelib_thread_qreadwritelock.cpp 2
The QMutexLocker documentation shows examples where the use of a
locker object greatly simplifies programming.
@@ -515,11 +515,11 @@ void QReadWriteLock::unlock()
Here's an example that uses QWriteLocker to lock and unlock a
read-write lock for writing:
- \snippet doc/src/snippets/code/src_corelib_thread_qreadwritelock.cpp 3
+ \snippet code/src_corelib_thread_qreadwritelock.cpp 3
It is equivalent to the following code:
- \snippet doc/src/snippets/code/src_corelib_thread_qreadwritelock.cpp 4
+ \snippet code/src_corelib_thread_qreadwritelock.cpp 4
The QMutexLocker documentation shows examples where the use of a
locker object greatly simplifies programming.
diff --git a/src/corelib/thread/qsemaphore.cpp b/src/corelib/thread/qsemaphore.cpp
index 08952eeaa3..e5b460b725 100644
--- a/src/corelib/thread/qsemaphore.cpp
+++ b/src/corelib/thread/qsemaphore.cpp
@@ -78,7 +78,7 @@ QT_BEGIN_NAMESPACE
Example:
- \snippet doc/src/snippets/code/src_corelib_thread_qsemaphore.cpp 0
+ \snippet code/src_corelib_thread_qsemaphore.cpp 0
A typical application of semaphores is for controlling access to
a circular buffer shared by a producer thread and a consumer
@@ -151,7 +151,7 @@ void QSemaphore::acquire(int n)
This function can be used to "create" resources as well. For
example:
- \snippet doc/src/snippets/code/src_corelib_thread_qsemaphore.cpp 1
+ \snippet code/src_corelib_thread_qsemaphore.cpp 1
\sa acquire(), available()
*/
@@ -182,7 +182,7 @@ int QSemaphore::available() const
Example:
- \snippet doc/src/snippets/code/src_corelib_thread_qsemaphore.cpp 2
+ \snippet code/src_corelib_thread_qsemaphore.cpp 2
\sa acquire()
*/
@@ -208,7 +208,7 @@ bool QSemaphore::tryAcquire(int n)
Example:
- \snippet doc/src/snippets/code/src_corelib_thread_qsemaphore.cpp 3
+ \snippet code/src_corelib_thread_qsemaphore.cpp 3
\sa acquire()
*/
diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp
index ea6760a1b9..f93f383d3c 100644
--- a/src/corelib/thread/qthread.cpp
+++ b/src/corelib/thread/qthread.cpp
@@ -184,7 +184,7 @@ QThreadPrivate::~QThreadPrivate()
below). To create your own threads, subclass QThread and
reimplement run(). For example:
- \snippet doc/src/snippets/code/src_corelib_thread_qthread.cpp 0
+ \snippet code/src_corelib_thread_qthread.cpp 0
This will create a QTcpSocket in the thread and then execute the
thread's event loop. Use the start() method to begin execution.
@@ -493,7 +493,7 @@ int QThread::exec()
is not running then the next call to QThread::exec() will also return
immediately.
- \sa quit() QEventLoop
+ \sa quit(), QEventLoop
*/
void QThread::exit(int returnCode)
{
@@ -515,7 +515,7 @@ void QThread::exit(int returnCode)
This function does nothing if the thread does not have an event
loop.
- \sa exit() QEventLoop
+ \sa exit(), QEventLoop
*/
void QThread::quit()
{ exit(); }
@@ -529,7 +529,7 @@ void QThread::quit()
work. Returning from this method will end the execution of the
thread.
- \sa start() wait()
+ \sa start(), wait()
*/
void QThread::run()
{
@@ -553,7 +553,7 @@ void QThread::run()
(such as on Linux, see http://linux.die.net/man/2/sched_setscheduler
for more details).
- \sa Priority priority() start()
+ \sa Priority, priority(), start()
*/
/*!
@@ -562,7 +562,7 @@ void QThread::run()
Returns the priority for a running thread. If the thread is not
running, this function returns \c InheritPriority.
- \sa Priority setPriority() start()
+ \sa Priority, setPriority(), start()
*/
QThread::Priority QThread::priority() const
{
diff --git a/src/corelib/thread/qthread_unix.cpp b/src/corelib/thread/qthread_unix.cpp
index 21ed8131df..a47115cfac 100644
--- a/src/corelib/thread/qthread_unix.cpp
+++ b/src/corelib/thread/qthread_unix.cpp
@@ -44,11 +44,15 @@
#include "qplatformdefs.h"
#include <private/qcoreapplication_p.h>
-#if !defined(QT_NO_GLIB)
-# include "../kernel/qeventdispatcher_glib_p.h"
-#endif
-#include <private/qeventdispatcher_unix_p.h>
+#if defined(Q_OS_BLACKBERRY)
+# include <private/qeventdispatcher_blackberry_p.h>
+#else
+# if !defined(QT_NO_GLIB)
+# include "../kernel/qeventdispatcher_glib_p.h"
+# endif
+# include <private/qeventdispatcher_unix_p.h>
+#endif
#include "qthreadstorage.h"
@@ -79,9 +83,9 @@
# define old_qDebug qDebug
# undef qDebug
# endif
-#ifndef QT_NO_CORESERVICES
+#ifndef Q_OS_IOS
# include <CoreServices/CoreServices.h>
-#endif //QT_NO_CORESERVICES
+#endif //Q_OS_IOS
# ifdef old_qDebug
# undef qDebug
@@ -248,6 +252,9 @@ typedef void*(*QtThreadCallback)(void*);
void QThreadPrivate::createEventDispatcher(QThreadData *data)
{
+#if defined(Q_OS_BLACKBERRY)
+ data->eventDispatcher = new QEventDispatcherBlackberry;
+#else
#if !defined(QT_NO_GLIB)
if (qgetenv("QT_NO_GLIB").isEmpty()
&& qgetenv("QT_NO_THREADED_GLIB").isEmpty()
@@ -256,6 +263,8 @@ void QThreadPrivate::createEventDispatcher(QThreadData *data)
else
#endif
data->eventDispatcher = new QEventDispatcherUNIX;
+#endif
+
data->eventDispatcher->startingUp();
}
@@ -288,7 +297,7 @@ void *QThreadPrivate::start(void *arg)
else
createEventDispatcher(data);
-#if (defined(Q_OS_LINUX) || defined(Q_OS_MAC))
+#if (defined(Q_OS_LINUX) || defined(Q_OS_MAC) || defined(Q_OS_QNX))
// sets the name of the current thread.
QByteArray objectName = thr->objectName().toLocal8Bit();
@@ -299,6 +308,8 @@ void *QThreadPrivate::start(void *arg)
prctl(PR_SET_NAME, (unsigned long)objectName.constData(), 0, 0, 0);
#elif defined(Q_OS_MAC)
pthread_setname_np(objectName.constData());
+#elif defined(Q_OS_QNX)
+ pthread_setname_np(thr->d_func()->thread_id, objectName.constData());
#endif
#endif
@@ -371,7 +382,7 @@ int QThread::idealThreadCount()
{
int cores = -1;
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
// Mac OS X
cores = MPProcessorsScheduled();
#elif defined(Q_OS_HPUX)
diff --git a/src/corelib/thread/qthread_win.cpp b/src/corelib/thread/qthread_win.cpp
index 1cde07e330..433c561f1f 100644
--- a/src/corelib/thread/qthread_win.cpp
+++ b/src/corelib/thread/qthread_win.cpp
@@ -182,7 +182,7 @@ void qt_watch_adopted_thread(const HANDLE adoptedThreadHandle, QThread *qthread)
}
}
-/*! \internal
+/*
This function loops and waits for native adopted threads to finish.
When this happens it derefs the QThreadData for the adopted thread
to make sure it gets cleaned up properly.
diff --git a/src/corelib/thread/qthreadpool.cpp b/src/corelib/thread/qthreadpool.cpp
index b7021817c5..c913146122 100644
--- a/src/corelib/thread/qthreadpool.cpp
+++ b/src/corelib/thread/qthreadpool.cpp
@@ -47,15 +47,6 @@
QT_BEGIN_NAMESPACE
-inline bool operator<(int priority, const QPair<QRunnable *, int> &p)
-{
- return p.second < priority;
-}
-inline bool operator<(const QPair<QRunnable *, int> &p, int priority)
-{
- return priority < p.second;
-}
-
Q_GLOBAL_STATIC(QThreadPool, theInstance)
/*
@@ -209,15 +200,22 @@ bool QThreadPoolPrivate::tryStart(QRunnable *task)
return true;
}
+inline bool operator<(int priority, const QPair<QRunnable *, int> &p)
+{ return p.second < priority; }
+inline bool operator<(const QPair<QRunnable *, int> &p, int priority)
+{ return priority < p.second; }
+
void QThreadPoolPrivate::enqueueTask(QRunnable *runnable, int priority)
{
if (runnable->autoDelete())
++runnable->ref;
// put it on the queue
- QList<QPair<QRunnable *, int> >::iterator at =
- qUpperBound(queue.begin(), queue.end(), priority);
- queue.insert(at, qMakePair(runnable, priority));
+ QList<QPair<QRunnable *, int> >::const_iterator begin = queue.constBegin();
+ QList<QPair<QRunnable *, int> >::const_iterator it = queue.constEnd();
+ if (it != begin && priority < (*(it - 1)).second)
+ it = qUpperBound(begin, --it, priority);
+ queue.insert(it - begin, qMakePair(runnable, priority));
runnableReady.wakeOne();
}
@@ -362,7 +360,7 @@ void QThreadPoolPrivate::stealRunnable(QRunnable *runnable)
the run() virtual function. Then create an object of that class and pass
it to QThreadPool::start().
- \snippet doc/src/snippets/code/src_corelib_concurrent_qthreadpool.cpp 0
+ \snippet code/src_corelib_concurrent_qthreadpool.cpp 0
QThreadPool deletes the QRunnable automatically by default. Use
QRunnable::setAutoDelete() to change the auto-deletion flag.
@@ -412,8 +410,7 @@ QThreadPool::QThreadPool(QObject *parent)
*/
QThreadPool::~QThreadPool()
{
- d_func()->waitForDone();
- d_func()->reset();
+ waitForDone();
}
/*!
@@ -595,22 +592,10 @@ void QThreadPool::releaseThread()
}
/*!
- Waits for each thread to exit and removes all threads from the thread pool.
-*/
-void QThreadPool::waitForDone()
-{
- Q_D(QThreadPool);
- d->waitForDone();
- d->reset();
-}
-
-/*!
- \overload waitForDone()
- \since 4.8
-
Waits up to \a msecs milliseconds for all threads to exit and removes all
threads from the thread pool. Returns true if all threads were removed;
- otherwise it returns false.
+ otherwise it returns false. If \a msecs is -1 (the default), the timeout
+ is ignored (waits for the last thread to exit).
*/
bool QThreadPool::waitForDone(int msecs)
{
diff --git a/src/corelib/thread/qthreadpool.h b/src/corelib/thread/qthreadpool.h
index 9fc023c56d..dd931713f7 100644
--- a/src/corelib/thread/qthreadpool.h
+++ b/src/corelib/thread/qthreadpool.h
@@ -83,8 +83,7 @@ public:
void reserveThread();
void releaseThread();
- void waitForDone();
- bool waitForDone(int msecs);
+ bool waitForDone(int msecs = -1);
};
QT_END_NAMESPACE
diff --git a/src/corelib/thread/qthreadpool_p.h b/src/corelib/thread/qthreadpool_p.h
index 910e0b0714..760732993d 100644
--- a/src/corelib/thread/qthreadpool_p.h
+++ b/src/corelib/thread/qthreadpool_p.h
@@ -82,7 +82,7 @@ public:
void startThread(QRunnable *runnable = 0);
void reset();
- bool waitForDone(int msecs = -1);
+ bool waitForDone(int msecs);
void stealRunnable(QRunnable *);
mutable QMutex mutex;
diff --git a/src/corelib/thread/qthreadstorage.cpp b/src/corelib/thread/qthreadstorage.cpp
index 68db8fe261..caa2ac907f 100644
--- a/src/corelib/thread/qthreadstorage.cpp
+++ b/src/corelib/thread/qthreadstorage.cpp
@@ -238,9 +238,9 @@ void QThreadStorageData::finish(void **p)
removeFromCache() functions. The cache is automatically
deleted when the calling thread exits.
- \snippet doc/src/snippets/threads/threads.cpp 7
- \snippet doc/src/snippets/threads/threads.cpp 8
- \snippet doc/src/snippets/threads/threads.cpp 9
+ \snippet threads/threads.cpp 7
+ \snippet threads/threads.cpp 8
+ \snippet threads/threads.cpp 9
\section1 Caveats
diff --git a/src/corelib/thread/qwaitcondition.qdoc b/src/corelib/thread/qwaitcondition.qdoc
index 81c095f394..58679c4543 100644
--- a/src/corelib/thread/qwaitcondition.qdoc
+++ b/src/corelib/thread/qwaitcondition.qdoc
@@ -45,7 +45,7 @@
split into a thread, each of which would have a
\l{QThread::run()}{run()} body like this:
- \snippet doc/src/snippets/code/src_corelib_thread_qwaitcondition_unix.cpp 0
+ \snippet code/src_corelib_thread_qwaitcondition_unix.cpp 0
Here, the \c keyPressed variable is a global variable of type
QWaitCondition.
@@ -53,7 +53,7 @@
A fourth thread would read key presses and wake the other three
threads up every time it receives one, like this:
- \snippet doc/src/snippets/code/src_corelib_thread_qwaitcondition_unix.cpp 1
+ \snippet code/src_corelib_thread_qwaitcondition_unix.cpp 1
The order in which the three threads are woken up is undefined.
Also, if some of the threads are still in \c do_something() when
@@ -63,11 +63,11 @@
counter and a QMutex to guard it. For example, here's the new
code for the worker threads:
- \snippet doc/src/snippets/code/src_corelib_thread_qwaitcondition_unix.cpp 2
+ \snippet code/src_corelib_thread_qwaitcondition_unix.cpp 2
Here's the code for the fourth thread:
- \snippet doc/src/snippets/code/src_corelib_thread_qwaitcondition_unix.cpp 3
+ \snippet code/src_corelib_thread_qwaitcondition_unix.cpp 3
The mutex is necessary because the results of two threads
attempting to change the value of the same variable
diff --git a/src/corelib/tools/qalgorithms.qdoc b/src/corelib/tools/qalgorithms.qdoc
index 5a4a278ad0..28fd9881d6 100644
--- a/src/corelib/tools/qalgorithms.qdoc
+++ b/src/corelib/tools/qalgorithms.qdoc
@@ -60,14 +60,14 @@
a particular value. If you need that functionality, you can use
qFill():
- \snippet doc/src/snippets/code/doc_src_qalgorithms.cpp 0
+ \snippet code/doc_src_qalgorithms.cpp 0
qFill() takes a begin iterator, an end iterator, and a value.
In the example above, we pass \c list.begin() and \c list.end()
as the begin and end iterators, but this doesn't have to be
the case:
- \snippet doc/src/snippets/code/doc_src_qalgorithms.cpp 1
+ \snippet code/doc_src_qalgorithms.cpp 1
Different algorithms can have different requirements for the
iterators they accept. For example, qFill() accepts two
@@ -98,13 +98,13 @@
name_table array and return the corresponding Unicode value from
the \c value_table if the entity is recognized:
- \snippet doc/src/snippets/code/doc_src_qalgorithms.cpp 2
+ \snippet code/doc_src_qalgorithms.cpp 2
This kind of code is for advanced users only; for most
applications, a QMap- or QHash-based approach would work just as
well:
- \snippet doc/src/snippets/code/doc_src_qalgorithms.cpp 3
+ \snippet code/doc_src_qalgorithms.cpp 3
\section1 Types of Iterators
@@ -185,7 +185,7 @@
position \a begin2 + 1; and so on.
Example:
- \snippet doc/src/snippets/code/doc_src_qalgorithms.cpp 4
+ \snippet code/doc_src_qalgorithms.cpp 4
\sa qCopyBackward(), {input iterators}, {output iterators}
*/
@@ -201,7 +201,7 @@
at position \a end2 - 2; and so on.
Example:
- \snippet doc/src/snippets/code/doc_src_qalgorithms.cpp 5
+ \snippet code/doc_src_qalgorithms.cpp 5
\sa qCopy(), {bidirectional iterators}
*/
@@ -214,7 +214,7 @@
items compare equal; otherwise returns false.
Example:
- \snippet doc/src/snippets/code/doc_src_qalgorithms.cpp 6
+ \snippet code/doc_src_qalgorithms.cpp 6
This function requires the item type (in the example above,
QString) to implement \c operator==().
@@ -228,7 +228,7 @@
Fills the range [\a begin, \a end) with \a value.
Example:
- \snippet doc/src/snippets/code/doc_src_qalgorithms.cpp 7
+ \snippet code/doc_src_qalgorithms.cpp 7
\sa qCopy(), {forward iterators}
*/
@@ -249,7 +249,7 @@
value isn't found.
Example:
- \snippet doc/src/snippets/code/doc_src_qalgorithms.cpp 8
+ \snippet code/doc_src_qalgorithms.cpp 8
This function requires the item type (in the example above,
QString) to implement \c operator==().
@@ -278,7 +278,7 @@
Example:
- \snippet doc/src/snippets/code/doc_src_qalgorithms.cpp 9
+ \snippet code/doc_src_qalgorithms.cpp 9
This function requires the item type (in the example above,
\c int) to implement \c operator==().
@@ -302,7 +302,7 @@ of \a value in the variable passed as a reference in argument \a n.
Exchanges the values of variables \a var1 and \a var2.
Example:
- \snippet doc/src/snippets/code/doc_src_qalgorithms.cpp 10
+ \snippet code/doc_src_qalgorithms.cpp 10
*/
/*! \fn void qSort(RandomAccessIterator begin, RandomAccessIterator end)
@@ -312,7 +312,7 @@ of \a value in the variable passed as a reference in argument \a n.
using the quicksort algorithm.
Example:
- \snippet doc/src/snippets/code/doc_src_qalgorithms.cpp 11
+ \snippet code/doc_src_qalgorithms.cpp 11
The sort algorithm is efficient on large data sets. It operates
in \l {linear-logarithmic time}, O(\e{n} log \e{n}).
@@ -338,13 +338,13 @@ of \a value in the variable passed as a reference in argument \a n.
For example, here's how to sort the strings in a QStringList
in case-insensitive alphabetical order:
- \snippet doc/src/snippets/code/doc_src_qalgorithms.cpp 12
+ \snippet code/doc_src_qalgorithms.cpp 12
To sort values in reverse order, pass
\l{qGreater()}{qGreater<T>()} as the \a lessThan parameter. For
example:
- \snippet doc/src/snippets/code/doc_src_qalgorithms.cpp 13
+ \snippet code/doc_src_qalgorithms.cpp 13
If neither of the two items is "less than" the other, the items are
taken to be equal. It is then undefined which one of the two
@@ -356,7 +356,7 @@ of \a value in the variable passed as a reference in argument \a n.
following code shows how to sort a list of strings case
insensitively using QMap:
- \snippet doc/src/snippets/code/doc_src_qalgorithms.cpp 14
+ \snippet code/doc_src_qalgorithms.cpp 14
\sa QMap
*/
@@ -382,7 +382,7 @@ of \a value in the variable passed as a reference in argument \a n.
property is often useful when sorting user-visible data.
Example:
- \snippet doc/src/snippets/code/doc_src_qalgorithms.cpp 15
+ \snippet code/doc_src_qalgorithms.cpp 15
The sort algorithm is efficient on large data sets. It operates
in \l {linear-logarithmic time}, O(\e{n} log \e{n}).
@@ -405,7 +405,7 @@ of \a value in the variable passed as a reference in argument \a n.
For example, here's how to sort the strings in a QStringList
in case-insensitive alphabetical order:
- \snippet doc/src/snippets/code/doc_src_qalgorithms.cpp 16
+ \snippet code/doc_src_qalgorithms.cpp 16
Note that earlier versions of Qt allowed using a lessThan function that took its
arguments by non-const reference. From 4.3 and on this is no longer possible,
@@ -415,7 +415,7 @@ of \a value in the variable passed as a reference in argument \a n.
\l{qGreater()}{qGreater<T>()} as the \a lessThan parameter. For
example:
- \snippet doc/src/snippets/code/doc_src_qalgorithms.cpp 17
+ \snippet code/doc_src_qalgorithms.cpp 17
If neither of the two items is "less than" the other, the items are
taken to be equal. The item that appeared before the other in the
@@ -444,7 +444,7 @@ of \a value in the variable passed as a reference in argument \a n.
ascending order; see qSort().
Example:
- \snippet doc/src/snippets/code/doc_src_qalgorithms.cpp 18
+ \snippet code/doc_src_qalgorithms.cpp 18
This function requires the item type (in the example above,
\c{int}) to implement \c operator<().
@@ -452,7 +452,7 @@ of \a value in the variable passed as a reference in argument \a n.
qLowerBound() can be used in conjunction with qUpperBound() to
iterate over all occurrences of the same value:
- \snippet doc/src/snippets/code/doc_src_qalgorithms.cpp 19
+ \snippet code/doc_src_qalgorithms.cpp 19
\sa qUpperBound(), qBinaryFind()
*/
@@ -494,7 +494,7 @@ of \a value in the variable passed as a reference in argument \a n.
ascending order; see qSort().
Example:
- \snippet doc/src/snippets/code/doc_src_qalgorithms.cpp 20
+ \snippet code/doc_src_qalgorithms.cpp 20
This function requires the item type (in the example above,
\c{int}) to implement \c operator<().
@@ -502,7 +502,7 @@ of \a value in the variable passed as a reference in argument \a n.
qUpperBound() can be used in conjunction with qLowerBound() to
iterate over all occurrences of the same value:
- \snippet doc/src/snippets/code/doc_src_qalgorithms.cpp 21
+ \snippet code/doc_src_qalgorithms.cpp 21
\sa qLowerBound(), qBinaryFind()
*/
@@ -545,7 +545,7 @@ of \a value in the variable passed as a reference in argument \a n.
finer control.
Example:
- \snippet doc/src/snippets/code/doc_src_qalgorithms.cpp 22
+ \snippet code/doc_src_qalgorithms.cpp 22
This function requires the item type (in the example above,
QString) to implement \c operator<().
@@ -587,7 +587,7 @@ of \a value in the variable passed as a reference in argument \a n.
example, \c{QWidget *}).
Example:
- \snippet doc/src/snippets/code/doc_src_qalgorithms.cpp 23
+ \snippet code/doc_src_qalgorithms.cpp 23
Notice that qDeleteAll() doesn't remove the items from the
container; it merely calls \c delete on them. In the example
@@ -618,7 +618,7 @@ of \a value in the variable passed as a reference in argument \a n.
Example:
- \snippet doc/src/snippets/code/doc_src_qalgorithms.cpp 24
+ \snippet code/doc_src_qalgorithms.cpp 24
\sa {qGreater()}{qGreater<T>()}
*/
@@ -631,7 +631,7 @@ of \a value in the variable passed as a reference in argument \a n.
Example:
- \snippet doc/src/snippets/code/doc_src_qalgorithms.cpp 25
+ \snippet code/doc_src_qalgorithms.cpp 25
\sa {qLess()}{qLess<T>()}
*/
diff --git a/src/corelib/tools/qarraydata.cpp b/src/corelib/tools/qarraydata.cpp
index f1b88d5051..328d39cde9 100644
--- a/src/corelib/tools/qarraydata.cpp
+++ b/src/corelib/tools/qarraydata.cpp
@@ -82,7 +82,7 @@ QArrayData *QArrayData::allocate(size_t objectSize, size_t alignment,
// Allocate additional space if array is growing
if (options & Grow)
- capacity = qAllocMore(objectSize * capacity, headerSize) / objectSize;
+ capacity = qAllocMore(objectSize * capacity, headerSize) / int(objectSize);
size_t allocSize = headerSize + objectSize * capacity;
diff --git a/src/corelib/tools/qarraydata.h b/src/corelib/tools/qarraydata.h
index 78fbc9cf32..4d79c92cec 100644
--- a/src/corelib/tools/qarraydata.h
+++ b/src/corelib/tools/qarraydata.h
@@ -169,7 +169,7 @@ struct QTypedArrayData
result->offset = reinterpret_cast<const char *>(data)
- reinterpret_cast<const char *>(result);
- result->size = n;
+ result->size = int(n);
}
return result;
}
diff --git a/src/corelib/tools/qbitarray.cpp b/src/corelib/tools/qbitarray.cpp
index 4cb08a7310..0e74e15a27 100644
--- a/src/corelib/tools/qbitarray.cpp
+++ b/src/corelib/tools/qbitarray.cpp
@@ -64,7 +64,7 @@ QT_BEGIN_NAMESPACE
The following code constructs a QBitArray containing 200 bits
initialized to false (0):
- \snippet doc/src/snippets/code/src_corelib_tools_qbitarray.cpp 0
+ \snippet code/src_corelib_tools_qbitarray.cpp 0
To initialize the bits to true, either pass \c true as second
argument to the constructor, or call fill() later on.
@@ -75,13 +75,13 @@ QT_BEGIN_NAMESPACE
bit that can be used on the left side of an assignment. For
example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbitarray.cpp 1
+ \snippet code/src_corelib_tools_qbitarray.cpp 1
For technical reasons, it is more efficient to use testBit() and
setBit() to access bits in the array than operator[](). For
example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbitarray.cpp 2
+ \snippet code/src_corelib_tools_qbitarray.cpp 2
QBitArray supports \c{&} (\link operator&() AND\endlink), \c{|}
(\link operator|() OR\endlink), \c{^} (\link operator^()
@@ -90,7 +90,7 @@ QT_BEGIN_NAMESPACE
as the built-in C++ bitwise operators of the same name. For
example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbitarray.cpp 3
+ \snippet code/src_corelib_tools_qbitarray.cpp 3
For historical reasons, QBitArray distinguishes between a null
bit array and an empty bit array. A \e null bit array is a bit
@@ -99,7 +99,7 @@ QT_BEGIN_NAMESPACE
array is always empty, but an empty bit array isn't necessarily
null:
- \snippet doc/src/snippets/code/src_corelib_tools_qbitarray.cpp 4
+ \snippet code/src_corelib_tools_qbitarray.cpp 4
All functions except isNull() treat null bit arrays the same as
empty bit arrays; for example, QBitArray() compares equal to
@@ -228,7 +228,7 @@ void QBitArray::resize(int size)
Returns true if this bit array is null; otherwise returns false.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbitarray.cpp 5
+ \snippet code/src_corelib_tools_qbitarray.cpp 5
Qt makes a distinction between null bit arrays and empty bit
arrays for historical reasons. For most applications, what
@@ -245,7 +245,7 @@ void QBitArray::resize(int size)
the bit array is resized to \a size beforehand.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbitarray.cpp 6
+ \snippet code/src_corelib_tools_qbitarray.cpp 6
\sa resize()
*/
@@ -372,7 +372,7 @@ void QBitArray::fill(bool value, int begin, int end)
\a i < size()).
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbitarray.cpp 7
+ \snippet code/src_corelib_tools_qbitarray.cpp 7
The return value is of type QBitRef, a helper class for QBitArray.
When you get an object of type QBitRef, you can assign to
@@ -451,7 +451,7 @@ void QBitArray::fill(bool value, int begin, int end)
taken to be 0.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbitarray.cpp 8
+ \snippet code/src_corelib_tools_qbitarray.cpp 8
\sa operator&(), operator|=(), operator^=(), operator~()
*/
@@ -480,7 +480,7 @@ QBitArray &QBitArray::operator&=(const QBitArray &other)
taken to be 0.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbitarray.cpp 9
+ \snippet code/src_corelib_tools_qbitarray.cpp 9
\sa operator|(), operator&=(), operator^=(), operator~()
*/
@@ -506,7 +506,7 @@ QBitArray &QBitArray::operator|=(const QBitArray &other)
taken to be 0.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbitarray.cpp 10
+ \snippet code/src_corelib_tools_qbitarray.cpp 10
\sa operator^(), operator&=(), operator|=(), operator~()
*/
@@ -527,7 +527,7 @@ QBitArray &QBitArray::operator^=(const QBitArray &other)
array.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbitarray.cpp 11
+ \snippet code/src_corelib_tools_qbitarray.cpp 11
\sa operator&(), operator|(), operator^()
*/
@@ -559,7 +559,7 @@ QBitArray QBitArray::operator~() const
taken to be 0.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbitarray.cpp 12
+ \snippet code/src_corelib_tools_qbitarray.cpp 12
\sa QBitArray::operator&=(), operator|(), operator^()
*/
@@ -582,7 +582,7 @@ QBitArray operator&(const QBitArray &a1, const QBitArray &a2)
taken to be 0.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbitarray.cpp 13
+ \snippet code/src_corelib_tools_qbitarray.cpp 13
\sa QBitArray::operator|=(), operator&(), operator^()
*/
@@ -605,7 +605,7 @@ QBitArray operator|(const QBitArray &a1, const QBitArray &a2)
taken to be 0.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbitarray.cpp 14
+ \snippet code/src_corelib_tools_qbitarray.cpp 14
\sa QBitArray::operator^=(), operator&(), operator|()
*/
@@ -668,7 +668,7 @@ QBitArray operator^(const QBitArray &a1, const QBitArray &a2)
Writes bit array \a ba to stream \a out.
- \sa \link datastreamformat.html Format of the QDataStream operators \endlink
+ \sa {Serializing Qt Data Types}{Format of the QDataStream operators}
*/
QDataStream &operator<<(QDataStream &out, const QBitArray &ba)
@@ -685,7 +685,7 @@ QDataStream &operator<<(QDataStream &out, const QBitArray &ba)
Reads a bit array into \a ba from stream \a in.
- \sa \link datastreamformat.html Format of the QDataStream operators \endlink
+ \sa {Serializing Qt Data Types}{Format of the QDataStream operators}
*/
QDataStream &operator>>(QDataStream &in, QBitArray &ba)
diff --git a/src/corelib/tools/qbytearray.cpp b/src/corelib/tools/qbytearray.cpp
index 31cf65b78d..b67d655a9d 100644
--- a/src/corelib/tools/qbytearray.cpp
+++ b/src/corelib/tools/qbytearray.cpp
@@ -131,7 +131,7 @@ char *qstrcpy(char *dst, const char *src)
if (!src)
return 0;
#if defined(_MSC_VER) && _MSC_VER >= 1400
- int len = strlen(src);
+ const int len = int(strlen(src));
// This is actually not secure!!! It will be fixed
// properly in a later release!
if (len >= 0 && strcpy_s(dst, len+1, src) == 0)
@@ -648,7 +648,7 @@ static inline char qToLower(char c)
char *} to its constructor. For example, the following code
creates a byte array of size 5 containing the data "Hello":
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 0
+ \snippet code/src_corelib_tools_qbytearray.cpp 0
Although the size() is 5, the byte array also maintains an extra
'\\0' character at the end so that if a function is used that
@@ -668,11 +668,11 @@ static inline char qToLower(char c)
arrays, operator[]() returns a reference to a byte that can be
used on the left side of an assignment. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 1
+ \snippet code/src_corelib_tools_qbytearray.cpp 1
For read-only access, an alternative syntax is to use at():
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 2
+ \snippet code/src_corelib_tools_qbytearray.cpp 2
at() can be faster than operator[](), because it never causes a
\l{deep copy} to occur.
@@ -700,7 +700,7 @@ static inline char qToLower(char c)
the byte data: append(), prepend(), insert(), replace(), and
remove(). For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 3
+ \snippet code/src_corelib_tools_qbytearray.cpp 3
The replace() and remove() functions' first two arguments are the
position from which to start erasing and the number of bytes that
@@ -728,7 +728,7 @@ static inline char qToLower(char c)
For example, here's a typical loop that finds all occurrences of a
particular substring:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 4
+ \snippet code/src_corelib_tools_qbytearray.cpp 4
If you simply want to check whether a QByteArray contains a
particular character or substring, use contains(). If you want to
@@ -752,7 +752,7 @@ static inline char qToLower(char c)
array is always empty, but an empty byte array isn't necessarily
null:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 5
+ \snippet code/src_corelib_tools_qbytearray.cpp 5
All functions except isNull() treat null byte arrays the same as
empty byte arrays. For example, data() returns a pointer to a
@@ -914,12 +914,13 @@ QByteArray &QByteArray::operator=(const char *str)
} else if (!*str) {
x = Data::allocate(0);
} else {
- int len = strlen(str);
- if (d->ref.isShared() || uint(len) + 1u > d->alloc
- || (len < d->size && uint(len) + 1u < uint(d->alloc >> 1)))
- reallocData(uint(len) + 1u, d->detachFlags());
+ const int len = int(strlen(str));
+ const uint fullLen = len + 1;
+ if (d->ref.isShared() || fullLen > d->alloc
+ || (len < d->size && fullLen < uint(d->alloc >> 1)))
+ reallocData(fullLen, d->detachFlags());
x = d;
- memcpy(x->data(), str, uint(len) + 1u); // include null terminator
+ memcpy(x->data(), str, fullLen); // include null terminator
x->size = len;
}
x->ref.ref();
@@ -949,7 +950,7 @@ QByteArray &QByteArray::operator=(const char *str)
automaticall unless the \l{deep copy} is created.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 6
+ \snippet code/src_corelib_tools_qbytearray.cpp 6
\sa isEmpty(), resize()
*/
@@ -959,7 +960,7 @@ QByteArray &QByteArray::operator=(const char *str)
Returns true if the byte array has size 0; otherwise returns false.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 7
+ \snippet code/src_corelib_tools_qbytearray.cpp 7
\sa size()
*/
@@ -1046,7 +1047,7 @@ QByteArray &QByteArray::operator=(const char *str)
'\\0' terminator.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 8
+ \snippet code/src_corelib_tools_qbytearray.cpp 8
The pointer remains valid as long as the byte array isn't
reallocated or destroyed. For read-only access, constData() is
@@ -1059,11 +1060,11 @@ QByteArray &QByteArray::operator=(const char *str)
data(), but it will corrupt the heap and cause a crash because it
does not allocate a byte for the '\\0' at the end:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 46
+ \snippet code/src_corelib_tools_qbytearray.cpp 46
This one allocates the correct amount of space:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 47
+ \snippet code/src_corelib_tools_qbytearray.cpp 47
Note: A QByteArray can store any byte values including '\\0's,
but most functions that take \c{char *} arguments assume that the
@@ -1129,7 +1130,7 @@ QByteArray &QByteArray::operator=(const char *str)
place.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 9
+ \snippet code/src_corelib_tools_qbytearray.cpp 9
The return value is of type QByteRef, a helper class for
QByteArray. When you get an object of type QByteRef, you can use
@@ -1188,7 +1189,7 @@ QByteArray &QByteArray::operator=(const char *str)
If \a pos is beyond the end of the array, nothing happens.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 10
+ \snippet code/src_corelib_tools_qbytearray.cpp 10
\sa chop(), resize(), left()
*/
@@ -1206,7 +1207,7 @@ void QByteArray::truncate(int pos)
array.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 11
+ \snippet code/src_corelib_tools_qbytearray.cpp 11
\sa truncate(), resize(), left()
*/
@@ -1224,7 +1225,7 @@ void QByteArray::chop(int n)
returns a reference to this byte array.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 12
+ \snippet code/src_corelib_tools_qbytearray.cpp 12
Note: QByteArray is an \l{implicitly shared} class. Consequently,
if \e this is an empty QByteArray, then \e this will just share
@@ -1284,7 +1285,7 @@ void QByteArray::chop(int n)
Returns true if this byte array is null; otherwise returns false.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 13
+ \snippet code/src_corelib_tools_qbytearray.cpp 13
Qt makes a distinction between null byte arrays and empty byte
arrays for historical reasons. For most applications, what
@@ -1322,7 +1323,7 @@ QByteArray::QByteArray(const char *data, int size)
d = Data::sharedNull();
} else {
if (size < 0)
- size = strlen(data);
+ size = int(strlen(data));
if (!size) {
d = Data::allocate(0);
} else {
@@ -1428,7 +1429,7 @@ void QByteArray::resize(int size)
size \a size beforehand.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 14
+ \snippet code/src_corelib_tools_qbytearray.cpp 14
\sa resize()
*/
@@ -1493,7 +1494,7 @@ QByteArray QByteArray::nulTerminated() const
reference to this byte array.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 15
+ \snippet code/src_corelib_tools_qbytearray.cpp 15
This is the same as insert(0, \a ba).
@@ -1573,7 +1574,7 @@ QByteArray &QByteArray::prepend(char ch)
Appends the byte array \a ba onto the end of this byte array.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 16
+ \snippet code/src_corelib_tools_qbytearray.cpp 16
This is the same as insert(size(), \a ba).
@@ -1631,7 +1632,7 @@ QByteArray &QByteArray::append(const QByteArray &ba)
QByteArray& QByteArray::append(const char *str)
{
if (str) {
- int len = strlen(str);
+ const int len = int(strlen(str));
if (d->ref.isShared() || uint(d->size + len) + 1u > d->alloc)
reallocData(uint(d->size + len) + 1u, d->detachFlags() | Data::Grow);
memcpy(d->data() + d->size, str, len + 1); // include null terminator
@@ -1710,7 +1711,7 @@ static inline QByteArray &qbytearray_insert(QByteArray *ba,
reference to this byte array.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 17
+ \snippet code/src_corelib_tools_qbytearray.cpp 17
\sa append(), prepend(), replace(), remove()
*/
@@ -1793,7 +1794,7 @@ QByteArray &QByteArray::insert(int i, char ch)
array is truncated at position \a pos.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 18
+ \snippet code/src_corelib_tools_qbytearray.cpp 18
\sa insert(), replace()
*/
@@ -1817,7 +1818,7 @@ QByteArray &QByteArray::remove(int pos, int len)
array \a after, and returns a reference to this byte array.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 19
+ \snippet code/src_corelib_tools_qbytearray.cpp 19
\sa insert(), remove()
*/
@@ -1855,7 +1856,7 @@ QByteArray &QByteArray::replace(int pos, int len, const char *after)
\overload
Replaces \a len bytes from index position \a pos with \a alen bytes
- from the string \a after. \a after is allowed to have '\0' characters.
+ from the string \a after. \a after is allowed to have '\\0' characters.
\since 4.7
*/
@@ -1881,7 +1882,7 @@ QByteArray &QByteArray::replace(int pos, int len, const char *after, int alen)
byte array \a after.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 20
+ \snippet code/src_corelib_tools_qbytearray.cpp 20
*/
QByteArray &QByteArray::replace(const QByteArray &before, const QByteArray &after)
@@ -2214,7 +2215,7 @@ QByteArray QByteArray::repeated(int times) const
position \a from. Returns -1 if \a ba could not be found.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 21
+ \snippet code/src_corelib_tools_qbytearray.cpp 21
\sa lastIndexOf(), contains(), count()
*/
@@ -2284,7 +2285,7 @@ int QByteArray::indexOf(const char *c, int from) const
position \a from. Returns -1 if \a ch could not be found.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 22
+ \snippet code/src_corelib_tools_qbytearray.cpp 22
\sa lastIndexOf(), contains()
*/
@@ -2346,7 +2347,7 @@ static int lastIndexOfHelper(const char *haystack, int l, const char *needle, in
starts at the last byte. Returns -1 if \a ba could not be found.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 23
+ \snippet code/src_corelib_tools_qbytearray.cpp 23
\sa indexOf(), contains(), count()
*/
@@ -2406,7 +2407,7 @@ int QByteArray::lastIndexOf(const char *str, int from) const
last (size() - 1) byte. Returns -1 if \a ch could not be found.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 24
+ \snippet code/src_corelib_tools_qbytearray.cpp 24
\sa indexOf(), contains()
*/
@@ -2493,7 +2494,7 @@ int QByteArray::count(char ch) const
otherwise returns false.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 25
+ \snippet code/src_corelib_tools_qbytearray.cpp 25
\sa endsWith(), left()
*/
@@ -2515,7 +2516,7 @@ bool QByteArray::startsWith(const char *str) const
{
if (!str || !*str)
return true;
- int len = strlen(str);
+ const int len = int(strlen(str));
if (d->size < len)
return false;
return qstrncmp(d->data(), str, len) == 0;
@@ -2538,7 +2539,7 @@ bool QByteArray::startsWith(char ch) const
otherwise returns false.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 26
+ \snippet code/src_corelib_tools_qbytearray.cpp 26
\sa startsWith(), right()
*/
@@ -2560,7 +2561,7 @@ bool QByteArray::endsWith(const char *str) const
{
if (!str || !*str)
return true;
- int len = strlen(str);
+ const int len = int(strlen(str));
if (d->size < len)
return false;
return qstrncmp(d->data() + d->size - len, str, len) == 0;
@@ -2586,7 +2587,7 @@ bool QByteArray::endsWith(char ch) const
size().
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 27
+ \snippet code/src_corelib_tools_qbytearray.cpp 27
\sa right(), mid(), startsWith(), truncate()
*/
@@ -2608,7 +2609,7 @@ QByteArray QByteArray::left(int len) const
size().
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 28
+ \snippet code/src_corelib_tools_qbytearray.cpp 28
\sa endsWith(), left(), mid()
*/
@@ -2631,7 +2632,7 @@ QByteArray QByteArray::right(int len) const
pos until the end of the byte array.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 29
+ \snippet code/src_corelib_tools_qbytearray.cpp 29
\sa left(), right()
*/
@@ -2658,7 +2659,7 @@ QByteArray QByteArray::mid(int pos, int len) const
interpreted as a Latin-1 encoded string.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 30
+ \snippet code/src_corelib_tools_qbytearray.cpp 30
\sa toUpper(), {8-bit Character Comparisons}
*/
@@ -2680,7 +2681,7 @@ QByteArray QByteArray::toLower() const
interpreted as a Latin-1 encoded string.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 31
+ \snippet code/src_corelib_tools_qbytearray.cpp 31
\sa toLower(), {8-bit Character Comparisons}
*/
@@ -3090,7 +3091,7 @@ QDataStream &operator>>(QDataStream &in, QByteArray &ba)
characters '\\t', '\\n', '\\v', '\\f', '\\r', and ' '.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 32
+ \snippet code/src_corelib_tools_qbytearray.cpp 32
\sa trimmed()
*/
@@ -3128,7 +3129,7 @@ QByteArray QByteArray::simplified() const
characters '\\t', '\\n', '\\v', '\\f', '\\r', and ' '.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 33
+ \snippet code/src_corelib_tools_qbytearray.cpp 33
Unlike simplified(), trimmed() leaves internal whitespace alone.
@@ -3170,7 +3171,7 @@ QByteArray QByteArray::trimmed() const
after position \a width are removed, and the copy is returned.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 34
+ \snippet code/src_corelib_tools_qbytearray.cpp 34
\sa rightJustified()
*/
@@ -3207,7 +3208,7 @@ QByteArray QByteArray::leftJustified(int width, char fill, bool truncate) const
position \a width.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 35
+ \snippet code/src_corelib_tools_qbytearray.cpp 35
\sa leftJustified()
*/
@@ -3314,7 +3315,7 @@ qulonglong QByteArray::toULongLong(bool *ok, int base) const
If \a ok is not 0: if a conversion error occurs, *\a{ok} is set to
false; otherwise *\a{ok} is set to true.
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 36
+ \snippet code/src_corelib_tools_qbytearray.cpp 36
\note The conversion of the number is performed in the default C locale,
irrespective of the user's locale.
@@ -3380,7 +3381,7 @@ uint QByteArray::toUInt(bool *ok, int base) const
If \a ok is not 0: if a conversion error occurs, *\a{ok} is set to
false; otherwise *\a{ok} is set to true.
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 37
+ \snippet code/src_corelib_tools_qbytearray.cpp 37
\note The conversion of the number is performed in the default C locale,
irrespective of the user's locale.
@@ -3501,7 +3502,7 @@ ushort QByteArray::toUShort(bool *ok, int base) const
If \a ok is not 0: if a conversion error occurs, *\a{ok} is set to
false; otherwise *\a{ok} is set to true.
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 38
+ \snippet code/src_corelib_tools_qbytearray.cpp 38
\note The conversion of the number is performed in the default C locale,
irrespective of the user's locale.
@@ -3536,7 +3537,7 @@ float QByteArray::toFloat(bool *ok) const
/*!
Returns a copy of the byte array, encoded as Base64.
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 39
+ \snippet code/src_corelib_tools_qbytearray.cpp 39
The algorithm used to encode Base64-encoded data is defined in \l{RFC 2045}.
@@ -3588,7 +3589,7 @@ QByteArray QByteArray::toBase64() const
be any value between 2 and 36.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 40
+ \snippet code/src_corelib_tools_qbytearray.cpp 40
\note The format of the number is not localized; the default C locale
is used irrespective of the user's locale.
@@ -3632,7 +3633,7 @@ QByteArray &QByteArray::setNum(qlonglong n, int base)
}
#endif
QLocale locale(QLocale::C);
- *this = locale.d()->longLongToString(n, -1, base).toLatin1();
+ *this = locale.d->longLongToString(n, -1, base).toLatin1();
return *this;
}
@@ -3651,7 +3652,7 @@ QByteArray &QByteArray::setNum(qulonglong n, int base)
}
#endif
QLocale locale(QLocale::C);
- *this = locale.d()->unsLongLongToString(n, -1, base).toLatin1();
+ *this = locale.d->unsLongLongToString(n, -1, base).toLatin1();
return *this;
}
@@ -3710,7 +3711,7 @@ QByteArray &QByteArray::setNum(double n, char f, int prec)
}
QLocale locale(QLocale::C);
- *this = locale.d()->doubleToString(n, prec, form, -1, flags).toLatin1();
+ *this = locale.d->doubleToString(n, prec, form, -1, flags).toLatin1();
return *this;
}
@@ -3734,7 +3735,7 @@ QByteArray &QByteArray::setNum(double n, char f, int prec)
any value between 2 and 36.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 41
+ \snippet code/src_corelib_tools_qbytearray.cpp 41
\note The format of the number is not localized; the default C locale
is used irrespective of the user's locale.
@@ -3806,7 +3807,7 @@ QByteArray QByteArray::number(qulonglong n, int base)
decimal point. With 'g' and 'G', \a prec is the maximum number of
significant digits (trailing zeroes are omitted).
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 42
+ \snippet code/src_corelib_tools_qbytearray.cpp 42
\note The format of the number is not localized; the default C locale
is used irrespective of the user's locale.
@@ -3843,7 +3844,7 @@ QByteArray QByteArray::number(double n, char f, int prec)
Here is an example of how to read data using a QDataStream on raw
data in memory without copying the raw data into a QByteArray:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 43
+ \snippet code/src_corelib_tools_qbytearray.cpp 43
\warning A byte array created with fromRawData() is \e not
null-terminated, unless the raw data contains a 0 character at
@@ -3908,7 +3909,7 @@ QByteArray &QByteArray::setRawData(const char *data, uint size)
For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 44
+ \snippet code/src_corelib_tools_qbytearray.cpp 44
The algorithm used to decode Base64-encoded data is defined in \l{RFC 2045}.
@@ -3960,7 +3961,7 @@ QByteArray QByteArray::fromBase64(const QByteArray &base64)
For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qbytearray.cpp 45
+ \snippet code/src_corelib_tools_qbytearray.cpp 45
\sa toHex()
*/
diff --git a/src/corelib/tools/qcache.qdoc b/src/corelib/tools/qcache.qdoc
index 80d47ff703..86eec28e4b 100644
--- a/src/corelib/tools/qcache.qdoc
+++ b/src/corelib/tools/qcache.qdoc
@@ -39,11 +39,11 @@
definition of a cache that stores objects of type Employee
associated with an integer key:
- \snippet doc/src/snippets/code/doc_src_qcache.cpp 0
+ \snippet code/doc_src_qcache.cpp 0
Here's how to insert an object in the cache:
- \snippet doc/src/snippets/code/doc_src_qcache.cpp 1
+ \snippet code/doc_src_qcache.cpp 1
The advantage of using QCache over some other key-based data
structure (such as QMap or QHash) is that QCache automatically
@@ -59,7 +59,7 @@
By default, QCache's maxCost() is 100. You can specify a
different value in the QCache constructor:
- \snippet doc/src/snippets/code/doc_src_qcache.cpp 2
+ \snippet code/doc_src_qcache.cpp 2
Each time you call insert(), you can specify a cost as third
argument (after the key and a pointer to the object to insert).
diff --git a/src/corelib/tools/qchar.cpp b/src/corelib/tools/qchar.cpp
index ef229fc0fc..b83170cb46 100644
--- a/src/corelib/tools/qchar.cpp
+++ b/src/corelib/tools/qchar.cpp
@@ -108,8 +108,8 @@ QT_BEGIN_NAMESPACE
The classification functions include functions like those in the
standard C++ header \<cctype\> (formerly \<ctype.h\>), but
- operating on the full range of Unicode characters. They all
- return true if the character is a certain type of character;
+ operating on the full range of Unicode characters, not just for the ASCII
+ range. They all return true if the character is a certain type of character;
otherwise they return false. These classification functions are
isNull() (returns true if the character is '\\0'), isPrint()
(true if the character is any sort of printable character,
@@ -118,7 +118,9 @@ QT_BEGIN_NAMESPACE
sort of numeric character, not just 0-9), isLetterOrNumber(), and
isDigit() (decimal digits). All of these are wrappers around
category() which return the Unicode-defined category of each
- character.
+ character. Some of these also calculate the derived properties
+ (i.e. isSpace() returns true if the character is of category
+ Separator_* or an exceptional code point from Other_Control category).
QChar also provides direction(), which indicates the "natural"
writing direction of this character. The joining() function
@@ -153,6 +155,9 @@ QT_BEGIN_NAMESPACE
to construct a QChar from an 8-bit \c char, and you will need to
call toAscii() or toLatin1() to get the 8-bit value back.
+ For more information see
+ \l{http://www.unicode.org/ucd/}{"About the Unicode Character Database"}.
+
\sa Unicode, QString, QLatin1Char
*/
@@ -473,7 +478,7 @@ QT_BEGIN_NAMESPACE
/*!
Returns true if the character is a printable character; otherwise
- returns false. This is any character not of category Cc or Cn.
+ returns false. This is any character not of category Other_*.
Note that this gives no indication of whether the character is
available in a particular font.
@@ -481,6 +486,9 @@ QT_BEGIN_NAMESPACE
bool QChar::isPrint() const
{
const int test = FLAG(Other_Control) |
+ FLAG(Other_Format) |
+ FLAG(Other_Surrogate) |
+ FLAG(Other_PrivateUse) |
FLAG(Other_NotAssigned);
return !(FLAG(qGetProp(ucs)->category) & test);
}
@@ -699,12 +707,10 @@ bool QChar::isSymbol() const
*/
/*!
+ \fn int QChar::digitValue() const
+
Returns the numeric value of the digit, or -1 if the character is not a digit.
*/
-int QChar::digitValue() const
-{
- return qGetProp(ucs)->digitValue;
-}
/*!
\overload
@@ -729,12 +735,10 @@ int QChar::digitValue(uint ucs4)
}
/*!
+ \fn QChar::Category QChar::category() const
+
Returns the character's category.
*/
-QChar::Category QChar::category() const
-{
- return (QChar::Category) qGetProp(ucs)->category;
-}
/*!
\overload
@@ -758,12 +762,10 @@ QChar::Category QChar::category(ushort ucs2)
/*!
+ \fn QChar::Direction QChar::direction() const
+
Returns the character's direction.
*/
-QChar::Direction QChar::direction() const
-{
- return (QChar::Direction) qGetProp(ucs)->direction;
-}
/*!
\overload
@@ -786,13 +788,11 @@ QChar::Direction QChar::direction(ushort ucs2)
}
/*!
+ \fn QChar::Joining QChar::joining() const
+
Returns information about the joining properties of the character
(needed for certain languages such as Arabic).
*/
-QChar::Joining QChar::joining() const
-{
- return (QChar::Joining) qGetProp(ucs)->joining;
-}
/*!
\overload
@@ -857,15 +857,13 @@ bool QChar::hasMirrored() const
*/
/*!
+ \fn QChar QChar::mirroredChar() const
+
Returns the mirrored character if this character is a mirrored
character; otherwise returns the character itself.
\sa hasMirrored()
*/
-QChar QChar::mirroredChar() const
-{
- return ucs + qGetProp(ucs)->mirrorDiff;
-}
/*!
\overload
@@ -894,27 +892,26 @@ ushort QChar::mirroredChar(ushort ucs2)
}
+// constants for Hangul (de)composition, see UAX #15
enum {
Hangul_SBase = 0xac00,
Hangul_LBase = 0x1100,
Hangul_VBase = 0x1161,
Hangul_TBase = 0x11a7,
- Hangul_SCount = 11172,
Hangul_LCount = 19,
Hangul_VCount = 21,
Hangul_TCount = 28,
- Hangul_NCount = 21*28
+ Hangul_NCount = Hangul_VCount * Hangul_TCount,
+ Hangul_SCount = Hangul_LCount * Hangul_NCount
};
// buffer has to have a length of 3. It's needed for Hangul decomposition
static const unsigned short * QT_FASTCALL decompositionHelper
(uint ucs4, int *length, int *tag, unsigned short *buffer)
{
- *length = 0;
- if (ucs4 > UNICODE_LAST_CODEPOINT)
- return 0;
if (ucs4 >= Hangul_SBase && ucs4 < Hangul_SBase + Hangul_SCount) {
- int SIndex = ucs4 - Hangul_SBase;
+ // compute Hangul syllable decomposition as per UAX #15
+ const uint SIndex = ucs4 - Hangul_SBase;
buffer[0] = Hangul_LBase + SIndex / Hangul_NCount; // L
buffer[1] = Hangul_VBase + (SIndex % Hangul_NCount) / Hangul_TCount; // V
buffer[2] = Hangul_TBase + SIndex % Hangul_TCount; // T
@@ -924,8 +921,12 @@ static const unsigned short * QT_FASTCALL decompositionHelper
}
const unsigned short index = GET_DECOMPOSITION_INDEX(ucs4);
- if (index == 0xffff)
+ if (index == 0xffff) {
+ *length = 0;
+ *tag = QChar::NoDecomposition;
return 0;
+ }
+
const unsigned short *decomposition = uc_decomposition_map+index;
*tag = (*decomposition) & 0xff;
*length = (*decomposition) >> 8;
@@ -952,7 +953,7 @@ QString QChar::decomposition(uint ucs4)
int length;
int tag;
const unsigned short *d = decompositionHelper(ucs4, &length, &tag, buffer);
- return QString::fromUtf16(d, length);
+ return QString(reinterpret_cast<const QChar *>(d), length);
}
/*!
@@ -971,8 +972,8 @@ QChar::Decomposition QChar::decompositionTag() const
*/
QChar::Decomposition QChar::decompositionTag(uint ucs4)
{
- if (ucs4 > UNICODE_LAST_CODEPOINT)
- return QChar::NoDecomposition;
+ if (ucs4 >= Hangul_SBase && ucs4 < Hangul_SBase + Hangul_SCount)
+ return QChar::Canonical;
const unsigned short index = GET_DECOMPOSITION_INDEX(ucs4);
if (index == 0xffff)
return QChar::NoDecomposition;
@@ -980,6 +981,8 @@ QChar::Decomposition QChar::decompositionTag(uint ucs4)
}
/*!
+ \fn unsigned char QChar::combiningClass() const
+
Returns the combining class for the character as defined in the
Unicode standard. This is mainly useful as a positioning hint for
marks attached to a base character.
@@ -987,10 +990,6 @@ QChar::Decomposition QChar::decompositionTag(uint ucs4)
The Qt text rendering engine uses this information to correctly
position non-spacing marks around a base character.
*/
-unsigned char QChar::combiningClass() const
-{
- return (unsigned char) qGetProp(ucs)->combiningClass;
-}
/*!
\overload
@@ -1015,12 +1014,10 @@ unsigned char QChar::combiningClass(ushort ucs2)
}
/*!
+ \fn QChar::UnicodeVersion QChar::unicodeVersion() const
+
Returns the Unicode version that introduced this character.
*/
-QChar::UnicodeVersion QChar::unicodeVersion() const
-{
- return (QChar::UnicodeVersion) qGetProp(ucs)->unicodeVersion;
-}
/*!
\overload
@@ -1052,17 +1049,61 @@ QChar::UnicodeVersion QChar::currentUnicodeVersion()
return UNICODE_DATA_VERSION;
}
+
+template <typename T>
+static inline T toLowerCase_helper(T uc)
+{
+ const QUnicodeTables::Properties *p = qGetProp(uc);
+ if (p->lowerCaseSpecial) {
+ const ushort *specialCase = specialCaseMap + p->lowerCaseDiff;
+ if (*specialCase == 1)
+ return specialCase[1];
+ }
+ return uc + p->lowerCaseDiff;
+}
+
+template <typename T>
+static inline T toUpperCase_helper(T uc)
+{
+ const QUnicodeTables::Properties *p = qGetProp(uc);
+ if (p->upperCaseSpecial) {
+ const ushort *specialCase = specialCaseMap + p->upperCaseDiff;
+ if (*specialCase == 1)
+ return specialCase[1];
+ }
+ return uc + p->upperCaseDiff;
+}
+
+template <typename T>
+static inline T toTitleCase_helper(T uc)
+{
+ const QUnicodeTables::Properties *p = qGetProp(uc);
+ if (p->titleCaseSpecial) {
+ const ushort *specialCase = specialCaseMap + p->titleCaseDiff;
+ if (*specialCase == 1)
+ return specialCase[1];
+ }
+ return uc + p->titleCaseDiff;
+}
+
+template <typename T>
+static inline T toCaseFolded_helper(T uc)
+{
+ const QUnicodeTables::Properties *p = qGetProp(uc);
+ if (p->caseFoldSpecial) {
+ const ushort *specialCase = specialCaseMap + p->caseFoldDiff;
+ if (*specialCase == 1)
+ return specialCase[1];
+ }
+ return uc + p->caseFoldDiff;
+}
+
/*!
+ \fn QChar QChar::toLower() const
+
Returns the lowercase equivalent if the character is uppercase or titlecase;
otherwise returns the character itself.
*/
-QChar QChar::toLower() const
-{
- const QUnicodeTables::Properties *p = qGetProp(ucs);
- if (!p->lowerCaseSpecial)
- return ucs + p->lowerCaseDiff;
- return ucs;
-}
/*!
\overload
@@ -1074,10 +1115,7 @@ uint QChar::toLower(uint ucs4)
{
if (ucs4 > UNICODE_LAST_CODEPOINT)
return ucs4;
- const QUnicodeTables::Properties *p = qGetProp(ucs4);
- if (!p->lowerCaseSpecial)
- return ucs4 + p->lowerCaseDiff;
- return ucs4;
+ return toLowerCase_helper<uint>(ucs4);
}
/*!
@@ -1088,23 +1126,15 @@ uint QChar::toLower(uint ucs4)
*/
ushort QChar::toLower(ushort ucs2)
{
- const QUnicodeTables::Properties *p = qGetProp(ucs2);
- if (!p->lowerCaseSpecial)
- return ucs2 + p->lowerCaseDiff;
- return ucs2;
+ return toLowerCase_helper<ushort>(ucs2);
}
/*!
+ \fn QChar QChar::toUpper() const
+
Returns the uppercase equivalent if the character is lowercase or titlecase;
otherwise returns the character itself.
*/
-QChar QChar::toUpper() const
-{
- const QUnicodeTables::Properties *p = qGetProp(ucs);
- if (!p->upperCaseSpecial)
- return ucs + p->upperCaseDiff;
- return ucs;
-}
/*!
\overload
@@ -1116,10 +1146,7 @@ uint QChar::toUpper(uint ucs4)
{
if (ucs4 > UNICODE_LAST_CODEPOINT)
return ucs4;
- const QUnicodeTables::Properties *p = qGetProp(ucs4);
- if (!p->upperCaseSpecial)
- return ucs4 + p->upperCaseDiff;
- return ucs4;
+ return toUpperCase_helper<uint>(ucs4);
}
/*!
@@ -1130,23 +1157,15 @@ uint QChar::toUpper(uint ucs4)
*/
ushort QChar::toUpper(ushort ucs2)
{
- const QUnicodeTables::Properties *p = qGetProp(ucs2);
- if (!p->upperCaseSpecial)
- return ucs2 + p->upperCaseDiff;
- return ucs2;
+ return toUpperCase_helper<ushort>(ucs2);
}
/*!
+ \fn QChar QChar::toTitleCase() const
+
Returns the title case equivalent if the character is lowercase or uppercase;
otherwise returns the character itself.
*/
-QChar QChar::toTitleCase() const
-{
- const QUnicodeTables::Properties *p = qGetProp(ucs);
- if (!p->titleCaseSpecial)
- return ucs + p->titleCaseDiff;
- return ucs;
-}
/*!
\overload
@@ -1158,10 +1177,7 @@ uint QChar::toTitleCase(uint ucs4)
{
if (ucs4 > UNICODE_LAST_CODEPOINT)
return ucs4;
- const QUnicodeTables::Properties *p = qGetProp(ucs4);
- if (!p->titleCaseSpecial)
- return ucs4 + p->titleCaseDiff;
- return ucs4;
+ return toTitleCase_helper<uint>(ucs4);
}
/*!
@@ -1172,19 +1188,15 @@ uint QChar::toTitleCase(uint ucs4)
*/
ushort QChar::toTitleCase(ushort ucs2)
{
- const QUnicodeTables::Properties *p = qGetProp(ucs2);
- if (!p->titleCaseSpecial)
- return ucs2 + p->titleCaseDiff;
- return ucs2;
+ return toTitleCase_helper<ushort>(ucs2);
}
-
static inline uint foldCase(const ushort *ch, const ushort *start)
{
uint c = *ch;
if (QChar(c).isLowSurrogate() && ch > start && QChar(*(ch - 1)).isHighSurrogate())
c = QChar::surrogateToUcs4(*(ch - 1), c);
- return *ch + qGetProp(c)->caseFoldDiff;
+ return toCaseFolded_helper<uint>(c);
}
static inline uint foldCase(uint ch, uint &last)
@@ -1193,22 +1205,20 @@ static inline uint foldCase(uint ch, uint &last)
if (QChar(c).isLowSurrogate() && QChar(last).isHighSurrogate())
c = QChar::surrogateToUcs4(last, c);
last = ch;
- return ch + qGetProp(c)->caseFoldDiff;
+ return toCaseFolded_helper<uint>(c);
}
static inline ushort foldCase(ushort ch)
{
- return ch + qGetProp(ch)->caseFoldDiff;
+ return toCaseFolded_helper<ushort>(ch);
}
/*!
- Returns the case folded equivalent of the character. For most Unicode characters this
- is the same as toLowerCase().
+ \fn QChar QChar::toCaseFolded() const
+
+ Returns the case folded equivalent of the character.
+ For most Unicode characters this is the same as toLowerCase().
*/
-QChar QChar::toCaseFolded() const
-{
- return ucs + qGetProp(ucs)->caseFoldDiff;
-}
/*!
\overload
@@ -1219,7 +1229,7 @@ uint QChar::toCaseFolded(uint ucs4)
{
if (ucs4 > UNICODE_LAST_CODEPOINT)
return ucs4;
- return ucs4 + qGetProp(ucs4)->caseFoldDiff;
+ return toCaseFolded_helper<uint>(ucs4);
}
/*!
@@ -1229,7 +1239,7 @@ uint QChar::toCaseFolded(uint ucs4)
*/
ushort QChar::toCaseFolded(ushort ucs2)
{
- return ucs2 + qGetProp(ucs2)->caseFoldDiff;
+ return toCaseFolded_helper<ushort>(ucs2);
}
/*!
@@ -1391,6 +1401,8 @@ QDataStream &operator>>(QDataStream &in, QChar &chr)
static void decomposeHelper(QString *str, bool canonical, QChar::UnicodeVersion version, int from)
{
+ int length;
+ int tag;
unsigned short buffer[3];
QString &s = *str;
@@ -1406,18 +1418,18 @@ static void decomposeHelper(QString *str, bool canonical, QChar::UnicodeVersion
ucs4 = QChar::surrogateToUcs4(high, ucs4);
}
}
+
const QChar::UnicodeVersion v = QChar::unicodeVersion(ucs4);
if (v > version || v == QChar::Unicode_Unassigned)
continue;
- int length;
- int tag;
+
const unsigned short *d = decompositionHelper(ucs4, &length, &tag, buffer);
if (!d || (canonical && tag != QChar::Canonical))
continue;
int pos = uc - utf16;
s.replace(pos, QChar::requiresSurrogates(ucs4) ? 2 : 1, reinterpret_cast<const QChar *>(d), length);
- // since the insert invalidates the pointers and we do decomposition recursive
+ // since the replace invalidates the pointers and we do decomposition recursive
utf16 = reinterpret_cast<unsigned short *>(s.data());
uc = utf16 + pos + length;
}
@@ -1436,20 +1448,22 @@ inline bool operator<(const UCS2Pair &ligature, ushort u1)
static ushort ligatureHelper(ushort u1, ushort u2)
{
- // hangul L-V pair
- int LIndex = u1 - Hangul_LBase;
- if (0 <= LIndex && LIndex < Hangul_LCount) {
- int VIndex = u2 - Hangul_VBase;
- if (0 <= VIndex && VIndex < Hangul_VCount)
- return Hangul_SBase + (LIndex * Hangul_VCount + VIndex) * Hangul_TCount;
- }
-
- // hangul LV-T pair
- int SIndex = u1 - Hangul_SBase;
- if (0 <= SIndex && SIndex < Hangul_SCount && (SIndex % Hangul_TCount) == 0) {
- int TIndex = u2 - Hangul_TBase;
- if (0 <= TIndex && TIndex <= Hangul_TCount)
- return u1 + TIndex;
+ if (u1 >= Hangul_LBase && u1 <= Hangul_SBase + Hangul_SCount) {
+ // compute Hangul syllable composition as per UAX #15
+ // hangul L-V pair
+ const uint LIndex = u1 - Hangul_LBase;
+ if (LIndex < Hangul_LCount) {
+ const uint VIndex = u2 - Hangul_VBase;
+ if (VIndex < Hangul_VCount)
+ return Hangul_SBase + (LIndex * Hangul_VCount + VIndex) * Hangul_TCount;
+ }
+ // hangul LV-T pair
+ const uint SIndex = u1 - Hangul_SBase;
+ if (SIndex < Hangul_SCount && (SIndex % Hangul_TCount) == 0) {
+ const uint TIndex = u2 - Hangul_TBase;
+ if (TIndex <= Hangul_TCount)
+ return u1 + TIndex;
+ }
}
const unsigned short index = GET_LIGATURE_INDEX(u2);
@@ -1516,10 +1530,14 @@ static void canonicalOrderHelper(QString *str, QChar::UnicodeVersion version, in
{
QString &s = *str;
const int l = s.length()-1;
+
+ uint u1, u2;
+ ushort c1, c2;
+
int pos = from;
while (pos < l) {
int p2 = pos+1;
- uint u1 = s.at(pos).unicode();
+ u1 = s.at(pos).unicode();
if (QChar(u1).isHighSurrogate()) {
ushort low = s.at(p2).unicode();
if (QChar(low).isLowSurrogate()) {
@@ -1529,7 +1547,10 @@ static void canonicalOrderHelper(QString *str, QChar::UnicodeVersion version, in
++p2;
}
}
- uint u2 = s.at(p2).unicode();
+ c1 = 0;
+
+ advance:
+ u2 = s.at(p2).unicode();
if (QChar(u2).isHighSurrogate() && p2 < l) {
ushort low = s.at(p2+1).unicode();
if (QChar(low).isLowSurrogate()) {
@@ -1538,7 +1559,7 @@ static void canonicalOrderHelper(QString *str, QChar::UnicodeVersion version, in
}
}
- ushort c2 = 0;
+ c2 = 0;
{
const QUnicodeTables::Properties *p = qGetProp(u2);
if (p->unicodeVersion <= version && p->unicodeVersion != QChar::Unicode_Unassigned)
@@ -1549,8 +1570,7 @@ static void canonicalOrderHelper(QString *str, QChar::UnicodeVersion version, in
continue;
}
- ushort c1 = 0;
- {
+ if (c1 == 0) {
const QUnicodeTables::Properties *p = qGetProp(u1);
if (p->unicodeVersion <= version && p->unicodeVersion != QChar::Unicode_Unassigned)
c1 = p->combiningClass;
@@ -1580,6 +1600,16 @@ static void canonicalOrderHelper(QString *str, QChar::UnicodeVersion version, in
++pos;
if (QChar::requiresSurrogates(u1))
++pos;
+
+ u1 = u2;
+ c1 = c2; // != 0
+ p2 = pos + 1;
+ if (QChar::requiresSurrogates(u1))
+ ++p2;
+ if (p2 > l)
+ break;
+
+ goto advance;
}
}
}
diff --git a/src/corelib/tools/qchar.h b/src/corelib/tools/qchar.h
index 9f2ca7ae9e..5d9402ae0c 100644
--- a/src/corelib/tools/qchar.h
+++ b/src/corelib/tools/qchar.h
@@ -203,23 +203,23 @@ public:
};
// ****** WHEN ADDING FUNCTIONS, CONSIDER ADDING TO QCharRef TOO
- Category category() const;
- Direction direction() const;
- Joining joining() const;
+ inline Category category() const { return QChar::category(ucs); }
+ inline Direction direction() const { return QChar::direction(ucs); }
+ inline Joining joining() const { return QChar::joining(ucs); }
bool hasMirrored() const;
- unsigned char combiningClass() const;
+ inline unsigned char combiningClass() const { return QChar::combiningClass(ucs); }
- QChar mirroredChar() const;
+ inline QChar mirroredChar() const { return QChar::mirroredChar(ucs); }
QString decomposition() const;
Decomposition decompositionTag() const;
- int digitValue() const;
- QChar toLower() const;
- QChar toUpper() const;
- QChar toTitleCase() const;
- QChar toCaseFolded() const;
+ inline int digitValue() const { return QChar::digitValue(ucs); }
+ inline QChar toLower() const { return QChar::toLower(ucs); }
+ inline QChar toUpper() const { return QChar::toUpper(ucs); }
+ inline QChar toTitleCase() const { return QChar::toTitleCase(ucs); }
+ inline QChar toCaseFolded() const { return QChar::toCaseFolded(ucs); }
- UnicodeVersion unicodeVersion() const;
+ inline UnicodeVersion unicodeVersion() const { return QChar::unicodeVersion(ucs); }
inline char toAscii() const;
inline char toLatin1() const;
diff --git a/src/corelib/tools/qdatetime.cpp b/src/corelib/tools/qdatetime.cpp
index fa5eed4f86..630deccadd 100644
--- a/src/corelib/tools/qdatetime.cpp
+++ b/src/corelib/tools/qdatetime.cpp
@@ -824,7 +824,7 @@ QString QDate::toString(Qt::DateFormat f) const
range 0 to 9999. This restriction may apply to locale-aware
formats as well, depending on the locale settings.
- \sa QDateTime::toString() QTime::toString()
+ \sa QDateTime::toString(), QTime::toString()
*/
QString QDate::toString(const QString& format) const
@@ -836,7 +836,7 @@ QString QDate::toString(const QString& format) const
#endif //QT_NO_DATESTRING
/*!
- \fn bool setYMD(int y, int m, int d)
+ \fn bool QDate::setYMD(int y, int m, int d)
\deprecated in 5.0, use setDate() instead.
@@ -906,7 +906,7 @@ void QDate::getDate(int *year, int *month, int *day)
Returns a null date if the current date is invalid or the new date is
out-of-range.
- \sa addMonths() addYears() daysTo()
+ \sa addMonths(), addYears(), daysTo()
*/
QDate QDate::addDays(qint64 ndays) const
@@ -938,7 +938,7 @@ QDate QDate::addDays(qint64 ndays) const
resulting month/year, this function will return a date that is the
latest valid date.
- \sa addDays() addYears()
+ \sa addDays(), addYears()
*/
QDate QDate::addMonths(int nmonths) const
@@ -1029,7 +1029,7 @@ QDate QDate::addYears(int nyears) const
Returns 0 if either date is invalid.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qdatetime.cpp 0
+ \snippet code/src_corelib_tools_qdatetime.cpp 0
\sa addDays()
*/
@@ -1217,7 +1217,7 @@ QDate QDate::fromString(const QString& s, Qt::DateFormat f)
of characters that are enclosed in single quotes will also be
treated as text and will not be used as an expression. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qdatetime.cpp 1
+ \snippet code/src_corelib_tools_qdatetime.cpp 1
If the format is not satisfied, an invalid QDate is returned. The
expressions that don't expect leading zeroes (d, M) will be
@@ -1227,7 +1227,7 @@ QDate QDate::fromString(const QString& s, Qt::DateFormat f)
string could have meant January 30 but the M will grab two
digits, resulting in an invalid date:
- \snippet doc/src/snippets/code/src_corelib_tools_qdatetime.cpp 2
+ \snippet code/src_corelib_tools_qdatetime.cpp 2
For any field that is not represented in the format the following
defaults are used:
@@ -1241,7 +1241,7 @@ QDate QDate::fromString(const QString& s, Qt::DateFormat f)
The following examples demonstrate the default values:
- \snippet doc/src/snippets/code/src_corelib_tools_qdatetime.cpp 3
+ \snippet code/src_corelib_tools_qdatetime.cpp 3
\sa QDateTime::fromString(), QTime::fromString(), QDate::toString(),
QDateTime::toString(), QTime::toString()
@@ -1269,7 +1269,7 @@ QDate QDate::fromString(const QString &string, const QString &format)
day) is valid; otherwise returns false.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qdatetime.cpp 4
+ \snippet code/src_corelib_tools_qdatetime.cpp 4
\sa isNull(), setDate()
*/
@@ -1300,7 +1300,7 @@ bool QDate::isLeapYear(int y)
return (y % 4 == 0 && y % 100 != 0) || y % 400 == 0;
}
-/*! \fn static QDate QDate::fromJulianDay(int jd)
+/*! \fn static QDate QDate::fromJulianDay(qint64 jd)
Converts the Julian day \a jd to a QDate.
@@ -1582,7 +1582,7 @@ QString QTime::toString(Qt::DateFormat format) const
If the datetime is invalid, an empty string will be returned.
If \a format is empty, the default format "hh:mm:ss" is used.
- \sa QDate::toString() QDateTime::toString()
+ \sa QDate::toString(), QDateTime::toString()
*/
QString QTime::toString(const QString& format) const
{
@@ -1623,7 +1623,7 @@ bool QTime::setHMS(int h, int m, int s, int ms)
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qdatetime.cpp 5
+ \snippet code/src_corelib_tools_qdatetime.cpp 5
\sa addMSecs(), secsTo(), QDateTime::addSecs()
*/
@@ -1845,7 +1845,7 @@ QTime QTime::fromString(const QString& s, Qt::DateFormat f)
of characters that are enclosed in single quotes will also be
treated as text and not be used as an expression.
- \snippet doc/src/snippets/code/src_corelib_tools_qdatetime.cpp 6
+ \snippet code/src_corelib_tools_qdatetime.cpp 6
If the format is not satisfied an invalid QTime is returned.
Expressions that do not expect leading zeroes to be given (h, m, s
@@ -1855,15 +1855,15 @@ QTime QTime::fromString(const QString& s, Qt::DateFormat f)
could have meant 00:07:10, but the m will grab two digits, resulting
in an invalid time:
- \snippet doc/src/snippets/code/src_corelib_tools_qdatetime.cpp 7
+ \snippet code/src_corelib_tools_qdatetime.cpp 7
Any field that is not represented in the format will be set to zero.
For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qdatetime.cpp 8
+ \snippet code/src_corelib_tools_qdatetime.cpp 8
- \sa QDateTime::fromString() QDate::fromString() QDate::toString()
- QDateTime::toString() QTime::toString()
+ \sa QDateTime::fromString(), QDate::fromString(), QDate::toString(),
+ QDateTime::toString(), QTime::toString()
*/
QTime QTime::fromString(const QString &string, const QString &format)
@@ -1894,7 +1894,7 @@ QTime QTime::fromString(const QString &string, const QString &format)
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qdatetime.cpp 9
+ \snippet code/src_corelib_tools_qdatetime.cpp 9
*/
bool QTime::isValid(int h, int m, int s, int ms)
@@ -1906,7 +1906,7 @@ bool QTime::isValid(int h, int m, int s, int ms)
/*!
Sets this time to the current time. This is practical for timing:
- \snippet doc/src/snippets/code/src_corelib_tools_qdatetime.cpp 10
+ \snippet code/src_corelib_tools_qdatetime.cpp 10
\sa restart(), elapsed(), currentTime()
*/
@@ -2077,7 +2077,7 @@ int QTime::elapsed() const
time zone before 1970, even if the system's time zone database
supports that information.
- \sa QDate QTime QDateTimeEdit
+ \sa QDate, QTime, QDateTimeEdit
*/
/*!
@@ -2432,7 +2432,7 @@ void QDateTime::setTime_t(uint secsSince1Jan1970UTC)
range 0 to 9999. This restriction may apply to locale-aware
formats as well, depending on the locale settings.
- \sa QDate::toString() QTime::toString() Qt::DateFormat
+ \sa QDate::toString(), QTime::toString(), Qt::DateFormat
*/
QString QDateTime::toString(Qt::DateFormat f) const
@@ -2574,7 +2574,7 @@ QString QDateTime::toString(Qt::DateFormat f) const
If the datetime is invalid, an empty string will be returned.
- \sa QDate::toString() QTime::toString()
+ \sa QDate::toString(), QTime::toString()
*/
QString QDateTime::toString(const QString& format) const
{
@@ -2718,7 +2718,7 @@ qint64 QDateTime::daysTo(const QDateTime &other) const
Returns 0 if either time is invalid.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qdatetime.cpp 11
+ \snippet code/src_corelib_tools_qdatetime.cpp 11
\sa addSecs(), daysTo(), QTime::secsTo()
*/
@@ -3420,7 +3420,7 @@ QDateTime QDateTime::fromString(const QString& s, Qt::DateFormat f)
of characters that are enclosed in singlequotes will also be
treated as text and not be used as an expression.
- \snippet doc/src/snippets/code/src_corelib_tools_qdatetime.cpp 12
+ \snippet code/src_corelib_tools_qdatetime.cpp 12
If the format is not satisfied an invalid QDateTime is returned.
The expressions that don't have leading zeroes (d, M, h, m, s, z) will be
@@ -3428,7 +3428,7 @@ QDateTime QDateTime::fromString(const QString& s, Qt::DateFormat f)
put them outside the range and/or leave too few digits for other
sections.
- \snippet doc/src/snippets/code/src_corelib_tools_qdatetime.cpp 13
+ \snippet code/src_corelib_tools_qdatetime.cpp 13
This could have meant 1 January 00:30.00 but the M will grab
two digits.
@@ -3448,10 +3448,10 @@ QDateTime QDateTime::fromString(const QString& s, Qt::DateFormat f)
For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qdatetime.cpp 14
+ \snippet code/src_corelib_tools_qdatetime.cpp 14
- \sa QDate::fromString() QTime::fromString() QDate::toString()
- QDateTime::toString() QTime::toString()
+ \sa QDate::fromString(), QTime::fromString(), QDate::toString(),
+ QDateTime::toString(), QTime::toString()
*/
QDateTime QDateTime::fromString(const QString &string, const QString &format)
diff --git a/src/corelib/tools/qeasingcurve.cpp b/src/corelib/tools/qeasingcurve.cpp
index 81778f908f..e237b81cfa 100644
--- a/src/corelib/tools/qeasingcurve.cpp
+++ b/src/corelib/tools/qeasingcurve.cpp
@@ -55,7 +55,7 @@
\class QEasingCurve
\since 4.6
\ingroup animation
- \brief The QEasingCurve class provides easing curves for controlling animation.
+ \captionief The QEasingCurve class provides easing curves for controlling animation.
Easing curves describe a function that controls how the speed of the interpolation
between 0 and 1 should be. Easing curves allow transitions from
@@ -112,183 +112,173 @@
The type of easing curve.
- \value Linear \inlineimage qeasingcurve-linear.png
- \br
- Easing curve for a linear (t) function:
+ \value Linear \image qeasingcurve-linear.png
+ \caption Easing curve for a linear (t) function:
velocity is constant.
- \value InQuad \inlineimage qeasingcurve-inquad.png
- \br
- Easing curve for a quadratic (t^2) function:
+ \value InQuad \image qeasingcurve-inquad.png
+ \caption Easing curve for a quadratic (t^2) function:
accelerating from zero velocity.
- \value OutQuad \inlineimage qeasingcurve-outquad.png
- \br
- Easing curve for a quadratic (t^2) function:
+ \value OutQuad \image qeasingcurve-outquad.png
+ \caption Easing curve for a quadratic (t^2) function:
decelerating to zero velocity.
- \value InOutQuad \inlineimage qeasingcurve-inoutquad.png
- \br
- Easing curve for a quadratic (t^2) function:
+ \value InOutQuad \image qeasingcurve-inoutquad.png
+ \caption Easing curve for a quadratic (t^2) function:
acceleration until halfway, then deceleration.
- \value OutInQuad \inlineimage qeasingcurve-outinquad.png
- \br
- Easing curve for a quadratic (t^2) function:
+ \value OutInQuad \image qeasingcurve-outinquad.png
+ \caption Easing curve for a quadratic (t^2) function:
deceleration until halfway, then acceleration.
- \value InCubic \inlineimage qeasingcurve-incubic.png
- \br
- Easing curve for a cubic (t^3) function:
+ \value InCubic \image qeasingcurve-incubic.png
+ \caption Easing curve for a cubic (t^3) function:
accelerating from zero velocity.
- \value OutCubic \inlineimage qeasingcurve-outcubic.png
- \br
- Easing curve for a cubic (t^3) function:
+ \value OutCubic \image qeasingcurve-outcubic.png
+ \caption Easing curve for a cubic (t^3) function:
decelerating to zero velocity.
- \value InOutCubic \inlineimage qeasingcurve-inoutcubic.png
- \br
- Easing curve for a cubic (t^3) function:
+ \value InOutCubic \image qeasingcurve-inoutcubic.png
+ \caption Easing curve for a cubic (t^3) function:
acceleration until halfway, then deceleration.
- \value OutInCubic \inlineimage qeasingcurve-outincubic.png
- \br
- Easing curve for a cubic (t^3) function:
+ \value OutInCubic \image qeasingcurve-outincubic.png
+ \caption Easing curve for a cubic (t^3) function:
deceleration until halfway, then acceleration.
- \value InQuart \inlineimage qeasingcurve-inquart.png
- \br
- Easing curve for a quartic (t^4) function:
+ \value InQuart \image qeasingcurve-inquart.png
+ \caption Easing curve for a quartic (t^4) function:
accelerating from zero velocity.
- \value OutQuart \inlineimage qeasingcurve-outquart.png
- \br
+ \value OutQuart \image qeasingcurve-outquart.png
+ \caption
Easing curve for a quartic (t^4) function:
decelerating to zero velocity.
- \value InOutQuart \inlineimage qeasingcurve-inoutquart.png
- \br
+ \value InOutQuart \image qeasingcurve-inoutquart.png
+ \caption
Easing curve for a quartic (t^4) function:
acceleration until halfway, then deceleration.
- \value OutInQuart \inlineimage qeasingcurve-outinquart.png
- \br
+ \value OutInQuart \image qeasingcurve-outinquart.png
+ \caption
Easing curve for a quartic (t^4) function:
deceleration until halfway, then acceleration.
- \value InQuint \inlineimage qeasingcurve-inquint.png
- \br
+ \value InQuint \image qeasingcurve-inquint.png
+ \caption
Easing curve for a quintic (t^5) easing
in: accelerating from zero velocity.
- \value OutQuint \inlineimage qeasingcurve-outquint.png
- \br
+ \value OutQuint \image qeasingcurve-outquint.png
+ \caption
Easing curve for a quintic (t^5) function:
decelerating to zero velocity.
- \value InOutQuint \inlineimage qeasingcurve-inoutquint.png
- \br
+ \value InOutQuint \image qeasingcurve-inoutquint.png
+ \caption
Easing curve for a quintic (t^5) function:
acceleration until halfway, then deceleration.
- \value OutInQuint \inlineimage qeasingcurve-outinquint.png
- \br
+ \value OutInQuint \image qeasingcurve-outinquint.png
+ \caption
Easing curve for a quintic (t^5) function:
deceleration until halfway, then acceleration.
- \value InSine \inlineimage qeasingcurve-insine.png
- \br
+ \value InSine \image qeasingcurve-insine.png
+ \caption
Easing curve for a sinusoidal (sin(t)) function:
accelerating from zero velocity.
- \value OutSine \inlineimage qeasingcurve-outsine.png
- \br
+ \value OutSine \image qeasingcurve-outsine.png
+ \caption
Easing curve for a sinusoidal (sin(t)) function:
decelerating from zero velocity.
- \value InOutSine \inlineimage qeasingcurve-inoutsine.png
- \br
+ \value InOutSine \image qeasingcurve-inoutsine.png
+ \caption
Easing curve for a sinusoidal (sin(t)) function:
acceleration until halfway, then deceleration.
- \value OutInSine \inlineimage qeasingcurve-outinsine.png
- \br
+ \value OutInSine \image qeasingcurve-outinsine.png
+ \caption
Easing curve for a sinusoidal (sin(t)) function:
deceleration until halfway, then acceleration.
- \value InExpo \inlineimage qeasingcurve-inexpo.png
- \br
+ \value InExpo \image qeasingcurve-inexpo.png
+ \caption
Easing curve for an exponential (2^t) function:
accelerating from zero velocity.
- \value OutExpo \inlineimage qeasingcurve-outexpo.png
- \br
+ \value OutExpo \image qeasingcurve-outexpo.png
+ \caption
Easing curve for an exponential (2^t) function:
decelerating from zero velocity.
- \value InOutExpo \inlineimage qeasingcurve-inoutexpo.png
- \br
+ \value InOutExpo \image qeasingcurve-inoutexpo.png
+ \caption
Easing curve for an exponential (2^t) function:
acceleration until halfway, then deceleration.
- \value OutInExpo \inlineimage qeasingcurve-outinexpo.png
- \br
+ \value OutInExpo \image qeasingcurve-outinexpo.png
+ \caption
Easing curve for an exponential (2^t) function:
deceleration until halfway, then acceleration.
- \value InCirc \inlineimage qeasingcurve-incirc.png
- \br
+ \value InCirc \image qeasingcurve-incirc.png
+ \caption
Easing curve for a circular (sqrt(1-t^2)) function:
accelerating from zero velocity.
- \value OutCirc \inlineimage qeasingcurve-outcirc.png
- \br
+ \value OutCirc \image qeasingcurve-outcirc.png
+ \caption
Easing curve for a circular (sqrt(1-t^2)) function:
decelerating from zero velocity.
- \value InOutCirc \inlineimage qeasingcurve-inoutcirc.png
- \br
+ \value InOutCirc \image qeasingcurve-inoutcirc.png
+ \caption
Easing curve for a circular (sqrt(1-t^2)) function:
acceleration until halfway, then deceleration.
- \value OutInCirc \inlineimage qeasingcurve-outincirc.png
- \br
+ \value OutInCirc \image qeasingcurve-outincirc.png
+ \caption
Easing curve for a circular (sqrt(1-t^2)) function:
deceleration until halfway, then acceleration.
- \value InElastic \inlineimage qeasingcurve-inelastic.png
- \br
+ \value InElastic \image qeasingcurve-inelastic.png
+ \caption
Easing curve for an elastic
(exponentially decaying sine wave) function:
accelerating from zero velocity. The peak amplitude
can be set with the \e amplitude parameter, and the
period of decay by the \e period parameter.
- \value OutElastic \inlineimage qeasingcurve-outelastic.png
- \br
+ \value OutElastic \image qeasingcurve-outelastic.png
+ \caption
Easing curve for an elastic
(exponentially decaying sine wave) function:
decelerating from zero velocity. The peak amplitude
can be set with the \e amplitude parameter, and the
period of decay by the \e period parameter.
- \value InOutElastic \inlineimage qeasingcurve-inoutelastic.png
- \br
+ \value InOutElastic \image qeasingcurve-inoutelastic.png
+ \caption
Easing curve for an elastic
(exponentially decaying sine wave) function:
acceleration until halfway, then deceleration.
- \value OutInElastic \inlineimage qeasingcurve-outinelastic.png
- \br
+ \value OutInElastic \image qeasingcurve-outinelastic.png
+ \caption
Easing curve for an elastic
(exponentially decaying sine wave) function:
deceleration until halfway, then acceleration.
- \value InBack \inlineimage qeasingcurve-inback.png
- \br
+ \value InBack \image qeasingcurve-inback.png
+ \caption
Easing curve for a back (overshooting
cubic function: (s+1)*t^3 - s*t^2) easing in:
accelerating from zero velocity.
- \value OutBack \inlineimage qeasingcurve-outback.png
- \br
+ \value OutBack \image qeasingcurve-outback.png
+ \caption
Easing curve for a back (overshooting
cubic function: (s+1)*t^3 - s*t^2) easing out:
decelerating to zero velocity.
- \value InOutBack \inlineimage qeasingcurve-inoutback.png
- \br
+ \value InOutBack \image qeasingcurve-inoutback.png
+ \caption
Easing curve for a back (overshooting
cubic function: (s+1)*t^3 - s*t^2) easing in/out:
acceleration until halfway, then deceleration.
- \value OutInBack \inlineimage qeasingcurve-outinback.png
- \br
+ \value OutInBack \image qeasingcurve-outinback.png
+ \caption
Easing curve for a back (overshooting
cubic easing: (s+1)*t^3 - s*t^2) easing out/in:
deceleration until halfway, then acceleration.
- \value InBounce \inlineimage qeasingcurve-inbounce.png
- \br
+ \value InBounce \image qeasingcurve-inbounce.png
+ \caption
Easing curve for a bounce (exponentially
decaying parabolic bounce) function: accelerating
from zero velocity.
- \value OutBounce \inlineimage qeasingcurve-outbounce.png
- \br
+ \value OutBounce \image qeasingcurve-outbounce.png
+ \caption
Easing curve for a bounce (exponentially
decaying parabolic bounce) function: decelerating
from zero velocity.
- \value InOutBounce \inlineimage qeasingcurve-inoutbounce.png
- \br
+ \value InOutBounce \image qeasingcurve-inoutbounce.png
+ \caption
Easing curve for a bounce (exponentially
decaying parabolic bounce) function easing in/out:
acceleration until halfway, then deceleration.
- \value OutInBounce \inlineimage qeasingcurve-outinbounce.png
- \br
+ \value OutInBounce \image qeasingcurve-outinbounce.png
+ \caption
Easing curve for a bounce (exponentially
decaying parabolic bounce) function easing out/in:
deceleration until halfway, then acceleration.
@@ -312,7 +302,7 @@
This is a typedef for a pointer to a function with the following
signature:
- \snippet doc/src/snippets/code/src_corelib_tools_qeasingcurve.cpp 0
+ \snippet code/src_corelib_tools_qeasingcurve.cpp 0
*/
#include "qeasingcurve.h"
@@ -349,7 +339,7 @@ struct TCBPoint {
TCBPoint() {}
TCBPoint(QPointF point, qreal t, qreal c, qreal b) : _point(point), _t(t), _c(c), _b(b) {}
- bool operator==(const TCBPoint& other)
+ bool operator==(const TCBPoint &other) const
{
return _point == other._point &&
qFuzzyCompare(_t, other._t) &&
@@ -373,7 +363,7 @@ public:
virtual ~QEasingCurveFunction() {}
virtual qreal value(qreal t);
virtual QEasingCurveFunction *copy() const;
- bool operator==(const QEasingCurveFunction& other);
+ bool operator==(const QEasingCurveFunction &other) const;
Type _t;
qreal _p;
@@ -397,7 +387,7 @@ QEasingCurveFunction *QEasingCurveFunction::copy() const
return rv;
}
-bool QEasingCurveFunction::operator==(const QEasingCurveFunction& other)
+bool QEasingCurveFunction::operator==(const QEasingCurveFunction &other) const
{
return _t == other._t &&
qFuzzyCompare(_p, other._p) &&
@@ -1467,7 +1457,7 @@ QDataStream &operator<<(QDataStream &stream, const QEasingCurve &easing)
/*!
\fn QDataStream &operator>>(QDataStream &stream, QEasingCurve &easing)
- \relates QQuaternion
+ \relates QEasingCurve
Reads an easing curve from the given \a stream into the given \a
easing curve and returns a reference to the stream.
diff --git a/src/corelib/tools/qelapsedtimer.cpp b/src/corelib/tools/qelapsedtimer.cpp
index e8f2ce174e..76b0d796f0 100644
--- a/src/corelib/tools/qelapsedtimer.cpp
+++ b/src/corelib/tools/qelapsedtimer.cpp
@@ -64,7 +64,7 @@ QT_BEGIN_NAMESPACE
spent in a slow operation. The simplest example of such a case is for
debugging purposes, as in the following example:
- \snippet doc/src/snippets/qelapsedtimer/main.cpp 0
+ \snippet qelapsedtimer/main.cpp 0
In this example, the timer is started by a call to start() and the
elapsed timer is calculated by the elapsed() function.
@@ -76,14 +76,14 @@ QT_BEGIN_NAMESPACE
subclasses are good examples of such need. In that case, the code could
be as follows:
- \snippet doc/src/snippets/qelapsedtimer/main.cpp 1
+ \snippet qelapsedtimer/main.cpp 1
Another use-case is to execute a certain operation for a specific
timeslice. For this, QElapsedTimer provides the hasExpired() convenience
function, which can be used to determine if a certain number of
milliseconds has already elapsed:
- \snippet doc/src/snippets/qelapsedtimer/main.cpp 2
+ \snippet qelapsedtimer/main.cpp 2
\section1 Reference clocks
diff --git a/src/corelib/tools/qelapsedtimer_generic.cpp b/src/corelib/tools/qelapsedtimer_generic.cpp
index 05214f0698..a20b6b5662 100644
--- a/src/corelib/tools/qelapsedtimer_generic.cpp
+++ b/src/corelib/tools/qelapsedtimer_generic.cpp
@@ -70,7 +70,7 @@ bool QElapsedTimer::isMonotonic()
Starts this timer. Once started, a timer value can be checked with elapsed() or msecsSinceReference().
Normally, a timer is started just before a lengthy operation, such as:
- \snippet doc/src/snippets/qelapsedtimer/main.cpp 0
+ \snippet qelapsedtimer/main.cpp 0
Also, starting a timer makes it valid again.
@@ -91,7 +91,7 @@ void QElapsedTimer::start()
parameter to a slow operation (for example, an iteration count) so that
this operation takes at least 250 milliseconds:
- \snippet doc/src/snippets/qelapsedtimer/main.cpp 3
+ \snippet qelapsedtimer/main.cpp 3
\sa start(), invalidate(), elapsed()
*/
diff --git a/src/corelib/tools/qhash.cpp b/src/corelib/tools/qhash.cpp
index 20202a4896..10dcff92c7 100644
--- a/src/corelib/tools/qhash.cpp
+++ b/src/corelib/tools/qhash.cpp
@@ -369,7 +369,6 @@ QHashData *QHashData::detach_helper(void (*node_duplicate)(Node *, void *),
QT_RETHROW;
}
- dup->h = oldNode->h;
*nextNode = dup;
nextNode = &dup->next;
oldNode = oldNode->next;
@@ -694,21 +693,21 @@ void QHashData::checkSanity()
\endlist
Here's an example QHash with QString keys and \c int values:
- \snippet doc/src/snippets/code/src_corelib_tools_qhash.cpp 0
+ \snippet code/src_corelib_tools_qhash.cpp 0
To insert a (key, value) pair into the hash, you can use operator[]():
- \snippet doc/src/snippets/code/src_corelib_tools_qhash.cpp 1
+ \snippet code/src_corelib_tools_qhash.cpp 1
This inserts the following three (key, value) pairs into the
QHash: ("one", 1), ("three", 3), and ("seven", 7). Another way to
insert items into the hash is to use insert():
- \snippet doc/src/snippets/code/src_corelib_tools_qhash.cpp 2
+ \snippet code/src_corelib_tools_qhash.cpp 2
To look up a value, use operator[]() or value():
- \snippet doc/src/snippets/code/src_corelib_tools_qhash.cpp 3
+ \snippet code/src_corelib_tools_qhash.cpp 3
If there is no item with the specified key in the hash, these
functions return a \l{default-constructed value}.
@@ -716,12 +715,12 @@ void QHashData::checkSanity()
If you want to check whether the hash contains a particular key,
use contains():
- \snippet doc/src/snippets/code/src_corelib_tools_qhash.cpp 4
+ \snippet code/src_corelib_tools_qhash.cpp 4
There is also a value() overload that uses its second argument as
a default value if there is no item with the specified key:
- \snippet doc/src/snippets/code/src_corelib_tools_qhash.cpp 5
+ \snippet code/src_corelib_tools_qhash.cpp 5
In general, we recommend that you use contains() and value()
rather than operator[]() for looking up a key in a hash. The
@@ -730,7 +729,7 @@ void QHashData::checkSanity()
const). For example, the following code snippet will create 1000
items in memory:
- \snippet doc/src/snippets/code/src_corelib_tools_qhash.cpp 6
+ \snippet code/src_corelib_tools_qhash.cpp 6
To avoid this problem, replace \c hash[i] with \c hash.value(i)
in the code above.
@@ -751,11 +750,11 @@ void QHashData::checkSanity()
QHash::iterator). Here's how to iterate over a QHash<QString,
int> using a Java-style iterator:
- \snippet doc/src/snippets/code/src_corelib_tools_qhash.cpp 7
+ \snippet code/src_corelib_tools_qhash.cpp 7
Here's the same code, but using an STL-style iterator:
- \snippet doc/src/snippets/code/src_corelib_tools_qhash.cpp 8
+ \snippet code/src_corelib_tools_qhash.cpp 8
QHash is unordered, so an iterator's sequence cannot be assumed
to be predictable. If ordering by key is required, use a QMap.
@@ -764,7 +763,7 @@ void QHashData::checkSanity()
insert() with a key that already exists in the QHash, the
previous value is erased. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qhash.cpp 9
+ \snippet code/src_corelib_tools_qhash.cpp 9
However, you can store multiple values per key by using
insertMulti() instead of insert() (or using the convenience
@@ -772,19 +771,19 @@ void QHashData::checkSanity()
the values for a single key, you can use values(const Key &key),
which returns a QList<T>:
- \snippet doc/src/snippets/code/src_corelib_tools_qhash.cpp 10
+ \snippet code/src_corelib_tools_qhash.cpp 10
The items that share the same key are available from most
recently to least recently inserted. A more efficient approach is
to call find() to get the iterator for the first item with a key
and iterate from there:
- \snippet doc/src/snippets/code/src_corelib_tools_qhash.cpp 11
+ \snippet code/src_corelib_tools_qhash.cpp 11
If you only need to extract the values from a hash (not the keys),
you can also use \l{foreach}:
- \snippet doc/src/snippets/code/src_corelib_tools_qhash.cpp 12
+ \snippet code/src_corelib_tools_qhash.cpp 12
Items can be removed from the hash in several ways. One way is to
call remove(); this will remove any item with the given key.
@@ -975,7 +974,7 @@ void QHashData::checkSanity()
This function is useful for code that needs to build a huge hash
and wants to avoid repeated reallocation. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qhash.cpp 14
+ \snippet code/src_corelib_tools_qhash.cpp 14
Ideally, \a size should be slightly more than the maximum number
of items expected in the hash. \a size doesn't have to be prime,
@@ -1284,7 +1283,7 @@ void QHashData::checkSanity()
be called while iterating, and won't affect the order of items in
the hash. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qhash.cpp 15
+ \snippet code/src_corelib_tools_qhash.cpp 15
\sa remove(), take(), find()
*/
@@ -1303,7 +1302,7 @@ void QHashData::checkSanity()
the iterator. For example, here's some code that iterates over all
the items with the same key:
- \snippet doc/src/snippets/code/src_corelib_tools_qhash.cpp 16
+ \snippet code/src_corelib_tools_qhash.cpp 16
\sa value(), values(), QMultiHash::find()
*/
@@ -1460,7 +1459,7 @@ void QHashData::checkSanity()
start iterating. Here's a typical loop that prints all the (key,
value) pairs stored in a hash:
- \snippet doc/src/snippets/code/src_corelib_tools_qhash.cpp 17
+ \snippet code/src_corelib_tools_qhash.cpp 17
Unlike QMap, which orders its items by key, QHash stores its
items in an arbitrary order. The only guarantee is that items that
@@ -1473,22 +1472,22 @@ void QHashData::checkSanity()
Here's an example that increments every value stored in the QHash
by 2:
- \snippet doc/src/snippets/code/src_corelib_tools_qhash.cpp 18
+ \snippet code/src_corelib_tools_qhash.cpp 18
Here's an example that removes all the items whose key is a
string that starts with an underscore character:
- \snippet doc/src/snippets/code/src_corelib_tools_qhash.cpp 19
+ \snippet code/src_corelib_tools_qhash.cpp 19
The call to QHash::erase() removes the item pointed to by the
iterator from the hash, and returns an iterator to the next item.
Here's another way of removing an item while iterating:
- \snippet doc/src/snippets/code/src_corelib_tools_qhash.cpp 20
+ \snippet code/src_corelib_tools_qhash.cpp 20
It might be tempting to write code like this:
- \snippet doc/src/snippets/code/src_corelib_tools_qhash.cpp 21
+ \snippet code/src_corelib_tools_qhash.cpp 21
However, this will potentially crash in \c{++i}, because \c i is
a dangling iterator after the call to erase().
@@ -1514,7 +1513,7 @@ void QHashData::checkSanity()
called on an uninitialized iterator. Use operator=() to assign a
value to it before using it.
- \sa QHash::begin() QHash::end()
+ \sa QHash::begin(), QHash::end()
*/
/*! \fn QHash::iterator::iterator(void *node)
@@ -1540,7 +1539,7 @@ void QHashData::checkSanity()
You can change the value of an item by using value() on
the left side of an assignment, for example:
- \snippet doc/src/snippets/code/src_corelib_tools_qhash.cpp 22
+ \snippet code/src_corelib_tools_qhash.cpp 22
\sa key(), operator*()
*/
@@ -1684,7 +1683,7 @@ void QHashData::checkSanity()
QHash::find() before you can start iterating. Here's a typical
loop that prints all the (key, value) pairs stored in a hash:
- \snippet doc/src/snippets/code/src_corelib_tools_qhash.cpp 23
+ \snippet code/src_corelib_tools_qhash.cpp 23
Unlike QMap, which orders its items by key, QHash stores its
items in an arbitrary order. The only guarantee is that items that
@@ -1710,7 +1709,7 @@ void QHashData::checkSanity()
called on an uninitialized iterator. Use operator=() to assign a
value to it before using it.
- \sa QHash::constBegin() QHash::constEnd()
+ \sa QHash::constBegin(), QHash::constEnd()
*/
/*! \fn QHash::const_iterator::const_iterator(void *node)
@@ -1897,7 +1896,7 @@ void QHashData::checkSanity()
operator+=().
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qhash.cpp 24
+ \snippet code/src_corelib_tools_qhash.cpp 24
Unlike QHash, QMultiHash provides no operator[]. Use value() or
replace() if you want to access the most recently inserted item
@@ -1906,7 +1905,7 @@ void QHashData::checkSanity()
If you want to retrieve all the values for a single key, you can
use values(const Key &key), which returns a QList<T>:
- \snippet doc/src/snippets/code/src_corelib_tools_qhash.cpp 25
+ \snippet code/src_corelib_tools_qhash.cpp 25
The items that share the same key are available from most
recently to least recently inserted.
@@ -1915,7 +1914,7 @@ void QHashData::checkSanity()
the STL-style iterator for the first item with a key and iterate from
there:
- \snippet doc/src/snippets/code/src_corelib_tools_qhash.cpp 26
+ \snippet code/src_corelib_tools_qhash.cpp 26
QMultiHash's key and value data types must be \l{assignable data
types}. You cannot, for example, store a QWidget as a value;
diff --git a/src/corelib/tools/qhash.h b/src/corelib/tools/qhash.h
index fe6a8dfad1..d196e6e376 100644
--- a/src/corelib/tools/qhash.h
+++ b/src/corelib/tools/qhash.h
@@ -197,27 +197,29 @@ inline bool operator==(const QHashDummyValue & /* v1 */, const QHashDummyValue &
Q_DECLARE_TYPEINFO(QHashDummyValue, Q_MOVABLE_TYPE | Q_DUMMY_TYPE);
template <class Key, class T>
-struct QHashDummyNode
+struct QHashNode
{
- QHashDummyNode *next;
+ QHashNode *next;
uint h;
Key key;
+ T value;
- inline QHashDummyNode(const Key &key0) : key(key0) {}
+ inline QHashNode(const Key &key0, const T &value0, uint hash, QHashNode *n)
+ : next(n), h(hash), key(key0), value(value0) {}
+ inline bool same_key(uint h0, const Key &key0) { return h0 == h && key0 == key; }
};
template <class Key, class T>
-struct QHashNode
+struct QHashDummyNode
{
- QHashNode *next;
+ QHashNode<Key, T> *next;
uint h;
Key key;
- T value;
- inline QHashNode(const Key &key0, const T &value0) : key(key0), value(value0) {}
- inline bool same_key(uint h0, const Key &key0) { return h0 == h && key0 == key; }
+ inline QHashDummyNode(const Key &key0, uint hash, QHashNode<Key, T> *n) : next(n), h(hash), key(key0) {}
};
+
#if 0
// ###
// The introduction of the QHash random seed breaks this optimization, as it
@@ -519,9 +521,9 @@ Q_INLINE_TEMPLATE void QHash<Key, T>::duplicateNode(QHashData::Node *node, void
{
Node *concreteNode = concrete(node);
if (QTypeInfo<T>::isDummy) {
- (void) new (newNode) DummyNode(concreteNode->key);
+ (void) new (newNode) DummyNode(concreteNode->key, concreteNode->h, 0);
} else {
- (void) new (newNode) Node(concreteNode->key, concreteNode->value);
+ (void) new (newNode) Node(concreteNode->key, concreteNode->value, concreteNode->h, 0);
}
}
@@ -532,13 +534,11 @@ QHash<Key, T>::createNode(uint ah, const Key &akey, const T &avalue, Node **anex
Node *node;
if (QTypeInfo<T>::isDummy) {
- node = reinterpret_cast<Node *>(new (d->allocateNode(alignOfDummyNode())) DummyNode(akey));
+ node = reinterpret_cast<Node *>(new (d->allocateNode(alignOfDummyNode())) DummyNode(akey, ah, *anextNode));
} else {
- node = new (d->allocateNode(alignOfNode())) Node(akey, avalue);
+ node = new (d->allocateNode(alignOfNode())) Node(akey, avalue, ah, *anextNode);
}
- node->h = ah;
- node->next = *anextNode;
*anextNode = node;
++d->size;
return node;
diff --git a/src/corelib/tools/qiterator.qdoc b/src/corelib/tools/qiterator.qdoc
index e19a751755..508664ec45 100644
--- a/src/corelib/tools/qiterator.qdoc
+++ b/src/corelib/tools/qiterator.qdoc
@@ -50,7 +50,7 @@
the list (before the first item). Here's how to iterate over all
the elements sequentially:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 0
+ \snippet code/doc_src_qiterator.cpp 0
The next() function returns the next item in the list and
advances the iterator. Unlike STL-style iterators, Java-style
@@ -61,11 +61,11 @@
position between the second and third item, and returns the second
item; and so on.
- \img javaiterators1.png
+ \image javaiterators1.png
Here's how to iterate over the elements in reverse order:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 1
+ \snippet code/doc_src_qiterator.cpp 1
If you want to find all occurrences of a particular value, use
findNext() or findPrevious() in a loop.
@@ -98,7 +98,7 @@
beginning of the list (before the first item). Here's how to
iterate over all the elements sequentially:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 2
+ \snippet code/doc_src_qiterator.cpp 2
The next() function returns the next item in the list and
advances the iterator. Unlike STL-style iterators, Java-style
@@ -109,11 +109,11 @@
position between the second and third item, and returns the second
item; and so on.
- \img javaiterators1.png
+ \image javaiterators1.png
Here's how to iterate over the elements in reverse order:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 3
+ \snippet code/doc_src_qiterator.cpp 3
If you want to find all occurrences of a particular value, use
findNext() or findPrevious() in a loop.
@@ -150,7 +150,7 @@
of the vector (before the first item). Here's how to iterate over
all the elements sequentially:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 4
+ \snippet code/doc_src_qiterator.cpp 4
The next() function returns the next item in the vector and
advances the iterator. Unlike STL-style iterators, Java-style
@@ -161,11 +161,11 @@
position between the second and third item, returning the second
item; and so on.
- \img javaiterators1.png
+ \image javaiterators1.png
Here's how to iterate over the elements in reverse order:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 5
+ \snippet code/doc_src_qiterator.cpp 5
If you want to find all occurrences of a particular value, use
findNext() or findPrevious() in a loop.
@@ -197,7 +197,7 @@
the first item). Here's how to iterate over all the elements
sequentially:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 6
+ \snippet code/doc_src_qiterator.cpp 6
The next() function returns the next item in the set and
advances the iterator. Unlike STL-style iterators, Java-style
@@ -208,11 +208,11 @@
position between the second and third item, returning the second
item; and so on.
- \img javaiterators1.png
+ \image javaiterators1.png
Here's how to iterate over the elements in reverse order:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 7
+ \snippet code/doc_src_qiterator.cpp 7
If you want to find all occurrences of a particular value, use
findNext() or findPrevious() in a loop.
@@ -251,7 +251,7 @@
of the list (before the first item). Here's how to iterate over
all the elements sequentially:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 8
+ \snippet code/doc_src_qiterator.cpp 8
The next() function returns the next item in the list and
advances the iterator. Unlike STL-style iterators, Java-style
@@ -262,11 +262,11 @@
position between the second and third item, returning the second
item; and so on.
- \img javaiterators1.png
+ \image javaiterators1.png
Here's how to iterate over the elements in reverse order:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 9
+ \snippet code/doc_src_qiterator.cpp 9
If you want to find all occurrences of a particular value, use
findNext() or findPrevious() in a loop.
@@ -277,7 +277,7 @@
insert().
Example:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 10
+ \snippet code/doc_src_qiterator.cpp 10
The example traverses a list, replacing negative numbers with
their absolute values, and eliminating zeroes.
@@ -312,7 +312,7 @@
beginning of the list (before the first item). Here's how to
iterate over all the elements sequentially:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 11
+ \snippet code/doc_src_qiterator.cpp 11
The next() function returns the next item in the list and
advances the iterator. Unlike STL-style iterators, Java-style
@@ -323,11 +323,11 @@
position between the second and third item, returning the second
item; and so on.
- \img javaiterators1.png
+ \image javaiterators1.png
Here's how to iterate over the elements in reverse order:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 12
+ \snippet code/doc_src_qiterator.cpp 12
If you want to find all occurrences of a particular value, use
findNext() or findPrevious() in a loop.
@@ -338,7 +338,7 @@
insert().
Example:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 13
+ \snippet code/doc_src_qiterator.cpp 13
The example traverses a list, replacing negative numbers with
their absolute values, and eliminating zeroes.
@@ -378,7 +378,7 @@
beginning of the list (before the first item). Here's how to
iterate over all the elements sequentially:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 14
+ \snippet code/doc_src_qiterator.cpp 14
The next() function returns the next item in the vector and
advances the iterator. Unlike STL-style iterators, Java-style
@@ -389,11 +389,11 @@
position between the second and third item, returning the second
item; and so on.
- \img javaiterators1.png
+ \image javaiterators1.png
Here's how to iterate over the elements in reverse order:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 15
+ \snippet code/doc_src_qiterator.cpp 15
If you want to find all occurrences of a particular value, use
findNext() or findPrevious() in a loop.
@@ -404,7 +404,7 @@
insert().
Example:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 16
+ \snippet code/doc_src_qiterator.cpp 16
The example traverses a vector, replacing negative numbers with
their absolute values, and eliminating zeroes.
@@ -440,7 +440,7 @@
of the set (before the first item). Here's how to iterate over
all the elements sequentially:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 17
+ \snippet code/doc_src_qiterator.cpp 17
The next() function returns the next item in the set and
advances the iterator. Unlike STL-style iterators, Java-style
@@ -451,11 +451,11 @@
position between the second and third item, returning the second
item; and so on.
- \img javaiterators1.png
+ \image javaiterators1.png
Here's how to iterate over the elements in reverse order:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 18
+ \snippet code/doc_src_qiterator.cpp 18
If you want to remove items as you iterate over the set, use
remove().
@@ -755,7 +755,7 @@
traversal functions (next(), previous(), findNext(), findPrevious()).
Example:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 19
+ \snippet code/doc_src_qiterator.cpp 19
\sa insert(), setValue()
*/
@@ -766,7 +766,7 @@
traversal functions (next(), previous(), findNext(), findPrevious()).
Example:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 20
+ \snippet code/doc_src_qiterator.cpp 20
\sa insert(), setValue()
*/
@@ -777,7 +777,7 @@
traversal functions (next(), previous(), findNext(), findPrevious()).
Example:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 21
+ \snippet code/doc_src_qiterator.cpp 21
\sa insert(), setValue()
*/
@@ -788,7 +788,7 @@
traversal functions (next(), previous(), findNext(), findPrevious()).
Example:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 22
+ \snippet code/doc_src_qiterator.cpp 22
\sa value()
*/
@@ -802,7 +802,7 @@
findPrevious().
Example:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 23
+ \snippet code/doc_src_qiterator.cpp 23
\sa value(), remove(), insert()
*/
@@ -816,7 +816,7 @@
findPrevious().
Example:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 24
+ \snippet code/doc_src_qiterator.cpp 24
\sa value(), remove(), insert()
*/
@@ -830,7 +830,7 @@
findPrevious().
Example:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 25
+ \snippet code/doc_src_qiterator.cpp 25
\sa value(), remove(), insert()
*/
@@ -889,7 +889,7 @@
the map (before the first item). Here's how to iterate over all
the elements sequentially:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 26
+ \snippet code/doc_src_qiterator.cpp 26
The next() function returns the next item in the map and
advances the iterator. The key() and value() functions return the
@@ -902,16 +902,16 @@
next() advances the iterator to the position between the second
and third item; and so on.
- \img javaiterators1.png
+ \image javaiterators1.png
Here's how to iterate over the elements in reverse order:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 27
+ \snippet code/doc_src_qiterator.cpp 27
If you want to find all occurrences of a particular value, use
findNext() or findPrevious() in a loop. For example:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 28
+ \snippet code/doc_src_qiterator.cpp 28
Multiple iterators can be used on the same map. If the map is
modified while a QMapIterator is active, the QMapIterator will
@@ -941,7 +941,7 @@
the hash (before the first item). Here's how to iterate over all
the elements sequentially:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 29
+ \snippet code/doc_src_qiterator.cpp 29
The next() function returns the next item in the hash and
advances the iterator. The key() and value() functions return the
@@ -954,16 +954,16 @@
next() advances the iterator to the position between the second
and third item; and so on.
- \img javaiterators1.png
+ \image javaiterators1.png
Here's how to iterate over the elements in reverse order:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 30
+ \snippet code/doc_src_qiterator.cpp 30
If you want to find all occurrences of a particular value, use
findNext() or findPrevious() in a loop. For example:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 31
+ \snippet code/doc_src_qiterator.cpp 31
Multiple iterators can be used on the same hash. If the hash is
modified while a QHashIterator is active, the QHashIterator will
@@ -994,7 +994,7 @@
of the map (before the first item). Here's how to iterate over
all the elements sequentially:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 32
+ \snippet code/doc_src_qiterator.cpp 32
The next() function returns the next item in the map and
advances the iterator. The key() and value() functions return the
@@ -1007,16 +1007,16 @@
next() advances the iterator to the position between the second
and third item; and so on.
- \img javaiterators1.png
+ \image javaiterators1.png
Here's how to iterate over the elements in reverse order:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 33
+ \snippet code/doc_src_qiterator.cpp 33
If you want to find all occurrences of a particular value, use
findNext() or findPrevious() in a loop. For example:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 34
+ \snippet code/doc_src_qiterator.cpp 34
If you want to remove items as you iterate over the map, use
remove(). If you want to modify the value of an item, use
@@ -1024,7 +1024,7 @@
Example:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 35
+ \snippet code/doc_src_qiterator.cpp 35
The example removes all (key, value) pairs where the key and the
value are the same.
@@ -1059,7 +1059,7 @@
of the hash (before the first item). Here's how to iterate over
all the elements sequentially:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 36
+ \snippet code/doc_src_qiterator.cpp 36
The next() function returns the next item in the hash and
advances the iterator. The key() and value() functions return the
@@ -1072,16 +1072,16 @@
next() advances the iterator to the position between the second
and third item; and so on.
- \img javaiterators1.png
+ \image javaiterators1.png
Here's how to iterate over the elements in reverse order:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 37
+ \snippet code/doc_src_qiterator.cpp 37
If you want to find all occurrences of a particular value, use
findNext() or findPrevious() in a loop. For example:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 38
+ \snippet code/doc_src_qiterator.cpp 38
If you want to remove items as you iterate over the hash, use
remove(). If you want to modify the value of an item, use
@@ -1089,7 +1089,7 @@
Example:
- \snippet doc/src/snippets/code/doc_src_qiterator.cpp 39
+ \snippet code/doc_src_qiterator.cpp 39
The example removes all (key, value) pairs where the key and the
value are the same.
diff --git a/src/corelib/tools/qlinkedlist.cpp b/src/corelib/tools/qlinkedlist.cpp
index 1502f70d56..3682818099 100644
--- a/src/corelib/tools/qlinkedlist.cpp
+++ b/src/corelib/tools/qlinkedlist.cpp
@@ -81,13 +81,13 @@ const QLinkedListData QLinkedListData::shared_null = {
Here's an example of a QLinkedList that stores integers and a
QLinkedList that stores QTime values:
- \snippet doc/src/snippets/code/src_corelib_tools_qlinkedlist.cpp 0
+ \snippet code/src_corelib_tools_qlinkedlist.cpp 0
QLinkedList stores a list of items. The default constructor
creates an empty list. To insert items into the list, you can use
operator<<():
- \snippet doc/src/snippets/code/src_corelib_tools_qlinkedlist.cpp 1
+ \snippet code/src_corelib_tools_qlinkedlist.cpp 1
If you want to get the first or last item in a linked list, use
first() or last(). If you want to remove an item from either end
@@ -99,7 +99,7 @@ const QLinkedListData QLinkedListData::shared_null = {
list and do something with it. For this, QLinkedList provides
takeFirst() and takeLast(). Here's a loop that removes the items
from a list one at a time and calls \c delete on them:
- \snippet doc/src/snippets/code/src_corelib_tools_qlinkedlist.cpp 2
+ \snippet code/src_corelib_tools_qlinkedlist.cpp 2
QLinkedList's value type must be an \l {assignable data type}. This
covers most data types that are commonly used, but the compiler
@@ -230,7 +230,7 @@ const QLinkedListData QLinkedListData::shared_null = {
Inserts \a value at the end of the list.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qlinkedlist.cpp 3
+ \snippet code/src_corelib_tools_qlinkedlist.cpp 3
This is the same as list.insert(end(), \a value).
@@ -242,7 +242,7 @@ const QLinkedListData QLinkedListData::shared_null = {
Inserts \a value at the beginning of the list.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qlinkedlist.cpp 4
+ \snippet code/src_corelib_tools_qlinkedlist.cpp 4
This is the same as list.insert(begin(), \a value).
@@ -254,7 +254,7 @@ const QLinkedListData QLinkedListData::shared_null = {
Removes all occurrences of \a value in the list.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qlinkedlist.cpp 5
+ \snippet code/src_corelib_tools_qlinkedlist.cpp 5
This function requires the value type to have an implementation of
\c operator==().
@@ -270,7 +270,7 @@ const QLinkedListData QLinkedListData::shared_null = {
success; otherwise returns false.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qlinkedlist.cpp 6
+ \snippet code/src_corelib_tools_qlinkedlist.cpp 6
This function requires the value type to have an implementation of
\c operator==().
@@ -635,35 +635,35 @@ const QLinkedListData QLinkedListData::shared_null = {
QLinkedList::insert() before you can start iterating. Here's a
typical loop that prints all the items stored in a list:
- \snippet doc/src/snippets/code/src_corelib_tools_qlinkedlist.cpp 7
+ \snippet code/src_corelib_tools_qlinkedlist.cpp 7
STL-style iterators can be used as arguments to \l{generic
algorithms}. For example, here's how to find an item in the list
using the qFind() algorithm:
- \snippet doc/src/snippets/code/src_corelib_tools_qlinkedlist.cpp 8
+ \snippet code/src_corelib_tools_qlinkedlist.cpp 8
Let's see a few examples of things we can do with a
QLinkedList::iterator that we cannot do with a QLinkedList::const_iterator.
Here's an example that increments every value stored in a
QLinkedList\<int\> by 2:
- \snippet doc/src/snippets/code/src_corelib_tools_qlinkedlist.cpp 9
+ \snippet code/src_corelib_tools_qlinkedlist.cpp 9
Here's an example that removes all the items that start with an
underscore character in a QLinkedList\<QString\>:
- \snippet doc/src/snippets/code/src_corelib_tools_qlinkedlist.cpp 10
+ \snippet code/src_corelib_tools_qlinkedlist.cpp 10
The call to QLinkedList::erase() removes the item pointed to by
the iterator from the list, and returns an iterator to the next
item. Here's another way of removing an item while iterating:
- \snippet doc/src/snippets/code/src_corelib_tools_qlinkedlist.cpp 11
+ \snippet code/src_corelib_tools_qlinkedlist.cpp 11
It might be tempting to write code like this:
- \snippet doc/src/snippets/code/src_corelib_tools_qlinkedlist.cpp 12
+ \snippet code/src_corelib_tools_qlinkedlist.cpp 12
However, this will potentially crash in \c{++i}, because \c i is
a dangling iterator after the call to erase().
@@ -686,7 +686,7 @@ const QLinkedListData QLinkedListData::shared_null = {
on an uninitialized iterator. Use operator=() to assign a value
to it before using it.
- \sa QLinkedList::begin() QLinkedList::end()
+ \sa QLinkedList::begin(), QLinkedList::end()
*/
/*! \fn QLinkedList::iterator::iterator(Node *node)
@@ -736,7 +736,7 @@ const QLinkedListData QLinkedListData::shared_null = {
You can change the value of an item by using operator*() on the
left side of an assignment, for example:
- \snippet doc/src/snippets/code/src_corelib_tools_qlinkedlist.cpp 13
+ \snippet code/src_corelib_tools_qlinkedlist.cpp 13
\sa operator->()
*/
@@ -868,13 +868,13 @@ const QLinkedListData QLinkedListData::shared_null = {
QLinkedList::insert() before you can start iterating. Here's a
typical loop that prints all the items stored in a list:
- \snippet doc/src/snippets/code/src_corelib_tools_qlinkedlist.cpp 14
+ \snippet code/src_corelib_tools_qlinkedlist.cpp 14
STL-style iterators can be used as arguments to \l{generic
algorithms}. For example, here's how to find an item in the list
using the qFind() algorithm:
- \snippet doc/src/snippets/code/src_corelib_tools_qlinkedlist.cpp 15
+ \snippet code/src_corelib_tools_qlinkedlist.cpp 15
Multiple iterators can be used on the same list. If you add items
to the list, existing iterators will remain valid. If you remove
@@ -892,7 +892,7 @@ const QLinkedListData QLinkedListData::shared_null = {
on an uninitialized iterator. Use operator=() to assign a value
to it before using it.
- \sa QLinkedList::constBegin() QLinkedList::constEnd()
+ \sa QLinkedList::constBegin(), QLinkedList::constEnd()
*/
/*! \fn QLinkedList::const_iterator::const_iterator(Node *node)
@@ -1082,7 +1082,7 @@ const QLinkedListData QLinkedListData::shared_null = {
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qlinkedlist.cpp 16
+ \snippet code/src_corelib_tools_qlinkedlist.cpp 16
\sa toStdList()
*/
@@ -1094,7 +1094,7 @@ const QLinkedListData QLinkedListData::shared_null = {
Returns a std::list object with the data contained in this
QLinkedList. Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qlinkedlist.cpp 17
+ \snippet code/src_corelib_tools_qlinkedlist.cpp 17
\sa fromStdList()
*/
diff --git a/src/corelib/tools/qlist.cpp b/src/corelib/tools/qlist.cpp
index c87b3e7d24..b3514d35ef 100644
--- a/src/corelib/tools/qlist.cpp
+++ b/src/corelib/tools/qlist.cpp
@@ -375,7 +375,7 @@ void **QListData::erase(void **xi)
Here's an example of a QList that stores integers and
a QList that stores QDate values:
- \snippet doc/src/snippets/code/src_corelib_tools_qlistdata.cpp 0
+ \snippet code/src_corelib_tools_qlistdata.cpp 0
Qt includes a QStringList class that inherits QList\<QString\>
and adds a few convenience functions, such as QStringList::join()
@@ -386,7 +386,7 @@ void **QListData::erase(void **xi)
empty list. To insert items into the list, you can use
operator<<():
- \snippet doc/src/snippets/code/src_corelib_tools_qlistdata.cpp 1
+ \snippet code/src_corelib_tools_qlistdata.cpp 1
QList provides these basic functions to add, move, and remove
items: insert(), replace(), removeAt(), move(), and swap(). In
@@ -398,13 +398,13 @@ void **QListData::erase(void **xi)
non-const lists, operator[]() returns a reference to the item and
can be used on the left side of an assignment:
- \snippet doc/src/snippets/code/src_corelib_tools_qlistdata.cpp 2
+ \snippet code/src_corelib_tools_qlistdata.cpp 2
Because QList is implemented as an array of pointers, this
operation is very fast (\l{constant time}). For read-only access,
an alternative syntax is to use at():
- \snippet doc/src/snippets/code/src_corelib_tools_qlistdata.cpp 3
+ \snippet code/src_corelib_tools_qlistdata.cpp 3
at() can be faster than operator[](), because it never causes a
\l{deep copy} to occur.
@@ -414,7 +414,7 @@ void **QListData::erase(void **xi)
and takeLast(). Here's a loop that removes the items from a list
one at a time and calls \c delete on them:
- \snippet doc/src/snippets/code/src_corelib_tools_qlistdata.cpp 4
+ \snippet code/src_corelib_tools_qlistdata.cpp 4
Inserting and removing items at either ends of the list is very
fast (\l{constant time} in most cases), because QList
@@ -427,7 +427,7 @@ void **QListData::erase(void **xi)
backward. Both return the index of a matching item if they find
it; otherwise, they return -1. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qlistdata.cpp 5
+ \snippet code/src_corelib_tools_qlistdata.cpp 5
If you simply want to check whether a list contains a particular
value, use contains(). If you want to find out how many times a
@@ -652,7 +652,7 @@ void **QListData::erase(void **xi)
Inserts \a value at the end of the list.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qlistdata.cpp 6
+ \snippet code/src_corelib_tools_qlistdata.cpp 6
This is the same as list.insert(size(), \a value).
@@ -680,7 +680,7 @@ void **QListData::erase(void **xi)
Inserts \a value at the beginning of the list.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qlistdata.cpp 7
+ \snippet code/src_corelib_tools_qlistdata.cpp 7
This is the same as list.insert(0, \a value).
@@ -698,7 +698,7 @@ void **QListData::erase(void **xi)
value is appended to the list.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qlistdata.cpp 8
+ \snippet code/src_corelib_tools_qlistdata.cpp 8
\sa append(), prepend(), replace(), removeAt()
*/
@@ -729,7 +729,7 @@ void **QListData::erase(void **xi)
number of entries removed.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qlistdata.cpp 9
+ \snippet code/src_corelib_tools_qlistdata.cpp 9
This function requires the value type to have an implementation of
\c operator==().
@@ -745,7 +745,7 @@ void **QListData::erase(void **xi)
true on success; otherwise returns false.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qlistdata.cpp 10
+ \snippet code/src_corelib_tools_qlistdata.cpp 10
This function requires the value type to have an implementation of
\c operator==().
@@ -805,7 +805,7 @@ void **QListData::erase(void **xi)
Moves the item at index position \a from to index position \a to.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qlistdata.cpp 11
+ \snippet code/src_corelib_tools_qlistdata.cpp 11
This is the same as insert(\a{to}, takeAt(\a{from})).This function
assumes that both \a from and \a to are at least 0 but less than
@@ -823,7 +823,7 @@ void **QListData::erase(void **xi)
\a i and \a j are at least 0 and less than size().
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qlistdata.cpp 12
+ \snippet code/src_corelib_tools_qlistdata.cpp 12
\sa move()
*/
@@ -835,7 +835,7 @@ void **QListData::erase(void **xi)
-1 if no item matched.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qlistdata.cpp 13
+ \snippet code/src_corelib_tools_qlistdata.cpp 13
This function requires the value type to have an implementation of
\c operator==().
@@ -855,7 +855,7 @@ void **QListData::erase(void **xi)
Returns -1 if no item matched.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qlistdata.cpp 14
+ \snippet code/src_corelib_tools_qlistdata.cpp 14
This function requires the value type to have an implementation of
\c operator==().
@@ -1237,14 +1237,14 @@ void **QListData::erase(void **xi)
start iterating. Here's a typical loop that prints all the items
stored in a list:
- \snippet doc/src/snippets/code/src_corelib_tools_qlistdata.cpp 15
+ \snippet code/src_corelib_tools_qlistdata.cpp 15
Let's see a few examples of things we can do with a
QList::iterator that we cannot do with a QList::const_iterator.
Here's an example that increments every value stored in a
QList\<int\> by 2:
- \snippet doc/src/snippets/code/src_corelib_tools_qlistdata.cpp 16
+ \snippet code/src_corelib_tools_qlistdata.cpp 16
Most QList functions accept an integer index rather than an
iterator. For that reason, iterators are rarely useful in
@@ -1254,7 +1254,7 @@ void **QListData::erase(void **xi)
For example, here's how to delete all the widgets stored in a
QList\<QWidget *\>:
- \snippet doc/src/snippets/code/src_corelib_tools_qlistdata.cpp 17
+ \snippet code/src_corelib_tools_qlistdata.cpp 17
Multiple iterators can be used on the same list. However, be
aware that any non-const function call performed on the QList
@@ -1299,7 +1299,7 @@ void **QListData::erase(void **xi)
on an uninitialized iterator. Use operator=() to assign a value
to it before using it.
- \sa QList::begin() QList::end()
+ \sa QList::begin(), QList::end()
*/
/*! \fn QList::iterator::iterator(Node *node)
@@ -1319,7 +1319,7 @@ void **QListData::erase(void **xi)
You can change the value of an item by using operator*() on the
left side of an assignment, for example:
- \snippet doc/src/snippets/code/src_corelib_tools_qlistdata.cpp 18
+ \snippet code/src_corelib_tools_qlistdata.cpp 18
\sa operator->()
*/
@@ -1493,7 +1493,7 @@ void **QListData::erase(void **xi)
QList::insert() before you can start iterating. Here's a typical
loop that prints all the items stored in a list:
- \snippet doc/src/snippets/code/src_corelib_tools_qlistdata.cpp 19
+ \snippet code/src_corelib_tools_qlistdata.cpp 19
Most QList functions accept an integer index rather than an
iterator. For that reason, iterators are rarely useful in
@@ -1503,7 +1503,7 @@ void **QListData::erase(void **xi)
For example, here's how to delete all the widgets stored in a
QList\<QWidget *\>:
- \snippet doc/src/snippets/code/src_corelib_tools_qlistdata.cpp 20
+ \snippet code/src_corelib_tools_qlistdata.cpp 20
Multiple iterators can be used on the same list. However, be
aware that any non-const function call performed on the QList
@@ -1522,7 +1522,7 @@ void **QListData::erase(void **xi)
on an uninitialized iterator. Use operator=() to assign a value
to it before using it.
- \sa QList::constBegin() QList::constEnd()
+ \sa QList::constBegin(), QList::constEnd()
*/
/*! \typedef QList::const_iterator::iterator_category
@@ -1738,7 +1738,7 @@ void **QListData::erase(void **xi)
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qlistdata.cpp 21
+ \snippet code/src_corelib_tools_qlistdata.cpp 21
\sa fromSet(), toVector(), QVector::toList()
*/
@@ -1749,7 +1749,7 @@ void **QListData::erase(void **xi)
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qlistdata.cpp 22
+ \snippet code/src_corelib_tools_qlistdata.cpp 22
\sa toSet(), fromVector(), QVector::fromList()
*/
@@ -1761,7 +1761,7 @@ void **QListData::erase(void **xi)
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qlistdata.cpp 23
+ \snippet code/src_corelib_tools_qlistdata.cpp 23
\sa fromVector(), toSet(), QSet::toList(), qSort()
*/
@@ -1774,7 +1774,7 @@ void **QListData::erase(void **xi)
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qlistdata.cpp 24
+ \snippet code/src_corelib_tools_qlistdata.cpp 24
\sa toVector(), fromSet(), QSet::fromList()
*/
@@ -1786,7 +1786,7 @@ void **QListData::erase(void **xi)
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qlistdata.cpp 25
+ \snippet code/src_corelib_tools_qlistdata.cpp 25
\sa toStdList(), QVector::fromStdVector()
*/
@@ -1796,7 +1796,7 @@ void **QListData::erase(void **xi)
Returns a std::list object with the data contained in this QList.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qlistdata.cpp 26
+ \snippet code/src_corelib_tools_qlistdata.cpp 26
\sa fromStdList(), QVector::toStdVector()
*/
diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index b9f199e50e..88667f7fbd 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -78,8 +78,8 @@ public:
};
Q_GLOBAL_STATIC(QSystemLocaleSingleton, QSystemLocale_globalSystemLocale)
-static QLocalePrivate *system_lp = 0;
-Q_GLOBAL_STATIC(QLocalePrivate, globalLocalePrivate)
+static QLocaleData *system_data = 0;
+Q_GLOBAL_STATIC(QLocaleData, globalLocaleData)
#endif
#ifdef QT_USE_ICU
@@ -157,12 +157,12 @@ QLocale::Country QLocalePrivate::codeToCountry(const QString &code)
QString QLocalePrivate::languageCode() const
{
- if (m_language_id == QLocale::AnyLanguage)
+ if (m_data->m_language_id == QLocale::AnyLanguage)
return QString();
- if (m_language_id == QLocale::C)
+ if (m_data->m_language_id == QLocale::C)
return QLatin1String("C");
- const unsigned char *c = language_code_list + 3*(uint(m_language_id));
+ const unsigned char *c = language_code_list + 3*(uint(m_data->m_language_id));
QString code(c[2] == 0 ? 2 : 3, Qt::Uninitialized);
@@ -176,18 +176,18 @@ QString QLocalePrivate::languageCode() const
QString QLocalePrivate::scriptCode() const
{
- if (m_script_id == QLocale::AnyScript || m_script_id > QLocale::LastScript)
+ if (m_data->m_script_id == QLocale::AnyScript || m_data->m_script_id > QLocale::LastScript)
return QString();
- const unsigned char *c = script_code_list + 4*(uint(m_script_id));
+ const unsigned char *c = script_code_list + 4*(uint(m_data->m_script_id));
return QString::fromLatin1((const char *)c, 4);
}
QString QLocalePrivate::countryCode() const
{
- if (m_country_id == QLocale::AnyCountry)
+ if (m_data->m_country_id == QLocale::AnyCountry)
return QString();
- const unsigned char *c = country_code_list + 3*(uint(m_country_id));
+ const unsigned char *c = country_code_list + 3*(uint(m_data->m_country_id));
QString code(c[2] == 0 ? 2 : 3, Qt::Uninitialized);
@@ -201,15 +201,15 @@ QString QLocalePrivate::countryCode() const
QString QLocalePrivate::bcp47Name() const
{
- if (m_language_id == QLocale::AnyLanguage)
+ if (m_data->m_language_id == QLocale::AnyLanguage)
return QString();
- if (m_language_id == QLocale::C)
+ if (m_data->m_language_id == QLocale::C)
return QLatin1String("C");
- const unsigned char *lang = language_code_list + 3*(uint(m_language_id));
+ const unsigned char *lang = language_code_list + 3*(uint(m_data->m_language_id));
const unsigned char *script =
- (m_script_id != QLocale::AnyScript ? script_code_list + 4*(uint(m_script_id)) : 0);
+ (m_data->m_script_id != QLocale::AnyScript ? script_code_list + 4*(uint(m_data->m_script_id)) : 0);
const unsigned char *country =
- (m_country_id != QLocale::AnyCountry ? country_code_list + 3*(uint(m_country_id)) : 0);
+ (m_data->m_country_id != QLocale::AnyCountry ? country_code_list + 3*(uint(m_data->m_country_id)) : 0);
char len = (lang[2] != 0 ? 3 : 2) + (script ? 4+1 : 0) + (country ? (country[2] != 0 ? 3 : 2)+1 : 0);
QString name(len, Qt::Uninitialized);
QChar *uc = name.data();
@@ -234,7 +234,7 @@ QString QLocalePrivate::bcp47Name() const
return name;
}
-const QLocalePrivate *QLocalePrivate::findLocale(QLocale::Language language, QLocale::Script script, QLocale::Country country)
+const QLocaleData *QLocaleData::findLocaleData(QLocale::Language language, QLocale::Script script, QLocale::Country country)
{
const unsigned language_id = language;
const unsigned script_id = script;
@@ -242,33 +242,33 @@ const QLocalePrivate *QLocalePrivate::findLocale(QLocale::Language language, QLo
uint idx = locale_index[language_id];
- const QLocalePrivate *d = locale_data + idx;
+ const QLocaleData *data = locale_data + idx;
if (idx == 0) // default language has no associated country
- return d;
+ return data;
if (script == QLocale::AnyScript && country == QLocale::AnyCountry)
- return d;
+ return data;
- Q_ASSERT(d->languageId() == language_id);
+ Q_ASSERT(data->m_language_id == language_id);
if (country == QLocale::AnyCountry) {
- while (d->m_language_id == language_id && d->m_script_id != script_id)
- ++d;
- if (d->m_language_id == language_id && d->m_script_id == script_id)
- return d;
+ while (data->m_language_id == language_id && data->m_script_id != script_id)
+ ++data;
+ if (data->m_language_id == language_id && data->m_script_id == script_id)
+ return data;
} else if (script == QLocale::AnyScript) {
- while (d->m_language_id == language_id) {
- if (d->m_script_id == script_id && d->m_country_id == country_id)
- return d;
- ++d;
+ while (data->m_language_id == language_id) {
+ if (data->m_script_id == script_id && data->m_country_id == country_id)
+ return data;
+ ++data;
}
} else {
// both script and country are explicitly specified
- while (d->m_language_id == language_id) {
- if (d->m_script_id == script_id && d->m_country_id == country_id)
- return d;
- ++d;
+ while (data->m_language_id == language_id) {
+ if (data->m_script_id == script_id && data->m_country_id == country_id)
+ return data;
+ ++data;
}
}
@@ -370,14 +370,14 @@ void QLocalePrivate::getLangAndCountry(const QString &name, QLocale::Language &l
cntry = QLocalePrivate::codeToCountry(cntry_code);
}
-static const QLocalePrivate *findLocale(const QString &name)
+static const QLocaleData *findLocaleData(const QString &name)
{
QLocale::Language lang;
QLocale::Script script;
QLocale::Country cntry;
QLocalePrivate::getLangAndCountry(name, lang, script, cntry);
- return QLocalePrivate::findLocale(lang, script, cntry);
+ return QLocaleData::findLocaleData(lang, script, cntry);
}
QString qt_readEscapedFormatString(const QString &format, int *idx)
@@ -423,7 +423,7 @@ int qt_repeatCount(const QString &s, int i)
return j - i;
}
-static const QLocalePrivate *default_lp = 0;
+static const QLocaleData *default_data = 0;
static uint default_number_options = 0;
#ifndef QT_NO_SYSTEMLOCALE
@@ -443,8 +443,8 @@ QSystemLocale::QSystemLocale()
delete _systemLocale;
_systemLocale = this;
- if (system_lp)
- system_lp->m_language_id = 0;
+ if (system_data)
+ system_data->m_language_id = 0;
}
/*! \internal */
@@ -459,8 +459,8 @@ QSystemLocale::~QSystemLocale()
if (_systemLocale == this) {
_systemLocale = 0;
- if (system_lp)
- system_lp->m_language_id = 0;
+ if (system_data)
+ system_data->m_language_id = 0;
}
}
@@ -474,74 +474,74 @@ static const QSystemLocale *systemLocale()
void QLocalePrivate::updateSystemPrivate()
{
const QSystemLocale *sys_locale = systemLocale();
- if (!system_lp)
- system_lp = globalLocalePrivate();
+ if (!system_data)
+ system_data = globalLocaleData();
// tell the object that the system locale has changed.
sys_locale->query(QSystemLocale::LocaleChanged, QVariant());
- *system_lp = *sys_locale->fallbackLocale().d();
+ *system_data = *sys_locale->fallbackLocale().d->m_data;
QVariant res = sys_locale->query(QSystemLocale::LanguageId, QVariant());
if (!res.isNull()) {
- system_lp->m_language_id = res.toInt();
- system_lp->m_script_id = QLocale::AnyScript; // default for compatibility
+ system_data->m_language_id = res.toInt();
+ system_data->m_script_id = QLocale::AnyScript; // default for compatibility
}
res = sys_locale->query(QSystemLocale::CountryId, QVariant());
if (!res.isNull()) {
- system_lp->m_country_id = res.toInt();
- system_lp->m_script_id = QLocale::AnyScript; // default for compatibility
+ system_data->m_country_id = res.toInt();
+ system_data->m_script_id = QLocale::AnyScript; // default for compatibility
}
res = sys_locale->query(QSystemLocale::ScriptId, QVariant());
if (!res.isNull())
- system_lp->m_script_id = res.toInt();
+ system_data->m_script_id = res.toInt();
res = sys_locale->query(QSystemLocale::DecimalPoint, QVariant());
if (!res.isNull())
- system_lp->m_decimal = res.toString().at(0).unicode();
+ system_data->m_decimal = res.toString().at(0).unicode();
res = sys_locale->query(QSystemLocale::GroupSeparator, QVariant());
if (!res.isNull())
- system_lp->m_group = res.toString().at(0).unicode();
+ system_data->m_group = res.toString().at(0).unicode();
res = sys_locale->query(QSystemLocale::ZeroDigit, QVariant());
if (!res.isNull())
- system_lp->m_zero = res.toString().at(0).unicode();
+ system_data->m_zero = res.toString().at(0).unicode();
res = sys_locale->query(QSystemLocale::NegativeSign, QVariant());
if (!res.isNull())
- system_lp->m_minus = res.toString().at(0).unicode();
+ system_data->m_minus = res.toString().at(0).unicode();
res = sys_locale->query(QSystemLocale::PositiveSign, QVariant());
if (!res.isNull())
- system_lp->m_plus = res.toString().at(0).unicode();
+ system_data->m_plus = res.toString().at(0).unicode();
#ifdef QT_USE_ICU
- if (!default_lp)
- qt_initIcu(system_lp->bcp47Name());
+ if (!default_data)
+ qt_initIcu(sys_locale->fallbackLocale().bcp47Name());
#endif
}
#endif
-static const QLocalePrivate *systemPrivate()
+static const QLocaleData *systemData()
{
#ifndef QT_NO_SYSTEMLOCALE
// copy over the information from the fallback locale and modify
- if (!system_lp || system_lp->m_language_id == 0)
+ if (!system_data || system_data->m_language_id == 0)
QLocalePrivate::updateSystemPrivate();
- return system_lp;
+ return system_data;
#else
return locale_data;
#endif
}
-static const QLocalePrivate *defaultPrivate()
+static const QLocaleData *defaultData()
{
- if (!default_lp)
- default_lp = systemPrivate();
- return default_lp;
+ if (!default_data)
+ default_data = systemData();
+ return default_data;
}
static QString getLocaleListData(const ushort *data, int size, int index)
@@ -585,14 +585,14 @@ QDataStream &operator>>(QDataStream &ds, QLocale &l)
#endif // QT_NO_DATASTREAM
-static const int locale_data_size = sizeof(locale_data)/sizeof(QLocalePrivate) - 1;
+static const int locale_data_size = sizeof(locale_data)/sizeof(QLocaleData) - 1;
-static const QLocalePrivate *dataPointerHelper(quint16 index)
+static const QLocaleData *dataPointerHelper(quint16 index)
{
#ifndef QT_NO_SYSTEMLOCALE
Q_ASSERT(index <= locale_data_size);
if (index == locale_data_size)
- return system_lp;
+ return system_data;
#else
Q_ASSERT(index < locale_data_size);
#endif
@@ -600,12 +600,12 @@ static const QLocalePrivate *dataPointerHelper(quint16 index)
return &locale_data[index];
}
-static quint16 localePrivateIndex(const QLocalePrivate *p)
+static quint16 localeDataIndex(const QLocaleData *p)
{
#ifndef QT_NO_SYSTEMLOCALE
Q_ASSERT((p >= locale_data && p - locale_data < locale_data_size)
- || (p != 0 && p == system_lp));
- quint16 index = p == system_lp ? locale_data_size : p - locale_data;
+ || (p != 0 && p == system_data));
+ quint16 index = p == system_data ? locale_data_size : p - locale_data;
#else
Q_ASSERT(p >= locale_data && p - locale_data < locale_data_size);
quint16 index = p - locale_data;
@@ -644,10 +644,11 @@ static quint16 localePrivateIndex(const QLocalePrivate *p)
*/
QLocale::QLocale(const QString &name)
- : v(0)
+ : d(new QLocalePrivate())
{
- p.numberOptions = 0;
- p.index = localePrivateIndex(findLocale(name));
+ d->m_numberOptions = 0;
+ d->m_index = localeDataIndex(findLocaleData(name));
+ d->m_data = dataPointerHelper(d->m_index);
}
/*!
@@ -659,10 +660,11 @@ QLocale::QLocale(const QString &name)
*/
QLocale::QLocale()
- : v(0)
+ : d(new QLocalePrivate())
{
- p.numberOptions = default_number_options;
- p.index = localePrivateIndex(defaultPrivate());
+ d->m_numberOptions = default_number_options;
+ d->m_index = localeDataIndex(defaultData());
+ d->m_data = dataPointerHelper(d->m_index);
}
/*!
@@ -681,22 +683,23 @@ QLocale::QLocale()
The language and country that are actually used can be queried
using language() and country().
- \sa setDefault() language() country()
+ \sa setDefault(), language(), country()
*/
QLocale::QLocale(Language language, Country country)
- : v(0)
+ : d(new QLocalePrivate())
{
- const QLocalePrivate *d = QLocalePrivate::findLocale(language, QLocale::AnyScript, country);
+ const QLocaleData *data = QLocaleData::findLocaleData(language, QLocale::AnyScript, country);
// If not found, should default to system
- if (d->languageId() == QLocale::C && language != QLocale::C) {
- p.numberOptions = default_number_options;
- p.index = localePrivateIndex(defaultPrivate());
+ if (data->m_language_id == QLocale::C && language != QLocale::C) {
+ d->m_numberOptions = default_number_options;
+ d->m_index = localeDataIndex(defaultData());
} else {
- p.numberOptions = 0;
- p.index = localePrivateIndex(d);
+ d->m_numberOptions = 0;
+ d->m_index = localeDataIndex(data);
}
+ d->m_data = dataPointerHelper(d->m_index);
}
\
/*!
@@ -720,22 +723,23 @@ QLocale::QLocale(Language language, Country country)
The language, script and country that are actually used can be queried
using language(), script() and country().
- \sa setDefault() language() script() country()
+ \sa setDefault(), language(), script(), country()
*/
QLocale::QLocale(Language language, Script script, Country country)
- : v(0)
+ : d(new QLocalePrivate())
{
- const QLocalePrivate *d = QLocalePrivate::findLocale(language, script, country);
+ const QLocaleData *data = QLocaleData::findLocaleData(language, script, country);
// If not found, should default to system
- if (d->languageId() == QLocale::C && language != QLocale::C) {
- p.numberOptions = default_number_options;
- p.index = localePrivateIndex(defaultPrivate());
+ if (data->m_language_id == QLocale::C && language != QLocale::C) {
+ d->m_numberOptions = default_number_options;
+ d->m_index = localeDataIndex(defaultData());
} else {
- p.numberOptions = 0;
- p.index = localePrivateIndex(d);
+ d->m_numberOptions = 0;
+ d->m_index = localeDataIndex(data);
}
+ d->m_data = dataPointerHelper(d->m_index);
}
/*!
@@ -744,12 +748,15 @@ QLocale::QLocale(Language language, Script script, Country country)
QLocale::QLocale(const QLocale &other)
{
- v = other.v;
+ d = other.d;
}
-const QLocalePrivate *QLocale::d() const
+/*!
+ Destructor
+*/
+
+QLocale::~QLocale()
{
- return dataPointerHelper(p.index);
}
/*!
@@ -759,18 +766,18 @@ const QLocalePrivate *QLocale::d() const
QLocale &QLocale::operator=(const QLocale &other)
{
- v = other.v;
+ d = other.d;
return *this;
}
bool QLocale::operator==(const QLocale &other) const
{
- return d() == other.d() && numberOptions() == other.numberOptions();
+ return d->m_data == other.d->m_data && d->m_numberOptions == other.d->m_numberOptions;
}
bool QLocale::operator!=(const QLocale &other) const
{
- return d() != other.d() || numberOptions() != other.numberOptions();
+ return d->m_data != other.d->m_data || d->m_numberOptions != other.d->m_numberOptions;
}
/*!
@@ -781,7 +788,7 @@ bool QLocale::operator!=(const QLocale &other) const
*/
void QLocale::setNumberOptions(NumberOptions options)
{
- p.numberOptions = options;
+ d->m_numberOptions = options;
}
/*!
@@ -794,7 +801,7 @@ void QLocale::setNumberOptions(NumberOptions options)
*/
QLocale::NumberOptions QLocale::numberOptions() const
{
- return static_cast<NumberOption>(p.numberOptions);
+ return static_cast<NumberOption>(d->m_numberOptions);
}
/*!
@@ -816,7 +823,7 @@ QString QLocale::quoteString(const QString &str, QuotationStyle style) const
QString QLocale::quoteString(const QStringRef &str, QuotationStyle style) const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d() == systemPrivate()) {
+ if (d->m_data == systemData()) {
QVariant res;
if (style == QLocale::AlternateQuotation)
res = systemLocale()->query(QSystemLocale::StringToAlternateQuotation, QVariant::fromValue(str));
@@ -828,9 +835,9 @@ QString QLocale::quoteString(const QStringRef &str, QuotationStyle style) const
#endif
if (style == QLocale::StandardQuotation)
- return QChar(d()->m_quotation_start) % str % QChar(d()->m_quotation_end);
+ return QChar(d->m_data->m_quotation_start) % str % QChar(d->m_data->m_quotation_end);
else
- return QChar(d()->m_alternate_quotation_start) % str % QChar(d()->m_alternate_quotation_end);
+ return QChar(d->m_data->m_alternate_quotation_start) % str % QChar(d->m_data->m_alternate_quotation_end);
}
/*!
@@ -842,7 +849,7 @@ QString QLocale::quoteString(const QStringRef &str, QuotationStyle style) const
QString QLocale::createSeparatedList(const QStringList &list) const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d() == systemPrivate()) {
+ if (d->m_data == systemData()) {
QVariant res;
res = systemLocale()->query(QSystemLocale::ListToSeparatedString, QVariant::fromValue(list));
@@ -855,12 +862,12 @@ QString QLocale::createSeparatedList(const QStringList &list) const
if (size == 1) {
return list.at(0);
} else if (size == 2) {
- QString format = getLocaleData(list_pattern_part_data + d()->m_list_pattern_part_two_idx, d()->m_list_pattern_part_two_size);
+ QString format = getLocaleData(list_pattern_part_data + d->m_data->m_list_pattern_part_two_idx, d->m_data->m_list_pattern_part_two_size);
return format.arg(list.at(0), list.at(1));
} else if (size > 2) {
- QString formatStart = getLocaleData(list_pattern_part_data + d()->m_list_pattern_part_start_idx, d()->m_list_pattern_part_start_size);
- QString formatMid = getLocaleData(list_pattern_part_data + d()->m_list_pattern_part_mid_idx, d()->m_list_pattern_part_mid_size);
- QString formatEnd = getLocaleData(list_pattern_part_data + d()->m_list_pattern_part_end_idx, d()->m_list_pattern_part_end_size);
+ QString formatStart = getLocaleData(list_pattern_part_data + d->m_data->m_list_pattern_part_start_idx, d->m_data->m_list_pattern_part_start_size);
+ QString formatMid = getLocaleData(list_pattern_part_data + d->m_data->m_list_pattern_part_mid_idx, d->m_data->m_list_pattern_part_mid_size);
+ QString formatEnd = getLocaleData(list_pattern_part_data + d->m_data->m_list_pattern_part_end_idx, d->m_data->m_list_pattern_part_end_size);
QString result = formatStart.arg(list.at(0), list.at(1));
for (int i = 2; i < size - 1; ++i)
result = formatMid.arg(result, list.at(i));
@@ -883,12 +890,12 @@ QString QLocale::createSeparatedList(const QStringList &list) const
should be set at application startup, before any non-GUI threads
are created.
- \sa system() c()
+ \sa system(), c()
*/
void QLocale::setDefault(const QLocale &locale)
{
- default_lp = locale.d();
+ default_data = locale.d->m_data;
default_number_options = locale.numberOptions();
#ifdef QT_USE_ICU
@@ -903,7 +910,7 @@ void QLocale::setDefault(const QLocale &locale)
*/
QLocale::Language QLocale::language() const
{
- return Language(d()->languageId());
+ return Language(d->languageId());
}
/*!
@@ -915,7 +922,7 @@ QLocale::Language QLocale::language() const
*/
QLocale::Script QLocale::script() const
{
- return Script(d()->m_script_id);
+ return Script(d->m_data->m_script_id);
}
/*!
@@ -925,7 +932,7 @@ QLocale::Script QLocale::script() const
*/
QLocale::Country QLocale::country() const
{
- return Country(d()->countryId());
+ return Country(d->countryId());
}
/*!
@@ -945,7 +952,7 @@ QString QLocale::name() const
{
Language l = language();
- QString result = d()->languageCode();
+ QString result = d->languageCode();
if (l == C)
return result;
@@ -955,7 +962,7 @@ QString QLocale::name() const
return result;
result.append(QLatin1Char('_'));
- result.append(d()->countryCode());
+ result.append(d->countryCode());
return result;
}
@@ -976,7 +983,7 @@ QString QLocale::name() const
*/
QString QLocale::bcp47Name() const
{
- return d()->bcp47Name();
+ return d->bcp47Name();
}
/*!
@@ -1132,11 +1139,11 @@ uint QLocale::toUInt(const QString &s, bool *ok) const
qlonglong QLocale::toLongLong(const QString &s, bool *ok) const
{
QLocalePrivate::GroupSeparatorMode mode
- = p.numberOptions & RejectGroupSeparator
+ = d->m_numberOptions & RejectGroupSeparator
? QLocalePrivate::FailOnGroupSeparators
: QLocalePrivate::ParseGroupSeparators;
- return d()->stringToLongLong(s, 10, ok, mode);
+ return d->stringToLongLong(s, 10, ok, mode);
}
/*!
@@ -1156,11 +1163,11 @@ qlonglong QLocale::toLongLong(const QString &s, bool *ok) const
qulonglong QLocale::toULongLong(const QString &s, bool *ok) const
{
QLocalePrivate::GroupSeparatorMode mode
- = p.numberOptions & RejectGroupSeparator
+ = d->m_numberOptions & RejectGroupSeparator
? QLocalePrivate::FailOnGroupSeparators
: QLocalePrivate::ParseGroupSeparators;
- return d()->stringToUnsLongLong(s, 10, ok, mode);
+ return d->stringToUnsLongLong(s, 10, ok, mode);
}
/*!
@@ -1202,7 +1209,7 @@ float QLocale::toFloat(const QString &s, bool *ok) const
the "C" locale if the string cannot be interpreted in this
locale.
- \snippet doc/src/snippets/code/src_corelib_tools_qlocale.cpp 3
+ \snippet code/src_corelib_tools_qlocale.cpp 3
Notice that the last conversion returns 1234.0, because '.' is the
thousands group separator in the German locale.
@@ -1215,11 +1222,11 @@ float QLocale::toFloat(const QString &s, bool *ok) const
double QLocale::toDouble(const QString &s, bool *ok) const
{
QLocalePrivate::GroupSeparatorMode mode
- = p.numberOptions & RejectGroupSeparator
+ = d->m_numberOptions & RejectGroupSeparator
? QLocalePrivate::FailOnGroupSeparators
: QLocalePrivate::ParseGroupSeparators;
- return d()->stringToDouble(s, ok, mode);
+ return d->stringToDouble(s, ok, mode);
}
/*!
@@ -1230,11 +1237,11 @@ double QLocale::toDouble(const QString &s, bool *ok) const
QString QLocale::toString(qlonglong i) const
{
- int flags = p.numberOptions & OmitGroupSeparator
+ int flags = d->m_numberOptions & OmitGroupSeparator
? 0
: QLocalePrivate::ThousandsGroup;
- return d()->longLongToString(i, -1, 10, -1, flags);
+ return d->longLongToString(i, -1, 10, -1, flags);
}
/*!
@@ -1245,11 +1252,11 @@ QString QLocale::toString(qlonglong i) const
QString QLocale::toString(qulonglong i) const
{
- int flags = p.numberOptions & OmitGroupSeparator
+ int flags = d->m_numberOptions & OmitGroupSeparator
? 0
: QLocalePrivate::ThousandsGroup;
- return d()->unsLongLongToString(i, -1, 10, -1, flags);
+ return d->unsLongLongToString(i, -1, 10, -1, flags);
}
/*!
@@ -1260,7 +1267,7 @@ QString QLocale::toString(qulonglong i) const
QString QLocale::toString(const QDate &date, const QString &format) const
{
- return d()->dateTimeToString(format, &date, 0, this);
+ return d->dateTimeToString(format, &date, 0, this);
}
/*!
@@ -1274,7 +1281,7 @@ QString QLocale::toString(const QDate &date, FormatType format) const
return QString();
#ifndef QT_NO_SYSTEMLOCALE
- if (d() == systemPrivate()) {
+ if (d->m_data == systemData()) {
QVariant res = systemLocale()->query(format == LongFormat
? QSystemLocale::DateToStringLong : QSystemLocale::DateToStringShort,
date);
@@ -1338,7 +1345,7 @@ static QString timeZone()
*/
QString QLocale::toString(const QTime &time, const QString &format) const
{
- return d()->dateTimeToString(format, 0, &time, this);
+ return d->dateTimeToString(format, 0, &time, this);
}
/*!
@@ -1353,7 +1360,7 @@ QString QLocale::toString(const QDateTime &dateTime, const QString &format) cons
{
const QDate dt = dateTime.date();
const QTime tm = dateTime.time();
- return d()->dateTimeToString(format, &dt, &tm, this);
+ return d->dateTimeToString(format, &dt, &tm, this);
}
/*!
@@ -1369,7 +1376,7 @@ QString QLocale::toString(const QDateTime &dateTime, FormatType format) const
return QString();
#ifndef QT_NO_SYSTEMLOCALE
- if (d() == systemPrivate()) {
+ if (d->m_data == systemData()) {
QVariant res = systemLocale()->query(format == LongFormat
? QSystemLocale::DateTimeToStringLong
: QSystemLocale::DateTimeToStringShort,
@@ -1395,7 +1402,7 @@ QString QLocale::toString(const QTime &time, FormatType format) const
return QString();
#ifndef QT_NO_SYSTEMLOCALE
- if (d() == systemPrivate()) {
+ if (d->m_data == systemData()) {
QVariant res = systemLocale()->query(format == LongFormat
? QSystemLocale::TimeToStringLong : QSystemLocale::TimeToStringShort,
time);
@@ -1422,7 +1429,7 @@ QString QLocale::toString(const QTime &time, FormatType format) const
QString QLocale::dateFormat(FormatType format) const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d() == systemPrivate()) {
+ if (d->m_data == systemData()) {
QVariant res = systemLocale()->query(format == LongFormat
? QSystemLocale::DateFormatLong : QSystemLocale::DateFormatShort,
QVariant());
@@ -1434,12 +1441,12 @@ QString QLocale::dateFormat(FormatType format) const
quint32 idx, size;
switch (format) {
case LongFormat:
- idx = d()->m_long_date_format_idx;
- size = d()->m_long_date_format_size;
+ idx = d->m_data->m_long_date_format_idx;
+ size = d->m_data->m_long_date_format_size;
break;
default:
- idx = d()->m_short_date_format_idx;
- size = d()->m_short_date_format_size;
+ idx = d->m_data->m_short_date_format_idx;
+ size = d->m_data->m_short_date_format_size;
break;
}
return getLocaleData(date_format_data + idx, size);
@@ -1459,7 +1466,7 @@ QString QLocale::dateFormat(FormatType format) const
QString QLocale::timeFormat(FormatType format) const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d() == systemPrivate()) {
+ if (d->m_data == systemData()) {
QVariant res = systemLocale()->query(format == LongFormat
? QSystemLocale::TimeFormatLong : QSystemLocale::TimeFormatShort,
QVariant());
@@ -1471,12 +1478,12 @@ QString QLocale::timeFormat(FormatType format) const
quint32 idx, size;
switch (format) {
case LongFormat:
- idx = d()->m_long_time_format_idx;
- size = d()->m_long_time_format_size;
+ idx = d->m_data->m_long_time_format_idx;
+ size = d->m_data->m_long_time_format_size;
break;
default:
- idx = d()->m_short_time_format_idx;
- size = d()->m_short_time_format_size;
+ idx = d->m_data->m_short_time_format_idx;
+ size = d->m_data->m_short_time_format_size;
break;
}
return getLocaleData(time_format_data + idx, size);
@@ -1496,7 +1503,7 @@ QString QLocale::timeFormat(FormatType format) const
QString QLocale::dateTimeFormat(FormatType format) const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d() == systemPrivate()) {
+ if (d->m_data == systemData()) {
QVariant res = systemLocale()->query(format == LongFormat
? QSystemLocale::DateTimeFormatLong
: QSystemLocale::DateTimeFormatShort,
@@ -1664,7 +1671,7 @@ QDateTime QLocale::toDateTime(const QString &string, const QString &format) cons
*/
QChar QLocale::decimalPoint() const
{
- return d()->decimal();
+ return d->decimal();
}
/*!
@@ -1674,7 +1681,7 @@ QChar QLocale::decimalPoint() const
*/
QChar QLocale::groupSeparator() const
{
- return d()->group();
+ return d->group();
}
/*!
@@ -1684,7 +1691,7 @@ QChar QLocale::groupSeparator() const
*/
QChar QLocale::percent() const
{
- return d()->percent();
+ return d->percent();
}
/*!
@@ -1694,7 +1701,7 @@ QChar QLocale::percent() const
*/
QChar QLocale::zeroDigit() const
{
- return d()->zero();
+ return d->zero();
}
/*!
@@ -1704,7 +1711,7 @@ QChar QLocale::zeroDigit() const
*/
QChar QLocale::negativeSign() const
{
- return d()->minus();
+ return d->minus();
}
/*!
@@ -1714,7 +1721,7 @@ QChar QLocale::negativeSign() const
*/
QChar QLocale::positiveSign() const
{
- return d()->plus();
+ return d->plus();
}
/*!
@@ -1724,7 +1731,7 @@ QChar QLocale::positiveSign() const
*/
QChar QLocale::exponential() const
{
- return d()->exponential();
+ return d->exponential();
}
static bool qIsUpper(char c)
@@ -1771,9 +1778,9 @@ QString QLocale::toString(double i, char f, int prec) const
break;
}
- if (!(p.numberOptions & OmitGroupSeparator))
+ if (!(d->m_numberOptions & OmitGroupSeparator))
flags |= QLocalePrivate::ThousandsGroup;
- return d()->doubleToString(i, prec, form, -1, flags);
+ return d->doubleToString(i, prec, form, -1, flags);
}
/*!
@@ -1796,7 +1803,8 @@ QString QLocale::toString(double i, char f, int prec) const
QLocale QLocale::system()
{
QLocale result(C);
- result.p.index = localePrivateIndex(systemPrivate());
+ result.d->m_index = localeDataIndex(systemData());
+ result.d->m_data = dataPointerHelper(result.d->m_index);
return result;
}
@@ -1819,17 +1827,18 @@ QList<QLocale> QLocale::matchingLocales(QLocale::Language language,
return QList<QLocale>();
QList<QLocale> result;
- const QLocalePrivate *d = locale_data;
+ const QLocaleData *data = locale_data;
if (language == QLocale::AnyLanguage && script == QLocale::AnyScript && country == QLocale::AnyCountry)
result.reserve(locale_data_size);
if (language != QLocale::C)
- d += locale_index[language];
- while ( (d != locale_data + locale_data_size)
- && (language == QLocale::AnyLanguage || d->m_language_id == uint(language))) {
+ data += locale_index[language];
+ while ( (data != locale_data + locale_data_size)
+ && (language == QLocale::AnyLanguage || data->m_language_id == uint(language))) {
QLocale locale(QLocale::C);
- locale.p.index = localePrivateIndex(d);
+ locale.d->m_index = localeDataIndex(data);
+ locale.d->m_data = dataPointerHelper(locale.d->m_index);
result.append(locale);
- ++d;
+ ++data;
}
return result;
}
@@ -1856,11 +1865,11 @@ QList<QLocale::Country> QLocale::countriesForLanguage(Language language)
return result;
}
- const QLocalePrivate *d = locale_data + idx;
+ const QLocaleData *data = locale_data + idx;
- while (d->languageId() == language_id) {
- result << static_cast<Country>(d->countryId());
- ++d;
+ while (data->m_language_id == language_id) {
+ result << static_cast<Country>(data->m_country_id);
+ ++data;
}
return result;
@@ -1880,7 +1889,7 @@ QString QLocale::monthName(int month, FormatType type) const
return QString();
#ifndef QT_NO_SYSTEMLOCALE
- if (d() == systemPrivate()) {
+ if (d->m_data == systemData()) {
QVariant res = systemLocale()->query(type == LongFormat
? QSystemLocale::MonthNameLong : QSystemLocale::MonthNameShort,
month);
@@ -1892,16 +1901,16 @@ QString QLocale::monthName(int month, FormatType type) const
quint32 idx, size;
switch (type) {
case QLocale::LongFormat:
- idx = d()->m_long_month_names_idx;
- size = d()->m_long_month_names_size;
+ idx = d->m_data->m_long_month_names_idx;
+ size = d->m_data->m_long_month_names_size;
break;
case QLocale::ShortFormat:
- idx = d()->m_short_month_names_idx;
- size = d()->m_short_month_names_size;
+ idx = d->m_data->m_short_month_names_idx;
+ size = d->m_data->m_short_month_names_size;
break;
case QLocale::NarrowFormat:
- idx = d()->m_narrow_month_names_idx;
- size = d()->m_narrow_month_names_size;
+ idx = d->m_data->m_narrow_month_names_idx;
+ size = d->m_data->m_narrow_month_names_size;
break;
default:
return QString();
@@ -1926,7 +1935,7 @@ QString QLocale::standaloneMonthName(int month, FormatType type) const
return QString();
#ifndef QT_NO_SYSTEMLOCALE
- if (d() == systemPrivate()) {
+ if (d->m_data == systemData()) {
QVariant res = systemLocale()->query(type == LongFormat
? QSystemLocale::MonthNameLong : QSystemLocale::MonthNameShort,
month);
@@ -1938,16 +1947,16 @@ QString QLocale::standaloneMonthName(int month, FormatType type) const
quint32 idx, size;
switch (type) {
case QLocale::LongFormat:
- idx = d()->m_standalone_long_month_names_idx;
- size = d()->m_standalone_long_month_names_size;
+ idx = d->m_data->m_standalone_long_month_names_idx;
+ size = d->m_data->m_standalone_long_month_names_size;
break;
case QLocale::ShortFormat:
- idx = d()->m_standalone_short_month_names_idx;
- size = d()->m_standalone_short_month_names_size;
+ idx = d->m_data->m_standalone_short_month_names_idx;
+ size = d->m_data->m_standalone_short_month_names_size;
break;
case QLocale::NarrowFormat:
- idx = d()->m_standalone_narrow_month_names_idx;
- size = d()->m_standalone_narrow_month_names_size;
+ idx = d->m_data->m_standalone_narrow_month_names_idx;
+ size = d->m_data->m_standalone_narrow_month_names_size;
break;
default:
return QString();
@@ -1973,7 +1982,7 @@ QString QLocale::dayName(int day, FormatType type) const
return QString();
#ifndef QT_NO_SYSTEMLOCALE
- if (d() == systemPrivate()) {
+ if (d->m_data == systemData()) {
QVariant res = systemLocale()->query(type == LongFormat
? QSystemLocale::DayNameLong : QSystemLocale::DayNameShort,
day);
@@ -1987,16 +1996,16 @@ QString QLocale::dayName(int day, FormatType type) const
quint32 idx, size;
switch (type) {
case QLocale::LongFormat:
- idx = d()->m_long_day_names_idx;
- size = d()->m_long_day_names_size;
+ idx = d->m_data->m_long_day_names_idx;
+ size = d->m_data->m_long_day_names_size;
break;
case QLocale::ShortFormat:
- idx = d()->m_short_day_names_idx;
- size = d()->m_short_day_names_size;
+ idx = d->m_data->m_short_day_names_idx;
+ size = d->m_data->m_short_day_names_size;
break;
case QLocale::NarrowFormat:
- idx = d()->m_narrow_day_names_idx;
- size = d()->m_narrow_day_names_size;
+ idx = d->m_data->m_narrow_day_names_idx;
+ size = d->m_data->m_narrow_day_names_size;
break;
default:
return QString();
@@ -2022,7 +2031,7 @@ QString QLocale::standaloneDayName(int day, FormatType type) const
return QString();
#ifndef QT_NO_SYSTEMLOCALE
- if (d() == systemPrivate()) {
+ if (d->m_data == systemData()) {
QVariant res = systemLocale()->query(type == LongFormat
? QSystemLocale::DayNameLong : QSystemLocale::DayNameShort,
day);
@@ -2036,16 +2045,16 @@ QString QLocale::standaloneDayName(int day, FormatType type) const
quint32 idx, size;
switch (type) {
case QLocale::LongFormat:
- idx = d()->m_standalone_long_day_names_idx;
- size = d()->m_standalone_long_day_names_size;
+ idx = d->m_data->m_standalone_long_day_names_idx;
+ size = d->m_data->m_standalone_long_day_names_size;
break;
case QLocale::ShortFormat:
- idx = d()->m_standalone_short_day_names_idx;
- size = d()->m_standalone_short_day_names_size;
+ idx = d->m_data->m_standalone_short_day_names_idx;
+ size = d->m_data->m_standalone_short_day_names_size;
break;
case QLocale::NarrowFormat:
- idx = d()->m_standalone_narrow_day_names_idx;
- size = d()->m_standalone_narrow_day_names_size;
+ idx = d->m_data->m_standalone_narrow_day_names_idx;
+ size = d->m_data->m_standalone_narrow_day_names_size;
break;
default:
return QString();
@@ -2064,20 +2073,20 @@ QString QLocale::standaloneDayName(int day, FormatType type) const
Qt::DayOfWeek QLocale::firstDayOfWeek() const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d() == systemPrivate()) {
+ if (d->m_data == systemData()) {
QVariant res = systemLocale()->query(QSystemLocale::FirstDayOfWeek, QVariant());
if (!res.isNull())
return static_cast<Qt::DayOfWeek>(res.toUInt());
}
#endif
- return static_cast<Qt::DayOfWeek>(d()->m_first_day_of_week);
+ return static_cast<Qt::DayOfWeek>(d->m_data->m_first_day_of_week);
}
QLocale::MeasurementSystem QLocalePrivate::measurementSystem() const
{
for (int i = 0; i < ImperialMeasurementSystemsCount; ++i) {
- if (ImperialMeasurementSystems[i].languageId == m_language_id
- && ImperialMeasurementSystems[i].countryId == m_country_id) {
+ if (ImperialMeasurementSystems[i].languageId == m_data->m_language_id
+ && ImperialMeasurementSystems[i].countryId == m_data->m_country_id) {
return ImperialMeasurementSystems[i].system;
}
}
@@ -2092,15 +2101,15 @@ QLocale::MeasurementSystem QLocalePrivate::measurementSystem() const
QList<Qt::DayOfWeek> QLocale::weekdays() const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d() == systemPrivate()) {
+ if (d->m_data == systemData()) {
QVariant res = systemLocale()->query(QSystemLocale::Weekdays, QVariant());
if (!res.isNull())
return static_cast<QList<Qt::DayOfWeek> >(res.value<QList<Qt::DayOfWeek> >());
}
#endif
QList<Qt::DayOfWeek> weekdays;
- quint16 weekendStart = d()->m_weekend_start;
- quint16 weekendEnd = d()->m_weekend_end;
+ quint16 weekendStart = d->m_data->m_weekend_start;
+ quint16 weekendEnd = d->m_data->m_weekend_end;
for (int day = Qt::Monday; day <= Qt::Sunday; day++) {
if ((weekendEnd >= weekendStart && (day < weekendStart || day > weekendEnd)) ||
(weekendEnd < weekendStart && (day > weekendEnd && day < weekendStart)))
@@ -2117,14 +2126,14 @@ QList<Qt::DayOfWeek> QLocale::weekdays() const
QLocale::MeasurementSystem QLocale::measurementSystem() const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d() == systemPrivate()) {
+ if (d->m_data == systemData()) {
QVariant res = systemLocale()->query(QSystemLocale::MeasurementSystem, QVariant());
if (!res.isNull())
return MeasurementSystem(res.toInt());
}
#endif
- return d()->measurementSystem();
+ return d->measurementSystem();
}
/*!
@@ -2193,13 +2202,13 @@ QString QLocale::toLower(const QString &str) const
QString QLocale::amText() const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d() == systemPrivate()) {
+ if (d->m_data == systemData()) {
QVariant res = systemLocale()->query(QSystemLocale::AMText, QVariant());
if (!res.isNull())
return res.toString();
}
#endif
- return getLocaleData(am_data + d()->m_am_idx, d()->m_am_size);
+ return getLocaleData(am_data + d->m_data->m_am_idx, d->m_data->m_am_size);
}
/*!
@@ -2213,13 +2222,13 @@ QString QLocale::amText() const
QString QLocale::pmText() const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d() == systemPrivate()) {
+ if (d->m_data == systemData()) {
QVariant res = systemLocale()->query(QSystemLocale::PMText, QVariant());
if (!res.isNull())
return res.toString();
}
#endif
- return getLocaleData(pm_data + d()->m_pm_idx, d()->m_pm_size);
+ return getLocaleData(pm_data + d->m_data->m_pm_idx, d->m_data->m_pm_size);
}
@@ -3098,7 +3107,7 @@ qulonglong QLocalePrivate::bytearrayToUnsLongLong(const char *num, int base, boo
QString QLocale::currencySymbol(QLocale::CurrencySymbolFormat format) const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d() == systemPrivate()) {
+ if (d->m_data == systemData()) {
QVariant res = systemLocale()->query(QSystemLocale::CurrencySymbol, format);
if (!res.isNull())
return res.toString();
@@ -3107,20 +3116,20 @@ QString QLocale::currencySymbol(QLocale::CurrencySymbolFormat format) const
quint32 idx, size;
switch (format) {
case CurrencySymbol:
- idx = d()->m_currency_symbol_idx;
- size = d()->m_currency_symbol_size;
+ idx = d->m_data->m_currency_symbol_idx;
+ size = d->m_data->m_currency_symbol_size;
return getLocaleData(currency_symbol_data + idx, size);
case CurrencyDisplayName:
- idx = d()->m_currency_display_name_idx;
- size = d()->m_currency_display_name_size;
+ idx = d->m_data->m_currency_display_name_idx;
+ size = d->m_data->m_currency_display_name_size;
return getLocaleListData(currency_display_name_data + idx, size, 0);
case CurrencyIsoCode: {
int len = 0;
- const QLocalePrivate *d = this->d();
+ const QLocaleData *data = this->d->m_data;
for (; len < 3; ++len)
- if (!d->m_currency_iso_code[len])
+ if (!data->m_currency_iso_code[len])
break;
- return len ? QString::fromLatin1(d->m_currency_iso_code, len) : QString();
+ return len ? QString::fromLatin1(data->m_currency_iso_code, len) : QString();
}
}
return QString();
@@ -3137,19 +3146,19 @@ QString QLocale::currencySymbol(QLocale::CurrencySymbolFormat format) const
QString QLocale::toCurrencyString(qlonglong value, const QString &symbol) const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d() == systemPrivate()) {
+ if (d->m_data == systemData()) {
QSystemLocale::CurrencyToStringArgument arg(value, symbol);
QVariant res = systemLocale()->query(QSystemLocale::CurrencyToString, QVariant::fromValue(arg));
if (!res.isNull())
return res.toString();
}
#endif
- const QLocalePrivate *d = this->d();
- quint8 idx = d->m_currency_format_idx;
- quint8 size = d->m_currency_format_size;
- if (d->m_currency_negative_format_size && value < 0) {
- idx = d->m_currency_negative_format_idx;
- size = d->m_currency_negative_format_size;
+ const QLocalePrivate *d = this->d;
+ quint8 idx = d->m_data->m_currency_format_idx;
+ quint8 size = d->m_data->m_currency_format_size;
+ if (d->m_data->m_currency_negative_format_size && value < 0) {
+ idx = d->m_data->m_currency_negative_format_idx;
+ size = d->m_data->m_currency_negative_format_size;
value = -value;
}
QString str = d->longLongToString(value);
@@ -3167,16 +3176,16 @@ QString QLocale::toCurrencyString(qlonglong value, const QString &symbol) const
QString QLocale::toCurrencyString(qulonglong value, const QString &symbol) const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d() == systemPrivate()) {
+ if (d->m_data == systemData()) {
QSystemLocale::CurrencyToStringArgument arg(value, symbol);
QVariant res = systemLocale()->query(QSystemLocale::CurrencyToString, QVariant::fromValue(arg));
if (!res.isNull())
return res.toString();
}
#endif
- const QLocalePrivate *d = this->d();
- quint8 idx = d->m_currency_format_idx;
- quint8 size = d->m_currency_format_size;
+ const QLocaleData *data = this->d->m_data;
+ quint8 idx = data->m_currency_format_idx;
+ quint8 size = data->m_currency_format_size;
QString str = d->unsLongLongToString(value);
QString sym = symbol.isNull() ? currencySymbol() : symbol;
if (sym.isEmpty())
@@ -3192,22 +3201,22 @@ QString QLocale::toCurrencyString(qulonglong value, const QString &symbol) const
QString QLocale::toCurrencyString(double value, const QString &symbol) const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d() == systemPrivate()) {
+ if (d->m_data == systemData()) {
QSystemLocale::CurrencyToStringArgument arg(value, symbol);
QVariant res = systemLocale()->query(QSystemLocale::CurrencyToString, QVariant::fromValue(arg));
if (!res.isNull())
return res.toString();
}
#endif
- const QLocalePrivate *d = this->d();
- quint8 idx = d->m_currency_format_idx;
- quint8 size = d->m_currency_format_size;
- if (d->m_currency_negative_format_size && value < 0) {
- idx = d->m_currency_negative_format_idx;
- size = d->m_currency_negative_format_size;
+ const QLocaleData *data = this->d->m_data;
+ quint8 idx = data->m_currency_format_idx;
+ quint8 size = data->m_currency_format_size;
+ if (data->m_currency_negative_format_size && value < 0) {
+ idx = data->m_currency_negative_format_idx;
+ size = data->m_currency_negative_format_size;
value = -value;
}
- QString str = d->doubleToString(value, d->m_currency_digits,
+ QString str = d->doubleToString(value, d->m_data->m_currency_digits,
QLocalePrivate::DFDecimal);
QString sym = symbol.isNull() ? currencySymbol() : symbol;
if (sym.isEmpty())
@@ -3235,7 +3244,7 @@ QString QLocale::toCurrencyString(double value, const QString &symbol) const
QStringList QLocale::uiLanguages() const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d() == systemPrivate()) {
+ if (d->m_data == systemData()) {
QVariant res = systemLocale()->query(QSystemLocale::UILanguages, QVariant());
if (!res.isNull()) {
QStringList result = res.toStringList();
@@ -3258,13 +3267,13 @@ QStringList QLocale::uiLanguages() const
QString QLocale::nativeLanguageName() const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d() == systemPrivate()) {
+ if (d->m_data == systemData()) {
QVariant res = systemLocale()->query(QSystemLocale::NativeLanguageName, QVariant());
if (!res.isNull())
return res.toString();
}
#endif
- return getLocaleData(endonyms_data + d()->m_language_endonym_idx, d()->m_language_endonym_size);
+ return getLocaleData(endonyms_data + d->m_data->m_language_endonym_idx, d->m_data->m_language_endonym_size);
}
/*!
@@ -3278,13 +3287,13 @@ QString QLocale::nativeLanguageName() const
QString QLocale::nativeCountryName() const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d() == systemPrivate()) {
+ if (d->m_data == systemData()) {
QVariant res = systemLocale()->query(QSystemLocale::NativeCountryName, QVariant());
if (!res.isNull())
return res.toString();
}
#endif
- return getLocaleData(endonyms_data + d()->m_country_endonym_idx, d()->m_country_endonym_size);
+ return getLocaleData(endonyms_data + d->m_data->m_country_endonym_idx, d->m_data->m_country_endonym_size);
}
#ifndef QT_NO_DEBUG_STREAM
diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h
index bdb5ae026c..a014b6b7b5 100644
--- a/src/corelib/tools/qlocale.h
+++ b/src/corelib/tools/qlocale.h
@@ -45,6 +45,7 @@
#include <QtCore/qvariant.h>
#include <QtCore/qstring.h>
#include <QtCore/qobjectdefs.h>
+#include <QtCore/qshareddata.h>
QT_BEGIN_HEADER
@@ -59,9 +60,8 @@ class QVariant;
class QTextStream;
class QTextStreamPrivate;
-class QLocale;
+class QLocalePrivate;
-struct QLocalePrivate;
class Q_CORE_EXPORT QLocale
{
Q_GADGET
@@ -590,6 +590,7 @@ public:
QLocale(Language language, Country country = AnyCountry);
QLocale(Language language, Script script, Country country);
QLocale(const QLocale &other);
+ ~QLocale();
QLocale &operator=(const QLocale &other);
@@ -700,20 +701,10 @@ public:
QString quoteString(const QStringRef &str, QuotationStyle style = StandardQuotation) const;
QString createSeparatedList(const QStringList &strl) const;
-//private: // this should be private, but can't be
- struct Data {
- quint16 index;
- quint16 numberOptions;
- };
+
private:
- friend struct QLocalePrivate;
- // ### We now use this field to pack an index into locale_data and NumberOptions.
- // ### Qt 5: change to a QLocaleData *d; uint numberOptions.
- union {
- void *v;
- Data p;
- };
- const QLocalePrivate *d() const;
+ friend class QLocalePrivate;
+ QSharedDataPointer<QLocalePrivate> d;
};
Q_DECLARE_TYPEINFO(QLocale, Q_MOVABLE_TYPE);
Q_DECLARE_OPERATORS_FOR_FLAGS(QLocale::NumberOptions)
diff --git a/src/corelib/tools/qlocale.qdoc b/src/corelib/tools/qlocale.qdoc
index 32822c2e6e..ed80984de3 100644
--- a/src/corelib/tools/qlocale.qdoc
+++ b/src/corelib/tools/qlocale.qdoc
@@ -42,7 +42,7 @@
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qlocale.cpp 0
+ \snippet code/src_corelib_tools_qlocale.cpp 0
QLocale supports the concept of a default locale, which is
determined from the system's locale settings at application
@@ -63,7 +63,7 @@
The following example illustrates how to use QLocale directly:
- \snippet doc/src/snippets/code/src_corelib_tools_qlocale.cpp 1
+ \snippet code/src_corelib_tools_qlocale.cpp 1
When a language/country pair is specified in the constructor, one
of three things can happen:
@@ -83,7 +83,7 @@
An alternative method for constructing a QLocale object is by
specifying the locale name.
- \snippet doc/src/snippets/code/src_corelib_tools_qlocale.cpp 2
+ \snippet code/src_corelib_tools_qlocale.cpp 2
This constructor converts the locale name to a language/country
pair; it does not use the system locale database.
@@ -662,7 +662,7 @@
will fail if they encounter group separators in their input. The default
is to accept numbers containing correctly placed group separators.
- \sa setNumberOptions() numberOptions()
+ \sa setNumberOptions(), numberOptions()
*/
/*!
diff --git a/src/corelib/tools/qlocale_data_p.h b/src/corelib/tools/qlocale_data_p.h
index aa63bb75ec..ffade8fcda 100644
--- a/src/corelib/tools/qlocale_data_p.h
+++ b/src/corelib/tools/qlocale_data_p.h
@@ -306,7 +306,7 @@ static const quint16 locale_index[] = {
0 // trailing 0
};
-static const QLocalePrivate locale_data[] = {
+static const QLocaleData locale_data[] = {
// lang script terr dec group list prcnt zero minus plus exp quotStart quotEnd altQuotStart altQuotEnd lpStart lpMid lpEnd lpTwo sDtFmt lDtFmt sTmFmt lTmFmt ssMonth slMonth sMonth lMonth sDays lDays am,len pm,len
{ 1, 0, 0, 46, 44, 59, 37, 48, 45, 43, 101, 34, 34, 39, 39, 0,6 , 0,6 , 0,6 , 0,6 , 0,10 , 10,17 , 0,8 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 158,27 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 99,14 , 0,2 , 0,2 , {0,0,0}, 0,0 , 0,7 , 0,4 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // C/AnyScript/AnyCountry
{ 3, 0, 69, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 35,18 , 18,7 , 25,12 , 185,48 , 233,111 , 134,24 , 185,48 , 233,111 , 134,24 , 113,28 , 141,55 , 85,14 , 113,28 , 141,55 , 85,14 , 2,2 , 2,2 , {69,84,66}, 0,2 , 7,24 , 4,4 , 4,0 , 0,6 , 6,10 , 2, 1, 6, 6, 7 }, // Afan/AnyScript/Ethiopia
diff --git a/src/corelib/tools/qlocale_p.h b/src/corelib/tools/qlocale_p.h
index 377a60881f..673135587b 100644
--- a/src/corelib/tools/qlocale_p.h
+++ b/src/corelib/tools/qlocale_p.h
@@ -126,20 +126,71 @@ private:
};
#endif
-struct Q_CORE_EXPORT QLocalePrivate
+struct QLocaleData
{
public:
- QChar decimal() const { return QChar(m_decimal); }
- QChar group() const { return QChar(m_group); }
- QChar list() const { return QChar(m_list); }
- QChar percent() const { return QChar(m_percent); }
- QChar zero() const { return QChar(m_zero); }
- QChar plus() const { return QChar(m_plus); }
- QChar minus() const { return QChar(m_minus); }
- QChar exponential() const { return QChar(m_exponential); }
-
- quint16 languageId() const { return m_language_id; }
- quint16 countryId() const { return m_country_id; }
+ static const QLocaleData *findLocaleData(QLocale::Language language,
+ QLocale::Script script,
+ QLocale::Country country);
+
+ quint16 m_language_id, m_script_id, m_country_id;
+
+ quint16 m_decimal, m_group, m_list, m_percent, m_zero, m_minus, m_plus, m_exponential;
+ quint16 m_quotation_start, m_quotation_end;
+ quint16 m_alternate_quotation_start, m_alternate_quotation_end;
+
+ quint16 m_list_pattern_part_start_idx, m_list_pattern_part_start_size;
+ quint16 m_list_pattern_part_mid_idx, m_list_pattern_part_mid_size;
+ quint16 m_list_pattern_part_end_idx, m_list_pattern_part_end_size;
+ quint16 m_list_pattern_part_two_idx, m_list_pattern_part_two_size;
+ quint16 m_short_date_format_idx, m_short_date_format_size;
+ quint16 m_long_date_format_idx, m_long_date_format_size;
+ quint16 m_short_time_format_idx, m_short_time_format_size;
+ quint16 m_long_time_format_idx, m_long_time_format_size;
+ quint16 m_standalone_short_month_names_idx, m_standalone_short_month_names_size;
+ quint16 m_standalone_long_month_names_idx, m_standalone_long_month_names_size;
+ quint16 m_standalone_narrow_month_names_idx, m_standalone_narrow_month_names_size;
+ quint16 m_short_month_names_idx, m_short_month_names_size;
+ quint16 m_long_month_names_idx, m_long_month_names_size;
+ quint16 m_narrow_month_names_idx, m_narrow_month_names_size;
+ quint16 m_standalone_short_day_names_idx, m_standalone_short_day_names_size;
+ quint16 m_standalone_long_day_names_idx, m_standalone_long_day_names_size;
+ quint16 m_standalone_narrow_day_names_idx, m_standalone_narrow_day_names_size;
+ quint16 m_short_day_names_idx, m_short_day_names_size;
+ quint16 m_long_day_names_idx, m_long_day_names_size;
+ quint16 m_narrow_day_names_idx, m_narrow_day_names_size;
+ quint16 m_am_idx, m_am_size;
+ quint16 m_pm_idx, m_pm_size;
+ char m_currency_iso_code[3];
+ quint16 m_currency_symbol_idx, m_currency_symbol_size;
+ quint16 m_currency_display_name_idx, m_currency_display_name_size;
+ quint8 m_currency_format_idx, m_currency_format_size;
+ quint8 m_currency_negative_format_idx, m_currency_negative_format_size;
+ quint16 m_language_endonym_idx, m_language_endonym_size;
+ quint16 m_country_endonym_idx, m_country_endonym_size;
+ quint16 m_currency_digits : 2;
+ quint16 m_currency_rounding : 3;
+ quint16 m_first_day_of_week : 3;
+ quint16 m_weekend_start : 3;
+ quint16 m_weekend_end : 3;
+};
+
+class Q_CORE_EXPORT QLocalePrivate : public QSharedData
+{
+public:
+ QLocalePrivate() : m_index(0), m_numberOptions(0), m_data(0) {}
+
+ QChar decimal() const { return QChar(m_data->m_decimal); }
+ QChar group() const { return QChar(m_data->m_group); }
+ QChar list() const { return QChar(m_data->m_list); }
+ QChar percent() const { return QChar(m_data->m_percent); }
+ QChar zero() const { return QChar(m_data->m_zero); }
+ QChar plus() const { return QChar(m_data->m_plus); }
+ QChar minus() const { return QChar(m_data->m_minus); }
+ QChar exponential() const { return QChar(m_data->m_exponential); }
+
+ quint16 languageId() const { return m_data->m_language_id; }
+ quint16 countryId() const { return m_data->m_country_id; }
QString bcp47Name() const;
@@ -152,10 +203,6 @@ public:
static QLocale::Country codeToCountry(const QString &code);
static void getLangAndCountry(const QString &name, QLocale::Language &lang,
QLocale::Script &script, QLocale::Country &cntry);
- static const QLocalePrivate *findLocale(QLocale::Language language,
- QLocale::Script script,
- QLocale::Country country);
-
QLocale::MeasurementSystem measurementSystem() const;
@@ -238,48 +285,11 @@ public:
QString dateTimeToString(const QString &format, const QDate *date, const QTime *time,
const QLocale *q) const;
- quint16 m_language_id, m_script_id, m_country_id;
-
- quint16 m_decimal, m_group, m_list, m_percent,
- m_zero, m_minus, m_plus, m_exponential;
- quint16 m_quotation_start, m_quotation_end;
- quint16 m_alternate_quotation_start, m_alternate_quotation_end;
-
- quint16 m_list_pattern_part_start_idx, m_list_pattern_part_start_size;
- quint16 m_list_pattern_part_mid_idx, m_list_pattern_part_mid_size;
- quint16 m_list_pattern_part_end_idx, m_list_pattern_part_end_size;
- quint16 m_list_pattern_part_two_idx, m_list_pattern_part_two_size;
- quint16 m_short_date_format_idx, m_short_date_format_size;
- quint16 m_long_date_format_idx, m_long_date_format_size;
- quint16 m_short_time_format_idx, m_short_time_format_size;
- quint16 m_long_time_format_idx, m_long_time_format_size;
- quint16 m_standalone_short_month_names_idx, m_standalone_short_month_names_size;
- quint16 m_standalone_long_month_names_idx, m_standalone_long_month_names_size;
- quint16 m_standalone_narrow_month_names_idx, m_standalone_narrow_month_names_size;
- quint16 m_short_month_names_idx, m_short_month_names_size;
- quint16 m_long_month_names_idx, m_long_month_names_size;
- quint16 m_narrow_month_names_idx, m_narrow_month_names_size;
- quint16 m_standalone_short_day_names_idx, m_standalone_short_day_names_size;
- quint16 m_standalone_long_day_names_idx, m_standalone_long_day_names_size;
- quint16 m_standalone_narrow_day_names_idx, m_standalone_narrow_day_names_size;
- quint16 m_short_day_names_idx, m_short_day_names_size;
- quint16 m_long_day_names_idx, m_long_day_names_size;
- quint16 m_narrow_day_names_idx, m_narrow_day_names_size;
- quint16 m_am_idx, m_am_size;
- quint16 m_pm_idx, m_pm_size;
- char m_currency_iso_code[3];
- quint16 m_currency_symbol_idx, m_currency_symbol_size;
- quint16 m_currency_display_name_idx, m_currency_display_name_size;
- quint8 m_currency_format_idx, m_currency_format_size;
- quint8 m_currency_negative_format_idx, m_currency_negative_format_size;
- quint16 m_language_endonym_idx, m_language_endonym_size;
- quint16 m_country_endonym_idx, m_country_endonym_size;
- quint16 m_currency_digits : 2;
- quint16 m_currency_rounding : 3;
- quint16 m_first_day_of_week : 3;
- quint16 m_weekend_start : 3;
- quint16 m_weekend_end : 3;
-
+private:
+ friend class QLocale;
+ quint16 m_index;
+ quint16 m_numberOptions;
+ const QLocaleData *m_data;
};
inline char QLocalePrivate::digitToCLocale(QChar in) const
diff --git a/src/corelib/tools/qlocale_unix.cpp b/src/corelib/tools/qlocale_unix.cpp
index e88c511ae9..5f7a9da95d 100644
--- a/src/corelib/tools/qlocale_unix.cpp
+++ b/src/corelib/tools/qlocale_unix.cpp
@@ -244,6 +244,8 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
return lc_messages.createSeparatedList(in.value<QStringList>());
case LocaleChanged:
Q_ASSERT(false);
+ case LanguageId:
+ return lc_messages.language();
default:
break;
}
diff --git a/src/corelib/tools/qmap.cpp b/src/corelib/tools/qmap.cpp
index 90521d343c..8002e7c1f0 100644
--- a/src/corelib/tools/qmap.cpp
+++ b/src/corelib/tools/qmap.cpp
@@ -388,21 +388,21 @@ void QMapDataBase::freeData(QMapDataBase *d)
\endlist
Here's an example QMap with QString keys and \c int values:
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 0
+ \snippet code/src_corelib_tools_qmap.cpp 0
To insert a (key, value) pair into the map, you can use operator[]():
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 1
+ \snippet code/src_corelib_tools_qmap.cpp 1
This inserts the following three (key, value) pairs into the
QMap: ("one", 1), ("three", 3), and ("seven", 7). Another way to
insert items into the map is to use insert():
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 2
+ \snippet code/src_corelib_tools_qmap.cpp 2
To look up a value, use operator[]() or value():
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 3
+ \snippet code/src_corelib_tools_qmap.cpp 3
If there is no item with the specified key in the map, these
functions return a \l{default-constructed value}.
@@ -410,12 +410,12 @@ void QMapDataBase::freeData(QMapDataBase *d)
If you want to check whether the map contains a certain key, use
contains():
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 4
+ \snippet code/src_corelib_tools_qmap.cpp 4
There is also a value() overload that uses its second argument as
a default value if there is no item with the specified key:
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 5
+ \snippet code/src_corelib_tools_qmap.cpp 5
In general, we recommend that you use contains() and value()
rather than operator[]() for looking up a key in a map. The
@@ -424,7 +424,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
const). For example, the following code snippet will create 1000
items in memory:
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 6
+ \snippet code/src_corelib_tools_qmap.cpp 6
To avoid this problem, replace \c map[i] with \c map.value(i)
in the code above.
@@ -436,11 +436,11 @@ void QMapDataBase::freeData(QMapDataBase *d)
QMap::iterator). Here's how to iterate over a QMap<QString, int>
using a Java-style iterator:
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 7
+ \snippet code/src_corelib_tools_qmap.cpp 7
Here's the same code, but using an STL-style iterator this time:
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 8
+ \snippet code/src_corelib_tools_qmap.cpp 8
The items are traversed in ascending key order.
@@ -448,7 +448,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
insert() with a key that already exists in the QMap, the
previous value will be erased. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 9
+ \snippet code/src_corelib_tools_qmap.cpp 9
However, you can store multiple values per key by using
insertMulti() instead of insert() (or using the convenience
@@ -456,19 +456,19 @@ void QMapDataBase::freeData(QMapDataBase *d)
single key, you can use values(const Key &key), which returns a
QList<T>:
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 10
+ \snippet code/src_corelib_tools_qmap.cpp 10
The items that share the same key are available from most
recently to least recently inserted. Another approach is to call
find() to get the STL-style iterator for the first item with a
key and iterate from there:
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 11
+ \snippet code/src_corelib_tools_qmap.cpp 11
If you only need to extract the values from a map (not the keys),
you can also use \l{foreach}:
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 12
+ \snippet code/src_corelib_tools_qmap.cpp 12
Items can be removed from the map in several ways. One way is to
call remove(); this will remove any item with the given key.
@@ -484,7 +484,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
< y} nor \c{y < x} is true.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 13
+ \snippet code/src_corelib_tools_qmap.cpp 13
In the example, we start by comparing the employees' names. If
they're equal, we compare their dates of birth to break the tie.
@@ -881,7 +881,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
the iterator. For example, here's some code that iterates over all
the items with the same key:
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 14
+ \snippet code/src_corelib_tools_qmap.cpp 14
\sa constFind(), value(), values(), lowerBound(), upperBound(), QMultiMap::find()
*/
@@ -911,7 +911,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
key.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 15
+ \snippet code/src_corelib_tools_qmap.cpp 15
If the map contains multiple items with key \a key, this
function returns an iterator that points to the most recently
@@ -919,7 +919,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
the iterator. For example, here's some code that iterates over all
the items with the same key:
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 16
+ \snippet code/src_corelib_tools_qmap.cpp 16
\sa qLowerBound(), upperBound(), find()
*/
@@ -937,7 +937,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
nearest item with a greater key.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 17
+ \snippet code/src_corelib_tools_qmap.cpp 17
\sa qUpperBound(), lowerBound(), find()
*/
@@ -1042,7 +1042,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
start iterating. Here's a typical loop that prints all the (key,
value) pairs stored in a map:
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 18
+ \snippet code/src_corelib_tools_qmap.cpp 18
Unlike QHash, which stores its items in an arbitrary order, QMap
stores its items ordered by key. Items that share the same key
@@ -1055,22 +1055,22 @@ void QMapDataBase::freeData(QMapDataBase *d)
Here's an example that increments every value stored in the QMap
by 2:
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 19
+ \snippet code/src_corelib_tools_qmap.cpp 19
Here's an example that removes all the items whose key is a
string that starts with an underscore character:
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 20
+ \snippet code/src_corelib_tools_qmap.cpp 20
The call to QMap::erase() removes the item pointed to by the
iterator from the map, and returns an iterator to the next item.
Here's another way of removing an item while iterating:
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 21
+ \snippet code/src_corelib_tools_qmap.cpp 21
It might be tempting to write code like this:
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 22
+ \snippet code/src_corelib_tools_qmap.cpp 22
However, this will potentially crash in \c{++i}, because \c i is
a dangling iterator after the call to erase().
@@ -1122,7 +1122,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
called on an uninitialized iterator. Use operator=() to assign a
value to it before using it.
- \sa QMap::begin() QMap::end()
+ \sa QMap::begin(), QMap::end()
*/
/*! \fn QMap::iterator::iterator(QMapData::Node *node)
@@ -1148,7 +1148,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
You can change the value of an item by using value() on
the left side of an assignment, for example:
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 23
+ \snippet code/src_corelib_tools_qmap.cpp 23
\sa key(), operator*()
*/
@@ -1289,7 +1289,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
QMap::find() before you can start iterating. Here's a typical
loop that prints all the (key, value) pairs stored in a map:
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 24
+ \snippet code/src_corelib_tools_qmap.cpp 24
Unlike QHash, which stores its items in an arbitrary order, QMap
stores its items ordered by key. Items that share the same key
@@ -1344,7 +1344,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
called on an uninitialized iterator. Use operator=() to assign a
value to it before using it.
- \sa QMap::constBegin() QMap::constEnd()
+ \sa QMap::constBegin(), QMap::constEnd()
*/
/*! \fn QMap::const_iterator::const_iterator(QMapData::Node *node)
@@ -1530,7 +1530,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
operator+=().
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 25
+ \snippet code/src_corelib_tools_qmap.cpp 25
Unlike QMap, QMultiMap provides no operator[]. Use value() or
replace() if you want to access the most recently inserted item
@@ -1539,7 +1539,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
If you want to retrieve all the values for a single key, you can
use values(const Key &key), which returns a QList<T>:
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 26
+ \snippet code/src_corelib_tools_qmap.cpp 26
The items that share the same key are available from most
recently to least recently inserted.
@@ -1548,7 +1548,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
the iterator for the first item with a key and iterate from
there:
- \snippet doc/src/snippets/code/src_corelib_tools_qmap.cpp 27
+ \snippet code/src_corelib_tools_qmap.cpp 27
QMultiMap's key and value data types must be \l{assignable data
types}. This covers most data types you are likely to encounter,
diff --git a/src/corelib/tools/qpair.qdoc b/src/corelib/tools/qpair.qdoc
index fdf1eafc23..ddaf82497e 100644
--- a/src/corelib/tools/qpair.qdoc
+++ b/src/corelib/tools/qpair.qdoc
@@ -40,12 +40,12 @@
Here's an example of a QPair that stores one QString and one \c
double value:
- \snippet doc/src/snippets/code/doc_src_qpair.cpp 0
+ \snippet code/doc_src_qpair.cpp 0
The components are accessible as public data members called \l
first and \l second. For example:
- \snippet doc/src/snippets/code/doc_src_qpair.cpp 1
+ \snippet code/doc_src_qpair.cpp 1
QPair's template data types (T1 and T2) must be \l{assignable
data types}. You cannot, for example, store a QWidget as a value;
@@ -95,12 +95,6 @@
\sa qMakePair()
*/
-/*!
- \fn QPair<T1, T2> &QPair::operator=(const QPair<T1, T2> &other)
-
- Assigns \a other to this pair.
-*/
-
/*! \fn bool operator==(const QPair<T1, T2> &p1, const QPair<T1, T2> &p2)
\relates QPair
@@ -186,7 +180,7 @@
Returns a QPair\<T1, T2\> that contains \a value1 and \a value2.
Example:
- \snippet doc/src/snippets/code/doc_src_qpair.cpp 2
+ \snippet code/doc_src_qpair.cpp 2
This is equivalent to QPair<T1, T2>(\a value1, \a value2), but
usually requires less typing.
diff --git a/src/corelib/tools/qpoint.cpp b/src/corelib/tools/qpoint.cpp
index ecbe9deb9f..edc103f0b2 100644
--- a/src/corelib/tools/qpoint.cpp
+++ b/src/corelib/tools/qpoint.cpp
@@ -62,7 +62,7 @@ QT_BEGIN_NAMESPACE
Given a point \e p, the following statements are all equivalent:
- \snippet doc/src/snippets/code/src_corelib_tools_qpoint.cpp 0
+ \snippet code/src_corelib_tools_qpoint.cpp 0
A QPoint object can also be used as a vector: Addition and
subtraction are defined as for vectors (each component is added
@@ -126,7 +126,7 @@ QT_BEGIN_NAMESPACE
Sets the x coordinate of this point to the given \a x coordinate.
- \sa x() setY()
+ \sa x(), setY()
*/
/*!
@@ -134,7 +134,7 @@ QT_BEGIN_NAMESPACE
Sets the y coordinate of this point to the given \a y coordinate.
- \sa y() setX()
+ \sa y(), setX()
*/
@@ -145,9 +145,9 @@ QT_BEGIN_NAMESPACE
Using a reference makes it possible to directly manipulate x. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qpoint.cpp 1
+ \snippet code/src_corelib_tools_qpoint.cpp 1
- \sa x() setX()
+ \sa x(), setX()
*/
/*!
@@ -158,7 +158,7 @@ QT_BEGIN_NAMESPACE
Using a reference makes it possible to directly manipulate y. For
example:
- \snippet doc/src/snippets/code/src_corelib_tools_qpoint.cpp 2
+ \snippet code/src_corelib_tools_qpoint.cpp 2
\sa y(), setY()
*/
@@ -170,7 +170,7 @@ QT_BEGIN_NAMESPACE
Adds the given \a point to this point and returns a reference to
this point. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qpoint.cpp 3
+ \snippet code/src_corelib_tools_qpoint.cpp 3
\sa operator-=()
*/
@@ -181,7 +181,7 @@ QT_BEGIN_NAMESPACE
Subtracts the given \a point from this point and returns a
reference to this point. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qpoint.cpp 4
+ \snippet code/src_corelib_tools_qpoint.cpp 4
\sa operator+=()
*/
@@ -204,7 +204,7 @@ QT_BEGIN_NAMESPACE
Multiplies this point's coordinates by the given \a factor, and
returns a reference to this point. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qpoint.cpp 5
+ \snippet code/src_corelib_tools_qpoint.cpp 5
Note that the result is rounded to the nearest integer as points are held as
integers. Use QPointF for floating point accuracy.
@@ -331,7 +331,7 @@ QT_BEGIN_NAMESPACE
Divides both x and y by the given \a divisor, and returns a reference to this
point. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qpoint.cpp 6
+ \snippet code/src_corelib_tools_qpoint.cpp 6
Note that the result is rounded to the nearest integer as points are held as
integers. Use QPointF for floating point accuracy.
@@ -408,12 +408,12 @@ QDataStream &operator>>(QDataStream &s, QPoint &p)
traditionally known as the "Manhattan length" of the vector from
the origin to the point. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qpoint.cpp 7
+ \snippet code/src_corelib_tools_qpoint.cpp 7
This is a useful, and quick to calculate, approximation to the
true length:
- \snippet doc/src/snippets/code/src_corelib_tools_qpoint.cpp 8
+ \snippet code/src_corelib_tools_qpoint.cpp 8
The tradition of "Manhattan length" arises because such distances
apply to travelers who can only travel on a rectangular grid, like
@@ -451,7 +451,7 @@ QDebug operator<<(QDebug d, const QPointF &p)
Given a point \e p, the following statements are all equivalent:
- \snippet doc/src/snippets/code/src_corelib_tools_qpoint.cpp 9
+ \snippet code/src_corelib_tools_qpoint.cpp 9
A QPointF object can also be used as a vector: Addition and
subtraction are defined as for vectors (each component is added
@@ -534,7 +534,7 @@ QDebug operator<<(QDebug d, const QPointF &p)
Sets the x coordinate of this point to the given \a x coordinate.
- \sa x() setY()
+ \sa x(), setY()
*/
/*!
@@ -552,7 +552,7 @@ QDebug operator<<(QDebug d, const QPointF &p)
Using a reference makes it possible to directly manipulate x. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qpoint.cpp 10
+ \snippet code/src_corelib_tools_qpoint.cpp 10
\sa x(), setX()
*/
@@ -564,9 +564,9 @@ QDebug operator<<(QDebug d, const QPointF &p)
Using a reference makes it possible to directly manipulate y. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qpoint.cpp 11
+ \snippet code/src_corelib_tools_qpoint.cpp 11
- \sa y() setY()
+ \sa y(), setY()
*/
/*!
@@ -575,7 +575,7 @@ QDebug operator<<(QDebug d, const QPointF &p)
Adds the given \a point to this point and returns a reference to
this point. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qpoint.cpp 12
+ \snippet code/src_corelib_tools_qpoint.cpp 12
\sa operator-=()
*/
@@ -586,7 +586,7 @@ QDebug operator<<(QDebug d, const QPointF &p)
Subtracts the given \a point from this point and returns a reference
to this point. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qpoint.cpp 13
+ \snippet code/src_corelib_tools_qpoint.cpp 13
\sa operator+=()
*/
@@ -597,7 +597,7 @@ QDebug operator<<(QDebug d, const QPointF &p)
Multiplies this point's coordinates by the given \a factor, and
returns a reference to this point. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qpoint.cpp 14
+ \snippet code/src_corelib_tools_qpoint.cpp 14
\sa operator/=()
*/
@@ -608,7 +608,7 @@ QDebug operator<<(QDebug d, const QPointF &p)
Divides both x and y by the given \a divisor, and returns a reference
to this point. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qpoint.cpp 15
+ \snippet code/src_corelib_tools_qpoint.cpp 15
\sa operator*=()
*/
diff --git a/src/corelib/tools/qpoint.h b/src/corelib/tools/qpoint.h
index 0eb22807e8..3b986cd81e 100644
--- a/src/corelib/tools/qpoint.h
+++ b/src/corelib/tools/qpoint.h
@@ -55,26 +55,26 @@ public:
Q_DECL_CONSTEXPR QPoint();
Q_DECL_CONSTEXPR QPoint(int xpos, int ypos);
- Q_DECL_CONSTEXPR bool isNull() const;
+ Q_DECL_CONSTEXPR inline bool isNull() const;
- Q_DECL_CONSTEXPR int x() const;
- Q_DECL_CONSTEXPR int y() const;
- void setX(int x);
- void setY(int y);
+ Q_DECL_CONSTEXPR inline int x() const;
+ Q_DECL_CONSTEXPR inline int y() const;
+ inline void setX(int x);
+ inline void setY(int y);
- Q_DECL_CONSTEXPR int manhattanLength() const;
+ Q_DECL_CONSTEXPR inline int manhattanLength() const;
- int &rx();
- int &ry();
+ inline int &rx();
+ inline int &ry();
- QPoint &operator+=(const QPoint &p);
- QPoint &operator-=(const QPoint &p);
+ inline QPoint &operator+=(const QPoint &p);
+ inline QPoint &operator-=(const QPoint &p);
- QPoint &operator*=(float c);
- QPoint &operator*=(double c);
- QPoint &operator*=(int c);
+ inline QPoint &operator*=(float c);
+ inline QPoint &operator*=(double c);
+ inline QPoint &operator*=(int c);
- QPoint &operator/=(qreal c);
+ inline QPoint &operator/=(qreal c);
friend Q_DECL_CONSTEXPR inline bool operator==(const QPoint &, const QPoint &);
friend Q_DECL_CONSTEXPR inline bool operator!=(const QPoint &, const QPoint &);
@@ -212,22 +212,22 @@ public:
Q_DECL_CONSTEXPR QPointF(const QPoint &p);
Q_DECL_CONSTEXPR QPointF(qreal xpos, qreal ypos);
- Q_DECL_CONSTEXPR qreal manhattanLength() const;
+ Q_DECL_CONSTEXPR inline qreal manhattanLength() const;
- bool isNull() const;
+ inline bool isNull() const;
- Q_DECL_CONSTEXPR qreal x() const;
- Q_DECL_CONSTEXPR qreal y() const;
- void setX(qreal x);
- void setY(qreal y);
+ Q_DECL_CONSTEXPR inline qreal x() const;
+ Q_DECL_CONSTEXPR inline qreal y() const;
+ inline void setX(qreal x);
+ inline void setY(qreal y);
- qreal &rx();
- qreal &ry();
+ inline qreal &rx();
+ inline qreal &ry();
- QPointF &operator+=(const QPointF &p);
- QPointF &operator-=(const QPointF &p);
- QPointF &operator*=(qreal c);
- QPointF &operator/=(qreal c);
+ inline QPointF &operator+=(const QPointF &p);
+ inline QPointF &operator-=(const QPointF &p);
+ inline QPointF &operator*=(qreal c);
+ inline QPointF &operator/=(qreal c);
friend Q_DECL_CONSTEXPR inline bool operator==(const QPointF &, const QPointF &);
friend Q_DECL_CONSTEXPR inline bool operator!=(const QPointF &, const QPointF &);
diff --git a/src/corelib/tools/qqueue.cpp b/src/corelib/tools/qqueue.cpp
index 06d996a542..c5aa4c6bad 100644
--- a/src/corelib/tools/qqueue.cpp
+++ b/src/corelib/tools/qqueue.cpp
@@ -57,7 +57,7 @@
the head item without removing it.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qqueue.cpp 0
+ \snippet code/src_corelib_tools_qqueue.cpp 0
The example will output 1, 2, 3 in that order.
diff --git a/src/corelib/tools/qrect.cpp b/src/corelib/tools/qrect.cpp
index aeab97803d..8c1eea8df7 100644
--- a/src/corelib/tools/qrect.cpp
+++ b/src/corelib/tools/qrect.cpp
@@ -64,7 +64,7 @@ QT_BEGIN_NAMESPACE
height integers, or from a QPoint and a QSize. The following code
creates two identical rectangles.
- \snippet doc/src/snippets/code/src_corelib_tools_qrect.cpp 0
+ \snippet code/src_corelib_tools_qrect.cpp 0
There is a third constructor that creates a QRect using the
top-left and bottom-right coordinates, but we recommend that you
@@ -640,16 +640,6 @@ QRect QRect::normalized() const
\sa center()
*/
-void QRect::moveCenter(const QPoint &p)
-{
- int w = x2 - x1;
- int h = y2 - y1;
- x1 = p.x() - w/2;
- y1 = p.y() - h/2;
- x2 = x1 + w;
- y2 = y1 + h;
-}
-
/*!
\fn void QRect::moveTo(int x, int y)
@@ -1243,7 +1233,7 @@ QDebug operator<<(QDebug dbg, const QRect &r) {
height integers, or from a QPoint and a QSize. The following code
creates two identical rectangles.
- \snippet doc/src/snippets/code/src_corelib_tools_qrect.cpp 1
+ \snippet code/src_corelib_tools_qrect.cpp 1
There is also a third constructor creating a QRectF from a QRect,
and a corresponding toRect() function that returns a QRect object
@@ -1791,7 +1781,7 @@ QRectF QRectF::normalized() const
\a y1), and the coordinates of its bottom-right corner to (\a x2,
\a y2).
- \sa getCoords() setRect()
+ \sa getCoords(), setRect()
*/
/*!
diff --git a/src/corelib/tools/qrect.h b/src/corelib/tools/qrect.h
index 4bf10061ab..ff318dbe6f 100644
--- a/src/corelib/tools/qrect.h
+++ b/src/corelib/tools/qrect.h
@@ -62,81 +62,81 @@ public:
Q_DECL_CONSTEXPR QRect(const QPoint &topleft, const QSize &size);
Q_DECL_CONSTEXPR QRect(int left, int top, int width, int height);
- Q_DECL_CONSTEXPR bool isNull() const;
- Q_DECL_CONSTEXPR bool isEmpty() const;
- Q_DECL_CONSTEXPR bool isValid() const;
-
- Q_DECL_CONSTEXPR int left() const;
- Q_DECL_CONSTEXPR int top() const;
- Q_DECL_CONSTEXPR int right() const;
- Q_DECL_CONSTEXPR int bottom() const;
+ Q_DECL_CONSTEXPR inline bool isNull() const;
+ Q_DECL_CONSTEXPR inline bool isEmpty() const;
+ Q_DECL_CONSTEXPR inline bool isValid() const;
+
+ Q_DECL_CONSTEXPR inline int left() const;
+ Q_DECL_CONSTEXPR inline int top() const;
+ Q_DECL_CONSTEXPR inline int right() const;
+ Q_DECL_CONSTEXPR inline int bottom() const;
QRect normalized() const;
- Q_DECL_CONSTEXPR int x() const;
- Q_DECL_CONSTEXPR int y() const;
- void setLeft(int pos);
- void setTop(int pos);
- void setRight(int pos);
- void setBottom(int pos);
- void setX(int x);
- void setY(int y);
-
- void setTopLeft(const QPoint &p);
- void setBottomRight(const QPoint &p);
- void setTopRight(const QPoint &p);
- void setBottomLeft(const QPoint &p);
-
- Q_DECL_CONSTEXPR QPoint topLeft() const;
- Q_DECL_CONSTEXPR QPoint bottomRight() const;
- Q_DECL_CONSTEXPR QPoint topRight() const;
- Q_DECL_CONSTEXPR QPoint bottomLeft() const;
- Q_DECL_CONSTEXPR QPoint center() const;
-
- void moveLeft(int pos);
- void moveTop(int pos);
- void moveRight(int pos);
- void moveBottom(int pos);
- void moveTopLeft(const QPoint &p);
- void moveBottomRight(const QPoint &p);
- void moveTopRight(const QPoint &p);
- void moveBottomLeft(const QPoint &p);
- void moveCenter(const QPoint &p);
+ Q_DECL_CONSTEXPR inline int x() const;
+ Q_DECL_CONSTEXPR inline int y() const;
+ inline void setLeft(int pos);
+ inline void setTop(int pos);
+ inline void setRight(int pos);
+ inline void setBottom(int pos);
+ inline void setX(int x);
+ inline void setY(int y);
+
+ inline void setTopLeft(const QPoint &p);
+ inline void setBottomRight(const QPoint &p);
+ inline void setTopRight(const QPoint &p);
+ inline void setBottomLeft(const QPoint &p);
+
+ Q_DECL_CONSTEXPR inline QPoint topLeft() const;
+ Q_DECL_CONSTEXPR inline QPoint bottomRight() const;
+ Q_DECL_CONSTEXPR inline QPoint topRight() const;
+ Q_DECL_CONSTEXPR inline QPoint bottomLeft() const;
+ Q_DECL_CONSTEXPR inline QPoint center() const;
+
+ inline void moveLeft(int pos);
+ inline void moveTop(int pos);
+ inline void moveRight(int pos);
+ inline void moveBottom(int pos);
+ inline void moveTopLeft(const QPoint &p);
+ inline void moveBottomRight(const QPoint &p);
+ inline void moveTopRight(const QPoint &p);
+ inline void moveBottomLeft(const QPoint &p);
+ inline void moveCenter(const QPoint &p);
inline void translate(int dx, int dy);
inline void translate(const QPoint &p);
Q_DECL_CONSTEXPR inline QRect translated(int dx, int dy) const;
Q_DECL_CONSTEXPR inline QRect translated(const QPoint &p) const;
- void moveTo(int x, int t);
- void moveTo(const QPoint &p);
+ inline void moveTo(int x, int t);
+ inline void moveTo(const QPoint &p);
- void setRect(int x, int y, int w, int h);
+ inline void setRect(int x, int y, int w, int h);
inline void getRect(int *x, int *y, int *w, int *h) const;
- void setCoords(int x1, int y1, int x2, int y2);
+ inline void setCoords(int x1, int y1, int x2, int y2);
inline void getCoords(int *x1, int *y1, int *x2, int *y2) const;
inline void adjust(int x1, int y1, int x2, int y2);
Q_DECL_CONSTEXPR inline QRect adjusted(int x1, int y1, int x2, int y2) const;
- Q_DECL_CONSTEXPR QSize size() const;
- Q_DECL_CONSTEXPR int width() const;
- Q_DECL_CONSTEXPR int height() const;
- void setWidth(int w);
- void setHeight(int h);
- void setSize(const QSize &s);
+ Q_DECL_CONSTEXPR inline QSize size() const;
+ Q_DECL_CONSTEXPR inline int width() const;
+ Q_DECL_CONSTEXPR inline int height() const;
+ inline void setWidth(int w);
+ inline void setHeight(int h);
+ inline void setSize(const QSize &s);
QRect operator|(const QRect &r) const;
QRect operator&(const QRect &r) const;
- QRect& operator|=(const QRect &r);
- QRect& operator&=(const QRect &r);
+ inline QRect& operator|=(const QRect &r);
+ inline QRect& operator&=(const QRect &r);
- bool contains(const QPoint &p, bool proper=false) const;
- bool contains(int x, int y) const; // inline methods, _don't_ merge these
- bool contains(int x, int y, bool proper) const;
bool contains(const QRect &r, bool proper = false) const;
- QRect united(const QRect &other) const;
- QRect intersected(const QRect &other) const;
+ bool contains(const QPoint &p, bool proper=false) const;
+ inline bool contains(int x, int y) const;
+ inline bool contains(int x, int y, bool proper) const;
+ inline QRect united(const QRect &other) const;
+ inline QRect intersected(const QRect &other) const;
bool intersects(const QRect &r) const;
#if QT_DEPRECATED_SINCE(5, 0)
@@ -144,8 +144,8 @@ public:
QT_DEPRECATED QRect intersect(const QRect &r) const { return intersected(r); }
#endif
- friend Q_CORE_EXPORT_INLINE Q_DECL_CONSTEXPR bool operator==(const QRect &, const QRect &);
- friend Q_CORE_EXPORT_INLINE Q_DECL_CONSTEXPR bool operator!=(const QRect &, const QRect &);
+ friend Q_DECL_CONSTEXPR inline bool operator==(const QRect &, const QRect &);
+ friend Q_DECL_CONSTEXPR inline bool operator!=(const QRect &, const QRect &);
private:
int x1;
@@ -155,8 +155,8 @@ private:
};
Q_DECLARE_TYPEINFO(QRect, Q_MOVABLE_TYPE);
-Q_CORE_EXPORT_INLINE Q_DECL_CONSTEXPR bool operator==(const QRect &, const QRect &);
-Q_CORE_EXPORT_INLINE Q_DECL_CONSTEXPR bool operator!=(const QRect &, const QRect &);
+Q_DECL_CONSTEXPR inline bool operator==(const QRect &, const QRect &);
+Q_DECL_CONSTEXPR inline bool operator!=(const QRect &, const QRect &);
/*****************************************************************************
@@ -341,6 +341,16 @@ inline void QRect::moveBottomLeft(const QPoint &p)
moveBottom(p.y());
}
+inline void QRect::moveCenter(const QPoint &p)
+{
+ int w = x2 - x1;
+ int h = y2 - y1;
+ x1 = p.x() - w/2;
+ y1 = p.y() - h/2;
+ x2 = x1 + w;
+ y2 = y1 + h;
+}
+
inline void QRect::getRect(int *ax, int *ay, int *aw, int *ah) const
{
*ax = x1;
@@ -452,9 +462,9 @@ public:
Q_DECL_CONSTEXPR QRectF(qreal left, qreal top, qreal width, qreal height);
Q_DECL_CONSTEXPR QRectF(const QRect &rect);
- Q_DECL_CONSTEXPR bool isNull() const;
- Q_DECL_CONSTEXPR bool isEmpty() const;
- Q_DECL_CONSTEXPR bool isValid() const;
+ Q_DECL_CONSTEXPR inline bool isNull() const;
+ Q_DECL_CONSTEXPR inline bool isEmpty() const;
+ Q_DECL_CONSTEXPR inline bool isValid() const;
QRectF normalized() const;
Q_DECL_CONSTEXPR inline qreal left() const { return xp; }
@@ -477,56 +487,56 @@ public:
Q_DECL_CONSTEXPR inline QPointF bottomLeft() const { return QPointF(xp, yp+h); }
Q_DECL_CONSTEXPR inline QPointF center() const;
- void setTopLeft(const QPointF &p);
- void setBottomRight(const QPointF &p);
- void setTopRight(const QPointF &p);
- void setBottomLeft(const QPointF &p);
+ inline void setTopLeft(const QPointF &p);
+ inline void setBottomRight(const QPointF &p);
+ inline void setTopRight(const QPointF &p);
+ inline void setBottomLeft(const QPointF &p);
- void moveLeft(qreal pos);
- void moveTop(qreal pos);
- void moveRight(qreal pos);
- void moveBottom(qreal pos);
- void moveTopLeft(const QPointF &p);
- void moveBottomRight(const QPointF &p);
- void moveTopRight(const QPointF &p);
- void moveBottomLeft(const QPointF &p);
- void moveCenter(const QPointF &p);
+ inline void moveLeft(qreal pos);
+ inline void moveTop(qreal pos);
+ inline void moveRight(qreal pos);
+ inline void moveBottom(qreal pos);
+ inline void moveTopLeft(const QPointF &p);
+ inline void moveBottomRight(const QPointF &p);
+ inline void moveTopRight(const QPointF &p);
+ inline void moveBottomLeft(const QPointF &p);
+ inline void moveCenter(const QPointF &p);
- void translate(qreal dx, qreal dy);
- void translate(const QPointF &p);
+ inline void translate(qreal dx, qreal dy);
+ inline void translate(const QPointF &p);
- Q_DECL_CONSTEXPR QRectF translated(qreal dx, qreal dy) const;
- Q_DECL_CONSTEXPR QRectF translated(const QPointF &p) const;
+ Q_DECL_CONSTEXPR inline QRectF translated(qreal dx, qreal dy) const;
+ Q_DECL_CONSTEXPR inline QRectF translated(const QPointF &p) const;
- void moveTo(qreal x, qreal t);
- void moveTo(const QPointF &p);
+ inline void moveTo(qreal x, qreal t);
+ inline void moveTo(const QPointF &p);
- void setRect(qreal x, qreal y, qreal w, qreal h);
- void getRect(qreal *x, qreal *y, qreal *w, qreal *h) const;
+ inline void setRect(qreal x, qreal y, qreal w, qreal h);
+ inline void getRect(qreal *x, qreal *y, qreal *w, qreal *h) const;
- void setCoords(qreal x1, qreal y1, qreal x2, qreal y2);
- void getCoords(qreal *x1, qreal *y1, qreal *x2, qreal *y2) const;
+ inline void setCoords(qreal x1, qreal y1, qreal x2, qreal y2);
+ inline void getCoords(qreal *x1, qreal *y1, qreal *x2, qreal *y2) const;
inline void adjust(qreal x1, qreal y1, qreal x2, qreal y2);
Q_DECL_CONSTEXPR inline QRectF adjusted(qreal x1, qreal y1, qreal x2, qreal y2) const;
- Q_DECL_CONSTEXPR QSizeF size() const;
- Q_DECL_CONSTEXPR qreal width() const;
- Q_DECL_CONSTEXPR qreal height() const;
- void setWidth(qreal w);
- void setHeight(qreal h);
- void setSize(const QSizeF &s);
+ Q_DECL_CONSTEXPR inline QSizeF size() const;
+ Q_DECL_CONSTEXPR inline qreal width() const;
+ Q_DECL_CONSTEXPR inline qreal height() const;
+ inline void setWidth(qreal w);
+ inline void setHeight(qreal h);
+ inline void setSize(const QSizeF &s);
QRectF operator|(const QRectF &r) const;
QRectF operator&(const QRectF &r) const;
- QRectF& operator|=(const QRectF &r);
- QRectF& operator&=(const QRectF &r);
+ inline QRectF& operator|=(const QRectF &r);
+ inline QRectF& operator&=(const QRectF &r);
- bool contains(const QPointF &p) const;
- bool contains(qreal x, qreal y) const;
bool contains(const QRectF &r) const;
- QRectF united(const QRectF &other) const;
- QRectF intersected(const QRectF &other) const;
+ bool contains(const QPointF &p) const;
+ inline bool contains(qreal x, qreal y) const;
+ inline QRectF united(const QRectF &other) const;
+ inline QRectF intersected(const QRectF &other) const;
bool intersects(const QRectF &r) const;
#if QT_DEPRECATED_SINCE(5, 0)
@@ -534,10 +544,10 @@ public:
QT_DEPRECATED QRectF intersect(const QRectF &r) const { return intersected(r); }
#endif
- friend Q_CORE_EXPORT_INLINE Q_DECL_CONSTEXPR bool operator==(const QRectF &, const QRectF &);
- friend Q_CORE_EXPORT_INLINE Q_DECL_CONSTEXPR bool operator!=(const QRectF &, const QRectF &);
+ friend Q_DECL_CONSTEXPR inline bool operator==(const QRectF &, const QRectF &);
+ friend Q_DECL_CONSTEXPR inline bool operator!=(const QRectF &, const QRectF &);
- Q_DECL_CONSTEXPR QRect toRect() const;
+ Q_DECL_CONSTEXPR inline QRect toRect() const;
QRect toAlignedRect() const;
private:
@@ -548,8 +558,8 @@ private:
};
Q_DECLARE_TYPEINFO(QRectF, Q_MOVABLE_TYPE);
-Q_CORE_EXPORT_INLINE Q_DECL_CONSTEXPR bool operator==(const QRectF &, const QRectF &);
-Q_CORE_EXPORT_INLINE Q_DECL_CONSTEXPR bool operator!=(const QRectF &, const QRectF &);
+Q_DECL_CONSTEXPR inline bool operator==(const QRectF &, const QRectF &);
+Q_DECL_CONSTEXPR inline bool operator!=(const QRectF &, const QRectF &);
/*****************************************************************************
diff --git a/src/corelib/tools/qregexp.cpp b/src/corelib/tools/qregexp.cpp
index 1db0fcf44c..e2167c5999 100644
--- a/src/corelib/tools/qregexp.cpp
+++ b/src/corelib/tools/qregexp.cpp
@@ -437,7 +437,7 @@ int qFindString(const QChar *haystack, int haystackLen, int from,
When the number of matches cannot be determined in advance, a
common idiom is to use cap() in a loop. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qregexp.cpp 0
+ \snippet code/src_corelib_tools_qregexp.cpp 0
\target assertions
\section1 Assertions
@@ -532,7 +532,7 @@ int qFindString(const QChar *haystack, int haystackLen, int from,
To test a string against a wildcard expression, use exactMatch().
For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qregexp.cpp 1
+ \snippet code/src_corelib_tools_qregexp.cpp 1
\target perl-users
\section1 Notes for Perl Users
@@ -555,7 +555,7 @@ int qFindString(const QChar *haystack, int haystackLen, int from,
applied to all the quantifiers in the pattern. For example, to
match the Perl regexp \b{ro+?m} requires:
- \snippet doc/src/snippets/code/src_corelib_tools_qregexp.cpp 2
+ \snippet code/src_corelib_tools_qregexp.cpp 2
The equivalent of Perl's \c{/i} option is
setCaseSensitivity(Qt::CaseInsensitive).
@@ -584,7 +584,7 @@ int qFindString(const QChar *haystack, int haystackLen, int from,
the other hand, C++'s rules for literal strings can be used to
achieve the same:
- \snippet doc/src/snippets/code/src_corelib_tools_qregexp.cpp 3
+ \snippet code/src_corelib_tools_qregexp.cpp 3
Both zero-width positive and zero-width negative lookahead
assertions (?=pattern) and (?!pattern) are supported with the same
@@ -603,12 +603,12 @@ int qFindString(const QChar *haystack, int haystackLen, int from,
\target code-examples
\section1 Code Examples
- \snippet doc/src/snippets/code/src_corelib_tools_qregexp.cpp 4
+ \snippet code/src_corelib_tools_qregexp.cpp 4
The third string matches '\underline{6}'. This is a simple validation
regexp for integers in the range 0 to 99.
- \snippet doc/src/snippets/code/src_corelib_tools_qregexp.cpp 5
+ \snippet code/src_corelib_tools_qregexp.cpp 5
The second string matches '\underline{This_is-OK}'. We've used the
character set abbreviation '\\S' (non-whitespace) and the anchors
@@ -618,25 +618,25 @@ int qFindString(const QChar *haystack, int haystackLen, int from,
'letter' or 'correspondence' but only match whole words i.e. not
'email'
- \snippet doc/src/snippets/code/src_corelib_tools_qregexp.cpp 6
+ \snippet code/src_corelib_tools_qregexp.cpp 6
The second string matches "Please write the \underline{letter}". The
word 'letter' is also captured (because of the parentheses). We
can see what text we've captured like this:
- \snippet doc/src/snippets/code/src_corelib_tools_qregexp.cpp 7
+ \snippet code/src_corelib_tools_qregexp.cpp 7
This will capture the text from the first set of capturing
parentheses (counting capturing left parentheses from left to
right). The parentheses are counted from 1 since cap(0) is the
whole matched regexp (equivalent to '&' in most regexp engines).
- \snippet doc/src/snippets/code/src_corelib_tools_qregexp.cpp 8
+ \snippet code/src_corelib_tools_qregexp.cpp 8
Here we've passed the QRegExp to QString's replace() function to
replace the matched text with new text.
- \snippet doc/src/snippets/code/src_corelib_tools_qregexp.cpp 9
+ \snippet code/src_corelib_tools_qregexp.cpp 9
We've used the indexIn() function to repeatedly match the regexp in
the string. Note that instead of moving forward by one character
@@ -650,7 +650,7 @@ int qFindString(const QChar *haystack, int haystackLen, int from,
One common use of regexps is to split lines of delimited data into
their component fields.
- \snippet doc/src/snippets/code/src_corelib_tools_qregexp.cpp 10
+ \snippet code/src_corelib_tools_qregexp.cpp 10
In this example our input lines have the format company name, web
address and country. Unfortunately the regexp is rather long and
@@ -660,13 +660,13 @@ int qFindString(const QChar *haystack, int haystackLen, int from,
QString::split() function can take a separator string or regexp
as an argument and split a string accordingly.
- \snippet doc/src/snippets/code/src_corelib_tools_qregexp.cpp 11
+ \snippet code/src_corelib_tools_qregexp.cpp 11
Here field[0] is the company, field[1] the web address and so on.
To imitate the matching of a shell we can use wildcard mode.
- \snippet doc/src/snippets/code/src_corelib_tools_qregexp.cpp 12
+ \snippet code/src_corelib_tools_qregexp.cpp 12
Wildcard matching can be convenient because of its simplicity, but
any wildcard regexp can be defined using full regexps, e.g.
@@ -4204,7 +4204,6 @@ void QRegExp::setMinimal(bool minimal)
priv->minimal = minimal;
}
-// ### Qt 5: make non-const
/*!
Returns true if \a str is matched exactly by this regular
expression; otherwise returns false. You can determine how much of
@@ -4220,12 +4219,9 @@ void QRegExp::setMinimal(bool minimal)
bluebell, \c blutak and \c lightblue, exactMatch() returns false
and matchedLength() will return 4, 3 and 0 respectively.
- Although const, this function sets matchedLength(),
- capturedTexts(), and pos().
-
\sa indexIn(), lastIndexIn()
*/
-bool QRegExp::exactMatch(const QString &str) const
+bool QRegExp::exactMatch(const QString &str)
{
prepareEngineForMatch(priv, str);
priv->matchState.match(str.unicode(), str.length(), 0, priv->minimal, true, 0);
@@ -4238,7 +4234,6 @@ bool QRegExp::exactMatch(const QString &str) const
}
}
-// ### Qt 5: make non-const
/*!
Attempts to find a match in \a str from position \a offset (0 by
default). If \a offset is -1, the search starts at the last
@@ -4255,10 +4250,7 @@ bool QRegExp::exactMatch(const QString &str) const
QString::replace().
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qregexp.cpp 13
-
- Although const, this function sets matchedLength(),
- capturedTexts() and pos().
+ \snippet code/src_corelib_tools_qregexp.cpp 13
If the QRegExp is a wildcard expression (see setPatternSyntax())
and want to test a string against the whole wildcard expression,
@@ -4267,7 +4259,7 @@ bool QRegExp::exactMatch(const QString &str) const
\sa lastIndexIn(), exactMatch()
*/
-int QRegExp::indexIn(const QString &str, int offset, CaretMode caretMode) const
+int QRegExp::indexIn(const QString &str, int offset, CaretMode caretMode)
{
prepareEngineForMatch(priv, str);
if (offset < 0)
@@ -4277,7 +4269,6 @@ int QRegExp::indexIn(const QString &str, int offset, CaretMode caretMode) const
return priv->matchState.captured[0];
}
-// ### Qt 5: make non-const
/*!
Attempts to find a match backwards in \a str from position \a
offset. If \a offset is -1 (the default), the search starts at the
@@ -4289,16 +4280,13 @@ int QRegExp::indexIn(const QString &str, int offset, CaretMode caretMode) const
The \a caretMode parameter can be used to instruct whether \b{^}
should match at index 0 or at \a offset.
- Although const, this function sets matchedLength(),
- capturedTexts() and pos().
-
\warning Searching backwards is much slower than searching
forwards.
\sa indexIn(), exactMatch()
*/
-int QRegExp::lastIndexIn(const QString &str, int offset, CaretMode caretMode) const
+int QRegExp::lastIndexIn(const QString &str, int offset, CaretMode caretMode)
{
prepareEngineForMatch(priv, str);
if (offset < 0)
@@ -4332,14 +4320,6 @@ int QRegExp::matchedLength() const
#ifndef QT_NO_REGEXP_CAPTURE
/*!
- \fn int QRegExp::numCaptures() const
- \obsolete
- Returns the number of captures contained in the regular expression.
-
- \sa captureCount()
- */
-
-/*!
\since 4.6
Returns the number of captures contained in the regular expression.
*/
@@ -4357,17 +4337,17 @@ int QRegExp::captureCount() const
(capturing) subexpression of the regexp.
For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qregexp.cpp 14
+ \snippet code/src_corelib_tools_qregexp.cpp 14
The above example also captures elements that may be present but
which we have no interest in. This problem can be solved by using
non-capturing parentheses:
- \snippet doc/src/snippets/code/src_corelib_tools_qregexp.cpp 15
+ \snippet code/src_corelib_tools_qregexp.cpp 15
Note that if you want to iterate over the list, you should iterate
over a copy, e.g.
- \snippet doc/src/snippets/code/src_corelib_tools_qregexp.cpp 16
+ \snippet code/src_corelib_tools_qregexp.cpp 16
Some regexps can match an indeterminate number of times. For
example if the input string is "Offsets: 12 14 99 231 7" and the
@@ -4420,7 +4400,7 @@ QStringList QRegExp::capturedTexts()
match has index 0 and the parenthesized subexpressions have
indexes starting from 1 (excluding non-capturing parentheses).
- \snippet doc/src/snippets/code/src_corelib_tools_qregexp.cpp 17
+ \snippet code/src_corelib_tools_qregexp.cpp 17
The order of elements matched by cap() is as follows. The first
element, cap(0), is the entire matching string. Each subsequent
@@ -4449,7 +4429,7 @@ QString QRegExp::cap(int nth)
of the whole match.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qregexp.cpp 18
+ \snippet code/src_corelib_tools_qregexp.cpp 18
For zero-length matches, pos() always returns -1. (For example, if
cap(4) would return an empty string, pos(4) returns -1.) This is
@@ -4504,11 +4484,11 @@ QString QRegExp::errorString()
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qregexp.cpp 19
+ \snippet code/src_corelib_tools_qregexp.cpp 19
This function is useful to construct regexp patterns dynamically:
- \snippet doc/src/snippets/code/src_corelib_tools_qregexp.cpp 20
+ \snippet code/src_corelib_tools_qregexp.cpp 20
\sa setPatternSyntax()
*/
diff --git a/src/corelib/tools/qregexp.h b/src/corelib/tools/qregexp.h
index 0455e1603e..234bb624e4 100644
--- a/src/corelib/tools/qregexp.h
+++ b/src/corelib/tools/qregexp.h
@@ -93,10 +93,10 @@ public:
bool isMinimal() const;
void setMinimal(bool minimal);
- bool exactMatch(const QString &str) const;
+ bool exactMatch(const QString &str);
- int indexIn(const QString &str, int offset = 0, CaretMode caretMode = CaretAtZero) const;
- int lastIndexIn(const QString &str, int offset = -1, CaretMode caretMode = CaretAtZero) const;
+ int indexIn(const QString &str, int offset = 0, CaretMode caretMode = CaretAtZero);
+ int lastIndexIn(const QString &str, int offset = -1, CaretMode caretMode = CaretAtZero);
int matchedLength() const;
#ifndef QT_NO_REGEXP_CAPTURE
int captureCount() const;
diff --git a/src/corelib/tools/qregularexpression.cpp b/src/corelib/tools/qregularexpression.cpp
index 393b2bbb7d..ff423901e8 100644
--- a/src/corelib/tools/qregularexpression.cpp
+++ b/src/corelib/tools/qregularexpression.cpp
@@ -122,23 +122,23 @@ QT_BEGIN_NAMESPACE
You can set the pattern string by passing a string to the QRegularExpression
constructor:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 0
+ \snippet code/src_corelib_tools_qregularexpression.cpp 0
This sets the pattern string to \c{a pattern}. You can also use the
setPattern() function to set a pattern on an existing QRegularExpression
object:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 1
+ \snippet code/src_corelib_tools_qregularexpression.cpp 1
Note that due to C++ literal strings rules, you must escape all backslashes
inside the pattern string with another backslash:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 2
+ \snippet code/src_corelib_tools_qregularexpression.cpp 2
The pattern() function returns the pattern that is currently set for a
QRegularExpression object:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 3
+ \snippet code/src_corelib_tools_qregularexpression.cpp 3
\section1 Pattern options
@@ -149,17 +149,17 @@ QT_BEGIN_NAMESPACE
You can set the options by passing them to the QRegularExpression
constructor, as in:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 4
+ \snippet code/src_corelib_tools_qregularexpression.cpp 4
Alternatively, you can use the setPatternOptions() function on an existing
QRegularExpressionObject:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 5
+ \snippet code/src_corelib_tools_qregularexpression.cpp 5
It is possible to get the pattern options currently set on a
QRegularExpression object by using the patternOptions() function:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 6
+ \snippet code/src_corelib_tools_qregularexpression.cpp 6
Please refer to the QRegularExpression::PatternOption enum documentation for
more information about each pattern option.
@@ -187,20 +187,20 @@ QT_BEGIN_NAMESPACE
QRegularExpressionMatch object that can be used to inspect the results of
the match. For instance:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 7
+ \snippet code/src_corelib_tools_qregularexpression.cpp 7
If a match is successful, the (implicit) capturing group number 0 can be
used to retrieve the substring matched by the entire pattern (see also the
section about \l{extracting captured substrings}):
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 8
+ \snippet code/src_corelib_tools_qregularexpression.cpp 8
It's also possible to start a match at an arbitrary offset inside the
subject string by passing the offset as an argument of the
match() function. In the following example \c{"12 abc"}
is not matched because the match is started at offset 1:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 9
+ \snippet code/src_corelib_tools_qregularexpression.cpp 9
\target extracting captured substrings
\section2 Extracting captured substrings
@@ -210,7 +210,7 @@ QT_BEGIN_NAMESPACE
\l{QRegularExpressionMatch::}{captured()} function will return the string
captured by the n-th capturing group:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 10
+ \snippet code/src_corelib_tools_qregularexpression.cpp 10
Capturing groups in the pattern are numbered starting from 1, and the
implicit capturing group 0 is used to capture the substring that matched
@@ -221,12 +221,12 @@ QT_BEGIN_NAMESPACE
\l{QRegularExpressionMatch::}{capturedStart()} and the
\l{QRegularExpressionMatch::}{capturedEnd()} functions:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 11
+ \snippet code/src_corelib_tools_qregularexpression.cpp 11
All of these functions have an overload taking a QString as a parameter
in order to extract \e{named} captured substrings. For instance:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 12
+ \snippet code/src_corelib_tools_qregularexpression.cpp 12
\target global matching
\section1 Global matching
@@ -240,7 +240,7 @@ QT_BEGIN_NAMESPACE
which is a Java-like forward iterator that can be used to iterate over the
results. For instance:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 13
+ \snippet code/src_corelib_tools_qregularexpression.cpp 13
Since it's a Java-like iterator, the QRegularExpressionMatchIterator will
point immediately before the first result. Every result is returned as a
@@ -250,7 +250,7 @@ QT_BEGIN_NAMESPACE
\l{QRegularExpressionMatchIterator::}{next()} will return the next result
and advance the iterator. Continuing from the previous example:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 14
+ \snippet code/src_corelib_tools_qregularexpression.cpp 14
You can also use \l{QRegularExpressionMatchIterator::}{peekNext()} to get
the next result without advancing the iterator.
@@ -326,17 +326,17 @@ QT_BEGIN_NAMESPACE
This behaviour is implemented by the PartialPreferCompleteMatch match type.
For instance:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 15
+ \snippet code/src_corelib_tools_qregularexpression.cpp 15
If matching the same regular expression against the subject string leads to
a complete match, it is reported as usual:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 16
+ \snippet code/src_corelib_tools_qregularexpression.cpp 16
Another example with a different pattern, showing the behaviour of
preferring a complete match over a partial one:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 17
+ \snippet code/src_corelib_tools_qregularexpression.cpp 17
In this case, the subpattern \c{abc\\w+X} partially matches the subject
string; however, the subpattern \c{def} matches the subject string
@@ -346,7 +346,7 @@ QT_BEGIN_NAMESPACE
match), then the QRegularExpressionMatch object will report the first one
that is found. For instance:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 18
+ \snippet code/src_corelib_tools_qregularexpression.cpp 18
\section2 Incremental/multi-segment matching
@@ -369,13 +369,13 @@ QT_BEGIN_NAMESPACE
as soon as it is found, and other match alternatives are not tried
(even if they could lead to a complete match). For instance:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 19
+ \snippet code/src_corelib_tools_qregularexpression.cpp 19
This happens because when matching the first branch of the alternation
operator a partial match is found, and therefore matching stops, without
trying the second branch. Another example:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 20
+ \snippet code/src_corelib_tools_qregularexpression.cpp 20
This shows what could seem a counterintuitve behaviour of quantifiers:
since \c{?} is greedy, then the engine tries first to continue the match
@@ -383,7 +383,7 @@ QT_BEGIN_NAMESPACE
subject string, and therefore a partial match is reported. This is
even more surprising in the following example:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 21
+ \snippet code/src_corelib_tools_qregularexpression.cpp 21
It's easy to understand this behaviour if we remember that the engine
expects the subject string to be only a substring of the whole text we're
@@ -404,13 +404,13 @@ QT_BEGIN_NAMESPACE
syntax errors in the pattern string. The isValid() function will return
true if the regular expression is valid, or false otherwise:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 22
+ \snippet code/src_corelib_tools_qregularexpression.cpp 22
You can get more information about the specific error by calling the
errorString() function; moreover, the patternErrorOffset() function
will return the offset inside the pattern string
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 23
+ \snippet code/src_corelib_tools_qregularexpression.cpp 23
If a match is attempted with an invalid QRegularExpression, then the
returned QRegularExpressionMatch object will be invalid as well (that is,
@@ -455,19 +455,19 @@ QT_BEGIN_NAMESPACE
putting the pattern between the \c{^} and the \c{$} anchors is enough
in most cases:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 24
+ \snippet code/src_corelib_tools_qregularexpression.cpp 24
However, remember that the \c{$} anchor not only matches at the end of the
string, but also at a newline character right before the end of the string;
that is, the previous pattern matches against the string "this pattern must
- match exactly\n". Also, the behaviour of both the \c{^} and the \c{$}
+ match exactly\\n". Also, the behaviour of both the \c{^} and the \c{$}
anchors changes if the MultiLineOption is set either explicitely (as a
pattern option) or implicitly (as a directive inside the pattern string).
Therefore, in the most general case, you should wrap the pattern between
the \c{\A} and the \c{\z} anchors:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 25
+ \snippet code/src_corelib_tools_qregularexpression.cpp 25
Note the usage of the non-capturing group in order to preserve the meaning
of the branch operator inside the pattern.
@@ -566,7 +566,7 @@ QT_BEGIN_NAMESPACE
returns each substring captured, either by the capturing group's index or
by its name:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 29
+ \snippet code/src_corelib_tools_qregularexpression.cpp 29
For each captured substring it is possible to query its starting and ending
offsets in the subject string by calling the capturedStart() and the
@@ -616,7 +616,7 @@ QT_BEGIN_NAMESPACE
For instance:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 30
+ \snippet code/src_corelib_tools_qregularexpression.cpp 30
Moreover, QRegularExpressionMatchIterator offers a peekNext() function
to get the next result \e{without} advancing the iterator.
@@ -1590,11 +1590,11 @@ bool QRegularExpression::operator==(const QRegularExpression &re) const
meaning when used as a regular expression pattern string, and returns
the escaped string. For instance:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 26
+ \snippet code/src_corelib_tools_qregularexpression.cpp 26
This is very convenient in order to build patterns from arbitrary strings:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 27
+ \snippet code/src_corelib_tools_qregularexpression.cpp 27
\note This function implements Perl's quotemeta algorithm and escapes with
a backslash all characters in \a str, except for the characters in the
@@ -1721,7 +1721,7 @@ QRegularExpression::MatchOptions QRegularExpressionMatch::matchOptions() const
including the implicit capturing group 0. This can be used to extract all
the substrings that were captured:
- \snippet doc/src/snippets/code/src_corelib_tools_qregularexpression.cpp 28
+ \snippet code/src_corelib_tools_qregularexpression.cpp 28
Note that some of the capturing groups with an index less than
lastCapturedIndex() could have not matched, and therefore captured nothing.
diff --git a/src/corelib/tools/qscopedpointer.cpp b/src/corelib/tools/qscopedpointer.cpp
index 5ecca89229..bf2cac453b 100644
--- a/src/corelib/tools/qscopedpointer.cpp
+++ b/src/corelib/tools/qscopedpointer.cpp
@@ -61,12 +61,12 @@ QT_BEGIN_NAMESPACE
Consider this function which does heap allocations, and have various exit points:
- \snippet doc/src/snippets/code/src_corelib_tools_qscopedpointer.cpp 0
+ \snippet code/src_corelib_tools_qscopedpointer.cpp 0
It's encumbered by the manual delete calls. With QScopedPointer, the code
can be simplified to:
- \snippet doc/src/snippets/code/src_corelib_tools_qscopedpointer.cpp 1
+ \snippet code/src_corelib_tools_qscopedpointer.cpp 1
The code the compiler generates for QScopedPointer is the same as when
writing it manually. Code that makes use of \a delete are candidates for
@@ -78,7 +78,7 @@ QT_BEGIN_NAMESPACE
The const qualification on a regular C++ pointer can also be expressed with
a QScopedPointer:
- \snippet doc/src/snippets/code/src_corelib_tools_qscopedpointer.cpp 2
+ \snippet code/src_corelib_tools_qscopedpointer.cpp 2
\section1 Custom cleanup handlers
@@ -99,7 +99,7 @@ QT_BEGIN_NAMESPACE
You can pass your own classes as handlers, provided that they have a public
static function \c{void cleanup(T *pointer)}.
- \snippet doc/src/snippets/code/src_corelib_tools_qscopedpointer.cpp 5
+ \snippet code/src_corelib_tools_qscopedpointer.cpp 5
\section1 Forward Declared Pointers
@@ -111,7 +111,7 @@ QT_BEGIN_NAMESPACE
points to a forward declared class must have non-inline constructors,
destructors and assignment operators:
- \snippet doc/src/snippets/code/src_corelib_tools_qscopedpointer.cpp 4
+ \snippet code/src_corelib_tools_qscopedpointer.cpp 4
Otherwise, the compiler output a warning about not being able to destruct
\c MyPrivateClass.
@@ -168,7 +168,7 @@ QT_BEGIN_NAMESPACE
Returns \c true if this object is not \c null. This function is suitable
for use in \tt if-constructs, like:
- \snippet doc/src/snippets/code/src_corelib_tools_qscopedpointer.cpp 3
+ \snippet code/src_corelib_tools_qscopedpointer.cpp 3
\sa isNull()
*/
diff --git a/src/corelib/tools/qset.qdoc b/src/corelib/tools/qset.qdoc
index b03cce884d..51d9caad70 100644
--- a/src/corelib/tools/qset.qdoc
+++ b/src/corelib/tools/qset.qdoc
@@ -40,19 +40,19 @@
Here's an example QSet with QString values:
- \snippet doc/src/snippets/code/doc_src_qset.cpp 0
+ \snippet code/doc_src_qset.cpp 0
To insert a value into the set, use insert():
- \snippet doc/src/snippets/code/doc_src_qset.cpp 1
+ \snippet code/doc_src_qset.cpp 1
Another way to insert items into the set is to use operator<<():
- \snippet doc/src/snippets/code/doc_src_qset.cpp 2
+ \snippet code/doc_src_qset.cpp 2
To test whether an item belongs to the set or not, use contains():
- \snippet doc/src/snippets/code/doc_src_qset.cpp 3
+ \snippet code/doc_src_qset.cpp 3
If you want to navigate through all the values stored in a QSet,
you can use an iterator. QSet supports both \l{Java-style
@@ -60,18 +60,18 @@
iterators} (QSet::iterator and QSet::const_iterator). Here's how
to iterate over a QSet<QWidget *> using a Java-style iterator:
- \snippet doc/src/snippets/code/doc_src_qset.cpp 4
+ \snippet code/doc_src_qset.cpp 4
Here's the same code, but using an STL-style iterator:
- \snippet doc/src/snippets/code/doc_src_qset.cpp 5
+ \snippet code/doc_src_qset.cpp 5
QSet is unordered, so an iterator's sequence cannot be assumed to
be predictable. If ordering by key is required, use a QMap.
To navigate through a QSet, you can also use \l{foreach}:
- \snippet doc/src/snippets/code/doc_src_qset.cpp 6
+ \snippet code/doc_src_qset.cpp 6
Items can be removed from the set using remove(). There is also a
clear() function that removes all items.
@@ -194,7 +194,7 @@
This function is useful for code that needs to build a huge set
and wants to avoid repeated reallocation. For example:
- \snippet doc/src/snippets/code/doc_src_qset.cpp 7
+ \snippet code/doc_src_qset.cpp 7
Ideally, \a size should be slightly more than the maximum number
of elements expected in the set. \a size doesn't have to be prime,
@@ -618,18 +618,18 @@
start iterating. Here's a typical loop that prints all the items
stored in a set:
- \snippet doc/src/snippets/code/doc_src_qset.cpp 8
+ \snippet code/doc_src_qset.cpp 8
Here's a loop that removes certain items (all those that start
with 'J') from a set while iterating:
- \snippet doc/src/snippets/code/doc_src_qset.cpp 9
+ \snippet code/doc_src_qset.cpp 9
STL-style iterators can be used as arguments to \l{generic
algorithms}. For example, here's how to find an item in the set
using the qFind() algorithm:
- \snippet doc/src/snippets/code/doc_src_qset.cpp 10
+ \snippet code/doc_src_qset.cpp 10
Multiple iterators can be used on the same set. However, you may
not attempt to modify the container while iterating on it.
@@ -661,13 +661,13 @@
start iterating. Here's a typical loop that prints all the items
stored in a set:
- \snippet doc/src/snippets/code/doc_src_qset.cpp 11
+ \snippet code/doc_src_qset.cpp 11
STL-style iterators can be used as arguments to \l{generic
algorithms}. For example, here's how to find an item in the set
using the qFind() algorithm:
- \snippet doc/src/snippets/code/doc_src_qset.cpp 12
+ \snippet code/doc_src_qset.cpp 12
Multiple iterators can be used on the same set. However, you may
not attempt to modify the container while iterating on it.
@@ -901,7 +901,7 @@
Example:
- \snippet doc/src/snippets/code/doc_src_qset.cpp 13
+ \snippet code/doc_src_qset.cpp 13
\sa fromList(), QList::fromSet(), qSort()
*/
@@ -926,7 +926,7 @@
Example:
- \snippet doc/src/snippets/code/doc_src_qset.cpp 14
+ \snippet code/doc_src_qset.cpp 14
\sa toList(), QList::toSet()
*/
diff --git a/src/corelib/tools/qshareddata.cpp b/src/corelib/tools/qshareddata.cpp
index ffc8ac601d..4c33bebd7b 100644
--- a/src/corelib/tools/qshareddata.cpp
+++ b/src/corelib/tools/qshareddata.cpp
@@ -99,7 +99,7 @@ QT_BEGIN_NAMESPACE
implicitly shared \c Employee class. In the header file we define the
two classes \c Employee and \c EmployeeData.
- \snippet doc/src/snippets/sharedemployee/employee.h 0
+ \snippet sharedemployee/employee.h 0
In class \c Employee, note the single data member, a \e {d pointer}
of type \c {QSharedDataPointer<EmployeeData>}. All accesses of
@@ -121,14 +121,14 @@ QT_BEGIN_NAMESPACE
straightforward. Both create a new instance of \c EmployeeData
and assign it to the \e{d pointer} .
- \snippet doc/src/snippets/sharedemployee/employee.h 1
+ \snippet sharedemployee/employee.h 1
\codeline
- \snippet doc/src/snippets/sharedemployee/employee.h 2
+ \snippet sharedemployee/employee.h 2
Note that class \c Employee also has a trivial copy constructor
defined, which is not strictly required in this case.
- \snippet doc/src/snippets/sharedemployee/employee.h 7
+ \snippet sharedemployee/employee.h 7
The copy constructor is not strictly required here, because class \c
EmployeeData is included in the same file as class \c Employee
@@ -162,9 +162,9 @@ QT_BEGIN_NAMESPACE
detach() to ensure that the function operates on its own copy of the
data.
- \snippet doc/src/snippets/sharedemployee/employee.h 3
+ \snippet sharedemployee/employee.h 3
\codeline
- \snippet doc/src/snippets/sharedemployee/employee.h 4
+ \snippet sharedemployee/employee.h 4
Note that if detach() is called more than once in a member function
due to multiple dereferences of the \e {d pointer}, detach() will
@@ -180,9 +180,9 @@ QT_BEGIN_NAMESPACE
In \c Employee's \e const member functions, dereferencing the \e {d
pointer} does \e not cause detach() to be called.
- \snippet doc/src/snippets/sharedemployee/employee.h 5
+ \snippet sharedemployee/employee.h 5
\codeline
- \snippet doc/src/snippets/sharedemployee/employee.h 6
+ \snippet sharedemployee/employee.h 6
Notice that there is no need to implement a copy constructor or an
assignment operator for the \c Employee class, because the copy
@@ -199,7 +199,7 @@ QT_BEGIN_NAMESPACE
Consider a simple example that creates two instances of the
implicitly shared \c Employee class.
- \snippet doc/src/snippets/sharedemployee/main.cpp 0
+ \snippet sharedemployee/main.cpp 0
After the second employee e2 is created and e1 is assigned to it,
both \c e1 and \c e2 refer to Albrecht Durer, employee 1001. Both \c
diff --git a/src/corelib/tools/qsimd.cpp b/src/corelib/tools/qsimd.cpp
index fb6219273f..ac21e5beb9 100644
--- a/src/corelib/tools/qsimd.cpp
+++ b/src/corelib/tools/qsimd.cpp
@@ -1,6 +1,7 @@
/****************************************************************************
**
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2012 Intel Corporation.
** Contact: http://www.qt-project.org/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -46,9 +47,12 @@
#if defined(Q_OS_WIN)
# if defined(Q_OS_WINCE)
# include <qt_windows.h>
+# include <cmnintrin.h>
# endif
# if !defined(Q_CC_GNU)
-# include <intrin.h>
+# ifndef Q_OS_WINCE
+# include <intrin.h>
+# endif
# endif
#elif defined(Q_OS_LINUX) && defined(__arm__)
#include "private/qcore_unix_p.h"
@@ -98,7 +102,7 @@ static inline uint detectProcessorFeatures()
return features;
}
-#elif defined(__arm__) || defined(__arm) || defined(QT_HAVE_IWMMXT) || defined(QT_HAVE_NEON)
+#elif defined(Q_PROCESSOR_ARM) || defined(QT_HAVE_IWMMXT) || defined(QT_HAVE_NEON)
static inline uint detectProcessorFeatures()
{
uint features = 0;
@@ -142,17 +146,22 @@ static inline uint detectProcessorFeatures()
return features;
}
-#elif defined(__i386__) || defined(_M_IX86)
-static inline uint detectProcessorFeatures()
-{
- uint features = 0;
+#elif defined(Q_PROCESSOR_X86)
- unsigned int extended_result = 0;
- unsigned int feature_result = 0;
- uint result = 0;
- /* see p. 118 of amd64 instruction set manual Vol3 */
+#ifdef Q_PROCESSOR_X86_32
+# define PICreg "%%ebx"
+#else
+# define PICreg "%%rbx"
+#endif
+
+static int maxBasicCpuidSupported()
+{
#if defined(Q_CC_GNU)
- long cpuid_supported, tmp1;
+ qintptr tmp1;
+
+# ifdef Q_PROCESSOR_X86_32
+ // check if the CPUID instruction is supported
+ long cpuid_supported;
asm ("pushf\n"
"pop %0\n"
"mov %0, %1\n"
@@ -164,146 +173,141 @@ static inline uint detectProcessorFeatures()
"xor %1, %0\n" // %eax is now 0 if CPUID is not supported
: "=a" (cpuid_supported), "=r" (tmp1)
);
- if (cpuid_supported) {
- asm ("xchg %%ebx, %2\n"
- "cpuid\n"
- "xchg %%ebx, %2\n"
- : "=&c" (feature_result), "=d" (result), "=&r" (tmp1)
- : "a" (1));
-
- asm ("xchg %%ebx, %1\n"
- "cpuid\n"
- "cmp $0x80000000, %%eax\n"
- "jnbe 1f\n"
- "xor %0, %0\n"
- "jmp 2f\n"
- "1:\n"
- "mov $0x80000001, %%eax\n"
- "cpuid\n"
- "2:\n"
- "xchg %%ebx, %1\n"
- : "=&d" (extended_result), "=&r" (tmp1)
- : "a" (0x80000000)
- : "%ecx"
- );
- }
+ if (!cpuid_supported)
+ return 0;
+# endif
-#elif defined (Q_OS_WIN)
- _asm {
- push eax
- push ebx
- push ecx
- push edx
- pushfd
- pop eax
- mov ebx, eax
- xor eax, 00200000h
- push eax
- popfd
- pushfd
- pop eax
- mov edx, 0
- xor eax, ebx
- jz skip
-
- mov eax, 1
- cpuid
- mov result, edx
- mov feature_result, ecx
- skip:
- pop edx
- pop ecx
- pop ebx
- pop eax
- }
+ int result;
+ asm ("xchg " PICreg", %1\n"
+ "cpuid\n"
+ "xchg " PICreg", %1\n"
+ : "=&a" (result), "=&r" (tmp1)
+ : "0" (0)
+ : "ecx", "edx");
+ return result;
+#elif defined(Q_OS_WIN)
+ // Use the __cpuid function; if the CPUID instruction isn't supported, it will return 0
+ int info[4];
+ __cpuid(info, 0);
+ return info[0];
+#else
+ return 0;
+#endif
+}
- _asm {
- push eax
- push ebx
- push ecx
- push edx
- pushfd
- pop eax
- mov ebx, eax
- xor eax, 00200000h
- push eax
- popfd
- pushfd
- pop eax
- mov edx, 0
- xor eax, ebx
- jz skip2
-
- mov eax, 80000000h
- cpuid
- cmp eax, 80000000h
- jbe skip2
- mov eax, 80000001h
- cpuid
- mov extended_result, edx
- skip2:
- pop edx
- pop ecx
- pop ebx
- pop eax
- }
+static void cpuidFeatures01(uint &ecx, uint &edx)
+{
+#if defined(Q_CC_GNU)
+ qintptr tmp1;
+ asm ("xchg " PICreg", %2\n"
+ "cpuid\n"
+ "xchg " PICreg", %2\n"
+ : "=&c" (ecx), "=&d" (edx), "=&r" (tmp1)
+ : "a" (1));
+#elif defined(Q_OS_WIN)
+ int info[4];
+ __cpuid(info, 1);
+ ecx = info[2];
+ edx = info[3];
#endif
+}
+static void cpuidFeatures07_00(uint &ebx)
+{
+#if defined(Q_CC_GNU)
+ quintptr rbx; // in case it's 64-bit
+ asm ("xchg " PICreg", %0\n"
+ "cpuid\n"
+ "xchg " PICreg", %0\n"
+ : "=&r" (rbx)
+ : "a" (7), "c" (0)
+ : "%edx");
+ ebx = rbx;
+#elif defined(Q_OS_WIN)
+ int info[4];
+ __cpuidex(info, 7, 0);
+ ebx = info[1];
+#endif
+}
- // result now contains the standard feature bits
- if (result & (1u << 26))
- features |= SSE2;
- if (feature_result & (1u))
- features |= SSE3;
- if (feature_result & (1u << 9))
- features |= SSSE3;
- if (feature_result & (1u << 19))
- features |= SSE4_1;
- if (feature_result & (1u << 20))
- features |= SSE4_2;
- if (feature_result & (1u << 28))
- features |= AVX;
+#ifdef Q_OS_WIN
+namespace QtXgetbvHack {
+ inline quint64 _xgetbv(int) { return 0; }
+}
+using namespace QtXgetbvHack;
+#endif
- return features;
+static void xgetbv(int in, uint &eax, uint &edx)
+{
+#ifdef Q_OS_WIN
+ quint64 result = _xgetbv(in);
+ eax = result;
+ edx = result >> 32;
+#elif defined(Q_CC_GNU)
+ asm (".byte 0x0F, 0x01, 0xD0" // xgetbv instruction
+ : "=a" (eax), "=d" (edx)
+ : "c" (in));
+#endif
}
-#elif defined(__x86_64) || defined(Q_OS_WIN64)
static inline uint detectProcessorFeatures()
{
- uint features = SSE2;
- uint feature_result = 0;
-
-#if defined (Q_OS_WIN64)
- {
- int info[4];
- __cpuid(info, 1);
- feature_result = info[2];
- }
-#elif defined(Q_CC_GNU)
- quint64 tmp;
- asm ("xchg %%rbx, %1\n"
- "cpuid\n"
- "xchg %%rbx, %1\n"
- : "=&c" (feature_result), "=&r" (tmp)
- : "a" (1)
- : "%edx"
- );
+ uint features = 0;
+ int cpuidLevel = maxBasicCpuidSupported();
+ if (cpuidLevel < 1)
+ return 0;
+
+ uint cpuid01ECX = 0, cpuid01EDX = 0;
+ cpuidFeatures01(cpuid01ECX, cpuid01EDX);
+#if defined(Q_PROCESSOR_X86_32)
+ // x86 might not have SSE2 support
+ if (cpuid01EDX & (1u << 26))
+ features |= SSE2;
+#else
+ // x86-64 or x32
+ features = SSE2;
#endif
- if (feature_result & (1u))
+ // common part between 32- and 64-bit
+ if (cpuid01ECX & (1u))
features |= SSE3;
- if (feature_result & (1u << 9))
+ if (cpuid01ECX & (1u << 9))
features |= SSSE3;
- if (feature_result & (1u << 19))
+ if (cpuid01ECX & (1u << 19))
features |= SSE4_1;
- if (feature_result & (1u << 20))
+ if (cpuid01ECX & (1u << 20))
features |= SSE4_2;
- if (feature_result & (1u << 28))
- features |= AVX;
+ if (cpuid01ECX & (1u << 25))
+ features |= 0; // AES, enable if needed
+
+ uint xgetbvA = 0, xgetbvD = 0;
+ if (cpuid01ECX & (1u << 27)) {
+ // XGETBV enabled
+ xgetbv(0, xgetbvA, xgetbvD);
+ }
+
+ uint cpuid0700EBX = 0;
+ if (cpuidLevel >= 7)
+ cpuidFeatures07_00(cpuid0700EBX);
+
+ if ((xgetbvA & 6) == 6) {
+ // support for YMM and XMM registers is enabled
+ if (cpuid01ECX & (1u << 28))
+ features |= AVX;
+
+ if (cpuid0700EBX & (1u << 5))
+ features |= AVX2;
+ }
+
+ if (cpuid0700EBX & (1u << 4))
+ features |= HLE; // Hardware Lock Ellision
+ if (cpuid0700EBX & (1u << 11))
+ features |= RTM; // Restricted Transactional Memory
return features;
}
+
#else
static inline uint detectProcessorFeatures()
{
@@ -322,6 +326,9 @@ static inline uint detectProcessorFeatures()
sse4.1
sse4.2
avx
+ avx2
+ hle
+ rtm
*/
// begin generated
@@ -334,11 +341,14 @@ static const char features_string[] =
" sse4.1\0"
" sse4.2\0"
" avx\0"
+ " avx2\0"
+ " hle\0"
+ " rtm\0"
"\0";
static const int features_indices[] = {
0, 8, 14, 20, 26, 33, 41, 49,
- -1
+ 54, 60, 65, -1
};
// end generated
@@ -384,8 +394,12 @@ static const uint minFeature = None
#else
int ffs(int i)
{
+#ifndef Q_OS_WINCE
unsigned long result;
return _BitScanForward(&result, i) ? result : 0;
+#else
+ return 0;
+#endif
}
#endif
#endif // Q_OS_WIN
diff --git a/src/corelib/tools/qsimd_p.h b/src/corelib/tools/qsimd_p.h
index 88ac7597e2..6374e20135 100644
--- a/src/corelib/tools/qsimd_p.h
+++ b/src/corelib/tools/qsimd_p.h
@@ -129,7 +129,10 @@ enum CPUFeatures {
SSSE3 = 0x10,
SSE4_1 = 0x20,
SSE4_2 = 0x40,
- AVX = 0x80
+ AVX = 0x80,
+ AVX2 = 0x100,
+ HLE = 0x200,
+ RTM = 0x400
};
Q_CORE_EXPORT uint qDetectCPUFeatures();
diff --git a/src/corelib/tools/qsize.cpp b/src/corelib/tools/qsize.cpp
index b276d2d2e0..b4b99d26ff 100644
--- a/src/corelib/tools/qsize.cpp
+++ b/src/corelib/tools/qsize.cpp
@@ -194,7 +194,7 @@ void QSize::transpose()
\endlist
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qsize.cpp 0
+ \snippet code/src_corelib_tools_qsize.cpp 0
\sa setWidth(), setHeight(), scaled()
*/
@@ -252,7 +252,7 @@ QSize QSize::scaled(const QSize &s, Qt::AspectRatioMode mode) const
Using a reference makes it possible to manipulate the width
directly. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qsize.cpp 1
+ \snippet code/src_corelib_tools_qsize.cpp 1
\sa rheight(), setWidth()
*/
@@ -265,7 +265,7 @@ QSize QSize::scaled(const QSize &s, Qt::AspectRatioMode mode) const
Using a reference makes it possible to manipulate the height
directly. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qsize.cpp 2
+ \snippet code/src_corelib_tools_qsize.cpp 2
\sa rwidth(), setHeight()
*/
@@ -276,7 +276,7 @@ QSize QSize::scaled(const QSize &s, Qt::AspectRatioMode mode) const
Adds the given \a size to \e this size, and returns a reference to
this size. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qsize.cpp 3
+ \snippet code/src_corelib_tools_qsize.cpp 3
*/
/*!
@@ -285,7 +285,7 @@ QSize QSize::scaled(const QSize &s, Qt::AspectRatioMode mode) const
Subtracts the given \a size from \e this size, and returns a
reference to this size. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qsize.cpp 4
+ \snippet code/src_corelib_tools_qsize.cpp 4
*/
/*!
@@ -622,7 +622,7 @@ void QSizeF::transpose()
\endlist
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qsize.cpp 5
+ \snippet code/src_corelib_tools_qsize.cpp 5
\sa setWidth(), setHeight(), scaled()
*/
@@ -636,11 +636,11 @@ void QSizeF::transpose()
*/
/*!
- \fn QSizeF QSizeF::scaled(int width, int height, Qt::AspectRatioMode mode) const
+ \fn QSizeF QSizeF::scaled(qreal width, qreal height, Qt::AspectRatioMode mode) const
\since 5.0
Returns a size scaled to a rectangle with the given \a width and
- \a height, according to the specified \mode.
+ \a height, according to the specified \a mode.
\sa scale()
*/
@@ -679,7 +679,7 @@ QSizeF QSizeF::scaled(const QSizeF &s, Qt::AspectRatioMode mode) const
Using a reference makes it possible to manipulate the width
directly. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qsize.cpp 6
+ \snippet code/src_corelib_tools_qsize.cpp 6
\sa rheight(), setWidth()
*/
@@ -692,7 +692,7 @@ QSizeF QSizeF::scaled(const QSizeF &s, Qt::AspectRatioMode mode) const
Using a reference makes it possible to manipulate the height
directly. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qsize.cpp 7
+ \snippet code/src_corelib_tools_qsize.cpp 7
\sa rwidth(), setHeight()
*/
@@ -703,7 +703,7 @@ QSizeF QSizeF::scaled(const QSizeF &s, Qt::AspectRatioMode mode) const
Adds the given \a size to this size and returns a reference to
this size. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qsize.cpp 8
+ \snippet code/src_corelib_tools_qsize.cpp 8
*/
/*!
@@ -712,7 +712,7 @@ QSizeF QSizeF::scaled(const QSizeF &s, Qt::AspectRatioMode mode) const
Subtracts the given \a size from this size and returns a reference
to this size. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qsize.cpp 9
+ \snippet code/src_corelib_tools_qsize.cpp 9
*/
/*!
diff --git a/src/corelib/tools/qsize.h b/src/corelib/tools/qsize.h
index 88af9e876b..0f8ef24acf 100644
--- a/src/corelib/tools/qsize.h
+++ b/src/corelib/tools/qsize.h
@@ -55,32 +55,32 @@ public:
Q_DECL_CONSTEXPR QSize();
Q_DECL_CONSTEXPR QSize(int w, int h);
- Q_DECL_CONSTEXPR bool isNull() const;
- Q_DECL_CONSTEXPR bool isEmpty() const;
- Q_DECL_CONSTEXPR bool isValid() const;
-
- Q_DECL_CONSTEXPR int width() const;
- Q_DECL_CONSTEXPR int height() const;
- void setWidth(int w);
- void setHeight(int h);
+ Q_DECL_CONSTEXPR inline bool isNull() const;
+ Q_DECL_CONSTEXPR inline bool isEmpty() const;
+ Q_DECL_CONSTEXPR inline bool isValid() const;
+
+ Q_DECL_CONSTEXPR inline int width() const;
+ Q_DECL_CONSTEXPR inline int height() const;
+ inline void setWidth(int w);
+ inline void setHeight(int h);
void transpose();
- Q_DECL_CONSTEXPR QSize transposed() const;
+ Q_DECL_CONSTEXPR inline QSize transposed() const;
- void scale(int w, int h, Qt::AspectRatioMode mode);
- void scale(const QSize &s, Qt::AspectRatioMode mode);
+ inline void scale(int w, int h, Qt::AspectRatioMode mode);
+ inline void scale(const QSize &s, Qt::AspectRatioMode mode);
QSize scaled(int w, int h, Qt::AspectRatioMode mode) const;
QSize scaled(const QSize &s, Qt::AspectRatioMode mode) const;
- Q_DECL_CONSTEXPR QSize expandedTo(const QSize &) const;
- Q_DECL_CONSTEXPR QSize boundedTo(const QSize &) const;
+ Q_DECL_CONSTEXPR inline QSize expandedTo(const QSize &) const;
+ Q_DECL_CONSTEXPR inline QSize boundedTo(const QSize &) const;
- int &rwidth();
- int &rheight();
+ inline int &rwidth();
+ inline int &rheight();
- QSize &operator+=(const QSize &);
- QSize &operator-=(const QSize &);
- QSize &operator*=(qreal c);
- QSize &operator/=(qreal c);
+ inline QSize &operator+=(const QSize &);
+ inline QSize &operator-=(const QSize &);
+ inline QSize &operator*=(qreal c);
+ inline QSize &operator/=(qreal c);
friend inline Q_DECL_CONSTEXPR bool operator==(const QSize &, const QSize &);
friend inline Q_DECL_CONSTEXPR bool operator!=(const QSize &, const QSize &);
@@ -215,32 +215,32 @@ public:
Q_DECL_CONSTEXPR QSizeF(const QSize &sz);
Q_DECL_CONSTEXPR QSizeF(qreal w, qreal h);
- bool isNull() const;
- Q_DECL_CONSTEXPR bool isEmpty() const;
- Q_DECL_CONSTEXPR bool isValid() const;
+ inline bool isNull() const;
+ Q_DECL_CONSTEXPR inline bool isEmpty() const;
+ Q_DECL_CONSTEXPR inline bool isValid() const;
- Q_DECL_CONSTEXPR qreal width() const;
- Q_DECL_CONSTEXPR qreal height() const;
- void setWidth(qreal w);
- void setHeight(qreal h);
+ Q_DECL_CONSTEXPR inline qreal width() const;
+ Q_DECL_CONSTEXPR inline qreal height() const;
+ inline void setWidth(qreal w);
+ inline void setHeight(qreal h);
void transpose();
- Q_DECL_CONSTEXPR QSizeF transposed() const;
+ Q_DECL_CONSTEXPR inline QSizeF transposed() const;
- void scale(qreal w, qreal h, Qt::AspectRatioMode mode);
- void scale(const QSizeF &s, Qt::AspectRatioMode mode);
+ inline void scale(qreal w, qreal h, Qt::AspectRatioMode mode);
+ inline void scale(const QSizeF &s, Qt::AspectRatioMode mode);
QSizeF scaled(qreal w, qreal h, Qt::AspectRatioMode mode) const;
QSizeF scaled(const QSizeF &s, Qt::AspectRatioMode mode) const;
- Q_DECL_CONSTEXPR QSizeF expandedTo(const QSizeF &) const;
- Q_DECL_CONSTEXPR QSizeF boundedTo(const QSizeF &) const;
+ Q_DECL_CONSTEXPR inline QSizeF expandedTo(const QSizeF &) const;
+ Q_DECL_CONSTEXPR inline QSizeF boundedTo(const QSizeF &) const;
- qreal &rwidth();
- qreal &rheight();
+ inline qreal &rwidth();
+ inline qreal &rheight();
- QSizeF &operator+=(const QSizeF &);
- QSizeF &operator-=(const QSizeF &);
- QSizeF &operator*=(qreal c);
- QSizeF &operator/=(qreal c);
+ inline QSizeF &operator+=(const QSizeF &);
+ inline QSizeF &operator-=(const QSizeF &);
+ inline QSizeF &operator*=(qreal c);
+ inline QSizeF &operator/=(qreal c);
friend Q_DECL_CONSTEXPR inline bool operator==(const QSizeF &, const QSizeF &);
friend Q_DECL_CONSTEXPR inline bool operator!=(const QSizeF &, const QSizeF &);
diff --git a/src/corelib/tools/qstack.cpp b/src/corelib/tools/qstack.cpp
index 888fbfa0b4..359705887e 100644
--- a/src/corelib/tools/qstack.cpp
+++ b/src/corelib/tools/qstack.cpp
@@ -58,7 +58,7 @@
Example:
- \snippet doc/src/snippets/qstack/main.cpp 0
+ \snippet qstack/main.cpp 0
The example will output 3, 2, 1 in that order.
diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp
index ed0c493c7a..04626742bd 100644
--- a/src/corelib/tools/qstring.cpp
+++ b/src/corelib/tools/qstring.cpp
@@ -421,7 +421,7 @@ const QString::Null QString::null = { };
Most of the QChar member functions also exist in QCharRef.
However, they are not explicitly documented here.
- \sa QString::operator[]() QString::at() QChar
+ \sa QString::operator[](), QString::at(), QChar
*/
/*!
@@ -467,7 +467,7 @@ const QString::Null QString::null = { };
*} to its constructor. For example, the following code creates a
QString of size 5 containing the data "Hello":
- \snippet doc/src/snippets/qstring/main.cpp 0
+ \snippet qstring/main.cpp 0
QString converts the \c{const char *} data into Unicode using the
fromAscii() function. fromAscii() treats ordinals above 128 as Latin-1
@@ -480,7 +480,7 @@ const QString::Null QString::null = { };
You can also provide string data as an array of \l{QChar}s:
- \snippet doc/src/snippets/qstring/main.cpp 1
+ \snippet qstring/main.cpp 1
QString makes a deep copy of the QChar data, so you can modify it
later without experiencing side effects. (If for performance
@@ -495,12 +495,12 @@ const QString::Null QString::null = { };
character that can be used on the left side of an assignment. For
example:
- \snippet doc/src/snippets/qstring/main.cpp 2
+ \snippet qstring/main.cpp 2
For read-only access, an alternative syntax is to use the at()
function:
- \snippet doc/src/snippets/qstring/main.cpp 3
+ \snippet qstring/main.cpp 3
The at() function can be faster than \l operator[](), because it
never causes a \l{deep copy} to occur. Alternatively, use the
@@ -519,7 +519,7 @@ const QString::Null QString::null = { };
usage. For example, if you want to compare a QString with a string
literal, you can write code like this and it will work as expected:
- \snippet doc/src/snippets/qstring/main.cpp 4
+ \snippet qstring/main.cpp 4
You can also pass string literals to functions that take QStrings
as arguments, invoking the QString(const char *)
@@ -534,7 +534,7 @@ const QString::Null QString::null = { };
character data: append(), prepend(), insert(), replace(), and
remove(). For example:
- \snippet doc/src/snippets/qstring/main.cpp 5
+ \snippet qstring/main.cpp 5
If you are building a QString gradually and know in advance
approximately how many characters the QString will contain, you
@@ -563,7 +563,7 @@ const QString::Null QString::null = { };
they return -1. For example, here's a typical loop that finds all
occurrences of a particular substring:
- \snippet doc/src/snippets/qstring/main.cpp 6
+ \snippet qstring/main.cpp 6
QString provides many functions for converting numbers into
strings and strings into numbers. See the arg() functions, the
@@ -642,14 +642,14 @@ const QString::Null QString::null = { };
application is to add the following entry to your
\l{qmake Project Files}{qmake project file}:
- \snippet doc/src/snippets/code/src_corelib_tools_qstring.cpp 0
+ \snippet code/src_corelib_tools_qstring.cpp 0
You then need to explicitly call fromAscii(), fromLatin1(),
fromUtf8(), or fromLocal8Bit() to construct a QString from an
8-bit string, or use the lightweight QLatin1String class, for
example:
- \snippet doc/src/snippets/code/src_corelib_tools_qstring.cpp 1
+ \snippet code/src_corelib_tools_qstring.cpp 1
Similarly, you must call toAscii(), toLatin1(), toUtf8(), or
toLocal8Bit() explicitly to convert the QString to an 8-bit
@@ -666,7 +666,7 @@ const QString::Null QString::null = { };
\l{implicitly shared}, QStrings may be treated like \c{int}s or
other basic types. For example:
- \snippet doc/src/snippets/qstring/main.cpp 7
+ \snippet qstring/main.cpp 7
The \c result variable, is a normal variable allocated on the
stack. When \c return is called, and because we're returning by
@@ -685,7 +685,7 @@ const QString::Null QString::null = { };
string with size 0. A null string is always empty, but an empty
string isn't necessarily null:
- \snippet doc/src/snippets/qstring/main.cpp 8
+ \snippet qstring/main.cpp 8
All functions except isNull() treat null strings the same as empty
strings. For example, toAscii().constData() returns a pointer to a
@@ -732,7 +732,7 @@ const QString::Null QString::null = { };
complex string from multiple substrings. You will often write code
like this:
- \snippet doc/src/snippets/qstring/stringbuilder.cpp 0
+ \snippet qstring/stringbuilder.cpp 0
There is nothing wrong with either of these string constructions,
but there are a few hidden inefficiencies. Beginning with Qt 4.6,
@@ -770,13 +770,13 @@ const QString::Null QString::null = { };
\c{QStringBuilder} wherever you want to use it, and use the
\c{'%'} operator instead of \c{'+'} when concatenating strings:
- \snippet doc/src/snippets/qstring/stringbuilder.cpp 5
+ \snippet qstring/stringbuilder.cpp 5
A more global approach which is the most convenient but
not entirely source compatible, is to this define in your
.pro file:
- \snippet doc/src/snippets/qstring/stringbuilder.cpp 3
+ \snippet qstring/stringbuilder.cpp 3
and the \c{'+'} will automatically be performed as the
\c{QStringBuilder} \c{'%'} everywhere.
@@ -1175,12 +1175,12 @@ QString::QString(QChar ch)
Example:
- \snippet doc/src/snippets/qstring/main.cpp 45
+ \snippet qstring/main.cpp 45
If you want to append a certain number of identical characters to
the string, use \l operator+=() as follows rather than resize():
- \snippet doc/src/snippets/qstring/main.cpp 46
+ \snippet qstring/main.cpp 46
If you want to expand the string so that it reaches a certain
width and fill the new positions with a particular character, use
@@ -1188,7 +1188,7 @@ QString::QString(QChar ch)
If \a size is negative, it is equivalent to passing zero.
- \snippet doc/src/snippets/qstring/main.cpp 47
+ \snippet qstring/main.cpp 47
\sa truncate(), reserve()
*/
@@ -1253,7 +1253,7 @@ void QString::resize(int size)
we're fairly sure that size is large enough to make a call to
reserve() worthwhile:
- \snippet doc/src/snippets/qstring/main.cpp 44
+ \snippet qstring/main.cpp 44
\sa squeeze(), capacity()
*/
@@ -1394,7 +1394,7 @@ QString &QString::operator=(QChar ch)
Example:
- \snippet doc/src/snippets/qstring/main.cpp 26
+ \snippet qstring/main.cpp 26
If the given \a position is greater than size(), the array is
first extended using resize().
@@ -1478,11 +1478,11 @@ QString& QString::insert(int i, QChar ch)
Example:
- \snippet doc/src/snippets/qstring/main.cpp 9
+ \snippet qstring/main.cpp 9
This is the same as using the insert() function:
- \snippet doc/src/snippets/qstring/main.cpp 10
+ \snippet qstring/main.cpp 10
The append() function is typically very fast (\l{constant time}),
because QString preallocates extra space at the end of the string
@@ -1574,7 +1574,7 @@ QString &QString::append(QChar ch)
Example:
- \snippet doc/src/snippets/qstring/main.cpp 36
+ \snippet qstring/main.cpp 36
\sa append(), insert()
*/
@@ -1629,7 +1629,7 @@ QString &QString::append(QChar ch)
position + \a n is beyond the end of the string, the string is
truncated at the specified \a position.
- \snippet doc/src/snippets/qstring/main.cpp 37
+ \snippet qstring/main.cpp 37
\sa insert(), replace()
*/
@@ -1680,7 +1680,7 @@ QString &QString::remove(const QString &str, Qt::CaseSensitivity cs)
Example:
- \snippet doc/src/snippets/qstring/main.cpp 38
+ \snippet qstring/main.cpp 38
This is the same as \c replace(ch, "", cs).
@@ -1713,7 +1713,7 @@ QString &QString::remove(QChar ch, Qt::CaseSensitivity cs)
Removes every occurrence of the regular expression \a rx in the
string, and returns a reference to the string. For example:
- \snippet doc/src/snippets/qstring/main.cpp 39
+ \snippet qstring/main.cpp 39
\sa indexOf(), lastIndexOf(), replace()
*/
@@ -1725,7 +1725,7 @@ QString &QString::remove(QChar ch, Qt::CaseSensitivity cs)
Removes every occurrence of the regular expression \a re in the
string, and returns a reference to the string. For example:
- \snippet doc/src/snippets/qstring/main.cpp 96
+ \snippet qstring/main.cpp 96
\sa indexOf(), lastIndexOf(), replace()
*/
@@ -1738,7 +1738,7 @@ QString &QString::remove(QChar ch, Qt::CaseSensitivity cs)
Example:
- \snippet doc/src/snippets/qstring/main.cpp 40
+ \snippet qstring/main.cpp 40
\sa insert(), remove()
*/
@@ -1789,13 +1789,13 @@ QString &QString::replace(int pos, int len, QChar after)
Example:
- \snippet doc/src/snippets/qstring/main.cpp 41
+ \snippet qstring/main.cpp 41
\note The replacement text is not rescanned after it is inserted.
Example:
- \snippet doc/src/snippets/qstring/main.cpp 86
+ \snippet qstring/main.cpp 86
*/
QString &QString::replace(const QString &before, const QString &after, Qt::CaseSensitivity cs)
{
@@ -2214,7 +2214,7 @@ bool QString::operator<(const QLatin1String &other) const
\overload operator<()
The \a other byte array is converted to a QString using the
- fromAscii() function. If any NUL characters ('\0') are embedded
+ fromAscii() function. If any NUL characters ('\\0') are embedded
in the byte array, they will be included in the transformation.
You can disable this operator by defining \c
@@ -2236,8 +2236,7 @@ bool QString::operator<(const QLatin1String &other) const
go through QObject::tr(), for example.
*/
-/*! \fn bool operator<=(const QString &s1, const QString &s2)
- \relates QString
+/*! \fn bool QString::operator<=(const QString &s1, const QString &s2)
Returns true if string \a s1 is lexically less than or equal to
string \a s2; otherwise returns false.
@@ -2258,7 +2257,7 @@ bool QString::operator<(const QLatin1String &other) const
\overload operator<=()
The \a other byte array is converted to a QString using the
- fromAscii() function. If any NUL characters ('\0') are embedded
+ fromAscii() function. If any NUL characters ('\\0') are embedded
in the byte array, they will be included in the transformation.
You can disable this operator by defining \c
@@ -2280,8 +2279,7 @@ bool QString::operator<(const QLatin1String &other) const
go through QObject::tr(), for example.
*/
-/*! \fn bool operator>(const QString &s1, const QString &s2)
- \relates QString
+/*! \fn bool QString::operator>(const QString &s1, const QString &s2)
Returns true if string \a s1 is lexically greater than string \a
s2; otherwise returns false.
@@ -2318,7 +2316,7 @@ bool QString::operator>(const QLatin1String &other) const
\overload operator>()
The \a other byte array is converted to a QString using the
- fromAscii() function. If any NUL characters ('\0') are embedded
+ fromAscii() function. If any NUL characters ('\\0') are embedded
in the byte array, they will be included in the transformation.
You can disable this operator by defining \c
@@ -2362,7 +2360,7 @@ bool QString::operator>(const QLatin1String &other) const
\overload operator>=()
The \a other byte array is converted to a QString using the
- fromAscii() function. If any NUL characters ('\0') are embedded in
+ fromAscii() function. If any NUL characters ('\\0') are embedded in
the byte array, they will be included in the transformation.
You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII
@@ -2406,7 +2404,7 @@ bool QString::operator>(const QLatin1String &other) const
\overload operator!=()
The \a other byte array is converted to a QString using the
- fromAscii() function. If any NUL characters ('\0') are embedded
+ fromAscii() function. If any NUL characters ('\\0') are embedded
in the byte array, they will be included in the transformation.
You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII
@@ -2438,7 +2436,7 @@ bool QString::operator>(const QLatin1String &other) const
Example:
- \snippet doc/src/snippets/qstring/main.cpp 24
+ \snippet qstring/main.cpp 24
If \a from is -1, the search starts at the last character; if it is
-2, at the next to last character and so on.
@@ -2461,7 +2459,7 @@ int QString::indexOf(const QString &str, int from, Qt::CaseSensitivity cs) const
Example:
- \snippet doc/src/snippets/qstring/main.cpp 24
+ \snippet qstring/main.cpp 24
If \a from is -1, the search starts at the last character; if it is
-2, at the next to last character and so on.
@@ -2636,7 +2634,7 @@ static int lastIndexOfHelper(const ushort *haystack, int from, const ushort *nee
Example:
- \snippet doc/src/snippets/qstring/main.cpp 29
+ \snippet qstring/main.cpp 29
\sa indexOf(), contains(), count()
*/
@@ -2675,7 +2673,7 @@ int QString::lastIndexOf(const QString &str, int from, Qt::CaseSensitivity cs) c
Example:
- \snippet doc/src/snippets/qstring/main.cpp 29
+ \snippet qstring/main.cpp 29
\sa indexOf(), contains(), count()
*/
@@ -2765,13 +2763,13 @@ struct QStringCapture
string with \a after. Returns a reference to the string. For
example:
- \snippet doc/src/snippets/qstring/main.cpp 42
+ \snippet qstring/main.cpp 42
For regular expressions containing \l{capturing parentheses},
occurrences of \b{\\1}, \b{\\2}, ..., in \a after are replaced
with \a{rx}.cap(1), cap(2), ...
- \snippet doc/src/snippets/qstring/main.cpp 43
+ \snippet qstring/main.cpp 43
\sa indexOf(), lastIndexOf(), remove(), QRegExp::cap()
*/
@@ -2923,13 +2921,13 @@ QString& QString::replace(const QRegExp &rx, const QString &after)
string with \a after. Returns a reference to the string. For
example:
- \snippet doc/src/snippets/qstring/main.cpp 87
+ \snippet qstring/main.cpp 87
For regular expressions containing capturing groups,
- occurrences of \bold{\\1}, \bold{\\2}, ..., in \a after are replaced
+ occurrences of \b{\\1}, \b{\\2}, ..., in \a after are replaced
with the string captured by the corresponding capturing group.
- \snippet doc/src/snippets/qstring/main.cpp 88
+ \snippet qstring/main.cpp 88
\sa indexOf(), lastIndexOf(), remove(), QRegularExpression, QRegularExpressionMatch
*/
@@ -3097,7 +3095,7 @@ int QString::count(const QStringRef &str, Qt::CaseSensitivity cs) const
case sensitive; otherwise the search is case insensitive.
Example:
- \snippet doc/src/snippets/qstring/main.cpp 17
+ \snippet qstring/main.cpp 17
\sa indexOf(), count()
*/
@@ -3151,7 +3149,7 @@ int QString::count(const QStringRef &str, Qt::CaseSensitivity cs) const
Example:
- \snippet doc/src/snippets/qstring/main.cpp 25
+ \snippet qstring/main.cpp 25
*/
int QString::indexOf(const QRegExp& rx, int from) const
{
@@ -3172,7 +3170,7 @@ int QString::indexOf(const QRegExp& rx, int from) const
Example:
- \snippet doc/src/snippets/qstring/main.cpp 25
+ \snippet qstring/main.cpp 25
*/
int QString::indexOf(QRegExp& rx, int from) const
{
@@ -3188,7 +3186,7 @@ int QString::indexOf(QRegExp& rx, int from) const
Example:
- \snippet doc/src/snippets/qstring/main.cpp 30
+ \snippet qstring/main.cpp 30
*/
int QString::lastIndexOf(const QRegExp& rx, int from) const
{
@@ -3209,7 +3207,7 @@ int QString::lastIndexOf(const QRegExp& rx, int from) const
Example:
- \snippet doc/src/snippets/qstring/main.cpp 30
+ \snippet qstring/main.cpp 30
*/
int QString::lastIndexOf(QRegExp& rx, int from) const
{
@@ -3225,7 +3223,7 @@ int QString::lastIndexOf(QRegExp& rx, int from) const
This function counts overlapping matches, so in the example
below, there are four instances of "ana" or "ama":
- \snippet doc/src/snippets/qstring/main.cpp 18
+ \snippet qstring/main.cpp 18
*/
int QString::count(const QRegExp& rx) const
@@ -3256,7 +3254,7 @@ int QString::count(const QRegExp& rx) const
Example:
- \snippet doc/src/snippets/qstring/main.cpp 93
+ \snippet qstring/main.cpp 93
*/
int QString::indexOf(const QRegularExpression& re, int from) const
{
@@ -3282,7 +3280,7 @@ int QString::indexOf(const QRegularExpression& re, int from) const
Example:
- \snippet doc/src/snippets/qstring/main.cpp 94
+ \snippet qstring/main.cpp 94
*/
int QString::lastIndexOf(const QRegularExpression &re, int from) const
{
@@ -3333,7 +3331,7 @@ bool QString::contains(const QRegularExpression &re) const
This function counts overlapping matches, so in the example
below, there are four instances of "ana" or "ama":
- \snippet doc/src/snippets/qstring/main.cpp 95
+ \snippet qstring/main.cpp 95
*/
int QString::count(const QRegularExpression &re) const
{
@@ -3408,13 +3406,13 @@ int QString::count(const QRegularExpression &re) const
to skip empty fields and how to deal with leading and trailing
separators; see \l{SectionFlags}.
- \snippet doc/src/snippets/qstring/main.cpp 52
+ \snippet qstring/main.cpp 52
If \a start or \a end is negative, we count fields from the right
of the string, the right-most field being -1, the one from
right-most field being -2, and so on.
- \snippet doc/src/snippets/qstring/main.cpp 53
+ \snippet qstring/main.cpp 53
\sa split()
*/
@@ -3422,8 +3420,8 @@ int QString::count(const QRegularExpression &re) const
/*!
\overload section()
- \snippet doc/src/snippets/qstring/main.cpp 51
- \snippet doc/src/snippets/qstring/main.cpp 54
+ \snippet qstring/main.cpp 51
+ \snippet qstring/main.cpp 54
\sa split()
*/
@@ -3532,12 +3530,12 @@ static QString extractSections(const QList<qt_section_chunk> &sections,
This string is treated as a sequence of fields separated by the
regular expression, \a reg.
- \snippet doc/src/snippets/qstring/main.cpp 55
+ \snippet qstring/main.cpp 55
\warning Using this QRegExp version is much more expensive than
the overloaded string and character versions.
- \sa split() simplified()
+ \sa split(), simplified()
*/
QString QString::section(const QRegExp &reg, int start, int end, SectionFlags flags) const
{
@@ -3572,12 +3570,12 @@ QString QString::section(const QRegExp &reg, int start, int end, SectionFlags fl
This string is treated as a sequence of fields separated by the
regular expression, \a re.
- \snippet doc/src/snippets/qstring/main.cpp 89
+ \snippet qstring/main.cpp 89
\warning Using this QRegularExpression version is much more expensive than
the overloaded string and character versions.
- \sa split() simplified()
+ \sa split(), simplified()
*/
QString QString::section(const QRegularExpression &re, int start, int end, SectionFlags flags) const
{
@@ -3618,7 +3616,7 @@ QString QString::section(const QRegularExpression &re, int start, int end, Secti
The entire string is returned if \a n is greater than size() or
less than zero.
- \snippet doc/src/snippets/qstring/main.cpp 31
+ \snippet qstring/main.cpp 31
\sa right(), mid(), startsWith()
*/
@@ -3636,7 +3634,7 @@ QString QString::left(int n) const
The entire string is returned if \a n is greater than size() or
less than zero.
- \snippet doc/src/snippets/qstring/main.cpp 48
+ \snippet qstring/main.cpp 48
\sa left(), mid(), endsWith()
*/
@@ -3659,7 +3657,7 @@ QString QString::right(int n) const
Example:
- \snippet doc/src/snippets/qstring/main.cpp 34
+ \snippet qstring/main.cpp 34
\sa left(), right()
*/
@@ -3690,7 +3688,7 @@ QString QString::mid(int position, int n) const
If \a cs is Qt::CaseSensitive (default), the search is
case sensitive; otherwise the search is case insensitive.
- \snippet doc/src/snippets/qstring/main.cpp 65
+ \snippet qstring/main.cpp 65
\sa endsWith()
*/
@@ -3746,7 +3744,7 @@ bool QString::startsWith(const QStringRef &s, Qt::CaseSensitivity cs) const
If \a cs is Qt::CaseSensitive (default), the search is case
sensitive; otherwise the search is case insensitive.
- \snippet doc/src/snippets/qstring/main.cpp 20
+ \snippet qstring/main.cpp 20
\sa startsWith()
*/
@@ -4248,7 +4246,7 @@ QString& QString::setUnicode(const QChar *unicode, int size)
Example:
- \snippet doc/src/snippets/qstring/main.cpp 57
+ \snippet qstring/main.cpp 57
\sa trimmed()
*/
@@ -4338,7 +4336,7 @@ QString QString::simplified() const
Example:
- \snippet doc/src/snippets/qstring/main.cpp 82
+ \snippet qstring/main.cpp 82
Unlike simplified(), trimmed() leaves internal whitespace alone.
@@ -4386,7 +4384,7 @@ QString QString::trimmed() const
Example:
- \snippet doc/src/snippets/qstring/main.cpp 85
+ \snippet qstring/main.cpp 85
The return value is of type QCharRef, a helper class for QString.
When you get an object of type QCharRef, you can use it as if it
@@ -4425,7 +4423,7 @@ modifiable reference. Equivalent to \c at(position).
Example:
- \snippet doc/src/snippets/qstring/main.cpp 83
+ \snippet qstring/main.cpp 83
If \a position is negative, it is equivalent to passing zero.
@@ -4445,7 +4443,7 @@ void QString::truncate(int pos)
If \a n is greater than size(), the result is an empty string.
Example:
- \snippet doc/src/snippets/qstring/main.cpp 15
+ \snippet qstring/main.cpp 15
If you want to remove characters from the \e beginning of the
string, use remove() instead.
@@ -4465,7 +4463,7 @@ void QString::chop(int n)
Example:
- \snippet doc/src/snippets/qstring/main.cpp 21
+ \snippet qstring/main.cpp 21
\sa resize()
*/
@@ -4504,7 +4502,7 @@ QString& QString::fill(QChar ch, int size)
Example:
- \snippet doc/src/snippets/qstring/main.cpp 58
+ \snippet qstring/main.cpp 58
\sa isEmpty(), resize()
*/
@@ -4515,7 +4513,7 @@ QString& QString::fill(QChar ch, int size)
Example:
- \snippet doc/src/snippets/qstring/main.cpp 28
+ \snippet qstring/main.cpp 28
Qt makes a distinction between null strings and empty strings for
historical reasons. For most applications, what matters is
@@ -4532,7 +4530,7 @@ QString& QString::fill(QChar ch, int size)
Example:
- \snippet doc/src/snippets/qstring/main.cpp 27
+ \snippet qstring/main.cpp 27
\sa size()
*/
@@ -4544,7 +4542,7 @@ QString& QString::fill(QChar ch, int size)
Example:
- \snippet doc/src/snippets/qstring/main.cpp 84
+ \snippet qstring/main.cpp 84
This operation is typically very fast (\l{constant time}),
because QString preallocates extra space at the end of the string
@@ -4566,7 +4564,7 @@ QString& QString::fill(QChar ch, int size)
\overload operator+=()
Appends the byte array \a ba to this string. The byte array is converted
- to Unicode using the fromAscii() function. If any NUL characters ('\0')
+ to Unicode using the fromAscii() function. If any NUL characters ('\\0')
are embedded in the \a ba byte array, they will be included in the
transformation.
@@ -4773,7 +4771,7 @@ QString& QString::fill(QChar ch, int size)
a human would expect. Consider sorting user-visible strings with
localeAwareCompare().
- \snippet doc/src/snippets/qstring/main.cpp 16
+ \snippet qstring/main.cpp 16
\sa operator==(), operator<(), operator>()
*/
@@ -5057,13 +5055,13 @@ const ushort *QString::utf16() const
If \a truncate is false and the size() of the string is more than
\a width, then the returned string is a copy of the string.
- \snippet doc/src/snippets/qstring/main.cpp 32
+ \snippet qstring/main.cpp 32
If \a truncate is true and the size() of the string is more than
\a width, then any characters in a copy of the string after
position \a width are removed, and the copy is returned.
- \snippet doc/src/snippets/qstring/main.cpp 33
+ \snippet qstring/main.cpp 33
\sa rightJustified()
*/
@@ -5093,7 +5091,7 @@ QString QString::leftJustified(int width, QChar fill, bool truncate) const
Returns a string of size() \a width that contains the \a fill
character followed by the string. For example:
- \snippet doc/src/snippets/qstring/main.cpp 49
+ \snippet qstring/main.cpp 49
If \a truncate is false and the size() of the string is more than
\a width, then the returned string is a copy of the string.
@@ -5102,7 +5100,7 @@ QString QString::leftJustified(int width, QChar fill, bool truncate) const
\a width, then the resulting string is truncated at position \a
width.
- \snippet doc/src/snippets/qstring/main.cpp 50
+ \snippet qstring/main.cpp 50
\sa leftJustified()
*/
@@ -5131,7 +5129,7 @@ QString QString::rightJustified(int width, QChar fill, bool truncate) const
/*!
Returns a lowercase copy of the string.
- \snippet doc/src/snippets/qstring/main.cpp 75
+ \snippet qstring/main.cpp 75
The case conversion will always happen in the 'C' locale. For locale dependent
case folding use QLocale::toLower()
@@ -5233,7 +5231,20 @@ QString QString::toCaseFolded() const
prop = qGetProp(*p);
}
if (prop->caseFoldSpecial) {
+ const ushort *specialCase = specialCaseMap + prop->caseFoldDiff;
+ ushort length = *specialCase++;
+#if 0
+ int pos = pp - s.d->data;
+ s.resize(s.d->size + length - 1);
+ pp = s.d->data + pos;
+ while (length--)
+ *pp++ = *specialCase++;
+#else
//### we currently don't support full case foldings
+ Q_ASSERT(length == 1);
+ Q_UNUSED(length)
+ *pp++ = *specialCase;
+#endif
} else {
*pp++ = *p + prop->caseFoldDiff;
}
@@ -5254,7 +5265,7 @@ QString QString::toCaseFolded() const
/*!
Returns an uppercase copy of the string.
- \snippet doc/src/snippets/qstring/main.cpp 81
+ \snippet qstring/main.cpp 81
The case conversion will always happen in the 'C' locale. For locale dependent
case folding use QLocale::toUpper()
@@ -5337,14 +5348,14 @@ QString QString::toUpper() const
\c{long long}). If you need those, use the standard snprintf()
function instead:
- \snippet doc/src/snippets/qstring/main.cpp 63
+ \snippet qstring/main.cpp 63
\warning We do not recommend using QString::sprintf() in new Qt
code. Instead, consider using QTextStream or arg(), both of
which support Unicode strings seamlessly and are type-safe.
Here's an example that uses QTextStream:
- \snippet doc/src/snippets/qstring/main.cpp 64
+ \snippet qstring/main.cpp 64
For \l {QObject::tr()}{translations}, especially if the strings
contains more than one escape sequence, you should consider using
@@ -5552,7 +5563,7 @@ QString &QString::vsprintf(const char* cformat, va_list ap)
case lm_t: i = va_arg(ap, int); break;
default: i = 0; break;
}
- subst = locale.d()->longLongToString(i, precision, 10, width, flags);
+ subst = locale.d->longLongToString(i, precision, 10, width, flags);
++c;
break;
}
@@ -5584,7 +5595,7 @@ QString &QString::vsprintf(const char* cformat, va_list ap)
base = 16; break;
default: break;
}
- subst = locale.d()->unsLongLongToString(u, precision, base, width, flags);
+ subst = locale.d->unsLongLongToString(u, precision, base, width, flags);
++c;
break;
}
@@ -5613,7 +5624,7 @@ QString &QString::vsprintf(const char* cformat, va_list ap)
case 'g': form = QLocalePrivate::DFSignificantDigits; break;
default: break;
}
- subst = locale.d()->doubleToString(d, precision, form, width, flags);
+ subst = locale.d->doubleToString(d, precision, form, width, flags);
++c;
break;
}
@@ -5647,7 +5658,7 @@ QString &QString::vsprintf(const char* cformat, va_list ap)
quint64 i = reinterpret_cast<unsigned long>(arg);
#endif
flags |= QLocalePrivate::Alternate;
- subst = locale.d()->unsLongLongToString(i, precision, 16, width, flags);
+ subst = locale.d->unsLongLongToString(i, precision, 16, width, flags);
++c;
break;
}
@@ -5717,7 +5728,7 @@ QString &QString::vsprintf(const char* cformat, va_list ap)
Example:
- \snippet doc/src/snippets/qstring/main.cpp 74
+ \snippet qstring/main.cpp 74
\sa number(), toULongLong(), toInt(), QLocale::toLongLong()
*/
@@ -5732,7 +5743,7 @@ qint64 QString::toLongLong(bool *ok, int base) const
#endif
QLocale c_locale(QLocale::C);
- return c_locale.d()->stringToLongLong(*this, base, ok, QLocalePrivate::FailOnGroupSeparators);
+ return c_locale.d->stringToLongLong(*this, base, ok, QLocalePrivate::FailOnGroupSeparators);
}
/*!
@@ -5752,7 +5763,7 @@ qint64 QString::toLongLong(bool *ok, int base) const
Example:
- \snippet doc/src/snippets/qstring/main.cpp 79
+ \snippet qstring/main.cpp 79
\sa number(), toLongLong(), QLocale::toULongLong()
*/
@@ -5767,7 +5778,7 @@ quint64 QString::toULongLong(bool *ok, int base) const
#endif
QLocale c_locale(QLocale::C);
- return c_locale.d()->stringToUnsLongLong(*this, base, ok, QLocalePrivate::FailOnGroupSeparators);
+ return c_locale.d->stringToUnsLongLong(*this, base, ok, QLocalePrivate::FailOnGroupSeparators);
}
/*!
@@ -5789,7 +5800,7 @@ quint64 QString::toULongLong(bool *ok, int base) const
Example:
- \snippet doc/src/snippets/qstring/main.cpp 73
+ \snippet qstring/main.cpp 73
\sa number(), toULong(), toInt(), QLocale::toLong()
*/
@@ -5824,7 +5835,7 @@ long QString::toLong(bool *ok, int base) const
Example:
- \snippet doc/src/snippets/qstring/main.cpp 78
+ \snippet qstring/main.cpp 78
\sa number(), QLocale::toULong()
*/
@@ -5858,7 +5869,7 @@ ulong QString::toULong(bool *ok, int base) const
Example:
- \snippet doc/src/snippets/qstring/main.cpp 72
+ \snippet qstring/main.cpp 72
\sa number(), toUInt(), toDouble(), QLocale::toInt()
*/
@@ -5891,7 +5902,7 @@ int QString::toInt(bool *ok, int base) const
Example:
- \snippet doc/src/snippets/qstring/main.cpp 77
+ \snippet qstring/main.cpp 77
\sa number(), toInt(), QLocale::toUInt()
*/
@@ -5924,7 +5935,7 @@ uint QString::toUInt(bool *ok, int base) const
Example:
- \snippet doc/src/snippets/qstring/main.cpp 76
+ \snippet qstring/main.cpp 76
\sa number(), toUShort(), toInt(), QLocale::toShort()
*/
@@ -5957,7 +5968,7 @@ short QString::toShort(bool *ok, int base) const
Example:
- \snippet doc/src/snippets/qstring/main.cpp 80
+ \snippet qstring/main.cpp 80
\sa number(), toShort(), QLocale::toUShort()
*/
@@ -5982,31 +5993,31 @@ ushort QString::toUShort(bool *ok, int base) const
If a conversion error occurs, \c{*}\a{ok} is set to false;
otherwise \c{*}\a{ok} is set to true.
- \snippet doc/src/snippets/qstring/main.cpp 66
+ \snippet qstring/main.cpp 66
Various string formats for floating point numbers can be converted
to double values:
- \snippet doc/src/snippets/qstring/main.cpp 67
+ \snippet qstring/main.cpp 67
The string conversion will always happen in the 'C' locale. For locale
dependent conversion use QLocale::toDouble()
- \snippet doc/src/snippets/qstring/main.cpp 68
+ \snippet qstring/main.cpp 68
For historic reasons, this function does not handle
thousands group separators. If you need to convert such numbers,
use QLocale::toDouble().
- \snippet doc/src/snippets/qstring/main.cpp 69
+ \snippet qstring/main.cpp 69
- \sa number() QLocale::setDefault() QLocale::toDouble() trimmed()
+ \sa number(), QLocale::setDefault(), QLocale::toDouble(), trimmed()
*/
double QString::toDouble(bool *ok) const
{
QLocale c_locale(QLocale::C);
- return c_locale.d()->stringToDouble(*this, ok, QLocalePrivate::FailOnGroupSeparators);
+ return c_locale.d->stringToDouble(*this, ok, QLocalePrivate::FailOnGroupSeparators);
}
/*!
@@ -6020,7 +6031,7 @@ double QString::toDouble(bool *ok) const
Example:
- \snippet doc/src/snippets/qstring/main.cpp 71
+ \snippet qstring/main.cpp 71
\sa number(), toDouble(), toInt(), QLocale::toFloat()
*/
@@ -6049,7 +6060,7 @@ float QString::toFloat(bool *ok) const
The base is 10 by default and must be between 2 and 36. For bases
other than 10, \a n is treated as an unsigned integer.
- \snippet doc/src/snippets/qstring/main.cpp 56
+ \snippet qstring/main.cpp 56
The formatting always uses QLocale::C, i.e., English/UnitedStates.
To get a localized string representation of a number, use
@@ -6083,7 +6094,7 @@ QString &QString::setNum(qlonglong n, int base)
}
#endif
QLocale locale(QLocale::C);
- *this = locale.d()->longLongToString(n, -1, base);
+ *this = locale.d->longLongToString(n, -1, base);
return *this;
}
@@ -6099,7 +6110,7 @@ QString &QString::setNum(qulonglong n, int base)
}
#endif
QLocale locale(QLocale::C);
- *this = locale.d()->unsLongLongToString(n, -1, base);
+ *this = locale.d->unsLongLongToString(n, -1, base);
return *this;
}
@@ -6156,7 +6167,7 @@ QString &QString::setNum(double n, char f, int prec)
}
QLocale locale(QLocale::C);
- *this = locale.d()->doubleToString(n, prec, form, -1, flags);
+ *this = locale.d->doubleToString(n, prec, form, -1, flags);
return *this;
}
@@ -6188,7 +6199,7 @@ QString &QString::setNum(double n, char f, int prec)
To get a localized string representation of a number, use
QLocale::toString() with the appropriate locale.
- \snippet doc/src/snippets/qstring/main.cpp 35
+ \snippet qstring/main.cpp 35
\sa setNum()
*/
@@ -6286,7 +6297,7 @@ QString QString::number(double n, char f, int prec)
Example:
- \snippet doc/src/snippets/qstring/main.cpp 62
+ \snippet qstring/main.cpp 62
\sa QStringList::join(), section()
*/
@@ -6337,18 +6348,18 @@ QStringList QString::split(QChar sep, SplitBehavior behavior, Qt::CaseSensitivit
Here's an example where we extract the words in a sentence
using one or more whitespace characters as the separator:
- \snippet doc/src/snippets/qstring/main.cpp 59
+ \snippet qstring/main.cpp 59
Here's a similar example, but this time we use any sequence of
non-word characters as the separator:
- \snippet doc/src/snippets/qstring/main.cpp 60
+ \snippet qstring/main.cpp 60
Here's a third example where we use a zero-length assertion,
\b{\\b} (word boundary), to split the string into an
alternating sequence of non-word and word tokens:
- \snippet doc/src/snippets/qstring/main.cpp 61
+ \snippet qstring/main.cpp 61
\sa QStringList::join(), section()
*/
@@ -6386,18 +6397,18 @@ QStringList QString::split(const QRegExp &rx, SplitBehavior behavior) const
Here's an example where we extract the words in a sentence
using one or more whitespace characters as the separator:
- \snippet doc/src/snippets/qstring/main.cpp 90
+ \snippet qstring/main.cpp 90
Here's a similar example, but this time we use any sequence of
non-word characters as the separator:
- \snippet doc/src/snippets/qstring/main.cpp 91
+ \snippet qstring/main.cpp 91
Here's a third example where we use a zero-length assertion,
- \bold{\\b} (word boundary), to split the string into an
+ \b{\\b} (word boundary), to split the string into an
alternating sequence of non-word and word tokens:
- \snippet doc/src/snippets/qstring/main.cpp 92
+ \snippet qstring/main.cpp 92
\sa QStringList::join(), section()
*/
@@ -6738,7 +6749,7 @@ static QString replaceArgEscapes(const QString &s, const ArgEscapeData &d, int f
This example shows how we might create a \c status string for
reporting progress while processing a list of files:
- \snippet doc/src/snippets/qstring/main.cpp 11
+ \snippet qstring/main.cpp 11
First, \c arg(i) replaces \c %1. Then \c arg(total) replaces \c
%2. Finally, \c arg(fileName) replaces \c %3.
@@ -6774,7 +6785,7 @@ QString QString::arg(const QString &a, int fieldWidth, QChar fillChar) const
strings \a a1 and \a a2 are replaced in one pass. This can make a
difference if \a a1 contains e.g. \c{%1}:
- \snippet doc/src/snippets/qstring/main.cpp 13
+ \snippet qstring/main.cpp 13
*/
/*!
@@ -6861,8 +6872,8 @@ QString QString::arg(const QString &a, int fieldWidth, QChar fillChar) const
locale was specified, the "C" locale is used. The 'L' flag is
ignored if \a base is not 10.
- \snippet doc/src/snippets/qstring/main.cpp 12
- \snippet doc/src/snippets/qstring/main.cpp 14
+ \snippet qstring/main.cpp 12
+ \snippet qstring/main.cpp 14
If \a fillChar is '0' (the number 0, ASCII 48), the locale's zero is
used. For negative numbers, zero padding might appear before the
@@ -6898,8 +6909,8 @@ QString QString::arg(const QString &a, int fieldWidth, QChar fillChar) const
using QLocale::setDefault(). The 'L' flag is ignored if \a base is
not 10.
- \snippet doc/src/snippets/qstring/main.cpp 12
- \snippet doc/src/snippets/qstring/main.cpp 14
+ \snippet qstring/main.cpp 12
+ \snippet qstring/main.cpp 14
If \a fillChar is '0' (the number 0, ASCII 48), the locale's zero is
used. For negative numbers, zero padding might appear before the
@@ -6954,14 +6965,14 @@ QString QString::arg(qlonglong a, int fieldWidth, int base, QChar fillChar) cons
QString arg;
if (d.occurrences > d.locale_occurrences)
- arg = QLocale::c().d()->longLongToString(a, -1, base, fieldWidth, flags);
+ arg = QLocale::c().d->longLongToString(a, -1, base, fieldWidth, flags);
QString locale_arg;
if (d.locale_occurrences > 0) {
QLocale locale;
if (!locale.numberOptions() & QLocale::OmitGroupSeparator)
flags |= QLocalePrivate::ThousandsGroup;
- locale_arg = locale.d()->longLongToString(a, -1, base, fieldWidth, flags);
+ locale_arg = locale.d->longLongToString(a, -1, base, fieldWidth, flags);
}
return replaceArgEscapes(*this, d, fieldWidth, arg, locale_arg, fillChar);
@@ -6998,14 +7009,14 @@ QString QString::arg(qulonglong a, int fieldWidth, int base, QChar fillChar) con
QString arg;
if (d.occurrences > d.locale_occurrences)
- arg = QLocale::c().d()->unsLongLongToString(a, -1, base, fieldWidth, flags);
+ arg = QLocale::c().d->unsLongLongToString(a, -1, base, fieldWidth, flags);
QString locale_arg;
if (d.locale_occurrences > 0) {
QLocale locale;
if (!locale.numberOptions() & QLocale::OmitGroupSeparator)
flags |= QLocalePrivate::ThousandsGroup;
- locale_arg = locale.d()->unsLongLongToString(a, -1, base, fieldWidth, flags);
+ locale_arg = locale.d->unsLongLongToString(a, -1, base, fieldWidth, flags);
}
return replaceArgEscapes(*this, d, fieldWidth, arg, locale_arg, fillChar);
@@ -7082,7 +7093,7 @@ QString QString::arg(char a, int fieldWidth, QChar fillChar) const
value produces right-aligned text; a negative value produces
left-aligned text.
- \snippet doc/src/snippets/code/src_corelib_tools_qstring.cpp 2
+ \snippet code/src_corelib_tools_qstring.cpp 2
The '%' can be followed by an 'L', in which case the sequence is
replaced with a localized representation of \a a. The conversion
@@ -7132,7 +7143,7 @@ QString QString::arg(double a, int fieldWidth, char fmt, int prec, QChar fillCha
QString arg;
if (d.occurrences > d.locale_occurrences)
- arg = QLocale::c().d()->doubleToString(a, prec, form, fieldWidth, flags);
+ arg = QLocale::c().d->doubleToString(a, prec, form, fieldWidth, flags);
QString locale_arg;
if (d.locale_occurrences > 0) {
@@ -7140,7 +7151,7 @@ QString QString::arg(double a, int fieldWidth, char fmt, int prec, QChar fillCha
if (!locale.numberOptions() & QLocale::OmitGroupSeparator)
flags |= QLocalePrivate::ThousandsGroup;
- locale_arg = locale.d()->doubleToString(a, prec, form, fieldWidth, flags);
+ locale_arg = locale.d->doubleToString(a, prec, form, fieldWidth, flags);
}
return replaceArgEscapes(*this, d, fieldWidth, arg, locale_arg, fillChar);
@@ -7278,7 +7289,7 @@ bool QString::isRightToLeft() const
Example:
- \snippet doc/src/snippets/qstring/main.cpp 19
+ \snippet qstring/main.cpp 19
Note that the pointer remains valid only as long as the string is
not modified by other means. For read-only access, constData() is
@@ -7366,8 +7377,8 @@ bool QString::isRightToLeft() const
Here's an example of how we can use a QRegExp on raw data in
memory without requiring to copy the data into a QString:
- \snippet doc/src/snippets/qstring/main.cpp 22
- \snippet doc/src/snippets/qstring/main.cpp 23
+ \snippet qstring/main.cpp 22
+ \snippet qstring/main.cpp 23
\warning A string created with fromRawData() is \e not
'\\0'-terminated, unless the raw data contains a '\\0' character
@@ -7438,11 +7449,11 @@ QString &QString::setRawData(const QChar *unicode, int size)
the \c{const char *} data. For example, assuming \c str is a
QString,
- \snippet doc/src/snippets/code/src_corelib_tools_qstring.cpp 3
+ \snippet code/src_corelib_tools_qstring.cpp 3
is much faster than
- \snippet doc/src/snippets/code/src_corelib_tools_qstring.cpp 4
+ \snippet code/src_corelib_tools_qstring.cpp 4
because it doesn't construct four temporary QString objects and
make a deep copy of the character data.
@@ -7454,7 +7465,7 @@ QString &QString::setRawData(const QChar *unicode, int size)
just a very thin wrapper around a \c{const char *}. Using
QLatin1String, the example code above becomes
- \snippet doc/src/snippets/code/src_corelib_tools_qstring.cpp 5
+ \snippet code/src_corelib_tools_qstring.cpp 5
This is a bit longer to type, but it provides exactly the same
benefits as the first version of the code, and is faster than
@@ -7464,7 +7475,7 @@ QString &QString::setRawData(const QChar *unicode, int size)
QLatin1String can be used everywhere a QString is expected. For
example:
- \snippet doc/src/snippets/code/src_corelib_tools_qstring.cpp 6
+ \snippet code/src_corelib_tools_qstring.cpp 6
\sa QString, QLatin1Char, QStringLiteral
*/
@@ -8332,7 +8343,7 @@ QString &QString::append(const QStringRef &str)
If \a n is greater than size() or less than zero, a reference to the entire
string is returned.
- \snippet doc/src/snippets/qstring/main.cpp leftRef
+ \snippet qstring/main.cpp leftRef
\sa left(), rightRef(), midRef(), startsWith()
*/
@@ -8352,7 +8363,7 @@ QStringRef QString::leftRef(int n) const
If \a n is greater than size() or less than zero, a reference to the entire
string is returned.
- \snippet doc/src/snippets/qstring/main.cpp rightRef
+ \snippet qstring/main.cpp rightRef
\sa right(), leftRef(), midRef(), endsWith()
*/
@@ -8379,7 +8390,7 @@ QStringRef QString::rightRef(int n) const
Example:
- \snippet doc/src/snippets/qstring/main.cpp midRef
+ \snippet qstring/main.cpp midRef
\sa mid(), leftRef(), rightRef()
*/
@@ -9123,7 +9134,7 @@ QVector<uint> QStringRef::toUcs4() const
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qstring.cpp 7
+ \snippet code/src_corelib_tools_qstring.cpp 7
*/
QString QString::toHtmlEscaped() const
{
diff --git a/src/corelib/tools/qstring.h b/src/corelib/tools/qstring.h
index 9fcd203a3f..bbfb31aef3 100644
--- a/src/corelib/tools/qstring.h
+++ b/src/corelib/tools/qstring.h
@@ -448,10 +448,14 @@ public:
{
return fromLocal8Bit_helper(str, (str && size == -1) ? int(strlen(str)) : size);
}
- static inline QString fromAscii(const QByteArray &str) { return fromAscii(str.data(), str.size()); }
- static inline QString fromLatin1(const QByteArray &str) { return fromLatin1(str.data(), str.size()); }
- static inline QString fromUtf8(const QByteArray &str) { return fromUtf8(str.data(), str.size()); }
- static inline QString fromLocal8Bit(const QByteArray &str) { return fromLocal8Bit(str.data(), str.size()); }
+ static inline QString fromAscii(const QByteArray &str)
+ { return fromAscii(str.data(), qstrnlen(str.constData(), str.size())); }
+ static inline QString fromLatin1(const QByteArray &str)
+ { return fromLatin1(str.data(), qstrnlen(str.constData(), str.size())); }
+ static inline QString fromUtf8(const QByteArray &str)
+ { return fromUtf8(str.data(), qstrnlen(str.constData(), str.size())); }
+ static inline QString fromLocal8Bit(const QByteArray &str)
+ { return fromLocal8Bit(str.data(), qstrnlen(str.constData(), str.size())); }
static QString fromUtf16(const ushort *, int size = -1);
static QString fromUcs4(const uint *, int size = -1);
static QString fromRawData(const QChar *, int size);
@@ -572,13 +576,13 @@ public:
inline QT_ASCII_CAST_WARN bool operator==(const QByteArray &s) const;
inline QT_ASCII_CAST_WARN bool operator!=(const QByteArray &s) const;
inline QT_ASCII_CAST_WARN bool operator<(const QByteArray &s) const
- { return *this < QString::fromAscii(s.constData(), s.size()); }
+ { return *this < QString::fromAscii(s); }
inline QT_ASCII_CAST_WARN bool operator>(const QByteArray &s) const
- { return *this > QString::fromAscii(s.constData(), s.size()); }
+ { return *this > QString::fromAscii(s); }
inline QT_ASCII_CAST_WARN bool operator<=(const QByteArray &s) const
- { return *this <= QString::fromAscii(s.constData(), s.size()); }
+ { return *this <= QString::fromAscii(s); }
inline QT_ASCII_CAST_WARN bool operator>=(const QByteArray &s) const
- { return *this >= QString::fromAscii(s.constData(), s.size()); }
+ { return *this >= QString::fromAscii(s); }
#endif
typedef QChar *iterator;
@@ -689,17 +693,30 @@ public:
{ return s >= *this; }
inline QT_ASCII_CAST_WARN bool operator==(const char *s) const
- { return QString::fromAscii(s, s ? int(strlen(s)) : -1) == *this; }
+ { return QString::fromAscii(s) == *this; }
inline QT_ASCII_CAST_WARN bool operator!=(const char *s) const
- { return QString::fromAscii(s, s ? int(strlen(s)) : -1) != *this; }
+ { return QString::fromAscii(s) != *this; }
inline QT_ASCII_CAST_WARN bool operator<(const char *s) const
- { return QString::fromAscii(s, s ? int(strlen(s)) : -1) > *this; }
+ { return QString::fromAscii(s) > *this; }
inline QT_ASCII_CAST_WARN bool operator>(const char *s) const
- { return QString::fromAscii(s, s ? int(strlen(s)) : -1) < *this; }
+ { return QString::fromAscii(s) < *this; }
inline QT_ASCII_CAST_WARN bool operator<=(const char *s) const
- { return QString::fromAscii(s, s ? int(strlen(s)) : -1) >= *this; }
+ { return QString::fromAscii(s) >= *this; }
inline QT_ASCII_CAST_WARN bool operator>=(const char *s) const
- { return QString::fromAscii(s, s ? int(strlen(s)) : -1) <= *this; }
+ { return QString::fromAscii(s) <= *this; }
+
+ inline QT_ASCII_CAST_WARN bool operator==(const QByteArray &s) const
+ { return QString::fromAscii(s) == *this; }
+ inline QT_ASCII_CAST_WARN bool operator!=(const QByteArray &s) const
+ { return QString::fromAscii(s) != *this; }
+ inline QT_ASCII_CAST_WARN bool operator<(const QByteArray &s) const
+ { return QString::fromAscii(s) > *this; }
+ inline QT_ASCII_CAST_WARN bool operator>(const QByteArray &s) const
+ { return QString::fromAscii(s) < *this; }
+ inline QT_ASCII_CAST_WARN bool operator<=(const QByteArray &s) const
+ { return QString::fromAscii(s) >= *this; }
+ inline QT_ASCII_CAST_WARN bool operator>=(const QByteArray &s) const
+ { return QString::fromAscii(s) <= *this; }
private:
int m_size;
const char *m_data;
@@ -1016,14 +1033,14 @@ inline bool operator>=(const QLatin1String &s1, const QLatin1String &s2)
inline bool QString::operator==(const QByteArray &s) const
-{ return qStringComparisonHelper(*this, s.constData()); }
+{ return qStringComparisonHelper(*this, s); }
inline bool QString::operator!=(const QByteArray &s) const
-{ return !qStringComparisonHelper(*this, s.constData()); }
+{ return !qStringComparisonHelper(*this, s); }
inline bool QByteArray::operator==(const QString &s) const
-{ return qStringComparisonHelper(s, constData()); }
+{ return qStringComparisonHelper(s, *this); }
inline bool QByteArray::operator!=(const QString &s) const
-{ return !qStringComparisonHelper(s, constData()); }
+{ return !qStringComparisonHelper(s, *this); }
inline bool QByteArray::operator<(const QString &s) const
{ return QString::fromAscii(constData(), size()) < s; }
inline bool QByteArray::operator>(const QString &s) const
diff --git a/src/corelib/tools/qstringbuilder.cpp b/src/corelib/tools/qstringbuilder.cpp
index 6999972172..a044cca3c9 100644
--- a/src/corelib/tools/qstringbuilder.cpp
+++ b/src/corelib/tools/qstringbuilder.cpp
@@ -95,7 +95,7 @@ QT_BEGIN_NAMESPACE
\c QChar, \c QCharRef, \c QLatin1Char, and \c char.
*/
-/*! \fn QByteArray QStringBuilder::toLatin1() const
+/* \fn QByteArray QStringBuilder::toLatin1() const
Returns a Latin-1 representation of the string as a QByteArray. The
returned byte array is undefined if the string contains non-Latin1
characters.
diff --git a/src/corelib/tools/qstringlist.cpp b/src/corelib/tools/qstringlist.cpp
index bfe2c5ec2d..c25d326b9d 100644
--- a/src/corelib/tools/qstringlist.cpp
+++ b/src/corelib/tools/qstringlist.cpp
@@ -102,7 +102,7 @@ QT_BEGIN_NAMESPACE
{QList::operator+=()}{operator+=()} and \l
{QStringList::operator<<()}{operator<<()} functions. For example:
- \snippet doc/src/snippets/qstringlist/main.cpp 0
+ \snippet qstringlist/main.cpp 0
\section1 Iterating over the strings
@@ -111,15 +111,15 @@ QT_BEGIN_NAMESPACE
Indexing:
- \snippet doc/src/snippets/qstringlist/main.cpp 1
+ \snippet qstringlist/main.cpp 1
Java-style iterator:
- \snippet doc/src/snippets/qstringlist/main.cpp 2
+ \snippet qstringlist/main.cpp 2
STL-style iterator:
- \snippet doc/src/snippets/qstringlist/main.cpp 3
+ \snippet qstringlist/main.cpp 3
The QStringListIterator class is simply a type definition for
QListIterator<QString>. QStringList also provide the
@@ -133,12 +133,12 @@ QT_BEGIN_NAMESPACE
string list into a single string (with an optional separator)
using the join() function. For example:
- \snippet doc/src/snippets/qstringlist/main.cpp 4
+ \snippet qstringlist/main.cpp 4
To break up a string into a string list, use the QString::split()
function:
- \snippet doc/src/snippets/qstringlist/main.cpp 6
+ \snippet qstringlist/main.cpp 6
The argument to split can be a single character, a string, or a
QRegExp.
@@ -152,7 +152,7 @@ QT_BEGIN_NAMESPACE
contain a particular substring (or match a particular regular
expression):
- \snippet doc/src/snippets/qstringlist/main.cpp 7
+ \snippet qstringlist/main.cpp 7
The contains() function tells you whether the list contains a
given string, while the indexOf() function returns the index of
@@ -163,7 +163,7 @@ QT_BEGIN_NAMESPACE
Finally, the replaceInStrings() function calls QString::replace()
on each string in the string list in turn. For example:
- \snippet doc/src/snippets/qstringlist/main.cpp 8
+ \snippet qstringlist/main.cpp 8
\sa QString
*/
@@ -180,7 +180,7 @@ QT_BEGIN_NAMESPACE
Constructs a string list that contains the given string, \a
str. Longer lists are easily created like this:
- \snippet doc/src/snippets/qstringlist/main.cpp 9
+ \snippet qstringlist/main.cpp 9
\sa append()
*/
@@ -255,13 +255,13 @@ void QtPrivate::QStringList_sort(QStringList *that, Qt::CaseSensitivity cs)
comparison is case sensitive; otherwise the comparison is case
insensitive.
- \snippet doc/src/snippets/qstringlist/main.cpp 5
- \snippet doc/src/snippets/qstringlist/main.cpp 10
+ \snippet qstringlist/main.cpp 5
+ \snippet qstringlist/main.cpp 10
This is equivalent to
- \snippet doc/src/snippets/qstringlist/main.cpp 11
- \snippet doc/src/snippets/qstringlist/main.cpp 12
+ \snippet qstringlist/main.cpp 11
+ \snippet qstringlist/main.cpp 12
\sa contains()
*/
@@ -348,8 +348,8 @@ QStringList QtPrivate::QStringList_filter(const QStringList *that, const QRegula
For example:
- \snippet doc/src/snippets/qstringlist/main.cpp 5
- \snippet doc/src/snippets/qstringlist/main.cpp 13
+ \snippet qstringlist/main.cpp 5
+ \snippet qstringlist/main.cpp 13
\sa QString::replace()
*/
@@ -372,8 +372,8 @@ void QtPrivate::QStringList_replaceInStrings(QStringList *that, const QString &b
For example:
- \snippet doc/src/snippets/qstringlist/main.cpp 5
- \snippet doc/src/snippets/qstringlist/main.cpp 14
+ \snippet qstringlist/main.cpp 5
+ \snippet qstringlist/main.cpp 14
For regular expressions that contain \l{capturing parentheses},
occurrences of \b{\\1}, \b{\\2}, ..., in \a after are
@@ -381,8 +381,8 @@ void QtPrivate::QStringList_replaceInStrings(QStringList *that, const QString &b
For example:
- \snippet doc/src/snippets/qstringlist/main.cpp 5
- \snippet doc/src/snippets/qstringlist/main.cpp 15
+ \snippet qstringlist/main.cpp 5
+ \snippet qstringlist/main.cpp 15
*/
void QtPrivate::QStringList_replaceInStrings(QStringList *that, const QRegExp &rx, const QString &after)
{
diff --git a/src/corelib/tools/qtimeline.cpp b/src/corelib/tools/qtimeline.cpp
index f0d8c248b4..0c1ed4de84 100644
--- a/src/corelib/tools/qtimeline.cpp
+++ b/src/corelib/tools/qtimeline.cpp
@@ -182,7 +182,7 @@ void QTimeLinePrivate::setCurrentTime(int msecs)
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qtimeline.cpp 0
+ \snippet code/src_corelib_tools_qtimeline.cpp 0
You can also use QTimeLine with the
\l{Graphics View}{Graphics View framework} for
diff --git a/src/corelib/tools/qunicodetables.cpp b/src/corelib/tools/qunicodetables.cpp
index 9504e7168e..ea61d2090d 100644
--- a/src/corelib/tools/qunicodetables.cpp
+++ b/src/corelib/tools/qunicodetables.cpp
@@ -41,8 +41,12 @@
/* This file is autogenerated from the Unicode 5.0 database. Do not edit */
+#include "qunicodetables_p.h"
+
QT_BEGIN_NAMESPACE
+namespace QUnicodeTables {
+
static const unsigned short uc_property_trie[] = {
// 0 - 0x11000
@@ -3422,9 +3426,9 @@ static const unsigned short uc_property_trie[] = {
: (uc_property_trie[uc_property_trie[((ucs4 - 0x11000)>>8) + 0x880] + (ucs4 & 0xff)]))
#define GET_PROP_INDEX_UCS2(ucs2) \
-(uc_property_trie[uc_property_trie[ucs2>>5] + (ucs2 & 0x1f)])
+ (uc_property_trie[uc_property_trie[ucs2>>5] + (ucs2 & 0x1f)])
-static const QUnicodeTables::Properties uc_properties[] = {
+static const Properties uc_properties[] = {
{ 9, 19, 18, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0 },
{ 9, 15, 8, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3 },
{ 9, 30, 7, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1 },
@@ -4319,38 +4323,37 @@ static const QUnicodeTables::Properties uc_properties[] = {
{ 3, 10, 2, 0, 0, 9, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 },
{ 13, 11, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 18, 12, 0, 0, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6 },
- { 12, 11, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 12, 11, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
-static inline const QUnicodeTables::Properties *qGetProp(uint ucs4)
+static inline const Properties *qGetProp(uint ucs4)
{
- int index = GET_PROP_INDEX(ucs4);
+ const int index = GET_PROP_INDEX(ucs4);
return uc_properties + index;
}
-static inline const QUnicodeTables::Properties *qGetProp(ushort ucs2)
+static inline const Properties *qGetProp(ushort ucs2)
{
- int index = GET_PROP_INDEX_UCS2(ucs2);
+ const int index = GET_PROP_INDEX_UCS2(ucs2);
return uc_properties + index;
}
-Q_CORE_EXPORT const QUnicodeTables::Properties * QT_FASTCALL QUnicodeTables::properties(uint ucs4)
+Q_CORE_EXPORT const Properties * QT_FASTCALL properties(uint ucs4)
{
- int index = GET_PROP_INDEX(ucs4);
- return uc_properties + index;
+ return qGetProp(ucs4);
}
-Q_CORE_EXPORT const QUnicodeTables::Properties * QT_FASTCALL QUnicodeTables::properties(ushort ucs2)
+Q_CORE_EXPORT const Properties * QT_FASTCALL properties(ushort ucs2)
{
- int index = GET_PROP_INDEX_UCS2(ucs2);
- return uc_properties + index;
+ return qGetProp(ucs2);
}
-Q_CORE_EXPORT QUnicodeTables::LineBreakClass QT_FASTCALL QUnicodeTables::lineBreakClass(uint ucs4)
+Q_CORE_EXPORT LineBreakClass QT_FASTCALL lineBreakClass(uint ucs4)
{
- return (QUnicodeTables::LineBreakClass)qGetProp(ucs4)->line_break_class;
+ return (LineBreakClass)qGetProp(ucs4)->line_break_class;
}
+
static const ushort specialCaseMap[] = {
0x0, // placeholder
0x2, 0x53, 0x73,
@@ -4449,7 +4452,7 @@ static const ushort specialCaseMap[] = {
0x3, 0x3a9, 0x342, 0x345,
0x3, 0x3a9, 0x342, 0x399
};
-#define SPECIAL_CASE_MAX_LEN 3
+
static const unsigned short uc_decomposition_trie[] = {
// 0 - 0x3400
@@ -5893,7 +5896,7 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
};
#define GET_DECOMPOSITION_INDEX(ucs4) \
@@ -5904,7 +5907,6 @@ static const unsigned short uc_decomposition_trie[] = {
: 0xffff))
static const unsigned short uc_decomposition_map[] = {
-
0x103, 0x20, 0x210, 0x20, 0x308, 0x109, 0x61, 0x210,
0x20, 0x304, 0x109, 0x32, 0x109, 0x33, 0x210, 0x20,
0x301, 0x110, 0x3bc, 0x210, 0x20, 0x327, 0x109, 0x31,
@@ -7608,7 +7610,7 @@ static const unsigned short uc_decomposition_map[] = {
0xdd05, 0x201, 0xd868, 0xde0e, 0x201, 0xd868, 0xde91, 0x101,
0x9ebb, 0x101, 0x4d56, 0x101, 0x9ef9, 0x101, 0x9efe, 0x101,
0x9f05, 0x101, 0x9f0f, 0x101, 0x9f16, 0x101, 0x9f3b, 0x201,
- 0xd869, 0xde00,
+ 0xd869, 0xde00
};
static const unsigned short uc_ligature_trie[] = {
@@ -7766,13 +7768,13 @@ static const unsigned short uc_ligature_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0x700, 0x761, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0x700, 0x761, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
};
-#define GET_LIGATURE_INDEX(u2) (u2 < 0x3100 ? uc_ligature_trie[uc_ligature_trie[u2>>5] + (u2 & 0x1f)] : 0xffff);
+#define GET_LIGATURE_INDEX(u2) \
+ (u2 < 0x3100 ? uc_ligature_trie[uc_ligature_trie[u2>>5] + (u2 & 0x1f)] : 0xffff);
static const unsigned short uc_ligature_map[] = {
-
0x54, 0x41, 0xc0, 0x45, 0xc8, 0x49, 0xcc, 0x4e,
0x1f8, 0x4f, 0xd2, 0x55, 0xd9, 0x57, 0x1e80, 0x59,
0x1ef2, 0x61, 0xe0, 0x65, 0xe8, 0x69, 0xec, 0x6e,
@@ -8011,9 +8013,10 @@ static const unsigned short uc_ligature_map[] = {
0x30f7, 0x30f0, 0x30f8, 0x30f1, 0x30f9, 0x30f2, 0x30fa, 0x30fd,
0x30fe, 0xa, 0x306f, 0x3071, 0x3072, 0x3074, 0x3075, 0x3077,
0x3078, 0x307a, 0x307b, 0x307d, 0x30cf, 0x30d1, 0x30d2, 0x30d4,
- 0x30d5, 0x30d7, 0x30d8, 0x30da, 0x30db, 0x30dd,
+ 0x30d5, 0x30d7, 0x30d8, 0x30da, 0x30db, 0x30dd
};
+
struct NormalizationCorrection {
uint ucs4;
uint old_mapping;
@@ -8032,11 +8035,10 @@ static const NormalizationCorrection uc_normalization_corrections[] = {
enum { NumNormalizationCorrections = 6 };
enum { NormalizationCorrectionsVersionMax = 7 };
+
enum { UnicodeBlockCount = 512 }; // number of unicode blocks
enum { UnicodeBlockSize = 128 }; // size of each block
-namespace QUnicodeTables {
-
static const unsigned char uc_scripts[] = {
Common, /* U+0000-007f */
Common, /* U+0080-00ff */
@@ -9471,9 +9473,7 @@ static const unsigned char uc_scripts[] = {
Common, Common, Common, Common, Common, Common, Common, Common
};
-} // namespace QUnicodeTables
-
-Q_CORE_EXPORT int QT_FASTCALL QUnicodeTables::script(uint ucs4)
+Q_CORE_EXPORT int QT_FASTCALL script(uint ucs4)
{
if (ucs4 > 0xffff)
return Common;
@@ -9485,4 +9485,8 @@ Q_CORE_EXPORT int QT_FASTCALL QUnicodeTables::script(uint ucs4)
return script;
}
+} // namespace QUnicodeTables
+
+using namespace QUnicodeTables;
+
QT_END_NAMESPACE
diff --git a/src/corelib/tools/qunicodetables_p.h b/src/corelib/tools/qunicodetables_p.h
index 0b8115035c..50afebdd9c 100644
--- a/src/corelib/tools/qunicodetables_p.h
+++ b/src/corelib/tools/qunicodetables_p.h
@@ -76,7 +76,7 @@ namespace QUnicodeTables {
ushort lowerCaseSpecial : 1;
ushort upperCaseSpecial : 1;
ushort titleCaseSpecial : 1;
- ushort caseFoldSpecial : 1; /* currently unused */
+ ushort caseFoldSpecial : 1;
signed short mirrorDiff : 16;
signed short lowerCaseDiff : 16;
signed short upperCaseDiff : 16;
@@ -217,7 +217,7 @@ namespace QUnicodeTables {
};
- Q_CORE_EXPORT QUnicodeTables::LineBreakClass QT_FASTCALL lineBreakClass(uint ucs4);
+ Q_CORE_EXPORT LineBreakClass QT_FASTCALL lineBreakClass(uint ucs4);
inline int lineBreakClass(QChar ch)
{ return lineBreakClass(ch.unicode()); }
diff --git a/src/corelib/tools/qvarlengtharray.h b/src/corelib/tools/qvarlengtharray.h
index 639d2463fd..58b26be4a9 100644
--- a/src/corelib/tools/qvarlengtharray.h
+++ b/src/corelib/tools/qvarlengtharray.h
@@ -180,8 +180,7 @@ private:
int s; // size
T *ptr; // data
union {
- // ### Qt 5: Use 'Prealloc * sizeof(T)' as array size
- char array[sizeof(qint64) * (((Prealloc * sizeof(T)) / sizeof(qint64)) + 1)];
+ char array[Prealloc * sizeof(T)];
qint64 q_for_alignment_1;
double q_for_alignment_2;
};
diff --git a/src/corelib/tools/qvarlengtharray.qdoc b/src/corelib/tools/qvarlengtharray.qdoc
index e92f91aa47..748126012b 100644
--- a/src/corelib/tools/qvarlengtharray.qdoc
+++ b/src/corelib/tools/qvarlengtharray.qdoc
@@ -35,12 +35,12 @@
The C++ language doesn't support variable-length arrays on the stack.
For example, the following code won't compile:
- \snippet doc/src/snippets/code/doc_src_qvarlengtharray.cpp 0
+ \snippet code/doc_src_qvarlengtharray.cpp 0
The alternative is to allocate the array on the heap (with
\c{new}):
- \snippet doc/src/snippets/code/doc_src_qvarlengtharray.cpp 1
+ \snippet code/doc_src_qvarlengtharray.cpp 1
However, if myfunc() is called very frequently from the
application's inner loop, heap allocation can be a major source
@@ -53,7 +53,7 @@
it is much faster than heap allocation.
Example:
- \snippet doc/src/snippets/code/doc_src_qvarlengtharray.cpp 2
+ \snippet code/doc_src_qvarlengtharray.cpp 2
In the example above, QVarLengthArray will preallocate 1024
elements on the stack and use them unless \c{n + 1} is greater
@@ -260,7 +260,7 @@
be used to access and modify the items in the array.
Example:
- \snippet doc/src/snippets/code/doc_src_qvarlengtharray.cpp 3
+ \snippet code/doc_src_qvarlengtharray.cpp 3
The pointer remains valid as long as the array isn't reallocated.
diff --git a/src/corelib/tools/qvector.cpp b/src/corelib/tools/qvector.cpp
index 0026338047..20501f98ff 100644
--- a/src/corelib/tools/qvector.cpp
+++ b/src/corelib/tools/qvector.cpp
@@ -119,20 +119,20 @@ int QVectorData::grow(int sizeOfHeader, int size, int sizeOfT)
Here's an example of a QVector that stores integers and a QVector
that stores QString values:
- \snippet doc/src/snippets/code/src_corelib_tools_qvector.cpp 0
+ \snippet code/src_corelib_tools_qvector.cpp 0
QVector stores a vector (or array) of items. Typically, vectors
are created with an initial size. For example, the following code
constructs a QVector with 200 elements:
- \snippet doc/src/snippets/code/src_corelib_tools_qvector.cpp 1
+ \snippet code/src_corelib_tools_qvector.cpp 1
The elements are automatically initialized with a
\l{default-constructed value}. If you want to initialize the
vector with a different value, pass that value as the second
argument to the constructor:
- \snippet doc/src/snippets/code/src_corelib_tools_qvector.cpp 2
+ \snippet code/src_corelib_tools_qvector.cpp 2
You can also call fill() at any time to fill the vector with a
value.
@@ -142,11 +142,11 @@ int QVectorData::grow(int sizeOfHeader, int size, int sizeOfT)
non-const vectors, operator[]() returns a reference to the item
that can be used on the left side of an assignment:
- \snippet doc/src/snippets/code/src_corelib_tools_qvector.cpp 3
+ \snippet code/src_corelib_tools_qvector.cpp 3
For read-only access, an alternative syntax is to use at():
- \snippet doc/src/snippets/code/src_corelib_tools_qvector.cpp 4
+ \snippet code/src_corelib_tools_qvector.cpp 4
at() can be faster than operator[](), because it never causes a
\l{deep copy} to occur.
@@ -164,7 +164,7 @@ int QVectorData::grow(int sizeOfHeader, int size, int sizeOfT)
backward. Both return the index of the matching item if they found
one; otherwise, they return -1. For example:
- \snippet doc/src/snippets/code/src_corelib_tools_qvector.cpp 5
+ \snippet code/src_corelib_tools_qvector.cpp 5
If you simply want to check whether a vector contains a
particular value, use contains(). If you want to find out how
@@ -411,7 +411,7 @@ int QVectorData::grow(int sizeOfHeader, int size, int sizeOfT)
can be used to access and modify the items in the vector.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qvector.cpp 6
+ \snippet code/src_corelib_tools_qvector.cpp 6
The pointer remains valid as long as the vector isn't
reallocated.
@@ -482,7 +482,7 @@ int QVectorData::grow(int sizeOfHeader, int size, int sizeOfT)
Inserts \a value at the end of the vector.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qvector.cpp 7
+ \snippet code/src_corelib_tools_qvector.cpp 7
This is the same as calling resize(size() + 1) and assigning \a
value to the new last element in the vector.
@@ -499,7 +499,7 @@ int QVectorData::grow(int sizeOfHeader, int size, int sizeOfT)
Inserts \a value at the beginning of the vector.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qvector.cpp 8
+ \snippet code/src_corelib_tools_qvector.cpp 8
This is the same as vector.insert(0, \a value).
@@ -519,7 +519,7 @@ int QVectorData::grow(int sizeOfHeader, int size, int sizeOfT)
value is appended to the vector.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qvector.cpp 9
+ \snippet code/src_corelib_tools_qvector.cpp 9
For large vectors, this operation can be slow (\l{linear time}),
because it requires moving all the items at indexes \a i and
@@ -538,7 +538,7 @@ int QVectorData::grow(int sizeOfHeader, int size, int sizeOfT)
vector.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qvector.cpp 10
+ \snippet code/src_corelib_tools_qvector.cpp 10
*/
/*! \fn QVector::iterator QVector::insert(iterator before, const T &value)
@@ -592,7 +592,7 @@ int QVectorData::grow(int sizeOfHeader, int size, int sizeOfT)
size beforehand.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qvector.cpp 11
+ \snippet code/src_corelib_tools_qvector.cpp 11
\sa resize()
*/
@@ -604,7 +604,7 @@ int QVectorData::grow(int sizeOfHeader, int size, int sizeOfT)
Returns -1 if no item matched.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qvector.cpp 12
+ \snippet code/src_corelib_tools_qvector.cpp 12
This function requires the value type to have an implementation of
\c operator==().
@@ -620,7 +620,7 @@ int QVectorData::grow(int sizeOfHeader, int size, int sizeOfT)
last item. Returns -1 if no item matched.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qvector.cpp 13
+ \snippet code/src_corelib_tools_qvector.cpp 13
This function requires the value type to have an implementation of
\c operator==().
@@ -966,7 +966,7 @@ int QVectorData::grow(int sizeOfHeader, int size, int sizeOfT)
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qvector.cpp 14
+ \snippet code/src_corelib_tools_qvector.cpp 14
\sa fromList(), QList::fromVector()
*/
@@ -977,7 +977,7 @@ int QVectorData::grow(int sizeOfHeader, int size, int sizeOfT)
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qvector.cpp 15
+ \snippet code/src_corelib_tools_qvector.cpp 15
\sa toList(), QList::toVector()
*/
@@ -989,7 +989,7 @@ int QVectorData::grow(int sizeOfHeader, int size, int sizeOfT)
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qvector.cpp 16
+ \snippet code/src_corelib_tools_qvector.cpp 16
\sa toStdVector(), QList::fromStdList()
*/
@@ -999,7 +999,7 @@ int QVectorData::grow(int sizeOfHeader, int size, int sizeOfT)
Returns a std::vector object with the data contained in this QVector.
Example:
- \snippet doc/src/snippets/code/src_corelib_tools_qvector.cpp 17
+ \snippet code/src_corelib_tools_qvector.cpp 17
\sa fromStdVector(), QList::toStdList()
*/
diff --git a/src/corelib/xml/qxmlstream.cpp b/src/corelib/xml/qxmlstream.cpp
index df2c2f998f..769cdc9495 100644
--- a/src/corelib/xml/qxmlstream.cpp
+++ b/src/corelib/xml/qxmlstream.cpp
@@ -291,7 +291,7 @@ QXmlStreamEntityResolver *QXmlStreamReader::entityResolver() const
A typical loop with QXmlStreamReader looks like this:
- \snippet doc/src/snippets/code/src_corelib_xml_qxmlstream.cpp 0
+ \snippet code/src_corelib_xml_qxmlstream.cpp 0
QXmlStreamReader is a well-formed XML 1.0 parser that does \e not
@@ -2900,11 +2900,11 @@ QStringRef QXmlStreamReader::documentEncoding() const
The following abridged code snippet shows the basic use of the class
to write formatted XML with indentation:
- \snippet doc/src/snippets/qxmlstreamwriter/main.cpp start stream
+ \snippet qxmlstreamwriter/main.cpp start stream
\dots
- \snippet doc/src/snippets/qxmlstreamwriter/main.cpp write element
+ \snippet qxmlstreamwriter/main.cpp write element
\dots
- \snippet doc/src/snippets/qxmlstreamwriter/main.cpp finish stream
+ \snippet qxmlstreamwriter/main.cpp finish stream
QXmlStreamWriter takes care of prefixing namespaces, all you have to
do is specify the \c namespaceUri when writing elements or
@@ -3561,7 +3561,7 @@ void QXmlStreamWriter::writeEmptyElement(const QString &namespaceUri, const QStr
This is a convenience function equivalent to:
- \snippet doc/src/snippets/code/src_corelib_xml_qxmlstream.cpp 1
+ \snippet code/src_corelib_xml_qxmlstream.cpp 1
*/
void QXmlStreamWriter::writeTextElement(const QString &qualifiedName, const QString &text)
@@ -3578,7 +3578,7 @@ void QXmlStreamWriter::writeTextElement(const QString &qualifiedName, const QStr
This is a convenience function equivalent to:
- \snippet doc/src/snippets/code/src_corelib_xml_qxmlstream.cpp 2
+ \snippet code/src_corelib_xml_qxmlstream.cpp 2
*/
void QXmlStreamWriter::writeTextElement(const QString &namespaceUri, const QString &name, const QString &text)
diff --git a/src/corelib/xml/qxmlutils.cpp b/src/corelib/xml/qxmlutils.cpp
index 7ec208816c..44a56de797 100644
--- a/src/corelib/xml/qxmlutils.cpp
+++ b/src/corelib/xml/qxmlutils.cpp
@@ -227,7 +227,7 @@ bool QXmlUtils::isBaseChar(const QChar c)
Determines whether \a encName is a valid instance of production [81]EncName in the XML 1.0
specification. If it is, true is returned, otherwise false.
- \sa \l {http://www.w3.org/TR/REC-xml/#NT-EncName}
+ \sa {http://www.w3.org/TR/REC-xml/#NT-EncName},
{Extensible Markup Language (XML) 1.0 (Fourth Edition), [81] EncName}
*/
bool QXmlUtils::isEncName(const QString &encName)
@@ -236,7 +236,7 @@ bool QXmlUtils::isEncName(const QString &encName)
* replace that regexp is probably a 70 lines so I prioritize this to when
* the dependency is considered alarming, or when the rest of the bugs
* are fixed. */
- const QRegExp encNameRegExp(QLatin1String("[A-Za-z][A-Za-z0-9._\\-]*"));
+ QRegExp encNameRegExp(QLatin1String("[A-Za-z][A-Za-z0-9._\\-]*"));
Q_ASSERT(encNameRegExp.isValid());
return encNameRegExp.exactMatch(encName);
@@ -248,7 +248,7 @@ bool QXmlUtils::isEncName(const QString &encName)
Determines whether \a c is a valid instance of production [84]Letter in the XML 1.0
specification. If it is, true is returned, otherwise false.
- \sa \l {http://www.w3.org/TR/REC-xml/#NT-Letter}
+ \sa {http://www.w3.org/TR/REC-xml/#NT-Letter},
{Extensible Markup Language (XML) 1.0 (Fourth Edition), [84] Letter}
*/
bool QXmlUtils::isLetter(const QChar c)
@@ -262,7 +262,7 @@ bool QXmlUtils::isLetter(const QChar c)
Determines whether \a c is a valid instance of production [2]Char in the XML 1.0
specification. If it is, true is returned, otherwise false.
- \sa \l {http://www.w3.org/TR/REC-xml/#NT-Char}
+ \sa {http://www.w3.org/TR/REC-xml/#NT-Char},
{Extensible Markup Language (XML) 1.0 (Fourth Edition), [2] Char}
*/
bool QXmlUtils::isChar(const QChar c)
@@ -281,7 +281,7 @@ bool QXmlUtils::isChar(const QChar c)
production [4]NameChar in the XML 1.0 specification. If it
is, true is returned, otherwise false.
- \sa \l {http://www.w3.org/TR/REC-xml/#NT-NameChar}
+ \sa {http://www.w3.org/TR/REC-xml/#NT-NameChar},
{Extensible Markup Language (XML) 1.0 (Fourth Edition), [4] NameChar}
*/
bool QXmlUtils::isNameChar(const QChar c)
@@ -304,7 +304,7 @@ bool QXmlUtils::isNameChar(const QChar c)
production [12] PubidLiteral in the XML 1.0 specification. If it
is, true is returned, otherwise false.
- \sa \l {http://www.w3.org/TR/REC-xml/#NT-PubidLiteral}
+ \sa {http://www.w3.org/TR/REC-xml/#NT-PubidLiteral},
{Extensible Markup Language (XML) 1.0 (Fourth Edition), [12] PubidLiteral}
*/
bool QXmlUtils::isPublicID(const QString &candidate)
@@ -363,7 +363,7 @@ bool QXmlUtils::isPublicID(const QString &candidate)
production [4]NCName in the XML 1.0 Namespaces specification. If it
is, true is returned, otherwise false.
- \sa \l {http://www.w3.org/TR/REC-xml-names/#NT-NCName}
+ \sa {http://www.w3.org/TR/REC-xml-names/#NT-NCName},
{W3CNamespaces in XML 1.0 (Second Edition), [4] NCName}
*/
bool QXmlUtils::isNCName(const QStringRef &ncName)
diff --git a/src/dbus/qdbus_symbols.cpp b/src/dbus/qdbus_symbols.cpp
index 9e3bd5c5d6..cbf7dfc033 100644
--- a/src/dbus/qdbus_symbols.cpp
+++ b/src/dbus/qdbus_symbols.cpp
@@ -40,7 +40,9 @@
****************************************************************************/
#include <QtCore/qglobal.h>
+#ifndef QT_BOOTSTRAPPED
#include <QtCore/qlibrary.h>
+#endif
#include <QtCore/qmutex.h>
#include <private/qmutexpool_p.h>
diff --git a/src/dbus/qdbusabstractadaptor.cpp b/src/dbus/qdbusabstractadaptor.cpp
index dda20cde04..39584c436c 100644
--- a/src/dbus/qdbusabstractadaptor.cpp
+++ b/src/dbus/qdbusabstractadaptor.cpp
@@ -395,13 +395,9 @@ void QDBusAdaptorConnector::qt_static_metacall(QObject *_o, QMetaObject::Call _c
}
}
-const QMetaObjectExtraData QDBusAdaptorConnector::staticMetaObjectExtraData = {
- 0, qt_static_metacall
-};
-
const QMetaObject QDBusAdaptorConnector::staticMetaObject = {
{ &QObject::staticMetaObject, qt_meta_stringdata_QDBusAdaptorConnector.data,
- qt_meta_data_QDBusAdaptorConnector, &staticMetaObjectExtraData }
+ qt_meta_data_QDBusAdaptorConnector, qt_static_metacall, 0, 0 }
};
const QMetaObject *QDBusAdaptorConnector::metaObject() const
diff --git a/src/dbus/qdbusabstractinterface.cpp b/src/dbus/qdbusabstractinterface.cpp
index 79c607e6b4..ea32e6ead6 100644
--- a/src/dbus/qdbusabstractinterface.cpp
+++ b/src/dbus/qdbusabstractinterface.cpp
@@ -385,7 +385,7 @@ QDBusError QDBusAbstractInterface::lastError() const
}
/*!
- Sets the timeout in seconds for all future DBus calls to \a timeout.
+ Sets the timeout in milliseconds for all future DBus calls to \a timeout.
-1 means the default DBus timeout (usually 25 seconds).
\since 4.8
@@ -396,7 +396,7 @@ void QDBusAbstractInterface::setTimeout(int timeout)
}
/*!
- Returns the current value of the timeout in seconds.
+ Returns the current value of the timeout in milliseconds.
-1 means the default DBus timeout (usually 25 seconds).
\since 4.8
@@ -544,7 +544,8 @@ bool QDBusAbstractInterface::callWithCallback(const QString &method,
return d->connection.callWithCallback(msg,
receiver,
returnMethod,
- errorMethod);
+ errorMethod,
+ d->timeout);
}
/*!
@@ -577,7 +578,7 @@ bool QDBusAbstractInterface::callWithCallback(const QString &method,
\internal
Catch signal connections.
*/
-void QDBusAbstractInterface::connectNotify(const char *signal)
+void QDBusAbstractInterface::connectNotify(const QMetaMethod &signal)
{
// someone connecting to one of our signals
Q_D(QDBusAbstractInterface);
@@ -585,7 +586,8 @@ void QDBusAbstractInterface::connectNotify(const char *signal)
return;
// we end up recursing here, so optimize away
- if (qstrcmp(signal + 1, "destroyed(QObject*)") == 0)
+ static const QMetaMethod destroyedSignal = QMetaMethod::fromSignal(&QDBusAbstractInterface::destroyed);
+ if (signal == destroyedSignal)
return;
QDBusConnectionPrivate *conn = d->connectionPrivate();
@@ -599,7 +601,7 @@ void QDBusAbstractInterface::connectNotify(const char *signal)
\internal
Catch signal disconnections.
*/
-void QDBusAbstractInterface::disconnectNotify(const char *signal)
+void QDBusAbstractInterface::disconnectNotify(const QMetaMethod &signal)
{
// someone disconnecting from one of our signals
Q_D(QDBusAbstractInterface);
diff --git a/src/dbus/qdbusabstractinterface.h b/src/dbus/qdbusabstractinterface.h
index 648229c061..2752458312 100644
--- a/src/dbus/qdbusabstractinterface.h
+++ b/src/dbus/qdbusabstractinterface.h
@@ -146,8 +146,8 @@ protected:
const QDBusConnection &connection, QObject *parent);
QDBusAbstractInterface(QDBusAbstractInterfacePrivate &, QObject *parent);
- void connectNotify(const char *signal);
- void disconnectNotify(const char *signal);
+ void connectNotify(const QMetaMethod &signal);
+ void disconnectNotify(const QMetaMethod &signal);
QVariant internalPropGet(const char *propname) const;
void internalPropSet(const char *propname, const QVariant &value);
QDBusMessage internalConstCall(QDBus::CallMode mode,
diff --git a/src/dbus/qdbusconnection_p.h b/src/dbus/qdbusconnection_p.h
index fb53f3efba..d249789a5f 100644
--- a/src/dbus/qdbusconnection_p.h
+++ b/src/dbus/qdbusconnection_p.h
@@ -210,10 +210,10 @@ public:
void registerObject(const ObjectTreeNode *node);
void connectRelay(const QString &service,
const QString &path, const QString &interface,
- QDBusAbstractInterface *receiver, const char *signal);
+ QDBusAbstractInterface *receiver, const QMetaMethod &signal);
void disconnectRelay(const QString &service,
const QString &path, const QString &interface,
- QDBusAbstractInterface *receiver, const char *signal);
+ QDBusAbstractInterface *receiver, const QMetaMethod &signal);
void registerService(const QString &serviceName);
void unregisterService(const QString &serviceName);
diff --git a/src/dbus/qdbusconnectioninterface.cpp b/src/dbus/qdbusconnectioninterface.cpp
index 0f85f9090e..1b7b69933e 100644
--- a/src/dbus/qdbusconnectioninterface.cpp
+++ b/src/dbus/qdbusconnectioninterface.cpp
@@ -44,6 +44,7 @@
#include <QtCore/QByteArray>
#include <QtCore/QList>
#include <QtCore/QMap>
+#include <QtCore/QMetaMethod>
#include <QtCore/QString>
#include <QtCore/QStringList>
#include <QtCore/QVariant>
@@ -328,41 +329,53 @@ QDBusConnectionInterface::unregisterService(const QString &serviceName)
/*!
\internal
*/
-void QDBusConnectionInterface::connectNotify(const char *signalName)
+void QDBusConnectionInterface::connectNotify(const QMetaMethod &signal)
{
// translate the signal names to what we really want
// this avoids setting hooks for signals that don't exist on the bus
- if (qstrcmp(signalName, SIGNAL(serviceRegistered(QString))) == 0)
- QDBusAbstractInterface::connectNotify(SIGNAL(NameAcquired(QString)));
-
- else if (qstrcmp(signalName, SIGNAL(serviceUnregistered(QString))) == 0)
- QDBusAbstractInterface::connectNotify(SIGNAL(NameLost(QString)));
-
- else if (qstrcmp(signalName, SIGNAL(serviceOwnerChanged(QString,QString,QString))) == 0) {
+ static const QMetaMethod serviceRegisteredSignal = QMetaMethod::fromSignal(&QDBusConnectionInterface::serviceRegistered);
+ static const QMetaMethod serviceUnregisteredSignal = QMetaMethod::fromSignal(&QDBusConnectionInterface::serviceUnregistered);
+ static const QMetaMethod serviceOwnerChangedSignal = QMetaMethod::fromSignal(&QDBusConnectionInterface::serviceOwnerChanged);
+ static const QMetaMethod NameAcquiredSignal = QMetaMethod::fromSignal(&QDBusConnectionInterface::NameAcquired);
+ static const QMetaMethod NameLostSignal = QMetaMethod::fromSignal(&QDBusConnectionInterface::NameLost);
+ static const QMetaMethod NameOwnerChangedSignal = QMetaMethod::fromSignal(&QDBusConnectionInterface::NameOwnerChanged);
+ if (signal == serviceRegisteredSignal)
+ QDBusAbstractInterface::connectNotify(NameAcquiredSignal);
+
+ else if (signal == serviceUnregisteredSignal)
+ QDBusAbstractInterface::connectNotify(NameLostSignal);
+
+ else if (signal == serviceOwnerChangedSignal) {
static bool warningPrinted = false;
if (!warningPrinted) {
qWarning("Connecting to deprecated signal QDBusConnectionInterface::serviceOwnerChanged(QString,QString,QString)");
warningPrinted = true;
}
- QDBusAbstractInterface::connectNotify(SIGNAL(NameOwnerChanged(QString,QString,QString)));
+ QDBusAbstractInterface::connectNotify(NameOwnerChangedSignal);
}
}
/*!
\internal
*/
-void QDBusConnectionInterface::disconnectNotify(const char *signalName)
+void QDBusConnectionInterface::disconnectNotify(const QMetaMethod &signal)
{
// translate the signal names to what we really want
// this avoids setting hooks for signals that don't exist on the bus
- if (qstrcmp(signalName, SIGNAL(serviceRegistered(QString))) == 0)
- QDBusAbstractInterface::disconnectNotify(SIGNAL(NameAcquired(QString)));
-
- else if (qstrcmp(signalName, SIGNAL(serviceUnregistered(QString))) == 0)
- QDBusAbstractInterface::disconnectNotify(SIGNAL(NameLost(QString)));
-
- else if (qstrcmp(signalName, SIGNAL(serviceOwnerChanged(QString,QString,QString))) == 0)
- QDBusAbstractInterface::disconnectNotify(SIGNAL(NameOwnerChanged(QString,QString,QString)));
+ static const QMetaMethod serviceRegisteredSignal = QMetaMethod::fromSignal(&QDBusConnectionInterface::serviceRegistered);
+ static const QMetaMethod serviceUnregisteredSignal = QMetaMethod::fromSignal(&QDBusConnectionInterface::serviceUnregistered);
+ static const QMetaMethod serviceOwnerChangedSignal = QMetaMethod::fromSignal(&QDBusConnectionInterface::serviceOwnerChanged);
+ static const QMetaMethod NameAcquiredSignal = QMetaMethod::fromSignal(&QDBusConnectionInterface::NameAcquired);
+ static const QMetaMethod NameLostSignal = QMetaMethod::fromSignal(&QDBusConnectionInterface::NameLost);
+ static const QMetaMethod NameOwnerChangedSignal = QMetaMethod::fromSignal(&QDBusConnectionInterface::NameOwnerChanged);
+ if (signal == serviceRegisteredSignal)
+ QDBusAbstractInterface::disconnectNotify(NameAcquiredSignal);
+
+ else if (signal == serviceUnregisteredSignal)
+ QDBusAbstractInterface::disconnectNotify(NameLostSignal);
+
+ else if (signal == serviceOwnerChangedSignal)
+ QDBusAbstractInterface::disconnectNotify(NameOwnerChangedSignal);
}
// signals
diff --git a/src/dbus/qdbusconnectioninterface.h b/src/dbus/qdbusconnectioninterface.h
index b3651c87a7..e822edd525 100644
--- a/src/dbus/qdbusconnectioninterface.h
+++ b/src/dbus/qdbusconnectioninterface.h
@@ -116,8 +116,8 @@ Q_SIGNALS:
void NameLost(const QString &);
void NameOwnerChanged(const QString &, const QString &, const QString &);
protected:
- void connectNotify(const char *);
- void disconnectNotify(const char *);
+ void connectNotify(const QMetaMethod &);
+ void disconnectNotify(const QMetaMethod &);
#endif
};
diff --git a/src/dbus/qdbusdemarshaller.cpp b/src/dbus/qdbusdemarshaller.cpp
index 692606b539..0f65adcaad 100644
--- a/src/dbus/qdbusdemarshaller.cpp
+++ b/src/dbus/qdbusdemarshaller.cpp
@@ -287,7 +287,7 @@ QVariant QDBusDemarshaller::toVariantInternal()
case DBUS_TYPE_UNIX_FD:
if (capabilities & QDBusConnection::UnixFileDescriptorPassing)
- return qVariantFromValue(toUnixFileDescriptor());
+ return QVariant::fromValue(toUnixFileDescriptor());
// fall through
default:
diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp
index 5bdd0ee8d8..35b40a16f9 100644
--- a/src/dbus/qdbusintegrator.cpp
+++ b/src/dbus/qdbusintegrator.cpp
@@ -2236,14 +2236,17 @@ void QDBusConnectionPrivate::registerObject(const ObjectTreeNode *node)
void QDBusConnectionPrivate::connectRelay(const QString &service,
const QString &path, const QString &interface,
QDBusAbstractInterface *receiver,
- const char *signal)
+ const QMetaMethod &signal)
{
// this function is called by QDBusAbstractInterface when one of its signals is connected
// we set up a relay from D-Bus into it
SignalHook hook;
QString key;
- if (!prepareHook(hook, key, service, path, interface, QString(), QStringList(), receiver, signal,
+ QByteArray sig;
+ sig.append(QSIGNAL_CODE + '0');
+ sig.append(signal.methodSignature());
+ if (!prepareHook(hook, key, service, path, interface, QString(), QStringList(), receiver, sig,
QDBusAbstractInterface::staticMetaObject.methodCount(), true))
return; // don't connect
@@ -2267,14 +2270,17 @@ void QDBusConnectionPrivate::connectRelay(const QString &service,
void QDBusConnectionPrivate::disconnectRelay(const QString &service,
const QString &path, const QString &interface,
QDBusAbstractInterface *receiver,
- const char *signal)
+ const QMetaMethod &signal)
{
// this function is called by QDBusAbstractInterface when one of its signals is disconnected
// we remove relay from D-Bus into it
SignalHook hook;
QString key;
- if (!prepareHook(hook, key, service, path, interface, QString(), QStringList(), receiver, signal,
+ QByteArray sig;
+ sig.append(QSIGNAL_CODE + '0');
+ sig.append(signal.methodSignature());
+ if (!prepareHook(hook, key, service, path, interface, QString(), QStringList(), receiver, sig,
QDBusAbstractInterface::staticMetaObject.methodCount(), true))
return; // don't connect
diff --git a/src/dbus/qdbusmetaobject.cpp b/src/dbus/qdbusmetaobject.cpp
index 4fbf67a8b2..5570dac71d 100644
--- a/src/dbus/qdbusmetaobject.cpp
+++ b/src/dbus/qdbusmetaobject.cpp
@@ -542,6 +542,8 @@ void QDBusMetaObjectGenerator::write(QDBusMetaObject *obj)
// put the metaobject together
obj->d.data = uint_data;
+ obj->d.relatedMetaObjects = 0;
+ obj->d.static_metacall = 0;
obj->d.extradata = 0;
obj->d.stringdata = reinterpret_cast<const QByteArrayData *>(string_data);
obj->d.superdata = &QDBusAbstractInterface::staticMetaObject;
@@ -564,6 +566,8 @@ void QDBusMetaObjectGenerator::writeWithoutXml(const QString &interface)
stringdata[name.length()] = '\0';
d.data = reinterpret_cast<uint*>(header);
+ d.relatedMetaObjects = 0;
+ d.static_metacall = 0;
d.extradata = 0;
d.stringdata = stringdata;
d.superdata = &QDBusAbstractInterface::staticMetaObject;
diff --git a/src/gui/accessible/qaccessible.cpp b/src/gui/accessible/qaccessible.cpp
index ed3ee28f4f..02318468bb 100644
--- a/src/gui/accessible/qaccessible.cpp
+++ b/src/gui/accessible/qaccessible.cpp
@@ -641,18 +641,11 @@ void QAccessible::setRootObject(QObject *object)
}
/*!
+ \fn void QAccessible::updateAccessibility(QObject *object, int child, Event reason)
\deprecated
Use the version with a single \l QAccessibleEvent paremeter instead.
*/
-void QAccessible::updateAccessibility(QObject *object, int child, Event reason)
-{
- Q_ASSERT(object);
-
- QAccessibleEvent ev(object, reason);
- ev.setChild(child);
- updateAccessibility(&ev);
-}
/*!
Notifies about a change that might be relevant for accessibility clients.
@@ -1242,6 +1235,22 @@ Q_GUI_EXPORT QDebug operator<<(QDebug d, const QAccessibleInterface *iface)
d << ")";
return d.space();
}
+
+/*! \internal */
+QDebug operator<<(QDebug d, const QAccessibleEvent &ev)
+{
+ if (!&ev) {
+ d << "QAccessibleEvent(null)";
+ return d;
+ }
+ d.nospace() << "QAccessibleEvent(object=" << hex << ev.object();
+ d.nospace() << dec;
+ d.nospace() << "child=" << ev.child();
+ d << " event=" << qAccessibleEventString(ev.type());
+ d.nospace() << ")";
+ return d.space();
+}
+
#endif
QT_END_NAMESPACE
diff --git a/src/gui/accessible/qaccessible.h b/src/gui/accessible/qaccessible.h
index 180ab61ef9..ce7c54e00b 100644
--- a/src/gui/accessible/qaccessible.h
+++ b/src/gui/accessible/qaccessible.h
@@ -293,10 +293,12 @@ public:
PageTabList = 0x0000003C,
Clock = 0x0000003D,
Splitter = 0x0000003E,
+ // Reserved space in case MSAA roles needs to be added
+
// Additional Qt roles where enum value does not map directly to MSAA:
- LayeredPane = 0x0000003F,
- Terminal = 0x00000040,
- Desktop = 0x00000041,
+ LayeredPane = 0x00000080,
+ Terminal = 0x00000081,
+ Desktop = 0x00000082,
UserRole = 0x0000ffff
};
@@ -340,8 +342,9 @@ public:
static RootObjectHandler installRootObjectHandler(RootObjectHandler);
static QAccessibleInterface *queryAccessibleInterface(QObject *);
-
- QT_DEPRECATED static void updateAccessibility(QObject *object, int child, Event reason);
+#if QT_DEPRECATED_SINCE(5, 0)
+ QT_DEPRECATED static inline void updateAccessibility(QObject *object, int child, Event reason);
+#endif
static void updateAccessibility(QAccessibleEvent *event);
static bool isActive();
@@ -621,6 +624,18 @@ Q_GUI_EXPORT const char *qAccessibleEventString(QAccessible::Event event);
#ifndef QT_NO_DEBUG_STREAM
Q_GUI_EXPORT QDebug operator<<(QDebug d, const QAccessibleInterface *iface);
+Q_GUI_EXPORT QDebug operator<<(QDebug d, const QAccessibleEvent &ev);
+#endif
+
+#if QT_DEPRECATED_SINCE(5, 0)
+inline void QAccessible::updateAccessibility(QObject *object, int child, Event reason)
+{
+ Q_ASSERT(object);
+
+ QAccessibleEvent ev(object, reason);
+ ev.setChild(child);
+ updateAccessibility(&ev);
+}
#endif
#endif // QT_NO_ACCESSIBILITY
diff --git a/src/gui/accessible/qaccessibleobject.cpp b/src/gui/accessible/qaccessibleobject.cpp
index db4ee242ff..22c8ba5321 100644
--- a/src/gui/accessible/qaccessibleobject.cpp
+++ b/src/gui/accessible/qaccessibleobject.cpp
@@ -243,7 +243,7 @@ QAccessibleInterface *QAccessibleApplication::child(int index) const
/*! \reimp */
QAccessibleInterface *QAccessibleApplication::focusChild() const
{
- if (QWindow *window = QGuiApplication::activeWindow())
+ if (QWindow *window = QGuiApplication::focusWindow())
return window->accessibleRoot();
return 0;
}
diff --git a/src/gui/accessible/qplatformaccessibility_qpa.cpp b/src/gui/accessible/qplatformaccessibility_qpa.cpp
index 057d43add3..91b5de1198 100644
--- a/src/gui/accessible/qplatformaccessibility_qpa.cpp
+++ b/src/gui/accessible/qplatformaccessibility_qpa.cpp
@@ -59,12 +59,15 @@ Q_GLOBAL_STATIC(QVector<QAccessibleBridge *>, bridges)
/*!
\class QPlatformAccessibility
- \brief The QPlatformAccessibility class is the base class for
- integrating accessibility backends
-
+ \since 5.0
+ \internal
\preliminary
+ \ingroup qpa
\ingroup accessibility
+ \brief The QPlatformAccessibility class is the base class for
+ integrating accessibility backends
+
\sa QAccessible
*/
QPlatformAccessibility::QPlatformAccessibility()
diff --git a/src/gui/accessible/qplatformaccessibility_qpa.h b/src/gui/accessible/qplatformaccessibility_qpa.h
index 3bd6316d01..b1efd7cb34 100644
--- a/src/gui/accessible/qplatformaccessibility_qpa.h
+++ b/src/gui/accessible/qplatformaccessibility_qpa.h
@@ -41,6 +41,17 @@
#ifndef QPLATFORMACCESSIBILITY_H
#define QPLATFORMACCESSIBILITY_H
+//
+// 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 <QtCore/qobject.h>
#ifndef QT_NO_ACCESSIBILITY
diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp
index 9770aca9e5..b8ec7de851 100644
--- a/src/gui/image/qimage.cpp
+++ b/src/gui/image/qimage.cpp
@@ -1127,9 +1127,7 @@ QImage QImage::copy(const QRect& r) const
image.d->dpmy = d->dpmy;
image.d->offset = d->offset;
image.d->has_alpha_clut = d->has_alpha_clut;
-#ifndef QT_NO_IMAGE_TEXT
image.d->text = d->text;
-#endif
return image;
}
@@ -1219,9 +1217,7 @@ QImage QImage::copy(const QRect& r) const
image.d->dpmy = dotsPerMeterY();
image.d->offset = offset();
image.d->has_alpha_clut = d->has_alpha_clut;
-#ifndef QT_NO_IMAGE_TEXT
image.d->text = d->text;
-#endif
return image;
}
@@ -3350,9 +3346,7 @@ QImage QImage::convertToFormat(Format format, Qt::ImageConversionFlags flags) co
image.setDotsPerMeterY(dotsPerMeterY());
image.setDotsPerMeterX(dotsPerMeterX());
-#if !defined(QT_NO_IMAGE_TEXT)
image.d->text = d->text;
-#endif // !QT_NO_IMAGE_TEXT
converter(image.d, d, flags);
return image;
@@ -3399,14 +3393,12 @@ static QImage convertWithPalette(const QImage &src, QImage::Format format,
QImage dest(src.size(), format);
dest.setColorTable(clut);
-#if !defined(QT_NO_IMAGE_TEXT)
QString textsKeys = src.text();
QStringList textKeyList = textsKeys.split(QLatin1Char('\n'), QString::SkipEmptyParts);
foreach (const QString &textKey, textKeyList) {
QStringList textKeySplitted = textKey.split(QLatin1String(": "));
dest.setText(textKeySplitted[0], textKeySplitted[1]);
}
-#endif // !QT_NO_IMAGE_TEXT
int h = src.height();
int w = src.width();
@@ -3474,9 +3466,7 @@ QImage QImage::convertToFormat(Format format, const QVector<QRgb> &colorTable, Q
QImage image(d->width, d->height, format);
QIMAGE_SANITYCHECK_MEMORY(image);
-#if !defined(QT_NO_IMAGE_TEXT)
- image.d->text = d->text;
-#endif // !QT_NO_IMAGE_TEXT
+ image.d->text = d->text;
converter(image.d, d, flags);
return image;
@@ -4756,7 +4746,6 @@ void QImage::setOffset(const QPoint& p)
if (d)
d->offset = p;
}
-#ifndef QT_NO_IMAGE_TEXT
/*!
Returns the text keys for this image.
@@ -4879,8 +4868,6 @@ void QImage::setText(const QString &key, const QString &value)
\endomit
*/
-#endif // QT_NO_IMAGE_TEXT
-
/*
Sets the image bits to the \a pixmap contents and returns a
reference to the image.
diff --git a/src/gui/image/qimage.h b/src/gui/image/qimage.h
index 6acc03f4bd..db549699a7 100644
--- a/src/gui/image/qimage.h
+++ b/src/gui/image/qimage.h
@@ -68,7 +68,6 @@ template <class T> class QVector;
struct QImageData;
class QImageDataMisc; // internal
-#ifndef QT_NO_IMAGE_TEXT
#if QT_DEPRECATED_SINCE(5, 0)
class QImageTextKeyLang {
public:
@@ -84,9 +83,11 @@ public:
{ return key==other.key && lang==other.lang; }
inline bool operator!= (const QImageTextKeyLang &other) const
{ return !operator==(other); }
+private:
+ friend class QImage;
+ QImageTextKeyLang(bool /*dummy*/) {}
};
#endif
-#endif //QT_NO_IMAGE_TEXT
typedef void (*QImageCleanupFunction)(void*);
@@ -267,7 +268,7 @@ public:
void setDotsPerMeterY(int);
QPoint offset() const;
void setOffset(const QPoint&);
-#ifndef QT_NO_IMAGE_TEXT
+
QStringList textKeys() const;
QString text(const QString &key = QString()) const;
void setText(const QString &key, const QString &value);
@@ -279,7 +280,6 @@ public:
QT_DEPRECATED inline QString text(const QImageTextKeyLang&) const;
QT_DEPRECATED inline void setText(const char* key, const char* lang, const QString&);
#endif
-#endif
#if QT_DEPRECATED_SINCE(5, 0)
QT_DEPRECATED inline int numColors() const;
@@ -308,13 +308,12 @@ Q_DECLARE_TYPEINFO(QImage, Q_MOVABLE_TYPE);
// Inline functions...
-Q_GUI_EXPORT_INLINE bool QImage::valid(const QPoint &pt) const { return valid(pt.x(), pt.y()); }
-Q_GUI_EXPORT_INLINE int QImage::pixelIndex(const QPoint &pt) const { return pixelIndex(pt.x(), pt.y());}
-Q_GUI_EXPORT_INLINE QRgb QImage::pixel(const QPoint &pt) const { return pixel(pt.x(), pt.y()); }
-Q_GUI_EXPORT_INLINE void QImage::setPixel(const QPoint &pt, uint index_or_rgb) { setPixel(pt.x(), pt.y(), index_or_rgb); }
+inline bool QImage::valid(const QPoint &pt) const { return valid(pt.x(), pt.y()); }
+inline int QImage::pixelIndex(const QPoint &pt) const { return pixelIndex(pt.x(), pt.y());}
+inline QRgb QImage::pixel(const QPoint &pt) const { return pixel(pt.x(), pt.y()); }
+inline void QImage::setPixel(const QPoint &pt, uint index_or_rgb) { setPixel(pt.x(), pt.y(), index_or_rgb); }
#if QT_DEPRECATED_SINCE(5, 0)
-#ifndef QT_NO_IMAGE_TEXT
#if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 406)
# pragma GCC diagnostic push
@@ -342,7 +341,7 @@ inline QList<QImageTextKeyLang> QImage::textList() const
for (int i = 0; i < keys.size(); ++i) {
int index = keys.at(i).indexOf(QLatin1Char('/'));
if (index > 0) {
- QImageTextKeyLang tkl;
+ QImageTextKeyLang tkl(true);
tkl.key = keys.at(i).left(index).toAscii();
tkl.lang = keys.at(i).mid(index+1).toAscii();
imageTextKeys += tkl;
@@ -399,8 +398,6 @@ inline void QImage::setText(const char* key, const char* lang, const QString &s)
# pragma warning(default: 4996)
#endif
-#endif
-
inline int QImage::numColors() const
{
return colorCount();
diff --git a/src/gui/image/qimage_p.h b/src/gui/image/qimage_p.h
index fd1370d1d3..95108e9bf1 100644
--- a/src/gui/image/qimage_p.h
+++ b/src/gui/image/qimage_p.h
@@ -55,11 +55,8 @@
#include <QtCore/qglobal.h>
-#include <QVector>
-
-#ifndef QT_NO_IMAGE_TEXT
#include <QMap>
-#endif
+#include <QVector>
QT_BEGIN_NAMESPACE
@@ -103,9 +100,8 @@ struct Q_GUI_EXPORT QImageData { // internal image data
// Return false if the conversion cannot be done in-place.
bool convertInPlace(QImage::Format newFormat, Qt::ImageConversionFlags);
-#ifndef QT_NO_IMAGE_TEXT
QMap<QString, QString> text;
-#endif
+
bool doImageIO(const QImage *image, QImageWriter* io, int quality) const;
QPaintEngine *paintEngine;
@@ -152,4 +148,4 @@ inline int qt_depthForFormat(QImage::Format format)
QT_END_NAMESPACE
-#endif
+#endif // QIMAGE_P_H
diff --git a/src/gui/image/qimagepixmapcleanuphooks.cpp b/src/gui/image/qimagepixmapcleanuphooks.cpp
index 5b414b8d00..b118f5f856 100644
--- a/src/gui/image/qimagepixmapcleanuphooks.cpp
+++ b/src/gui/image/qimagepixmapcleanuphooks.cpp
@@ -46,15 +46,6 @@
QT_BEGIN_NAMESPACE
-// Legacy, single instance hooks: ### Qt 5: remove
-typedef void (*_qt_pixmap_cleanup_hook)(int);
-typedef void (*_qt_pixmap_cleanup_hook_64)(qint64);
-typedef void (*_qt_image_cleanup_hook)(int);
-Q_GUI_EXPORT _qt_pixmap_cleanup_hook qt_pixmap_cleanup_hook = 0;
-Q_GUI_EXPORT _qt_pixmap_cleanup_hook_64 qt_pixmap_cleanup_hook_64 = 0;
-Q_GUI_EXPORT _qt_image_cleanup_hook qt_image_cleanup_hook = 0;
-Q_GUI_EXPORT _qt_image_cleanup_hook_64 qt_image_cleanup_hook_64 = 0;
-
Q_GLOBAL_STATIC(QImagePixmapCleanupHooks, qt_image_and_pixmap_cleanup_hooks)
QImagePixmapCleanupHooks *QImagePixmapCleanupHooks::instance()
@@ -103,9 +94,6 @@ void QImagePixmapCleanupHooks::executePlatformPixmapModificationHooks(QPlatformP
return;
for (int i = 0; i < h->pixmapModificationHooks.count(); ++i)
h->pixmapModificationHooks[i](pmd);
-
- if (qt_pixmap_cleanup_hook_64)
- qt_pixmap_cleanup_hook_64(pmd->cacheKey());
}
void QImagePixmapCleanupHooks::executePlatformPixmapDestructionHooks(QPlatformPixmap* pmd)
@@ -118,9 +106,6 @@ void QImagePixmapCleanupHooks::executePlatformPixmapDestructionHooks(QPlatformPi
return;
for (int i = 0; i < h->pixmapDestructionHooks.count(); ++i)
h->pixmapDestructionHooks[i](pmd);
-
- if (qt_pixmap_cleanup_hook_64)
- qt_pixmap_cleanup_hook_64(pmd->cacheKey());
}
void QImagePixmapCleanupHooks::executeImageHooks(qint64 key)
@@ -133,9 +118,6 @@ void QImagePixmapCleanupHooks::executeImageHooks(qint64 key)
return;
for (int i = 0; i < h->imageHooks.count(); ++i)
h->imageHooks[i](key);
-
- if (qt_image_cleanup_hook_64)
- qt_image_cleanup_hook_64(key);
}
diff --git a/src/gui/image/qimagereader.cpp b/src/gui/image/qimagereader.cpp
index 870784f638..fe14a45dcb 100644
--- a/src/gui/image/qimagereader.cpp
+++ b/src/gui/image/qimagereader.cpp
@@ -1197,11 +1197,7 @@ bool QImageReader::read(QImage *image)
}
}
} else {
- if (d->handler->supportsOption(QImageIOHandler::ScaledSize) && d->scaledSize.isValid()) {
- // in this case, there's nothing we can do. if the
- // plugin supports scaled size but not ClipRect, then
- // we have to ignore ClipRect."
-
+ if (d->handler->supportsOption(QImageIOHandler::ScaledSize) && d->scaledSize.isValid() && d->clipRect.isNull()) {
if (d->handler->supportsOption(QImageIOHandler::ScaledClipRect) && !d->scaledClipRect.isNull()) {
// nothing to do (ClipRect is ignored!)
} else {
diff --git a/src/gui/image/qpixmap.cpp b/src/gui/image/qpixmap.cpp
index 65b9d62dfa..cefb8edf74 100644
--- a/src/gui/image/qpixmap.cpp
+++ b/src/gui/image/qpixmap.cpp
@@ -715,7 +715,7 @@ bool QPixmap::load(const QString &fileName, const char *format, Qt::ImageConvers
return false;
QFileInfo info(fileName);
- QString key = QLatin1Literal("qt_pixmap")
+ QString key = QLatin1String("qt_pixmap")
% info.absoluteFilePath()
% HexString<uint>(info.lastModified().toTime_t())
% HexString<quint64>(info.size())
@@ -934,8 +934,6 @@ static void sendResizeEvents(QWidget *target)
QPixmap QPixmap::grabWidget(QObject *widget, const QRect &rectangle)
{
QPixmap pixmap;
- // ### Qt5: should we keep or remove this method?
- // SC solution would be to install a callback form QtWidgets, but ugly.
qWarning("QPixmap::grabWidget is deprecated, use QWidget::grab() instead");
if (!widget)
return pixmap;
diff --git a/src/gui/image/qpixmap.h b/src/gui/image/qpixmap.h
index 0b21be5c8e..db92965274 100644
--- a/src/gui/image/qpixmap.h
+++ b/src/gui/image/qpixmap.h
@@ -84,11 +84,11 @@ public:
operator QVariant() const;
- bool isNull() const; // ### Qt 5: make inline
+ bool isNull() const;
int devType() const;
- int width() const; // ### Qt 5: make inline
- int height() const; // ### Qt 5: make inline
+ int width() const;
+ int height() const;
QSize size() const;
QRect rect() const;
int depth() const;
diff --git a/src/gui/image/qplatformpixmap.cpp b/src/gui/image/qplatformpixmap.cpp
index 30ac6ce30e..073c267fbe 100644
--- a/src/gui/image/qplatformpixmap.cpp
+++ b/src/gui/image/qplatformpixmap.cpp
@@ -49,6 +49,15 @@
QT_BEGIN_NAMESPACE
+/*!
+ \class QPlatformPixmap
+ \since 5.0
+ \internal
+ \preliminary
+ \ingroup qpa
+
+ \brief The QPlatformPixmap class provides an abstraction for native pixmaps.
+ */
QPlatformPixmap *QPlatformPixmap::create(int w, int h, PixelType type)
{
QPlatformPixmap *data = QGuiApplicationPrivate::platformIntegration()->createPlatformPixmap(static_cast<QPlatformPixmap::PixelType>(type));
diff --git a/src/gui/image/qpnghandler.cpp b/src/gui/image/qpnghandler.cpp
index c3ae0a41da..04f3b4f332 100644
--- a/src/gui/image/qpnghandler.cpp
+++ b/src/gui/image/qpnghandler.cpp
@@ -116,19 +116,18 @@ public:
};
QPngHandlerPrivate(QPngHandler *qq)
- : gamma(0.0), quality(2), png_ptr(0), info_ptr(0),
- end_info(0), row_pointers(0), state(Ready), q(qq)
+ : gamma(0.0), quality(2), png_ptr(0), info_ptr(0), end_info(0), state(Ready), q(qq)
{ }
float gamma;
int quality;
QString description;
+ QSize scaledSize;
QStringList readTexts;
png_struct *png_ptr;
png_info *info_ptr;
png_info *end_info;
- png_byte **row_pointers;
bool readPngHeader();
bool readPngImage(QImage *image);
@@ -136,6 +135,30 @@ public:
QImage::Format readImageFormat();
+ struct AllocatedMemoryPointers {
+ AllocatedMemoryPointers()
+ : row_pointers(0), accRow(0), inRow(0), outRow(0)
+ { }
+ void deallocate()
+ {
+ delete [] row_pointers;
+ row_pointers = 0;
+ delete [] accRow;
+ accRow = 0;
+ delete [] inRow;
+ inRow = 0;
+ delete [] outRow;
+ outRow = 0;
+ }
+
+ png_byte **row_pointers;
+ quint32 *accRow;
+ png_byte *inRow;
+ uchar *outRow;
+ };
+
+ AllocatedMemoryPointers amp;
+
State state;
QPngHandler *q;
@@ -224,7 +247,7 @@ void CALLBACK_CALL_TYPE qpiw_flush_fn(png_structp /* png_ptr */)
#endif
static
-void setup_qt(QImage& image, png_structp png_ptr, png_infop info_ptr, float screen_gamma=0.0)
+void setup_qt(QImage& image, png_structp png_ptr, png_infop info_ptr, QSize scaledSize, bool *doScaledRead, float screen_gamma=0.0)
{
if (screen_gamma != 0.0 && png_get_valid(png_ptr, info_ptr, PNG_INFO_gAMA)) {
double file_gamma;
@@ -241,7 +264,8 @@ void setup_qt(QImage& image, png_structp png_ptr, png_infop info_ptr, float scre
int num_trans;
png_colorp palette = 0;
int num_palette;
- png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, 0, 0, 0);
+ int interlace_method;
+ png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, &interlace_method, 0, 0);
png_set_interlace_handling(png_ptr);
if (color_type == PNG_COLOR_TYPE_GRAY) {
@@ -353,8 +377,16 @@ void setup_qt(QImage& image, png_structp png_ptr, png_infop info_ptr, float scre
// We want 4 bytes, but it isn't an alpha channel
format = QImage::Format_RGB32;
}
- if (image.size() != QSize(width, height) || image.format() != format) {
- image = QImage(width, height, format);
+ QSize outSize(width,height);
+ if (!scaledSize.isEmpty() && quint32(scaledSize.width()) <= width &&
+ quint32(scaledSize.height()) <= height && interlace_method == PNG_INTERLACE_NONE) {
+ // Do inline downscaling
+ outSize = scaledSize;
+ if (doScaledRead)
+ *doScaledRead = true;
+ }
+ if (image.size() != outSize || image.format() != format) {
+ image = QImage(outSize, format);
if (image.isNull())
return;
}
@@ -371,6 +403,75 @@ void setup_qt(QImage& image, png_structp png_ptr, png_infop info_ptr, float scre
}
}
+static void read_image_scaled(QImage *outImage, png_structp png_ptr, png_infop info_ptr,
+ QPngHandlerPrivate::AllocatedMemoryPointers &amp, QSize scaledSize)
+{
+
+ png_uint_32 width;
+ png_uint_32 height;
+ int bit_depth;
+ int color_type;
+ png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, 0, 0, 0);
+ uchar *data = outImage->bits();
+ int bpl = outImage->bytesPerLine();
+
+ if (scaledSize.isEmpty() || !width || !height)
+ return;
+
+ const quint32 iysz = height;
+ const quint32 ixsz = width;
+ const quint32 oysz = scaledSize.height();
+ const quint32 oxsz = scaledSize.width();
+ const quint32 ibw = 4*width;
+ amp.accRow = new quint32[ibw];
+ memset(amp.accRow, 0, ibw*sizeof(quint32));
+ amp.inRow = new png_byte[ibw];
+ memset(amp.inRow, 0, ibw*sizeof(png_byte));
+ amp.outRow = new uchar[ibw];
+ memset(amp.outRow, 0, ibw*sizeof(uchar));
+ qint32 rval = 0;
+ for (quint32 oy=0; oy<oysz; oy++) {
+ // Store the rest of the previous input row, if any
+ for (quint32 i=0; i < ibw; i++)
+ amp.accRow[i] = rval*amp.inRow[i];
+ // Accumulate the next input rows
+ for (rval = iysz-rval; rval > 0; rval-=oysz) {
+ png_read_row(png_ptr, amp.inRow, NULL);
+ quint32 fact = qMin(oysz, quint32(rval));
+ for (quint32 i=0; i < ibw; i++)
+ amp.accRow[i] += fact*amp.inRow[i];
+ }
+ rval *= -1;
+
+ // We have a full output row, store it
+ for (quint32 i=0; i < ibw; i++)
+ amp.outRow[i] = uchar(amp.accRow[i]/iysz);
+
+ quint32 a[4] = {0, 0, 0, 0};
+ qint32 cval = oxsz;
+ quint32 ix = 0;
+ for (quint32 ox=0; ox<oxsz; ox++) {
+ for (quint32 i=0; i < 4; i++)
+ a[i] = cval * amp.outRow[ix+i];
+ for (cval = ixsz - cval; cval > 0; cval-=oxsz) {
+ ix += 4;
+ if (ix >= ibw)
+ break; // Safety belt, should not happen
+ quint32 fact = qMin(oxsz, quint32(cval));
+ for (quint32 i=0; i < 4; i++)
+ a[i] += fact * amp.outRow[ix+i];
+ }
+ cval *= -1;
+ for (quint32 i=0; i < 4; i++)
+ data[(4*ox)+i] = uchar(a[i]/ixsz);
+ }
+ data += bpl;
+ }
+ amp.deallocate();
+
+ outImage->setDotsPerMeterX((png_get_x_pixels_per_meter(png_ptr,info_ptr)*oxsz)/ixsz);
+ outImage->setDotsPerMeterY((png_get_y_pixels_per_meter(png_ptr,info_ptr)*oysz)/iysz);
+}
#if defined(Q_C_CALLBACKS)
extern "C" {
@@ -390,7 +491,6 @@ static void CALLBACK_CALL_TYPE qt_png_warning(png_structp /*png_ptr*/, png_const
*/
void Q_INTERNAL_WIN_NO_THROW QPngHandlerPrivate::readPngTexts(png_info *info)
{
-#ifndef QT_NO_IMAGE_TEXT
png_textp text_ptr;
int num_text=0;
png_get_text(png_ptr, info, &text_ptr, &num_text);
@@ -413,7 +513,6 @@ void Q_INTERNAL_WIN_NO_THROW QPngHandlerPrivate::readPngTexts(png_info *info)
readTexts.append(value);
text_ptr++;
}
-#endif
}
@@ -471,90 +570,75 @@ bool Q_INTERNAL_WIN_NO_THROW QPngHandlerPrivate::readPngImage(QImage *outImage)
return false;
}
- row_pointers = 0;
if (setjmp(png_jmpbuf(png_ptr))) {
png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
- delete [] row_pointers;
png_ptr = 0;
+ amp.deallocate();
state = Error;
return false;
}
- setup_qt(*outImage, png_ptr, info_ptr, gamma);
+ bool doScaledRead = false;
+ setup_qt(*outImage, png_ptr, info_ptr, scaledSize, &doScaledRead, gamma);
if (outImage->isNull()) {
png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
- delete [] row_pointers;
png_ptr = 0;
+ amp.deallocate();
state = Error;
return false;
}
- png_uint_32 width;
- png_uint_32 height;
- int bit_depth;
- int color_type;
- png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type,
- 0, 0, 0);
-
- uchar *data = outImage->bits();
- int bpl = outImage->bytesPerLine();
- row_pointers = new png_bytep[height];
-
- for (uint y = 0; y < height; y++)
- row_pointers[y] = data + y * bpl;
-
- png_read_image(png_ptr, row_pointers);
-
-#if 0 // libpng takes care of this.
- png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)
- if (outImage->depth()==32 && png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) {
- QRgb trans = 0xFF000000 | qRgb(
- (info_ptr->trans_values.red << 8 >> bit_depth)&0xff,
- (info_ptr->trans_values.green << 8 >> bit_depth)&0xff,
- (info_ptr->trans_values.blue << 8 >> bit_depth)&0xff);
- for (uint y=0; y<height; y++) {
- for (uint x=0; x<info_ptr->width; x++) {
- if (((uint**)jt)[y][x] == trans) {
- ((uint**)jt)[y][x] &= 0x00FFFFFF;
- } else {
- }
+ if (doScaledRead) {
+ read_image_scaled(outImage, png_ptr, info_ptr, amp, scaledSize);
+ } else {
+ png_uint_32 width;
+ png_uint_32 height;
+ int bit_depth;
+ int color_type;
+ png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, 0, 0, 0);
+ uchar *data = outImage->bits();
+ int bpl = outImage->bytesPerLine();
+ amp.row_pointers = new png_bytep[height];
+
+ for (uint y = 0; y < height; y++)
+ amp.row_pointers[y] = data + y * bpl;
+
+ png_read_image(png_ptr, amp.row_pointers);
+ amp.deallocate();
+
+ outImage->setDotsPerMeterX(png_get_x_pixels_per_meter(png_ptr,info_ptr));
+ outImage->setDotsPerMeterY(png_get_y_pixels_per_meter(png_ptr,info_ptr));
+
+ // sanity check palette entries
+ if (color_type == PNG_COLOR_TYPE_PALETTE && outImage->format() == QImage::Format_Indexed8) {
+ int color_table_size = outImage->colorCount();
+ for (int y=0; y<(int)height; ++y) {
+ uchar *p = FAST_SCAN_LINE(data, bpl, y);
+ uchar *end = p + width;
+ while (p < end) {
+ if (*p >= color_table_size)
+ *p = 0;
+ ++p;
}
}
}
-#endif
-
- outImage->setDotsPerMeterX(png_get_x_pixels_per_meter(png_ptr,info_ptr));
- outImage->setDotsPerMeterY(png_get_y_pixels_per_meter(png_ptr,info_ptr));
+ }
state = ReadingEnd;
png_read_end(png_ptr, end_info);
-#ifndef QT_NO_IMAGE_TEXT
readPngTexts(end_info);
for (int i = 0; i < readTexts.size()-1; i+=2)
outImage->setText(readTexts.at(i), readTexts.at(i+1));
-#endif
png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
- delete [] row_pointers;
png_ptr = 0;
+ amp.deallocate();
state = Ready;
- // sanity check palette entries
- if (color_type == PNG_COLOR_TYPE_PALETTE
- && outImage->format() == QImage::Format_Indexed8) {
- int color_table_size = outImage->colorCount();
- for (int y=0; y<(int)height; ++y) {
- uchar *p = FAST_SCAN_LINE(data, bpl, y);
- uchar *end = p + width;
- while (p < end) {
- if (*p >= color_table_size)
- *p = 0;
- ++p;
- }
- }
- }
+ if (scaledSize.isValid() && outImage->size() != scaledSize)
+ *outImage = outImage->scaled(scaledSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
return true;
}
@@ -638,7 +722,6 @@ void QPNGImageWriter::setGamma(float g)
}
-#ifndef QT_NO_IMAGE_TEXT
static void set_text(const QImage &image, png_structp png_ptr, png_infop info_ptr,
const QString &description)
{
@@ -712,7 +795,6 @@ static void set_text(const QImage &image, png_structp png_ptr, png_infop info_pt
}
delete [] text_ptr;
}
-#endif
bool QPNGImageWriter::writeImage(const QImage& image, int off_x, int off_y)
{
@@ -722,10 +804,6 @@ bool QPNGImageWriter::writeImage(const QImage& image, int off_x, int off_y)
bool Q_INTERNAL_WIN_NO_THROW QPNGImageWriter::writeImage(const QImage& image, int quality_in, const QString &description,
int off_x_in, int off_y_in)
{
-#ifdef QT_NO_IMAGE_TEXT
- Q_UNUSED(description);
-#endif
-
QPoint offset = image.offset();
int off_x = off_x_in + offset.x();
int off_y = off_y_in + offset.y();
@@ -837,9 +915,8 @@ bool Q_INTERNAL_WIN_NO_THROW QPNGImageWriter::writeImage(const QImage& image, in
PNG_RESOLUTION_METER);
}
-#ifndef QT_NO_IMAGE_TEXT
set_text(image, png_ptr, info_ptr, description);
-#endif
+
png_write_info(png_ptr, info_ptr);
if (image.depth() != 1)
@@ -970,7 +1047,8 @@ bool QPngHandler::supportsOption(ImageOption option) const
|| option == Description
|| option == ImageFormat
|| option == Quality
- || option == Size;
+ || option == Size
+ || option == ScaledSize;
}
QVariant QPngHandler::option(ImageOption option) const
@@ -989,9 +1067,11 @@ QVariant QPngHandler::option(ImageOption option) const
else if (option == Size)
return QSize(png_get_image_width(d->png_ptr, d->info_ptr),
png_get_image_height(d->png_ptr, d->info_ptr));
+ else if (option == ScaledSize)
+ return d->scaledSize;
else if (option == ImageFormat)
return d->readImageFormat();
- return 0;
+ return QVariant();
}
void QPngHandler::setOption(ImageOption option, const QVariant &value)
@@ -1002,6 +1082,8 @@ void QPngHandler::setOption(ImageOption option, const QVariant &value)
d->quality = value.toInt();
else if (option == Description)
d->description = value.toString();
+ else if (option == ScaledSize)
+ d->scaledSize = value.toSize();
}
QByteArray QPngHandler::name() const
diff --git a/src/gui/kernel/kernel.pri b/src/gui/kernel/kernel.pri
index b0fe871741..3c1b6b4e48 100644
--- a/src/gui/kernel/kernel.pri
+++ b/src/gui/kernel/kernel.pri
@@ -105,7 +105,7 @@ SOURCES += \
kernel/qplatformservices_qpa.cpp \
kernel/qplatformscreenpageflipper_qpa.cpp
-contains(QT_CONFIG, opengl)|contains(QT_CONFIG, opengles2)|contains(QT_CONFIG, egl) {
+contains(QT_CONFIG, opengl)|contains(QT_CONFIG, opengles2) {
HEADERS += \
kernel/qplatformopenglcontext_qpa.h \
kernel/qopenglcontext.h \
diff --git a/src/gui/kernel/qclipboard.cpp b/src/gui/kernel/qclipboard.cpp
index 27179cf141..ef5e4f9c18 100644
--- a/src/gui/kernel/qclipboard.cpp
+++ b/src/gui/kernel/qclipboard.cpp
@@ -237,17 +237,6 @@ QClipboard::~QClipboard()
*/
-/*****************************************************************************
- QApplication member functions related to QClipboard.
- *****************************************************************************/
-
-// text handling is done directly in qclipboard_qws, for now
-
-/*!
- \fn bool QClipboard::event(QEvent *e)
- \reimp
-*/
-
/*!
\overload
diff --git a/src/gui/kernel/qclipboard.h b/src/gui/kernel/qclipboard.h
index 5c88764d88..1c21e5eaca 100644
--- a/src/gui/kernel/qclipboard.h
+++ b/src/gui/kernel/qclipboard.h
@@ -91,13 +91,8 @@ Q_SIGNALS:
void selectionChanged();
void findBufferChanged();
void dataChanged();
-private Q_SLOTS:
- void ownerDestroyed();
protected:
- void connectNotify(const char *);
- bool event(QEvent *);
-
friend class QApplication;
friend class QApplicationPrivate;
friend class QGuiApplication;
diff --git a/src/gui/kernel/qclipboard_qpa.cpp b/src/gui/kernel/qclipboard_qpa.cpp
index 0d97fdd0be..187e09253e 100644
--- a/src/gui/kernel/qclipboard_qpa.cpp
+++ b/src/gui/kernel/qclipboard_qpa.cpp
@@ -57,12 +57,6 @@ void QClipboard::clear(Mode mode)
setMimeData(0, mode);
}
-
-bool QClipboard::event(QEvent *e)
-{
- return QObject::event(e);
-}
-
const QMimeData* QClipboard::mimeData(Mode mode) const
{
QPlatformClipboard *clipboard = QGuiApplicationPrivate::platformIntegration()->clipboard();
@@ -90,14 +84,6 @@ bool QClipboard::ownsMode(Mode mode) const
return clipboard->ownsMode(mode);
}
-void QClipboard::connectNotify( const char * )
-{
-}
-
-void QClipboard::ownerDestroyed()
-{
-}
-
#endif // QT_NO_CLIPBOARD
QT_END_NAMESPACE
diff --git a/src/gui/kernel/qevent.cpp b/src/gui/kernel/qevent.cpp
index 52880a231d..266eb143e5 100644
--- a/src/gui/kernel/qevent.cpp
+++ b/src/gui/kernel/qevent.cpp
@@ -1672,16 +1672,13 @@ void QInputMethodEvent::setCommitString(const QString &commitString, int replace
}
/*!
- Sets the tentative commit string to \a tentativeCommitString.
+ \fn void QInputMethodEvent::setTentativeCommitString(const QString &string)
+ Sets the tentative commit string to \a string.
The tentative commit string is what the preedit string is expected to be committed as.
The string can be used within the editor to trigger code that reacts on text changes such as validators.
\deprecated
*/
-void QInputMethodEvent::setTentativeCommitString(const QString &tentativeCommitString)
-{
- tentativeCommit = tentativeCommitString;
-}
/*!
\fn const QList<Attribute> &QInputMethodEvent::attributes() const
@@ -3202,31 +3199,6 @@ QDebug operator<<(QDebug dbg, const QEvent *e) {
}
#endif
-#ifndef QT_NO_CLIPBOARD
-/*!
- \class QClipboardEvent
- \ingroup events
- \internal
-
- \brief The QClipboardEvent class provides the parameters used in a clipboard event.
-
- This class is for internal use only, and exists to aid the clipboard on various
- platforms to get all the information it needs. Use QEvent::Clipboard instead.
-
- \sa QClipboard
-*/
-
-QClipboardEvent::QClipboardEvent(QEventPrivate *data)
- : QEvent(QEvent::Clipboard)
-{
- d = data;
-}
-
-QClipboardEvent::~QClipboardEvent()
-{
-}
-#endif // QT_NO_CLIPBOARD
-
/*!
\class QShortcutEvent
\brief The QShortcutEvent class provides an event which is generated when
diff --git a/src/gui/kernel/qevent.h b/src/gui/kernel/qevent.h
index 176747aa95..96e630ed0a 100644
--- a/src/gui/kernel/qevent.h
+++ b/src/gui/kernel/qevent.h
@@ -159,10 +159,8 @@ public:
inline QPoint pixelDelta() const { return pixelD; }
inline QPoint angleDelta() const { return angleD; }
-#if QT_DEPRECATED_SINCE(5, 0)
- inline QT_DEPRECATED int delta() const { return qt4D; }
- inline QT_DEPRECATED Qt::Orientation orientation() const { return qt4O; }
-#endif
+ inline int delta() const { return qt4D; }
+ inline Qt::Orientation orientation() const { return qt4O; }
#ifndef QT_NO_INTEGER_EVENT_COORDINATES
inline QPoint pos() const { return p.toPoint(); }
@@ -461,15 +459,18 @@ public:
QInputMethodEvent();
QInputMethodEvent(const QString &preeditText, const QList<Attribute> &attributes);
void setCommitString(const QString &commitString, int replaceFrom = 0, int replaceLength = 0);
- QT_DEPRECATED void setTentativeCommitString(const QString &tentativeCommitString);
-
inline const QList<Attribute> &attributes() const { return attrs; }
inline const QString &preeditString() const { return preedit; }
inline const QString &commitString() const { return commit; }
inline int replacementStart() const { return replace_from; }
inline int replacementLength() const { return replace_length; }
+
+#if QT_DEPRECATED_SINCE(5, 0)
+ QT_DEPRECATED inline void setTentativeCommitString(const QString &string)
+ { tentativeCommit = string; }
QT_DEPRECATED inline const QString &tentativeCommitString() const { return tentativeCommit; }
+#endif
QInputMethodEvent(const QInputMethodEvent &other);
@@ -684,17 +685,6 @@ protected:
};
#endif
-#ifndef QT_NO_CLIPBOARD
-class Q_GUI_EXPORT QClipboardEvent : public QEvent
-{
-public:
- explicit QClipboardEvent(QEventPrivate *data);
- ~QClipboardEvent();
-
- QEventPrivate *data() { return d; }
-};
-#endif
-
class Q_GUI_EXPORT QWindowStateChangeEvent: public QEvent
{
public:
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp
index 8cbf55de05..8fd4d4a2b3 100644
--- a/src/gui/kernel/qguiapplication.cpp
+++ b/src/gui/kernel/qguiapplication.cpp
@@ -68,6 +68,7 @@
#include <QtGui/QGenericPluginFactory>
#include <QtGui/qstylehints.h>
#include <QtGui/qinputpanel.h>
+#include <QtGui/qpixmapcache.h>
#include <QtGui/qplatformtheme_qpa.h>
#include <QtGui/qplatforminputcontext_qpa.h>
#include <private/qplatforminputcontext_qpa_p.h>
@@ -347,17 +348,14 @@ QGuiApplication::QGuiApplication(QGuiApplicationPrivate &p)
QGuiApplication::~QGuiApplication()
{
Q_D(QGuiApplication);
- // flush clipboard contents
- if (QGuiApplicationPrivate::qt_clipboard) {
- QEvent event(QEvent::Clipboard);
- QGuiApplication::sendEvent(QGuiApplicationPrivate::qt_clipboard, &event);
- }
d->eventDispatcher->closingDown();
d->eventDispatcher = 0;
+#ifndef QT_NO_CLIPBOARD
delete QGuiApplicationPrivate::qt_clipboard;
QGuiApplicationPrivate::qt_clipboard = 0;
+#endif
clearPalette();
@@ -626,33 +624,6 @@ static void init_platform(const QString &pluginArgument, const QString &platform
}
}
- if (name.isEmpty()) {
- const QStringList keys = QPlatformIntegrationFactory::keys(platformPluginPath);
-#if defined(Q_OS_MAC)
- const QString defaultPlatform = QLatin1String("cocoa");
-#elif defined (Q_OS_WIN)
- const QString defaultPlatform = QLatin1String("windows");
-#elif defined (Q_OS_QNX)
- const QString defaultPlatform = QLatin1String("qnx");
-#elif !defined (QT_NO_XCB)
- const QString defaultPlatform = QLatin1String("xcb");
-#elif !defined (QT_NO_WAYLAND)
- const QString defaultPlatform = QLatin1String("wayland");
-#elif !defined (QT_NO_EGLFS)
- const QString defaultPlatform = QLatin1String("eglfs");
-#else
- const QString defaultPlatform = QLatin1String("minimal");
-#endif
- if (keys.contains(defaultPlatform)) {
- qWarning("No platform plugin argument was specified, defaulting to \"%s\".",
- qPrintable(defaultPlatform));
- name = defaultPlatform;
- } else {
- qFatal("No platform plugin argument was specified and the default plugin \"%s\" is not available",
- qPrintable(defaultPlatform));
- }
- }
-
// Create the platform integration.
QGuiApplicationPrivate::platform_integration = QPlatformIntegrationFactory::create(name, platformPluginPath);
if (QGuiApplicationPrivate::platform_integration) {
@@ -889,6 +860,8 @@ QGuiApplicationPrivate::~QGuiApplicationPrivate()
qt_cleanupFontDatabase();
+ QPixmapCache::clear();
+
delete platform_theme;
delete platform_integration;
platform_integration = 0;
@@ -1026,6 +999,7 @@ bool QGuiApplication::notify(QObject *object, QEvent *event)
}
#endif
+ QGuiApplicationPrivate::sendQWindowEventToQPlatformWindow(qobject_cast<QWindow *>(object), event);
return QCoreApplication::notify(object, event);
}
@@ -1047,6 +1021,20 @@ bool QGuiApplication::compressEvent(QEvent *event, QObject *receiver, QPostEvent
return QCoreApplication::compressEvent(event, receiver, postedEvents);
}
+void QGuiApplicationPrivate::sendQWindowEventToQPlatformWindow(QWindow *window, QEvent *event)
+{
+ if (!window)
+ return;
+ QPlatformWindow *platformWindow = window->handle();
+ if (!platformWindow)
+ return;
+ // spontaneous events come from the platform integration already, we don't need to send the events back
+ if (event->spontaneous())
+ return;
+ // let the platform window do any handling it needs to as well
+ platformWindow->windowEvent(event);
+}
+
bool QGuiApplicationPrivate::processNativeEvent(QWindow *window, const QByteArray &eventType, void *message, long *result)
{
return window->nativeEvent(eventType, message, result);
@@ -1260,7 +1248,7 @@ void QGuiApplicationPrivate::processKeyEvent(QWindowSystemInterfacePrivate::KeyE
QWindow *window = e->window.data();
modifier_buttons = e->modifiers;
if (e->nullWindow)
- window = QGuiApplication::activeWindow();
+ window = QGuiApplication::focusWindow();
if (!window)
return;
if (window->d_func()->blockedByModalWindow) {
@@ -2183,18 +2171,17 @@ QInputMethod *QGuiApplication::inputMethod()
}
/*!
+ \fn QInputPanel *QGuiApplication::inputPanel() const
returns the input panel.
The input panel returns properties about the state and position of
the virtual keyboard. It also provides information about the position of the
current focused input element.
- \sa QInputPanel
+ \obsolete
+
+ \sa inputMethod()
*/
-QInputPanel *QGuiApplication::inputPanel() const
-{
- return inputMethod();
-}
/*!
\fn void QGuiApplication::fontDatabaseChanged()
diff --git a/src/gui/kernel/qguiapplication.h b/src/gui/kernel/qguiapplication.h
index 2a1ea3d9de..9aad39ed47 100644
--- a/src/gui/kernel/qguiapplication.h
+++ b/src/gui/kernel/qguiapplication.h
@@ -90,7 +90,7 @@ public:
static QWindow *modalWindow();
-#ifdef QT_DEPRECATED
+#if QT_DEPRECATED_SINCE(5, 0)
static QT_DEPRECATED QWindow *activeWindow() { return focusWindow(); }
#endif
static QWindow *focusWindow();
@@ -130,7 +130,9 @@ public:
static void setDesktopSettingsAware(bool on);
static bool desktopSettingsAware();
- QT_DEPRECATED QInputPanel *inputPanel() const;
+#if QT_DEPRECATED_SINCE(5, 0)
+ QT_DEPRECATED QInputPanel *inputPanel() const { return inputMethod(); }
+#endif
static QInputMethod *inputMethod();
static QPlatformNativeInterface *platformNativeInterface();
diff --git a/src/gui/kernel/qguiapplication_p.h b/src/gui/kernel/qguiapplication_p.h
index 435994cdd3..78641de55b 100644
--- a/src/gui/kernel/qguiapplication_p.h
+++ b/src/gui/kernel/qguiapplication_p.h
@@ -126,6 +126,8 @@ public:
static bool processNativeEvent(QWindow *window, const QByteArray &eventType, void *message, long *result);
+ static void sendQWindowEventToQPlatformWindow(QWindow *window, QEvent *event);
+
static inline Qt::Alignment visualAlignment(Qt::LayoutDirection direction, Qt::Alignment alignment)
{
if (!(alignment & Qt::AlignHorizontal_Mask))
diff --git a/src/gui/kernel/qinputmethod.cpp b/src/gui/kernel/qinputmethod.cpp
index c443a47cac..0e0bc7237a 100644
--- a/src/gui/kernel/qinputmethod.cpp
+++ b/src/gui/kernel/qinputmethod.cpp
@@ -97,12 +97,7 @@ QObject *QInputMethod::inputItem() const
void QInputMethod::setInputItem(QObject *inputItem)
{
Q_D(QInputMethod);
-
- if (d->inputItem.data() == inputItem)
- return;
-
- d->inputItem = inputItem;
- emit inputItemChanged();
+ d->setInputItem(inputItem);
}
/*!
@@ -112,7 +107,7 @@ void QInputMethod::setInputItem(QObject *inputItem)
*/
QWindow *QInputMethod::inputWindow() const
{
- return qApp->activeWindow();
+ return qApp->focusWindow();
}
/*!
@@ -299,7 +294,7 @@ void QInputMethod::update(Qt::InputMethodQueries queries)
if (queries & Qt::ImEnabled) {
QObject *focus = qApp->focusObject();
bool enabled = d->objectAcceptsInputMethod(focus);
- setInputItem(enabled ? focus : 0);
+ d->setInputItem(enabled ? focus : 0);
QPlatformInputContextPrivate::setInputMethodAccepted(enabled);
}
@@ -365,9 +360,8 @@ void QInputMethodPrivate::q_connectFocusObject()
void QInputMethodPrivate::q_checkFocusObject(QObject *object)
{
- Q_Q(QInputMethod);
bool enabled = objectAcceptsInputMethod(object);
- q->setInputItem(enabled ? object : 0);
+ setInputItem(enabled ? object : 0);
}
bool QInputMethodPrivate::objectAcceptsInputMethod(QObject *object)
diff --git a/src/gui/kernel/qinputmethod.h b/src/gui/kernel/qinputmethod.h
index 92ae016b97..095c17ffd8 100644
--- a/src/gui/kernel/qinputmethod.h
+++ b/src/gui/kernel/qinputmethod.h
@@ -69,11 +69,13 @@ class Q_GUI_EXPORT QInputMethod : public QObject
Q_ENUMS(Action)
public:
+#ifdef QT_DEPRECATED
QT_DEPRECATED QObject *inputItem() const;
QT_DEPRECATED void setInputItem(QObject *inputItemChanged);
// the window containing the editor
QT_DEPRECATED QWindow *inputWindow() const;
+#endif
QTransform inputItemTransform() const;
void setInputItemTransform(const QTransform &transform);
diff --git a/src/gui/kernel/qinputmethod_p.h b/src/gui/kernel/qinputmethod_p.h
index 34a0430f10..1e55b00318 100644
--- a/src/gui/kernel/qinputmethod_p.h
+++ b/src/gui/kernel/qinputmethod_p.h
@@ -69,6 +69,17 @@ public:
{
return inputMethod->d_func();
}
+ inline void setInputItem(QObject *item)
+ {
+ Q_Q(QInputMethod);
+
+ if (inputItem.data() == item)
+ return;
+
+ inputItem = item;
+ emit q->inputItemChanged();
+ }
+
void q_connectFocusObject();
void q_checkFocusObject(QObject *object);
bool objectAcceptsInputMethod(QObject *object);
diff --git a/src/gui/kernel/qkeysequence.cpp b/src/gui/kernel/qkeysequence.cpp
index c616681b64..4946a1dc18 100644
--- a/src/gui/kernel/qkeysequence.cpp
+++ b/src/gui/kernel/qkeysequence.cpp
@@ -55,14 +55,14 @@
#endif
#include "qvariant.h"
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
#include <QtCore/private/qcore_mac_p.h>
#include <Carbon/Carbon.h>
#endif
QT_BEGIN_NAMESPACE
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
static bool qt_sequence_no_mnemonics = true;
struct MacSpecialKey {
int key;
@@ -876,7 +876,7 @@ const uint QKeySequencePrivate::numberOfKeyBindings = sizeof(QKeySequencePrivate
\value Underline Underline text.
\value Undo Undo.
\value UnknownKey Unbound key.
- \value WhatsThis Activate whats this.
+ \value WhatsThis Activate "what's this".
\value ZoomIn Zoom in.
\value ZoomOut Zoom out.
*/
@@ -966,7 +966,7 @@ QKeySequence::QKeySequence(const QKeySequence& keysequence)
d->ref.ref();
}
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
static inline int maybeSwapShortcut(int shortcut)
{
if (qApp->testAttribute(Qt::AA_MacDontSwapCtrlAndMeta)) {
@@ -998,7 +998,7 @@ QList<QKeySequence> QKeySequence::keyBindings(StandardKey key)
QKeyBinding keyBinding = QKeySequencePrivate::keyBindings[i];
if (keyBinding.standardKey == key && (keyBinding.platform & platform)) {
uint shortcut =
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
maybeSwapShortcut(QKeySequencePrivate::keyBindings[i].shortcut);
#else
QKeySequencePrivate::keyBindings[i].shortcut;
@@ -1200,7 +1200,7 @@ int QKeySequencePrivate::decodeString(const QString &str, QKeySequence::Sequence
if (nativeText) {
gmodifs = globalModifs();
if (gmodifs->isEmpty()) {
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
const bool dontSwap = qApp->testAttribute(Qt::AA_MacDontSwapCtrlAndMeta);
if (dontSwap)
*gmodifs << QModifKeyName(Qt::META, QChar(kCommandUnicode));
@@ -1240,7 +1240,7 @@ int QKeySequencePrivate::decodeString(const QString &str, QKeySequence::Sequence
modifs += *gmodifs; // Test non-translated ones last
QString sl = accel;
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
for (int i = 0; i < modifs.size(); ++i) {
const QModifKeyName &mkf = modifs.at(i);
if (sl.contains(mkf.name)) {
@@ -1292,7 +1292,7 @@ int QKeySequencePrivate::decodeString(const QString &str, QKeySequence::Sequence
int fnum = 0;
if (accel.length() == 1) {
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
int qtKey = qtkeyForMacSymbol(accel[0]);
if (qtKey != -1) {
ret |= qtKey;
@@ -1371,7 +1371,7 @@ QString QKeySequencePrivate::encodeString(int key, QKeySequence::SequenceFormat
if (key == -1 || key == Qt::Key_unknown)
return s;
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
if (nativeText) {
// On Mac OS X the order (by default) is Meta, Alt, Shift, Control.
// If the AA_MacDontSwapCtrlAndMeta is enabled, then the order
@@ -1427,7 +1427,7 @@ QString QKeySequencePrivate::encodeString(int key, QKeySequence::SequenceFormat
: QString::fromLatin1("F%1").arg(key - Qt::Key_F1 + 1);
} else if (key) {
int i=0;
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
if (nativeText) {
QChar ch = qt_macSymbolForQtKey(key);
if (!ch.isNull())
@@ -1437,7 +1437,7 @@ QString QKeySequencePrivate::encodeString(int key, QKeySequence::SequenceFormat
} else
#endif
{
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
NonSymbol:
#endif
while (keyname[i].name) {
@@ -1463,7 +1463,7 @@ NonSymbol:
}
}
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
if (nativeText)
s += p;
else
diff --git a/src/gui/kernel/qplatformclipboard_qpa.cpp b/src/gui/kernel/qplatformclipboard_qpa.cpp
index bc08a73a7f..7273450077 100644
--- a/src/gui/kernel/qplatformclipboard_qpa.cpp
+++ b/src/gui/kernel/qplatformclipboard_qpa.cpp
@@ -79,6 +79,16 @@ QClipboardData::~QClipboardData()
Q_GLOBAL_STATIC(QClipboardData,q_clipboardData);
+/*!
+ \class QPlatformClipboard
+ \since 5.0
+ \internal
+ \preliminary
+ \ingroup qpa
+
+ \brief The QPlatformClipboard class provides an abstraction for the system clipboard.
+ */
+
QPlatformClipboard::~QPlatformClipboard()
{
diff --git a/src/gui/kernel/qplatformclipboard_qpa.h b/src/gui/kernel/qplatformclipboard_qpa.h
index 4dd672b21e..95c8103b7e 100644
--- a/src/gui/kernel/qplatformclipboard_qpa.h
+++ b/src/gui/kernel/qplatformclipboard_qpa.h
@@ -42,6 +42,17 @@
#ifndef QPLATFORMCLIPBOARD_QPA_H
#define QPLATFORMCLIPBOARD_QPA_H
+//
+// 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 <qplatformdefs.h>
#ifndef QT_NO_CLIPBOARD
diff --git a/src/gui/kernel/qplatformcursor_qpa.cpp b/src/gui/kernel/qplatformcursor_qpa.cpp
index a4e998ddbc..5ea080c40a 100644
--- a/src/gui/kernel/qplatformcursor_qpa.cpp
+++ b/src/gui/kernel/qplatformcursor_qpa.cpp
@@ -62,6 +62,10 @@ QList<QPlatformCursor *> QPlatformCursorPrivate::getInstances()
/*!
\class QPlatformCursor
+ \since 5.0
+ \internal
+ \preliminary
+ \ingroup qpa
\brief The QPlatformCursor class provides information about
pointer device events (movement, buttons), and requests to change
@@ -124,6 +128,10 @@ void QPlatformCursor::setPos(const QPoint &pos)
/*!
\class QPlatformCursorImage
+ \since 5.0
+ \internal
+ \preliminary
+ \ingroup qpa
\brief The QPlatformCursorImage class provides a set of graphics
intended to be used as cursors.
diff --git a/src/gui/kernel/qplatformcursor_qpa.h b/src/gui/kernel/qplatformcursor_qpa.h
index c1a572b27d..fb3e4604d2 100644
--- a/src/gui/kernel/qplatformcursor_qpa.h
+++ b/src/gui/kernel/qplatformcursor_qpa.h
@@ -41,6 +41,17 @@
#ifndef QPLATFORMCURSOR_QPA_H
#define QPLATFORMCURSOR_QPA_H
+//
+// 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 <QtCore/QList>
#include <QtGui/QImage>
#include <QtGui/QMouseEvent>
diff --git a/src/gui/kernel/qplatformdialoghelper_qpa.cpp b/src/gui/kernel/qplatformdialoghelper_qpa.cpp
index 385484828a..f2114d17e0 100644
--- a/src/gui/kernel/qplatformdialoghelper_qpa.cpp
+++ b/src/gui/kernel/qplatformdialoghelper_qpa.cpp
@@ -54,6 +54,8 @@ QT_BEGIN_NAMESPACE
\class QPlatformDialogHelper
\since 5.0
\internal
+ \ingroup qpa
+
\brief The QPlatformDialogHelper class allows for platform-specific customization of dialogs.
*/
@@ -159,6 +161,15 @@ QFontDialogOptions::FontDialogOptions QFontDialogOptions::options() const
return d->options;
}
+/*!
+ \class QPlatformFontDialogHelper
+ \since 5.0
+ \internal
+ \ingroup qpa
+
+ \brief The QPlatformFontDialogHelper class allows for platform-specific customization of font dialogs.
+
+*/
const QSharedPointer<QFontDialogOptions> &QPlatformFontDialogHelper::options() const
{
return m_options;
@@ -327,6 +338,15 @@ void QColorDialogOptions::setStandardColor(int index, QRgb color)
qColorDialogStaticData()->standardRgb[index] = color;
}
+/*!
+ \class QPlatformColorDialogHelper
+ \since 5.0
+ \internal
+ \ingroup qpa
+
+ \brief The QPlatformColorDialogHelper class allows for platform-specific customization of color dialogs.
+
+*/
const QSharedPointer<QColorDialogOptions> &QPlatformColorDialogHelper::options() const
{
return m_options;
@@ -543,6 +563,15 @@ void QFileDialogOptions::setInitiallySelectedFiles(const QStringList &files)
d->initiallySelectedFiles = files;
}
+/*!
+ \class QPlatformFileDialogHelper
+ \since 5.0
+ \internal
+ \ingroup qpa
+
+ \brief The QPlatformFileDialogHelper class allows for platform-specific customization of file dialogs.
+
+*/
const QSharedPointer<QFileDialogOptions> &QPlatformFileDialogHelper::options() const
{
return m_options;
diff --git a/src/gui/kernel/qplatformdialoghelper_qpa.h b/src/gui/kernel/qplatformdialoghelper_qpa.h
index 5fdffae5cb..5cd3ab055b 100644
--- a/src/gui/kernel/qplatformdialoghelper_qpa.h
+++ b/src/gui/kernel/qplatformdialoghelper_qpa.h
@@ -42,6 +42,17 @@
#ifndef QPLATFORMDIALOGHELPER_H
#define QPLATFORMDIALOGHELPER_H
+//
+// 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 <QtCore/QtGlobal>
#include <QtCore/QObject>
#include <QtCore/QList>
@@ -73,11 +84,6 @@ public:
SnapToDefaultButton
};
enum DialogCode { Rejected, Accepted };
- enum ShowFlag {
- ShowModal = 0x00000001
- };
-
- Q_DECLARE_FLAGS(ShowFlags, ShowFlag)
QPlatformDialogHelper();
virtual ~QPlatformDialogHelper();
@@ -88,8 +94,8 @@ public:
virtual void _q_platformRunNativeAppModalPanel() = 0;
virtual void deleteNativeDialog_sys() = 0;
- virtual bool show_sys(ShowFlags showFlags,
- Qt::WindowFlags windowFlags,
+ virtual bool show_sys(Qt::WindowFlags windowFlags,
+ Qt::WindowModality windowModality,
QWindow *parent) = 0;
virtual void hide_sys() = 0;
diff --git a/src/gui/kernel/qplatformdrag_qpa.cpp b/src/gui/kernel/qplatformdrag_qpa.cpp
index 0e7b0f41cc..d9fc3a2ab8 100644
--- a/src/gui/kernel/qplatformdrag_qpa.cpp
+++ b/src/gui/kernel/qplatformdrag_qpa.cpp
@@ -82,6 +82,15 @@ public:
Qt::DropAction cursor_drop_action;
};
+/*!
+ \class QPlatformDrag
+ \since 5.0
+ \internal
+ \preliminary
+ \ingroup qpa
+
+ \brief The QPlatformDrag class provides an abstraction for drag.
+ */
QPlatformDrag::QPlatformDrag() : d_ptr(new QPlatformDragPrivate)
{
}
diff --git a/src/gui/kernel/qplatformdrag_qpa.h b/src/gui/kernel/qplatformdrag_qpa.h
index 22133706d1..14282c5a21 100644
--- a/src/gui/kernel/qplatformdrag_qpa.h
+++ b/src/gui/kernel/qplatformdrag_qpa.h
@@ -42,6 +42,17 @@
#ifndef QPLATFORMDRAG_H
#define QPLATFORMDRAG_H
+//
+// 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 <QtCore/qglobal.h>
#include <QtGui/QPixmap>
diff --git a/src/gui/kernel/qplatforminputcontext_qpa.cpp b/src/gui/kernel/qplatforminputcontext_qpa.cpp
index 8612b4b42f..53839088c5 100644
--- a/src/gui/kernel/qplatforminputcontext_qpa.cpp
+++ b/src/gui/kernel/qplatforminputcontext_qpa.cpp
@@ -49,6 +49,10 @@ QT_BEGIN_NAMESPACE
/*!
\class QPlatformInputContext
+ \since 5.0
+ \internal
+ \preliminary
+ \ingroup qpa
\brief The QPlatformInputContext class abstracts the input method dependent data and composing state.
An input method is responsible for inputting complex text that cannot
diff --git a/src/gui/kernel/qplatforminputcontext_qpa.h b/src/gui/kernel/qplatforminputcontext_qpa.h
index 5e8060c6e0..696146b859 100644
--- a/src/gui/kernel/qplatforminputcontext_qpa.h
+++ b/src/gui/kernel/qplatforminputcontext_qpa.h
@@ -42,6 +42,17 @@
#ifndef QPLATFORMINPUTCONTEXT_H
#define QPLATFORMINPUTCONTEXT_H
+//
+// 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 <QtGui/qinputpanel.h>
QT_BEGIN_HEADER
diff --git a/src/gui/kernel/qplatformintegration_qpa.h b/src/gui/kernel/qplatformintegration_qpa.h
index fe40fd3dad..a44f4343ef 100644
--- a/src/gui/kernel/qplatformintegration_qpa.h
+++ b/src/gui/kernel/qplatformintegration_qpa.h
@@ -42,6 +42,17 @@
#ifndef QPLATFORMINTEGRATION_H
#define QPLATFORMINTEGRATION_H
+//
+// 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 <QtGui/qwindowdefs.h>
#include <QtGui/qplatformscreen_qpa.h>
#include <QtGui/qsurfaceformat.h>
diff --git a/src/gui/kernel/qplatformnativeinterface_qpa.cpp b/src/gui/kernel/qplatformnativeinterface_qpa.cpp
index 48e43f5226..c17eee4415 100644
--- a/src/gui/kernel/qplatformnativeinterface_qpa.cpp
+++ b/src/gui/kernel/qplatformnativeinterface_qpa.cpp
@@ -43,6 +43,17 @@
QT_BEGIN_NAMESPACE
+/*!
+ \class QPlatformNativeInterface
+ \since 5.0
+ \internal
+ \preliminary
+ \ingroup qpa
+
+ \brief The QPlatformNativeInterface class provides an abstraction for retrieving native
+ resource handles.
+ */
+
void *QPlatformNativeInterface::nativeResourceForIntegration(const QByteArray &resource)
{
Q_UNUSED(resource);
@@ -69,6 +80,30 @@ void * QPlatformNativeInterface::nativeResourceForBackingStore(const QByteArray
return 0;
}
+QPlatformNativeInterface::NativeResourceForIntegrationFunction QPlatformNativeInterface::nativeResourceFunctionForIntegration(const QByteArray &resource)
+{
+ Q_UNUSED(resource);
+ return 0;
+}
+
+QPlatformNativeInterface::NativeResourceForContextFunction QPlatformNativeInterface::nativeResourceFunctionForContext(const QByteArray &resource)
+{
+ Q_UNUSED(resource);
+ return 0;
+}
+
+QPlatformNativeInterface::NativeResourceForWindowFunction QPlatformNativeInterface::nativeResourceFunctionForWindow(const QByteArray &resource)
+{
+ Q_UNUSED(resource);
+ return 0;
+}
+
+QPlatformNativeInterface::NativeResourceForBackingStoreFunction QPlatformNativeInterface::nativeResourceFunctionForBackingStore(const QByteArray &resource)
+{
+ Q_UNUSED(resource);
+ return 0;
+}
+
/*!
Contains generic window properties that the platform may utilize.
*/
diff --git a/src/gui/kernel/qplatformnativeinterface_qpa.h b/src/gui/kernel/qplatformnativeinterface_qpa.h
index dd1ef22354..918ba4a9b8 100644
--- a/src/gui/kernel/qplatformnativeinterface_qpa.h
+++ b/src/gui/kernel/qplatformnativeinterface_qpa.h
@@ -42,6 +42,17 @@
#ifndef QPLATFORMNATIVEINTERFACE_QPA_H
#define QPLATFORMNATIVEINTERFACE_QPA_H
+//
+// 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 <QtGui/qwindowdefs.h>
#include <QtCore/QObject>
#include <QtCore/QVariant>
@@ -65,6 +76,15 @@ public:
virtual void *nativeResourceForWindow(const QByteArray &resource, QWindow *window);
virtual void *nativeResourceForBackingStore(const QByteArray &resource, QBackingStore *backingStore);
+ typedef void * (*NativeResourceForIntegrationFunction)();
+ typedef void * (*NativeResourceForContextFunction)(QOpenGLContext *context);
+ typedef void * (*NativeResourceForWindowFunction)(QWindow *window);
+ typedef void * (*NativeResourceForBackingStoreFunction)(QBackingStore *backingStore);
+ virtual NativeResourceForIntegrationFunction nativeResourceFunctionForIntegration(const QByteArray &resource);
+ virtual NativeResourceForContextFunction nativeResourceFunctionForContext(const QByteArray &resource);
+ virtual NativeResourceForWindowFunction nativeResourceFunctionForWindow(const QByteArray &resource);
+ virtual NativeResourceForBackingStoreFunction nativeResourceFunctionForBackingStore(const QByteArray &resource);
+
virtual QVariantMap windowProperties(QPlatformWindow *window) const;
virtual QVariant windowProperty(QPlatformWindow *window, const QString &name) const;
virtual QVariant windowProperty(QPlatformWindow *window, const QString &name, const QVariant &defaultValue) const;
diff --git a/src/gui/kernel/qplatformopenglcontext_qpa.h b/src/gui/kernel/qplatformopenglcontext_qpa.h
index af70368f5e..ddcb87ad5a 100644
--- a/src/gui/kernel/qplatformopenglcontext_qpa.h
+++ b/src/gui/kernel/qplatformopenglcontext_qpa.h
@@ -42,6 +42,17 @@
#ifndef QPLATFORMGLCONTEXT_H
#define QPLATFORMGLCONTEXT_H
+//
+// 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.
+//
+
#ifndef QT_NO_OPENGL
#include <QtCore/qnamespace.h>
diff --git a/src/gui/kernel/qplatformscreen_qpa.h b/src/gui/kernel/qplatformscreen_qpa.h
index b6eb91f9b2..71d734867e 100644
--- a/src/gui/kernel/qplatformscreen_qpa.h
+++ b/src/gui/kernel/qplatformscreen_qpa.h
@@ -42,6 +42,17 @@
#ifndef QPLATFORMSCREEN_H
#define QPLATFORMSCREEN_H
+//
+// 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 <QtCore/qmetatype.h>
#include <QtCore/qnamespace.h>
#include <QtCore/qcoreevent.h>
diff --git a/src/gui/kernel/qplatformscreenpageflipper_qpa.cpp b/src/gui/kernel/qplatformscreenpageflipper_qpa.cpp
index d652e34e5e..b912c6055e 100644
--- a/src/gui/kernel/qplatformscreenpageflipper_qpa.cpp
+++ b/src/gui/kernel/qplatformscreenpageflipper_qpa.cpp
@@ -43,6 +43,15 @@
QT_BEGIN_NAMESPACE
+/*!
+ \class QPlatformScreenBuffer
+ \since 5.0
+ \internal
+ \preliminary
+ \ingroup qpa
+
+ \brief The QPlatformScreenBuffer class provides an abstraction for screen buffers.
+ */
QPlatformScreenBuffer::QPlatformScreenBuffer()
: m_destroyed(false)
, m_ready(true)
@@ -73,6 +82,18 @@ void QPlatformScreenBuffer::displayed()
{
}
+
+/*!
+ \class QPlatformScreenPageFlipper
+ \since 5.0
+ \internal
+ \preliminary
+ \ingroup qpa
+
+ \brief The QPlatformScreenPageFlipper class provides an abstraction for flipping the screen
+ page.
+ */
+
QPlatformScreenPageFlipper::QPlatformScreenPageFlipper(QObject *parent)
:QObject(parent)
{
diff --git a/src/gui/kernel/qplatformscreenpageflipper_qpa.h b/src/gui/kernel/qplatformscreenpageflipper_qpa.h
index 850f9d8d2f..116d2dbf82 100644
--- a/src/gui/kernel/qplatformscreenpageflipper_qpa.h
+++ b/src/gui/kernel/qplatformscreenpageflipper_qpa.h
@@ -42,6 +42,17 @@
#ifndef QPLATFORMSCREENPAGEFLIPPER_QPA_H
#define QPLATFORMSCREENPAGEFLIPPER_QPA_H
+//
+// 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 <QtCore/QObject>
QT_BEGIN_HEADER
diff --git a/src/gui/kernel/qplatformservices_qpa.h b/src/gui/kernel/qplatformservices_qpa.h
index aff2e5d6fe..c9bfe020ab 100644
--- a/src/gui/kernel/qplatformservices_qpa.h
+++ b/src/gui/kernel/qplatformservices_qpa.h
@@ -42,6 +42,17 @@
#ifndef QPLATFORMSERVICES_QPA_H
#define QPLATFORMSERVICES_QPA_H
+//
+// 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 <QtCore/QtGlobal>
QT_BEGIN_HEADER
diff --git a/src/gui/kernel/qplatformsharedgraphicscache_qpa.h b/src/gui/kernel/qplatformsharedgraphicscache_qpa.h
index 8a92dbdd31..679b8ab7de 100644
--- a/src/gui/kernel/qplatformsharedgraphicscache_qpa.h
+++ b/src/gui/kernel/qplatformsharedgraphicscache_qpa.h
@@ -42,6 +42,17 @@
#ifndef QPLATFORMSHAREDGRAPHICSCACHE_QPA_H
#define QPLATFORMSHAREDGRAPHICSCACHE_QPA_H
+//
+// 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 <QtCore/qobject.h>
#include <QtGui/qimage.h>
diff --git a/src/gui/kernel/qplatformsurface_qpa.cpp b/src/gui/kernel/qplatformsurface_qpa.cpp
index 6d3b6503d7..1f752fe3e2 100644
--- a/src/gui/kernel/qplatformsurface_qpa.cpp
+++ b/src/gui/kernel/qplatformsurface_qpa.cpp
@@ -43,6 +43,15 @@
QT_BEGIN_NAMESPACE
+/*!
+ \class QPlatformSurface
+ \since 5.0
+ \internal
+ \preliminary
+ \ingroup qpa
+
+ \brief The QPlatformSurface class provides an abstraction for a surface.
+ */
QPlatformSurface::~QPlatformSurface()
{
diff --git a/src/gui/kernel/qplatformsurface_qpa.h b/src/gui/kernel/qplatformsurface_qpa.h
index 80ee99c899..f64a697fc5 100644
--- a/src/gui/kernel/qplatformsurface_qpa.h
+++ b/src/gui/kernel/qplatformsurface_qpa.h
@@ -42,6 +42,17 @@
#ifndef QPLATFORMSURFACE_H
#define QPLATFORMSURFACE_H
+//
+// 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 <QtCore/qnamespace.h>
#include <QtGui/qsurface.h>
#include <QtGui/qsurfaceformat.h>
diff --git a/src/gui/kernel/qplatformtheme_qpa.h b/src/gui/kernel/qplatformtheme_qpa.h
index 6ac6a0f573..8d936e8267 100644
--- a/src/gui/kernel/qplatformtheme_qpa.h
+++ b/src/gui/kernel/qplatformtheme_qpa.h
@@ -42,6 +42,17 @@
#ifndef QPLATFORMTHEME_H
#define QPLATFORMTHEME_H
+//
+// 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 <QtCore/QtGlobal>
QT_BEGIN_HEADER
diff --git a/src/gui/kernel/qplatformthemeplugin_qpa.cpp b/src/gui/kernel/qplatformthemeplugin_qpa.cpp
index 8383c9b948..da2743d6e3 100644
--- a/src/gui/kernel/qplatformthemeplugin_qpa.cpp
+++ b/src/gui/kernel/qplatformthemeplugin_qpa.cpp
@@ -43,6 +43,15 @@
QT_BEGIN_NAMESPACE
+/*!
+ \class QPlatformThemePlugin
+ \since 5.0
+ \internal
+ \preliminary
+ \ingroup qpa
+
+ \brief The QPlatformScreen class provides an abstraction for theme plugins.
+ */
QPlatformThemePlugin::QPlatformThemePlugin(QObject *parent)
: QObject(parent)
{
diff --git a/src/gui/kernel/qplatformwindow_qpa.cpp b/src/gui/kernel/qplatformwindow_qpa.cpp
index a9dfbba788..b507eb4fdd 100644
--- a/src/gui/kernel/qplatformwindow_qpa.cpp
+++ b/src/gui/kernel/qplatformwindow_qpa.cpp
@@ -147,6 +147,7 @@ QMargins QPlatformWindow::frameMargins() const
*/
void QPlatformWindow::setVisible(bool visible)
{
+ Q_UNUSED(visible);
QRect rect(QPoint(), geometry().size());
QWindowSystemInterface::handleSynchronousExposeEvent(window(), rect);
}
@@ -313,6 +314,29 @@ bool QPlatformWindow::setMouseGrabEnabled(bool grab)
}
/*!
+ Reimplement to be able to let Qt indicate that the window has been
+ modified. Return true if the native window supports setting the modified
+ flag, false otherwise.
+*/
+bool QPlatformWindow::setWindowModified(bool modified)
+{
+ Q_UNUSED(modified);
+ return false;
+}
+
+/*!
+ Reimplement this method to be able to do any platform specific event
+ handling. All events for window() are passed to this function before being
+ sent to QWindow::event().
+
+ The default implementation is empty and does nothing with \a event.
+*/
+void QPlatformWindow::windowEvent(QEvent *event)
+{
+ Q_UNUSED(event);
+}
+
+/*!
\class QPlatformWindow
\since 4.8
\internal
diff --git a/src/gui/kernel/qplatformwindow_qpa.h b/src/gui/kernel/qplatformwindow_qpa.h
index a72de7b547..729f35e025 100644
--- a/src/gui/kernel/qplatformwindow_qpa.h
+++ b/src/gui/kernel/qplatformwindow_qpa.h
@@ -41,6 +41,17 @@
#ifndef QPLATFORMWINDOW_H
#define QPLATFORMWINDOW_H
+//
+// 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 <QtCore/qscopedpointer.h>
#include <QtCore/qrect.h>
#include <QtCore/qmargins.h>
@@ -102,6 +113,10 @@ public:
virtual bool setKeyboardGrabEnabled(bool grab);
virtual bool setMouseGrabEnabled(bool grab);
+ virtual bool setWindowModified(bool modified);
+
+ virtual void windowEvent(QEvent *event);
+
protected:
QScopedPointer<QPlatformWindowPrivate> d_ptr;
private:
diff --git a/src/gui/opengl/opengl.pri b/src/gui/opengl/opengl.pri
index f0d9000fb6..3becc2bcfe 100644
--- a/src/gui/opengl/opengl.pri
+++ b/src/gui/opengl/opengl.pri
@@ -4,7 +4,7 @@ contains(QT_CONFIG, opengl):CONFIG += opengl
contains(QT_CONFIG, opengles2):CONFIG += opengles2
contains(QT_CONFIG, egl):CONFIG += egl
-contains(QT_CONFIG, opengl)|contains(QT_CONFIG, opengles2)|contains(QT_CONFIG, egl) {
+contains(QT_CONFIG, opengl)|contains(QT_CONFIG, opengles2) {
HEADERS += opengl/qopengl.h \
opengl/qopengl_p.h \
diff --git a/src/gui/opengl/qopenglshaderprogram.cpp b/src/gui/opengl/qopenglshaderprogram.cpp
index 69b4fc9858..c0899e5a41 100644
--- a/src/gui/opengl/qopenglshaderprogram.cpp
+++ b/src/gui/opengl/qopenglshaderprogram.cpp
@@ -510,7 +510,7 @@ class QOpenGLShaderProgramPrivate : public QObjectPrivate
{
Q_DECLARE_PUBLIC(QOpenGLShaderProgram)
public:
- QOpenGLShaderProgramPrivate(QOpenGLContext *ctx)
+ QOpenGLShaderProgramPrivate()
: programGuard(0)
, linked(false)
, inited(false)
@@ -518,7 +518,7 @@ public:
, geometryVertexCount(64)
, geometryInputType(0)
, geometryOutputType(0)
- , glfuncs(new QOpenGLFunctions(ctx))
+ , glfuncs(new QOpenGLFunctions)
{
}
~QOpenGLShaderProgramPrivate();
@@ -574,7 +574,7 @@ bool QOpenGLShaderProgramPrivate::hasShader(QOpenGLShader::ShaderType type) cons
\sa addShader()
*/
QOpenGLShaderProgram::QOpenGLShaderProgram(QObject *parent)
- : QObject(*new QOpenGLShaderProgramPrivate(QOpenGLContext::currentContext()), parent)
+ : QObject(*new QOpenGLShaderProgramPrivate, parent)
{
}
@@ -594,6 +594,7 @@ bool QOpenGLShaderProgram::init()
QOpenGLContext *context = const_cast<QOpenGLContext *>(QOpenGLContext::currentContext());
if (!context)
return false;
+ d->glfuncs->initializeGLFunctions();
GLuint program = d->glfuncs->glCreateProgram();
if (!program) {
qWarning() << "QOpenGLShaderProgram: could not create shader program";
diff --git a/src/gui/opengl/qopengltextureglyphcache.cpp b/src/gui/opengl/qopengltextureglyphcache.cpp
index b37e8fb972..790b92a686 100644
--- a/src/gui/opengl/qopengltextureglyphcache.cpp
+++ b/src/gui/opengl/qopengltextureglyphcache.cpp
@@ -106,8 +106,10 @@ void QOpenGLTextureGlyphCache::createTextureData(int width, int height)
if (height < 16)
height = 16;
- if (m_textureResource && !m_textureResource->m_texture)
+ if (m_textureResource && !m_textureResource->m_texture) {
delete m_textureResource;
+ m_textureResource = 0;
+ }
if (!m_textureResource)
m_textureResource = new QOpenGLGlyphTexture(ctx);
diff --git a/src/gui/opengl/qtriangulator.cpp b/src/gui/opengl/qtriangulator.cpp
index c82b2a4ca8..74d33cd7e9 100644
--- a/src/gui/opengl/qtriangulator.cpp
+++ b/src/gui/opengl/qtriangulator.cpp
@@ -1133,7 +1133,7 @@ void QTriangulator<T>::ComplexToSimple::initEdges()
} else {
Q_ASSERT(i + 1 < m_parent->m_indices.size());
// {node, from, to, next, previous, winding, mayIntersect, pointingUp, originallyPointingUp}
- Edge edge = {0, m_parent->m_indices.at(i), m_parent->m_indices.at(i + 1), -1, -1, 0, true, false, false};
+ Edge edge = {0, int(m_parent->m_indices.at(i)), int(m_parent->m_indices.at(i + 1)), -1, -1, 0, true, false, false};
m_edges.add(edge);
}
}
diff --git a/src/gui/painting/qbrush.cpp b/src/gui/painting/qbrush.cpp
index fe9b370189..2f0fb9f96c 100644
--- a/src/gui/painting/qbrush.cpp
+++ b/src/gui/painting/qbrush.cpp
@@ -100,7 +100,7 @@ QPixmap qt_pixmapForBrush(int brushStyle, bool invert)
{
QPixmap pm;
- QString key = QLatin1Literal("$qt-brush$")
+ QString key = QLatin1String("$qt-brush$")
% HexString<uint>(brushStyle)
% QLatin1Char(invert ? '1' : '0');
if (!QPixmapCache::find(key, pm)) {
diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp
index 919a19eb9b..17877b79d5 100644
--- a/src/gui/painting/qdrawhelper.cpp
+++ b/src/gui/painting/qdrawhelper.cpp
@@ -68,7 +68,6 @@
QT_BEGIN_NAMESPACE
-
#define MASK(src, a) src = BYTE_MUL(src, a)
/*
@@ -316,7 +315,7 @@ FetchPixelFunc qFetchPixel[QPixelLayout::BPPCount] = {
static uint * QT_FASTCALL destFetchMono(uint *buffer, QRasterBuffer *rasterBuffer, int x, int y, int length)
{
- uchar *data = (uchar *)rasterBuffer->scanLine(y);
+ uchar *Q_DECL_RESTRICT data = (uchar *)rasterBuffer->scanLine(y);
uint *start = buffer;
const uint *end = buffer + length;
while (buffer < end) {
@@ -329,7 +328,7 @@ static uint * QT_FASTCALL destFetchMono(uint *buffer, QRasterBuffer *rasterBuffe
static uint * QT_FASTCALL destFetchMonoLsb(uint *buffer, QRasterBuffer *rasterBuffer, int x, int y, int length)
{
- uchar *data = (uchar *)rasterBuffer->scanLine(y);
+ uchar *Q_DECL_RESTRICT data = (uchar *)rasterBuffer->scanLine(y);
uint *start = buffer;
const uint *end = buffer + length;
while (buffer < end) {
@@ -347,7 +346,7 @@ static uint * QT_FASTCALL destFetchARGB32P(uint *, QRasterBuffer *rasterBuffer,
static uint * QT_FASTCALL destFetchRGB16(uint *buffer, QRasterBuffer *rasterBuffer, int x, int y, int length)
{
- const ushort *data = (const ushort *)rasterBuffer->scanLine(y) + x;
+ const ushort *Q_DECL_RESTRICT data = (const ushort *)rasterBuffer->scanLine(y) + x;
for (int i = 0; i < length; ++i)
buffer[i] = qConvertRgb16To32(data[i]);
return buffer;
@@ -418,7 +417,7 @@ static inline QRgb findNearestColor(QRgb color, QRasterBuffer *rbuf)
static void QT_FASTCALL destStoreMono(QRasterBuffer *rasterBuffer, int x, int y, const uint *buffer, int length)
{
- uchar *data = (uchar *)rasterBuffer->scanLine(y);
+ uchar *Q_DECL_RESTRICT data = (uchar *)rasterBuffer->scanLine(y);
if (rasterBuffer->monoDestinationWithClut) {
for (int i = 0; i < length; ++i) {
if (buffer[i] == rasterBuffer->destColor0) {
@@ -445,7 +444,7 @@ static void QT_FASTCALL destStoreMono(QRasterBuffer *rasterBuffer, int x, int y,
static void QT_FASTCALL destStoreMonoLsb(QRasterBuffer *rasterBuffer, int x, int y, const uint *buffer, int length)
{
- uchar *data = (uchar *)rasterBuffer->scanLine(y);
+ uchar *Q_DECL_RESTRICT data = (uchar *)rasterBuffer->scanLine(y);
if (rasterBuffer->monoDestinationWithClut) {
for (int i = 0; i < length; ++i) {
if (buffer[i] == rasterBuffer->destColor0) {
@@ -566,9 +565,8 @@ static const uint *QT_FASTCALL fetchUntransformedRGB16(uint *buffer, const Opera
// blendType is either BlendTransformed or BlendTransformedTiled
template<TextureBlendType blendType>
-Q_STATIC_TEMPLATE_FUNCTION
-const uint *QT_FASTCALL fetchTransformedARGB32PM(uint *buffer, const Operator *, const QSpanData *data,
- int y, int x, int length)
+static const uint *QT_FASTCALL fetchTransformedARGB32PM(uint *buffer, const Operator *, const QSpanData *data,
+ int y, int x, int length)
{
int image_width = data->texture.width;
int image_height = data->texture.height;
@@ -648,8 +646,7 @@ const uint *QT_FASTCALL fetchTransformedARGB32PM(uint *buffer, const Operator *,
}
template<TextureBlendType blendType> /* either BlendTransformed or BlendTransformedTiled */
-Q_STATIC_TEMPLATE_FUNCTION
-const uint *QT_FASTCALL fetchTransformed(uint *buffer, const Operator *, const QSpanData *data,
+static const uint *QT_FASTCALL fetchTransformed(uint *buffer, const Operator *, const QSpanData *data,
int y, int x, int length)
{
int image_width = data->texture.width;
@@ -853,10 +850,9 @@ inline void fetchTransformedBilinear_pixelBounds<BlendTransformedBilinear>(int,
}
template<TextureBlendType blendType> /* blendType = BlendTransformedBilinear or BlendTransformedBilinearTiled */
-Q_STATIC_TEMPLATE_FUNCTION
-const uint * QT_FASTCALL fetchTransformedBilinearARGB32PM(uint *buffer, const Operator *,
- const QSpanData *data, int y, int x,
- int length)
+static const uint * QT_FASTCALL fetchTransformedBilinearARGB32PM(uint *buffer, const Operator *,
+ const QSpanData *data, int y, int x,
+ int length)
{
int image_width = data->texture.width;
int image_height = data->texture.height;
@@ -1303,9 +1299,8 @@ const uint * QT_FASTCALL fetchTransformedBilinearARGB32PM(uint *buffer, const Op
// blendType = BlendTransformedBilinear or BlendTransformedBilinearTiled
template<TextureBlendType blendType>
-Q_STATIC_TEMPLATE_FUNCTION
-const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *,
- const QSpanData *data, int y, int x, int length)
+static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *,
+ const QSpanData *data, int y, int x, int length)
{
const QPixelLayout *layout = &qPixelLayouts[data->texture.format];
const QRgb *clut = data->texture.colorTable ? data->texture.colorTable->constData() : 0;
@@ -2039,7 +2034,7 @@ void QT_FASTCALL comp_func_solid_Source(uint *dest, int length, uint color, uint
}
}
-void QT_FASTCALL comp_func_Source(uint *dest, const uint *src, int length, uint const_alpha)
+void QT_FASTCALL comp_func_Source(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha)
{
if (const_alpha == 255) {
::memcpy(dest, src, length * sizeof(uint));
@@ -2082,7 +2077,7 @@ void QT_FASTCALL comp_func_solid_SourceOver(uint *dest, int length, uint color,
}
}
-void QT_FASTCALL comp_func_SourceOver(uint *dest, const uint *src, int length, uint const_alpha)
+void QT_FASTCALL comp_func_SourceOver(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha)
{
PRELOAD_INIT2(dest, src)
if (const_alpha == 255) {
@@ -2120,7 +2115,7 @@ void QT_FASTCALL comp_func_solid_DestinationOver(uint *dest, int length, uint co
}
}
-void QT_FASTCALL comp_func_DestinationOver(uint *dest, const uint *src, int length, uint const_alpha)
+void QT_FASTCALL comp_func_DestinationOver(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha)
{
PRELOAD_INIT2(dest, src)
if (const_alpha == 255) {
@@ -2162,7 +2157,7 @@ void QT_FASTCALL comp_func_solid_SourceIn(uint *dest, int length, uint color, ui
}
}
-void QT_FASTCALL comp_func_SourceIn(uint *dest, const uint *src, int length, uint const_alpha)
+void QT_FASTCALL comp_func_SourceIn(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha)
{
PRELOAD_INIT2(dest, src)
if (const_alpha == 255) {
@@ -2199,7 +2194,7 @@ void QT_FASTCALL comp_func_solid_DestinationIn(uint *dest, int length, uint colo
}
}
-void QT_FASTCALL comp_func_DestinationIn(uint *dest, const uint *src, int length, uint const_alpha)
+void QT_FASTCALL comp_func_DestinationIn(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha)
{
PRELOAD_INIT2(dest, src)
if (const_alpha == 255) {
@@ -2241,7 +2236,7 @@ void QT_FASTCALL comp_func_solid_SourceOut(uint *dest, int length, uint color, u
}
}
-void QT_FASTCALL comp_func_SourceOut(uint *dest, const uint *src, int length, uint const_alpha)
+void QT_FASTCALL comp_func_SourceOut(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha)
{
PRELOAD_INIT2(dest, src)
if (const_alpha == 255) {
@@ -2277,7 +2272,7 @@ void QT_FASTCALL comp_func_solid_DestinationOut(uint *dest, int length, uint col
}
}
-void QT_FASTCALL comp_func_DestinationOut(uint *dest, const uint *src, int length, uint const_alpha)
+void QT_FASTCALL comp_func_DestinationOut(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha)
{
PRELOAD_INIT2(dest, src)
if (const_alpha == 255) {
@@ -2314,7 +2309,7 @@ void QT_FASTCALL comp_func_solid_SourceAtop(uint *dest, int length, uint color,
}
}
-void QT_FASTCALL comp_func_SourceAtop(uint *dest, const uint *src, int length, uint const_alpha)
+void QT_FASTCALL comp_func_SourceAtop(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha)
{
PRELOAD_INIT2(dest, src)
if (const_alpha == 255) {
@@ -2354,7 +2349,7 @@ void QT_FASTCALL comp_func_solid_DestinationAtop(uint *dest, int length, uint co
}
}
-void QT_FASTCALL comp_func_DestinationAtop(uint *dest, const uint *src, int length, uint const_alpha)
+void QT_FASTCALL comp_func_DestinationAtop(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha)
{
PRELOAD_INIT2(dest, src)
if (const_alpha == 255) {
@@ -2396,7 +2391,7 @@ void QT_FASTCALL comp_func_solid_XOR(uint *dest, int length, uint color, uint co
}
}
-void QT_FASTCALL comp_func_XOR(uint *dest, const uint *src, int length, uint const_alpha)
+void QT_FASTCALL comp_func_XOR(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha)
{
PRELOAD_INIT2(dest, src)
if (const_alpha == 255) {
@@ -2472,7 +2467,7 @@ void QT_FASTCALL comp_func_solid_Plus(uint *dest, int length, uint color, uint c
}
template <typename T>
-Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Plus_impl(uint *dest, const uint *src, int length, const T &coverage)
+Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Plus_impl(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, const T &coverage)
{
PRELOAD_INIT2(dest, src)
for (int i = 0; i < length; ++i) {
@@ -2486,7 +2481,7 @@ Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Plus_impl(uint *dest, const uin
}
}
-void QT_FASTCALL comp_func_Plus(uint *dest, const uint *src, int length, uint const_alpha)
+void QT_FASTCALL comp_func_Plus(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha)
{
if (const_alpha == 255)
comp_func_Plus_impl(dest, src, length, QFullCoverage());
@@ -2536,7 +2531,7 @@ void QT_FASTCALL comp_func_solid_Multiply(uint *dest, int length, uint color, ui
}
template <typename T>
-Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Multiply_impl(uint *dest, const uint *src, int length, const T &coverage)
+Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Multiply_impl(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, const T &coverage)
{
PRELOAD_INIT2(dest, src)
for (int i = 0; i < length; ++i) {
@@ -2558,7 +2553,7 @@ Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Multiply_impl(uint *dest, const
}
}
-void QT_FASTCALL comp_func_Multiply(uint *dest, const uint *src, int length, uint const_alpha)
+void QT_FASTCALL comp_func_Multiply(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha)
{
if (const_alpha == 255)
comp_func_Multiply_impl(dest, src, length, QFullCoverage());
@@ -2604,7 +2599,7 @@ void QT_FASTCALL comp_func_solid_Screen(uint *dest, int length, uint color, uint
}
template <typename T>
-Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Screen_impl(uint *dest, const uint *src, int length, const T &coverage)
+Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Screen_impl(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, const T &coverage)
{
PRELOAD_INIT2(dest, src)
for (int i = 0; i < length; ++i) {
@@ -2683,7 +2678,7 @@ void QT_FASTCALL comp_func_solid_Overlay(uint *dest, int length, uint color, uin
}
template <typename T>
-Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Overlay_impl(uint *dest, const uint *src, int length, const T &coverage)
+Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Overlay_impl(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, const T &coverage)
{
PRELOAD_INIT2(dest, src)
for (int i = 0; i < length; ++i) {
@@ -2705,7 +2700,7 @@ Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Overlay_impl(uint *dest, const
}
}
-void QT_FASTCALL comp_func_Overlay(uint *dest, const uint *src, int length, uint const_alpha)
+void QT_FASTCALL comp_func_Overlay(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha)
{
if (const_alpha == 255)
comp_func_Overlay_impl(dest, src, length, QFullCoverage());
@@ -2756,7 +2751,7 @@ void QT_FASTCALL comp_func_solid_Darken(uint *dest, int length, uint color, uint
}
template <typename T>
-Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Darken_impl(uint *dest, const uint *src, int length, const T &coverage)
+Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Darken_impl(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, const T &coverage)
{
PRELOAD_INIT2(dest, src)
for (int i = 0; i < length; ++i) {
@@ -2778,7 +2773,7 @@ Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Darken_impl(uint *dest, const u
}
}
-void QT_FASTCALL comp_func_Darken(uint *dest, const uint *src, int length, uint const_alpha)
+void QT_FASTCALL comp_func_Darken(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha)
{
if (const_alpha == 255)
comp_func_Darken_impl(dest, src, length, QFullCoverage());
@@ -2829,7 +2824,7 @@ void QT_FASTCALL comp_func_solid_Lighten(uint *dest, int length, uint color, uin
}
template <typename T>
-Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Lighten_impl(uint *dest, const uint *src, int length, const T &coverage)
+Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Lighten_impl(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, const T &coverage)
{
PRELOAD_INIT2(dest, src)
for (int i = 0; i < length; ++i) {
@@ -2851,7 +2846,7 @@ Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Lighten_impl(uint *dest, const
}
}
-void QT_FASTCALL comp_func_Lighten(uint *dest, const uint *src, int length, uint const_alpha)
+void QT_FASTCALL comp_func_Lighten(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha)
{
if (const_alpha == 255)
comp_func_Lighten_impl(dest, src, length, QFullCoverage());
@@ -2912,7 +2907,7 @@ void QT_FASTCALL comp_func_solid_ColorDodge(uint *dest, int length, uint color,
}
template <typename T>
-Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_ColorDodge_impl(uint *dest, const uint *src, int length, const T &coverage)
+Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_ColorDodge_impl(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, const T &coverage)
{
PRELOAD_INIT2(dest, src)
for (int i = 0; i < length; ++i) {
@@ -2934,7 +2929,7 @@ Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_ColorDodge_impl(uint *dest, con
}
}
-void QT_FASTCALL comp_func_ColorDodge(uint *dest, const uint *src, int length, uint const_alpha)
+void QT_FASTCALL comp_func_ColorDodge(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha)
{
if (const_alpha == 255)
comp_func_ColorDodge_impl(dest, src, length, QFullCoverage());
@@ -2995,7 +2990,7 @@ void QT_FASTCALL comp_func_solid_ColorBurn(uint *dest, int length, uint color, u
}
template <typename T>
-Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_ColorBurn_impl(uint *dest, const uint *src, int length, const T &coverage)
+Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_ColorBurn_impl(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, const T &coverage)
{
PRELOAD_INIT2(dest, src)
for (int i = 0; i < length; ++i) {
@@ -3017,7 +3012,7 @@ Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_ColorBurn_impl(uint *dest, cons
}
}
-void QT_FASTCALL comp_func_ColorBurn(uint *dest, const uint *src, int length, uint const_alpha)
+void QT_FASTCALL comp_func_ColorBurn(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha)
{
if (const_alpha == 255)
comp_func_ColorBurn_impl(dest, src, length, QFullCoverage());
@@ -3075,7 +3070,7 @@ void QT_FASTCALL comp_func_solid_HardLight(uint *dest, int length, uint color, u
}
template <typename T>
-Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_HardLight_impl(uint *dest, const uint *src, int length, const T &coverage)
+Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_HardLight_impl(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, const T &coverage)
{
PRELOAD_INIT2(dest, src)
for (int i = 0; i < length; ++i) {
@@ -3097,7 +3092,7 @@ Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_HardLight_impl(uint *dest, cons
}
}
-void QT_FASTCALL comp_func_HardLight(uint *dest, const uint *src, int length, uint const_alpha)
+void QT_FASTCALL comp_func_HardLight(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha)
{
if (const_alpha == 255)
comp_func_HardLight_impl(dest, src, length, QFullCoverage());
@@ -3166,7 +3161,7 @@ void QT_FASTCALL comp_func_solid_SoftLight(uint *dest, int length, uint color, u
}
template <typename T>
-Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_SoftLight_impl(uint *dest, const uint *src, int length, const T &coverage)
+Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_SoftLight_impl(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, const T &coverage)
{
PRELOAD_INIT2(dest, src)
for (int i = 0; i < length; ++i) {
@@ -3188,7 +3183,7 @@ Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_SoftLight_impl(uint *dest, cons
}
}
-void QT_FASTCALL comp_func_SoftLight(uint *dest, const uint *src, int length, uint const_alpha)
+void QT_FASTCALL comp_func_SoftLight(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha)
{
if (const_alpha == 255)
comp_func_SoftLight_impl(dest, src, length, QFullCoverage());
@@ -3239,7 +3234,7 @@ void QT_FASTCALL comp_func_solid_Difference(uint *dest, int length, uint color,
}
template <typename T>
-Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Difference_impl(uint *dest, const uint *src, int length, const T &coverage)
+Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Difference_impl(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, const T &coverage)
{
PRELOAD_INIT2(dest, src)
for (int i = 0; i < length; ++i) {
@@ -3261,7 +3256,7 @@ Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Difference_impl(uint *dest, con
}
}
-void QT_FASTCALL comp_func_Difference(uint *dest, const uint *src, int length, uint const_alpha)
+void QT_FASTCALL comp_func_Difference(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha)
{
if (const_alpha == 255)
comp_func_Difference_impl(dest, src, length, QFullCoverage());
@@ -3306,7 +3301,7 @@ void QT_FASTCALL comp_func_solid_Exclusion(uint *dest, int length, uint color, u
}
template <typename T>
-Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Exclusion_impl(uint *dest, const uint *src, int length, const T &coverage)
+Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Exclusion_impl(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, const T &coverage)
{
PRELOAD_INIT2(dest, src)
for (int i = 0; i < length; ++i) {
@@ -3328,7 +3323,7 @@ Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Exclusion_impl(uint *dest, cons
}
}
-void QT_FASTCALL comp_func_Exclusion(uint *dest, const uint *src, int length, uint const_alpha)
+void QT_FASTCALL comp_func_Exclusion(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha)
{
if (const_alpha == 255)
comp_func_Exclusion_impl(dest, src, length, QFullCoverage());
@@ -3351,8 +3346,8 @@ void QT_FASTCALL rasterop_solid_SourceOrDestination(uint *dest,
*dest++ |= color;
}
-void QT_FASTCALL rasterop_SourceOrDestination(uint *dest,
- const uint *src,
+void QT_FASTCALL rasterop_SourceOrDestination(uint *Q_DECL_RESTRICT dest,
+ const uint *Q_DECL_RESTRICT src,
int length,
uint const_alpha)
{
@@ -3372,8 +3367,8 @@ void QT_FASTCALL rasterop_solid_SourceAndDestination(uint *dest,
*dest++ &= color;
}
-void QT_FASTCALL rasterop_SourceAndDestination(uint *dest,
- const uint *src,
+void QT_FASTCALL rasterop_SourceAndDestination(uint *Q_DECL_RESTRICT dest,
+ const uint *Q_DECL_RESTRICT src,
int length,
uint const_alpha)
{
@@ -3395,8 +3390,8 @@ void QT_FASTCALL rasterop_solid_SourceXorDestination(uint *dest,
*dest++ ^= color;
}
-void QT_FASTCALL rasterop_SourceXorDestination(uint *dest,
- const uint *src,
+void QT_FASTCALL rasterop_SourceXorDestination(uint *Q_DECL_RESTRICT dest,
+ const uint *Q_DECL_RESTRICT src,
int length,
uint const_alpha)
{
@@ -3420,8 +3415,8 @@ void QT_FASTCALL rasterop_solid_NotSourceAndNotDestination(uint *dest,
}
}
-void QT_FASTCALL rasterop_NotSourceAndNotDestination(uint *dest,
- const uint *src,
+void QT_FASTCALL rasterop_NotSourceAndNotDestination(uint *Q_DECL_RESTRICT dest,
+ const uint *Q_DECL_RESTRICT src,
int length,
uint const_alpha)
{
@@ -3445,8 +3440,8 @@ void QT_FASTCALL rasterop_solid_NotSourceOrNotDestination(uint *dest,
}
}
-void QT_FASTCALL rasterop_NotSourceOrNotDestination(uint *dest,
- const uint *src,
+void QT_FASTCALL rasterop_NotSourceOrNotDestination(uint *Q_DECL_RESTRICT dest,
+ const uint *Q_DECL_RESTRICT src,
int length,
uint const_alpha)
{
@@ -3470,8 +3465,8 @@ void QT_FASTCALL rasterop_solid_NotSourceXorDestination(uint *dest,
}
}
-void QT_FASTCALL rasterop_NotSourceXorDestination(uint *dest,
- const uint *src,
+void QT_FASTCALL rasterop_NotSourceXorDestination(uint *Q_DECL_RESTRICT dest,
+ const uint *Q_DECL_RESTRICT src,
int length,
uint const_alpha)
{
@@ -3489,7 +3484,7 @@ void QT_FASTCALL rasterop_solid_NotSource(uint *dest, int length,
qt_memfill(dest, ~color | 0xff000000, length);
}
-void QT_FASTCALL rasterop_NotSource(uint *dest, const uint *src,
+void QT_FASTCALL rasterop_NotSource(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src,
int length, uint const_alpha)
{
Q_UNUSED(const_alpha);
@@ -3510,8 +3505,8 @@ void QT_FASTCALL rasterop_solid_NotSourceAndDestination(uint *dest,
}
}
-void QT_FASTCALL rasterop_NotSourceAndDestination(uint *dest,
- const uint *src,
+void QT_FASTCALL rasterop_NotSourceAndDestination(uint *Q_DECL_RESTRICT dest,
+ const uint *Q_DECL_RESTRICT src,
int length,
uint const_alpha)
{
@@ -3534,8 +3529,8 @@ void QT_FASTCALL rasterop_solid_SourceAndNotDestination(uint *dest,
}
}
-void QT_FASTCALL rasterop_SourceAndNotDestination(uint *dest,
- const uint *src,
+void QT_FASTCALL rasterop_SourceAndNotDestination(uint *Q_DECL_RESTRICT dest,
+ const uint *Q_DECL_RESTRICT src,
int length,
uint const_alpha)
{
@@ -4049,8 +4044,8 @@ static inline quint32 interpolate_pixel_rgb16x2_255(quint32 x, quint8 a,
return t;
}
-static inline void blend_sourceOver_rgb16_rgb16(quint16 *dest,
- const quint16 *src,
+static inline void blend_sourceOver_rgb16_rgb16(quint16 *Q_DECL_RESTRICT dest,
+ const quint16 *Q_DECL_RESTRICT src,
int length,
const quint8 alpha,
const quint8 ialpha)
diff --git a/src/gui/painting/qdrawhelper_p.h b/src/gui/painting/qdrawhelper_p.h
index 2e9f064951..f502533443 100644
--- a/src/gui/painting/qdrawhelper_p.h
+++ b/src/gui/painting/qdrawhelper_p.h
@@ -71,9 +71,15 @@ QT_BEGIN_NAMESPACE
// RVCT doesn't like static template functions
# define Q_STATIC_TEMPLATE_FUNCTION
# define Q_STATIC_INLINE_FUNCTION static __forceinline
+# define Q_DECL_RESTRICT
+#elif defined(Q_CC_GNU)
+# define Q_STATIC_TEMPLATE_FUNCTION static __attribute__((always_inline))
+# define Q_STATIC_INLINE_FUNCTION static inline __attribute__((always_inline))
+# define Q_DECL_RESTRICT __restrict__
#else
# define Q_STATIC_TEMPLATE_FUNCTION static
# define Q_STATIC_INLINE_FUNCTION static inline
+# define Q_DECL_RESTRICT
#endif
static const uint AMASK = 0xff000000;
@@ -162,7 +168,7 @@ extern DrawHelper qDrawHelper[QImage::NImageFormats];
void qBlendTexture(int count, const QSpan *spans, void *userData);
-typedef void (QT_FASTCALL *CompositionFunction)(uint *dest, const uint *src, int length, uint const_alpha);
+typedef void (QT_FASTCALL *CompositionFunction)(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha);
typedef void (QT_FASTCALL *CompositionFunctionSolid)(uint *dest, int length, uint color, uint const_alpha);
struct LinearGradientValues
diff --git a/src/gui/painting/qmatrix.h b/src/gui/painting/qmatrix.h
index 7acc962afa..00eec33410 100644
--- a/src/gui/painting/qmatrix.h
+++ b/src/gui/painting/qmatrix.h
@@ -137,19 +137,19 @@ private:
Q_DECLARE_TYPEINFO(QMatrix, Q_MOVABLE_TYPE);
// mathematical semantics
-Q_GUI_EXPORT_INLINE QPoint operator*(const QPoint &p, const QMatrix &m)
+inline QPoint operator*(const QPoint &p, const QMatrix &m)
{ return m.map(p); }
-Q_GUI_EXPORT_INLINE QPointF operator*(const QPointF &p, const QMatrix &m)
+inline QPointF operator*(const QPointF &p, const QMatrix &m)
{ return m.map(p); }
-Q_GUI_EXPORT_INLINE QLineF operator*(const QLineF &l, const QMatrix &m)
+inline QLineF operator*(const QLineF &l, const QMatrix &m)
{ return m.map(l); }
-Q_GUI_EXPORT_INLINE QLine operator*(const QLine &l, const QMatrix &m)
+inline QLine operator*(const QLine &l, const QMatrix &m)
{ return m.map(l); }
-Q_GUI_EXPORT_INLINE QPolygon operator *(const QPolygon &a, const QMatrix &m)
+inline QPolygon operator *(const QPolygon &a, const QMatrix &m)
{ return m.map(a); }
-Q_GUI_EXPORT_INLINE QPolygonF operator *(const QPolygonF &a, const QMatrix &m)
+inline QPolygonF operator *(const QPolygonF &a, const QMatrix &m)
{ return m.map(a); }
-Q_GUI_EXPORT_INLINE QRegion operator *(const QRegion &r, const QMatrix &m)
+inline QRegion operator *(const QRegion &r, const QMatrix &m)
{ return m.map(r); }
Q_GUI_EXPORT QPainterPath operator *(const QPainterPath &p, const QMatrix &m);
diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp
index 97b0f91c26..68e60ed548 100644
--- a/src/gui/painting/qpainter.cpp
+++ b/src/gui/painting/qpainter.cpp
@@ -6109,7 +6109,7 @@ static QPixmap generateWavyPixmap(qreal maxRadius, const QPen &pen)
{
const qreal radiusBase = qMax(qreal(1), maxRadius);
- QString key = QLatin1Literal("WaveUnderline-")
+ QString key = QLatin1String("WaveUnderline-")
% pen.color().name()
% HexString<qreal>(radiusBase);
diff --git a/src/gui/painting/qplatformbackingstore_qpa.h b/src/gui/painting/qplatformbackingstore_qpa.h
index 042913292f..a4df63f4d4 100644
--- a/src/gui/painting/qplatformbackingstore_qpa.h
+++ b/src/gui/painting/qplatformbackingstore_qpa.h
@@ -42,6 +42,17 @@
#ifndef QPLATFORMBACKINGSTORE_QPA_H
#define QPLATFORMBACKINGSTORE_QPA_H
+//
+// 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 <QtCore/qrect.h>
#include <QtGui/qwindow.h>
diff --git a/src/gui/painting/qrgb.h b/src/gui/painting/qrgb.h
index 6d046be1d5..dd59069236 100644
--- a/src/gui/painting/qrgb.h
+++ b/src/gui/painting/qrgb.h
@@ -53,31 +53,31 @@ typedef unsigned int QRgb; // RGB triplet
const QRgb RGB_MASK = 0x00ffffff; // masks RGB values
-Q_GUI_EXPORT_INLINE int qRed(QRgb rgb) // get red part of RGB
+inline int qRed(QRgb rgb) // get red part of RGB
{ return ((rgb >> 16) & 0xff); }
-Q_GUI_EXPORT_INLINE int qGreen(QRgb rgb) // get green part of RGB
+inline int qGreen(QRgb rgb) // get green part of RGB
{ return ((rgb >> 8) & 0xff); }
-Q_GUI_EXPORT_INLINE int qBlue(QRgb rgb) // get blue part of RGB
+inline int qBlue(QRgb rgb) // get blue part of RGB
{ return (rgb & 0xff); }
-Q_GUI_EXPORT_INLINE int qAlpha(QRgb rgb) // get alpha part of RGBA
+inline int qAlpha(QRgb rgb) // get alpha part of RGBA
{ return rgb >> 24; }
-Q_GUI_EXPORT_INLINE QRgb qRgb(int r, int g, int b)// set RGB value
+inline QRgb qRgb(int r, int g, int b)// set RGB value
{ return (0xffu << 24) | ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff); }
-Q_GUI_EXPORT_INLINE QRgb qRgba(int r, int g, int b, int a)// set RGBA value
+inline QRgb qRgba(int r, int g, int b, int a)// set RGBA value
{ return ((a & 0xff) << 24) | ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff); }
-Q_GUI_EXPORT_INLINE int qGray(int r, int g, int b)// convert R,G,B to gray 0..255
+inline int qGray(int r, int g, int b)// convert R,G,B to gray 0..255
{ return (r*11+g*16+b*5)/32; }
-Q_GUI_EXPORT_INLINE int qGray(QRgb rgb) // convert RGB to gray 0..255
+inline int qGray(QRgb rgb) // convert RGB to gray 0..255
{ return qGray(qRed(rgb), qGreen(rgb), qBlue(rgb)); }
-Q_GUI_EXPORT_INLINE bool qIsGray(QRgb rgb)
+inline bool qIsGray(QRgb rgb)
{ return qRed(rgb) == qGreen(rgb) && qRed(rgb) == qBlue(rgb); }
QT_END_NAMESPACE
diff --git a/src/gui/painting/qtransform.h b/src/gui/painting/qtransform.h
index 2e56da1873..9fd713d21f 100644
--- a/src/gui/painting/qtransform.h
+++ b/src/gui/painting/qtransform.h
@@ -361,34 +361,34 @@ Q_GUI_EXPORT QDebug operator<<(QDebug, const QTransform &);
/****** end stream functions *******************/
// mathematical semantics
-Q_GUI_EXPORT_INLINE QPoint operator*(const QPoint &p, const QTransform &m)
+inline QPoint operator*(const QPoint &p, const QTransform &m)
{ return m.map(p); }
-Q_GUI_EXPORT_INLINE QPointF operator*(const QPointF &p, const QTransform &m)
+inline QPointF operator*(const QPointF &p, const QTransform &m)
{ return m.map(p); }
-Q_GUI_EXPORT_INLINE QLineF operator*(const QLineF &l, const QTransform &m)
+inline QLineF operator*(const QLineF &l, const QTransform &m)
{ return m.map(l); }
-Q_GUI_EXPORT_INLINE QLine operator*(const QLine &l, const QTransform &m)
+inline QLine operator*(const QLine &l, const QTransform &m)
{ return m.map(l); }
-Q_GUI_EXPORT_INLINE QPolygon operator *(const QPolygon &a, const QTransform &m)
+inline QPolygon operator *(const QPolygon &a, const QTransform &m)
{ return m.map(a); }
-Q_GUI_EXPORT_INLINE QPolygonF operator *(const QPolygonF &a, const QTransform &m)
+inline QPolygonF operator *(const QPolygonF &a, const QTransform &m)
{ return m.map(a); }
-Q_GUI_EXPORT_INLINE QRegion operator *(const QRegion &r, const QTransform &m)
+inline QRegion operator *(const QRegion &r, const QTransform &m)
{ return m.map(r); }
-Q_GUI_EXPORT_INLINE QPainterPath operator *(const QPainterPath &p, const QTransform &m)
+inline QPainterPath operator *(const QPainterPath &p, const QTransform &m)
{ return m.map(p); }
-Q_GUI_EXPORT_INLINE QTransform operator *(const QTransform &a, qreal n)
+inline QTransform operator *(const QTransform &a, qreal n)
{ QTransform t(a); t *= n; return t; }
-Q_GUI_EXPORT_INLINE QTransform operator /(const QTransform &a, qreal n)
+inline QTransform operator /(const QTransform &a, qreal n)
{ QTransform t(a); t /= n; return t; }
-Q_GUI_EXPORT_INLINE QTransform operator +(const QTransform &a, qreal n)
+inline QTransform operator +(const QTransform &a, qreal n)
{ QTransform t(a); t += n; return t; }
-Q_GUI_EXPORT_INLINE QTransform operator -(const QTransform &a, qreal n)
+inline QTransform operator -(const QTransform &a, qreal n)
{ QTransform t(a); t -= n; return t; }
QT_END_NAMESPACE
QT_END_HEADER
-#endif
+#endif // QTRANSFORM_H
diff --git a/src/gui/text/qcssparser.cpp b/src/gui/text/qcssparser.cpp
index fd01934eae..a06818bcd3 100644
--- a/src/gui/text/qcssparser.cpp
+++ b/src/gui/text/qcssparser.cpp
@@ -544,7 +544,7 @@ QSize ValueExtractor::sizeValue(const Declaration &decl)
else
x[1] = x[0];
QList<QVariant> v;
- v << QVariant::fromValue<LengthData>(x[0]) << qVariantFromValue<LengthData>(x[1]);
+ v << QVariant::fromValue<LengthData>(x[0]) << QVariant::fromValue<LengthData>(x[1]);
decl.d->parsed = v;
return QSize(lengthValueFromData(x[0], f), lengthValueFromData(x[1], f));
}
diff --git a/src/gui/text/qfont.cpp b/src/gui/text/qfont.cpp
index 56ff298d9b..161bb4e23d 100644
--- a/src/gui/text/qfont.cpp
+++ b/src/gui/text/qfont.cpp
@@ -391,7 +391,7 @@ QFontEngineData::~QFontEngineData()
lastResortFont() in cases where a suitable match cannot be found.
You can provide substitutions for font family names using
insertSubstitution() and insertSubstitutions(). Substitutions can
- be removed with removeSubstitution(). Use substitute() to retrieve
+ be removed with removeSubstitutions(). Use substitute() to retrieve
a family's first substitute, or the family name itself if it has
no substitutes. Use substitutes() to retrieve a list of a family's
substitutes (which may be empty).
@@ -1788,27 +1788,6 @@ QFont QFont::resolve(const QFont &other) const
typedef QHash<QString, QStringList> QFontSubst;
Q_GLOBAL_STATIC(QFontSubst, globalFontSubst)
-// create substitution dict
-static void initFontSubst()
-{
- // default substitutions
- static const char * const initTbl[] = {
-
-
- 0, 0
- };
-
- QFontSubst *fontSubst = globalFontSubst();
- Q_ASSERT(fontSubst != 0);
- if (!fontSubst->isEmpty())
- return;
-
- for (int i=0; initTbl[i] != 0; i += 2) {
- QStringList &list = (*fontSubst)[QString::fromLatin1(initTbl[i])];
- list.append(QString::fromLatin1(initTbl[i+1]));
- }
-}
-
/*!
Returns the first family name to be used whenever \a familyName is
specified. The lookup is case insensitive.
@@ -1818,12 +1797,10 @@ static void initFontSubst()
To obtain a list of substitutions use substitutes().
- \sa setFamily() insertSubstitutions() insertSubstitution() removeSubstitution()
+ \sa setFamily() insertSubstitutions() insertSubstitution() removeSubstitutions()
*/
QString QFont::substitute(const QString &familyName)
{
- initFontSubst();
-
QFontSubst *fontSubst = globalFontSubst();
Q_ASSERT(fontSubst != 0);
QFontSubst::ConstIterator it = fontSubst->constFind(familyName.toLower());
@@ -1841,12 +1818,10 @@ QString QFont::substitute(const QString &familyName)
If there is no substitution for \a familyName, an empty list is
returned.
- \sa substitute() insertSubstitutions() insertSubstitution() removeSubstitution()
+ \sa substitute() insertSubstitutions() insertSubstitution() removeSubstitutions()
*/
QStringList QFont::substitutes(const QString &familyName)
{
- initFontSubst();
-
QFontSubst *fontSubst = globalFontSubst();
Q_ASSERT(fontSubst != 0);
return fontSubst->value(familyName.toLower(), QStringList());
@@ -1857,13 +1832,11 @@ QStringList QFont::substitutes(const QString &familyName)
Inserts \a substituteName into the substitution
table for the family \a familyName.
- \sa insertSubstitutions() removeSubstitution() substitutions() substitute() substitutes()
+ \sa insertSubstitutions() removeSubstitutions() substitutions() substitute() substitutes()
*/
void QFont::insertSubstitution(const QString &familyName,
const QString &substituteName)
{
- initFontSubst();
-
QFontSubst *fontSubst = globalFontSubst();
Q_ASSERT(fontSubst != 0);
QStringList &list = (*fontSubst)[familyName.toLower()];
@@ -1877,22 +1850,18 @@ void QFont::insertSubstitution(const QString &familyName,
Inserts the list of families \a substituteNames into the
substitution list for \a familyName.
- \sa insertSubstitution(), removeSubstitution(), substitutions(), substitute()
+ \sa insertSubstitution(), removeSubstitutions(), substitutions(), substitute()
*/
void QFont::insertSubstitutions(const QString &familyName,
const QStringList &substituteNames)
{
- initFontSubst();
-
QFontSubst *fontSubst = globalFontSubst();
Q_ASSERT(fontSubst != 0);
QStringList &list = (*fontSubst)[familyName.toLower()];
- QStringList::ConstIterator it = substituteNames.constBegin();
- while (it != substituteNames.constEnd()) {
- QString s = (*it).toLower();
- if (!list.contains(s))
- list.append(s);
- it++;
+ foreach (const QString &substituteName, substituteNames) {
+ const QString lowerSubstituteName = substituteName.toLower();
+ if (!list.contains(lowerSubstituteName))
+ list.append(lowerSubstituteName);
}
}
@@ -1910,22 +1879,26 @@ void QFont::insertSubstitutions(const QString &familyName,
Internal function that cleans up the font system.
*/
-// ### mark: should be called removeSubstitutions()
/*!
Removes all the substitutions for \a familyName.
\sa insertSubstitutions(), insertSubstitution(), substitutions(), substitute()
+ \since 5.0
*/
-void QFont::removeSubstitution(const QString &familyName)
-{ // ### function name should be removeSubstitutions() or
- // ### removeSubstitutionList()
- initFontSubst();
-
+void QFont::removeSubstitutions(const QString &familyName)
+{
QFontSubst *fontSubst = globalFontSubst();
Q_ASSERT(fontSubst != 0);
fontSubst->remove(familyName.toLower());
}
+/*!
+ \fn void QFont::removeSubstitution(const QString &familyName)
+
+ \obsolete
+
+ This function is deprecated. Use removeSubstitutions() instead.
+*/
/*!
Returns a sorted list of substituted family names.
@@ -1934,17 +1907,14 @@ void QFont::removeSubstitution(const QString &familyName)
*/
QStringList QFont::substitutions()
{
- initFontSubst();
+ typedef QFontSubst::const_iterator QFontSubstConstIterator;
QFontSubst *fontSubst = globalFontSubst();
Q_ASSERT(fontSubst != 0);
QStringList ret;
- QFontSubst::ConstIterator it = fontSubst->constBegin();
-
- while (it != fontSubst->constEnd()) {
+ const QFontSubstConstIterator cend = fontSubst->constEnd();
+ for (QFontSubstConstIterator it = fontSubst->constBegin(); it != cend; ++it)
ret.append(it.key());
- ++it;
- }
ret.sort();
return ret;
diff --git a/src/gui/text/qfont.h b/src/gui/text/qfont.h
index a3019e560c..45186cecc6 100644
--- a/src/gui/text/qfont.h
+++ b/src/gui/text/qfont.h
@@ -257,7 +257,10 @@ public:
static QStringList substitutions();
static void insertSubstitution(const QString&, const QString &);
static void insertSubstitutions(const QString&, const QStringList &);
- static void removeSubstitution(const QString &);
+ static void removeSubstitutions(const QString &);
+#if QT_DEPRECATED_SINCE(5, 0)
+ static QT_DEPRECATED void removeSubstitution(const QString &family) { removeSubstitutions(family); }
+#endif
static void initialize();
static void cleanup();
static void cacheStatistics();
diff --git a/src/gui/text/qplatformfontdatabase_qpa.cpp b/src/gui/text/qplatformfontdatabase_qpa.cpp
index f6d82802f7..632d2d89d9 100644
--- a/src/gui/text/qplatformfontdatabase_qpa.cpp
+++ b/src/gui/text/qplatformfontdatabase_qpa.cpp
@@ -415,11 +415,15 @@ bool QPlatformFontDatabase::fontsAlwaysScalable() const
/*!
\class QPlatformFontDatabase
+ \since 5.0
+ \internal
+ \preliminary
+ \ingroup qpa
+ \ingroup painting
+
\brief The QPlatformFontDatabase class makes it possible to customize how fonts
are discovered and how they are rendered
- \ingroup painting
-
QPlatformFontDatabase is the superclass which is intended to let platform implementations use
native font handling.
diff --git a/src/gui/text/qplatformfontdatabase_qpa.h b/src/gui/text/qplatformfontdatabase_qpa.h
index 9fe3b0380d..08faf8d84f 100644
--- a/src/gui/text/qplatformfontdatabase_qpa.h
+++ b/src/gui/text/qplatformfontdatabase_qpa.h
@@ -42,6 +42,17 @@
#ifndef QPLATFORMFONTDATABASE_QPA_H
#define QPLATFORMFONTDATABASE_QPA_H
+//
+// 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 <QtCore/qconfig.h>
#include <QtCore/QString>
#include <QtCore/QStringList>
diff --git a/src/gui/text/qtextdocument.cpp b/src/gui/text/qtextdocument.cpp
index a8991d5428..f9fe166c29 100644
--- a/src/gui/text/qtextdocument.cpp
+++ b/src/gui/text/qtextdocument.cpp
@@ -1281,7 +1281,7 @@ QTextCursor QTextDocument::find(const QString &subString, const QTextCursor &fro
static bool findInBlock(const QTextBlock &block, const QRegExp &expression, int offset,
QTextDocument::FindFlags options, QTextCursor &cursor)
{
- const QRegExp expr(expression);
+ QRegExp expr(expression);
QString text = block.text();
text.replace(QChar::Nbsp, QLatin1Char(' '));
diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp
index 793ea4aa9e..9848898d66 100644
--- a/src/gui/text/qtextengine.cpp
+++ b/src/gui/text/qtextengine.cpp
@@ -1755,12 +1755,19 @@ QFontEngine *QTextEngine::fontEngine(const QScriptItem &si, QFixed *ascent, QFix
font.setPixelSize((font.pixelSize() * 2) / 3);
scaledEngine = font.d->engineForScript(script);
}
- feCache.prevFontEngine = engine;
+
if (engine)
engine->ref.ref();
- feCache.prevScaledFontEngine = scaledEngine;
+ if (feCache.prevFontEngine)
+ releaseCachedFontEngine(feCache.prevFontEngine);
+ feCache.prevFontEngine = engine;
+
if (scaledEngine)
scaledEngine->ref.ref();
+ if (feCache.prevScaledFontEngine)
+ releaseCachedFontEngine(feCache.prevScaledFontEngine);
+ feCache.prevScaledFontEngine = scaledEngine;
+
feCache.prevScript = script;
feCache.prevPosition = si.position;
feCache.prevLength = length(&si);
@@ -1770,9 +1777,13 @@ QFontEngine *QTextEngine::fontEngine(const QScriptItem &si, QFixed *ascent, QFix
engine = feCache.prevFontEngine;
else {
engine = font.d->engineForScript(script);
- feCache.prevFontEngine = engine;
+
if (engine)
engine->ref.ref();
+ if (feCache.prevFontEngine)
+ releaseCachedFontEngine(feCache.prevFontEngine);
+ feCache.prevFontEngine = engine;
+
feCache.prevScript = script;
feCache.prevPosition = -1;
feCache.prevLength = -1;
@@ -2318,6 +2329,42 @@ static inline bool prevCharJoins(const QString &string, int pos)
return (joining == QChar::Dual || joining == QChar::Center);
}
+static bool isRetainableControlCode(const QChar &c)
+{
+ return (c.unicode() == 0x202a // LRE
+ || c.unicode() == 0x202b // LRE
+ || c.unicode() == 0x202c // PDF
+ || c.unicode() == 0x202d // LRO
+ || c.unicode() == 0x202e // RLO
+ || c.unicode() == 0x200e // LRM
+ || c.unicode() == 0x200f); // RLM
+}
+
+static QString stringMidRetainingBidiCC(const QString &string,
+ const QString &ellidePrefix,
+ const QString &ellideSuffix,
+ int subStringFrom,
+ int subStringTo,
+ int midStart,
+ int midLength)
+{
+ QString prefix;
+ for (int i=subStringFrom; i<midStart; ++i) {
+ QChar c = string.at(i);
+ if (isRetainableControlCode(c))
+ prefix += c;
+ }
+
+ QString suffix;
+ for (int i=midStart + midLength; i<subStringTo; ++i) {
+ QChar c = string.at(i);
+ if (isRetainableControlCode(c))
+ suffix += c;
+ }
+
+ return prefix + ellidePrefix + string.mid(midStart, midLength) + ellideSuffix + suffix;
+}
+
QString QTextEngine::elidedText(Qt::TextElideMode mode, const QFixed &width, int flags, int from, int count) const
{
// qDebug() << "elidedText; available width" << width.toReal() << "text width:" << this->width(0, layoutData->string.length()).toReal();
@@ -2429,7 +2476,10 @@ QString QTextEngine::elidedText(Qt::TextElideMode mode, const QFixed &width, int
if (nextCharJoins(layoutData->string, pos))
ellipsisText.prepend(QChar(0x200d) /* ZWJ */);
- return layoutData->string.mid(from, pos - from) + ellipsisText;
+ return stringMidRetainingBidiCC(layoutData->string,
+ QString(), ellipsisText,
+ from, to,
+ from, pos - from);
} else if (mode == Qt::ElideLeft) {
QFixed currentWidth;
int pos;
@@ -2449,7 +2499,10 @@ QString QTextEngine::elidedText(Qt::TextElideMode mode, const QFixed &width, int
if (prevCharJoins(layoutData->string, pos))
ellipsisText.append(QChar(0x200d) /* ZWJ */);
- return ellipsisText + layoutData->string.mid(pos, to - pos);
+ return stringMidRetainingBidiCC(layoutData->string,
+ ellipsisText, QString(),
+ from, to,
+ pos, to - pos);
} else if (mode == Qt::ElideMiddle) {
QFixed leftWidth;
QFixed rightWidth;
diff --git a/src/gui/text/qtextlayout.cpp b/src/gui/text/qtextlayout.cpp
index bec574bb83..94af3edeeb 100644
--- a/src/gui/text/qtextlayout.cpp
+++ b/src/gui/text/qtextlayout.cpp
@@ -2288,7 +2288,13 @@ QList<QGlyphRun> QTextLine::glyphRuns(int from, int length) const
iterator.getSelectionBounds(&x, &width);
if (glyphLayout.numGlyphs > 0) {
- QFontEngine *mainFontEngine = eng->fontEngine(si);
+ QFontEngine *mainFontEngine;
+#ifndef QT_NO_RAWFONT
+ if (eng->useRawFont && eng->rawFont.isValid())
+ mainFontEngine= eng->fontEngine(si);
+ else
+#endif
+ mainFontEngine = font.d->engineForScript(si.analysis.script);
if (mainFontEngine->type() == QFontEngine::Multi) {
QFontEngineMulti *multiFontEngine = static_cast<QFontEngineMulti *>(mainFontEngine);
diff --git a/src/gui/text/qzip.cpp b/src/gui/text/qzip.cpp
index 1491c1efbc..e9ff5e8b59 100644
--- a/src/gui/text/qzip.cpp
+++ b/src/gui/text/qzip.cpp
@@ -416,7 +416,9 @@ public:
void QZipPrivate::fillFileInfo(int index, QZipReader::FileInfo &fileInfo) const
{
FileHeader header = fileHeaders.at(index);
- fileInfo.filePath = QString::fromLocal8Bit(header.file_name);
+ // if bit 11 is set, the filename and comment fields must be encoded using UTF-8
+ const bool inUtf8 = (readUShort(header.h.general_purpose_bits) & 0x0800) != 0;
+ fileInfo.filePath = inUtf8 ? QString::fromUtf8(header.file_name) : QString::fromLocal8Bit(header.file_name);
const quint32 mode = (qFromLittleEndian<quint32>(&header.h.external_file_attributes[0]) >> 16) & 0xFFFF;
fileInfo.isDir = S_ISDIR(mode);
fileInfo.isFile = S_ISREG(mode);
@@ -629,7 +631,12 @@ void QZipWriterPrivate::addEntry(EntryType type, const QString &fileName, const
crc_32 = ::crc32(crc_32, (const uchar *)contents.constData(), contents.length());
writeUInt(header.h.crc_32, crc_32);
- header.file_name = fileName.toLocal8Bit();
+ // if bit 11 is set, the filename and comment fields must be encoded using UTF-8
+ ushort general_purpose_bits = 0x0800; // always use utf-8
+ writeUShort(header.h.general_purpose_bits, general_purpose_bits);
+
+ const bool inUtf8 = (general_purpose_bits & 0x0800) != 0;
+ header.file_name = inUtf8 ? fileName.toUtf8() : fileName.toLocal8Bit();
if (header.file_name.size() > 0xffff) {
qWarning("QZip: Filename too long, chopping it to 65535 characters");
header.file_name = header.file_name.left(0xffff);
diff --git a/src/gui/util/qdesktopservices.cpp b/src/gui/util/qdesktopservices.cpp
index 26aecadcf4..a941c06031 100644
--- a/src/gui/util/qdesktopservices.cpp
+++ b/src/gui/util/qdesktopservices.cpp
@@ -284,14 +284,14 @@ void QDesktopServices::unsetUrlHandler(const QString &scheme)
Use QStandardPaths::displayName()
*/
+extern Q_CORE_EXPORT QString qt_applicationName_noFallback();
-QString QDesktopServices::storageLocationImpl(StandardLocation type)
+QString QDesktopServices::storageLocationImpl(QStandardPaths::StandardLocation type)
{
- if (type == DataLocation) {
+ if (type == QStandardPaths::DataLocation) {
// Preserve Qt 4 compatibility:
// * QCoreApplication::applicationName() must default to empty
// * Unix data location is under the "data/" subdirectory
- extern Q_CORE_EXPORT QString qt_applicationName_noFallback();
const QString compatAppName = qt_applicationName_noFallback();
const QString baseDir = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
#if defined(Q_OS_WIN) || defined(Q_OS_MAC)
@@ -307,7 +307,7 @@ QString QDesktopServices::storageLocationImpl(StandardLocation type)
+ compatAppName;
#endif
}
- return QStandardPaths::writableLocation(static_cast<QStandardPaths::StandardLocation>(type));
+ return QStandardPaths::writableLocation(type);
}
QT_END_NAMESPACE
diff --git a/src/gui/util/qdesktopservices.h b/src/gui/util/qdesktopservices.h
index 280acaf277..e116cf1123 100644
--- a/src/gui/util/qdesktopservices.h
+++ b/src/gui/util/qdesktopservices.h
@@ -64,6 +64,7 @@ public:
static void unsetUrlHandler(const QString &scheme);
#if QT_DEPRECATED_SINCE(5, 0)
+ //Must match QStandardPaths::StandardLocation
QT_DEPRECATED enum StandardLocation {
DesktopLocation,
DocumentsLocation,
@@ -79,14 +80,14 @@ public:
};
QT_DEPRECATED static QString storageLocation(StandardLocation type) {
- return storageLocationImpl(type);
+ return storageLocationImpl(static_cast<QStandardPaths::StandardLocation>(type));
}
QT_DEPRECATED static QString displayName(StandardLocation type) {
return QStandardPaths::displayName(static_cast<QStandardPaths::StandardLocation>(type));
}
#endif
private:
- static QString storageLocationImpl(StandardLocation type);
+ static QString storageLocationImpl(QStandardPaths::StandardLocation type);
};
#endif // QT_NO_DESKTOPSERVICES
diff --git a/src/gui/util/qvalidator.cpp b/src/gui/util/qvalidator.cpp
index ce16785d1d..3103cc7424 100644
--- a/src/gui/util/qvalidator.cpp
+++ b/src/gui/util/qvalidator.cpp
@@ -400,7 +400,7 @@ static qlonglong pow10(int exp)
QValidator::State QIntValidator::validate(QString & input, int&) const
{
QByteArray buff;
- if (!locale().d()->validateChars(input, QLocalePrivate::IntegerMode, &buff)) {
+ if (!locale().d->validateChars(input, QLocalePrivate::IntegerMode, &buff)) {
return Invalid;
}
@@ -439,7 +439,7 @@ QValidator::State QIntValidator::validate(QString & input, int&) const
void QIntValidator::fixup(QString &input) const
{
QByteArray buff;
- if (!locale().d()->validateChars(input, QLocalePrivate::IntegerMode, &buff)) {
+ if (!locale().d->validateChars(input, QLocalePrivate::IntegerMode, &buff)) {
return;
}
bool ok, overflow;
@@ -655,7 +655,7 @@ QValidator::State QDoubleValidatorPrivate::validateWithLocale(QString &input, QL
{
Q_Q(const QDoubleValidator);
QByteArray buff;
- if (!locale.d()->validateChars(input, numMode, &buff, q->dec))
+ if (!locale.d->validateChars(input, numMode, &buff, q->dec))
return QValidator::Invalid;
if (buff.isEmpty())
@@ -871,10 +871,11 @@ QRegExpValidator::~QRegExpValidator()
QValidator::State QRegExpValidator::validate(QString &input, int& pos) const
{
- if (r.exactMatch(input)) {
+ QRegExp copy = r;
+ if (copy.exactMatch(input)) {
return Acceptable;
} else {
- if (const_cast<QRegExp &>(r).matchedLength() == input.size()) {
+ if (copy.matchedLength() == input.size()) {
return Intermediate;
} else {
pos = input.size();
diff --git a/src/modules/qt_platformsupport.pri b/src/modules/qt_platformsupport.pri
index dc0795383d..6671cc0584 100644
--- a/src/modules/qt_platformsupport.pri
+++ b/src/modules/qt_platformsupport.pri
@@ -11,6 +11,6 @@ QT.platformsupport.sources = $$QT_MODULE_BASE/src/platformsupport
QT.platformsupport.libs = $$QT_MODULE_LIB_BASE
QT.platformsupport.plugins = $$QT_MODULE_PLUGIN_BASE
QT.platformsupport.imports = $$QT_MODULE_IMPORT_BASE
-QT.platformsupport.depends = core gui printsupport
+QT.platformsupport.depends = core gui
QT.platformsupport.module_config = staticlib
QT.platformsupport.DEFINES =
diff --git a/src/network/access/qftp.cpp b/src/network/access/qftp.cpp
index c7ad810084..a50415715c 100644
--- a/src/network/access/qftp.cpp
+++ b/src/network/access/qftp.cpp
@@ -665,7 +665,7 @@ void QFtpDTP::socketReadyRead()
return;
}
- if (pi->abortState == QFtpPI::AbortStarted) {
+ if (pi->abortState != QFtpPI::None) {
// discard data
socket->readAll();
return;
@@ -865,14 +865,25 @@ void QFtpPI::abort()
// ABOR already sent
return;
- abortState = AbortStarted;
+ if (currentCmd.isEmpty())
+ return; //no command in progress
+
+ if (currentCmd.startsWith(QLatin1String("STOR "))) {
+ abortState = AbortStarted;
#if defined(QFTPPI_DEBUG)
- qDebug("QFtpPI send: ABOR");
+ qDebug("QFtpPI send: ABOR");
#endif
- commandSocket.write("ABOR\r\n", 6);
+ commandSocket.write("ABOR\r\n", 6);
- if (currentCmd.startsWith(QLatin1String("STOR ")))
dtp.abortConnection();
+ } else {
+ //Deviation from RFC 959:
+ //Most FTP servers do not support ABOR, or require the telnet
+ //IP & synch sequence (TCP urgent data) which is not supported by QTcpSocket.
+ //Following what most FTP clients do, just reset the data connection and wait for 426
+ abortState = WaitForAbortToFinish;
+ dtp.abortConnection();
+ }
}
void QFtpPI::hostFound()
diff --git a/src/network/access/qhttpmultipart.cpp b/src/network/access/qhttpmultipart.cpp
index e24c0606ef..27164d69ae 100644
--- a/src/network/access/qhttpmultipart.cpp
+++ b/src/network/access/qhttpmultipart.cpp
@@ -456,7 +456,7 @@ qint64 QHttpMultiPartIODevice::size() const
// and 2 bytes for the "\r\n" after the content
currentSize += boundaryCount + 4 + multiPart->parts.at(a).d->size() + 2;
}
- currentSize += boundaryCount + 4; // size for ending boundary and 2 beginning and ending dashes
+ currentSize += boundaryCount + 6; // size for ending boundary, 2 beginning and ending dashes and "\r\n"
deviceSize = currentSize;
}
return deviceSize;
@@ -527,7 +527,7 @@ qint64 QHttpMultiPartIODevice::readData(char *data, qint64 maxSize)
}
// check whether we need to return the final boundary
if (bytesRead < maxSize && index == multiPart->parts.count()) {
- QByteArray finalBoundary = "--" + multiPart->boundary + "--";
+ QByteArray finalBoundary = "--" + multiPart->boundary + "--\r\n";
qint64 boundaryIndex = readPointer + finalBoundary.count() - size();
qint64 lastBoundaryBytesRead = qMin(finalBoundary.count() - boundaryIndex, maxSize - bytesRead);
memcpy(data + bytesRead, finalBoundary.constData() + boundaryIndex, lastBoundaryBytesRead);
diff --git a/src/network/access/qnetworkaccessftpbackend.cpp b/src/network/access/qnetworkaccessftpbackend.cpp
index 4aa491db0c..93dd912f5a 100644
--- a/src/network/access/qnetworkaccessftpbackend.cpp
+++ b/src/network/access/qnetworkaccessftpbackend.cpp
@@ -107,6 +107,9 @@ QNetworkAccessFtpBackend::QNetworkAccessFtpBackend()
QNetworkAccessFtpBackend::~QNetworkAccessFtpBackend()
{
+ //if backend destroyed while in use, then abort (this is the code path from QNetworkReply::abort)
+ if (ftp && state != Disconnecting)
+ ftp->abort();
disconnectFromFtp();
}
diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp
index 8d68f439f1..7e95fc547d 100644
--- a/src/network/access/qnetworkaccessmanager.cpp
+++ b/src/network/access/qnetworkaccessmanager.cpp
@@ -82,7 +82,7 @@ Q_GLOBAL_STATIC(QNetworkAccessFtpBackendFactory, ftpBackend)
Q_GLOBAL_STATIC(QNetworkAccessDebugPipeBackendFactory, debugpipeBackend)
#endif
-#ifdef Q_OS_MAC
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
#include <CoreServices/CoreServices.h>
#include <SystemConfiguration/SystemConfiguration.h>
@@ -1186,7 +1186,7 @@ void QNetworkAccessManagerPrivate::authenticationRequired(QAuthenticator *authen
return;
}
}
-#ifdef Q_OS_MAC
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
//now we try to get the username and password from keychain
//if not successful signal will be emitted
QString username;
diff --git a/src/network/access/qnetworkreplyhttpimpl.cpp b/src/network/access/qnetworkreplyhttpimpl.cpp
index 0ac3e26ada..e2d75c06f8 100644
--- a/src/network/access/qnetworkreplyhttpimpl.cpp
+++ b/src/network/access/qnetworkreplyhttpimpl.cpp
@@ -1068,7 +1068,7 @@ void QNetworkReplyHttpImplPrivate::replyDownloadMetaData
downloadZerocopyBuffer = downloadBufferPointer.data();
downloadBufferCurrentSize = 0;
downloadBufferMaximumSize = contentLength;
- q->setAttribute(QNetworkRequest::DownloadBufferAttribute, qVariantFromValue<QSharedPointer<char> > (downloadBufferPointer));
+ q->setAttribute(QNetworkRequest::DownloadBufferAttribute, QVariant::fromValue<QSharedPointer<char> > (downloadBufferPointer));
}
q->setAttribute(QNetworkRequest::HttpPipeliningWasUsedAttribute, pu);
@@ -1521,6 +1521,9 @@ bool QNetworkReplyHttpImplPrivate::start()
if (managerPrivate->networkSession->isOpen() &&
managerPrivate->networkSession->state() == QNetworkSession::Connected) {
+ Q_Q(QNetworkReplyHttpImpl);
+ QObject::connect(managerPrivate->networkSession.data(), SIGNAL(usagePoliciesChanged(QNetworkSession::UsagePolicies)),
+ q, SLOT(_q_networkSessionUsagePoliciesChanged(QNetworkSession::UsagePolicies)));
postRequest();
return true;
}
@@ -1565,8 +1568,10 @@ void QNetworkReplyHttpImplPrivate::_q_startOperation()
QObject::connect(session, SIGNAL(error(QNetworkSession::SessionError)),
q, SLOT(_q_networkSessionFailed()));
- if (!session->isOpen())
+ if (!session->isOpen()) {
+ session->setSessionProperty(QStringLiteral("ConnectInBackground"), isBackground);
session->open();
+ }
} else {
qWarning("Backend is waiting for QNetworkSession to connect, but there is none!");
QMetaObject::invokeMethod(q, "_q_error", synchronous ? Qt::DirectConnection : Qt::QueuedConnection,
@@ -1762,6 +1767,23 @@ void QNetworkReplyHttpImplPrivate::_q_networkSessionFailed()
finished();
}
}
+
+void QNetworkReplyHttpImplPrivate::_q_networkSessionUsagePoliciesChanged(QNetworkSession::UsagePolicies newPolicies)
+{
+ if (request.attribute(QNetworkRequest::BackgroundRequestAttribute).toBool()) {
+ if (newPolicies & QNetworkSession::NoBackgroundTrafficPolicy) {
+ // Abort waiting and working replies.
+ if (state == WaitingForSession || state == Working) {
+ state = Working;
+ error(QNetworkReply::BackgroundRequestNotAllowedError,
+ QCoreApplication::translate("QNetworkReply", "Background request not allowed."));
+ finished();
+ }
+ // ### if canResume(), then we could resume automatically
+ }
+ }
+
+}
#endif
@@ -1974,10 +1996,7 @@ void QNetworkReplyHttpImplPrivate::createCache()
{
// check if we can save and if we're allowed to
if (!managerPrivate->networkCache
- || !request.attribute(QNetworkRequest::CacheSaveControlAttribute, true).toBool()
- || request.attribute(QNetworkRequest::CacheLoadControlAttribute,
- QNetworkRequest::PreferNetwork).toInt()
- == QNetworkRequest::AlwaysNetwork)
+ || !request.attribute(QNetworkRequest::CacheSaveControlAttribute, true).toBool())
return;
cacheEnabled = true;
}
diff --git a/src/network/access/qnetworkreplyhttpimpl_p.h b/src/network/access/qnetworkreplyhttpimpl_p.h
index 6129d9f3b4..6c2313448b 100644
--- a/src/network/access/qnetworkreplyhttpimpl_p.h
+++ b/src/network/access/qnetworkreplyhttpimpl_p.h
@@ -66,6 +66,7 @@
#include <private/qbytedata_p.h>
#include <private/qnetworkreply_p.h>
#include <QtNetwork/QNetworkProxy>
+#include <QtNetwork/QNetworkSession>
#ifndef QT_NO_SSL
#include <QtNetwork/QSslConfiguration>
@@ -102,6 +103,7 @@ public:
#ifndef QT_NO_BEARERMANAGEMENT
Q_PRIVATE_SLOT(d_func(), void _q_networkSessionConnected())
Q_PRIVATE_SLOT(d_func(), void _q_networkSessionFailed())
+ Q_PRIVATE_SLOT(d_func(), void _q_networkSessionUsagePoliciesChanged(QNetworkSession::UsagePolicies))
#endif
Q_PRIVATE_SLOT(d_func(), void _q_finished())
Q_PRIVATE_SLOT(d_func(), void _q_error(QNetworkReply::NetworkError, const QString &))
@@ -173,6 +175,7 @@ public:
#ifndef QT_NO_BEARERMANAGEMENT
void _q_networkSessionConnected();
void _q_networkSessionFailed();
+ void _q_networkSessionUsagePoliciesChanged(QNetworkSession::UsagePolicies);
#endif
void _q_finished();
diff --git a/src/network/access/qnetworkreplyimpl.cpp b/src/network/access/qnetworkreplyimpl.cpp
index 79e922387c..c5f26df4b8 100644
--- a/src/network/access/qnetworkreplyimpl.cpp
+++ b/src/network/access/qnetworkreplyimpl.cpp
@@ -73,6 +73,8 @@ inline QNetworkReplyImplPrivate::QNetworkReplyImplPrivate()
void QNetworkReplyImplPrivate::_q_startOperation()
{
+ Q_Q(QNetworkReplyImpl);
+
// ensure this function is only being called once
if (state == Working || state == Finished) {
qDebug("QNetworkReplyImpl::_q_startOperation was called more than once");
@@ -110,8 +112,6 @@ void QNetworkReplyImplPrivate::_q_startOperation()
state = WaitingForSession;
if (session) {
- Q_Q(QNetworkReplyImpl);
-
QObject::connect(session.data(), SIGNAL(error(QNetworkSession::SessionError)),
q, SLOT(_q_networkSessionFailed()));
@@ -136,6 +136,12 @@ void QNetworkReplyImplPrivate::_q_startOperation()
return;
}
+ if (session) {
+ //get notification of policy changes.
+ QObject::connect(session.data(), SIGNAL(usagePoliciesChanged(QNetworkSession::UsagePolicies)),
+ q, SLOT(_q_networkSessionUsagePoliciesChanged(QNetworkSession::UsagePolicies)));
+ }
+
if (backend && backend->isSynchronous()) {
state = Finished;
q_func()->setFinished(true);
@@ -318,6 +324,22 @@ void QNetworkReplyImplPrivate::_q_networkSessionFailed()
finished();
}
}
+
+void QNetworkReplyImplPrivate::_q_networkSessionUsagePoliciesChanged(QNetworkSession::UsagePolicies newPolicies)
+{
+ if (backend->request().attribute(QNetworkRequest::BackgroundRequestAttribute).toBool()) {
+ if (newPolicies & QNetworkSession::NoBackgroundTrafficPolicy) {
+ // Abort waiting and working replies.
+ if (state == WaitingForSession || state == Working) {
+ state = Working;
+ error(QNetworkReply::BackgroundRequestNotAllowedError,
+ QCoreApplication::translate("QNetworkReply", "Background request not allowed."));
+ finished();
+ }
+ // ### if backend->canResume(), then we could resume automatically, however no backend supports resuming
+ }
+ }
+}
#endif
void QNetworkReplyImplPrivate::setup(QNetworkAccessManager::Operation op, const QNetworkRequest &req,
@@ -468,10 +490,7 @@ void QNetworkReplyImplPrivate::createCache()
{
// check if we can save and if we're allowed to
if (!networkCache()
- || !request.attribute(QNetworkRequest::CacheSaveControlAttribute, true).toBool()
- || request.attribute(QNetworkRequest::CacheLoadControlAttribute,
- QNetworkRequest::PreferNetwork).toInt()
- == QNetworkRequest::AlwaysNetwork)
+ || !request.attribute(QNetworkRequest::CacheSaveControlAttribute, true).toBool())
return;
cacheEnabled = true;
}
@@ -679,7 +698,7 @@ char* QNetworkReplyImplPrivate::getDownloadBuffer(qint64 size)
downloadBuffer = new char[downloadBufferMaximumSize]; // throws if allocation fails
downloadBufferPointer = QSharedPointer<char>(downloadBuffer, downloadBufferDeleter);
- q->setAttribute(QNetworkRequest::DownloadBufferAttribute, qVariantFromValue<QSharedPointer<char> > (downloadBufferPointer));
+ q->setAttribute(QNetworkRequest::DownloadBufferAttribute, QVariant::fromValue<QSharedPointer<char> > (downloadBufferPointer));
}
}
@@ -694,7 +713,7 @@ void QNetworkReplyImplPrivate::setDownloadBuffer(QSharedPointer<char> sp, qint64
downloadBuffer = downloadBufferPointer.data();
downloadBufferCurrentSize = 0;
downloadBufferMaximumSize = size;
- q->setAttribute(QNetworkRequest::DownloadBufferAttribute, qVariantFromValue<QSharedPointer<char> > (downloadBufferPointer));
+ q->setAttribute(QNetworkRequest::DownloadBufferAttribute, QVariant::fromValue<QSharedPointer<char> > (downloadBufferPointer));
}
diff --git a/src/network/access/qnetworkreplyimpl_p.h b/src/network/access/qnetworkreplyimpl_p.h
index 601e99f5fa..a4c1f73b06 100644
--- a/src/network/access/qnetworkreplyimpl_p.h
+++ b/src/network/access/qnetworkreplyimpl_p.h
@@ -63,6 +63,7 @@
#include "private/qringbuffer_p.h"
#include "private/qbytedata_p.h"
#include <QSharedPointer>
+#include <QtNetwork/QNetworkSession>
QT_BEGIN_NAMESPACE
@@ -96,6 +97,7 @@ public:
#ifndef QT_NO_BEARERMANAGEMENT
Q_PRIVATE_SLOT(d_func(), void _q_networkSessionConnected())
Q_PRIVATE_SLOT(d_func(), void _q_networkSessionFailed())
+ Q_PRIVATE_SLOT(d_func(), void _q_networkSessionUsagePoliciesChanged(QNetworkSession::UsagePolicies))
#endif
#ifndef QT_NO_SSL
@@ -140,6 +142,7 @@ public:
#ifndef QT_NO_BEARERMANAGEMENT
void _q_networkSessionConnected();
void _q_networkSessionFailed();
+ void _q_networkSessionUsagePoliciesChanged(QNetworkSession::UsagePolicies);
#endif
void setup(QNetworkAccessManager::Operation op, const QNetworkRequest &request,
diff --git a/src/network/bearer/qnetworksession.cpp b/src/network/bearer/qnetworksession.cpp
index 1a3c25a97f..90bbe1b25b 100644
--- a/src/network/bearer/qnetworksession.cpp
+++ b/src/network/bearer/qnetworksession.cpp
@@ -43,6 +43,7 @@
#include "qbearerengine_p.h"
#include <QEventLoop>
+#include <QMetaMethod>
#include <QTimer>
#include <QThread>
@@ -704,7 +705,7 @@ void QNetworkSessionPrivate::setUsagePolicies(QNetworkSession &session, QNetwork
For more details check the Forced vs ALR roaming section in the QNetworkSession
class description.
*/
-void QNetworkSession::connectNotify(const char *signal)
+void QNetworkSession::connectNotify(const QMetaMethod &signal)
{
QObject::connectNotify(signal);
@@ -713,7 +714,9 @@ void QNetworkSession::connectNotify(const char *signal)
//check for preferredConfigurationChanged() signal connect notification
//This is not required on all platforms
- if (qstrcmp(signal, SIGNAL(preferredConfigurationChanged(QNetworkConfiguration,bool))) == 0)
+ static const QMetaMethod preferredConfigurationChangedSignal =
+ QMetaMethod::fromSignal(&QNetworkSession::preferredConfigurationChanged);
+ if (signal == preferredConfigurationChangedSignal)
d->setALREnabled(true);
}
@@ -725,7 +728,7 @@ void QNetworkSession::connectNotify(const char *signal)
\sa connectNotify()
*/
-void QNetworkSession::disconnectNotify(const char *signal)
+void QNetworkSession::disconnectNotify(const QMetaMethod &signal)
{
QObject::disconnectNotify(signal);
@@ -734,7 +737,9 @@ void QNetworkSession::disconnectNotify(const char *signal)
//check for preferredConfigurationChanged() signal disconnect notification
//This is not required on all platforms
- if (qstrcmp(signal, SIGNAL(preferredConfigurationChanged(QNetworkConfiguration,bool))) == 0)
+ static const QMetaMethod preferredConfigurationChangedSignal =
+ QMetaMethod::fromSignal(&QNetworkSession::preferredConfigurationChanged);
+ if (signal == preferredConfigurationChangedSignal)
d->setALREnabled(false);
}
diff --git a/src/network/bearer/qnetworksession.h b/src/network/bearer/qnetworksession.h
index d72fe0e759..d713825cdf 100644
--- a/src/network/bearer/qnetworksession.h
+++ b/src/network/bearer/qnetworksession.h
@@ -134,8 +134,8 @@ Q_SIGNALS:
void usagePoliciesChanged(QNetworkSession::UsagePolicies);
protected:
- virtual void connectNotify(const char *signal);
- virtual void disconnectNotify(const char *signal);
+ virtual void connectNotify(const QMetaMethod &signal);
+ virtual void disconnectNotify(const QMetaMethod &signal);
private:
Q_DISABLE_COPY(QNetworkSession)
diff --git a/src/network/doc/doc.pri b/src/network/doc/doc.pri
new file mode 100644
index 0000000000..7ca0ad07d4
--- /dev/null
+++ b/src/network/doc/doc.pri
@@ -0,0 +1,3 @@
+qtPrepareTool(QDOC, qdoc)
+docs.commands += $$QDOC $$QT.network.sources/doc/qtnetwork.qdocconf
+QMAKE_EXTRA_TARGETS += docs
diff --git a/src/network/doc/qtnetwork.qdocconf b/src/network/doc/qtnetwork.qdocconf
new file mode 100644
index 0000000000..2e58ad65c9
--- /dev/null
+++ b/src/network/doc/qtnetwork.qdocconf
@@ -0,0 +1,92 @@
+include(../../../doc/global/qt-cpp-ignore.qdocconf)
+
+project = QtNetwork
+description = Qt Network Reference Documentation
+url = http://qt-project.org/doc/qt-5.0/qtsql
+version = 5.0.0
+
+sourceencoding = UTF-8
+outputencoding = UTF-8
+naturallanguage = en_US
+qhp.projects = QtNetwork
+
+qhp.QtNetwork.file = qtnetwork.qhp
+qhp.QtNetwork.namespace = org.qt-project.qtnetwork.500
+qhp.QtNetwork.virtualFolder = qdoc
+qhp.QtNetwork.indexTitle = Qt Network Reference Documentation
+qhp.QtNetwork.indexRoot =
+
+qhp.QtNetwork.filterAttributes = qtnetwork 5.0.0 qtrefdoc
+qhp.QtNetwork.customFilters.Qt.name = QtNetwork 5.0.0
+qhp.QtNetwork.customFilters.Qt.filterAttributes = qtnetwork 5.0.0
+qhp.QtNetwork.subprojects = classes overviews examples
+qhp.QtNetwork.subprojects.classes.title = Classes
+qhp.QtNetwork.subprojects.classes.indexTitle = Qt Network's Classes
+qhp.QtNetwork.subprojects.classes.selectors = class fake:headerfile
+qhp.QtNetwork.subprojects.classes.sortPages = true
+qhp.QtNetwork.subprojects.overviews.title = Overviews
+qhp.QtNetwork.subprojects.overviews.indexTitle = All Overviews and HOWTOs
+qhp.QtNetwork.subprojects.overviews.selectors = fake:page,group,module
+qhp.QtNetwork.subprojects.examples.title = Qt Network Examples
+qhp.QtNetwork.subprojects.examples.indexTitle = Qt Network Examples
+qhp.QtNetwork.subprojects.examples.selectors = fake:example
+
+dita.metadata.default.author = Qt Project
+dita.metadata.default.permissions = all
+dita.metadata.default.publisher = Qt Project
+dita.metadata.default.copyryear = 2012
+dita.metadata.default.copyrholder = Nokia
+dita.metadata.default.audience = programmer
+
+sources.fileextensions = "*.c++ *.cc *.cpp *.cxx *.mm *.qml *.qdoc"
+headers.fileextensions = "*.ch *.h *.h++ *.hh *.hpp *.hxx"
+
+examples.fileextensions = "*.cpp *.h *.js *.xq *.svg *.xml *.ui *.qhp *.qhcp *.qml *.css"
+examples.imageextensions = "*.png"
+
+outputdir = ../../../doc/qtnetwork
+tagfile = ../../../doc/qtnetwork/qtnetwork.tags
+
+HTML.generatemacrefs = "true"
+HTML.nobreadcrumbs = "true"
+
+HTML.templatedir = .
+
+HTML.stylesheets = ../../../doc/global/style/offline.css
+
+HTML.headerstyles = \
+ " <link rel=\"stylesheet\" type=\"text/css\" href=\"style/offline.css\" />\n"
+
+HTML.endheader = \
+ "</head>\n" \
+
+defines = Q_QDOC \
+ QT_.*_SUPPORT \
+ QT_.*_LIB \
+ QT_COMPAT \
+ QT_KEYPAD_NAVIGATION \
+ QT_NO_EGL \
+ Q_WS_.* \
+ Q_OS_.* \
+ Q_BYTE_ORDER \
+ QT_DEPRECATED \
+ QT_DEPRECATED_* \
+ Q_NO_USING_KEYWORD \
+ __cplusplus \
+ Q_COMPILER_INITIALIZER_LISTS
+
+versionsym = QT_VERSION_STR
+
+codeindent = 1
+
+depends += qtcore
+
+headerdirs += ..
+
+sourcedirs += ..
+
+exampledirs += ../../../examples \
+ ../ \
+ snippets
+
+imagedirs += images
diff --git a/src/network/kernel/kernel.pri b/src/network/kernel/kernel.pri
index f38980910d..a8aa3622e1 100644
--- a/src/network/kernel/kernel.pri
+++ b/src/network/kernel/kernel.pri
@@ -26,6 +26,12 @@ SOURCES += kernel/qauthenticator.cpp \
kernel/qnetworkinterface.cpp
unix:SOURCES += kernel/qdnslookup_unix.cpp kernel/qhostinfo_unix.cpp kernel/qnetworkinterface_unix.cpp
+
+linux-android* {
+ SOURCES -= kernel/qdnslookup_unix.cpp
+ SOURCES += kernel/qdnslookup_android.cpp
+}
+
win32: {
HEADERS += kernel/qnetworkinterface_win_p.h
SOURCES += kernel/qdnslookup_win.cpp kernel/qhostinfo_win.cpp kernel/qnetworkinterface_win.cpp
@@ -34,6 +40,6 @@ win32: {
integrity:SOURCES += kernel/qdnslookup_unix.cpp kernel/qhostinfo_unix.cpp kernel/qnetworkinterface_unix.cpp
mac:LIBS_PRIVATE += -framework SystemConfiguration -framework CoreFoundation -framework CoreServices
-mac:contains(QT_CONFIG, coreservices):SOURCES += kernel/qnetworkproxy_mac.cpp
+mac:!ios:SOURCES += kernel/qnetworkproxy_mac.cpp
else:win32:SOURCES += kernel/qnetworkproxy_win.cpp
else:SOURCES += kernel/qnetworkproxy_generic.cpp
diff --git a/src/network/kernel/qdnslookup_android.cpp b/src/network/kernel/qdnslookup_android.cpp
new file mode 100644
index 0000000000..81c86c390b
--- /dev/null
+++ b/src/network/kernel/qdnslookup_android.cpp
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Collabora Ltd, author <robin.burchell@collabora.co.uk>
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtNetwork module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdnslookup_p.h"
+
+QT_BEGIN_NAMESPACE
+
+void QDnsLookupRunnable::query(const int requestType, const QByteArray &requestName, QDnsLookupReply *reply)
+{
+ qWarning() << Q_FUNC_INFO << "Not yet supported on Android";
+ reply->error = QDnsLookup::ResolverError;
+ reply->errorString = tr("Not yet supported on Android");
+ return;
+}
+
+QT_END_NAMESPACE
diff --git a/src/network/kernel/qhostinfo_unix.cpp b/src/network/kernel/qhostinfo_unix.cpp
index 71eb240812..b696265ee4 100644
--- a/src/network/kernel/qhostinfo_unix.cpp
+++ b/src/network/kernel/qhostinfo_unix.cpp
@@ -322,7 +322,7 @@ QString QHostInfo::localHostName()
QString QHostInfo::localDomainName()
{
-#if !defined(Q_OS_VXWORKS)
+#if !defined(Q_OS_VXWORKS) && !defined(Q_OS_LINUX_ANDROID)
resolveLibrary();
if (local_res_ninit) {
// using thread-safe version
diff --git a/src/network/kernel/qnetworkfunctions_wince.h b/src/network/kernel/qnetworkfunctions_wince.h
new file mode 100644
index 0000000000..4487ffb4e9
--- /dev/null
+++ b/src/network/kernel/qnetworkfunctions_wince.h
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtNetwork module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef Q_NETWORK_FUNCTIONS_WCE_H
+#define Q_NETWORK_FUNCTIONS_WCE_H
+#ifdef Q_OS_WINCE
+
+#include <qt_windows.h>
+
+
+DECLARE_HANDLE(SC_HANDLE);
+typedef enum _SC_ENUM_TYPE {
+ SC_ENUM_PROCESS_INFO = 0
+} SC_ENUM_TYPE;
+#define SC_MANAGER_CONNECT 0x0001
+#define SC_MANAGER_CREATE_SERVICE 0x0002
+#define SC_MANAGER_ENUMERATE_SERVICE 0x0004
+#define SERVICE_ACTIVE 0x00000001
+#define SERVICE_INACTIVE 0x00000002
+#define SERVICE_STATE_ALL (SERVICE_ACTIVE | \
+ SERVICE_INACTIVE)
+typedef struct _SERVICE_STATUS_PROCESS {
+ DWORD dwServiceType;
+ DWORD dwCurrentState;
+ DWORD dwControlsAccepted;
+ DWORD dwWin32ExitCode;
+ DWORD dwServiceSpecificExitCode;
+ DWORD dwCheckPoint;
+ DWORD dwWaitHint;
+ DWORD dwProcessId;
+ DWORD dwServiceFlags;
+} SERVICE_STATUS_PROCESS, *LPSERVICE_STATUS_PROCESS;
+typedef struct _ENUM_SERVICE_STATUS_PROCESSA {
+ LPSTR lpServiceName;
+ LPSTR lpDisplayName;
+ SERVICE_STATUS_PROCESS ServiceStatusProcess;
+} ENUM_SERVICE_STATUS_PROCESSA, *LPENUM_SERVICE_STATUS_PROCESSA;
+typedef struct _ENUM_SERVICE_STATUS_PROCESSW {
+ LPWSTR lpServiceName;
+ LPWSTR lpDisplayName;
+ SERVICE_STATUS_PROCESS ServiceStatusProcess;
+} ENUM_SERVICE_STATUS_PROCESSW, *LPENUM_SERVICE_STATUS_PROCESSW;
+#ifdef UNICODE
+typedef ENUM_SERVICE_STATUS_PROCESSW ENUM_SERVICE_STATUS_PROCESS;
+typedef LPENUM_SERVICE_STATUS_PROCESSW LPENUM_SERVICE_STATUS_PROCESS;
+#else
+typedef ENUM_SERVICE_STATUS_PROCESSA ENUM_SERVICE_STATUS_PROCESS;
+typedef LPENUM_SERVICE_STATUS_PROCESSA LPENUM_SERVICE_STATUS_PROCESS;
+#endif // UNICODE
+#endif // Q_OS_WINCE
+#endif // Q_NETWORK_FUNCTIONS_WCE_H \ No newline at end of file
diff --git a/src/network/kernel/qnetworkinterface_unix.cpp b/src/network/kernel/qnetworkinterface_unix.cpp
index fbff6dc4d3..db031fcc6b 100644
--- a/src/network/kernel/qnetworkinterface_unix.cpp
+++ b/src/network/kernel/qnetworkinterface_unix.cpp
@@ -61,6 +61,11 @@
# define QT_NO_GETIFADDRS
#endif
+#ifdef Q_OS_LINUX_ANDROID
+// android lacks if_nameindex
+# define QT_NO_IPV6IFNAME
+#endif
+
#ifndef QT_NO_GETIFADDRS
# include <ifaddrs.h>
#endif
diff --git a/src/network/kernel/qnetworkproxy_generic.cpp b/src/network/kernel/qnetworkproxy_generic.cpp
index c0c6b9fe42..66053b0b47 100644
--- a/src/network/kernel/qnetworkproxy_generic.cpp
+++ b/src/network/kernel/qnetworkproxy_generic.cpp
@@ -47,16 +47,50 @@
#ifndef QT_NO_NETWORKPROXY
/*
- * Construct a proxy from the environment variable http_proxy.
+ * Construct a proxy from the environment variables http_proxy and no_proxy.
* Or no system proxy. Just return a list with NoProxy.
*/
QT_BEGIN_NAMESPACE
-QList<QNetworkProxy> QNetworkProxyFactory::systemProxyForQuery(const QNetworkProxyQuery &)
+static bool ignoreProxyFor(const QNetworkProxyQuery &query)
+{
+ const QList<QByteArray> noProxyTokens = qgetenv("no_proxy").split(',');
+
+ foreach (const QByteArray rawToken, noProxyTokens) {
+ QByteArray token = rawToken.trimmed();
+ QString peerHostName = query.peerHostName();
+
+ // Since we use suffix matching, "*" is our 'default' behaviour
+ if (token.startsWith("*"))
+ token = token.mid(1);
+
+ // Harmonize trailing dot notation
+ if (token.endsWith('.') && !peerHostName.endsWith('.'))
+ token = token.left(token.length()-1);
+
+ // We prepend a dot to both values, so that when we do a suffix match,
+ // we don't match "donotmatch.com" with "match.com"
+ if (!token.startsWith('.'))
+ token.prepend('.');
+
+ if (!peerHostName.startsWith('.'))
+ peerHostName.prepend('.');
+
+ if (peerHostName.endsWith(QString::fromLatin1(token)))
+ return true;
+ }
+
+ return false;
+}
+
+QList<QNetworkProxy> QNetworkProxyFactory::systemProxyForQuery(const QNetworkProxyQuery &query)
{
QList<QNetworkProxy> proxyList;
+ if (ignoreProxyFor(query))
+ return proxyList << QNetworkProxy::NoProxy;
+
QByteArray proxy_env = qgetenv("http_proxy");
if (!proxy_env.isEmpty()) {
QUrl url = QUrl(QString::fromLocal8Bit(proxy_env));
diff --git a/src/network/kernel/qnetworkproxy_win.cpp b/src/network/kernel/qnetworkproxy_win.cpp
index a17f547742..cb137f8b76 100644
--- a/src/network/kernel/qnetworkproxy_win.cpp
+++ b/src/network/kernel/qnetworkproxy_win.cpp
@@ -48,10 +48,12 @@
#include <qregexp.h>
#include <qurl.h>
#include <private/qsystemlibrary_p.h>
+#include <qnetworkinterface.h>
#include <string.h>
#include <qt_windows.h>
#include <wininet.h>
+#include "qnetworkfunctions_wince.h"
/*
* Information on the WinHTTP DLL:
@@ -190,10 +192,26 @@ static bool isBypassed(const QString &host, const QStringList &bypassList)
QHostAddress ipAddress;
bool isIpAddress = ipAddress.setAddress(host);
+ // always exclude loopback
+ if (isIpAddress && ipAddress.isLoopback())
+ return true;
+
// does it match the list of exclusions?
foreach (const QString &entry, bypassList) {
- if (isSimple && entry == QLatin1String("<local>"))
- return true;
+ if (entry == QLatin1String("<local>")) {
+ if (isSimple)
+ return true;
+ if (isIpAddress) {
+ //exclude all local subnets
+ foreach (const QNetworkInterface &iface, QNetworkInterface::allInterfaces()) {
+ foreach (const QNetworkAddressEntry netaddr, iface.addressEntries()) {
+ if (ipAddress.isInSubnet(netaddr.ip(), netaddr.prefixLength())) {
+ return true;
+ }
+ }
+ }
+ }
+ }
if (isIpAddress && ipAddress.isInSubnet(QHostAddress::parseSubnet(entry))) {
return true; // excluded
} else {
diff --git a/src/network/network.pro b/src/network/network.pro
index 671b7fde69..a6597338f5 100644
--- a/src/network/network.pro
+++ b/src/network/network.pro
@@ -26,6 +26,7 @@ HEADERS += $$QT_SOURCE_TREE/src/network/qtnetworkversion.h
include(access/access.pri)
include(bearer/bearer.pri)
+include(doc/doc.pri)
include(kernel/kernel.pri)
include(socket/socket.pri)
include(ssl/ssl.pri)
diff --git a/src/network/socket/qnativesocketengine_unix.cpp b/src/network/socket/qnativesocketengine_unix.cpp
index 7cd8e1bff3..91299f5f92 100644
--- a/src/network/socket/qnativesocketengine_unix.cpp
+++ b/src/network/socket/qnativesocketengine_unix.cpp
@@ -943,9 +943,13 @@ bool QNativeSocketEnginePrivate::fetchConnectionParameters()
#if defined (IPV6_V6ONLY)
// determine if local address is dual mode
+ // On linux, these are returned as "::" (==AnyIPv6)
+ // On OSX, these are returned as "::FFFF:0.0.0.0" (==AnyIPv4)
+ // in either case, the IPV6_V6ONLY option is cleared
int ipv6only = 0;
socklen_t optlen = sizeof(ipv6only);
- if (localAddress == QHostAddress::AnyIPv6
+ if (socketProtocol == QAbstractSocket::IPv6Protocol
+ && (localAddress == QHostAddress::AnyIPv4 || localAddress == QHostAddress::AnyIPv6)
&& !getsockopt(socketDescriptor, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&ipv6only, &optlen )) {
if (optlen != sizeof(ipv6only))
qWarning("unexpected size of IPV6_V6ONLY socket option");
diff --git a/src/network/ssl/qsslcertificate.cpp b/src/network/ssl/qsslcertificate.cpp
index 65634a3cb7..7282546a8a 100644
--- a/src/network/ssl/qsslcertificate.cpp
+++ b/src/network/ssl/qsslcertificate.cpp
@@ -797,6 +797,8 @@ QByteArray QSslCertificate::toDer() const
/*!
Returns this certificate converted to a human-readable text
representation.
+
+ \since 5.0
*/
QByteArray QSslCertificate::toText() const
{
@@ -906,6 +908,8 @@ QList<QSslCertificate> QSslCertificate::fromData(const QByteArray &data, QSsl::E
this will be looked up automatically either using the CA list specified by
QSslSocket::defaultCaCertificates() or, if possible, it will be loaded on demand
on Unix.
+
+ \since 5.0
*/
QList<QSslError> QSslCertificate::verify(QList<QSslCertificate> certificateChain, const QString &hostName)
{
diff --git a/src/network/ssl/qsslcertificateextension.cpp b/src/network/ssl/qsslcertificateextension.cpp
index 89b1a929c8..8a4e7409bf 100644
--- a/src/network/ssl/qsslcertificateextension.cpp
+++ b/src/network/ssl/qsslcertificateextension.cpp
@@ -138,15 +138,24 @@ QSslCertificateExtension::QSslCertificateExtension()
{
}
+/*!
+ Constructs a copy of \a other.
+ */
QSslCertificateExtension::QSslCertificateExtension(const QSslCertificateExtension &other)
: d(other.d)
{
}
+/*!
+ Destroys the extension.
+ */
QSslCertificateExtension::~QSslCertificateExtension()
{
}
+/*!
+ Assigns \a other to this extension and returns a reference to this extension.
+ */
QSslCertificateExtension &QSslCertificateExtension::operator=(const QSslCertificateExtension &other)
{
d = other.d;
diff --git a/src/network/ssl/qsslsocket.cpp b/src/network/ssl/qsslsocket.cpp
index 6338cbbe6f..27c0123fbd 100644
--- a/src/network/ssl/qsslsocket.cpp
+++ b/src/network/ssl/qsslsocket.cpp
@@ -2332,6 +2332,57 @@ bool QSslSocketPrivate::verifyErrorsHaveBeenIgnored()
/*!
\internal
*/
+qint64 QSslSocketPrivate::peek(char *data, qint64 maxSize)
+{
+ if (mode == QSslSocket::UnencryptedMode && !autoStartHandshake) {
+ //unencrypted mode - do not use QIODevice::peek, as it reads ahead data from the plain socket
+ //peek at data already in the QIODevice buffer (from a previous read)
+ qint64 r = buffer.peek(data, maxSize);
+ if (r == maxSize)
+ return r;
+ data += r;
+ //peek at data in the plain socket
+ if (plainSocket) {
+ qint64 r2 = plainSocket->peek(data, maxSize - r);
+ if (r2 < 0)
+ return (r > 0 ? r : r2);
+ return r + r2;
+ } else {
+ return -1;
+ }
+ } else {
+ //encrypted mode - the socket engine will read and decrypt data into the QIODevice buffer
+ return QTcpSocketPrivate::peek(data, maxSize);
+ }
+}
+
+/*!
+ \internal
+*/
+QByteArray QSslSocketPrivate::peek(qint64 maxSize)
+{
+ if (mode == QSslSocket::UnencryptedMode && !autoStartHandshake) {
+ //unencrypted mode - do not use QIODevice::peek, as it reads ahead data from the plain socket
+ //peek at data already in the QIODevice buffer (from a previous read)
+ QByteArray ret;
+ ret.reserve(maxSize);
+ ret.resize(buffer.peek(ret.data(), maxSize));
+ if (ret.length() == maxSize)
+ return ret;
+ //peek at data in the plain socket
+ if (plainSocket)
+ return ret + plainSocket->peek(maxSize - ret.length());
+ else
+ return QByteArray();
+ } else {
+ //encrypted mode - the socket engine will read and decrypt data into the QIODevice buffer
+ return QTcpSocketPrivate::peek(maxSize);
+ }
+}
+
+/*!
+ \internal
+*/
QList<QByteArray> QSslSocketPrivate::unixRootCertDirectories()
{
return QList<QByteArray>() << "/etc/ssl/certs/" // (K)ubuntu, OpenSUSE, Mandriva, MeeGo ...
diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp
index 44d579995b..bac837e62f 100644
--- a/src/network/ssl/qsslsocket_openssl.cpp
+++ b/src/network/ssl/qsslsocket_openssl.cpp
@@ -60,9 +60,13 @@
#include <QtCore/qvarlengtharray.h>
#include <QLibrary> // for loading the security lib for the CA store
+#ifdef Q_OS_WIN
+Q_DECLARE_METATYPE(QSslCertificate);
+#endif
+
QT_BEGIN_NAMESPACE
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
#define kSecTrustSettingsDomainSystem 2 // so we do not need to include the header file
PtrSecCertificateGetData QSslSocketPrivate::ptrSecCertificateGetData = 0;
PtrSecTrustSettingsCopyCertificates QSslSocketPrivate::ptrSecTrustSettingsCopyCertificates = 0;
@@ -539,6 +543,7 @@ void QSslSocketPrivate::deinitialize()
{
q_CRYPTO_set_id_callback(0);
q_CRYPTO_set_locking_callback(0);
+ q_ERR_free_strings();
}
/*!
@@ -560,6 +565,7 @@ bool QSslSocketPrivate::ensureLibraryLoaded()
// Check if the library itself needs to be initialized.
QMutexLocker locker(openssl_locks()->initLock());
+
if (!s_libraryLoaded) {
s_libraryLoaded = true;
@@ -612,7 +618,7 @@ void QSslSocketPrivate::ensureCiphersAndCertsLoaded()
resetDefaultCiphers();
//load symbols needed to receive certificates from system store
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
QLibrary securityLib("/System/Library/Frameworks/Security.framework/Versions/Current/Security");
if (securityLib.load()) {
ptrSecCertificateGetData = (PtrSecCertificateGetData) securityLib.resolve("SecCertificateGetData");
@@ -745,7 +751,7 @@ QList<QSslCertificate> QSslSocketPrivate::systemCaCertificates()
timer.start();
#endif
QList<QSslCertificate> systemCerts;
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
CFArrayRef cfCerts;
OSStatus status = 1;
@@ -1338,8 +1344,6 @@ void QSslSocketBackendPrivate::_q_caRootLoaded(QSslCertificate cert, QSslCertifi
continueHandshake();
}
-Q_DECLARE_METATYPE(QSslCertificate);
-
class QWindowsCaRootFetcherThread : public QThread
{
public:
@@ -1387,7 +1391,7 @@ void QWindowsCaRootFetcher::start()
// set key usage constraint
parameters.RequestedUsage.dwType = USAGE_MATCH_TYPE_AND;
parameters.RequestedUsage.Usage.cUsageIdentifier = 1;
- LPSTR oid = (mode == QSslSocket::SslClientMode ? szOID_PKIX_KP_SERVER_AUTH : szOID_PKIX_KP_CLIENT_AUTH);
+ LPSTR oid = (LPSTR)(mode == QSslSocket::SslClientMode ? szOID_PKIX_KP_SERVER_AUTH : szOID_PKIX_KP_CLIENT_AUTH);
parameters.RequestedUsage.Usage.rgpszUsageIdentifier = &oid;
#ifdef QSSLSOCKET_DEBUG
diff --git a/src/network/ssl/qsslsocket_openssl_symbols.cpp b/src/network/ssl/qsslsocket_openssl_symbols.cpp
index b5374d13cd..2e99bdbca4 100644
--- a/src/network/ssl/qsslsocket_openssl_symbols.cpp
+++ b/src/network/ssl/qsslsocket_openssl_symbols.cpp
@@ -125,6 +125,7 @@ DEFINEFUNC3(X509 *, d2i_X509, X509 **a, a, const unsigned char **b, b, long c, c
#endif
DEFINEFUNC2(char *, ERR_error_string, unsigned long a, a, char *b, b, return 0, return)
DEFINEFUNC(unsigned long, ERR_get_error, DUMMYARG, DUMMYARG, return 0, return)
+DEFINEFUNC(void, ERR_free_strings, void, DUMMYARG, return, DUMMYARG)
DEFINEFUNC(const EVP_CIPHER *, EVP_des_ede3_cbc, DUMMYARG, DUMMYARG, return 0, return)
DEFINEFUNC3(int, EVP_PKEY_assign, EVP_PKEY *a, a, int b, b, char *c, c, return -1, return)
DEFINEFUNC2(int, EVP_PKEY_set1_RSA, EVP_PKEY *a, a, RSA *b, b, return -1, return)
@@ -367,7 +368,7 @@ static int dlIterateCallback(struct dl_phdr_info *info, size_t size, void *data)
}
#endif
-static QStringList findAllLibSsl()
+static QStringList libraryPathList()
{
QStringList paths;
# ifdef Q_OS_DARWIN
@@ -378,6 +379,9 @@ static QStringList findAllLibSsl()
.split(QLatin1Char(':'), QString::SkipEmptyParts);
# endif
paths << QLatin1String("/lib") << QLatin1String("/usr/lib") << QLatin1String("/usr/local/lib");
+ paths << QLatin1String("/lib64") << QLatin1String("/usr/lib64") << QLatin1String("/usr/local/lib64");
+ paths << QLatin1String("/lib32") << QLatin1String("/usr/lib32") << QLatin1String("/usr/local/lib32");
+
#ifdef Q_OS_LINUX
// discover paths of already loaded libraries
QSet<QString> loadedPaths;
@@ -385,9 +389,17 @@ static QStringList findAllLibSsl()
paths.append(loadedPaths.toList());
#endif
+ return paths;
+}
+
+
+static QStringList findAllLibSsl()
+{
+ QStringList paths = libraryPathList();
QStringList foundSsls;
+
foreach (const QString &path, paths) {
- QDir dir = QDir(path);
+ QDir dir(path);
QStringList entryList = dir.entryList(QStringList() << QLatin1String("libssl.*"), QDir::Files);
qSort(entryList.begin(), entryList.end(), libGreaterThan);
@@ -397,6 +409,23 @@ static QStringList findAllLibSsl()
return foundSsls;
}
+
+static QStringList findAllLibCrypto()
+{
+ QStringList paths = libraryPathList();
+
+ QStringList foundCryptos;
+ foreach (const QString &path, paths) {
+ QDir dir(path);
+ QStringList entryList = dir.entryList(QStringList() << QLatin1String("libcrypto.*"), QDir::Files);
+
+ qSort(entryList.begin(), entryList.end(), libGreaterThan);
+ foreach (const QString &entry, entryList)
+ foundCryptos << path + QLatin1Char('/') + entry;
+ }
+
+ return foundCryptos;
+}
# endif
#ifdef Q_OS_WIN
@@ -489,18 +518,29 @@ static QPair<QLibrary*, QLibrary*> loadOpenSsl()
// third attempt: loop on the most common library paths and find libssl
QStringList sslList = findAllLibSsl();
- foreach (const QString &ssl, sslList) {
- QString crypto = ssl;
- crypto.replace(QLatin1String("ssl"), QLatin1String("crypto"));
- libssl->setFileNameAndVersion(ssl, -1);
+ QStringList cryptoList = findAllLibCrypto();
+
+ foreach (const QString &crypto, cryptoList) {
libcrypto->setFileNameAndVersion(crypto, -1);
- if (libcrypto->load() && libssl->load()) {
- // libssl.so.0 and libcrypto.so.0 found
- return pair;
- } else {
- libssl->unload();
- libcrypto->unload();
+ if (libcrypto->load()) {
+ QFileInfo fi(crypto);
+ QString version = fi.completeSuffix();
+
+ foreach (const QString &ssl, sslList) {
+ if (!ssl.endsWith(version))
+ continue;
+
+ libssl->setFileNameAndVersion(ssl, -1);
+
+ if (libssl->load()) {
+ // libssl.so.x and libcrypto.so.x found
+ return pair;
+ } else {
+ libssl->unload();
+ }
+ }
}
+ libcrypto->unload();
}
// failed to load anything
@@ -560,6 +600,7 @@ bool q_resolveOpenSslSymbols()
RESOLVEFUNC(DSA_free)
RESOLVEFUNC(ERR_error_string)
RESOLVEFUNC(ERR_get_error)
+ RESOLVEFUNC(ERR_free_strings)
RESOLVEFUNC(EVP_des_ede3_cbc)
RESOLVEFUNC(EVP_PKEY_assign)
RESOLVEFUNC(EVP_PKEY_set1_RSA)
diff --git a/src/network/ssl/qsslsocket_openssl_symbols_p.h b/src/network/ssl/qsslsocket_openssl_symbols_p.h
index b0d748692f..447afe07a2 100644
--- a/src/network/ssl/qsslsocket_openssl_symbols_p.h
+++ b/src/network/ssl/qsslsocket_openssl_symbols_p.h
@@ -226,6 +226,7 @@ X509 *q_d2i_X509(X509 **a, unsigned char **b, long c);
#endif
char *q_ERR_error_string(unsigned long a, char *b);
unsigned long q_ERR_get_error();
+void q_ERR_free_strings();
const EVP_CIPHER *q_EVP_des_ede3_cbc();
int q_EVP_PKEY_assign(EVP_PKEY *a, int b, char *c);
Q_AUTOTEST_EXPORT int q_EVP_PKEY_set1_RSA(EVP_PKEY *a, RSA *b);
diff --git a/src/network/ssl/qsslsocket_p.h b/src/network/ssl/qsslsocket_p.h
index aab29a84ba..5e3148d1b7 100644
--- a/src/network/ssl/qsslsocket_p.h
+++ b/src/network/ssl/qsslsocket_p.h
@@ -64,22 +64,26 @@
#include <private/qringbuffer_p.h>
-QT_BEGIN_NAMESPACE
-
#if defined(Q_OS_MAC)
#include <Security/SecCertificate.h>
#include <CoreFoundation/CFArray.h>
-#ifndef QT_NO_CORESERVICES
- typedef OSStatus (*PtrSecCertificateGetData)(SecCertificateRef, CSSM_DATA_PTR);
- typedef OSStatus (*PtrSecTrustSettingsCopyCertificates)(int, CFArrayRef*);
- typedef OSStatus (*PtrSecTrustCopyAnchorCertificates)(CFArrayRef*);
-#endif
#elif defined(Q_OS_WIN)
#include <QtCore/qt_windows.h>
#include <wincrypt.h>
#ifndef HCRYPTPROV_LEGACY
#define HCRYPTPROV_LEGACY HCRYPTPROV
#endif
+#endif
+
+QT_BEGIN_NAMESPACE
+
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
+ typedef OSStatus (*PtrSecCertificateGetData)(SecCertificateRef, CSSM_DATA_PTR);
+ typedef OSStatus (*PtrSecTrustSettingsCopyCertificates)(int, CFArrayRef*);
+ typedef OSStatus (*PtrSecTrustCopyAnchorCertificates)(CFArrayRef*);
+#endif
+
+#if defined(Q_OS_WIN)
#if defined(Q_OS_WINCE)
typedef HCERTSTORE (WINAPI *PtrCertOpenSystemStoreW)(LPCSTR, DWORD, HCRYPTPROV_LEGACY, DWORD, const void*);
#else
@@ -136,7 +140,7 @@ public:
static void addDefaultCaCertificate(const QSslCertificate &cert);
static void addDefaultCaCertificates(const QList<QSslCertificate> &certs);
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+#if defined(Q_OS_MAC) && !defined(Q_OS_IOS)
static PtrSecCertificateGetData ptrSecCertificateGetData;
static PtrSecTrustSettingsCopyCertificates ptrSecTrustSettingsCopyCertificates;
static PtrSecTrustCopyAnchorCertificates ptrSecTrustCopyAnchorCertificates;
@@ -166,6 +170,9 @@ public:
virtual void _q_caRootLoaded(QSslCertificate,QSslCertificate) = 0;
#endif
+ virtual qint64 peek(char *data, qint64 maxSize);
+ virtual QByteArray peek(qint64 maxSize);
+
// Platform specific functions
virtual void startClientEncryption() = 0;
virtual void startServerEncryption() = 0;
diff --git a/src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp b/src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp
index c12a83a61e..8321b8dafe 100644
--- a/src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp
+++ b/src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp
@@ -105,8 +105,10 @@ void QGLTextureGlyphCache::createTextureData(int width, int height)
if (height < 16)
height = 16;
- if (m_textureResource && !m_textureResource->m_texture)
+ if (m_textureResource && !m_textureResource->m_texture) {
delete m_textureResource;
+ m_textureResource = 0;
+ }
if (!m_textureResource)
m_textureResource = new QGLGlyphTexture(ctx);
diff --git a/src/opengl/gl2paintengineex/qtextureglyphcache_gl_p.h b/src/opengl/gl2paintengineex/qtextureglyphcache_gl_p.h
index 8992c535ba..122fed582b 100644
--- a/src/opengl/gl2paintengineex/qtextureglyphcache_gl_p.h
+++ b/src/opengl/gl2paintengineex/qtextureglyphcache_gl_p.h
@@ -85,6 +85,8 @@ struct QGLGlyphTexture : public QOpenGLSharedResource
const QGLContext *ctx = QGLContext::fromOpenGLContext(context);
#ifdef QT_GL_TEXTURE_GLYPH_CACHE_DEBUG
qDebug("~QGLGlyphTexture() %p for context %p.", this, ctx);
+#else
+ Q_UNUSED(ctx);
#endif
if (m_fbo)
glDeleteFramebuffers(1, &m_fbo);
diff --git a/src/opengl/qgl.cpp b/src/opengl/qgl.cpp
index 6b0c637c87..893915f433 100644
--- a/src/opengl/qgl.cpp
+++ b/src/opengl/qgl.cpp
@@ -1648,13 +1648,6 @@ int qt_next_power_of_two(int v)
return v;
}
-typedef void (*_qt_pixmap_cleanup_hook_64)(qint64);
-typedef void (*_qt_image_cleanup_hook_64)(qint64);
-
-extern Q_GUI_EXPORT _qt_pixmap_cleanup_hook_64 qt_pixmap_cleanup_hook_64;
-extern Q_GUI_EXPORT _qt_image_cleanup_hook_64 qt_image_cleanup_hook_64;
-
-
Q_GLOBAL_STATIC(QGLTextureCache, qt_gl_texture_cache)
QGLTextureCache::QGLTextureCache()
diff --git a/src/opengl/qgl.h b/src/opengl/qgl.h
index 031bdf3317..39d63c12fe 100644
--- a/src/opengl/qgl.h
+++ b/src/opengl/qgl.h
@@ -59,7 +59,7 @@ QT_BEGIN_HEADER
#endif
#if defined(Q_OS_MAC)
-# if !defined(QT_NO_CORESERVICES)
+# if !defined(Q_OS_IOS)
# include <OpenGL/gl.h>
# else
# if defined(QT_OPENGL_ES_2)
diff --git a/src/platformsupport/cglconvenience/cglconvenience.pri b/src/platformsupport/cglconvenience/cglconvenience.pri
index d4c149404f..f5e3d543ec 100644
--- a/src/platformsupport/cglconvenience/cglconvenience.pri
+++ b/src/platformsupport/cglconvenience/cglconvenience.pri
@@ -1,4 +1,4 @@
-mac:contains(QT_CONFIG, coreservices) {
+mac:!ios {
INCLUDEPATH += $$PWD
HEADERS += \
diff --git a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
index a774a6940e..9fa1d80993 100644
--- a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
+++ b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
@@ -39,7 +39,7 @@
**
****************************************************************************/
-#ifndef QT_NO_CORESERVICES
+#ifndef Q_OS_IOS
#import <Cocoa/Cocoa.h>
#import <IOKit/graphics/IOGraphicsLib.h>
#endif
@@ -120,7 +120,7 @@ static NSInteger languageMapSort(id obj1, id obj2, void *context)
QCoreTextFontDatabase::QCoreTextFontDatabase()
{
-#ifndef QT_NO_CORESERVICES
+#ifndef Q_OS_IOS
QSettings appleSettings(QLatin1String("apple.com"));
QVariant appleValue = appleSettings.value(QLatin1String("AppleAntiAliasingThreshold"));
if (appleValue.isValid())
@@ -348,7 +348,7 @@ QStringList QCoreTextFontDatabase::fallbacksForFamily(const QString family, cons
return fallbackLists[styleHint];
}
-#ifndef QT_NO_CORESERVICES
+#ifndef Q_OS_IOS
OSErr qt_mac_create_fsref(const QString &file, FSRef *fsref);
QStringList QCoreTextFontDatabase::addApplicationFont(const QByteArray &fontData, const QString &fileName)
{
diff --git a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h
index cbe1b28db8..01aed89d47 100644
--- a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h
+++ b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h
@@ -55,7 +55,7 @@ public:
QFontEngine *fontEngine(const QFontDef &fontDef, QUnicodeTables::Script script, void *handle);
QFontEngine *fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference);
QStringList fallbacksForFamily(const QString family, const QFont::Style &style, const QFont::StyleHint &styleHint, const QUnicodeTables::Script &script) const;
-#ifndef QT_NO_CORESERVICES
+#ifndef Q_OS_IOS
QStringList addApplicationFont(const QByteArray &fontData, const QString &fileName);
#endif
void releaseHandle(void *handle);
diff --git a/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm b/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm
index df6becc5e3..746cba6762 100644
--- a/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm
+++ b/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm
@@ -413,7 +413,7 @@ QImage QCoreTextFontEngine::imageForGlyph(glyph_t glyph, QFixed subPixelPosition
QImage im(qRound(br.width)+2, qRound(br.height)+2, QImage::Format_RGB32);
im.fill(0);
-#ifndef QT_NO_CORESERVICES
+#ifndef Q_OS_IOS
CGColorSpaceRef colorspace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
#else
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
diff --git a/src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h b/src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h
index e1435c8b63..116b76f3ed 100644
--- a/src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h
+++ b/src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h
@@ -45,7 +45,7 @@
#include <private/qfontengine_p.h>
#include <private/qcore_mac_p.h>
-#ifndef QT_NO_CORESERVICES
+#ifndef Q_OS_IOS
#include <ApplicationServices/ApplicationServices.h>
#else
#include <CoreText/CoreText.h>
diff --git a/src/platformsupport/udev/qudevicehelper.cpp b/src/platformsupport/udev/qudevicehelper.cpp
index bf3ce67b43..688cedd304 100644
--- a/src/platformsupport/udev/qudevicehelper.cpp
+++ b/src/platformsupport/udev/qudevicehelper.cpp
@@ -96,6 +96,7 @@ QUDeviceHelper::QUDeviceHelper(QUDeviceTypes types, struct udev *udev, QObject *
}
udev_monitor_filter_add_match_subsystem_devtype(m_udevMonitor, "input", 0);
+ udev_monitor_filter_add_match_subsystem_devtype(m_udevMonitor, "drm", 0);
udev_monitor_enable_receiving(m_udevMonitor);
m_udevMonitorFileDescriptor = udev_monitor_get_fd(m_udevMonitor);
@@ -121,6 +122,7 @@ QStringList QUDeviceHelper::scanConnectedDevices()
udev_enumerate *ue = udev_enumerate_new(m_udev);
udev_enumerate_add_match_subsystem(ue, "input");
+ udev_enumerate_add_match_subsystem(ue, "drm");
if (m_types & UDev_Mouse)
udev_enumerate_add_match_property(ue, "ID_INPUT_MOUSE", "1");
@@ -143,7 +145,9 @@ QStringList QUDeviceHelper::scanConnectedDevices()
const char *syspath = udev_list_entry_get_name(entry);
udev_device *udevice = udev_device_new_from_syspath(m_udev, syspath);
QString candidate = QString::fromUtf8(udev_device_get_devnode(udevice));
- if (candidate.startsWith(QLatin1String("/dev/input/event")))
+ if ((m_types & UDev_InputMask) && candidate.startsWith(QLatin1String("/dev/input/event")))
+ devices << candidate;
+ if ((m_types & UDev_VideoMask) && candidate.startsWith(QLatin1String("/dev/dri/card")))
devices << candidate;
udev_device_unref(udevice);
@@ -180,12 +184,16 @@ void QUDeviceHelper::handleUDevNotification()
if (!str)
goto cleanup;
+ const char *subsystem;
devNode = QString::fromUtf8(str);
- if (!devNode.startsWith(QLatin1String("/dev/input/event")))
- goto cleanup;
+ if (devNode.startsWith(QLatin1String("/dev/input/event")))
+ subsystem = "input";
+ else if (devNode.startsWith(QLatin1String("/dev/dri/card")))
+ subsystem = "drm";
+ else goto cleanup;
// does not increase the refcount
- dev = udev_device_get_parent_with_subsystem_devtype(dev, "input", 0);
+ dev = udev_device_get_parent_with_subsystem_devtype(dev, subsystem, 0);
if (!dev)
goto cleanup;
@@ -229,6 +237,9 @@ QUDeviceHelper::QUDeviceTypes QUDeviceHelper::checkDeviceType(udev_device *dev)
if ((m_types & UDev_Touchscreen) && (qstrcmp(udev_device_get_property_value(dev, "ID_INPUT_TOUCHSCREEN"), "1") == 0))
types |= UDev_Touchscreen;
+ if ((m_types & UDev_DRM) && (qstrcmp(udev_device_get_subsystem(dev), "drm") == 0))
+ types |= UDev_DRM;
+
return types;
}
diff --git a/src/platformsupport/udev/qudevicehelper_p.h b/src/platformsupport/udev/qudevicehelper_p.h
index b7544fa6c2..15dbe2926c 100644
--- a/src/platformsupport/udev/qudevicehelper_p.h
+++ b/src/platformsupport/udev/qudevicehelper_p.h
@@ -60,7 +60,10 @@ public:
UDev_Mouse = 0x01,
UDev_Touchpad = 0x02,
UDev_Touchscreen = 0x04,
- UDev_Keyboard = 0x08
+ UDev_Keyboard = 0x08,
+ UDev_DRM = 0x10,
+ UDev_InputMask = UDev_Mouse | UDev_Touchpad | UDev_Touchscreen | UDev_Keyboard,
+ UDev_VideoMask = UDev_DRM
};
Q_DECLARE_FLAGS(QUDeviceTypes, QUDeviceType)
diff --git a/src/plugins/accessible/widgets/complexwidgets.cpp b/src/plugins/accessible/widgets/complexwidgets.cpp
index e4b10670ae..8da65791f8 100644
--- a/src/plugins/accessible/widgets/complexwidgets.cpp
+++ b/src/plugins/accessible/widgets/complexwidgets.cpp
@@ -319,7 +319,7 @@ QString QAccessibleComboBox::text(QAccessible::Text t) const
break;
#ifndef QT_NO_SHORTCUT
case QAccessible::Accelerator:
- str = (QString)QKeySequence(Qt::Key_Down);
+ str = QKeySequence(Qt::Key_Down).toString(QKeySequence::NativeText);
break;
#endif
default:
diff --git a/src/plugins/accessible/widgets/itemviews.cpp b/src/plugins/accessible/widgets/itemviews.cpp
index c0a8ec4286..92e8f9fcac 100644
--- a/src/plugins/accessible/widgets/itemviews.cpp
+++ b/src/plugins/accessible/widgets/itemviews.cpp
@@ -401,6 +401,10 @@ QModelIndex QAccessibleTree::indexFromLogical(int row, int column) const
return QModelIndex();
const QTreeView *treeView = qobject_cast<const QTreeView*>(view());
+ if (treeView->d_func()->viewItems.count() <= row) {
+ qWarning() << "QAccessibleTree::indexFromLogical: invalid index: " << row << column << " for " << treeView;
+ return QModelIndex();
+ }
QModelIndex modelIndex = treeView->d_func()->viewItems.at(row).index;
if (modelIndex.isValid() && column > 0) {
diff --git a/src/plugins/accessible/widgets/qaccessiblemenu.cpp b/src/plugins/accessible/widgets/qaccessiblemenu.cpp
index 6009d25977..bb809df584 100644
--- a/src/plugins/accessible/widgets/qaccessiblemenu.cpp
+++ b/src/plugins/accessible/widgets/qaccessiblemenu.cpp
@@ -249,7 +249,7 @@ QAccessible::State QAccessibleMenuItem::state() const
QAccessible::State s;
QWidget *own = owner();
- if (own && own->testAttribute(Qt::WA_WState_Visible) == false || m_action->isVisible() == false) {
+ if (own && (own->testAttribute(Qt::WA_WState_Visible) == false || m_action->isVisible() == false)) {
s.invisible = true;
}
diff --git a/src/plugins/bearer/connman/qconnmanservice_linux.cpp b/src/plugins/bearer/connman/qconnmanservice_linux.cpp
index 3ee67ed38f..83f9ff1903 100644
--- a/src/plugins/bearer/connman/qconnmanservice_linux.cpp
+++ b/src/plugins/bearer/connman/qconnmanservice_linux.cpp
@@ -72,9 +72,10 @@ QConnmanManagerInterface::~QConnmanManagerInterface()
{
}
-void QConnmanManagerInterface::connectNotify(const char *signal)
+void QConnmanManagerInterface::connectNotify(const QMetaMethod &signal)
{
-if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QConnmanManagerInterface::propertyChanged);
+ if (signal == propertyChangedSignal) {
if(!connection().connect(QLatin1String(CONNMAN_SERVICE),
QLatin1String(CONNMAN_MANAGER_PATH),
QLatin1String(CONNMAN_MANAGER_INTERFACE),
@@ -84,7 +85,8 @@ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
}
}
- if (QLatin1String(signal) == SIGNAL(stateChanged(QString))) {
+ static const QMetaMethod stateChangedSignal = QMetaMethod::fromSignal(&QConnmanManagerInterface::stateChanged);
+ if (signal == stateChangedSignal) {
if (!connection().connect(QLatin1String(CONNMAN_SERVICE),
QLatin1String(CONNMAN_MANAGER_PATH),
QLatin1String(CONNMAN_MANAGER_INTERFACE),
@@ -94,7 +96,8 @@ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
}
}
- if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
+ static const QMetaMethod propertyChangedContextSignal = QMetaMethod::fromSignal(&QConnmanManagerInterface::propertyChangedContext);
+ if (signal == propertyChangedContextSignal) {
QConnmanDBusHelper *helper;
helper = new QConnmanDBusHelper(this);
@@ -110,9 +113,10 @@ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
}
}
-void QConnmanManagerInterface::disconnectNotify(const char *signal)
+void QConnmanManagerInterface::disconnectNotify(const QMetaMethod &signal)
{
- if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+ static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QConnmanManagerInterface::propertyChanged);
+ if (signal == propertyChangedSignal) {
}
}
@@ -331,9 +335,10 @@ QConnmanProfileInterface::~QConnmanProfileInterface()
{
}
-void QConnmanProfileInterface::connectNotify(const char *signal)
+void QConnmanProfileInterface::connectNotify(const QMetaMethod &signal)
{
- if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QConnmanProfileInterface::propertyChanged);
+ if (signal == propertyChangedSignal) {
dbusConnection.connect(QLatin1String(CONNMAN_SERVICE),
this->path(),
QLatin1String(CONNMAN_PROFILE_INTERFACE),
@@ -342,9 +347,10 @@ void QConnmanProfileInterface::connectNotify(const char *signal)
}
}
-void QConnmanProfileInterface::disconnectNotify(const char *signal)
+void QConnmanProfileInterface::disconnectNotify(const QMetaMethod &signal)
{
- if (QLatin1String(signal) == SIGNAL(propertyChanged(QString, QVariant))) {
+ static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QConnmanProfileInterface::propertyChanged);
+ if (signal == propertyChangedSignal) {
}
}
@@ -399,16 +405,18 @@ QConnmanServiceInterface::~QConnmanServiceInterface()
{
}
-void QConnmanServiceInterface::connectNotify(const char *signal)
+void QConnmanServiceInterface::connectNotify(const QMetaMethod &signal)
{
- if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QConnmanServiceInterface::propertyChanged);
+ if (signal == propertyChangedSignal) {
dbusConnection.connect(QLatin1String(CONNMAN_SERVICE),
this->path(),
QLatin1String(CONNMAN_SERVICE_INTERFACE),
QLatin1String("PropertyChanged"),
this,SIGNAL(propertyChanged(QString,QDBusVariant)));
}
- if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
+ static const QMetaMethod propertyChangedContextSignal = QMetaMethod::fromSignal(&QConnmanServiceInterface::propertyChangedContext);
+ if (signal == propertyChangedContextSignal) {
QConnmanDBusHelper *helper;
helper = new QConnmanDBusHelper(this);
@@ -423,9 +431,10 @@ void QConnmanServiceInterface::connectNotify(const char *signal)
}
}
-void QConnmanServiceInterface::disconnectNotify(const char *signal)
+void QConnmanServiceInterface::disconnectNotify(const QMetaMethod &signal)
{
- if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+ static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QConnmanServiceInterface::propertyChanged);
+ if (signal == propertyChangedSignal) {
}
}
@@ -726,16 +735,18 @@ QConnmanTechnologyInterface::~QConnmanTechnologyInterface()
{
}
-void QConnmanTechnologyInterface::connectNotify(const char *signal)
+void QConnmanTechnologyInterface::connectNotify(const QMetaMethod &signal)
{
- if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QConnmanTechnologyInterface::propertyChanged);
+ if (signal == propertyChangedSignal) {
dbusConnection.connect(QLatin1String(CONNMAN_SERVICE),
this->path(),
QLatin1String(CONNMAN_TECHNOLOGY_INTERFACE),
QLatin1String("PropertyChanged"),
this,SIGNAL(propertyChanged(QString,QDBusVariant)));
}
- if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
+ static const QMetaMethod propertyChangedContextSignal = QMetaMethod::fromSignal(&QConnmanTechnologyInterface::propertyChangedContext);
+ if (signal == propertyChangedContextSignal) {
QConnmanDBusHelper *helper;
helper = new QConnmanDBusHelper(this);
@@ -750,9 +761,10 @@ void QConnmanTechnologyInterface::connectNotify(const char *signal)
}
}
-void QConnmanTechnologyInterface::disconnectNotify(const char *signal)
+void QConnmanTechnologyInterface::disconnectNotify(const QMetaMethod &signal)
{
- if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+ static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QConnmanTechnologyInterface::propertyChanged);
+ if (signal == propertyChangedSignal) {
}
}
@@ -806,22 +818,26 @@ QConnmanAgentInterface::~QConnmanAgentInterface()
{
}
-void QConnmanAgentInterface::connectNotify(const char *signal)
+void QConnmanAgentInterface::connectNotify(const QMetaMethod &signal)
{
- if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ Q_UNUSED(signal);
+// static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QConnmanAgentInterface::propertyChanged);
+// if (signal == propertyChangedSignal) {
// dbusConnection.connect(QLatin1String(CONNMAN_SERVICE),
// this->path(),
// QLatin1String(CONNMAN_NETWORK_INTERFACE),
// QLatin1String("PropertyChanged"),
// this,SIGNAL(propertyChanged(const QString &, QVariant &)));
- }
+// }
}
-void QConnmanAgentInterface::disconnectNotify(const char *signal)
+void QConnmanAgentInterface::disconnectNotify(const QMetaMethod &signal)
{
- if (QLatin1String(signal) == SIGNAL(propertyChanged(QString, QDBusVariant))) {
+ Q_UNUSED(signal);
+// static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QConnmanAgentInterface::propertyChanged);
+// if (signal == propertyChangedSignal) {
- }
+// }
}
diff --git a/src/plugins/bearer/connman/qconnmanservice_linux_p.h b/src/plugins/bearer/connman/qconnmanservice_linux_p.h
index 5a1778605e..3e5915c8f4 100644
--- a/src/plugins/bearer/connman/qconnmanservice_linux_p.h
+++ b/src/plugins/bearer/connman/qconnmanservice_linux_p.h
@@ -144,8 +144,8 @@ Q_SIGNALS:
void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
protected:
- void connectNotify(const char *signal);
- void disconnectNotify(const char *signal);
+ void connectNotify(const QMetaMethod &signal);
+ void disconnectNotify(const QMetaMethod &signal);
QVariant getProperty(const QString &);
};
@@ -171,8 +171,8 @@ private:
QConnmanProfileInterfacePrivate *d;
protected:
- void connectNotify(const char *signal);
- void disconnectNotify(const char *signal);
+ void connectNotify(const QMetaMethod &signal);
+ void disconnectNotify(const QMetaMethod &signal);
QVariant getProperty(const QString &);
};
@@ -233,8 +233,8 @@ Q_SIGNALS:
void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
protected:
- void connectNotify(const char *signal);
- void disconnectNotify(const char *signal);
+ void connectNotify(const QMetaMethod &signal);
+ void disconnectNotify(const QMetaMethod &signal);
QVariant getProperty(const QString &);
};
@@ -257,8 +257,8 @@ Q_SIGNALS:
void propertyChanged(const QString &, const QDBusVariant &value);
void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
protected:
- void connectNotify(const char *signal);
- void disconnectNotify(const char *signal);
+ void connectNotify(const QMetaMethod &signal);
+ void disconnectNotify(const QMetaMethod &signal);
QVariant getProperty(const QString &);
};
@@ -277,8 +277,8 @@ public:
// dict requestInput(QDBusObjectPath &path, dict fields);
void cancel();
protected:
- void connectNotify(const char *signal);
- void disconnectNotify(const char *signal);
+ void connectNotify(const QMetaMethod &signal);
+ void disconnectNotify(const QMetaMethod &signal);
};
class QConnmanCounterInterfacePrivate;
diff --git a/src/plugins/bearer/connman/qofonoservice_linux.cpp b/src/plugins/bearer/connman/qofonoservice_linux.cpp
index 5fe6ae0f88..6e01029d13 100644
--- a/src/plugins/bearer/connman/qofonoservice_linux.cpp
+++ b/src/plugins/bearer/connman/qofonoservice_linux.cpp
@@ -88,9 +88,10 @@ QDBusObjectPath QOfonoManagerInterface::currentModem()
}
-void QOfonoManagerInterface::connectNotify(const char *signal)
+void QOfonoManagerInterface::connectNotify(const QMetaMethod &signal)
{
-if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QOfonoManagerInterface::propertyChanged);
+ if (signal == propertyChangedSignal) {
if(!connection().connect(QLatin1String(OFONO_SERVICE),
QLatin1String(OFONO_MANAGER_PATH),
QLatin1String(OFONO_MANAGER_INTERFACE),
@@ -100,7 +101,8 @@ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
}
}
- if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
+ static const QMetaMethod propertyChangedContextSignal = QMetaMethod::fromSignal(&QOfonoManagerInterface::propertyChangedContext);
+ if (signal == propertyChangedContextSignal) {
QOfonoDBusHelper *helper;
helper = new QOfonoDBusHelper(this);
@@ -116,9 +118,10 @@ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
}
}
-void QOfonoManagerInterface::disconnectNotify(const char *signal)
+void QOfonoManagerInterface::disconnectNotify(const QMetaMethod &signal)
{
- if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+ static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QOfonoManagerInterface::propertyChanged);
+ if (signal == propertyChangedSignal) {
}
}
@@ -238,9 +241,10 @@ QString QOfonoModemInterface::defaultInterface()
}
-void QOfonoModemInterface::connectNotify(const char *signal)
+void QOfonoModemInterface::connectNotify(const QMetaMethod &signal)
{
- if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QOfonoModemInterface::propertyChanged);
+ if (signal == propertyChangedSignal) {
if(!connection().connect(QLatin1String(OFONO_SERVICE),
this->path(),
QLatin1String(OFONO_MODEM_INTERFACE),
@@ -250,7 +254,8 @@ void QOfonoModemInterface::connectNotify(const char *signal)
}
}
- if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
+ static const QMetaMethod propertyChangedContextSignal = QMetaMethod::fromSignal(&QOfonoModemInterface::propertyChangedContext);
+ if (signal == propertyChangedContextSignal) {
QOfonoDBusHelper *helper;
helper = new QOfonoDBusHelper(this);
@@ -265,9 +270,10 @@ void QOfonoModemInterface::connectNotify(const char *signal)
this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection);
}}
-void QOfonoModemInterface::disconnectNotify(const char *signal)
+void QOfonoModemInterface::disconnectNotify(const QMetaMethod &signal)
{
- if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+ static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QOfonoModemInterface::propertyChanged);
+ if (signal == propertyChangedSignal) {
}
}
@@ -361,9 +367,10 @@ QList <QDBusObjectPath> QOfonoNetworkRegistrationInterface::getOperators()
return qdbus_cast<QList <QDBusObjectPath> >(var);
}
-void QOfonoNetworkRegistrationInterface::connectNotify(const char *signal)
+void QOfonoNetworkRegistrationInterface::connectNotify(const QMetaMethod &signal)
{
-if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QOfonoNetworkRegistrationInterface::propertyChanged);
+ if (signal == propertyChangedSignal) {
if(!connection().connect(QLatin1String(OFONO_SERVICE),
this->path(),
QLatin1String(OFONO_NETWORK_REGISTRATION_INTERFACE),
@@ -373,7 +380,8 @@ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
}
}
- if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
+ static const QMetaMethod propertyChangedContextSignal = QMetaMethod::fromSignal(&QOfonoNetworkRegistrationInterface::propertyChangedContext);
+ if (signal == propertyChangedContextSignal) {
QOfonoDBusHelper *helper;
helper = new QOfonoDBusHelper(this);
@@ -389,9 +397,10 @@ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
}
}
-void QOfonoNetworkRegistrationInterface::disconnectNotify(const char *signal)
+void QOfonoNetworkRegistrationInterface::disconnectNotify(const QMetaMethod &signal)
{
- if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+ static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QOfonoNetworkRegistrationInterface::propertyChanged);
+ if (signal == propertyChangedSignal) {
}
}
@@ -459,39 +468,44 @@ QStringList QOfonoNetworkOperatorInterface::getTechnologies()
return qdbus_cast<QStringList>(var);
}
-void QOfonoNetworkOperatorInterface::connectNotify(const char *signal)
+void QOfonoNetworkOperatorInterface::connectNotify(const QMetaMethod &signal)
{
-if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
- if(!connection().connect(QLatin1String(OFONO_SERVICE),
- this->path(),
- QLatin1String(OFONO_NETWORK_OPERATOR_INTERFACE),
- QLatin1String("PropertyChanged"),
- this,SIGNAL(propertyChanged(const QString &, const QDBusVariant & )))) {
- qWarning() << "PropertyCHanged not connected";
- }
- }
+ Q_UNUSED(signal);
+// static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QOfonoNetworkOperatorInterface::propertyChanged);
+// if (signal == propertyChangedSignal) {
+// if(!connection().connect(QLatin1String(OFONO_SERVICE),
+// this->path(),
+// QLatin1String(OFONO_NETWORK_OPERATOR_INTERFACE),
+// QLatin1String("PropertyChanged"),
+// this,SIGNAL(propertyChanged(const QString &, const QDBusVariant & )))) {
+// qWarning() << "PropertyCHanged not connected";
+// }
+// }
- if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
- QOfonoDBusHelper *helper;
- helper = new QOfonoDBusHelper(this);
+// static const QMetaMethod propertyChangedContextSignal = QMetaMethod::fromSignal(&QOfonoNetworkOperatorInterface::propertyChangedContext);
+// if (signal == propertyChangedContextSignal) {
+// QOfonoDBusHelper *helper;
+// helper = new QOfonoDBusHelper(this);
- QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
- this->path(),
- QLatin1String(OFONO_NETWORK_OPERATOR_INTERFACE),
- QLatin1String("PropertyChanged"),
- helper,SLOT(propertyChanged(QString,QDBusVariant)));
+// QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
+// this->path(),
+// QLatin1String(OFONO_NETWORK_OPERATOR_INTERFACE),
+// QLatin1String("PropertyChanged"),
+// helper,SLOT(propertyChanged(QString,QDBusVariant)));
- QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)),
- this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection);
- }
+// QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)),
+// this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection);
+// }
}
-void QOfonoNetworkOperatorInterface::disconnectNotify(const char *signal)
+void QOfonoNetworkOperatorInterface::disconnectNotify(const QMetaMethod &signal)
{
- if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+ Q_UNUSED(signal);
+// static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QOfonoNetworkOperatorInterface::propertyChanged);
+// if (signal == propertyChangedSignal) {
- }
+// }
}
QVariant QOfonoNetworkOperatorInterface::getProperty(const QString &property)
@@ -562,39 +576,44 @@ QString QOfonoSimInterface::cardIdentifier()
return qdbus_cast<QString>(var);
}
-void QOfonoSimInterface::connectNotify(const char *signal)
+void QOfonoSimInterface::connectNotify(const QMetaMethod &signal)
{
-if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
- if(!connection().connect(QLatin1String(OFONO_SERVICE),
- this->path(),
- QLatin1String(OFONO_SIM_MANAGER_INTERFACE),
- QLatin1String("PropertyChanged"),
- this,SIGNAL(propertyChanged(const QString &, const QDBusVariant & )))) {
- qWarning() << "PropertyCHanged not connected";
- }
- }
+ Q_UNUSED(signal);
+// static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QOfonoSimInterface::propertyChanged);
+// if (signal == propertyChangedSignal) {
+// if(!connection().connect(QLatin1String(OFONO_SERVICE),
+// this->path(),
+// QLatin1String(OFONO_SIM_MANAGER_INTERFACE),
+// QLatin1String("PropertyChanged"),
+// this,SIGNAL(propertyChanged(const QString &, const QDBusVariant & )))) {
+// qWarning() << "PropertyCHanged not connected";
+// }
+// }
- if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
- QOfonoDBusHelper *helper;
- helper = new QOfonoDBusHelper(this);
+// static const QMetaMethod propertyChangedContextSignal = QMetaMethod::fromSignal(&QOfonoSimInterface::propertyChangedContext);
+// if (signal == propertyChangedContextSignal) {
+// QOfonoDBusHelper *helper;
+// helper = new QOfonoDBusHelper(this);
- QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
- this->path(),
- QLatin1String(OFONO_SIM_MANAGER_INTERFACE),
- QLatin1String("PropertyChanged"),
- helper,SLOT(propertyChanged(QString,QDBusVariant)));
+// QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
+// this->path(),
+// QLatin1String(OFONO_SIM_MANAGER_INTERFACE),
+// QLatin1String("PropertyChanged"),
+// helper,SLOT(propertyChanged(QString,QDBusVariant)));
- QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)),
- this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection);
- }
+// QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)),
+// this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection);
+// }
}
-void QOfonoSimInterface::disconnectNotify(const char *signal)
+void QOfonoSimInterface::disconnectNotify(const QMetaMethod &signal)
{
- if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+ Q_UNUSED(signal);
+// static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QOfonoSimInterface::propertyChanged);
+// if (signal == propertyChangedSignal) {
- }
+// }
}
QVariant QOfonoSimInterface::getProperty(const QString &property)
@@ -651,39 +670,44 @@ bool QOfonoDataConnectionManagerInterface::isPowered()
return qdbus_cast<bool>(var);
}
-void QOfonoDataConnectionManagerInterface::connectNotify(const char *signal)
+void QOfonoDataConnectionManagerInterface::connectNotify(const QMetaMethod &signal)
{
-if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
- if(!connection().connect(QLatin1String(OFONO_SERVICE),
- this->path(),
- QLatin1String(OFONO_DATA_CONNECTION_MANAGER_INTERFACE),
- QLatin1String("PropertyChanged"),
- this,SIGNAL(propertyChanged(const QString &, const QDBusVariant & )))) {
- qWarning() << "PropertyCHanged not connected";
- }
- }
+ Q_UNUSED(signal);
+// static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QOfonoDataConnectionManagerInterface::propertyChanged);
+// if (signal == propertyChangedSignal) {
+// if(!connection().connect(QLatin1String(OFONO_SERVICE),
+// this->path(),
+// QLatin1String(OFONO_DATA_CONNECTION_MANAGER_INTERFACE),
+// QLatin1String("PropertyChanged"),
+// this,SIGNAL(propertyChanged(const QString &, const QDBusVariant & )))) {
+// qWarning() << "PropertyCHanged not connected";
+// }
+// }
- if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
- QOfonoDBusHelper *helper;
- helper = new QOfonoDBusHelper(this);
+// static const QMetaMethod propertyChangedContextSignal = QMetaMethod::fromSignal(&QOfonoDataConnectionManagerInterface::propertyChangedContext);
+// if (signal == propertyChangedContextSignal) {
+// QOfonoDBusHelper *helper;
+// helper = new QOfonoDBusHelper(this);
- QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
- this->path(),
- QLatin1String(OFONO_DATA_CONNECTION_MANAGER_INTERFACE),
- QLatin1String("PropertyChanged"),
- helper,SLOT(propertyChanged(QString,QDBusVariant)));
+// QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
+// this->path(),
+// QLatin1String(OFONO_DATA_CONNECTION_MANAGER_INTERFACE),
+// QLatin1String("PropertyChanged"),
+// helper,SLOT(propertyChanged(QString,QDBusVariant)));
- QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)),
- this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection);
- }
+// QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)),
+// this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection);
+// }
}
-void QOfonoDataConnectionManagerInterface::disconnectNotify(const char *signal)
+void QOfonoDataConnectionManagerInterface::disconnectNotify(const QMetaMethod &signal)
{
- if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+ Q_UNUSED(signal);
+// static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QOfonoDataConnectionManagerInterface::propertyChanged);
+// if (signal == propertyChangedSignal) {
- }
+// }
}
QVariant QOfonoDataConnectionManagerInterface::getProperty(const QString &property)
@@ -762,7 +786,7 @@ bool QOfonoPrimaryDataContextInterface::setActive(bool on)
{
// this->setProperty("Active", QVariant(on));
- return setProp("Active", qVariantFromValue(on));
+ return setProp("Active", QVariant::fromValue(on));
}
bool QOfonoPrimaryDataContextInterface::setApn(const QString &name)
@@ -770,39 +794,44 @@ bool QOfonoPrimaryDataContextInterface::setApn(const QString &name)
return setProp("AccessPointName", QVariant::fromValue(name));
}
-void QOfonoPrimaryDataContextInterface::connectNotify(const char *signal)
+void QOfonoPrimaryDataContextInterface::connectNotify(const QMetaMethod &signal)
{
-if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
- if(!connection().connect(QLatin1String(OFONO_SERVICE),
- this->path(),
- QLatin1String(OFONO_DATA_CONTEXT_INTERFACE),
- QLatin1String("PropertyChanged"),
- this,SIGNAL(propertyChanged(const QString &, const QDBusVariant & )))) {
- qWarning() << "PropertyCHanged not connected";
- }
- }
+ Q_UNUSED(signal);
+// static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QOfonoPrimaryDataContextInterface::propertyChanged);
+// if (signal == propertyChangedSignal) {
+// if(!connection().connect(QLatin1String(OFONO_SERVICE),
+// this->path(),
+// QLatin1String(OFONO_DATA_CONTEXT_INTERFACE),
+// QLatin1String("PropertyChanged"),
+// this,SIGNAL(propertyChanged(const QString &, const QDBusVariant & )))) {
+// qWarning() << "PropertyCHanged not connected";
+// }
+// }
- if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
- QOfonoDBusHelper *helper;
- helper = new QOfonoDBusHelper(this);
+// static const QMetaMethod propertyChangedContextSignal = QMetaMethod::fromSignal(&QOfonoPrimaryDataContextInterface::propertyChangedContext);
+// if (signal == propertyChangedContextSignal) {
+// QOfonoDBusHelper *helper;
+// helper = new QOfonoDBusHelper(this);
- QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
- this->path(),
- QLatin1String(OFONO_DATA_CONTEXT_INTERFACE),
- QLatin1String("PropertyChanged"),
- helper,SLOT(propertyChanged(QString,QDBusVariant)));
+// QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
+// this->path(),
+// QLatin1String(OFONO_DATA_CONTEXT_INTERFACE),
+// QLatin1String("PropertyChanged"),
+// helper,SLOT(propertyChanged(QString,QDBusVariant)));
- QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)),
- this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection);
- }
+// QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)),
+// this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection);
+// }
}
-void QOfonoPrimaryDataContextInterface::disconnectNotify(const char *signal)
+void QOfonoPrimaryDataContextInterface::disconnectNotify(const QMetaMethod &signal)
{
- if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+ Q_UNUSED(signal);
+// static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QOfonoPrimaryDataContextInterface::propertyChanged);
+// if (signal == propertyChangedSignal) {
- }
+// }
}
QVariant QOfonoPrimaryDataContextInterface::getProperty(const QString &property)
@@ -826,7 +855,7 @@ QVariantMap QOfonoPrimaryDataContextInterface::getProperties()
bool QOfonoPrimaryDataContextInterface::setProp(const QString &property, const QVariant &var)
{
QList<QVariant> args;
- args << qVariantFromValue(property) << qVariantFromValue(QDBusVariant(var));
+ args << QVariant::fromValue(property) << QVariant::fromValue(QDBusVariant(var));
QDBusMessage reply = this->callWithArgumentList(QDBus::AutoDetect,
QLatin1String("SetProperty"),
@@ -852,9 +881,10 @@ QOfonoSmsInterface::~QOfonoSmsInterface()
{
}
-void QOfonoSmsInterface::connectNotify(const char *signal)
+void QOfonoSmsInterface::connectNotify(const QMetaMethod &signal)
{
- if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QOfonoSmsInterface::propertyChanged);
+ if (signal == propertyChangedSignal) {
if(!connection().connect(QLatin1String(OFONO_SERVICE),
this->path(),
QLatin1String(OFONO_SMS_MANAGER_INTERFACE),
@@ -864,7 +894,8 @@ void QOfonoSmsInterface::connectNotify(const char *signal)
}
}
- if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
+ static const QMetaMethod propertyChangedContextSignal = QMetaMethod::fromSignal(&QOfonoSmsInterface::propertyChangedContext);
+ if (signal == propertyChangedContextSignal) {
QOfonoDBusHelper *helper;
helper = new QOfonoDBusHelper(this);
@@ -879,7 +910,8 @@ void QOfonoSmsInterface::connectNotify(const char *signal)
this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)));
}
- if (QLatin1String(signal) == SIGNAL(immediateMessage(QString,QVariantMap))) {
+ static const QMetaMethod immediateMessageSignal = QMetaMethod::fromSignal(&QOfonoSmsInterface::immediateMessage);
+ if (signal == immediateMessageSignal) {
if(!connection().connect(QLatin1String(OFONO_SERVICE),
this->path(),
QLatin1String(OFONO_SMS_MANAGER_INTERFACE),
@@ -889,7 +921,8 @@ void QOfonoSmsInterface::connectNotify(const char *signal)
}
}
- if (QLatin1String(signal) == SIGNAL(incomingMessage(QString,QVariantMap))) {
+ static const QMetaMethod incomingMessageSignal = QMetaMethod::fromSignal(&QOfonoSmsInterface::incomingMessage);
+ if (signal == incomingMessageSignal) {
if(!connection().connect(QLatin1String(OFONO_SERVICE),
this->path(),
QLatin1String(OFONO_SMS_MANAGER_INTERFACE),
@@ -900,9 +933,10 @@ void QOfonoSmsInterface::connectNotify(const char *signal)
}
}
-void QOfonoSmsInterface::disconnectNotify(const char *signal)
+void QOfonoSmsInterface::disconnectNotify(const QMetaMethod &signal)
{
- if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+ static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QOfonoSmsInterface::propertyChanged);
+ if (signal == propertyChangedSignal) {
}
}
diff --git a/src/plugins/bearer/connman/qofonoservice_linux_p.h b/src/plugins/bearer/connman/qofonoservice_linux_p.h
index c92804dd3a..141f709d3d 100644
--- a/src/plugins/bearer/connman/qofonoservice_linux_p.h
+++ b/src/plugins/bearer/connman/qofonoservice_linux_p.h
@@ -111,8 +111,8 @@ Q_SIGNALS:
void propertyChanged(const QString &, const QDBusVariant &value);
void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
protected:
- void connectNotify(const char *signal);
- void disconnectNotify(const char *signal);
+ void connectNotify(const QMetaMethod &signal);
+ void disconnectNotify(const QMetaMethod &signal);
QVariant getProperty(const QString &);
};
@@ -155,8 +155,8 @@ public:
QString defaultInterface();
protected:
- void connectNotify(const char *signal);
- void disconnectNotify(const char *signal);
+ void connectNotify(const QMetaMethod &signal);
+ void disconnectNotify(const QMetaMethod &signal);
QVariant getProperty(const QString &);
Q_SIGNALS:
void propertyChanged(const QString &, const QDBusVariant &value);
@@ -186,8 +186,8 @@ public:
QList <QDBusObjectPath> getOperators();
protected:
- void connectNotify(const char *signal);
- void disconnectNotify(const char *signal);
+ void connectNotify(const QMetaMethod &signal);
+ void disconnectNotify(const QMetaMethod &signal);
QVariant getProperty(const QString &);
Q_SIGNALS:
void propertyChanged(const QString &, const QDBusVariant &value);
@@ -214,8 +214,8 @@ public:
QStringList getTechnologies();
protected:
- void connectNotify(const char *signal);
- void disconnectNotify(const char *signal);
+ void connectNotify(const QMetaMethod &signal);
+ void disconnectNotify(const QMetaMethod &signal);
QVariant getProperty(const QString &);
};
@@ -241,8 +241,8 @@ public:
QString cardIdentifier();
protected:
- void connectNotify(const char *signal);
- void disconnectNotify(const char *signal);
+ void connectNotify(const QMetaMethod &signal);
+ void disconnectNotify(const QMetaMethod &signal);
QVariant getProperty(const QString &);
};
@@ -267,8 +267,8 @@ public:
bool setPower(bool on);
protected:
- void connectNotify(const char *signal);
- void disconnectNotify(const char *signal);
+ void connectNotify(const QMetaMethod &signal);
+ void disconnectNotify(const QMetaMethod &signal);
QVariant getProperty(const QString &);
};
@@ -297,8 +297,8 @@ public:
bool setApn(const QString &name);
protected:
- void connectNotify(const char *signal);
- void disconnectNotify(const char *signal);
+ void connectNotify(const QMetaMethod &signal);
+ void disconnectNotify(const QMetaMethod &signal);
QVariant getProperty(const QString &);
bool setProp(const QString &, const QVariant &var);
};
@@ -321,8 +321,8 @@ public:
QString bearer();
protected:
- void connectNotify(const char *signal);
- void disconnectNotify(const char *signal);
+ void connectNotify(const QMetaMethod &signal);
+ void disconnectNotify(const QMetaMethod &signal);
QVariant getProperty(const QString &);
Q_SIGNALS:
diff --git a/src/plugins/generic/evdevmouse/qevdevmousehandler.cpp b/src/plugins/generic/evdevmouse/qevdevmousehandler.cpp
index 5e2911a806..6edd470874 100644
--- a/src/plugins/generic/evdevmouse/qevdevmousehandler.cpp
+++ b/src/plugins/generic/evdevmouse/qevdevmousehandler.cpp
@@ -44,6 +44,8 @@
#include <QSocketNotifier>
#include <QStringList>
#include <QPoint>
+#include <QGuiApplication>
+#include <QScreen>
#include <QWindowSystemInterface>
#include <qplatformdefs.h>
@@ -70,6 +72,7 @@ QEvdevMouseHandler *QEvdevMouseHandler::createLinuxInputMouseHandler(const QStri
QString device = "/dev/input/event0";
bool compression = true;
+ bool clamp = true;
bool smooth = false;
int jitterLimit = 0;
int xoffset = 0;
@@ -79,6 +82,8 @@ QEvdevMouseHandler *QEvdevMouseHandler::createLinuxInputMouseHandler(const QStri
foreach (const QString &arg, args) {
if (arg == "nocompress")
compression = false;
+ else if (arg == "noclamp")
+ clamp = false;
else if (arg.startsWith("dejitter="))
jitterLimit = arg.mid(9).toInt();
else if (arg.startsWith("xoffset="))
@@ -96,16 +101,16 @@ QEvdevMouseHandler *QEvdevMouseHandler::createLinuxInputMouseHandler(const QStri
int fd;
fd = qt_safe_open(device.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0);
if (fd >= 0) {
- return new QEvdevMouseHandler(fd, compression, smooth, jitterLimit, xoffset, yoffset);
+ return new QEvdevMouseHandler(fd, compression, clamp, smooth, jitterLimit, xoffset, yoffset);
} else {
qWarning("Cannot open mouse input device '%s': %s", qPrintable(device), strerror(errno));
return 0;
}
}
-QEvdevMouseHandler::QEvdevMouseHandler(int deviceDescriptor, bool compression, bool smooth, int jitterLimit, int xoffset, int yoffset)
+QEvdevMouseHandler::QEvdevMouseHandler(int deviceDescriptor, bool compression, bool clamp, bool smooth, int jitterLimit, int xoffset, int yoffset)
: m_notify(0), m_x(0), m_y(0), m_prevx(0), m_prevy(0),
- m_fd(deviceDescriptor), m_compression(compression), m_smooth(smooth),
+ m_fd(deviceDescriptor), m_compression(compression), m_clamp(clamp), m_smooth(smooth),
m_xoffset(xoffset), m_yoffset(yoffset), m_buttons(0)
{
setObjectName(QLatin1String("Evdev Mouse Handler"));
@@ -126,6 +131,19 @@ QEvdevMouseHandler::~QEvdevMouseHandler()
void QEvdevMouseHandler::sendMouseEvent()
{
+ if (m_clamp) {
+ QRect g = QGuiApplication::primaryScreen()->virtualGeometry();
+ if (m_x + m_xoffset < g.left())
+ m_x = g.left() - m_xoffset;
+ else if (m_x + m_xoffset > g.right())
+ m_x = g.right() - m_xoffset;
+
+ if (m_y + m_yoffset < g.top())
+ m_y = g.top() - m_yoffset;
+ else if (m_y + m_yoffset > g.bottom())
+ m_y = g.bottom() - m_yoffset;
+ }
+
QPoint pos(m_x + m_xoffset, m_y + m_yoffset);
#ifdef QT_QPA_MOUSE_HANDLER_DEBUG
diff --git a/src/plugins/generic/evdevmouse/qevdevmousehandler.h b/src/plugins/generic/evdevmouse/qevdevmousehandler.h
index 7a74eaa701..fc65c6a414 100644
--- a/src/plugins/generic/evdevmouse/qevdevmousehandler.h
+++ b/src/plugins/generic/evdevmouse/qevdevmousehandler.h
@@ -62,7 +62,7 @@ private slots:
void readMouseData();
private:
- QEvdevMouseHandler(int deviceDescriptor, bool compression, bool smooth, int jitterLimit, int xoffset, int yoffset);
+ QEvdevMouseHandler(int deviceDescriptor, bool compression, bool clamp, bool smooth, int jitterLimit, int xoffset, int yoffset);
void sendMouseEvent();
@@ -71,6 +71,7 @@ private:
int m_prevx, m_prevy;
int m_fd;
bool m_compression;
+ bool m_clamp;
bool m_smooth;
int m_xoffset, m_yoffset;
Qt::MouseButtons m_buttons;
diff --git a/src/plugins/generic/evdevtouch/qevdevtouch.cpp b/src/plugins/generic/evdevtouch/qevdevtouch.cpp
index 1c3e8952e9..327f64412a 100644
--- a/src/plugins/generic/evdevtouch/qevdevtouch.cpp
+++ b/src/plugins/generic/evdevtouch/qevdevtouch.cpp
@@ -114,7 +114,8 @@ QTouchScreenData::QTouchScreenData(QTouchScreenHandler *q_ptr, const QStringList
m_currentSlot(0),
hw_range_x_min(0), hw_range_x_max(0),
hw_range_y_min(0), hw_range_y_max(0),
- hw_pressure_min(0), hw_pressure_max(0)
+ hw_pressure_min(0), hw_pressure_max(0),
+ m_device(0), m_typeB(false)
{
m_forceToActiveWindow = args.contains(QLatin1String("force_window"));
}
diff --git a/src/plugins/platforms/cocoa/qcocoabackingstore.h b/src/plugins/platforms/cocoa/qcocoabackingstore.h
index 489938c4b3..72bb5936c0 100644
--- a/src/plugins/platforms/cocoa/qcocoabackingstore.h
+++ b/src/plugins/platforms/cocoa/qcocoabackingstore.h
@@ -63,7 +63,6 @@ public:
bool scroll(const QRegion &area, int dx, int dy);
private:
- QCocoaWindow *m_cocoaWindow;
QImage *m_image;
};
diff --git a/src/plugins/platforms/cocoa/qcocoabackingstore.mm b/src/plugins/platforms/cocoa/qcocoabackingstore.mm
index f0ff7ba0d6..660c2b651f 100644
--- a/src/plugins/platforms/cocoa/qcocoabackingstore.mm
+++ b/src/plugins/platforms/cocoa/qcocoabackingstore.mm
@@ -50,7 +50,6 @@ QT_BEGIN_NAMESPACE
QCocoaBackingStore::QCocoaBackingStore(QWindow *window)
: QPlatformBackingStore(window)
{
- m_cocoaWindow = static_cast<QCocoaWindow *>(window->handle());
m_image = new QImage(window->geometry().size(),QImage::Format_ARGB32_Premultiplied);
}
@@ -72,14 +71,19 @@ void QCocoaBackingStore::flush(QWindow *widget, const QRegion &region, const QPo
QRect geo = region.boundingRect();
NSRect rect = NSMakeRect(geo.x(), geo.y(), geo.width(), geo.height());
- [m_cocoaWindow->m_contentView displayRect:rect];
+ QCocoaWindow *cocoaWindow = static_cast<QCocoaWindow *>(window()->handle());
+ if (cocoaWindow)
+ [cocoaWindow->m_contentView displayRect:rect];
}
void QCocoaBackingStore::resize(const QSize &size, const QRegion &)
{
delete m_image;
m_image = new QImage(size, QImage::Format_ARGB32_Premultiplied);
- [static_cast<QNSView *>(m_cocoaWindow->m_contentView) setImage:m_image];
+
+ QCocoaWindow *cocoaWindow = static_cast<QCocoaWindow *>(window()->handle());
+ if (cocoaWindow)
+ [static_cast<QNSView *>(cocoaWindow->m_contentView) setImage:m_image];
}
bool QCocoaBackingStore::scroll(const QRegion &area, int dx, int dy)
diff --git a/src/plugins/platforms/cocoa/qcocoacolordialoghelper.h b/src/plugins/platforms/cocoa/qcocoacolordialoghelper.h
index 505fd4f111..4b901f3ef3 100644
--- a/src/plugins/platforms/cocoa/qcocoacolordialoghelper.h
+++ b/src/plugins/platforms/cocoa/qcocoacolordialoghelper.h
@@ -56,7 +56,7 @@ public:
void platformNativeDialogModalHelp();
void _q_platformRunNativeAppModalPanel();
void deleteNativeDialog_sys();
- bool show_sys(QFlags<QPlatformDialogHelper::ShowFlag>, Qt::WindowFlags, QWindow*);
+ bool show_sys(Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, QWindow *parent);
void hide_sys();
DialogCode dialogResultCode_sys();
@@ -64,7 +64,7 @@ public:
QColor currentColor_sys() const;
public:
- bool showCocoaColorPanel(QWindow *parent);
+ bool showCocoaColorPanel(Qt::WindowModality windowModality, QWindow *parent);
bool hideCocoaColorPanel();
void createNSColorPanelDelegate();
diff --git a/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm b/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm
index 405cacee01..9f4446b32e 100644
--- a/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm
+++ b/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm
@@ -381,9 +381,13 @@ void QCocoaColorDialogHelper::deleteNativeDialog_sys()
mDelegate = 0;
}
-bool QCocoaColorDialogHelper::show_sys(QFlags<QPlatformDialogHelper::ShowFlag>, Qt::WindowFlags, QWindow *parent)
+bool QCocoaColorDialogHelper::show_sys(Qt::WindowFlags, Qt::WindowModality windowModality, QWindow *parent)
{
- return showCocoaColorPanel(parent);
+ if (windowModality == Qt::WindowModal) {
+ // Cocoa's shared color panel cannot be shown as a sheet
+ return false;
+ }
+ return showCocoaColorPanel(windowModality, parent);
}
void QCocoaColorDialogHelper::hide_sys()
@@ -447,13 +451,15 @@ void QCocoaColorDialogHelper::createNSColorPanelDelegate()
mDelegate = delegate;
}
-bool QCocoaColorDialogHelper::showCocoaColorPanel(QWindow *parent)
+bool QCocoaColorDialogHelper::showCocoaColorPanel(Qt::WindowModality windowModality, QWindow *parent)
{
Q_UNUSED(parent);
createNSColorPanelDelegate();
QT_MANGLE_NAMESPACE(QNSColorPanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSColorPanelDelegate) *>(mDelegate);
[delegate->mColorPanel setShowsAlpha:options()->testOption(QColorDialogOptions::ShowAlphaChannel)];
- [delegate showModelessPanel];
+ if (windowModality == Qt::NonModal)
+ [delegate showModelessPanel];
+ // no need to show a Qt::ApplicationModal dialog here, since it will be done in _q_platformRunNativeAppModalPanel()
return true;
}
diff --git a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.h b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.h
index 7fa1f0971f..4be30c44ed 100644
--- a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.h
+++ b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.h
@@ -116,7 +116,6 @@ public:
explicit QCocoaEventDispatcher(QObject *parent = 0);
~QCocoaEventDispatcher();
-
bool processEvents(QEventLoop::ProcessEventsFlags flags);
bool hasPendingEvents();
@@ -156,9 +155,11 @@ public:
// timer handling
QTimerInfoList timerInfoList;
CFRunLoopTimerRef runLoopTimerRef;
+ CFRunLoopSourceRef activateTimersSourceRef;
void maybeStartCFRunLoopTimer();
void maybeStopCFRunLoopTimer();
- static void activateTimer(CFRunLoopTimerRef, void *info);
+ static void runLoopTimerCallback(CFRunLoopTimerRef, void *info);
+ static void activateTimersSourceCallback(void *info);
// Set 'blockSendPostedEvents' to true if you _really_ need
// to make sure that qt events are not posted while calling
@@ -176,9 +177,10 @@ public:
void temporarilyStopAllModalSessions();
void beginModalSession(QWindow *widget);
void endModalSession(QWindow *widget);
+ void cleanupModalSessions();
+
void cancelWaitForMoreEvents();
void maybeCancelWaitForMoreEvents();
- void cleanupModalSessions();
void ensureNSAppInitialized();
MacSocketHash macSockets;
@@ -190,8 +192,7 @@ public:
int lastSerial;
bool interrupt;
- static Boolean postedEventSourceEqualCallback(const void *info1, const void *info2);
- static void postedEventsSourcePerformCallback(void *info);
+ static void postedEventsSourceCallback(void *info);
static void waitingObserverCallback(CFRunLoopObserverRef observer,
CFRunLoopActivity activity, void *info);
static void firstLoopEntry(CFRunLoopObserverRef ref, CFRunLoopActivity activity, void *info);
diff --git a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm
index 02722ce5bf..a3bd4a95ca 100644
--- a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm
+++ b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm
@@ -82,6 +82,7 @@
#include "qmutex.h"
#include "qsocketnotifier.h"
#include <qplatformwindow_qpa.h>
+#include <qplatformnativeinterface_qpa.h>
#include "private/qthread_p.h"
#include "private/qguiapplication_p.h"
#include <qdebug.h>
@@ -104,12 +105,28 @@ static inline CFRunLoopRef mainRunLoop()
return CFRunLoopGetMain();
}
+static Boolean runLoopSourceEqualCallback(const void *info1, const void *info2)
+{
+ return info1 == info2;
+}
+
/*****************************************************************************
Timers stuff
*****************************************************************************/
/* timer call back */
-void QCocoaEventDispatcherPrivate::activateTimer(CFRunLoopTimerRef, void *info)
+void QCocoaEventDispatcherPrivate::runLoopTimerCallback(CFRunLoopTimerRef, void *info)
+{
+ QCocoaEventDispatcherPrivate *d = static_cast<QCocoaEventDispatcherPrivate *>(info);
+ if ((d->processEventsFlags & QEventLoop::EventLoopExec) == 0) {
+ // processEvents() was called "manually," ignore this source for now
+ d->maybeCancelWaitForMoreEvents();
+ return;
+ }
+ CFRunLoopSourceSignal(d->activateTimersSourceRef);
+}
+
+void QCocoaEventDispatcherPrivate::activateTimersSourceCallback(void *info)
{
QCocoaEventDispatcherPrivate *d = static_cast<QCocoaEventDispatcherPrivate *>(info);
(void) d->timerInfoList.activateTimers();
@@ -145,7 +162,7 @@ void QCocoaEventDispatcherPrivate::maybeStartCFRunLoopTimer()
CFRunLoopTimerContext info = { 0, this, 0, 0, 0 };
// create the timer with a large interval, as recommended by the CFRunLoopTimerSetNextFireDate()
// documentation, since we will adjust the timer's time-to-fire as needed to keep Qt timers working
- runLoopTimerRef = CFRunLoopTimerCreate(0, ttf, oneyear, 0, 0, QCocoaEventDispatcherPrivate::activateTimer, &info);
+ runLoopTimerRef = CFRunLoopTimerCreate(0, ttf, oneyear, 0, 0, QCocoaEventDispatcherPrivate::runLoopTimerCallback, &info);
Q_ASSERT(runLoopTimerRef != 0);
CFRunLoopAddTimer(mainRunLoop(), runLoopTimerRef, kCFRunLoopCommonModes);
@@ -513,10 +530,10 @@ bool QCocoaEventDispatcher::processEvents(QEventLoop::ProcessEventsFlags flags)
emit awake();
- bool excludeUserEvents = flags & QEventLoop::ExcludeUserInputEvents;
- bool retVal = false;
uint oldflags = d->processEventsFlags;
d->processEventsFlags = flags;
+ bool excludeUserEvents = d->processEventsFlags & QEventLoop::ExcludeUserInputEvents;
+ bool retVal = false;
forever {
if (d->interrupt)
break;
@@ -544,8 +561,9 @@ bool QCocoaEventDispatcher::processEvents(QEventLoop::ProcessEventsFlags flags)
// Finally, if we are to exclude user input events, we cannot call [NSApp run]
// as we then loose control over which events gets dispatched:
const bool canExec_3rdParty = d->nsAppRunCalledByQt || ![NSApp isRunning];
- const bool canExec_Qt = !excludeUserEvents &&
- (flags & QEventLoop::DialogExec || flags & QEventLoop::EventLoopExec) ;
+ const bool canExec_Qt = (!excludeUserEvents
+ && ((d->processEventsFlags & QEventLoop::DialogExec)
+ || (d->processEventsFlags & QEventLoop::EventLoopExec)));
if (canExec_Qt && canExec_3rdParty) {
// We can use exec-mode, meaning that we can stay in a tight loop until
@@ -632,9 +650,11 @@ bool QCocoaEventDispatcher::processEvents(QEventLoop::ProcessEventsFlags flags)
}
} while (!d->interrupt && event != nil);
- if ((flags & QEventLoop::WaitForMoreEvents) == 0) {
- // when called "manually", always send posted events
+ if ((d->processEventsFlags & QEventLoop::EventLoopExec) == 0) {
+ // when called "manually", always send posted events and timers
d->processPostedEvents();
+ retVal = d->timerInfoList.activateTimers() > 0 || retVal;
+ d->maybeStartCFRunLoopTimer();
}
// be sure to return true if the posted event source fired
@@ -651,12 +671,12 @@ bool QCocoaEventDispatcher::processEvents(QEventLoop::ProcessEventsFlags flags)
bool canWait = (d->threadData->canWait
&& !retVal
&& !d->interrupt
- && (flags & QEventLoop::WaitForMoreEvents));
+ && (d->processEventsFlags & QEventLoop::WaitForMoreEvents));
if (canWait) {
// INVARIANT: We haven't processed any events yet. And we're told
// to stay inside this function until at least one event is processed.
qt_mac_waitForMoreEvents();
- flags &= ~QEventLoop::WaitForMoreEvents;
+ d->processEventsFlags &= ~QEventLoop::WaitForMoreEvents;
} else {
// Done with event processing for now.
// Leave the function:
@@ -762,26 +782,18 @@ NSModalSession QCocoaEventDispatcherPrivate::currentModalSession()
QCocoaModalSessionInfo &info = cocoaModalSessionStack[i];
if (!info.window)
continue;
-// ### port
-// if (info.window->testAttribute(Qt::WA_DontShowOnScreen))
-// continue;
if (!info.session) {
QCocoaAutoReleasePool pool;
- NSWindow *window = reinterpret_cast<NSWindow *>(info.window->handle()->winId());
- if (!window)
+ NSWindow *nswindow = static_cast<NSWindow *>(QGuiApplication::platformNativeInterface()->nativeResourceForWindow("nswindow", info.window));
+ if (!nswindow)
continue;
ensureNSAppInitialized();
QBoolBlocker block1(blockSendPostedEvents, true);
- info.nswindow = window;
+ info.nswindow = nswindow;
[(NSWindow*) info.nswindow retain];
- int levelBeforeEnterModal = [window level];
- info.session = [NSApp beginModalSessionForWindow:window];
- // Make sure we don't stack the window lower that it was before
- // entering modal, in case it e.g. had the stays-on-top flag set:
- if (levelBeforeEnterModal > [window level])
- [window setLevel:levelBeforeEnterModal];
+ info.session = [NSApp beginModalSessionForWindow:nswindow];
}
currentModalSessionCached = info.session;
cleanupModalSessionsNeeded = false;
@@ -850,12 +862,14 @@ void QCocoaEventDispatcherPrivate::cleanupModalSessions()
currentModalSessionCached = info.session;
break;
}
- cocoaModalSessionStack.remove(i);
currentModalSessionCached = 0;
if (info.session) {
+ Q_ASSERT(info.nswindow != 0);
[NSApp endModalSession:info.session];
[(NSWindow *)info.nswindow release];
}
+ // remove the info now that we are finished with it
+ cocoaModalSessionStack.remove(i);
}
updateChildrenWorksWhenModal();
@@ -864,6 +878,14 @@ void QCocoaEventDispatcherPrivate::cleanupModalSessions()
void QCocoaEventDispatcherPrivate::beginModalSession(QWindow *window)
{
+ // We need to start spinning the modal session. Usually this is done with
+ // QDialog::exec() for QtWidgets based applications, but for others that
+ // just call show(), we need to interrupt(). We call this here, before
+ // setting currentModalSessionCached to zero, so that interrupt() calls
+ // [NSApp abortModal] if another modal session is currently running
+ Q_Q(QCocoaEventDispatcher);
+ q->interrupt();
+
// Add a new, empty (null), NSModalSession to the stack.
// It will become active the next time QEventDispatcher::processEvents is called.
// A QCocoaModalSessionInfo is considered pending to become active if the window pointer
@@ -879,6 +901,8 @@ void QCocoaEventDispatcherPrivate::beginModalSession(QWindow *window)
void QCocoaEventDispatcherPrivate::endModalSession(QWindow *window)
{
+ Q_Q(QCocoaEventDispatcher);
+
// Mark all sessions attached to window as pending to be stopped. We do this
// by setting the window pointer to zero, but leave the session pointer.
// We don't tell cocoa to stop any sessions just yet, because cocoa only understands
@@ -890,11 +914,14 @@ void QCocoaEventDispatcherPrivate::endModalSession(QWindow *window)
if (info.window == window) {
info.window = 0;
if (i == stackSize-1) {
- // The top sessions ended. Interrupt the event dispatcher
- // to start spinning the correct session immidiatly:
+ // The top sessions ended. Interrupt the event dispatcher to
+ // start spinning the correct session immediately. Like in
+ // beginModalSession(), we call interrupt() before clearing
+ // currentModalSessionCached to make sure we stop any currently
+ // running modal session with [NSApp abortModal]
+ q->interrupt();
currentModalSessionCached = 0;
cleanupModalSessionsNeeded = true;
- QCocoaEventDispatcher::instance()->interrupt();
}
}
}
@@ -917,15 +944,28 @@ QCocoaEventDispatcher::QCocoaEventDispatcher(QObject *parent)
: QAbstractEventDispatcher(*new QCocoaEventDispatcherPrivate, parent)
{
Q_D(QCocoaEventDispatcher);
+
+ // keep our sources running when modal loops are running
+ CFRunLoopAddCommonMode(mainRunLoop(), (CFStringRef) NSModalPanelRunLoopMode);
+
CFRunLoopSourceContext context;
bzero(&context, sizeof(CFRunLoopSourceContext));
context.info = d;
- context.equal = QCocoaEventDispatcherPrivate::postedEventSourceEqualCallback;
- context.perform = QCocoaEventDispatcherPrivate::postedEventsSourcePerformCallback;
- d->postedEventsSource = CFRunLoopSourceCreate(0, 0, &context);
+ context.equal = runLoopSourceEqualCallback;
+
+ // source used to activate timers
+ context.perform = QCocoaEventDispatcherPrivate::activateTimersSourceCallback;
+ d->activateTimersSourceRef = CFRunLoopSourceCreate(kCFAllocatorDefault, 0, &context);
+ Q_ASSERT(d->activateTimersSourceRef);
+ CFRunLoopAddSource(mainRunLoop(), d->activateTimersSourceRef, kCFRunLoopCommonModes);
+
+ // source used to send posted events
+ context.perform = QCocoaEventDispatcherPrivate::postedEventsSourceCallback;
+ d->postedEventsSource = CFRunLoopSourceCreate(kCFAllocatorDefault, 0, &context);
Q_ASSERT(d->postedEventsSource);
CFRunLoopAddSource(mainRunLoop(), d->postedEventsSource, kCFRunLoopCommonModes);
+ // observer to emit aboutToBlock() and awake()
CFRunLoopObserverContext observerContext;
bzero(&observerContext, sizeof(CFRunLoopObserverContext));
observerContext.info = this;
@@ -961,11 +1001,6 @@ void QCocoaEventDispatcherPrivate::waitingObserverCallback(CFRunLoopObserverRef,
emit static_cast<QCocoaEventDispatcher*>(info)->awake();
}
-Boolean QCocoaEventDispatcherPrivate::postedEventSourceEqualCallback(const void *info1, const void *info2)
-{
- return info1 == info2;
-}
-
void QCocoaEventDispatcherPrivate::processPostedEvents()
{
if (blockSendPostedEvents) {
@@ -1030,9 +1065,14 @@ void QCocoaEventDispatcherPrivate::firstLoopEntry(CFRunLoopObserverRef ref,
static_cast<QCocoaEventDispatcherPrivate *>(info)->processPostedEvents();
}
-void QCocoaEventDispatcherPrivate::postedEventsSourcePerformCallback(void *info)
+void QCocoaEventDispatcherPrivate::postedEventsSourceCallback(void *info)
{
QCocoaEventDispatcherPrivate *d = static_cast<QCocoaEventDispatcherPrivate *>(info);
+ if ((d->processEventsFlags & QEventLoop::EventLoopExec) == 0) {
+ // processEvents() was called "manually," ignore this source for now
+ d->maybeCancelWaitForMoreEvents();
+ return;
+ }
d->processPostedEvents();
d->maybeCancelWaitForMoreEvents();
}
@@ -1061,16 +1101,23 @@ void QCocoaEventDispatcher::interrupt()
{
Q_D(QCocoaEventDispatcher);
d->interrupt = true;
- wakeUp();
-
- // We do nothing more here than setting d->interrupt = true, and
- // poke the event loop if it is sleeping. Actually stopping
- // NSApp, or the current modal session, is done inside the send
- // posted events callback. We do this to ensure that all current pending
- // cocoa events gets delivered before we stop. Otherwise, if we now stop
- // the last event loop recursion, cocoa will just drop pending posted
- // events on the floor before we get a chance to reestablish a new session.
- d->cancelWaitForMoreEvents();
+ if (d->currentModalSessionCached) {
+ // If a modal session is active, abort it so that we can clean it up
+ // later. We can't use [NSApp stopModal] here, because we do not know
+ // where the interrupt() came from.
+ [NSApp abortModal];
+ } else {
+ wakeUp();
+
+ // We do nothing more here than setting d->interrupt = true, and
+ // poke the event loop if it is sleeping. Actually stopping
+ // NSApp, or the current modal session, is done inside the send
+ // posted events callback. We do this to ensure that all current pending
+ // cocoa events gets delivered before we stop. Otherwise, if we now stop
+ // the last event loop recursion, cocoa will just drop pending posted
+ // events on the floor before we get a chance to reestablish a new session.
+ d->cancelWaitForMoreEvents();
+ }
}
void QCocoaEventDispatcher::flush()
@@ -1082,6 +1129,23 @@ QCocoaEventDispatcher::~QCocoaEventDispatcher()
qDeleteAll(d->timerInfoList);
d->maybeStopCFRunLoopTimer();
+ CFRunLoopRemoveSource(mainRunLoop(), d->activateTimersSourceRef, kCFRunLoopCommonModes);
+ CFRelease(d->activateTimersSourceRef);
+
+ // end all modal sessions
+ for (int i = 0; i < d->cocoaModalSessionStack.count(); ++i) {
+ QCocoaModalSessionInfo &info = d->cocoaModalSessionStack[i];
+ if (info.session) {
+ [NSApp endModalSession:info.session];
+ [(NSWindow *)info.nswindow release];
+ }
+ }
+
+ // release all queued user input events
+ for (int i = 0; i < d->queuedUserInputEvents.count(); ++i) {
+ NSEvent *nsevent = static_cast<NSEvent *>(d->queuedUserInputEvents.at(i));
+ [nsevent release];
+ }
// Remove CFSockets from the runloop.
for (MacSocketHash::ConstIterator it = d->macSockets.constBegin(); it != d->macSockets.constEnd(); ++it) {
diff --git a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.h b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.h
index 7d4da019c2..9768d3e6f9 100644
--- a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.h
+++ b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.h
@@ -62,7 +62,7 @@ public:
bool defaultNameFilterDisables() const;
void deleteNativeDialog_sys();
- bool show_sys(ShowFlags flags, Qt::WindowFlags windowFlags, QWindow *parent);
+ bool show_sys(Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, QWindow *parent);
void hide_sys();
QPlatformFileDialogHelper::DialogCode dialogResultCode_sys();
void setDirectory_sys(const QString &directory);
@@ -74,7 +74,7 @@ public:
QString selectedNameFilter_sys() const;
public:
- bool showCocoaFilePanel(QWindow *parent);
+ bool showCocoaFilePanel(Qt::WindowModality windowModality, QWindow *parent);
bool hideCocoaFilePanel();
void createNSOpenSavePanelDelegate();
diff --git a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm
index c333e3ac1f..9bc7df02fb 100644
--- a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm
+++ b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm
@@ -244,18 +244,18 @@ typedef QSharedPointer<QFileDialogOptions> SharedPointerFileDialogOptions;
return (mReturnCode == NSOKButton) ? QT_PREPEND_NAMESPACE(QPlatformDialogHelper::Accepted) : QT_PREPEND_NAMESPACE(QPlatformDialogHelper::Rejected);
}
-- (void)showWindowModalSheet:(QWindow *)docWidget
+- (void)showWindowModalSheet:(QWindow *)parent
{
- Q_UNUSED(docWidget);
QFileInfo info(*mCurrentSelection);
NSString *filename = QT_PREPEND_NAMESPACE(QCFString::toNSString)(info.fileName());
NSString *filepath = QT_PREPEND_NAMESPACE(QCFString::toNSString)(info.filePath());
bool selectable = (mOptions->acceptMode() == QFileDialogOptions::AcceptSave)
|| [self panel:nil shouldShowFilename:filepath];
+ NSWindow *nsparent = static_cast<NSWindow *>(qGuiApp->platformNativeInterface()->nativeResourceForWindow("nswindow", parent));
[mSavePanel
beginSheetForDirectory:mCurrentDir
file:selectable ? filename : nil
- modalForWindow:nil
+ modalForWindow:nsparent
modalDelegate:self
didEndSelector:@selector(openPanelDidEnd:returnCode:contextInfo:)
contextInfo:nil];
@@ -613,7 +613,7 @@ void QCocoaFileDialogHelper::hide_sys()
hideCocoaFilePanel();
}
-bool QCocoaFileDialogHelper::show_sys(ShowFlags /* flags */, Qt::WindowFlags windowFlags, QWindow *parent)
+bool QCocoaFileDialogHelper::show_sys(Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, QWindow *parent)
{
// Q_Q(QFileDialog);
if (windowFlags & Qt::WindowStaysOnTopHint) {
@@ -624,7 +624,7 @@ bool QCocoaFileDialogHelper::show_sys(ShowFlags /* flags */, Qt::WindowFlags win
return false;
}
- return showCocoaFilePanel(parent);
+ return showCocoaFilePanel(windowModality, parent);
}
void QCocoaFileDialogHelper::createNSOpenSavePanelDelegate()
@@ -645,15 +645,15 @@ void QCocoaFileDialogHelper::createNSOpenSavePanelDelegate()
mDelegate = delegate;
}
-bool QCocoaFileDialogHelper::showCocoaFilePanel(QWindow *parent)
+bool QCocoaFileDialogHelper::showCocoaFilePanel(Qt::WindowModality windowModality, QWindow *parent)
{
-// Q_Q(QFileDialog);
createNSOpenSavePanelDelegate();
QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate);
- if (0 /*qt_mac_is_macsheet(qtFileDialog)*/) // ### sheet support.
- [delegate showWindowModalSheet:parent];
- else
+ if (windowModality == Qt::NonModal)
[delegate showModelessPanel];
+ else if (windowModality == Qt::WindowModal && parent)
+ [delegate showWindowModalSheet:parent];
+ // no need to show a Qt::ApplicationModal dialog here, since it will be done in _q_platformRunNativeAppModalPanel()
return true;
}
diff --git a/src/plugins/platforms/cocoa/qcocoafontdialoghelper.h b/src/plugins/platforms/cocoa/qcocoafontdialoghelper.h
index 8a914bf632..f9dd4357a5 100644
--- a/src/plugins/platforms/cocoa/qcocoafontdialoghelper.h
+++ b/src/plugins/platforms/cocoa/qcocoafontdialoghelper.h
@@ -60,7 +60,7 @@ public:
void _q_platformRunNativeAppModalPanel();
void deleteNativeDialog_sys();
- bool show_sys(ShowFlags showFlags, Qt::WindowFlags windowFlags, QWindow *parent);
+ bool show_sys(Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, QWindow *parent);
void hide_sys();
QPlatformDialogHelper::DialogCode dialogResultCode_sys();
@@ -70,7 +70,7 @@ public:
protected:
void createNSFontPanelDelegate();
- bool showCocoaFontPanel(QWindow *parent);
+ bool showCocoaFontPanel(Qt::WindowModality windowModality, QWindow *parent);
bool hideCocoaFontPanel();
private:
diff --git a/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm b/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm
index 1e89270775..515bc2a6ee 100644
--- a/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm
+++ b/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm
@@ -400,9 +400,13 @@ void QCocoaFontDialogHelper::deleteNativeDialog_sys()
mDelegate = 0;
}
-bool QCocoaFontDialogHelper::show_sys(QFlags<QPlatformDialogHelper::ShowFlag>, Qt::WindowFlags, QWindow *parent)
+bool QCocoaFontDialogHelper::show_sys(Qt::WindowFlags, Qt::WindowModality windowModality, QWindow *parent)
{
- return showCocoaFontPanel(parent);
+ if (windowModality == Qt::WindowModal) {
+ // Cocoa's shared font panel cannot be shown as a sheet
+ return false;
+ }
+ return showCocoaFontPanel(windowModality, parent);
}
void QCocoaFontDialogHelper::hide_sys()
@@ -466,12 +470,14 @@ void QCocoaFontDialogHelper::createNSFontPanelDelegate()
mDelegate = delegate;
}
-bool QCocoaFontDialogHelper::showCocoaFontPanel(QWindow *parent)
+bool QCocoaFontDialogHelper::showCocoaFontPanel(Qt::WindowModality windowModality, QWindow *parent)
{
Q_UNUSED(parent);
createNSFontPanelDelegate();
QT_MANGLE_NAMESPACE(QNSFontPanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSFontPanelDelegate) *>(mDelegate);
- [delegate showModelessPanel];
+ if (windowModality == Qt::NonModal)
+ [delegate showModelessPanel];
+ // no need to show a Qt::ApplicationModal dialog here, since it will be done in _q_platformRunNativeAppModalPanel()
return true;
}
diff --git a/src/plugins/platforms/cocoa/qcocoaprintersupport.h b/src/plugins/platforms/cocoa/qcocoaprintersupport.h
index db473dfabb..2309025bb3 100644
--- a/src/plugins/platforms/cocoa/qcocoaprintersupport.h
+++ b/src/plugins/platforms/cocoa/qcocoaprintersupport.h
@@ -50,11 +50,11 @@ public:
QCocoaPrinterSupport();
~QCocoaPrinterSupport();
- Q_DECL_OVERRIDE QPrintEngine *createNativePrintEngine(QPrinter::PrinterMode printerMode);
- Q_DECL_OVERRIDE QPaintEngine *createPaintEngine(QPrintEngine *, QPrinter::PrinterMode printerMode);
- Q_DECL_OVERRIDE QList<QPrinter::PaperSize> supportedPaperSizes(const QPrinterInfo &) const;
+ QPrintEngine *createNativePrintEngine(QPrinter::PrinterMode printerMode) Q_DECL_OVERRIDE;
+ QPaintEngine *createPaintEngine(QPrintEngine *, QPrinter::PrinterMode printerMode) Q_DECL_OVERRIDE;
+ QList<QPrinter::PaperSize> supportedPaperSizes(const QPrinterInfo &) const Q_DECL_OVERRIDE;
- Q_DECL_OVERRIDE QList<QPrinterInfo> availablePrinters();
+ QList<QPrinterInfo> availablePrinters() Q_DECL_OVERRIDE;
};
#endif // QCOCOAPRINTERSUPPORT_H
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h
index 184422a04a..d08bbe79ce 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.h
+++ b/src/plugins/platforms/cocoa/qcocoawindow.h
@@ -95,6 +95,7 @@ public:
void setCocoaGeometry(const QRect &rect);
void setVisible(bool visible);
Qt::WindowFlags setWindowFlags(Qt::WindowFlags flags);
+ Qt::WindowState setWindowState(Qt::WindowState state);
void setWindowTitle(const QString &title);
void raise();
void lower();
@@ -117,6 +118,8 @@ public:
void setCurrentContext(QCocoaGLContext *context);
QCocoaGLContext *currentContext() const;
+ bool setWindowModified(bool modified) Q_DECL_OVERRIDE;
+
protected:
// NSWindow handling. The QCocoaWindow/QNSView can either be displayed
// in an existing NSWindow or in one created by Qt.
@@ -127,6 +130,7 @@ protected:
QRect windowGeometry() const;
QCocoaWindow *parentCocoaWindow() const;
+ void syncWindowState(Qt::WindowState newState);
// private:
public: // for QNSView
@@ -136,10 +140,13 @@ public: // for QNSView
QNSView *m_contentView;
NSWindow *m_nsWindow;
Qt::WindowFlags m_windowFlags;
+ Qt::WindowState m_synchedWindowState;
QPointer<QWindow> m_activePopupWindow;
bool m_inConstructor;
QCocoaGLContext *m_glContext;
+
+ bool m_hasModalSession;
};
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm
index de58842772..83b6534b7c 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.mm
+++ b/src/plugins/platforms/cocoa/qcocoawindow.mm
@@ -41,6 +41,7 @@
#include "qcocoawindow.h"
#include "qnswindowdelegate.h"
#include "qcocoaautoreleasepool.h"
+#include "qcocoaeventdispatcher.h"
#include "qcocoaglcontext.h"
#include "qcocoahelpers.h"
#include "qnsview.h"
@@ -96,8 +97,10 @@
QCocoaWindow::QCocoaWindow(QWindow *tlw)
: QPlatformWindow(tlw)
, m_nsWindow(0)
+ , m_synchedWindowState(Qt::WindowActive)
, m_inConstructor(true)
, m_glContext(0)
+ , m_hasModalSession(false)
{
QCocoaAutoReleasePool pool;
@@ -145,7 +148,10 @@ void QCocoaWindow::setVisible(bool visible)
qDebug() << "QCocoaWindow::setVisible" << window() << visible;
#endif
if (visible) {
+ QCocoaWindow *parentCocoaWindow = 0;
if (window()->transientParent()) {
+ parentCocoaWindow = static_cast<QCocoaWindow *>(window()->transientParent()->handle());
+
// The parent window might have moved while this window was hidden,
// update the window geometry if there is a parent.
setGeometry(window()->geometry());
@@ -154,8 +160,6 @@ void QCocoaWindow::setVisible(bool visible)
// close them when needed.
if (window()->windowType() == Qt::Popup) {
// qDebug() << "transientParent and popup" << window()->windowType() << Qt::Popup << (window()->windowType() & Qt::Popup);
-
- QCocoaWindow *parentCocoaWindow = static_cast<QCocoaWindow *>(window()->transientParent()->handle());
parentCocoaWindow->m_activePopupWindow = window();
}
@@ -165,15 +169,47 @@ void QCocoaWindow::setVisible(bool visible)
QWindowSystemInterface::handleSynchronousExposeEvent(window(), QRect(QPoint(), geometry().size()));
if (m_nsWindow) {
- if ([m_nsWindow canBecomeKeyWindow])
- [m_nsWindow makeKeyAndOrderFront:nil];
- else
- [m_nsWindow orderFront: nil];
+ // setWindowState might have been called while the window was hidden and
+ // will not change the NSWindow state in that case. Sync up here:
+ syncWindowState(window()->windowState());
+
+ if (window()->windowState() != Qt::WindowMinimized) {
+ if ((window()->windowModality() == Qt::WindowModal
+ || window()->windowType() == Qt::Sheet)
+ && parentCocoaWindow) {
+ // show the window as a sheet
+ [NSApp beginSheet:m_nsWindow modalForWindow:parentCocoaWindow->m_nsWindow modalDelegate:nil didEndSelector:nil contextInfo:nil];
+ } else if (window()->windowModality() != Qt::NonModal) {
+ // show the window as application modal
+ QCocoaEventDispatcher *cocoaEventDispatcher = qobject_cast<QCocoaEventDispatcher *>(QGuiApplication::instance()->eventDispatcher());
+ Q_ASSERT(cocoaEventDispatcher != 0);
+ QCocoaEventDispatcherPrivate *cocoaEventDispatcherPrivate = static_cast<QCocoaEventDispatcherPrivate *>(QObjectPrivate::get(cocoaEventDispatcher));
+ cocoaEventDispatcherPrivate->beginModalSession(window());
+ m_hasModalSession = true;
+ } else if ([m_nsWindow canBecomeKeyWindow]) {
+ [m_nsWindow makeKeyAndOrderFront:nil];
+ } else {
+ [m_nsWindow orderFront: nil];
+ }
+ }
}
} else {
// qDebug() << "close" << this;
- if (m_nsWindow)
+ if (m_nsWindow) {
+ if (m_hasModalSession) {
+ QCocoaEventDispatcher *cocoaEventDispatcher = qobject_cast<QCocoaEventDispatcher *>(QGuiApplication::instance()->eventDispatcher());
+ Q_ASSERT(cocoaEventDispatcher != 0);
+ QCocoaEventDispatcherPrivate *cocoaEventDispatcherPrivate = static_cast<QCocoaEventDispatcherPrivate *>(QObjectPrivate::get(cocoaEventDispatcher));
+ cocoaEventDispatcherPrivate->endModalSession(window());
+ m_hasModalSession = false;
+ } else {
+ if ([m_nsWindow isSheet])
+ [NSApp endSheet:m_nsWindow];
+ }
[m_nsWindow orderOut:m_nsWindow];
+ }
+ if (!QCoreApplication::closingDown())
+ QWindowSystemInterface::handleExposeEvent(window(), QRegion());
}
}
@@ -183,6 +219,14 @@ Qt::WindowFlags QCocoaWindow::setWindowFlags(Qt::WindowFlags flags)
return m_windowFlags;
}
+Qt::WindowState QCocoaWindow::setWindowState(Qt::WindowState state)
+{
+ if ([m_nsWindow isVisible])
+ syncWindowState(state); // Window state set for hidden windows take effect when show() is called.
+
+ return state;
+}
+
void QCocoaWindow::setWindowTitle(const QString &title)
{
QCocoaAutoReleasePool pool;
@@ -347,6 +391,12 @@ void QCocoaWindow::recreateWindow(const QPlatformWindow *parentWindow)
// Create a new NSWindow if this is a top-level window.
m_nsWindow = createNSWindow();
setNSWindow(m_nsWindow);
+
+ if (window()->transientParent()) {
+ // keep this window on the same level as its transient parent (which may be a modal dialog, for example)
+ QCocoaWindow *parentCocoaWindow = static_cast<QCocoaWindow *>(window()->transientParent()->handle());
+ [m_nsWindow setLevel:[parentCocoaWindow->m_nsWindow level]];
+ }
} else {
// Child windows have no NSWindow, link the NSViews instead.
const QCocoaWindow *parentCococaWindow = static_cast<const QCocoaWindow *>(parentWindow);
@@ -446,27 +496,12 @@ void QCocoaWindow::setNSWindow(NSWindow *window)
// QCocoaWindow is deleted by Qt.
[window setReleasedWhenClosed : NO];
- [[NSNotificationCenter defaultCenter] addObserver:m_contentView
- selector:@selector(windowDidBecomeKey)
- name:NSWindowDidBecomeKeyNotification
- object:m_nsWindow];
[[NSNotificationCenter defaultCenter] addObserver:m_contentView
- selector:@selector(windowDidResignKey)
- name:NSWindowDidResignKeyNotification
+ selector:@selector(windowNotification:)
+ name:nil // Get all notifications
object:m_nsWindow];
- [[NSNotificationCenter defaultCenter] addObserver:m_contentView
- selector:@selector(windowDidBecomeMain)
- name:NSWindowDidBecomeMainNotification
- object:m_nsWindow];
-
- [[NSNotificationCenter defaultCenter] addObserver:m_contentView
- selector:@selector(windowDidResignMain)
- name:NSWindowDidResignMainNotification
- object:m_nsWindow];
-
-
// ### Accept touch events by default.
// Beware that enabling touch events has a negative impact on the overall performance.
// We probably need a QWindowSystemInterface API to enable/disable touch events.
@@ -479,7 +514,6 @@ void QCocoaWindow::clearNSWindow(NSWindow *window)
{
[window setDelegate:nil];
[[NSNotificationCenter defaultCenter] removeObserver:m_contentView];
- [m_contentView removeFromSuperviewWithoutNeedingDisplay];
}
// Returns the current global screen geometry for the nswindow associated with this window.
@@ -504,3 +538,42 @@ QCocoaWindow *QCocoaWindow::parentCocoaWindow() const
return 0;
}
+// Syncs the NSWindow minimize/maximize/fullscreen state with the current QWindow state
+void QCocoaWindow::syncWindowState(Qt::WindowState newState)
+{
+ if (!m_nsWindow)
+ return;
+
+ if ((m_synchedWindowState & Qt::WindowMaximized) != (newState & Qt::WindowMaximized)) {
+ [m_nsWindow performZoom : m_nsWindow]; // toggles
+ }
+
+ if ((m_synchedWindowState & Qt::WindowMinimized) != (newState & Qt::WindowMinimized)) {
+ if (newState & Qt::WindowMinimized) {
+ [m_nsWindow performMiniaturize : m_nsWindow];
+ } else {
+ [m_nsWindow deminiaturize : m_nsWindow];
+ }
+ }
+
+ if ((m_synchedWindowState & Qt::WindowFullScreen) != (newState & Qt::WindowFullScreen)) {
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7
+ if (QSysInfo::QSysInfo::MacintoshVersion >= QSysInfo::MV_10_7) {
+ [m_nsWindow toggleFullScreen : m_nsWindow];
+ } else {
+ // TODO: "normal" fullscreen
+ }
+#endif
+ }
+
+ // New state is now the current synched state
+ m_synchedWindowState = newState;
+}
+
+bool QCocoaWindow::setWindowModified(bool modified)
+{
+ if (!m_nsWindow)
+ return false;
+ [m_nsWindow setDocumentEdited:(modified?YES:NO)];
+ return true;
+}
diff --git a/src/plugins/platforms/cocoa/qnsview.h b/src/plugins/platforms/cocoa/qnsview.h
index 2b7caae688..16775621bf 100644
--- a/src/plugins/platforms/cocoa/qnsview.h
+++ b/src/plugins/platforms/cocoa/qnsview.h
@@ -52,7 +52,7 @@ QT_BEGIN_NAMESPACE
class QCocoaWindow;
QT_END_NAMESPACE
-@interface QNSView : NSView <NSTextInput> {
+@interface QNSView : NSView <NSTextInputClient> {
CGImageRef m_cgImage;
QWindow *m_window;
QCocoaWindow *m_platformWindow;
@@ -70,8 +70,7 @@ QT_END_NAMESPACE
- (void)setImage:(QImage *)image;
- (void)drawRect:(NSRect)dirtyRect;
- (void)updateGeometry;
-- (void)windowDidBecomeKey;
-- (void)windowDidResignKey;
+- (void)windowNotification : (NSNotification *) windowNotification;
- (BOOL)isFlipped;
- (BOOL)acceptsFirstResponder;
diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm
index e76c02704f..a8372f754f 100644
--- a/src/plugins/platforms/cocoa/qnsview.mm
+++ b/src/plugins/platforms/cocoa/qnsview.mm
@@ -144,29 +144,40 @@ static QTouchDevice *touchDevice = 0;
QWindowSystemInterface::handleSynchronousGeometryChange(m_window, geo);
}
-- (void)windowDidBecomeKey
-{
- if (!m_platformWindow->windowIsPopupType())
- QWindowSystemInterface::handleWindowActivated(m_window);
-}
-
-- (void)windowDidResignKey
-{
- if (!m_platformWindow->windowIsPopupType())
- QWindowSystemInterface::handleWindowActivated(0);
-}
+- (void)windowNotification : (NSNotification *) windowNotification
+{
+ //qDebug() << "windowNotification" << QCFString::toQString([windowNotification name]);
+
+ NSString *notificationName = [windowNotification name];
+ if (notificationName == NSWindowDidBecomeKeyNotification) {
+ if (!m_platformWindow->windowIsPopupType())
+ QWindowSystemInterface::handleWindowActivated(m_window);
+ } else if (notificationName == NSWindowDidResignKeyNotification) {
+ if (!m_platformWindow->windowIsPopupType())
+ QWindowSystemInterface::handleWindowActivated(0);
+ } else if (notificationName == NSWindowDidMiniaturizeNotification) {
+ QWindowSystemInterface::handleWindowStateChanged(m_window, Qt::WindowMinimized);
+ } else if (notificationName == NSWindowDidDeminiaturizeNotification) {
+ QWindowSystemInterface::handleWindowStateChanged(m_window, Qt::WindowNoState);
+ // Qt expects an expose event after restore/deminiaturize. This also needs
+ // to be a non-synchronous event to make sure it gets processed after
+ // the state change event sent above.
+ QWindowSystemInterface::handleExposeEvent(m_window, QRegion(m_window->geometry()));
+ } else {
-- (void)windowDidBecomeMain
-{
-// qDebug() << "window did become main" << m_window;
-}
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7
+ if (QSysInfo::QSysInfo::MacintoshVersion >= QSysInfo::MV_10_7) {
+ if (notificationName == NSWindowDidEnterFullScreenNotification) {
+ QWindowSystemInterface::handleWindowStateChanged(m_window, Qt::WindowFullScreen);
+ } else if (notificationName == NSWindowDidExitFullScreenNotification) {
+ QWindowSystemInterface::handleWindowStateChanged(m_window, Qt::WindowNoState);
+ }
+ }
+#endif
-- (void)windowDidResignMain
-{
-// qDebug() << "window did resign main" << m_window;
+ }
}
-
- (void) setImage:(QImage *)image
{
CGImageRelease(m_cgImage);
@@ -681,8 +692,9 @@ static QTouchDevice *touchDevice = 0;
[self tryToPerform:aSelector with:self];
}
-- (void) insertText:(id)aString
+- (void) insertText:(id)aString replacementRange:(NSRange)replacementRange
{
+ Q_UNUSED(replacementRange)
QString commitString;
if ([aString length]) {
if ([aString isKindOfClass:[NSAttributedString class]]) {
@@ -707,12 +719,13 @@ static QTouchDevice *touchDevice = 0;
m_composingText.clear();
}
-- (void) setMarkedText:(id)aString selectedRange:(NSRange)selRange
+- (void) setMarkedText:(id)aString selectedRange:(NSRange)selectedRange replacementRange:(NSRange)replacementRange
{
+ Q_UNUSED(replacementRange)
QString preeditString;
QList<QInputMethodEvent::Attribute> attrs;
- attrs<<QInputMethodEvent::Attribute(QInputMethodEvent::Cursor, selRange.location + selRange.length, 1, QVariant());
+ attrs<<QInputMethodEvent::Attribute(QInputMethodEvent::Cursor, selectedRange.location + selectedRange.length, 1, QVariant());
if ([aString isKindOfClass:[NSAttributedString class]]) {
// Preedit string has attribution
@@ -793,13 +806,9 @@ static QTouchDevice *touchDevice = 0;
return (m_composingText.isEmpty() ? NO: YES);
}
-- (NSInteger) conversationIdentifier
-{
- return (NSInteger)self;
-}
-
-- (NSAttributedString *) attributedSubstringFromRange:(NSRange)theRange
+- (NSAttributedString *) attributedSubstringForProposedRange:(NSRange)aRange actualRange:(NSRangePointer)actualRange
{
+ Q_UNUSED(actualRange)
QObject *fo = QGuiApplication::focusObject();
if (!fo)
return nil;
@@ -813,7 +822,7 @@ static QTouchDevice *touchDevice = 0;
if (selectedText.isEmpty())
return nil;
- QCFString string(selectedText.mid(theRange.location, theRange.length));
+ QCFString string(selectedText.mid(aRange.location, aRange.length));
const NSString *tmpString = reinterpret_cast<const NSString *>((CFStringRef)string);
return [[[NSAttributedString alloc] initWithString:const_cast<NSString *>(tmpString)] autorelease];
}
@@ -831,34 +840,34 @@ static QTouchDevice *touchDevice = 0;
return range;
}
-
- (NSRange) selectedRange
{
- NSRange selRange = {NSNotFound, 0};
- selRange.location = NSNotFound;
- selRange.length = 0;
+ NSRange selectedRange = {NSNotFound, 0};
+ selectedRange.location = NSNotFound;
+ selectedRange.length = 0;
QObject *fo = QGuiApplication::focusObject();
if (!fo)
- return selRange;
+ return selectedRange;
QInputMethodQueryEvent queryEvent(Qt::ImEnabled | Qt::ImCurrentSelection);
if (!QCoreApplication::sendEvent(fo, &queryEvent))
- return selRange;
+ return selectedRange;
if (!queryEvent.value(Qt::ImEnabled).toBool())
- return selRange;
+ return selectedRange;
QString selectedText = queryEvent.value(Qt::ImCurrentSelection).toString();
if (!selectedText.isEmpty()) {
- selRange.location = 0;
- selRange.length = selectedText.length();
+ selectedRange.location = 0;
+ selectedRange.length = selectedText.length();
}
- return selRange;
+ return selectedRange;
}
-- (NSRect) firstRectForCharacterRange:(NSRange)theRange
+- (NSRect) firstRectForCharacterRange:(NSRange)aRange actualRange:(NSRangePointer)actualRange
{
- Q_UNUSED(theRange);
+ Q_UNUSED(aRange)
+ Q_UNUSED(actualRange)
QObject *fo = QGuiApplication::focusObject();
if (!fo)
return NSZeroRect;
@@ -884,10 +893,10 @@ static QTouchDevice *touchDevice = 0;
return rect;
}
-- (NSUInteger)characterIndexForPoint:(NSPoint)thePoint
+- (NSUInteger)characterIndexForPoint:(NSPoint)aPoint
{
// We dont support cursor movements using mouse while composing.
- Q_UNUSED(thePoint);
+ Q_UNUSED(aPoint);
return NSNotFound;
}
diff --git a/src/plugins/platforms/directfb/qdirectfbinput.h b/src/plugins/platforms/directfb/qdirectfbinput.h
index 0d2081bef3..12e596d50b 100644
--- a/src/plugins/platforms/directfb/qdirectfbinput.h
+++ b/src/plugins/platforms/directfb/qdirectfbinput.h
@@ -51,6 +51,8 @@
#include "qdirectfbconvenience.h"
+QT_BEGIN_NAMESPACE
+
class QDirectFbInput : public QThread
{
Q_OBJECT
@@ -81,4 +83,6 @@ private:
QHash<DFBWindowID,QWindow *>m_tlwMap;
};
+QT_END_NAMESPACE
+
#endif // QDIRECTFBINPUT_H
diff --git a/src/plugins/platforms/eglfs/eglfs.pro b/src/plugins/platforms/eglfs/eglfs.pro
index 421bbd5561..b3bbc4e3e4 100644
--- a/src/plugins/platforms/eglfs/eglfs.pro
+++ b/src/plugins/platforms/eglfs/eglfs.pro
@@ -7,8 +7,6 @@ DESTDIR = $$QT.gui.plugins/platforms
#DEFINES += QEGL_EXTRA_DEBUG
-#DEFINES += Q_OPENKODE
-
#Avoid X11 header collision
DEFINES += MESA_EGL_NO_X11_HEADERS
diff --git a/src/plugins/platforms/eglfs/qeglfsbackingstore.cpp b/src/plugins/platforms/eglfs/qeglfsbackingstore.cpp
index 8e9e5f76e0..5c1919a4f3 100644
--- a/src/plugins/platforms/eglfs/qeglfsbackingstore.cpp
+++ b/src/plugins/platforms/eglfs/qeglfsbackingstore.cpp
@@ -43,12 +43,19 @@
#include <QtGui/QOpenGLContext>
#include <QtGui/QOpenGLPaintDevice>
+#include <QtGui/QOpenGLShaderProgram>
+
+#include <QtGui/QScreen>
QT_BEGIN_NAMESPACE
QEglFSBackingStore::QEglFSBackingStore(QWindow *window)
: QPlatformBackingStore(window)
, m_context(new QOpenGLContext)
+#ifdef EGLFS_BACKINGSTORE_USE_IMAGE
+ , m_texture(0)
+ , m_program(0)
+#endif
{
m_context->setFormat(window->requestedFormat());
m_context->setScreen(window->screen());
@@ -62,7 +69,11 @@ QEglFSBackingStore::~QEglFSBackingStore()
QPaintDevice *QEglFSBackingStore::paintDevice()
{
+#ifdef EGLFS_BACKINGSTORE_USE_IMAGE
+ return &m_image;
+#else
return m_device;
+#endif
}
void QEglFSBackingStore::flush(QWindow *window, const QRegion &region, const QPoint &offset)
@@ -74,27 +85,156 @@ void QEglFSBackingStore::flush(QWindow *window, const QRegion &region, const QPo
qWarning("QEglBackingStore::flush %p", window);
#endif
+#ifdef EGLFS_BACKINGSTORE_USE_IMAGE
+ if (!m_program) {
+ static const char *textureVertexProgram =
+ "attribute highp vec2 vertexCoordEntry;\n"
+ "attribute highp vec2 textureCoordEntry;\n"
+ "varying highp vec2 textureCoord;\n"
+ "void main() {\n"
+ " textureCoord = textureCoordEntry;\n"
+ " gl_Position = vec4(vertexCoordEntry, 0.0, 1.0);\n"
+ "}\n";
+
+ static const char *textureFragmentProgram =
+ "uniform sampler2D texture;\n"
+ "varying highp vec2 textureCoord;\n"
+ "void main() {\n"
+ " gl_FragColor = texture2D(texture, textureCoord).bgra;\n"
+ "}\n";
+
+ m_program = new QOpenGLShaderProgram;
+
+ m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, textureVertexProgram);
+ m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, textureFragmentProgram);
+ m_program->link();
+
+ m_vertexCoordEntry = m_program->attributeLocation("vertexCoordEntry");
+ m_textureCoordEntry = m_program->attributeLocation("textureCoordEntry");
+ }
+
+ m_program->bind();
+
+ const GLfloat textureCoordinates[] = {
+ 0, 1,
+ 1, 1,
+ 1, 0,
+ 0, 0
+ };
+
+ QRectF r = window->geometry();
+ QRectF sr = window->screen()->geometry();
+
+ GLfloat x1 = (r.left() / sr.width()) * 2 - 1;
+ GLfloat x2 = (r.right() / sr.width()) * 2 - 1;
+ GLfloat y1 = (r.top() / sr.height()) * 2 - 1;
+ GLfloat y2 = (r.bottom() / sr.height()) * 2 - 1;
+
+ const GLfloat vertexCoordinates[] = {
+ x1, y1,
+ x2, y1,
+ x2, y2,
+ x1, y2
+ };
+
+ glEnableVertexAttribArray(m_vertexCoordEntry);
+ glEnableVertexAttribArray(m_textureCoordEntry);
+
+ glVertexAttribPointer(m_vertexCoordEntry, 2, GL_FLOAT, GL_FALSE, 0, vertexCoordinates);
+ glVertexAttribPointer(m_textureCoordEntry, 2, GL_FLOAT, GL_FALSE, 0, textureCoordinates);
+
+ glBindTexture(GL_TEXTURE_2D, m_texture);
+
+ if (!m_dirty.isNull()) {
+ QRect imageRect = m_image.rect();
+
+ QRegion fixed;
+ foreach (const QRect &rect, m_dirty.rects()) {
+ // intersect with image rect to be sure
+ QRect r = imageRect & rect;
+
+ // if the rect is wide enough it's cheaper to just
+ // extend it instead of doing an image copy
+ if (r.width() >= imageRect.width() / 2) {
+ r.setX(0);
+ r.setWidth(imageRect.width());
+ }
+
+ fixed |= r;
+ }
+
+ foreach (const QRect &rect, fixed.rects()) {
+ // if the sub-rect is full-width we can pass the image data directly to
+ // OpenGL instead of copying, since there's no gap between scanlines
+ if (rect.width() == imageRect.width()) {
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, rect.y(), rect.width(), rect.height(), GL_RGBA, GL_UNSIGNED_BYTE, m_image.constScanLine(rect.y()));
+ } else {
+ glTexSubImage2D(GL_TEXTURE_2D, 0, rect.x(), rect.y(), rect.width(), rect.height(), GL_RGBA, GL_UNSIGNED_BYTE,
+ m_image.copy(rect).constBits());
+ }
+ }
+
+ m_dirty = QRegion();
+ }
+
+ glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+
+ glBindTexture(GL_TEXTURE_2D, 0);
+
+ glDisableVertexAttribArray(m_vertexCoordEntry);
+ glDisableVertexAttribArray(m_textureCoordEntry);
+#endif
+
m_context->swapBuffers(window);
}
-void QEglFSBackingStore::beginPaint(const QRegion &)
+void QEglFSBackingStore::makeCurrent()
{
// needed to prevent QOpenGLContext::makeCurrent() from failing
window()->setSurfaceType(QSurface::OpenGLSurface);
m_context->makeCurrent(window());
+}
+
+void QEglFSBackingStore::beginPaint(const QRegion &rgn)
+{
+ makeCurrent();
+
+#ifdef EGLFS_BACKINGSTORE_USE_IMAGE
+ m_dirty = m_dirty | rgn;
+#else
+ Q_UNUSED(rgn);
m_device = new QOpenGLPaintDevice(window()->size());
+#endif
}
void QEglFSBackingStore::endPaint()
{
+#ifndef EGLFS_BACKINGSTORE_USE_IMAGE
delete m_device;
+#endif
}
void QEglFSBackingStore::resize(const QSize &size, const QRegion &staticContents)
{
- Q_UNUSED(size);
Q_UNUSED(staticContents);
+
+#ifdef EGLFS_BACKINGSTORE_USE_IMAGE
+ m_image = QImage(size, QImage::Format_RGB32);
+ makeCurrent();
+ if (m_texture)
+ glDeleteTextures(1, &m_texture);
+ glGenTextures(1, &m_texture);
+ glBindTexture(GL_TEXTURE_2D, m_texture);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size.width(), size.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
+#else
+ Q_UNUSED(size);
+#endif
}
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/eglfs/qeglfsbackingstore.h b/src/plugins/platforms/eglfs/qeglfsbackingstore.h
index 97ea322420..f723bca685 100644
--- a/src/plugins/platforms/eglfs/qeglfsbackingstore.h
+++ b/src/plugins/platforms/eglfs/qeglfsbackingstore.h
@@ -44,10 +44,16 @@
#include <QtGui/qplatformbackingstore_qpa.h>
+#include <QImage>
+#include <QRegion>
+
+#define EGLFS_BACKINGSTORE_USE_IMAGE
+
QT_BEGIN_NAMESPACE
class QOpenGLContext;
class QOpenGLPaintDevice;
+class QOpenGLShaderProgram;
class QEglFSBackingStore : public QPlatformBackingStore
{
@@ -64,8 +70,19 @@ public:
void resize(const QSize &size, const QRegion &staticContents);
private:
+ void makeCurrent();
+
QOpenGLContext *m_context;
+#ifdef EGLFS_BACKINGSTORE_USE_IMAGE
+ QImage m_image;
+ uint m_texture;
+ QRegion m_dirty;
+ QOpenGLShaderProgram *m_program;
+ int m_vertexCoordEntry;
+ int m_textureCoordEntry;
+#else
QOpenGLPaintDevice *m_device;
+#endif
};
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/eglfs/qeglfshooks_stub.cpp b/src/plugins/platforms/eglfs/qeglfshooks_stub.cpp
index 7cc3527a0c..c0e202fb70 100644
--- a/src/plugins/platforms/eglfs/qeglfshooks_stub.cpp
+++ b/src/plugins/platforms/eglfs/qeglfshooks_stub.cpp
@@ -41,6 +41,8 @@
#include "qeglfshooks.h"
+QT_BEGIN_NAMESPACE
+
void QEglFSHooks::platformInit()
{
}
@@ -79,3 +81,5 @@ bool QEglFSHooks::hasCapability(QPlatformIntegration::Capability cap) const
#ifndef EGLFS_PLATFORM_HOOKS
QEglFSHooks stubHooks;
#endif
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/eglfs/qeglfshooks_x11.cpp b/src/plugins/platforms/eglfs/qeglfshooks_x11.cpp
index cb788c52f2..af750a73f1 100644
--- a/src/plugins/platforms/eglfs/qeglfshooks_x11.cpp
+++ b/src/plugins/platforms/eglfs/qeglfshooks_x11.cpp
@@ -43,6 +43,8 @@
#include <X11/Xlib.h>
+QT_BEGIN_NAMESPACE
+
class QEglFSX11Hooks : public QEglFSHooks
{
public:
@@ -108,3 +110,4 @@ bool QEglFSX11Hooks::hasCapability(QPlatformIntegration::Capability cap) const
static QEglFSX11Hooks eglFSX11Hooks;
QEglFSHooks *platformHooks = &eglFSX11Hooks;
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/eglfs/qeglfsscreen.cpp b/src/plugins/platforms/eglfs/qeglfsscreen.cpp
index ea939a9821..78f9e13150 100644
--- a/src/plugins/platforms/eglfs/qeglfsscreen.cpp
+++ b/src/plugins/platforms/eglfs/qeglfsscreen.cpp
@@ -46,11 +46,6 @@
#include <QtPlatformSupport/private/qeglconvenience_p.h>
#include <QtPlatformSupport/private/qeglplatformcontext_p.h>
-#ifdef Q_OPENKODE
-#include <KD/kd.h>
-#include <KD/NV_initialize.h>
-#endif //Q_OPENKODE
-
QT_BEGIN_NAMESPACE
// #define QEGL_EXTRA_DEBUG
@@ -196,17 +191,8 @@ void QEglFSScreen::createAndSetPlatformContext()
EGLConfig config = q_configFromGLFormat(m_dpy, platformFormat);
-#ifdef Q_OPENKODE
- if (kdInitializeNV() == KD_ENOTINITIALIZED) {
- qFatal("Did not manage to initialize openkode");
- }
- KDWindow *window = kdCreateWindow(m_dpy,config,0);
-
- kdRealizeWindow(window, &m_window);
-#else
if (hooks)
m_window = hooks->createNativeWindow(hooks->screenSize());
-#endif
#ifdef QEGL_EXTRA_DEBUG
qWarning("Configuration %d matches requirements\n", (int)config);
diff --git a/src/plugins/platforms/eglfs/qeglfswindow.cpp b/src/plugins/platforms/eglfs/qeglfswindow.cpp
index f380542559..e9430eae40 100644
--- a/src/plugins/platforms/eglfs/qeglfswindow.cpp
+++ b/src/plugins/platforms/eglfs/qeglfswindow.cpp
@@ -54,10 +54,7 @@ QEglFSWindow::QEglFSWindow(QWindow *w)
qWarning("QEglWindow %p: %p 0x%x\n", this, w, uint(m_winid));
#endif
- QRect screenGeometry(screen()->availableGeometry());
- if (w->geometry() != screenGeometry) {
- QWindowSystemInterface::handleGeometryChange(w, screenGeometry);
- }
+ setWindowState(Qt::WindowFullScreen);
}
void QEglFSWindow::setGeometry(const QRect &)
@@ -69,6 +66,12 @@ void QEglFSWindow::setGeometry(const QRect &)
QPlatformWindow::setGeometry(rect);
}
+Qt::WindowState QEglFSWindow::setWindowState(Qt::WindowState state)
+{
+ setGeometry(QRect());
+ return Qt::WindowFullScreen;
+}
+
WId QEglFSWindow::winId() const
{
return m_winid;
diff --git a/src/plugins/platforms/eglfs/qeglfswindow.h b/src/plugins/platforms/eglfs/qeglfswindow.h
index 1376708ad6..7f40c78550 100644
--- a/src/plugins/platforms/eglfs/qeglfswindow.h
+++ b/src/plugins/platforms/eglfs/qeglfswindow.h
@@ -56,6 +56,7 @@ public:
QEglFSWindow(QWindow *w);
void setGeometry(const QRect &);
+ Qt::WindowState setWindowState(Qt::WindowState state);
WId winId() const;
private:
diff --git a/src/plugins/platforms/openkode/openkode.pro b/src/plugins/platforms/openkode/openkode.pro
deleted file mode 100644
index 0fcf7b1488..0000000000
--- a/src/plugins/platforms/openkode/openkode.pro
+++ /dev/null
@@ -1,42 +0,0 @@
-TARGET = qopenkodeintegration
-load(qt_plugin)
-
-QT += opengl
-
-DESTDIR = $$QT.gui.plugins/platforms
-
-SOURCES = main.cpp \
- qopenkodeintegration.cpp \
- qopenkodewindow.cpp \
- ../eglconvenience/qeglplatformcontext.cpp \
- ../eglconvenience/qeglconvenience.cpp \
- qopenkodeeventloopintegration.cpp
-
-HEADERS = qopenkodeintegration.h \
- qopenkodewindow.h \
- ../eglconvenience/qeglplatformcontext.h \
- ../eglconvenience/qeglconvenience.h \
- qopenkodeeventloopintegration.h \
- openkodekeytranslator.h
-
-CONFIG += qpa/genericunixfontdatabase
-
-RESOURCES = resources.qrc
-
-target.path += $$[QT_INSTALL_PLUGINS]/platforms
-INSTALLS += target
-
-LIBS += -lKD -lEGL
-!isEmpty(QMAKE_INCDIR_OPENGL_ES2){
- INCLUDEPATH += $$QMAKE_INCDIR_OPENGL_ES2
-}
-!isEmpty(QMAKE_LIBDIR_OPENGL_ES2){
- for(p, QMAKE_LIBDIR_OPENGL_ES2) {
- exists($$p):LIBS += -L$$p
- }
-}
-!isEmpty(QMAKE_LIBS_OPENGL_ES2){
- LIBS += $$QMAKE_LIBS_OPENGL_ES2
-} else {
- LIBS += -lGLESv2
-}
diff --git a/src/plugins/platforms/openkode/openkodekeytranslator.h b/src/plugins/platforms/openkode/openkodekeytranslator.h
deleted file mode 100644
index 63f4e4e3ac..0000000000
--- a/src/plugins/platforms/openkode/openkodekeytranslator.h
+++ /dev/null
@@ -1,244 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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, Nokia gives you certain additional
-** rights. These rights are described in the Nokia 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.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef OPENKODEKEYTRANSLATOR_H
-#define OPENKODEKEYTRANSLATOR_H
-
-#ifdef KD_ATX_keyboard
-
-#include <KD/ATX_keyboard.h>
-
-QT_BEGIN_NAMESPACE
-
-Qt::Key keyTranslator( int key )
-{
- switch (key) {
-// KD_KEY_ACCEPT_ATX:
-// KD_KEY_AGAIN_ATX:
-// KD_KEY_ALLCANDIDATES_ATX
-// KD_KEY_ALPHANUMERIC_ATX
- case KD_KEY_ALT_ATX:
- return Qt::Key_Alt;
- case KD_KEY_ALTGRAPH_ATX:
- return Qt::Key_AltGr;
-// KD_KEY_APPS_ATX
-// KD_KEY_ATTN_ATX
-// KD_KEY_BROWSERBACK_ATX
-// KD_KEY_BROWSERFAVORITES_ATX
-// KD_KEY_BROWSERFORWARD_ATX
-// KD_KEY_BROWSERHOME_ATX
-// KD_KEY_BROWSERREFRESH_ATX
-// KD_KEY_BROWSERSEARCH_ATX
-// KD_KEY_BROWSERSTOP_ATX
- case KD_KEY_CAPSLOCK_ATX:
- return Qt::Key_CapsLock;
- case KD_KEY_CLEAR_ATX:
- return Qt::Key_Clear;
- case KD_KEY_CODEINPUT_ATX:
- return Qt::Key_Codeinput;
-// KD_KEY_COMPOSE_ATX
- case KD_KEY_CONTROL_ATX:
- return Qt::Key_Control;
-// KD_KEY_CRSEL_ATX
-// KD_KEY_CONVERT_ATX
- case KD_KEY_COPY_ATX:
- return Qt::Key_Copy;
- case KD_KEY_CUT_ATX:
- return Qt::Key_Cut;
- case KD_KEY_DOWN_ATX:
- return Qt::Key_Down;
- case KD_KEY_END_ATX:
- return Qt::Key_End;
- case KD_KEY_ENTER_ATX:
- return Qt::Key_Enter;
-// KD_KEY_ERASEEOF_ATX
-// KD_KEY_EXECUTE_ATX
-// KD_KEY_EXSEL_ATX
- case KD_KEY_F1_ATX:
- return Qt::Key_F1;
- case KD_KEY_F2_ATX:
- return Qt::Key_F2;
- case KD_KEY_F3_ATX:
- return Qt::Key_F3;
- case KD_KEY_F4_ATX:
- return Qt::Key_F4;
- case KD_KEY_F5_ATX:
- return Qt::Key_F5;
- case KD_KEY_F6_ATX:
- return Qt::Key_F6;
- case KD_KEY_F7_ATX:
- return Qt::Key_F7;
- case KD_KEY_F8_ATX:
- return Qt::Key_F8;
- case KD_KEY_F9_ATX:
- return Qt::Key_F9;
- case KD_KEY_F10_ATX:
- return Qt::Key_F10;
- case KD_KEY_F11_ATX:
- return Qt::Key_F11;
- case KD_KEY_F12_ATX:
- return Qt::Key_F12;
- case KD_KEY_F13_ATX:
- return Qt::Key_F13;
- case KD_KEY_F14_ATX:
- return Qt::Key_F14;
- case KD_KEY_F15_ATX:
- return Qt::Key_F15;
- case KD_KEY_F16_ATX:
- return Qt::Key_F16;
- case KD_KEY_F17_ATX:
- return Qt::Key_F17;
- case KD_KEY_F18_ATX:
- return Qt::Key_F18;
- case KD_KEY_F19_ATX:
- return Qt::Key_F19;
- case KD_KEY_F20_ATX:
- return Qt::Key_F20;
- case KD_KEY_F21_ATX:
- return Qt::Key_F21;
- case KD_KEY_F22_ATX:
- return Qt::Key_F22;
- case KD_KEY_F23_ATX:
- return Qt::Key_F23;
- case KD_KEY_F24_ATX:
- return Qt::Key_F24;
-// KD_KEY_FINALMODE_ATX
-// KD_KEY_FIND_ATX
-// KD_KEY_FULLWIDTH_ATX
-// KD_KEY_HALFWIDTH_ATX
- case KD_KEY_HANGULMODE_ATX:
- return Qt::Key_Hangul;
-// KD_KEY_HANJAMODE_ATX
- case KD_KEY_HELP_ATX:
- return Qt::Key_Help;
- case KD_KEY_HIRAGANA_ATX:
- return Qt::Key_Hiragana;
- case KD_KEY_HOME_ATX:
- return Qt::Key_Home;
- case KD_KEY_INSERT_ATX:
- return Qt::Key_Insert;
-// KD_KEY_JAPANESEHIRAGANA_ATX:
-// KD_KEY_JAPANESEKATAKANA_ATX
-// KD_KEY_JAPANESEROMAJI_ATX
-// KD_KEY_JUNJAMODE_ATX
- case KD_KEY_KANAMODE_ATX:
- return Qt::Key_Kana_Lock; //?
- case KD_KEY_KANJIMODE_ATX:
- return Qt::Key_Kanji;
-// KD_KEY_KATAKANA_ATX
-// KD_KEY_LAUNCHAPPLICATION1_ATX
-// KD_KEY_LAUNCHAPPLICATION2_ATX
- case KD_KEY_LAUNCHMAIL_ATX:
- return Qt::Key_MailForward;
- case KD_KEY_LEFT_ATX:
- return Qt::Key_Left;
- case KD_KEY_META_ATX:
- return Qt::Key_Meta;
- case KD_KEY_MEDIANEXTTRACK_ATX:
- return Qt::Key_MediaNext;
- case KD_KEY_MEDIAPLAYPAUSE_ATX:
- return Qt::Key_MediaPause;
- case KD_KEY_MEDIAPREVIOUSTRACK_ATX:
- return Qt::Key_MediaPrevious;
- case KD_KEY_MEDIASTOP_ATX:
- return Qt::Key_MediaStop;
- case KD_KEY_MODECHANGE_ATX:
- return Qt::Key_Mode_switch;
-// KD_KEY_NONCONVERT_ATX
- case KD_KEY_NUMLOCK_ATX:
- return Qt::Key_NumLock;
- case KD_KEY_PAGEDOWN_ATX:
- return Qt::Key_PageDown;
- case KD_KEY_PAGEUP_ATX:
- return Qt::Key_PageUp;
- case KD_KEY_PASTE_ATX:
- return Qt::Key_Paste;
- case KD_KEY_PAUSE_ATX:
- return Qt::Key_Pause;
- case KD_KEY_PLAY_ATX:
- return Qt::Key_Play;
-// KD_KEY_PREVIOUSCANDIDATE_ATX
- case KD_KEY_PRINTSCREEN_ATX:
- return Qt::Key_Print;
-// case KD_KEY_PROCESS_ATX
-// case KD_KEY_PROPS_ATX
- case KD_KEY_RIGHT_ATX:
- return Qt::Key_Right;
-// KD_KEY_ROMANCHARACTERS_ATX
- case KD_KEY_SCROLL_ATX:
- return Qt::Key_ScrollLock;
- case KD_KEY_SELECT_ATX:
- return Qt::Key_Select;
-// KD_KEY_SELECTMEDIA_ATX
- case KD_KEY_SHIFT_ATX:
- return Qt::Key_Shift;
- case KD_KEY_STOP_ATX:
- return Qt::Key_Stop;
- case KD_KEY_UP_ATX:
- return Qt::Key_Up;
-// KD_KEY_UNDO_ATX
- case KD_KEY_VOLUMEDOWN_ATX:
- return Qt::Key_VolumeDown;
- case KD_KEY_VOLUMEMUTE_ATX:
- return Qt::Key_VolumeMute;
- case KD_KEY_VOLUMEUP_ATX:
- return Qt::Key_VolumeUp;
- case KD_KEY_WIN_ATX:
- return Qt::Key_Meta;
- case KD_KEY_ZOOM_ATX:
- return Qt::Key_Zoom;
- case 0x8:
- return Qt::Key_Backspace;
- case 0x1b:
- return Qt::Key_Escape;
- case 0x9:
- return Qt::Key_Tab;
-
- default:
- break;
- }
-
- return Qt::Key_Escape;
-}
-
-QT_END_NAMESPACE
-#endif //KD_ATX_keyboard
-#endif // OPENKODEKEYTRANSLATOR_H
diff --git a/src/plugins/platforms/openkode/qopenkodeeventloopintegration.cpp b/src/plugins/platforms/openkode/qopenkodeeventloopintegration.cpp
deleted file mode 100644
index b0890ccbae..0000000000
--- a/src/plugins/platforms/openkode/qopenkodeeventloopintegration.cpp
+++ /dev/null
@@ -1,128 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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, Nokia gives you certain additional
-** rights. These rights are described in the Nokia 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.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qopenkodeeventloopintegration.h"
-
-#include <QDebug>
-
-#include <KD/kd.h>
-#include <KD/ATX_keyboard.h>
-
-QT_BEGIN_NAMESPACE
-
-static const int QT_EVENT_WAKEUP_EVENTLOOP = KD_EVENT_USER + 1;
-
-void kdprocessevent( const KDEvent *event)
-{
- switch (event->type) {
- case KD_EVENT_INPUT:
- qDebug() << "KD_EVENT_INPUT";
- break;
- case KD_EVENT_INPUT_POINTER:
- qDebug() << "KD_EVENT_INPUT_POINTER";
- break;
- case KD_EVENT_WINDOW_CLOSE:
- qDebug() << "KD_EVENT_WINDOW_CLOSE";
- break;
- case KD_EVENT_WINDOWPROPERTY_CHANGE:
- qDebug() << "KD_EVENT_WINDOWPROPERTY_CHANGE";
- qDebug() << event->data.windowproperty.pname;
- break;
- case KD_EVENT_WINDOW_FOCUS:
- qDebug() << "KD_EVENT_WINDOW_FOCUS";
- break;
- case KD_EVENT_WINDOW_REDRAW:
- qDebug() << "KD_EVENT_WINDOW_REDRAW";
- break;
- case KD_EVENT_USER:
- qDebug() << "KD_EVENT_USER";
- break;
- case KD_EVENT_INPUT_KEY_ATX:
- qDebug() << "KD_EVENT_INPUT_KEY_ATX";
- break;
- case QT_EVENT_WAKEUP_EVENTLOOP:
- QPlatformEventLoopIntegration::processEvents();
- break;
- default:
- break;
- }
-
- kdDefaultEvent(event);
-
-}
-
-QOpenKODEEventLoopIntegration::QOpenKODEEventLoopIntegration()
- : m_quit(false)
-{
- m_kdThread = kdThreadSelf();
- kdInstallCallback(&kdprocessevent,QT_EVENT_WAKEUP_EVENTLOOP,this);
-}
-
-void QOpenKODEEventLoopIntegration::startEventLoop()
-{
-
- while(!m_quit) {
- qint64 msec = nextTimerEvent();
- const KDEvent *event = kdWaitEvent(msec);
- if (event) {
- kdDefaultEvent(event);
- while ((event = kdWaitEvent(0)) != 0) {
- kdDefaultEvent(event);
- }
- }
- QPlatformEventLoopIntegration::processEvents();
- }
-}
-
-void QOpenKODEEventLoopIntegration::quitEventLoop()
-{
- m_quit = true;
-}
-
-void QOpenKODEEventLoopIntegration::qtNeedsToProcessEvents()
-{
- KDEvent *event = kdCreateEvent();
- event->type = QT_EVENT_WAKEUP_EVENTLOOP;
- event->userptr = this;
- kdPostThreadEvent(event,m_kdThread);
-}
-
-QT_END_NAMESPACE
diff --git a/src/plugins/platforms/openkode/qopenkodeintegration.cpp b/src/plugins/platforms/openkode/qopenkodeintegration.cpp
deleted file mode 100644
index 705f332826..0000000000
--- a/src/plugins/platforms/openkode/qopenkodeintegration.cpp
+++ /dev/null
@@ -1,247 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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, Nokia gives you certain additional
-** rights. These rights are described in the Nokia 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.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qopenkodeintegration.h"
-#include "qopenkodewindow.h"
-#include "qopenkodeeventloopintegration.h"
-
-#include <QtOpenGL/qplatformpixmap_gl_p.h>
-#include <QtOpenGL/private/qwindowsurface_gl_p.h>
-
-#include <QtGui/private/qpixmap_raster_p.h>
-
-#include <QtCore/qdebug.h>
-#include <QtCore/qthread.h>
-#include <QtCore/qfile.h>
-
-#include "qgenericunixfontdatabase.h"
-
-#include <KD/kd.h>
-#include <KD/NV_display.h>
-#include <KD/NV_initialize.h>
-
-#include <EGL/egl.h>
-
-#include "GLES2/gl2ext.h"
-
-QT_BEGIN_NAMESPACE
-
-QOpenKODEScreen::QOpenKODEScreen(KDDisplayNV *kdDisplay, KDDesktopNV *kdDesktop)
- : mIsFullScreen(false)
-{
- qDebug() << "QOpenKODEScreen::QOpenKODEIntegrationScreen()";
-
- KDboolean enabled = KD_TRUE;
- kdSetDisplayPropertybvNV(kdDisplay,
- KD_DISPLAYPROPERTY_ENABLED_NV,
- &enabled);
- KDboolean power = KD_DISPLAY_POWER_ON;
- kdSetDisplayPropertyivNV(kdDisplay,
- KD_DISPLAYPROPERTY_POWER_NV,
- &power);
-
- kdSetDisplayPropertycvNV(kdDisplay,
- KD_DISPLAYPROPERTY_DESKTOP_NAME_NV,
- KD_DEFAULT_DESKTOP_NV);
-
- KDDisplayModeNV mode;
- if (kdGetDisplayModeNV(kdDisplay, &mode)) {
- qErrnoWarning(kdGetError(), "Could not get display mode");
- return;
- }
-
- qDebug() << " - display mode " << mode.width << "x" << mode.height << " refresh " << mode.refresh;
-
- KDint desktopSize[] = { mode.width, mode.height };
-
- if (kdSetDesktopPropertyivNV(kdDesktop, KD_DESKTOPPROPERTY_SIZE_NV, desktopSize)) {
- qErrnoWarning(kdGetError(), "Could not set desktop size");
- return;
- }
-
- // Once we've set up the desktop and display we don't need them anymore
- kdReleaseDisplayNV(kdDisplay);
- kdReleaseDesktopNV(kdDesktop);
-
- mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
- if (mEglDisplay == EGL_NO_DISPLAY) {
- qErrnoWarning("EGL failed to obtain display");
- }
-
- /* Initialize EGL display */
- EGLBoolean rvbool = eglInitialize(mEglDisplay, 0, 0);
- if (!rvbool) {
- qErrnoWarning("EGL failed to initialize display");
- }
-
-// cursor = new QOpenKODECursor(this);
-
- mGeometry = QRect(0, 0, mode.width, mode.height);
- mDepth = 24;
- mFormat = QImage::Format_RGB32;
-
-
-}
-
-QOpenKODEIntegration::QOpenKODEIntegration()
- : mEventLoopIntegration(0)
- , mFontDb(new QGenericUnixFontDatabase())
- , mMainGlContext(0)
-{
- if (kdInitializeNV() == KD_ENOTINITIALIZED) {
- qFatal("Did not manage to initialize openkode");
- }
-
- KDDisplaySystemNV *kdDisplaySystem = kdCreateDisplaySystemSnapshotNV(this);
- KDint32 displayCount = 0;
- kdGetDisplaySystemPropertyivNV(kdDisplaySystem, KD_DISPLAYPROPERTY_COUNT_NV, 0, &displayCount);
-
- for (int i = 0; i < displayCount; i++) {
- KDchar *displayName = 0;
- KDsize displayNameLength = 0;
- kdGetDisplaySystemPropertycvNV(kdDisplaySystem,KD_DISPLAYPROPERTY_NAME_NV,i,0,&displayNameLength);
- if (!displayNameLength)
- continue;
- displayName = new KDchar[displayNameLength];
- kdGetDisplaySystemPropertycvNV(kdDisplaySystem,KD_DISPLAYPROPERTY_NAME_NV,i,displayName,&displayNameLength);
-
- KDDisplayNV *display = kdGetDisplayNV(displayName,this);
- if (!display || display == (void*)-1) {
- qErrnoWarning(kdGetError(), "Could not obtain KDDisplayNV pointer");
- return;
- }
- if (displayNameLength)
- delete[] displayName;
-
- KDchar *desktopName = 0;
- KDsize desktopNameLength = 0;
- bool openkodeImpDoesNotFail = false;
- if (openkodeImpDoesNotFail) {
- qDebug() << "printing desktopname";
- kdGetDisplayPropertycvNV(display,KD_DISPLAYPROPERTY_DESKTOP_NAME_NV,desktopName,&desktopNameLength);
- if (desktopNameLength) {
- desktopName = new KDchar[desktopNameLength];
- kdGetDisplayPropertycvNV(display,KD_DISPLAYPROPERTY_DESKTOP_NAME_NV,desktopName,&desktopNameLength);
- } else {
- desktopName = KD_DEFAULT_DESKTOP_NV;
- }
- } else {
- desktopName = KD_DEFAULT_DESKTOP_NV;
- }
-
- KDDesktopNV *desktop = kdGetDesktopNV(desktopName,this);
- if (!desktop || desktop == (void*)-1) {
- qErrnoWarning(kdGetError(), "Could not obtain KDDesktopNV pointer");
- kdReleaseDisplayNV(display);
- return;
- }
- if (desktopNameLength)
- delete desktopName;
-
- QOpenKODEScreen *screen = new QOpenKODEScreen(display,desktop);
- mScreens.append(screen);
- }
-}
-
-QOpenKODEIntegration::~QOpenKODEIntegration()
-{
- delete mEventLoopIntegration;
- delete mFontDb;
-}
-
-
-bool QOpenKODEIntegration::hasCapability(QPlatformIntegration::Capability cap) const
-{
- switch (cap) {
- case ThreadedPixmaps: return true;
- case OpenGL: return true;
- default: return QPlatformIntegration::hasCapability(cap);
- }
-}
-
-QPlatformPixmap *QOpenKODEIntegration::createPlatformPixmap(QPlatformPixmap::PixelType type) const
-{
- return new QGLPlatformPixmap(type);
-}
-
-QPlatformWindow *QOpenKODEIntegration::createPlatformWindow(QWidget *tlw, WId ) const
-{
- return new QOpenKODEWindow(tlw);
-}
-
-QWindowSurface *QOpenKODEIntegration::createWindowSurface(QWidget *widget, WId) const
-{
- QWindowSurface *returnSurface = 0;
- switch (widget->platformWindowFormat().windowApi()) {
-
- case QPlatformWindowFormat::Raster:
- case QPlatformWindowFormat::OpenGL:
- returnSurface = new QGLWindowSurface(widget);
- break;
-
- case QPlatformWindowFormat::OpenVG:
-// returnSurface = new QVGWindowSurface(widget);
-// break;
-
- default:
- returnSurface = new QGLWindowSurface(widget);
- break;
- }
-
- return returnSurface;
-}
-
-QPlatformEventLoopIntegration *QOpenKODEIntegration::createEventLoopIntegration() const
-{
- if (!mEventLoopIntegration) {
- QOpenKODEIntegration *that = const_cast<QOpenKODEIntegration *>(this);
- that->mEventLoopIntegration = new QOpenKODEEventLoopIntegration;
- }
- return mEventLoopIntegration;
-}
-
-QPlatformFontDatabase *QOpenKODEIntegration::fontDatabase() const
-{
- return mFontDb;
-}
-
-
-QT_END_NAMESPACE
diff --git a/src/plugins/platforms/openkode/qopenkodeintegration.h b/src/plugins/platforms/openkode/qopenkodeintegration.h
deleted file mode 100644
index 31d76dcad7..0000000000
--- a/src/plugins/platforms/openkode/qopenkodeintegration.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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, Nokia gives you certain additional
-** rights. These rights are described in the Nokia 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.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QGRAPHICSSYSTEM_OPENKODE_H
-#define QGRAPHICSSYSTEM_OPENKODE_H
-
-#include "qopenkodeeventloopintegration.h"
-
-#include <QtCore/qsemaphore.h>
-
-#include <QtGui/QPlatformIntegration>
-#include <QtGui/QPlatformScreen>
-#include <QtGui/QPlatformOpenGLContext>
-#include <QtGui/QPlatformFontDatabase>
-
-#include <GLES2/gl2.h>
-#include <EGL/egl.h>
-
-QT_BEGIN_HEADER
-QT_BEGIN_NAMESPACE
-
-struct KDDesktopNV;
-struct KDDisplayNV;
-class QOpenKODECursor;
-
-class QOpenKODEScreen : public QPlatformScreen
-{
- Q_OBJECT
-public:
- QOpenKODEScreen(KDDisplayNV *kdDisplay, KDDesktopNV *kdDesktop);
- ~QOpenKODEScreen() {}
-
- QRect geometry() const { return mGeometry; }
- int depth() const { return mDepth; }
- QImage::Format format() const { return mFormat; }
-
- EGLDisplay eglDisplay() { return mEglDisplay; }
-
- bool isFullScreen() const {return mIsFullScreen;}
- void setFullScreen(bool fullscreen) { mIsFullScreen = fullscreen; }
-private:
- QRect mGeometry;
- int mDepth;
- QImage::Format mFormat;
- EGLDisplay mEglDisplay;
- bool mIsFullScreen;
-};
-
-class QOpenKODEIntegration : public QPlatformIntegration
-{
-public:
- QOpenKODEIntegration();
- ~QOpenKODEIntegration();
-
- bool hasCapability(QPlatformIntegration::Capability cap) const;
-
- QPlatformPixmap *createPlatformPixmap(QPlatformPixmap::PixelType type) const;
- QPlatformWindow *createPlatformWindow(QWidget *widget, WId winId = 0) const;
- QWindowSurface *createWindowSurface(QWidget *widget, WId winId) const;
-
- QPlatformEventLoopIntegration *createEventLoopIntegration() const;
-
- QPlatformFontDatabase *fontDatabase() const;
-
- virtual QList<QPlatformScreen *> screens() const { return mScreens; }
-
- static GLuint blitterProgram();
-
- void setMainGLContext(QEGLPlatformContext *ctx) { mMainGlContext = ctx; }
- void mainGLContext() const { return mMainGlContext; }
-
-private:
- QList<QPlatformScreen *> mScreens;
- QOpenKODEEventLoopIntegration *mEventLoopIntegration;
- QPlatformFontDatabase *mFontDb;
- QEGLPlatformContext *mMainGlContext;
-};
-
-QT_END_NAMESPACE
-QT_END_HEADER
-
-#endif
diff --git a/src/plugins/platforms/openkode/qopenkodewindow.cpp b/src/plugins/platforms/openkode/qopenkodewindow.cpp
deleted file mode 100644
index 23bcd12440..0000000000
--- a/src/plugins/platforms/openkode/qopenkodewindow.cpp
+++ /dev/null
@@ -1,315 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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, Nokia gives you certain additional
-** rights. These rights are described in the Nokia 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.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qopenkodewindow.h"
-#include "qopenkodeintegration.h"
-#include "../eglconvenience/qeglplatformcontext.h"
-#include "../eglconvenience/qeglconvenience.h"
-
-#include <KD/kd.h>
-#include <KD/NV_display.h>
-#include <KD/kdplatform.h>
-#ifdef KD_ATX_keyboard
-#include "openkodekeytranslator.h"
-#endif
-
-#include <EGL/egl.h>
-
-#include <QtWidgets/qwidget.h>
-#include <QtGui/private/qwidget_p.h>
-#include <QtGui/private/qapplication_p.h>
-
-#include <QtCore/qvector.h>
-#include <QtCore/QDebug>
-
-QT_BEGIN_NAMESPACE
-
-void kdProcessMouseEvents( const KDEvent *event )
-{
- QOpenKODEWindow *window = static_cast<QOpenKODEWindow *>(event->userptr);
- window->processMouseEvents(event);
-}
-
-#ifdef KD_ATX_keyboard
-void kdProcessKeyEvents( const KDEvent *event )
-{
- QOpenKODEWindow *window = static_cast<QOpenKODEWindow *>(event->userptr);
- window->processKeyEvents(event);
-}
-#endif //KD_ATX_keyboard
-
-QOpenKODEWindow::QOpenKODEWindow(QWidget *tlw)
- : QPlatformWindow(tlw), isFullScreen(false)
-{
- if (tlw->platformWindowFormat().windowApi() == QPlatformWindowFormat::OpenVG) {
- m_eglApi = EGL_OPENVG_API;
- } else {
- m_eglContextAttrs.append(EGL_CONTEXT_CLIENT_VERSION);
- m_eglContextAttrs.append(2);
-
- m_eglApi = EGL_OPENGL_ES_API;
- }
- eglBindAPI(m_eglApi);
-
- m_eglContextAttrs.append(EGL_NONE);
- m_eglWindowAttrs.append(EGL_NONE);
-
- QList<QPlatformScreen *> screens = QApplicationPrivate::platformIntegration()->screens();
- //XXXX: jl figure out how to pick the correct screen.
-// Q_ASSERT(screens.size() > tlw->d_func()->screenNumber);
-// QOpenKODEScreen *screen = qobject_cast<QOpenKODEScreen *>(screens.at(tlw->d_func()->screenNumber));
- QOpenKODEScreen *screen = qobject_cast<QOpenKODEScreen *>(screens.at(0));
- if (!screen) {
- qErrnoWarning("Could not make QOpenKODEWindow without a screen");
- }
-
- QPlatformWindowFormat format = tlw->platformWindowFormat();
- format.setRedBufferSize(5);
- format.setGreenBufferSize(6);
- format.setBlueBufferSize(5);
-
- m_eglConfig = q_configFromQPlatformWindowFormat(screen->eglDisplay(),format);
-
- m_kdWindow = kdCreateWindow(screen->eglDisplay(),
- m_eglConfig,
- this);
- kdInstallCallback(kdProcessMouseEvents,KD_EVENT_INPUT_POINTER,this);
-#ifdef KD_ATX_keyboard
- kdInstallCallback(kdProcessKeyEvents, KD_EVENT_INPUT_KEY_ATX,this);
-#endif //KD_ATX_keyboard
-
- if (!m_kdWindow) {
- qErrnoWarning(kdGetError(), "Error creating native window");
- return;
- }
-
- KDboolean exclusive(false);
- if (kdSetWindowPropertybv(m_kdWindow,KD_WINDOWPROPERTY_DESKTOP_EXCLUSIVE_NV, &exclusive)) {
- isFullScreen = true;
- }
-
- if (isFullScreen) {
- tlw->setGeometry(screen->geometry());
- screen->setFullScreen(isFullScreen);
- }else {
- const KDint windowSize[2] = { tlw->width(), tlw->height() };
- if (kdSetWindowPropertyiv(m_kdWindow, KD_WINDOWPROPERTY_SIZE, windowSize)) {
- qErrnoWarning(kdGetError(), "Could not set native window size");
- }
- KDboolean visibillity(false);
- if (kdSetWindowPropertybv(m_kdWindow, KD_WINDOWPROPERTY_VISIBILITY, &visibillity)) {
- qErrnoWarning(kdGetError(), "Could not set visibillity to false");
- }
-
- const KDint windowPos[2] = { tlw->x(), tlw->y() };
- if (kdSetWindowPropertyiv(m_kdWindow, KD_WINDOWPROPERTY_DESKTOP_OFFSET_NV, windowPos)) {
- qErrnoWarning(kdGetError(), "Could not set native window position");
- return;
- }
- }
-
-
- QOpenKODEIntegration *integration = static_cast<QOpenKODEIntegration *>(QApplicationPrivate::platformIntegration());
-
- if (!isFullScreen || (isFullScreen && !integration->mainGLContext())) {
- if (kdRealizeWindow(m_kdWindow, &m_eglWindow)) {
- qErrnoWarning(kdGetError(), "Could not realize native window");
- return;
- }
-
- EGLSurface surface = eglCreateWindowSurface(screen->eglDisplay(),m_eglConfig,m_eglWindow,m_eglWindowAttrs.constData());
- m_platformGlContext = new QEGLPlatformContext(screen->eglDisplay(), m_eglConfig,
- m_eglContextAttrs.data(), surface, m_eglApi);
- integration->setMainGLContext(m_platformGLContext);
- } else {
- m_platformGlContext = integration->mainGLContext();
- kdDestroyWindow(m_kdWindow);
- m_kdWindow = 0;
- }
-}
-
-
-QOpenKODEWindow::~QOpenKODEWindow()
-{
- if (m_platformGlContext != static_cast<QOpenKODEIntegration *>(QApplicationPrivate::platformIntegration())) {
- delete m_platformGlContext;
- }
- if (m_kdWindow)
- kdDestroyWindow(m_kdWindow);
-}
-void QOpenKODEWindow::setGeometry(const QRect &rect)
-{
- if (isFullScreen) {
- QList<QPlatformScreen *> screens = QApplicationPrivate::platformIntegration()->screens();
- QOpenKODEScreen *screen = qobject_cast<QOpenKODEScreen *>(screens.at(0));
- widget()->setGeometry(screen->geometry());
- return;
- }
- bool needToDeleteContext = false;
- if (!isFullScreen) {
- const QRect geo = geometry();
- if (geo.size() != rect.size()) {
- const KDint windowSize[2] = { rect.width(), rect.height() };
- if (kdSetWindowPropertyiv(m_kdWindow, KD_WINDOWPROPERTY_SIZE, windowSize)) {
- qErrnoWarning(kdGetError(), "Could not set native window size");
- //return;
- } else {
- needToDeleteContext = true;
- }
- }
-
- if (geo.topLeft() != rect.topLeft()) {
- const KDint windowPos[2] = { rect.x(), rect.y() };
- if (kdSetWindowPropertyiv(m_kdWindow, KD_WINDOWPROPERTY_DESKTOP_OFFSET_NV, windowPos)) {
- qErrnoWarning(kdGetError(), "Could not set native window position");
- //return;
- } else {
- needToDeleteContext = true;
- }
- }
- }
-
- //need to recreate context
- if (needToDeleteContext) {
- delete m_platformGlContext;
-
- QList<QPlatformScreen *> screens = QApplicationPrivate::platformIntegration()->screens();
- QOpenKODEScreen *screen = qobject_cast<QOpenKODEScreen *>(screens.at(0));
- EGLSurface surface = eglCreateWindowSurface(screen->eglDisplay(),m_eglConfig,m_eglWindow,m_eglWindowAttrs.constData());
- m_platformGlContext = new QEGLPlatformContext(screen->eglDisplay(),m_eglConfig,
- m_eglContextAttrs.data(),surface,m_eglApi);
- }
-}
-
-void QOpenKODEWindow::setVisible(bool visible)
-{
- if (!m_kdWindow)
- return;
- KDboolean visibillity(visible);
- if (kdSetWindowPropertybv(m_kdWindow, KD_WINDOWPROPERTY_VISIBILITY, &visibillity)) {
- qErrnoWarning(kdGetError(), "Could not set visibillity property");
- }
-}
-
-WId QOpenKODEWindow::winId() const
-{
- static int i = 0;
- return i++;
-}
-
-QPlatformOpenGLContext *QOpenKODEWindow::glContext() const
-{
- return m_platformGlContext;
-}
-
-void QOpenKODEWindow::raise()
-{
- if (!m_kdWindow)
- return;
- KDboolean focus(true);
- if (kdSetWindowPropertybv(m_kdWindow, KD_WINDOWPROPERTY_FOCUS, &focus)) {
- qErrnoWarning(kdGetError(), "Could not set focus");
- }
-}
-
-void QOpenKODEWindow::lower()
-{
- if (!m_kdWindow)
- return;
- KDboolean focus(false);
- if (kdSetWindowPropertybv(m_kdWindow, KD_WINDOWPROPERTY_FOCUS, &focus)) {
- qErrnoWarning(kdGetError(), "Could not set focus");
- }
-}
-
-void QOpenKODEWindow::processMouseEvents(const KDEvent *event)
-{
- int x = event->data.inputpointer.x;
- int y = event->data.inputpointer.y;
- Qt::MouseButtons buttons;
- switch(event->data.inputpointer.select) {
- case 1:
- buttons = Qt::LeftButton;
- break;
- default:
- buttons = Qt::NoButton;
- }
- QPoint pos(x,y);
- QWindowSystemInterface::handleMouseEvent(0,event->timestamp,pos,pos,buttons);
-}
-
-void QOpenKODEWindow::processKeyEvents(const KDEvent *event)
-{
-#ifdef KD_ATX_keyboard
- //KD_KEY_PRESS_ATX 1
- QEvent::Type keyPressed = QEvent::KeyRelease;
- if (event->data.keyboardInputKey.flags)
- keyPressed = QEvent::KeyPress;
-//KD_KEY_LOCATION_LEFT_ATX // dont care for now
-//KD_KEY_LOCATION_RIGHT_ATX
-//KD_KEY_LOCATION_NUMPAD_ATX
- Qt::KeyboardModifiers mod = Qt::NoModifier;
- int openkodeMods = event->data.keyboardInputKey.flags;
- if (openkodeMods & KD_KEY_MODIFIER_SHIFT_ATX)
- mod |= Qt::ShiftModifier;
- if (openkodeMods & KD_KEY_MODIFIER_CTRL_ATX)
- mod |= Qt::ControlModifier;
- if (openkodeMods & KD_KEY_MODIFIER_ALT_ATX)
- mod |= Qt::AltModifier;
- if (openkodeMods & KD_KEY_MODIFIER_META_ATX)
- mod |= Qt::MetaModifier;
-
- Qt::Key qtKey;
- QChar keyText;
- int key = event->data.keyboardInputKey.keycode;
- if (key >= 0x20 && key <= 0x0ff){ // 8 bit printable Latin1
- qtKey = Qt::Key(key);
- keyText = QChar(event->data.keyboardInputKeyChar.character);
- if (!(mod & Qt::ShiftModifier))
- keyText = keyText.toLower();
- } else {
- qtKey = keyTranslator(key);
- }
- QWindowSystemInterface::handleKeyEvent(0,event->timestamp,keyPressed,qtKey,mod,keyText);
-#endif
-}
-
-QT_END_NAMESPACE
diff --git a/src/plugins/platforms/openkode/qopenkodewindow.h b/src/plugins/platforms/openkode/qopenkodewindow.h
deleted file mode 100644
index 7685350eb8..0000000000
--- a/src/plugins/platforms/openkode/qopenkodewindow.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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, Nokia gives you certain additional
-** rights. These rights are described in the Nokia 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.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QOPENKODEWINDOW_H
-#define QOPENKODEWINDOW_H
-
-#include <QtGui/QPlatformWindow>
-#include <QtCore/QVector>
-
-#include <KD/kd.h>
-
-QT_BEGIN_HEADER
-QT_BEGIN_NAMESPACE
-
-class QEGLPlatformContext;
-class QPlatformEventLoopIntegration;
-
-class QOpenKODEWindow : public QPlatformWindow
-{
-public:
- QOpenKODEWindow(QWidget *tlw);
- ~QOpenKODEWindow();
-
- void setGeometry(const QRect &rect);
- void setVisible(bool visible);
- WId winId() const;
-
- QPlatformOpenGLContext *glContext() const;
-
- void raise();
- void lower();
-
- void processKeyEvents( const KDEvent *event );
- void processMouseEvents( const KDEvent *event );
-
-private:
- struct KDWindow *m_kdWindow;
- EGLNativeWindowType m_eglWindow;
- EGLConfig m_eglConfig;
- QVector<EGLint> m_eglWindowAttrs;
- QVector<EGLint> m_eglContextAttrs;
- EGLenum m_eglApi;
- QEGLPlatformContext *m_platformGlContext;
-
- bool isFullScreen;
-};
-
-QT_END_NAMESPACE
-QT_END_HEADER
-
-#endif //QOPENKODEWINDOW_H
diff --git a/src/plugins/platforms/openkode/resources.qrc b/src/plugins/platforms/openkode/resources.qrc
deleted file mode 100644
index dbb34199ff..0000000000
--- a/src/plugins/platforms/openkode/resources.qrc
+++ /dev/null
@@ -1,6 +0,0 @@
-<!DOCTYPE RCC><RCC version="1.0">
-<qresource>
- <file>shaders/vert.glslv</file>
- <file>shaders/frag.glslf</file>
-</qresource>
-</RCC>
diff --git a/src/plugins/platforms/openvglite/openvglite.pro b/src/plugins/platforms/openvglite/openvglite.pro
deleted file mode 100644
index bb7efe9bf3..0000000000
--- a/src/plugins/platforms/openvglite/openvglite.pro
+++ /dev/null
@@ -1,12 +0,0 @@
-TARGET = qvglitegraphicssystem
-load(qt_plugin)
-
-QT += openvg
-
-DESTDIR = $$QT.gui.plugins/graphicssystems
-
-SOURCES = main.cpp qgraphicssystem_vglite.cpp qwindowsurface_vglite.cpp
-HEADERS = qgraphicssystem_vglite.h qwindowsurface_vglite.h
-
-target.path += $$[QT_INSTALL_PLUGINS]/graphicssystems
-INSTALLS += target
diff --git a/src/plugins/platforms/openvglite/qgraphicssystem_vglite.cpp b/src/plugins/platforms/openvglite/qgraphicssystem_vglite.cpp
deleted file mode 100644
index f5b154fd38..0000000000
--- a/src/plugins/platforms/openvglite/qgraphicssystem_vglite.cpp
+++ /dev/null
@@ -1,193 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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, Nokia gives you certain additional
-** rights. These rights are described in the Nokia 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.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qgraphicssystem_vglite.h"
-#include "qwindowsurface_vglite.h"
-#include <QtOpenVG/qplatformpixmap_vg_p.h>
-#include <QtGui/private/qegl_p.h>
-#include <QtCore/qdebug.h>
-#ifdef OPENVG_USBHP_INIT
-extern "C" {
-#include <linuxusbhp.h>
-};
-#endif
-
-QT_BEGIN_NAMESPACE
-
-QVGLiteGraphicsSystem::QVGLiteGraphicsSystem()
- : w(0), h(0), d(0), dw(0), dh(0), physWidth(0), physHeight(0),
- surface(0), context(0), rootWindow(0),
- screenFormat(QImage::Format_RGB16), preservedSwap(false)
-{
-#ifdef OPENVG_USBHP_INIT
- initLibrary();
-#endif
-
- // The graphics system is also the screen definition.
- mScreens.append(this);
-
- QString displaySpec = QString::fromLatin1(qgetenv("QWS_DISPLAY"));
- QStringList displayArgs = displaySpec.split(QLatin1Char(':'));
-
- // Initialize EGL and create the global EGL context.
- context = qt_vg_create_context(0);
- if (!context) {
- qFatal("QVGLiteGraphicsSystem: could not initialize EGL");
- return;
- }
-
- // Get the root window handle to use. Default to zero.
- QRegExp winidRx(QLatin1String("winid=?(\\d+)"));
- int winidIdx = displayArgs.indexOf(winidRx);
- int handle = 0;
- if (winidIdx >= 0) {
- winidRx.exactMatch(displayArgs.at(winidIdx));
- handle = winidRx.cap(1).toInt();
- }
-
- // Create a full-screen window based on the native handle.
- // If the context is premultiplied, the window should be too.
- QEglProperties props;
-#ifdef EGL_VG_ALPHA_FORMAT_PRE_BIT
- EGLint surfaceType = 0;
- if (context->configAttrib(EGL_SURFACE_TYPE, &surfaceType) &&
- (surfaceType & EGL_VG_ALPHA_FORMAT_PRE_BIT) != 0)
- props.setValue(EGL_VG_ALPHA_FORMAT, EGL_VG_ALPHA_FORMAT_PRE);
-#endif
- rootWindow = eglCreateWindowSurface
- (context->display(), context->config(),
- (EGLNativeWindowType)handle, props.properties());
- if (rootWindow == EGL_NO_SURFACE) {
- delete context;
- context = 0;
- qFatal("QVGLiteGraphicsSystem: could not create full-screen window");
- return;
- }
-
- // Try to turn on preserved swap behaviour on the root window.
- // This will allow us to optimize compositing to focus on just
- // the screen region that has changed. Otherwise we must
- // re-composite the entire screen every frame.
-#if !defined(QVG_NO_PRESERVED_SWAP)
- eglGetError(); // Clear error state first.
- eglSurfaceAttrib(context->display(), rootWindow,
- EGL_SWAP_BEHAVIOR, EGL_BUFFER_PRESERVED);
- preservedSwap = (eglGetError() == EGL_SUCCESS);
-#else
- preservedSwap = false;
-#endif
-
- // Fetch the root window properties.
- eglQuerySurface(context->display(), rootWindow, EGL_WIDTH, &w);
- eglQuerySurface(context->display(), rootWindow, EGL_HEIGHT, &h);
- screenFormat = qt_vg_config_to_image_format(context);
- switch (screenFormat) {
- case QImage::Format_ARGB32_Premultiplied:
- case QImage::Format_ARGB32:
- case QImage::Format_RGB32:
- default:
- d = 32;
- break;
- case QImage::Format_RGB16:
- case QImage::Format_ARGB4444_Premultiplied:
- d = 16;
- break;
- }
- dw = w;
- dh = h;
- qDebug("screen size: %dx%dx%d", w, h, d);
-
- // Handle display physical size spec. From qscreenlinuxfb_qws.cpp.
- QRegExp mmWidthRx(QLatin1String("mmWidth=?(\\d+)"));
- int dimIdxW = displayArgs.indexOf(mmWidthRx);
- QRegExp mmHeightRx(QLatin1String("mmHeight=?(\\d+)"));
- int dimIdxH = displayArgs.indexOf(mmHeightRx);
- if (dimIdxW >= 0) {
- mmWidthRx.exactMatch(displayArgs.at(dimIdxW));
- physWidth = mmWidthRx.cap(1).toInt();
- if (dimIdxH < 0)
- physHeight = dh*physWidth/dw;
- }
- if (dimIdxH >= 0) {
- mmHeightRx.exactMatch(displayArgs.at(dimIdxH));
- physHeight = mmHeightRx.cap(1).toInt();
- if (dimIdxW < 0)
- physWidth = dw*physHeight/dh;
- }
- if (dimIdxW < 0 && dimIdxH < 0) {
- const int dpi = 72;
- physWidth = qRound(dw * 25.4 / dpi);
- physHeight = qRound(dh * 25.4 / dpi);
- }
-}
-
-QVGLiteGraphicsSystem::~QVGLiteGraphicsSystem()
-{
-}
-
-QPlatformPixmap *QVGLiteGraphicsSystem::createPlatformPixmap(QPlatformPixmap::PixelType type) const
-{
-#if !defined(QVGLite_NO_SINGLE_CONTEXT) && !defined(QVGLite_NO_PIXMAP_DATA)
- // Pixmaps can use QVGLitePlatformPixmap; bitmaps must use raster.
- if (type == QPlatformPixmap::PixmapType)
- return new QVGPlatformPixmap(type);
- else
- return new QRasterPlatformPixmap(type);
-#else
- return new QRasterPlatformPixmap(type);
-#endif
-}
-
-QWindowSurface *QVGLiteGraphicsSystem::createWindowSurface(QWidget *widget) const
-{
- if (widget->windowType() == Qt::Desktop)
- return 0; // Don't create an explicit window surface for the destkop.
- if (surface) {
- qWarning() << "QVGLiteGraphicsSystem: only one window surface "
- "is supported at a time";
- return 0;
- }
- surface = new QVGLiteWindowSurface
- (const_cast<QVGLiteGraphicsSystem *>(this), widget);
- return surface;
-}
-
-QT_END_NAMESPACE
diff --git a/src/plugins/platforms/openvglite/qwindowsurface_vglite.cpp b/src/plugins/platforms/openvglite/qwindowsurface_vglite.cpp
deleted file mode 100644
index f50067e030..0000000000
--- a/src/plugins/platforms/openvglite/qwindowsurface_vglite.cpp
+++ /dev/null
@@ -1,131 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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, Nokia gives you certain additional
-** rights. These rights are described in the Nokia 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.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qwindowsurface_vglite.h"
-#include "qgraphicssystem_vglite.h"
-#include <QtOpenVG/qvg.h>
-#include <QtOpenVG/private/qvg_p.h>
-#include <QtOpenVG/private/qpaintengine_vg_p.h>
-
-QT_BEGIN_NAMESPACE
-
-QVGLiteWindowSurface::QVGLiteWindowSurface
- (QVGLiteGraphicsSystem *gs, QWidget *window)
- : QWindowSurface(window), graphicsSystem(gs),
- isPaintingActive(false), engine(0)
-{
-}
-
-QVGLiteWindowSurface::~QVGLiteWindowSurface()
-{
- graphicsSystem->surface = 0;
- if (engine)
- qt_vg_destroy_paint_engine(engine);
-}
-
-QPaintDevice *QVGLiteWindowSurface::paintDevice()
-{
- qt_vg_make_current(graphicsSystem->context, graphicsSystem->rootWindow);
- isPaintingActive = true;
- // TODO: clear the parts of the back buffer that are not
- // covered by the window surface to black.
- return this;
-}
-
-void QVGLiteWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
-{
- Q_UNUSED(widget);
- Q_UNUSED(region);
- Q_UNUSED(offset);
- QEglContext *context = graphicsSystem->context;
- if (context) {
- if (!isPaintingActive)
- qt_vg_make_current(context, graphicsSystem->rootWindow);
- context->swapBuffers();
- qt_vg_done_current(context);
- context->setSurface(EGL_NO_SURFACE);
- isPaintingActive = false;
- }
-}
-
-void QVGLiteWindowSurface::setGeometry(const QRect &rect)
-{
- QWindowSurface::setGeometry(rect);
-}
-
-bool QVGLiteWindowSurface::scroll(const QRegion &area, int dx, int dy)
-{
- return QWindowSurface::scroll(area, dx, dy);
-}
-
-void QVGLiteWindowSurface::beginPaint(const QRegion &region)
-{
- Q_UNUSED(region);
-}
-
-void QVGLiteWindowSurface::endPaint(const QRegion &region)
-{
- Q_UNUSED(region);
-}
-
-QPaintEngine *QVGLiteWindowSurface::paintEngine() const
-{
- if (!engine)
- engine = qt_vg_create_paint_engine();
- return engine;
-}
-
-// We need to get access to QWidget::metric() from QVGLiteWindowSurface::metric,
-// but it is not a friend of QWidget. To get around this, we create a
-// fake QX11PaintEngine class, which is a friend.
-class QX11PaintEngine
-{
-public:
- static int metric(const QWidget *widget, QPaintDevice::PaintDeviceMetric met)
- {
- return widget->metric(met);
- }
-};
-
-int QVGLiteWindowSurface::metric(PaintDeviceMetric met) const
-{
- return QX11PaintEngine::metric(window(), met);
-}
diff --git a/src/plugins/platforms/platforms.pro b/src/plugins/platforms/platforms.pro
index 51de06f910..61e06d80c1 100644
--- a/src/plugins/platforms/platforms.pro
+++ b/src/plugins/platforms/platforms.pro
@@ -6,7 +6,7 @@ contains(QT_CONFIG, xcb) {
SUBDIRS += xcb
}
-mac:contains(QT_CONFIG, coreservices): SUBDIRS += cocoa
+mac:!ios: SUBDIRS += cocoa
win32: SUBDIRS += windows
diff --git a/src/plugins/platforms/qnx/main.cpp b/src/plugins/platforms/qnx/main.cpp
index b1e1687150..2dbff096c0 100644
--- a/src/plugins/platforms/qnx/main.cpp
+++ b/src/plugins/platforms/qnx/main.cpp
@@ -39,18 +39,11 @@
**
****************************************************************************/
-#include <QtGui/QPlatformIntegrationPlugin>
+#include "main.h"
#include "qqnxintegration.h"
QT_BEGIN_NAMESPACE
-class QQnxIntegrationPlugin : public QPlatformIntegrationPlugin
-{
-public:
- QStringList keys() const;
- QPlatformIntegration *create(const QString&, const QStringList&);
-};
-
QStringList QQnxIntegrationPlugin::keys() const
{
QStringList list;
@@ -67,6 +60,4 @@ QPlatformIntegration *QQnxIntegrationPlugin::create(const QString& system, const
return 0;
}
-Q_EXPORT_PLUGIN2(qnx, QQnxIntegrationPlugin)
-
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/openkode/shaders/vert.glslv b/src/plugins/platforms/qnx/main.h
index d7d6e15772..cc2cfdd000 100644
--- a/src/plugins/platforms/openkode/shaders/vert.glslv
+++ b/src/plugins/platforms/qnx/main.h
@@ -1,6 +1,6 @@
-/****************************************************************************
+/***************************************************************************
**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2011 - 2012 Research In Motion
** Contact: http://www.qt-project.org/
**
** This file is part of the plugins of the Qt Toolkit.
@@ -39,17 +39,17 @@
**
****************************************************************************/
-uniform vec2 window; // window size
+#include <QtGui/QPlatformIntegrationPlugin>
-// Per-vertex attributes]
-attribute vec2 pos_attr;
-attribute vec2 texcoord_attr;
+QT_BEGIN_NAMESPACE
-// Output vertex color
-varying vec2 texcoord_var;
-
-void main()
+class QQnxIntegrationPlugin : public QPlatformIntegrationPlugin
{
- gl_Position = vec4( (2.0 * pos_attr / window -1.0) * vec2(1.0, -1.0), 0.0, 1.0);
- texcoord_var = texcoord_attr;
-}
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPlatformIntegrationFactoryInterface" FILE "qnx.json")
+public:
+ QStringList keys() const;
+ QPlatformIntegration *create(const QString&, const QStringList&);
+};
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/qnx/qnx.json b/src/plugins/platforms/qnx/qnx.json
new file mode 100644
index 0000000000..38df228ef4
--- /dev/null
+++ b/src/plugins/platforms/qnx/qnx.json
@@ -0,0 +1,3 @@
+{
+ "Keys": [ "qnx" ]
+}
diff --git a/src/plugins/platforms/qnx/qnx.pro b/src/plugins/platforms/qnx/qnx.pro
index 82c3b201c9..7ca9ddf63a 100644
--- a/src/plugins/platforms/qnx/qnx.pro
+++ b/src/plugins/platforms/qnx/qnx.pro
@@ -2,15 +2,27 @@ TARGET = qnx
include(../../qpluginbase.pri)
QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/platforms
-QT += opengl opengl-private platformsupport platformsupport-private widgets-private
+QT += platformsupport platformsupport-private widgets-private
+
+contains(QT_CONFIG, opengles2) {
+ QT += opengl opengl-private
+}
# Uncomment this to build with support for IMF once it becomes available in the BBNDK
#CONFIG += qqnx_imf
+# Uncomment this to build with support for PPS based platform integration
+#CONFIG += qqnx_pps
+
+CONFIG(blackberry) {
+ CONFIG += qqnx_pps
+}
+
# Uncomment these to enable debugging output for various aspects of the plugin
#DEFINES += QQNXBUFFER_DEBUG
+#DEFINES += QQNXBPSEVENTFILTER_DEBUG
#DEFINES += QQNXCLIPBOARD_DEBUG
-#DEFINES += QQNXEVENTTHREAD_DEBUG
+#DEFINES += QQNXSCREENEVENTTHREAD_DEBUG
#DEFINES += QQNXGLBACKINGSTORE_DEBUG
#DEFINES += QQNXGLCONTEXT_DEBUG
#DEFINES += QQNXINPUTCONTEXT_DEBUG
@@ -24,65 +36,94 @@ QT += opengl opengl-private platformsupport platformsupport-private widgets-priv
#DEFINES += QQNXSCREENEVENT_DEBUG
#DEFINES += QQNXVIRTUALKEYBOARD_DEBUG
#DEFINES += QQNXWINDOW_DEBUG
+#DEFINES += QQNXNAVIGATOR_DEBUG
SOURCES = main.cpp \
qqnxbuffer.cpp \
- qqnxeventthread.cpp \
- qqnxglcontext.cpp \
- qqnxglbackingstore.cpp \
+ qqnxscreeneventthread.cpp \
qqnxintegration.cpp \
- qqnxnavigatoreventhandler.cpp \
- qqnxnavigatoreventnotifier.cpp \
qqnxscreen.cpp \
qqnxwindow.cpp \
qqnxrasterbackingstore.cpp \
- qqnxvirtualkeyboard.cpp \
- qqnxclipboard.cpp \
qqnxrootwindow.cpp \
qqnxscreeneventhandler.cpp \
+ qqnxnativeinterface.cpp \
+ qqnxnavigatoreventhandler.cpp \
+ qqnxabstractnavigator.cpp \
qqnxabstractvirtualkeyboard.cpp \
- qqnxnativeinterface.cpp
+ qqnxservices.cpp
-HEADERS = qqnxbuffer.h \
- qqnxeventthread.h \
+HEADERS = main.h \
+ qqnxbuffer.h \
+ qqnxscreeneventthread.h \
qqnxkeytranslator.h \
qqnxintegration.h \
- qqnxnavigatoreventhandler.h \
- qqnxnavigatoreventnotifier.h \
- qqnxglcontext.h \
- qqnxglbackingstore.h \
qqnxscreen.h \
qqnxwindow.h \
qqnxrasterbackingstore.h \
- qqnxvirtualkeyboard.h \
- qqnxclipboard.h \
qqnxrootwindow.h \
qqnxscreeneventhandler.h \
+ qqnxnativeinterface.h \
+ qqnxnavigatoreventhandler.h \
+ qqnxabstractnavigator.h \
qqnxabstractvirtualkeyboard.h \
- qqnxnativeinterface.h
+ qqnxservices.h
-CONFIG(blackberry) {
- SOURCES += qqnxservices.cpp
- HEADERS += qqnxservices.h
-}
+LIBS += -lscreen
-CONFIG(qqnx_imf) {
- DEFINES += QQNX_IMF
- HEADERS += qqnxinputcontext_imf.h
- SOURCES += qqnxinputcontext_imf.cpp
-} else {
- HEADERS += qqnxinputcontext_noimf.h
- SOURCES += qqnxinputcontext_noimf.cpp
-}
+contains(QT_CONFIG, opengles2) {
+ SOURCES += qqnxglcontext.cpp \
+ qqnxglbackingstore.cpp
-QMAKE_CXXFLAGS += -I./private
+ HEADERS += qqnxglcontext.h \
+ qqnxglbackingstore.h
-LIBS += -lpps -lscreen -lEGL -lclipboard
+ LIBS += -lEGL
+}
CONFIG(blackberry) {
+ SOURCES += qqnxnavigatorbps.cpp \
+ qqnxeventdispatcher_blackberry.cpp \
+ qqnxbpseventfilter.cpp \
+ qqnxvirtualkeyboardbps.cpp
+
+ HEADERS += qqnxnavigatorbps.h \
+ qqnxeventdispatcher_blackberry.h \
+ qqnxbpseventfilter.h \
+ qqnxvirtualkeyboardbps.h
+
LIBS += -lbps
}
+CONFIG(qqnx_pps) {
+ DEFINES += QQNX_PPS
+
+ SOURCES += qqnxnavigatorpps.cpp \
+ qqnxnavigatoreventnotifier.cpp \
+ qqnxvirtualkeyboardpps.cpp \
+ qqnxclipboard.cpp
+
+ HEADERS += qqnxnavigatorpps.h \
+ qqnxnavigatoreventnotifier.h \
+ qqnxvirtualkeyboardpps.h \
+ qqnxclipboard.h
+
+ LIBS += -lpps -lclipboard
+
+ CONFIG(qqnx_imf) {
+ DEFINES += QQNX_IMF
+ HEADERS += qqnxinputcontext_imf.h
+ SOURCES += qqnxinputcontext_imf.cpp
+ } else {
+ HEADERS += qqnxinputcontext_noimf.h
+ SOURCES += qqnxinputcontext_noimf.cpp
+ }
+}
+
+OTHER_FILES += qnx.json
+
+QMAKE_CXXFLAGS += -I./private
+
include (../../../platformsupport/eglconvenience/eglconvenience.pri)
include (../../../platformsupport/fontdatabases/fontdatabases.pri)
diff --git a/src/plugins/platforms/qnx/qqnxabstractnavigator.cpp b/src/plugins/platforms/qnx/qqnxabstractnavigator.cpp
new file mode 100644
index 0000000000..f57f49df9c
--- /dev/null
+++ b/src/plugins/platforms/qnx/qqnxabstractnavigator.cpp
@@ -0,0 +1,74 @@
+/***************************************************************************
+**
+** Copyright (C) 2012 Research In Motion
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qqnxabstractnavigator.h"
+
+#include <QDebug>
+#include <QUrl>
+
+QT_BEGIN_NAMESPACE
+
+QQnxAbstractNavigator::QQnxAbstractNavigator(QObject *parent)
+ : QObject(parent)
+{
+}
+
+QQnxAbstractNavigator::~QQnxAbstractNavigator()
+{
+}
+
+bool QQnxAbstractNavigator::invokeUrl(const QUrl &url)
+{
+ if (!url.isValid() || url.isRelative())
+ return false;
+
+ // not using QUrl::toEncoded() because for e.g. camera:// it creates camera:
+ // which is not recognized by the navigator anymore
+ const bool result = requestInvokeUrl(url.toString().toUtf8());
+
+#if defined(QQNXNAVIGATOR_DEBUG)
+ qDebug() << Q_FUNC_INFO << "url=" << url << "result=" << result;
+#endif
+
+ return result;
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/qnx/qqnxabstractnavigator.h b/src/plugins/platforms/qnx/qqnxabstractnavigator.h
new file mode 100644
index 0000000000..969366c925
--- /dev/null
+++ b/src/plugins/platforms/qnx/qqnxabstractnavigator.h
@@ -0,0 +1,66 @@
+/***************************************************************************
+**
+** Copyright (C) 2012 Research In Motion
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QQNXABSTRACTNAVIGATOR_H
+#define QQNXABSTRACTNAVIGATOR_H
+
+#include <QObject>
+
+QT_BEGIN_NAMESPACE
+
+class QUrl;
+
+class QQnxAbstractNavigator : public QObject
+{
+ Q_OBJECT
+public:
+ explicit QQnxAbstractNavigator(QObject *parent = 0);
+ ~QQnxAbstractNavigator();
+
+ bool invokeUrl(const QUrl &url);
+
+protected:
+ virtual bool requestInvokeUrl(const QByteArray &encodedUrl) = 0;
+};
+
+QT_END_NAMESPACE
+
+#endif // QQNXABSTRACTNAVIGATOR_H
diff --git a/src/plugins/platforms/qnx/qqnxbpseventfilter.cpp b/src/plugins/platforms/qnx/qqnxbpseventfilter.cpp
new file mode 100644
index 0000000000..647e1a692f
--- /dev/null
+++ b/src/plugins/platforms/qnx/qqnxbpseventfilter.cpp
@@ -0,0 +1,204 @@
+/***************************************************************************
+**
+** Copyright (C) 2012 Research In Motion
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qqnxbpseventfilter.h"
+#include "qqnxnavigatoreventhandler.h"
+#include "qqnxscreen.h"
+#include "qqnxscreeneventhandler.h"
+#include "qqnxvirtualkeyboardbps.h"
+
+#include <QAbstractEventDispatcher>
+#include <QDebug>
+
+#include <bps/event.h>
+#include <bps/navigator.h>
+#include <bps/screen.h>
+
+QT_BEGIN_NAMESPACE
+
+static QQnxBpsEventFilter *s_instance = 0;
+
+QQnxBpsEventFilter::QQnxBpsEventFilter(QQnxNavigatorEventHandler *navigatorEventHandler,
+ QQnxScreenEventHandler *screenEventHandler,
+ QQnxVirtualKeyboardBps *virtualKeyboard, QObject *parent)
+ : QObject(parent)
+ , m_navigatorEventHandler(navigatorEventHandler)
+ , m_screenEventHandler(screenEventHandler)
+ , m_virtualKeyboard(virtualKeyboard)
+{
+ Q_ASSERT(s_instance == 0);
+
+ s_instance = this;
+}
+
+QQnxBpsEventFilter::~QQnxBpsEventFilter()
+{
+ Q_ASSERT(s_instance == this);
+
+ s_instance = 0;
+}
+
+void QQnxBpsEventFilter::installOnEventDispatcher(QAbstractEventDispatcher *dispatcher)
+{
+#if defined(QQNXBPSEVENTFILTER_DEBUG)
+ qDebug() << Q_FUNC_INFO << "dispatcher=" << dispatcher;
+#endif
+
+ if (navigator_request_events(0) != BPS_SUCCESS)
+ qWarning("QQNX: failed to register for navigator events");
+
+ QAbstractEventDispatcher::EventFilter previousEventFilter = dispatcher->setEventFilter(dispatcherEventFilter);
+
+ // the QPA plugin creates the event dispatcher so we are the first event
+ // filter assert on that just in case somebody adds another event filter
+ // in the QQnxIntegration constructor instead of adding a new section in here
+ Q_ASSERT(previousEventFilter == 0);
+ Q_UNUSED(previousEventFilter);
+}
+
+void QQnxBpsEventFilter::registerForScreenEvents(QQnxScreen *screen)
+{
+ if (screen_request_events(screen->nativeContext()) != BPS_SUCCESS)
+ qWarning("QQNX: failed to register for screen events on screen %p", screen->nativeContext());
+}
+
+void QQnxBpsEventFilter::unregisterForScreenEvents(QQnxScreen *screen)
+{
+ if (screen_stop_events(screen->nativeContext()) != BPS_SUCCESS)
+ qWarning("QQNX: failed to unregister for screen events on screen %p", screen->nativeContext());
+}
+
+bool QQnxBpsEventFilter::dispatcherEventFilter(void *message)
+{
+#if defined(QQNXBPSEVENTFILTER_DEBUG)
+ qDebug() << Q_FUNC_INFO;
+#endif
+
+ if (s_instance == 0)
+ return false;
+
+ bps_event_t *event = static_cast<bps_event_t *>(message);
+ return s_instance->bpsEventFilter(event);
+}
+
+bool QQnxBpsEventFilter::bpsEventFilter(bps_event_t *event)
+{
+ const int eventDomain = bps_event_get_domain(event);
+
+#if defined(QQNXBPSEVENTFILTER_DEBUG)
+ qDebug() << Q_FUNC_INFO << "event=" << event << "domain=" << eventDomain;
+#endif
+
+ if (eventDomain == screen_get_domain()) {
+ screen_event_t screenEvent = screen_event_get_event(event);
+ return m_screenEventHandler->handleEvent(screenEvent);
+ }
+
+ if (eventDomain == navigator_get_domain())
+ return handleNavigatorEvent(event);
+
+ if (m_virtualKeyboard->handleEvent(event))
+ return true;
+
+ return false;
+}
+
+bool QQnxBpsEventFilter::handleNavigatorEvent(bps_event_t *event)
+{
+ switch (bps_event_get_code(event)) {
+ case NAVIGATOR_ORIENTATION_CHECK: {
+ const int angle = navigator_event_get_orientation_angle(event);
+
+ #if defined(QQNXBPSEVENTFILTER_DEBUG)
+ qDebug() << "QQNX: Navigator ORIENTATION CHECK event. angle=" << angle;
+ #endif
+
+ const bool result = m_navigatorEventHandler->handleOrientationCheck(angle);
+
+ #if defined(QQNXBPSEVENTFILTER_DEBUG)
+ qDebug() << "QQNX: Navigator ORIENTATION CHECK event. result=" << result;
+ #endif
+
+ // reply to navigator whether orientation is acceptable
+ navigator_orientation_check_response(event, result);
+ break;
+ }
+
+ case NAVIGATOR_ORIENTATION: {
+ const int angle = navigator_event_get_orientation_angle(event);
+
+ #if defined(QQNXBPSEVENTFILTER_DEBUG)
+ qDebug() << "QQNX: Navigator ORIENTATION event. angle=" << angle;
+ #endif
+
+ m_navigatorEventHandler->handleOrientationChange(angle);
+
+ navigator_done_orientation(event);
+ break;
+ }
+
+ case NAVIGATOR_SWIPE_DOWN:
+ #if defined(QQNXBPSEVENTFILTER_DEBUG)
+ qDebug() << "QQNX: Navigator SWIPE DOWN event";
+ #endif
+
+ m_navigatorEventHandler->handleSwipeDown();
+ break;
+
+ case NAVIGATOR_EXIT:
+ #if defined(QQNXBPSEVENTFILTER_DEBUG)
+ qDebug() << "QQNX: Navigator EXIT event";
+ #endif
+
+ m_navigatorEventHandler->handleExit();
+ break;
+
+ default:
+ #if defined(QQNXBPSEVENTFILTER_DEBUG)
+ qDebug() << "QQNX: Unhandled navigator event. code=" << bps_event_get_code(event);
+ #endif
+ return false;
+ }
+
+ return true;
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/qvfb/qvfbwindowsurface.h b/src/plugins/platforms/qnx/qqnxbpseventfilter.h
index 92fe6aea2d..215027e8e6 100644
--- a/src/plugins/platforms/qvfb/qvfbwindowsurface.h
+++ b/src/plugins/platforms/qnx/qqnxbpseventfilter.h
@@ -1,6 +1,6 @@
-/****************************************************************************
+/***************************************************************************
**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2012 Research In Motion
** Contact: http://www.qt-project.org/
**
** This file is part of the plugins of the Qt Toolkit.
@@ -39,42 +39,47 @@
**
****************************************************************************/
-#ifndef QWINDOWSURFACE_QVFB_H
-#define QWINDOWSURFACE_QVFB_H
+#ifndef QQNXBPSEVENTFILTER_H
+#define QQNXBPSEVENTFILTER_H
-#include <QtGui/private/qwindowsurface_p.h>
-#include <QPlatformWindow>
+#include <QObject>
+
+struct bps_event_t;
QT_BEGIN_NAMESPACE
-class QVFbIntegration;
-class QVFbScreen;
+class QAbstractEventDispatcher;
+class QQnxNavigatorEventHandler;
+class QQnxScreen;
+class QQnxScreenEventHandler;
+class QQnxVirtualKeyboardBps;
-class QVFbWindowSurface : public QWindowSurface
+class QQnxBpsEventFilter : public QObject
{
+ Q_OBJECT
public:
- QVFbWindowSurface(QVFbScreen *screen, QWidget *window);
- ~QVFbWindowSurface();
+ QQnxBpsEventFilter(QQnxNavigatorEventHandler *navigatorEventHandler,
+ QQnxScreenEventHandler *screenEventHandler,
+ QQnxVirtualKeyboardBps *virtualKeyboard, QObject *parent = 0);
+ ~QQnxBpsEventFilter();
+
+ void installOnEventDispatcher(QAbstractEventDispatcher *dispatcher);
- QPaintDevice *paintDevice();
- void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
- void resize(const QSize &size);
+ void registerForScreenEvents(QQnxScreen *screen);
+ void unregisterForScreenEvents(QQnxScreen *screen);
private:
- QVFbScreen *mScreen;
-};
+ static bool dispatcherEventFilter(void *message);
+ bool bpsEventFilter(bps_event_t *event);
-class QVFbWindow : public QPlatformWindow
-{
-public:
- QVFbWindow(QVFbScreen *screen, QWidget *window);
- void setGeometry(const QRect &rect);
+ bool handleNavigatorEvent(bps_event_t *event);
private:
- QVFbScreen *mScreen;
+ QQnxNavigatorEventHandler *m_navigatorEventHandler;
+ QQnxScreenEventHandler *m_screenEventHandler;
+ QQnxVirtualKeyboardBps *m_virtualKeyboard;
};
-
QT_END_NAMESPACE
-#endif
+#endif // QQNXBPSEVENTFILTER_H
diff --git a/src/plugins/platforms/qnx/qqnxclipboard.cpp b/src/plugins/platforms/qnx/qqnxclipboard.cpp
index 8931a15139..38dac0c5ab 100644
--- a/src/plugins/platforms/qnx/qqnxclipboard.cpp
+++ b/src/plugins/platforms/qnx/qqnxclipboard.cpp
@@ -153,7 +153,7 @@ protected:
return QMimeData::retrieveData(mimetype, preferredType);
const QByteArray data = readClipboardBuff(mimetype.toUtf8().constData());
- return qVariantFromValue(data);
+ return QVariant::fromValue(data);
}
private Q_SLOTS:
diff --git a/src/plugins/platforms/qvfb/main.cpp b/src/plugins/platforms/qnx/qqnxeventdispatcher_blackberry.cpp
index 3013b69daf..c7d9eb5ed9 100644
--- a/src/plugins/platforms/qvfb/main.cpp
+++ b/src/plugins/platforms/qnx/qqnxeventdispatcher_blackberry.cpp
@@ -1,6 +1,6 @@
-/****************************************************************************
+/***************************************************************************
**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2012 Research In Motion
** Contact: http://www.qt-project.org/
**
** This file is part of the plugins of the Qt Toolkit.
@@ -39,35 +39,42 @@
**
****************************************************************************/
-#include <QPlatformIntegrationPlugin>
-#include "qvfbintegration.h"
-#include <qstringlist.h>
+#include "qqnxeventdispatcher_blackberry.h"
+
+#include <QWindowSystemInterface>
+#include <private/qguiapplication_p.h>
QT_BEGIN_NAMESPACE
-class QVFbIntegrationPlugin : public QPlatformIntegrationPlugin
+
+QQnxEventDispatcherBlackberry::QQnxEventDispatcherBlackberry(QObject *parent)
+ : QEventDispatcherBlackberry(parent)
{
-public:
- QStringList keys() const;
- QPlatformIntegration *create(const QString&, const QStringList&);
-};
+}
-QStringList QVFbIntegrationPlugin::keys() const
+QQnxEventDispatcherBlackberry::~QQnxEventDispatcherBlackberry()
{
- QStringList list;
- list << "QVFb";
- return list;
}
-QPlatformIntegration* QVFbIntegrationPlugin::create(const QString& system, const QStringList& paramList)
+bool QQnxEventDispatcherBlackberry::processEvents(QEventLoop::ProcessEventsFlags flags)
{
- Q_UNUSED(paramList);
- if (system.toLower() == "qvfb")
- return new QVFbIntegration(paramList);
+ bool didSendEvents = QWindowSystemInterface::sendWindowSystemEvents(this, flags);
- return 0;
+ if (QEventDispatcherBlackberry::processEvents(flags))
+ return true;
+
+ return didSendEvents;
}
-Q_EXPORT_PLUGIN2(qvfb, QVFbIntegrationPlugin)
+bool QQnxEventDispatcherBlackberry::hasPendingEvents()
+{
+ return QEventDispatcherBlackberry::hasPendingEvents() || QWindowSystemInterface::windowSystemEventsQueued();
+}
+
+void QQnxEventDispatcherBlackberry::flush()
+{
+ if (qApp)
+ qApp->sendPostedEvents();
+}
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/qnx/qqnxeventdispatcher_blackberry.h b/src/plugins/platforms/qnx/qqnxeventdispatcher_blackberry.h
new file mode 100644
index 0000000000..be34b5f7d0
--- /dev/null
+++ b/src/plugins/platforms/qnx/qqnxeventdispatcher_blackberry.h
@@ -0,0 +1,66 @@
+/***************************************************************************
+**
+** Copyright (C) 2012 Research In Motion
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QQNXEVENTDISPATCHER_BLACKBERRY_H
+#define QQNXEVENTDISPATCHER_BLACKBERRY_H
+
+#include <qglobal.h>
+#include <private/qeventdispatcher_blackberry_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QQnxEventDispatcherBlackberry : public QEventDispatcherBlackberry
+{
+ Q_OBJECT
+
+public:
+ explicit QQnxEventDispatcherBlackberry(QObject *parent = 0);
+ ~QQnxEventDispatcherBlackberry();
+
+ bool processEvents(QEventLoop::ProcessEventsFlags flags);
+ bool hasPendingEvents();
+
+ void flush();
+};
+
+QT_END_NAMESPACE
+
+#endif // QQNXEVENTDISPATCHER_BLACKBERRY_H
diff --git a/src/plugins/platforms/qnx/qqnxglcontext.cpp b/src/plugins/platforms/qnx/qqnxglcontext.cpp
index 882b71753e..934e6afedf 100644
--- a/src/plugins/platforms/qnx/qqnxglcontext.cpp
+++ b/src/plugins/platforms/qnx/qqnxglcontext.cpp
@@ -141,7 +141,6 @@ QQnxGLContext::QQnxGLContext(QOpenGLContext *glContext)
format.setRedBufferSize(redSize);
format.setGreenBufferSize(greenSize);
format.setBlueBufferSize(blueSize);
- format.setSamples(2);
// Select EGL config based on requested window format
m_eglConfig = q_configFromGLFormat(ms_eglDisplay, format);
diff --git a/src/plugins/platforms/qnx/qqnxintegration.cpp b/src/plugins/platforms/qnx/qqnxintegration.cpp
index b4112999b6..2fa3b45047 100644
--- a/src/plugins/platforms/qnx/qqnxintegration.cpp
+++ b/src/plugins/platforms/qnx/qqnxintegration.cpp
@@ -40,33 +40,54 @@
****************************************************************************/
#include "qqnxintegration.h"
-#include "qqnxeventthread.h"
-#include "qqnxglbackingstore.h"
-#include "qqnxglcontext.h"
+#include "qqnxscreeneventthread.h"
#include "qqnxnativeinterface.h"
-#include "qqnxnavigatoreventhandler.h"
-#include "qqnxnavigatoreventnotifier.h"
#include "qqnxrasterbackingstore.h"
#include "qqnxscreen.h"
#include "qqnxscreeneventhandler.h"
#include "qqnxwindow.h"
-#include "qqnxvirtualkeyboard.h"
-#include "qqnxclipboard.h"
-#include "qqnxglcontext.h"
+#include "qqnxnavigatoreventhandler.h"
+#include "qqnxabstractnavigator.h"
+#include "qqnxabstractvirtualkeyboard.h"
#include "qqnxservices.h"
-#if defined(QQnx_IMF)
-#include "qqnxinputcontext_imf.h"
-#else
-#include "qqnxinputcontext_noimf.h"
+#if defined(Q_OS_BLACKBERRY)
+#include "qqnxbpseventfilter.h"
+#include "qqnxnavigatorbps.h"
+#include "qqnxvirtualkeyboardbps.h"
+#elif defined(QQNX_PPS)
+#include "qqnxnavigatorpps.h"
+#include "qqnxvirtualkeyboardpps.h"
+#endif
+
+#if defined(QQNX_PPS)
+# include "qqnxnavigatoreventnotifier.h"
+# include "qqnxclipboard.h"
+
+# if defined(QQNX_IMF)
+# include "qqnxinputcontext_imf.h"
+# else
+# include "qqnxinputcontext_noimf.h"
+# endif
#endif
#include "private/qgenericunixfontdatabase_p.h"
+
+#if defined(Q_OS_BLACKBERRY)
+#include "qqnxeventdispatcher_blackberry.h"
+#else
#include "private/qgenericunixeventdispatcher_p.h"
+#endif
#include <QtGui/QPlatformWindow>
#include <QtGui/QWindowSystemInterface>
+
+#if !defined(QT_NO_OPENGL)
+#include "qqnxglbackingstore.h"
+#include "qqnxglcontext.h"
+
#include <QtGui/QOpenGLContext>
+#endif
#include <QtCore/QDebug>
#include <QtCore/QHash>
@@ -80,18 +101,27 @@ QMutex QQnxIntegration::ms_windowMapperMutex;
QQnxIntegration::QQnxIntegration()
: QPlatformIntegration()
- , m_eventThread(0)
+ , m_screenEventThread(0)
, m_navigatorEventHandler(new QQnxNavigatorEventHandler())
- , m_navigatorEventNotifier(0)
, m_virtualKeyboard(0)
+#if defined(QQNX_PPS)
+ , m_navigatorEventNotifier(0)
, m_inputContext(0)
+#endif
+ , m_services(0)
, m_fontDatabase(new QGenericUnixFontDatabase())
+#if !defined(QT_NO_OPENGL)
, m_paintUsingOpenGL(false)
+#endif
+#if defined(Q_OS_BLACKBERRY)
+ , m_eventDispatcher(new QQnxEventDispatcherBlackberry())
+ , m_bpsEventFilter(0)
+#else
, m_eventDispatcher(createUnixEventDispatcher())
+#endif
, m_nativeInterface(new QQnxNativeInterface())
- , m_services(0)
, m_screenEventHandler(new QQnxScreenEventHandler())
-#ifndef QT_NO_CLIPBOARD
+#if !defined(QT_NO_CLIPBOARD)
, m_clipboard(0)
#endif
{
@@ -105,41 +135,73 @@ QQnxIntegration::QQnxIntegration()
qFatal("QQnx: failed to connect to composition manager, errno=%d", errno);
}
+ // Not on BlackBerry, it has specialised event dispatcher which also handles navigator events
+#if !defined(Q_OS_BLACKBERRY) && defined(QQNX_PPS)
// Create/start navigator event notifier
m_navigatorEventNotifier = new QQnxNavigatorEventNotifier(m_navigatorEventHandler);
// delay invocation of start() to the time the event loop is up and running
// needed to have the QThread internals of the main thread properly initialized
QMetaObject::invokeMethod(m_navigatorEventNotifier, "start", Qt::QueuedConnection);
+#endif
// Create displays for all possible screens (which may not be attached)
createDisplays();
+#if !defined(QT_NO_OPENGL)
// Initialize global OpenGL resources
QQnxGLContext::initialize();
+#endif
// Create/start event thread
- m_eventThread = new QQnxEventThread(m_screenContext, m_screenEventHandler);
- m_eventThread->start();
+ // Not on BlackBerry, it has specialised event dispatcher which also handles screen events
+#if !defined(Q_OS_BLACKBERRY)
+ m_screenEventThread = new QQnxScreenEventThread(m_screenContext, m_screenEventHandler);
+ m_screenEventThread->start();
+#endif
+ // Not on BlackBerry, it has specialised event dispatcher which also handles virtual keyboard events
+#if !defined(Q_OS_BLACKBERRY) && defined(QQNX_PPS)
// Create/start the keyboard class.
- m_virtualKeyboard = new QQnxVirtualKeyboard();
+ m_virtualKeyboard = new QQnxVirtualKeyboardPps();
// delay invocation of start() to the time the event loop is up and running
// needed to have the QThread internals of the main thread properly initialized
QMetaObject::invokeMethod(m_virtualKeyboard, "start", Qt::QueuedConnection);
+#endif
- // TODO check if we need to do this for all screens or only the primary one
- QObject::connect(m_virtualKeyboard, SIGNAL(heightChanged(int)),
- primaryDisplay(), SLOT(keyboardHeightChanged(int)));
-
- // Set up the input context
- m_inputContext = new QQnxInputContext(*m_virtualKeyboard);
+#if defined(Q_OS_BLACKBERRY)
+ m_navigator = new QQnxNavigatorBps();
+#elif defined(QQNX_PPS)
+ m_navigator = new QQnxNavigatorPps();
+#endif
// Create services handling class
-#ifdef Q_OS_BLACKBERRY
- m_services = new QQnxServices;
+ if (m_navigator)
+ m_services = new QQnxServices(m_navigator);
+
+#if defined(Q_OS_BLACKBERRY)
+ QQnxVirtualKeyboardBps* virtualKeyboardBps = new QQnxVirtualKeyboardBps;
+ m_bpsEventFilter = new QQnxBpsEventFilter(m_navigatorEventHandler, m_screenEventHandler, virtualKeyboardBps);
+ Q_FOREACH (QQnxScreen *screen, m_screens)
+ m_bpsEventFilter->registerForScreenEvents(screen);
+
+ m_bpsEventFilter->installOnEventDispatcher(m_eventDispatcher);
+
+ m_virtualKeyboard = virtualKeyboardBps;
#endif
+
+ if (m_virtualKeyboard) {
+ // TODO check if we need to do this for all screens or only the primary one
+ QObject::connect(m_virtualKeyboard, SIGNAL(heightChanged(int)),
+ primaryDisplay(), SLOT(keyboardHeightChanged(int)));
+
+#if defined(QQNX_PPS)
+ // Set up the input context
+ m_inputContext = new QQnxInputContext(*m_virtualKeyboard);
+#endif
+ }
+
}
QQnxIntegration::~QQnxIntegration()
@@ -151,23 +213,35 @@ QQnxIntegration::~QQnxIntegration()
delete m_nativeInterface;
+#if defined(QQNX_PPS)
// Destroy input context
delete m_inputContext;
+#endif
// Destroy the keyboard class.
delete m_virtualKeyboard;
-#ifndef QT_NO_CLIPBOARD
+#if !defined(QT_NO_CLIPBOARD)
// Delete the clipboard
delete m_clipboard;
#endif
// Stop/destroy navigator event notifier
+#if defined(QQNX_PPS)
delete m_navigatorEventNotifier;
+#endif
delete m_navigatorEventHandler;
- // Stop/destroy event thread
- delete m_eventThread;
+#if !defined(Q_OS_BLACKBERRY)
+ // Stop/destroy screen event thread
+ delete m_screenEventThread;
+#else
+ Q_FOREACH (QQnxScreen *screen, m_screens)
+ m_bpsEventFilter->unregisterForScreenEvents(screen);
+
+ delete m_bpsEventFilter;
+#endif
+
delete m_screenEventHandler;
// Destroy all displays
@@ -176,13 +250,16 @@ QQnxIntegration::~QQnxIntegration()
// Close connection to QNX composition manager
screen_destroy_context(m_screenContext);
+#if !defined(QT_NO_OPENGL)
// Cleanup global OpenGL resources
QQnxGLContext::shutdown();
+#endif
// Destroy services class
-#ifdef Q_OS_BLACKBERRY
delete m_services;
-#endif
+
+ // Destroy navigator interface
+ delete m_navigator;
#if defined(QQNXINTEGRATION_DEBUG)
qDebug() << "QQnx: platform plugin shutdown end";
@@ -217,12 +294,15 @@ QPlatformBackingStore *QQnxIntegration::createPlatformBackingStore(QWindow *wind
#if defined(QQNXINTEGRATION_DEBUG)
qDebug() << Q_FUNC_INFO;
#endif
+#if !defined(QT_NO_OPENGL)
if (paintUsingOpenGL())
return new QQnxGLBackingStore(window);
else
+#endif
return new QQnxRasterBackingStore(window);
}
+#if !defined(QT_NO_OPENGL)
QPlatformOpenGLContext *QQnxIntegration::createPlatformOpenGLContext(QOpenGLContext *context) const
{
#if defined(QQNXINTEGRATION_DEBUG)
@@ -230,7 +310,9 @@ QPlatformOpenGLContext *QQnxIntegration::createPlatformOpenGLContext(QOpenGLCont
#endif
return new QQnxGLContext(context);
}
+#endif
+#if defined(QQNX_PPS)
QPlatformInputContext *QQnxIntegration::inputContext() const
{
#if defined(QQNXINTEGRATION_DEBUG)
@@ -238,6 +320,7 @@ QPlatformInputContext *QQnxIntegration::inputContext() const
#endif
return m_inputContext;
}
+#endif
void QQnxIntegration::moveToScreen(QWindow *window, int screen)
{
@@ -268,15 +351,18 @@ QPlatformNativeInterface *QQnxIntegration::nativeInterface() const
return m_nativeInterface;
}
-#ifndef QT_NO_CLIPBOARD
+#if !defined(QT_NO_CLIPBOARD)
QPlatformClipboard *QQnxIntegration::clipboard() const
{
#if defined(QQNXINTEGRATION_DEBUG)
qDebug() << Q_FUNC_INFO;
#endif
+
+#if defined(QQNX_PPS)
if (!m_clipboard) {
m_clipboard = new QQnxClipboard;
}
+#endif
return m_clipboard;
}
#endif
diff --git a/src/plugins/platforms/qnx/qqnxintegration.h b/src/plugins/platforms/qnx/qqnxintegration.h
index 801bd7b6e5..a3c476f16e 100644
--- a/src/plugins/platforms/qnx/qqnxintegration.h
+++ b/src/plugins/platforms/qnx/qqnxintegration.h
@@ -50,18 +50,23 @@
QT_BEGIN_NAMESPACE
-class QQnxEventThread;
-class QQnxInputContext;
+class QQnxBpsEventFilter;
+class QQnxScreenEventThread;
class QQnxNativeInterface;
-class QQnxNavigatorEventHandler;
-class QQnxNavigatorEventNotifier;
-class QQnxAbstractVirtualKeyboard;
class QQnxWindow;
-class QQnxServices;
class QQnxScreen;
class QQnxScreenEventHandler;
+class QQnxNavigatorEventHandler;
+class QQnxAbstractNavigator;
+class QQnxAbstractVirtualKeyboard;
+class QQnxServices;
+
+#if defined(QQNX_PPS)
+class QQnxInputContext;
+class QQnxNavigatorEventNotifier;
+#endif
-#ifndef QT_NO_CLIPBOARD
+#if !defined(QT_NO_CLIPBOARD)
class QQnxClipboard;
#endif
@@ -78,9 +83,14 @@ public:
QPlatformWindow *createPlatformWindow(QWindow *window) const;
QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const;
+
+#if !defined(QT_NO_OPENGL)
QPlatformOpenGLContext *createPlatformOpenGLContext(QOpenGLContext *context) const;
+#endif
+#if defined(QQNX_PPS)
QPlatformInputContext *inputContext() const;
+#endif
void moveToScreen(QWindow *window, int screen);
@@ -90,13 +100,15 @@ public:
QPlatformNativeInterface *nativeInterface() const;
-#ifndef QT_NO_CLIPBOARD
+#if !defined(QT_NO_CLIPBOARD)
QPlatformClipboard *clipboard() const;
#endif
QVariant styleHint(StyleHint hint) const;
+#if !defined(QT_NO_OPENGL)
bool paintUsingOpenGL() const { return m_paintUsingOpenGL; }
+#endif
QPlatformServices *services() const;
@@ -111,22 +123,31 @@ private:
static void removeWindow(screen_window_t qnxWindow);
screen_context_t m_screenContext;
- QQnxEventThread *m_eventThread;
+ QQnxScreenEventThread *m_screenEventThread;
QQnxNavigatorEventHandler *m_navigatorEventHandler;
- QQnxNavigatorEventNotifier *m_navigatorEventNotifier;
QQnxAbstractVirtualKeyboard *m_virtualKeyboard;
+#if defined(QQNX_PPS)
+ QQnxNavigatorEventNotifier *m_navigatorEventNotifier;
QQnxInputContext *m_inputContext;
+#endif
+ QQnxServices *m_services;
QPlatformFontDatabase *m_fontDatabase;
+#if !defined(QT_NO_OPENGL)
bool m_paintUsingOpenGL;
+#endif
QAbstractEventDispatcher *m_eventDispatcher;
+#if defined(Q_OS_BLACKBERRY)
+ QQnxBpsEventFilter *m_bpsEventFilter;
+#endif
QQnxNativeInterface *m_nativeInterface;
- QQnxServices *m_services;
QList<QQnxScreen*> m_screens;
QQnxScreenEventHandler *m_screenEventHandler;
-#ifndef QT_NO_CLIPBOARD
+#if !defined(QT_NO_CLIPBOARD)
mutable QQnxClipboard* m_clipboard;
#endif
+ QQnxAbstractNavigator *m_navigator;
+
static QQnxWindowMapper ms_windowMapper;
static QMutex ms_windowMapperMutex;
diff --git a/src/plugins/platforms/openvglite/main.cpp b/src/plugins/platforms/qnx/qqnxnavigatorbps.cpp
index 83ffc06452..78ef3e890c 100644
--- a/src/plugins/platforms/openvglite/main.cpp
+++ b/src/plugins/platforms/qnx/qqnxnavigatorbps.cpp
@@ -1,6 +1,6 @@
-/****************************************************************************
+/***************************************************************************
**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2012 Research In Motion
** Contact: http://www.qt-project.org/
**
** This file is part of the plugins of the Qt Toolkit.
@@ -39,33 +39,36 @@
**
****************************************************************************/
-#include <private/qgraphicssystemplugin_p.h>
-#include "qgraphicssystem_vglite.h"
+#include "qqnxnavigatorbps.h"
+
+#include <QDebug>
+
+#include <bps/navigator.h>
QT_BEGIN_NAMESPACE
-class QVGGraphicsSystemPlugin : public QGraphicsSystemPlugin
+QQnxNavigatorBps::QQnxNavigatorBps(QObject *parent)
+ : QQnxAbstractNavigator(parent)
{
-public:
- QStringList keys() const;
- QGraphicsSystem *create(const QString&);
-};
+ bps_initialize();
+}
-QStringList QVGGraphicsSystemPlugin::keys() const
+QQnxNavigatorBps::~QQnxNavigatorBps()
{
- QStringList list;
- list << "OpenVG";
- return list;
+ bps_shutdown();
}
-QGraphicsSystem* QVGGraphicsSystemPlugin::create(const QString& system)
+bool QQnxNavigatorBps::requestInvokeUrl(const QByteArray &encodedUrl)
{
- if (system.toLower() == "openvg")
- return new QVGLiteGraphicsSystem;
+ char *error = 0;
- return 0;
-}
+ int ret = navigator_invoke(encodedUrl, &error);
+ if (error) {
+ qWarning() << Q_FUNC_INFO << "error=" << error;
+ bps_free(error);
+ }
-Q_EXPORT_PLUGIN2(openvg, QVGGraphicsSystemPlugin)
+ return (ret == BPS_SUCCESS);
+}
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/qnx/qqnxnavigatorbps.h b/src/plugins/platforms/qnx/qqnxnavigatorbps.h
new file mode 100644
index 0000000000..db5c291a96
--- /dev/null
+++ b/src/plugins/platforms/qnx/qqnxnavigatorbps.h
@@ -0,0 +1,62 @@
+/***************************************************************************
+**
+** Copyright (C) 2012 Research In Motion
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QQNXNAVIGATORBPS_H
+#define QQNXNAVIGATORBPS_H
+
+#include "qqnxabstractnavigator.h"
+
+QT_BEGIN_NAMESPACE
+
+class QQnxNavigatorBps : public QQnxAbstractNavigator
+{
+ Q_OBJECT
+public:
+ explicit QQnxNavigatorBps(QObject *parent = 0);
+ ~QQnxNavigatorBps();
+
+protected:
+ bool requestInvokeUrl(const QByteArray &encodedUrl);
+};
+
+QT_END_NAMESPACE
+
+#endif // QQNXNAVIGATORBPS_H
diff --git a/src/plugins/platforms/qnx/qqnxnavigatorpps.cpp b/src/plugins/platforms/qnx/qqnxnavigatorpps.cpp
new file mode 100644
index 0000000000..cce817d1ed
--- /dev/null
+++ b/src/plugins/platforms/qnx/qqnxnavigatorpps.cpp
@@ -0,0 +1,192 @@
+/***************************************************************************
+**
+** Copyright (C) 2012 Research In Motion
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qqnxnavigatorpps.h"
+
+#include <QDebug>
+#include <private/qcore_unix_p.h>
+
+static const char *navigatorControlPath = "/pps/services/navigator/control";
+static const int ppsBufferSize = 4096;
+
+QT_BEGIN_NAMESPACE
+
+QQnxNavigatorPps::QQnxNavigatorPps(QObject *parent)
+ : QQnxAbstractNavigator(parent)
+ , m_fd(-1)
+{
+}
+
+QQnxNavigatorPps::~QQnxNavigatorPps()
+{
+ // close connection to navigator
+ if (m_fd != -1)
+ qt_safe_close(m_fd);
+}
+
+bool QQnxNavigatorPps::openPpsConnection()
+{
+ if (m_fd != -1)
+ return true;
+
+ // open connection to navigator
+ errno = 0;
+ m_fd = qt_safe_open(navigatorControlPath, O_RDWR);
+ if (m_fd == -1) {
+ qWarning("QQNX: failed to open navigator pps, errno=%d", errno);
+ return false;
+ }
+
+#if defined(QQNXNAVIGATOR_DEBUG)
+ qDebug() << Q_FUNC_INFO << "successfully connected to Navigator. fd=" << m_fd;
+#endif
+
+ return true;
+}
+
+bool QQnxNavigatorPps::requestInvokeUrl(const QByteArray &encodedUrl)
+{
+ if (!openPpsConnection())
+ return false;
+
+ return sendPpsMessage("invoke", encodedUrl);
+}
+
+bool QQnxNavigatorPps::sendPpsMessage(const QByteArray &message, const QByteArray &data)
+{
+ QByteArray ppsMessage = "msg::" + message;
+
+ if (!data.isEmpty())
+ ppsMessage += "\ndat::" + data;
+
+ ppsMessage += "\n";
+
+#if defined(QQNXNAVIGATOR_DEBUG)
+ qDebug() << Q_FUNC_INFO << "sending PPS message:\n" << ppsMessage;
+#endif
+
+ // send pps message to navigator
+ errno = 0;
+ int bytes = qt_safe_write(m_fd, ppsMessage.constData(), ppsMessage.size());
+ if (bytes == -1)
+ qFatal("QQNX: failed to write navigator pps, errno=%d", errno);
+
+ // allocate buffer for pps data
+ char buffer[ppsBufferSize];
+
+ // attempt to read pps data
+ do {
+ errno = 0;
+ bytes = qt_safe_read(m_fd, buffer, ppsBufferSize - 1);
+ if (bytes == -1)
+ qFatal("QQNX: failed to read navigator pps, errno=%d", errno);
+ } while (bytes == 0);
+
+ // ensure data is null terminated
+ buffer[bytes] = '\0';
+
+#if defined(QQNXNAVIGATOR_DEBUG)
+ qDebug() << Q_FUNC_INFO << "received PPS message:\n" << buffer;
+#endif
+
+ // process received message
+ QByteArray ppsData(buffer);
+ QHash<QByteArray, QByteArray> responseFields;
+ parsePPS(ppsData, responseFields);
+
+ if (responseFields.contains("res") && responseFields.value("res") == message) {
+ if (responseFields.contains("err")) {
+ qCritical() << "navigator responded with error: " << responseFields.value("err");
+ return false;
+ }
+ }
+
+ return true;
+}
+
+void QQnxNavigatorPps::parsePPS(const QByteArray &ppsData, QHash<QByteArray, QByteArray> &messageFields)
+{
+#if defined(QQNXNAVIGATOR_DEBUG)
+ qDebug() << "PPS: data=" << ppsData;
+#endif
+
+ // tokenize pps data into lines
+ QList<QByteArray> lines = ppsData.split('\n');
+
+ // validate pps object
+ if (lines.size() == 0 || lines.at(0) != "@control") {
+ qFatal("QQNX: unrecognized pps object, data=%s", ppsData.constData());
+ }
+
+ // parse pps object attributes and extract values
+ for (int i = 1; i < lines.size(); i++) {
+
+ // tokenize current attribute
+ const QByteArray &attr = lines.at(i);
+
+#if defined(QQNXNAVIGATOR_DEBUG)
+ qDebug() << "PPS: attr=" << attr;
+#endif
+
+ int firstColon = attr.indexOf(':');
+ if (firstColon == -1) {
+ // abort - malformed attribute
+ continue;
+ }
+
+ int secondColon = attr.indexOf(':', firstColon + 1);
+ if (secondColon == -1) {
+ // abort - malformed attribute
+ continue;
+ }
+
+ QByteArray key = attr.left(firstColon);
+ QByteArray value = attr.mid(secondColon + 1);
+
+#if defined(QQNXNAVIGATOR_DEBUG)
+ qDebug() << "PPS: key=" << key;
+ qDebug() << "PPS: val=" << value;
+#endif
+ messageFields[key] = value;
+ }
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/openkode/main.cpp b/src/plugins/platforms/qnx/qqnxnavigatorpps.h
index 0507d5bfb2..02ad0cc18d 100644
--- a/src/plugins/platforms/openkode/main.cpp
+++ b/src/plugins/platforms/qnx/qqnxnavigatorpps.h
@@ -1,6 +1,6 @@
-/****************************************************************************
+/***************************************************************************
**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2012 Research In Motion
** Contact: http://www.qt-project.org/
**
** This file is part of the plugins of the Qt Toolkit.
@@ -39,34 +39,35 @@
**
****************************************************************************/
-#include <QtGui/QPlatformIntegrationPlugin>
-#include "qopenkodeintegration.h"
+#ifndef QQNXNAVIGATORPPS_H
+#define QQNXNAVIGATORPPS_H
+
+#include "qqnxabstractnavigator.h"
QT_BEGIN_NAMESPACE
-class QOpenKODEPlugin : public QPlatformIntegrationPlugin
+template <typename K, typename V> class QHash;
+
+class QQnxNavigatorPps : public QQnxAbstractNavigator
{
+ Q_OBJECT
public:
- QStringList keys() const;
- QPlatformIntegration *create(const QString&, const QStringList&);
-};
+ explicit QQnxNavigatorPps(QObject *parent = 0);
+ ~QQnxNavigatorPps();
-QStringList QOpenKODEPlugin::keys() const
-{
- QStringList list;
- list << "OpenKODE";
- return list;
-}
+protected:
+ bool requestInvokeUrl(const QByteArray &encodedUrl);
-QPlatformIntegration * QOpenKODEPlugin::create(const QString& system, const QStringList& paramList)
-{
- Q_UNUSED(paramList);
- if (system.toLower() == "openkode")
- return new QOpenKODEIntegration;
+private:
+ bool openPpsConnection();
- return 0;
-}
+ bool sendPpsMessage(const QByteArray &message, const QByteArray &data);
+ void parsePPS(const QByteArray &ppsData, QHash<QByteArray, QByteArray> &messageFields);
-Q_EXPORT_PLUGIN2(openkode, QOpenKODEPlugin)
+private:
+ int m_fd;
+};
QT_END_NAMESPACE
+
+#endif // QQNXNAVIGATORPPS_H
diff --git a/src/plugins/platforms/qnx/qqnxeventthread.cpp b/src/plugins/platforms/qnx/qqnxscreeneventthread.cpp
index 768d508add..a3e50dc8da 100644
--- a/src/plugins/platforms/qnx/qqnxeventthread.cpp
+++ b/src/plugins/platforms/qnx/qqnxscreeneventthread.cpp
@@ -39,7 +39,7 @@
**
****************************************************************************/
-#include "qqnxeventthread.h"
+#include "qqnxscreeneventthread.h"
#include "qqnxscreeneventhandler.h"
#include <QtCore/QDebug>
@@ -49,8 +49,7 @@
#include <cctype>
-QQnxEventThread::QQnxEventThread(screen_context_t context,
- QQnxScreenEventHandler *screenEventHandler)
+QQnxScreenEventThread::QQnxScreenEventThread(screen_context_t context, QQnxScreenEventHandler *screenEventHandler)
: QThread(),
m_screenContext(context),
m_screenEventHandler(screenEventHandler),
@@ -58,18 +57,18 @@ QQnxEventThread::QQnxEventThread(screen_context_t context,
{
}
-QQnxEventThread::~QQnxEventThread()
+QQnxScreenEventThread::~QQnxScreenEventThread()
{
// block until thread terminates
shutdown();
}
-void QQnxEventThread::injectKeyboardEvent(int flags, int sym, int mod, int scan, int cap)
+void QQnxScreenEventThread::injectKeyboardEvent(int flags, int sym, int mod, int scan, int cap)
{
QQnxScreenEventHandler::injectKeyboardEvent(flags, sym, mod, scan, cap);
}
-void QQnxEventThread::run()
+void QQnxScreenEventThread::run()
{
screen_event_t event;
@@ -77,10 +76,10 @@ void QQnxEventThread::run()
errno = 0;
int result = screen_create_event(&event);
if (result)
- qFatal("QQNX: failed to create event, errno=%d", errno);
+ qFatal("QQNX: failed to create screen event, errno=%d", errno);
-#if defined(QQNXEVENTTHREAD_DEBUG)
- qDebug() << "QQNX: event loop started";
+#if defined(QQNXSCREENEVENTTHREAD_DEBUG)
+ qDebug() << "QQNX: screen event thread started";
#endif
// loop indefinitely
@@ -90,7 +89,7 @@ void QQnxEventThread::run()
errno = 0;
result = screen_get_event(m_screenContext, event, -1);
if (result)
- qFatal("QQNX: failed to get event, errno=%d", errno);
+ qFatal("QQNX: failed to get screen event, errno=%d", errno);
// process received event
// get the event type
@@ -98,12 +97,12 @@ void QQnxEventThread::run()
int qnxType;
result = screen_get_event_property_iv(event, SCREEN_PROPERTY_TYPE, &qnxType);
if (result)
- qFatal("QQNX: failed to query event type, errno=%d", errno);
+ qFatal("QQNX: failed to query screen event type, errno=%d", errno);
if (qnxType == SCREEN_EVENT_USER) {
// treat all user events as shutdown requests
- #if defined(QQNXEVENTTHREAD_DEBUG)
- qDebug() << "QQNX: QNX user event";
+ #if defined(QQNXSCREENEVENTTHREAD_DEBUG)
+ qDebug() << "QQNX: QNX user screen event";
#endif
m_quit = true;
} else {
@@ -111,15 +110,15 @@ void QQnxEventThread::run()
}
}
-#if defined(QQNXEVENTTHREAD_DEBUG)
- qDebug() << "QQNX: event loop stopped";
+#if defined(QQNXSCREENEVENTTHREAD_DEBUG)
+ qDebug() << "QQNX: screen event thread stopped";
#endif
// cleanup
screen_destroy_event(event);
}
-void QQnxEventThread::shutdown()
+void QQnxScreenEventThread::shutdown()
{
screen_event_t event;
@@ -127,14 +126,14 @@ void QQnxEventThread::shutdown()
errno = 0;
int result = screen_create_event(&event);
if (result)
- qFatal("QQNX: failed to create event, errno=%d", errno);
+ qFatal("QQNX: failed to create screen event, errno=%d", errno);
// set the event type as user
errno = 0;
int type = SCREEN_EVENT_USER;
result = screen_set_event_property_iv(event, SCREEN_PROPERTY_TYPE, &type);
if (result)
- qFatal("QQNX: failed to set event type, errno=%d", errno);
+ qFatal("QQNX: failed to set screen event type, errno=%d", errno);
// NOTE: ignore SCREEN_PROPERTY_USER_DATA; treat all user events as shutdown events
@@ -142,19 +141,19 @@ void QQnxEventThread::shutdown()
errno = 0;
result = screen_send_event(m_screenContext, event, getpid());
if (result)
- qFatal("QQNX: failed to set event type, errno=%d", errno);
+ qFatal("QQNX: failed to set screen event type, errno=%d", errno);
// cleanup
screen_destroy_event(event);
-#if defined(QQNXEVENTTHREAD_DEBUG)
- qDebug() << "QQNX: event loop shutdown begin";
+#if defined(QQNXSCREENEVENTTHREAD_DEBUG)
+ qDebug() << "QQNX: screen event thread shutdown begin";
#endif
// block until thread terminates
wait();
-#if defined(QQNXEVENTTHREAD_DEBUG)
- qDebug() << "QQNX: event loop shutdown end";
+#if defined(QQNXSCREENEVENTTHREAD_DEBUG)
+ qDebug() << "QQNX: screen event thread shutdown end";
#endif
}
diff --git a/src/plugins/platforms/qnx/qqnxeventthread.h b/src/plugins/platforms/qnx/qqnxscreeneventthread.h
index aa6186aa0d..4f41e67940 100644
--- a/src/plugins/platforms/qnx/qqnxeventthread.h
+++ b/src/plugins/platforms/qnx/qqnxscreeneventthread.h
@@ -39,8 +39,8 @@
**
****************************************************************************/
-#ifndef QQNXEVENTTHREAD_H
-#define QQNXEVENTTHREAD_H
+#ifndef QQNXSCREENEVENTTHREAD_H
+#define QQNXSCREENEVENTTHREAD_H
#include <QtCore/QThread>
@@ -50,11 +50,11 @@ QT_BEGIN_NAMESPACE
class QQnxScreenEventHandler;
-class QQnxEventThread : public QThread
+class QQnxScreenEventThread : public QThread
{
public:
- QQnxEventThread(screen_context_t context, QQnxScreenEventHandler *screenEventHandler);
- virtual ~QQnxEventThread();
+ QQnxScreenEventThread(screen_context_t context, QQnxScreenEventHandler *screenEventHandler);
+ ~QQnxScreenEventThread();
static void injectKeyboardEvent(int flags, int sym, int mod, int scan, int cap);
@@ -71,4 +71,4 @@ private:
QT_END_NAMESPACE
-#endif // QQNXEVENTTHREAD_H
+#endif // QQNXSCREENEVENTTHREAD_H
diff --git a/src/plugins/platforms/qnx/qqnxservices.cpp b/src/plugins/platforms/qnx/qqnxservices.cpp
index a1a27906ae..b02dd25527 100644
--- a/src/plugins/platforms/qnx/qqnxservices.cpp
+++ b/src/plugins/platforms/qnx/qqnxservices.cpp
@@ -41,21 +41,17 @@
#include "qqnxservices.h"
-#include <bps/navigator.h>
-#include <stdbool.h>
-#include <sys/platform.h>
-#include <QUrl>
+#include "qqnxabstractnavigator.h"
QT_BEGIN_NAMESPACE
-QQnxServices::QQnxServices()
+QQnxServices::QQnxServices(QQnxAbstractNavigator *navigator)
+ : m_navigator(navigator)
{
- bps_initialize();
}
QQnxServices::~QQnxServices()
{
- bps_shutdown();
}
bool QQnxServices::openUrl(const QUrl &url)
@@ -70,12 +66,7 @@ bool QQnxServices::openDocument(const QUrl &url)
bool QQnxServices::navigatorInvoke(const QUrl &url)
{
- if (!url.isValid() || url.isRelative())
- return false;
-
- int ret = navigator_invoke(url.toString().toUtf8(), 0);
-
- return (ret == BPS_SUCCESS);
+ return m_navigator->invokeUrl(url);
}
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/qnx/qqnxservices.h b/src/plugins/platforms/qnx/qqnxservices.h
index 36eb8edf65..fe7c014047 100644
--- a/src/plugins/platforms/qnx/qqnxservices.h
+++ b/src/plugins/platforms/qnx/qqnxservices.h
@@ -46,10 +46,12 @@
QT_BEGIN_NAMESPACE
+class QQnxAbstractNavigator;
+
class QQnxServices : public QPlatformServices
{
public:
- QQnxServices();
+ explicit QQnxServices(QQnxAbstractNavigator *navigator);
~QQnxServices();
bool openUrl(const QUrl &url);
@@ -57,6 +59,9 @@ public:
private:
bool navigatorInvoke(const QUrl &url);
+
+private:
+ QQnxAbstractNavigator *m_navigator;
};
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/qnx/qqnxvirtualkeyboardbps.cpp b/src/plugins/platforms/qnx/qqnxvirtualkeyboardbps.cpp
new file mode 100644
index 0000000000..3f0e5b2713
--- /dev/null
+++ b/src/plugins/platforms/qnx/qqnxvirtualkeyboardbps.cpp
@@ -0,0 +1,209 @@
+/***************************************************************************
+**
+** Copyright (C) 2012 Research In Motion
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qqnxvirtualkeyboardbps.h"
+
+#include <QDebug>
+
+#include <bps/event.h>
+#include <bps/locale.h>
+#include <bps/virtualkeyboard.h>
+
+QT_BEGIN_NAMESPACE
+
+QQnxVirtualKeyboardBps::QQnxVirtualKeyboardBps(QObject *parent)
+ : QQnxAbstractVirtualKeyboard(parent)
+{
+ if (locale_request_events(0) != BPS_SUCCESS)
+ qWarning("QQNX: Failed to register for locale events");
+
+ if (virtualkeyboard_request_events(0) != BPS_SUCCESS)
+ qWarning("QQNX: Failed to register for virtual keyboard events");
+
+ int height = 0;
+ if (virtualkeyboard_get_height(&height) != BPS_SUCCESS)
+ qWarning("QQNX: Failed to get virtual keyboard height");
+
+ setHeight(height);
+}
+
+bool QQnxVirtualKeyboardBps::handleEvent(bps_event_t *event)
+{
+ const int eventDomain = bps_event_get_domain(event);
+ if (eventDomain == locale_get_domain())
+ return handleLocaleEvent(event);
+
+ if (eventDomain == virtualkeyboard_get_domain())
+ return handleVirtualKeyboardEvent(event);
+
+ return false;
+}
+
+bool QQnxVirtualKeyboardBps::showKeyboard()
+{
+#if defined(QQNXVIRTUALKEYBOARD_DEBUG)
+ qDebug() << Q_FUNC_INFO << "current visibility=" << isVisible();
+#endif
+
+ virtualkeyboard_show();
+ return true;
+}
+
+bool QQnxVirtualKeyboardBps::hideKeyboard()
+{
+#if defined(QQNXVIRTUALKEYBOARD_DEBUG)
+ qDebug() << Q_FUNC_INFO << "current visibility=" << isVisible();
+#endif
+
+ virtualkeyboard_hide();
+ return true;
+}
+
+void QQnxVirtualKeyboardBps::applyKeyboardMode(KeyboardMode mode)
+{
+ virtualkeyboard_layout_t layout = VIRTUALKEYBOARD_LAYOUT_DEFAULT;
+
+ switch (mode) {
+ case Url:
+ layout = VIRTUALKEYBOARD_LAYOUT_URL;
+ break;
+
+ case Email:
+ layout = VIRTUALKEYBOARD_LAYOUT_EMAIL;
+ break;
+
+ case Web:
+ layout = VIRTUALKEYBOARD_LAYOUT_WEB;
+ break;
+
+ case NumPunc:
+ layout = VIRTUALKEYBOARD_LAYOUT_NUM_PUNC;
+ break;
+
+ case Symbol:
+ layout = VIRTUALKEYBOARD_LAYOUT_SYMBOL;
+ break;
+
+ case Phone:
+ layout = VIRTUALKEYBOARD_LAYOUT_PHONE;
+ break;
+
+ case Pin:
+ layout = VIRTUALKEYBOARD_LAYOUT_PIN;
+ break;
+
+ case Default: // fall through
+ default:
+ layout = VIRTUALKEYBOARD_LAYOUT_DEFAULT;
+ break;
+ }
+
+#if defined(QQNXVIRTUALKEYBOARD_DEBUG)
+ qDebug() << Q_FUNC_INFO << "mode=" << mode;
+#endif
+
+ virtualkeyboard_change_options(layout, VIRTUALKEYBOARD_ENTER_DEFAULT);
+}
+
+bool QQnxVirtualKeyboardBps::handleLocaleEvent(bps_event_t *event)
+{
+ if (bps_event_get_code(event) == LOCALE_INFO) {
+ const QString language = QString::fromAscii(locale_event_get_language(event));
+ const QString country = QString::fromAscii(locale_event_get_country(event));
+
+ const QLocale newLocale(language + QLatin1Char('_') + country);
+
+#if defined(QQNXVIRTUALKEYBOARD_DEBUG)
+ qDebug() << Q_FUNC_INFO << "current locale" << locale() << "new locale=" << newLocale;
+#endif
+ setLocale(newLocale);
+ return true;
+ }
+
+#if defined(QQNXVIRTUALKEYBOARD_DEBUG)
+ qDebug() << "QQNX: Unhandled locale event. code=" << bps_event_get_code(event);
+#endif
+
+ return false;
+}
+
+bool QQnxVirtualKeyboardBps::handleVirtualKeyboardEvent(bps_event_t *event)
+{
+ switch (bps_event_get_code(event)) {
+ case VIRTUALKEYBOARD_EVENT_VISIBLE:
+ #if defined(QQNXVIRTUALKEYBOARD_DEBUG)
+ qDebug() << Q_FUNC_INFO << "EVENT VISIBLE: current visibility=" << isVisible();
+ #endif
+
+ setVisible(true);
+ break;
+
+ case VIRTUALKEYBOARD_EVENT_HIDDEN:
+ #if defined(QQNXVIRTUALKEYBOARD_DEBUG)
+ qDebug() << Q_FUNC_INFO << "EVENT HIDDEN: current visibility=" << isVisible();
+ #endif
+
+ setVisible(false);
+ break;
+
+ case VIRTUALKEYBOARD_EVENT_INFO: {
+ const int newHeight = virtualkeyboard_event_get_height(event);
+
+ #if defined(QQNXVIRTUALKEYBOARD_DEBUG)
+ qDebug() << Q_FUNC_INFO << "EVENT INFO: current height=" << height() << "new height=" << newHeight;
+ #endif
+
+ setHeight(newHeight);
+ break;
+ }
+
+ default:
+ #if defined(QQNXVIRTUALKEYBOARD_DEBUG)
+ qDebug() << "QQNX: Unhandled virtual keyboard event. code=" << bps_event_get_code(event);
+ #endif
+
+ return false;
+ }
+
+ return true;
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/openkode/qopenkodeeventloopintegration.h b/src/plugins/platforms/qnx/qqnxvirtualkeyboardbps.h
index 0ba0eb882f..0fc95aad50 100644
--- a/src/plugins/platforms/openkode/qopenkodeeventloopintegration.h
+++ b/src/plugins/platforms/qnx/qqnxvirtualkeyboardbps.h
@@ -1,6 +1,6 @@
-/****************************************************************************
+/***************************************************************************
**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2012 Research In Motion
** Contact: http://www.qt-project.org/
**
** This file is part of the plugins of the Qt Toolkit.
@@ -39,33 +39,34 @@
**
****************************************************************************/
-#ifndef QOPENKODEEVENTLOOPINTEGRATION_H
-#define QOPENKODEEVENTLOOPINTEGRATION_H
+#ifndef QQNXVIRTUALKEYBOARDBPS_H
+#define QQNXVIRTUALKEYBOARDBPS_H
-#include <QtGui/QPlatformEventLoopIntegration>
+#include "qqnxabstractvirtualkeyboard.h"
-class KDThread;
-class KDEvent;
+struct bps_event_t;
-QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
-class QOpenKODEEventLoopIntegration : public QPlatformEventLoopIntegration
+class QQnxVirtualKeyboardBps : public QQnxAbstractVirtualKeyboard
{
+ Q_OBJECT
public:
- QOpenKODEEventLoopIntegration();
- void startEventLoop();
- void quitEventLoop();
- void qtNeedsToProcessEvents();
+ explicit QQnxVirtualKeyboardBps(QObject *parent = 0);
- void processInputEvent(const KDEvent *event);
-private:
+ bool handleEvent(bps_event_t *event);
+
+ bool showKeyboard();
+ bool hideKeyboard();
- bool m_quit;
- KDThread *m_kdThread;
+protected:
+ void applyKeyboardMode(KeyboardMode mode);
+
+private:
+ bool handleLocaleEvent(bps_event_t *event);
+ bool handleVirtualKeyboardEvent(bps_event_t *event);
};
QT_END_NAMESPACE
-QT_END_HEADER
-#endif // QOPENKODEEVENTLOOPINTEGRATION_H
+#endif // QQNXVIRTUALKEYBOARDBPS_H
diff --git a/src/plugins/platforms/qnx/qqnxvirtualkeyboard.cpp b/src/plugins/platforms/qnx/qqnxvirtualkeyboardpps.cpp
index 916c6dfa62..d139e7f66b 100644
--- a/src/plugins/platforms/qnx/qqnxvirtualkeyboard.cpp
+++ b/src/plugins/platforms/qnx/qqnxvirtualkeyboardpps.cpp
@@ -39,7 +39,7 @@
**
****************************************************************************/
-#include "qqnxvirtualkeyboard.h"
+#include "qqnxvirtualkeyboardpps.h"
#include "qqnxscreen.h"
#include <QtCore/QDebug>
@@ -58,13 +58,13 @@
QT_BEGIN_NAMESPACE
-const char *QQnxVirtualKeyboard::ms_PPSPath = "/pps/services/input/control?wait";
-const size_t QQnxVirtualKeyboard::ms_bufferSize = 2048;
+const char *QQnxVirtualKeyboardPps::ms_PPSPath = "/pps/services/input/control";
+const size_t QQnxVirtualKeyboardPps::ms_bufferSize = 2048;
// Huge hack for keyboard shadow (see QNX PR 88400). Should be removed ASAP.
#define KEYBOARD_SHADOW_HEIGHT 8
-QQnxVirtualKeyboard::QQnxVirtualKeyboard()
+QQnxVirtualKeyboardPps::QQnxVirtualKeyboardPps()
: m_encoder(0),
m_decoder(0),
m_buffer(0),
@@ -73,26 +73,26 @@ QQnxVirtualKeyboard::QQnxVirtualKeyboard()
{
}
-QQnxVirtualKeyboard::~QQnxVirtualKeyboard()
+QQnxVirtualKeyboardPps::~QQnxVirtualKeyboardPps()
{
close();
}
-void QQnxVirtualKeyboard::start()
+void QQnxVirtualKeyboardPps::start()
{
-#ifdef QQNXVIRTUALKEYBOARD_DEBUG
+#if defined(QQNXVIRTUALKEYBOARD_DEBUG)
qDebug() << "QQNX: starting keyboard event processing";
#endif
if (!connect())
return;
}
-void QQnxVirtualKeyboard::applyKeyboardMode(KeyboardMode mode)
+void QQnxVirtualKeyboardPps::applyKeyboardMode(KeyboardMode mode)
{
applyKeyboardModeOptions(mode);
}
-void QQnxVirtualKeyboard::close()
+void QQnxVirtualKeyboardPps::close()
{
delete m_readNotifier;
m_readNotifier = 0;
@@ -118,7 +118,7 @@ void QQnxVirtualKeyboard::close()
m_buffer = 0;
}
-bool QQnxVirtualKeyboard::connect()
+bool QQnxVirtualKeyboardPps::connect()
{
close();
@@ -153,7 +153,7 @@ bool QQnxVirtualKeyboard::connect()
return true;
}
-bool QQnxVirtualKeyboard::queryPPSInfo()
+bool QQnxVirtualKeyboardPps::queryPPSInfo()
{
// Request info, requires id to regenerate res message.
pps_encoder_add_string(m_encoder, "msg", "info");
@@ -169,11 +169,11 @@ bool QQnxVirtualKeyboard::queryPPSInfo()
return true;
}
-void QQnxVirtualKeyboard::ppsDataReady()
+void QQnxVirtualKeyboardPps::ppsDataReady()
{
ssize_t nread = qt_safe_read(m_fd, m_buffer, ms_bufferSize - 1);
-#ifdef QQNXVIRTUALKEYBOARD_DEBUG
+#if defined(QQNXVIRTUALKEYBOARD_DEBUG)
qDebug() << "QQNX: keyboardMessage size: " << nread;
#endif
if (nread < 0){
@@ -181,6 +181,11 @@ void QQnxVirtualKeyboard::ppsDataReady()
return;
}
+ // We sometimes get spurious read notifications when no data is available.
+ // Bail out early in this case
+ if (nread == 0)
+ return;
+
// nread is the real space necessary, not the amount read.
if (static_cast<size_t>(nread) > ms_bufferSize - 1) {
qCritical("QQnxVirtualKeyboard: Keyboard buffer size too short; need %u.", nread + 1);
@@ -191,7 +196,7 @@ void QQnxVirtualKeyboard::ppsDataReady()
m_buffer[nread] = 0;
pps_decoder_parse_pps_str(m_decoder, m_buffer);
pps_decoder_push(m_decoder, NULL);
-#ifdef QQNXVIRTUALKEYBOARD_DEBUG
+#if defined(QQNXVIRTUALKEYBOARD_DEBUG)
pps_decoder_dump_tree(m_decoder, stderr);
#endif
@@ -220,7 +225,7 @@ void QQnxVirtualKeyboard::ppsDataReady()
qCritical("QQnxVirtualKeyboard: Unexpected keyboard PPS message type");
}
-void QQnxVirtualKeyboard::handleKeyboardInfoMessage()
+void QQnxVirtualKeyboardPps::handleKeyboardInfoMessage()
{
int newHeight = 0;
const char *value;
@@ -256,14 +261,14 @@ void QQnxVirtualKeyboard::handleKeyboardInfoMessage()
const QLocale locale = QLocale(languageId + QLatin1Char('_') + countryId);
setLocale(locale);
-#ifdef QQNXVIRTUALKEYBOARD_DEBUG
- qDebug() << "QQNX: handleKeyboardInfoMessage size=" << m_height << "locale=" << m_locale;
+#if defined(QQNXVIRTUALKEYBOARD_DEBUG)
+ qDebug() << "QQNX: handleKeyboardInfoMessage size=" << newHeight << "locale=" << locale;
#endif
}
-bool QQnxVirtualKeyboard::showKeyboard()
+bool QQnxVirtualKeyboardPps::showKeyboard()
{
-#ifdef QQNXVIRTUALKEYBOARD_DEBUG
+#if defined(QQNXVIRTUALKEYBOARD_DEBUG)
qDebug() << "QQNX: showKeyboard()";
#endif
@@ -295,9 +300,9 @@ bool QQnxVirtualKeyboard::showKeyboard()
return true;
}
-bool QQnxVirtualKeyboard::hideKeyboard()
+bool QQnxVirtualKeyboardPps::hideKeyboard()
{
-#ifdef QQNXVIRTUALKEYBOARD_DEBUG
+#if defined(QQNXVIRTUALKEYBOARD_DEBUG)
qDebug() << "QQNX: hideKeyboard()";
#endif
@@ -327,7 +332,7 @@ bool QQnxVirtualKeyboard::hideKeyboard()
return true;
}
-void QQnxVirtualKeyboard::applyKeyboardModeOptions(KeyboardMode mode)
+void QQnxVirtualKeyboardPps::applyKeyboardModeOptions(KeyboardMode mode)
{
// Try to connect.
if (m_fd == -1 && !connect())
@@ -374,49 +379,49 @@ void QQnxVirtualKeyboard::applyKeyboardModeOptions(KeyboardMode mode)
pps_encoder_reset(m_encoder);
}
-void QQnxVirtualKeyboard::addDefaultModeOptions()
+void QQnxVirtualKeyboardPps::addDefaultModeOptions()
{
pps_encoder_add_string(m_encoder, "enter", "enter.default");
pps_encoder_add_string(m_encoder, "type", "default");
}
-void QQnxVirtualKeyboard::addUrlModeOptions()
+void QQnxVirtualKeyboardPps::addUrlModeOptions()
{
pps_encoder_add_string(m_encoder, "enter", "enter.default");
pps_encoder_add_string(m_encoder, "type", "url");
}
-void QQnxVirtualKeyboard::addEmailModeOptions()
+void QQnxVirtualKeyboardPps::addEmailModeOptions()
{
pps_encoder_add_string(m_encoder, "enter", "enter.default");
pps_encoder_add_string(m_encoder, "type", "email");
}
-void QQnxVirtualKeyboard::addWebModeOptions()
+void QQnxVirtualKeyboardPps::addWebModeOptions()
{
pps_encoder_add_string(m_encoder, "enter", "enter.default");
pps_encoder_add_string(m_encoder, "type", "web");
}
-void QQnxVirtualKeyboard::addNumPuncModeOptions()
+void QQnxVirtualKeyboardPps::addNumPuncModeOptions()
{
pps_encoder_add_string(m_encoder, "enter", "enter.default");
pps_encoder_add_string(m_encoder, "type", "numPunc");
}
-void QQnxVirtualKeyboard::addPhoneModeOptions()
+void QQnxVirtualKeyboardPps::addPhoneModeOptions()
{
pps_encoder_add_string(m_encoder, "enter", "enter.default");
pps_encoder_add_string(m_encoder, "type", "phone");
}
-void QQnxVirtualKeyboard::addPinModeOptions()
+void QQnxVirtualKeyboardPps::addPinModeOptions()
{
pps_encoder_add_string(m_encoder, "enter", "enter.default");
pps_encoder_add_string(m_encoder, "type", "pin");
}
-void QQnxVirtualKeyboard::addSymbolModeOptions()
+void QQnxVirtualKeyboardPps::addSymbolModeOptions()
{
pps_encoder_add_string(m_encoder, "enter", "enter.default");
pps_encoder_add_string(m_encoder, "type", "symbol");
diff --git a/src/plugins/platforms/qnx/qqnxvirtualkeyboard.h b/src/plugins/platforms/qnx/qqnxvirtualkeyboardpps.h
index b01a4df963..abcf411fed 100644
--- a/src/plugins/platforms/qnx/qqnxvirtualkeyboard.h
+++ b/src/plugins/platforms/qnx/qqnxvirtualkeyboardpps.h
@@ -39,8 +39,8 @@
**
****************************************************************************/
-#ifndef VIRTUALKEYBOARD_H_
-#define VIRTUALKEYBOARD_H_
+#ifndef VIRTUALKEYBOARDPPS_H_
+#define VIRTUALKEYBOARDPPS_H_
#include "qqnxabstractvirtualkeyboard.h"
@@ -50,13 +50,12 @@ QT_BEGIN_NAMESPACE
class QSocketNotifier;
-/* Shamelessly copied from the browser - this should be rewritten once we have a proper PPS wrapper class */
-class QQnxVirtualKeyboard : public QQnxAbstractVirtualKeyboard
+class QQnxVirtualKeyboardPps : public QQnxAbstractVirtualKeyboard
{
Q_OBJECT
public:
- QQnxVirtualKeyboard();
- ~QQnxVirtualKeyboard();
+ QQnxVirtualKeyboardPps();
+ ~QQnxVirtualKeyboardPps();
bool showKeyboard();
bool hideKeyboard();
@@ -98,4 +97,4 @@ private:
static const size_t ms_bufferSize;
};
-#endif /* VIRTUALKEYBOARD_H_ */
+#endif /* VIRTUALKEYBOARDPPS_H_ */
diff --git a/src/plugins/platforms/qnx/qqnxwindow.cpp b/src/plugins/platforms/qnx/qqnxwindow.cpp
index 2b41631d06..e37c82740c 100644
--- a/src/plugins/platforms/qnx/qqnxwindow.cpp
+++ b/src/plugins/platforms/qnx/qqnxwindow.cpp
@@ -40,7 +40,9 @@
****************************************************************************/
#include "qqnxwindow.h"
+#ifndef QT_NO_OPENGL
#include "qqnxglcontext.h"
+#endif
#include "qqnxintegration.h"
#include "qqnxscreen.h"
@@ -59,7 +61,9 @@ QQnxWindow::QQnxWindow(QWindow *window, screen_context_t context)
m_window(0),
m_currentBufferIndex(-1),
m_previousBufferIndex(-1),
+#ifndef QT_NO_OPENGL
m_platformOpenGLContext(0),
+#endif
m_screen(0),
m_parentWindow(0),
m_visible(true)
@@ -240,6 +244,9 @@ void QQnxWindow::setVisible(bool visible)
root->updateVisibility(root->m_visible);
window()->requestActivateWindow();
+
+ if (window()->isTopLevel() && visible)
+ QWindowSystemInterface::handleExposeEvent(window(), window()->geometry());
}
void QQnxWindow::updateVisibility(bool parentVisible)
@@ -278,6 +285,11 @@ void QQnxWindow::setOpacity(qreal level)
// the transparency will look wrong...
}
+bool QQnxWindow::isExposed() const
+{
+ return m_visible;
+}
+
void QQnxWindow::setBufferSize(const QSize &size)
{
#if defined(QQNXWINDOW_DEBUG)
@@ -293,6 +305,7 @@ void QQnxWindow::setBufferSize(const QSize &size)
// Create window buffers if they do not exist
if (!hasBuffers()) {
+#ifndef QT_NO_OPENGL
// Get pixel format from EGL config if using OpenGL;
// otherwise inherit pixel format of window's screen
if (m_platformOpenGLContext != 0) {
@@ -300,6 +313,7 @@ void QQnxWindow::setBufferSize(const QSize &size)
} else {
val[0] = m_screen->nativeFormat();
}
+#endif
errno = 0;
result = screen_set_window_property_iv(m_window, SCREEN_PROPERTY_FORMAT, val);
@@ -545,12 +559,14 @@ void QQnxWindow::gainedFocus()
QWindowSystemInterface::handleWindowActivated(window());
}
+#ifndef QT_NO_OPENGL
void QQnxWindow::setPlatformOpenGLContext(QQnxGLContext *platformOpenGLContext)
{
// This function does not take ownership of the platform gl context.
// It is owned by the frontend QOpenGLContext
m_platformOpenGLContext = platformOpenGLContext;
}
+#endif
QQnxWindow *QQnxWindow::findWindow(screen_window_t windowHandle)
{
diff --git a/src/plugins/platforms/qnx/qqnxwindow.h b/src/plugins/platforms/qnx/qqnxwindow.h
index 63e71c0bf8..2ea7bbca51 100644
--- a/src/plugins/platforms/qnx/qqnxwindow.h
+++ b/src/plugins/platforms/qnx/qqnxwindow.h
@@ -48,7 +48,9 @@
#include <QtGui/QImage>
+#ifndef QT_NO_OPENGL
#include <EGL/egl.h>
+#endif
#include <screen/screen.h>
@@ -57,7 +59,9 @@ QT_BEGIN_NAMESPACE
// all surfaces double buffered
#define MAX_BUFFER_COUNT 2
+#ifndef QT_NO_OPENGL
class QQnxGLContext;
+#endif
class QQnxScreen;
class QSurfaceFormat;
@@ -73,6 +77,8 @@ public:
void setVisible(bool visible);
void setOpacity(qreal level);
+ bool isExposed() const;
+
WId winId() const { return (WId)m_window; }
screen_window_t nativeHandle() const { return m_window; }
@@ -96,8 +102,10 @@ public:
QQnxScreen *screen() const { return m_screen; }
const QList<QQnxWindow*>& children() const { return m_childWindows; }
+#ifndef QT_NO_OPENGL
void setPlatformOpenGLContext(QQnxGLContext *platformOpenGLContext);
QQnxGLContext *platformOpenGLContext() const { return m_platformOpenGLContext; }
+#endif
QQnxWindow *findWindow(screen_window_t windowHandle);
@@ -122,7 +130,9 @@ private:
QRegion m_previousDirty;
QRegion m_scrolled;
+#ifndef QT_NO_OPENGL
QQnxGLContext *m_platformOpenGLContext;
+#endif
QQnxScreen *m_screen;
QList<QQnxWindow*> m_childWindows;
QQnxWindow *m_parentWindow;
diff --git a/src/plugins/platforms/qvfb/qvfb.pro b/src/plugins/platforms/qvfb/qvfb.pro
deleted file mode 100644
index 8738b18bc6..0000000000
--- a/src/plugins/platforms/qvfb/qvfb.pro
+++ /dev/null
@@ -1,14 +0,0 @@
-TARGET = qvfbintegration
-load(qt_plugin)
-
-DESTDIR = $$QT.gui.plugins/platforms
-
-QT += core-private gui-private platformsupport-private
-
-SOURCES = main.cpp qvfbintegration.cpp qvfbwindowsurface.cpp
-HEADERS = qvfbintegration.h qvfbwindowsurface.h
-
-CONFIG += qpa/genericunixfontdatabase
-
-target.path += $$[QT_INSTALL_PLUGINS]/platforms
-INSTALLS += target
diff --git a/src/plugins/platforms/qvfb/qvfbintegration.cpp b/src/plugins/platforms/qvfb/qvfbintegration.cpp
deleted file mode 100644
index 478733e96f..0000000000
--- a/src/plugins/platforms/qvfb/qvfbintegration.cpp
+++ /dev/null
@@ -1,454 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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, Nokia gives you certain additional
-** rights. These rights are described in the Nokia 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.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/ipc.h>
-#include <sys/shm.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <private/qcore_unix_p.h> // overrides QT_OPEN
-
-#include <qvfbhdr.h>
-#include <qsocketnotifier.h>
-
-#include "qvfbintegration.h"
-#include "qvfbwindowsurface.h"
-#include <QtGui/private/qpixmap_raster_p.h>
-#include <QtCore/qdebug.h>
-#include <QMouseEvent>
-
-#include <qsocketnotifier.h>
-#include <QApplication>
-#include <QWindowSystemInterface>
-
-#include "qgenericunixfontdatabase.h"
-#include "qgenericunixeventdispatcher.h"
-
-QT_BEGIN_NAMESPACE
-
-
-class QVFbScreenKeyboardHandler : public QObject
-{
- Q_OBJECT
-public:
- QVFbScreenKeyboardHandler(int displayId);
- ~QVFbScreenKeyboardHandler();
-
-private slots:
- void readKeyboardData();
-
-private:
- int kbdFD;
- int kbdIdx;
- int kbdBufferLen;
- unsigned char *kbdBuffer;
- QSocketNotifier *keyNotifier;
-};
-
-QVFbScreenKeyboardHandler::QVFbScreenKeyboardHandler(int displayId)
-{
- const QString keyboardDev = QT_VFB_KEYBOARD_PIPE(displayId);
-
-
- kbdFD = -1;
- kbdIdx = 0;
- kbdBufferLen = sizeof(QVFbKeyData) * 5;
- kbdBuffer = new unsigned char [kbdBufferLen];
-
- kbdFD = QT_OPEN(keyboardDev.toLatin1().constData(), O_RDWR | O_NDELAY);
-
- if (kbdFD == -1) {
- perror("QVFbScreenKeyboardHandler");
- qWarning("QVFbScreenKeyboardHandler: Unable to open device %s",
- qPrintable(keyboardDev));
- return;
- }
-
- // Clear pending input
- char buf[2];
- while (QT_READ(kbdFD, buf, 1) > 0) { }
-
- keyNotifier = new QSocketNotifier(kbdFD, QSocketNotifier::Read, this);
- connect(keyNotifier, SIGNAL(activated(int)),this, SLOT(readKeyboardData()));
-
-}
-
-QVFbScreenKeyboardHandler::~QVFbScreenKeyboardHandler()
-{
- if (kbdFD >= 0)
- QT_CLOSE(kbdFD);
- delete [] kbdBuffer;
-}
-
-
-void QVFbScreenKeyboardHandler::readKeyboardData()
-{
- int n;
- do {
- n = QT_READ(kbdFD, kbdBuffer+kbdIdx, kbdBufferLen - kbdIdx);
- if (n > 0)
- kbdIdx += n;
- } while (n > 0);
-
- int idx = 0;
- while (kbdIdx - idx >= (int)sizeof(QVFbKeyData)) {
- QVFbKeyData *kd = (QVFbKeyData *)(kbdBuffer + idx);
- if (kd->unicode == 0 && kd->keycode == 0 && kd->modifiers == 0 && kd->press) {
- // magic exit key
- qWarning("Instructed to quit by Virtual Keyboard");
- qApp->quit();
- }
-
- //QWSServer::processKeyEvent(kd->unicode ? kd->unicode : 0xffff, kd->keycode, kd->modifiers, kd->press, kd->repeat);
-
- QEvent::Type type = kd->press ? QEvent::KeyPress : QEvent::KeyRelease;
-
- QString text;
- if (kd->unicode && kd->unicode != 0xffff)
- text += QChar(kd->unicode);
-
-// qDebug() << "readKeyboardData" << type << hex << kd->keycode << kd->modifiers << text;
-
- QWindowSystemInterface::handleKeyEvent(0, type, kd->keycode, kd->modifiers, text, kd->repeat, int(text.length()));
- idx += sizeof(QVFbKeyData);
- }
-
- int surplus = kbdIdx - idx;
- for (int i = 0; i < surplus; i++)
- kbdBuffer[i] = kbdBuffer[idx+i];
- kbdIdx = surplus;
-}
-
-
-
-
-class QVFbScreenMouseHandler : public QObject
-{
- Q_OBJECT
-public:
- QVFbScreenMouseHandler(int displayId);
- ~QVFbScreenMouseHandler();
-
-private slots:
- void readMouseData();
-
-private:
- int mouseFD;
- int mouseIdx;
- enum {mouseBufSize = 128};
- uchar mouseBuf[mouseBufSize];
- QSocketNotifier *mouseNotifier;
-
- int oldButtonState;
-};
-
-QVFbScreenMouseHandler::QVFbScreenMouseHandler(int displayId)
-{
- QString mouseDev = QT_VFB_MOUSE_PIPE(displayId);
-
- mouseFD = QT_OPEN(mouseDev.toLatin1().constData(), O_RDWR | O_NDELAY);
-
- if (mouseFD == -1) {
- perror("QVFbMouseHandler::QVFbMouseHandler");
- qWarning("QVFbMouseHander: Unable to open device %s",
- qPrintable(mouseDev));
- return;
- }
-
- // Clear pending input
- char buf[2];
- while (QT_READ(mouseFD, buf, 1) > 0) { }
-
- mouseIdx = 0;
- oldButtonState = 0;
- mouseNotifier = new QSocketNotifier(mouseFD, QSocketNotifier::Read, this);
- connect(mouseNotifier, SIGNAL(activated(int)),this, SLOT(readMouseData()));
-}
-
-
-QVFbScreenMouseHandler::~QVFbScreenMouseHandler()
-{
- if (mouseFD >= 0)
- QT_CLOSE(mouseFD);
-}
-
-void QVFbScreenMouseHandler::readMouseData()
-{
- int n;
- do {
- n = QT_READ(mouseFD, mouseBuf+mouseIdx, mouseBufSize-mouseIdx);
- if (n > 0)
- mouseIdx += n;
- } while (n > 0);
-
- int idx = 0;
- static const int packetsize = sizeof(QPoint) + 2*sizeof(int);
- while (mouseIdx-idx >= packetsize) {
- uchar *mb = mouseBuf+idx;
- QPoint mousePos = *reinterpret_cast<QPoint *>(mb);
- mb += sizeof(QPoint);
- int bstate = *reinterpret_cast<int *>(mb);
- mb += sizeof(int);
- //int wheel = *reinterpret_cast<int *>(mb);
-
- int button = bstate ^ oldButtonState;
- QEvent::Type type = QEvent::MouseMove;
-
- if (button) {
- type = (button & bstate) ? QEvent::MouseButtonPress : QEvent::MouseButtonRelease;
- }
- QWindowSystemInterface::handleMouseEvent(0, mousePos, mousePos, Qt::MouseButtons(bstate));
-
-// qDebug() << "readMouseData" << mousePos << button << bstate << oldButtonState << type;
-
- oldButtonState = bstate;
-
- idx += packetsize;
- }
-
- int surplus = mouseIdx - idx;
- for (int i = 0; i < surplus; i++)
- mouseBuf[i] = mouseBuf[idx+i];
- mouseIdx = surplus;
-
-}
-
-
-class QVFbScreenPrivate
-{
-public:
- QVFbScreenPrivate(int id)
- : shmrgn(0), hdr(0), data(0), mouseHandler(0), keyboardHandler(0)
- {
- displayId = id;
- connect(displayId);
- }
-
- ~QVFbScreenPrivate() { disconnect(); }
- void setDirty(const QRect &r);
-
- bool connect(int displayId);
- void disconnect();
-
- QImage *screenImage() { return &img; }
- QSize screenSize() { return img.size(); }
-
- int depth() const { return img.depth(); }
- QImage::Format format() const { return img.format(); }
-
-private:
- unsigned char *shmrgn;
- QVFbHeader *hdr;
- uchar *data;
- QVFbScreenMouseHandler *mouseHandler;
- QVFbScreenKeyboardHandler *keyboardHandler;
- int displayId;
-
- QImage img;
-};
-
-
-void QVFbScreenPrivate::setDirty(const QRect &r)
-{
- hdr->dirty = true;
- hdr->update = hdr->update.united(r);
-}
-
-
-bool QVFbScreenPrivate::connect(int displayId)
-{
- qDebug() << "QVFbScreenPrivate::connect" << displayId;
- key_t key = ftok(QT_VFB_MOUSE_PIPE(displayId).toLatin1(), 'b');
-
- if (key == -1)
- return false;
-
-
- int shmId = shmget(key, 0, 0);
- if (shmId != -1)
- shmrgn = (unsigned char *)shmat(shmId, 0, 0);
- else
- return false;
-
- if ((long)shmrgn == -1 || shmrgn == 0) {
- qDebug("No shmrgn %ld", (long)shmrgn);
- return false;
- }
-
- hdr = (QVFbHeader *)shmrgn;
- data = shmrgn + hdr->dataoffset;
-
- int w = hdr->width;
- int h = hdr->height;
- int d = hdr->depth;
- int lstep = hdr->linestep;
-
- QImage::Format format = QImage::Format_Invalid;
- if (d == 32)
- format = QImage::Format_ARGB32_Premultiplied;
- else if (d == 16)
- format = QImage::Format_RGB16;
-
-
- if (format == QImage::Format_Invalid) {
- img = QImage();
- return false;
- }
-
- img = QImage(data, w, h, lstep, format);
-
- qDebug("connected %dx%d %d bpp", w, h, d);
-
-
- mouseHandler = new QVFbScreenMouseHandler(displayId);
- keyboardHandler = new QVFbScreenKeyboardHandler(displayId);
- return true;
-}
-
-void QVFbScreenPrivate::disconnect()
-{
- if ((long)shmrgn != -1 && shmrgn) {
- shmdt((char*)shmrgn);
- shmrgn = 0;
- }
- delete mouseHandler;
- mouseHandler = 0;
- delete keyboardHandler;
- keyboardHandler = 0;
-}
-
-
-QVFbScreen::QVFbScreen(int id)
-{
- d_ptr = new QVFbScreenPrivate(id);
-}
-
-
-QVFbScreen::~QVFbScreen()
-{
- delete d_ptr;
-}
-
-void QVFbScreen::setDirty(const QRect &rect)
-{
- d_ptr->setDirty(rect);
-}
-
-
-
-QRect QVFbScreen::geometry() const {
- return QRect(QPoint(), d_ptr->screenSize());
-}
-
-
-int QVFbScreen::depth() const
-{
- return d_ptr->depth();
-}
-
-QImage::Format QVFbScreen::format() const
-{
- return d_ptr->format();
-}
-
-QSizeF QVFbScreen::physicalSize() const {
- return (QSizeF(d_ptr->screenSize())*254)/720.;
-}
-
-#if 0
-int QVFbScreen::linestep() const {
- return d_ptr->screenImage() ? d_ptr->screenImage()->bytesPerLine() : 0;
-}
-
-uchar *QVFbScreen::base() const {
- return d_ptr->screenImage() ? d_ptr->screenImage()->bits() : 0;
-}
-#endif
-
-QImage *QVFbScreen::screenImage()
-{
- return d_ptr->screenImage();
-}
-
-QVFbIntegration::QVFbIntegration(const QStringList &paramList)
- : mFontDb(new QGenericUnixFontDatabase())
-{
- int displayId = 0;
- if (paramList.length() > 0)
- displayId = paramList.at(0).toInt();
-
- mPrimaryScreen = new QVFbScreen(displayId);
-
- mScreens.append(mPrimaryScreen);
-}
-
-QPlatformPixmap *QVFbIntegration::createPlatformPixmap(QPlatformPixmap::PixelType type) const
-{
- return new QRasterPlatformPixmap(type);
-}
-
-QWindowSurface *QVFbIntegration::createWindowSurface(QWidget *widget, WId) const
-{
- return new QVFbWindowSurface(mPrimaryScreen, widget);
-}
-
-
-QPlatformWindow *QVFbIntegration::createPlatformWindow(QWidget *widget, WId) const
-{
- return new QVFbWindow(mPrimaryScreen, widget);
-}
-
-QAbstractEventDispatcher *QVFbIntegration::createEventDispatcher() const
-{
- return createUnixEventDispatcher();
-}
-
-QPlatformFontDatabase *QVFbIntegration::fontDatabase() const
-{
- return mFontDb;
-}
-
-QT_END_NAMESPACE
-
-#include "qvfbintegration.moc"
diff --git a/src/plugins/platforms/qvfb/qvfbintegration.h b/src/plugins/platforms/qvfb/qvfbintegration.h
deleted file mode 100644
index 45f6b391f0..0000000000
--- a/src/plugins/platforms/qvfb/qvfbintegration.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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, Nokia gives you certain additional
-** rights. These rights are described in the Nokia 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.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QGRAPHICSSYSTEM_QVFB_H
-#define QGRAPHICSSYSTEM_QVFB_H
-
-#include <QPlatformScreen>
-#include <QPlatformIntegration>
-
-QT_BEGIN_NAMESPACE
-
-
-class QVFbScreenPrivate;
-class QAbstractEventDispatcher;
-
-class QVFbScreen : public QPlatformScreen
-{
-public:
- QVFbScreen(int id);
- ~QVFbScreen();
-
- QRect geometry() const;
- int depth() const;
- QImage::Format format() const;
- QSizeF physicalSize() const;
-
- QImage *screenImage();
-
- void setDirty(const QRect &rect);
-
-public:
-
- QVFbScreenPrivate *d_ptr;
-};
-
-class QVFbIntegrationPrivate;
-
-
-class QVFbIntegration : public QPlatformIntegration
-{
-public:
- QVFbIntegration(const QStringList &paramList);
-
- QPlatformPixmap *createPlatformPixmap(QPlatformPixmap::PixelType type) const;
- QPlatformWindow *createPlatformWindow(QWidget *widget, WId winId) const;
- QWindowSurface *createWindowSurface(QWidget *widget, WId winId) const;
- QAbstractEventDispatcher *createEventDispatcher() const;
-
- QList<QPlatformScreen *> screens() const { return mScreens; }
-
- QPlatformFontDatabase *fontDatabase() const;
-
-private:
- QVFbScreen *mPrimaryScreen;
- QList<QPlatformScreen *> mScreens;
- QPlatformFontDatabase *mFontDb;
-};
-
-
-
-QT_END_NAMESPACE
-
-
-#endif
diff --git a/src/plugins/platforms/qvfb/qvfbwindowsurface.cpp b/src/plugins/platforms/qvfb/qvfbwindowsurface.cpp
deleted file mode 100644
index 6180836127..0000000000
--- a/src/plugins/platforms/qvfb/qvfbwindowsurface.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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, Nokia gives you certain additional
-** rights. These rights are described in the Nokia 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.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#include "qvfbwindowsurface.h"
-#include "qvfbintegration.h"
-#include <QtCore/qdebug.h>
-#include <QtGui/qpainter.h>
-#include <private/qapplication_p.h>
-
-QT_BEGIN_NAMESPACE
-
-QVFbWindowSurface::QVFbWindowSurface(//QVFbIntegration *graphicsSystem,
- QVFbScreen *screen, QWidget *window)
- : QWindowSurface(window),
- mScreen(screen)
-{
-}
-
-QVFbWindowSurface::~QVFbWindowSurface()
-{
-}
-
-QPaintDevice *QVFbWindowSurface::paintDevice()
-{
- return mScreen->screenImage();
-}
-
-void QVFbWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
-{
- Q_UNUSED(widget);
- Q_UNUSED(offset);
-
-// QRect rect = geometry();
-// QPoint topLeft = rect.topLeft();
-
- mScreen->setDirty(region.boundingRect());
-}
-
-void QVFbWindowSurface::resize(const QSize&)
-{
-
-// any size you like as long as it's full-screen...
-
- QRect rect(mScreen->availableGeometry());
- QWindowSurface::resize(rect.size());
-}
-
-
-QVFbWindow::QVFbWindow(QVFbScreen *screen, QWidget *window)
- : QPlatformWindow(window),
- mScreen(screen)
-{
-}
-
-
-void QVFbWindow::setGeometry(const QRect &)
-{
-
-// any size you like as long as it's full-screen...
-
- QRect rect(mScreen->availableGeometry());
- QWindowSystemInterface::handleGeometryChange(this->widget(), rect);
-
- QPlatformWindow::setGeometry(rect);
-}
-
-
-
-QT_END_NAMESPACE
diff --git a/src/plugins/platforms/windows/accessible/comutils.cpp b/src/plugins/platforms/windows/accessible/comutils.cpp
index 9a0fce20b8..2823306609 100644
--- a/src/plugins/platforms/windows/accessible/comutils.cpp
+++ b/src/plugins/platforms/windows/accessible/comutils.cpp
@@ -51,6 +51,8 @@
#include <QtCore/qbytearray.h>
#include <QtGui/qcolor.h>
+QT_BEGIN_NAMESPACE
+
static DATE QDateTimeToDATE(const QDateTime &dt)
{
if (!dt.isValid() || dt.isNull())
@@ -639,3 +641,5 @@ bool QVariantToVARIANT(const QVariant &var, VARIANT &arg, const QByteArray &type
return true;
}
+QT_END_NAMESPACE
+
diff --git a/src/plugins/platforms/windows/accessible/comutils.h b/src/plugins/platforms/windows/accessible/comutils.h
index 08420cc46c..4d8e603899 100644
--- a/src/plugins/platforms/windows/accessible/comutils.h
+++ b/src/plugins/platforms/windows/accessible/comutils.h
@@ -48,6 +48,8 @@
#include <ocidl.h>
#include <QtCore/qstring.h>
+QT_BEGIN_NAMESPACE
+
class QVariant;
bool QVariantToVARIANT(const QVariant &var, VARIANT &arg, const QByteArray &typeName, bool out);
@@ -57,5 +59,7 @@ inline BSTR QStringToBSTR(const QString &str)
return SysAllocStringLen((OLECHAR*)str.unicode(), str.length());
}
+QT_END_NAMESPACE
+
#endif // COMUTILS_H
diff --git a/src/plugins/platforms/windows/accessible/iaccessible2.cpp b/src/plugins/platforms/windows/accessible/iaccessible2.cpp
index ddab3cb0f2..71a26aff6b 100644
--- a/src/plugins/platforms/windows/accessible/iaccessible2.cpp
+++ b/src/plugins/platforms/windows/accessible/iaccessible2.cpp
@@ -338,13 +338,19 @@ HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::get_relations(long maxRelations
HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::role(long *ia2role)
{
accessibleDebugClientCalls(accessible);
- //### Change QAccessibleInterface::role() to return both MSAA and IA2 roles.
- // When that is completed, we must patch the MSAA bridge not not return any
- // IA2-specific roles from get_accRole().
if (!accessible->isValid())
return E_FAIL;
- *ia2role = accessible->role();
+ long r = accessible->role();
+
+ switch (r) {
+ case QAccessible::LayeredPane: r = IA2_ROLE_LAYERED_PANE; break;
+ case QAccessible::Terminal: r = IA2_ROLE_TERMINAL; break;
+ case QAccessible::Desktop: r = IA2_ROLE_DESKTOP_PANE; break;
+ default: break;
+ }
+
+ *ia2role = r;
return S_OK;
}
@@ -1363,15 +1369,16 @@ HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::QueryService(REFGUID guidServic
Q_UNUSED(guidService);
*iface = 0;
accessibleDebug("QWindowsIA2Accessible::QS(): %s", IIDToString(riid).constData());
- if (riid == IID_IAccessible || riid == IID_IUnknown || riid == IID_IDispatch) {
- *iface = static_cast<IAccessible*>(this);
- } else if (/*guidService == IID_IAccessible && */riid == IID_IAccessible2) {
+
+ if (guidService == IID_IAccessible && riid == IID_IAccessible2) {
+ // The conditions for entering here should be ok (from _dicoveringInterfaces in IAccessible2.idl)
*iface = static_cast<IAccessible2*>(this);
- } else if (riid == IID_IAccessibleApplication) {
+ } else if (guidService == IID_IAccessible && (riid == IID_IAccessible || riid == IID_IUnknown || riid == IID_IDispatch)) {
+ // The above conditions works with AccProbe and NVDA.
+ *iface = static_cast<IAccessible*>(this);
+ } else if (riid == IID_IAccessibleApplication) {
*iface = new AccessibleApplication;
return S_OK;
- } else {
- QueryInterface(riid, iface);
}
if (*iface) {
AddRef();
diff --git a/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp b/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp
index 0672a86dd9..17ee6eb82c 100644
--- a/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp
+++ b/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp
@@ -110,10 +110,10 @@ QWindowsAccessibility::QWindowsAccessibility()
{
}
-void QWindowsAccessibility::notifyAccessibilityUpdate(const QAccessibleEvent &event)
+void QWindowsAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *event)
{
QString soundName;
- switch (event.type()) {
+ switch (event->type()) {
case QAccessible::PopupMenuStart:
soundName = QLatin1String("MenuPopup");
break;
@@ -184,7 +184,7 @@ void QWindowsAccessibility::notifyAccessibilityUpdate(const QAccessibleEvent &ev
// An event has to be associated with a window,
// so find the first parent that is a widget and that has a WId
- QAccessibleInterface *iface = event.accessibleInterface();
+ QAccessibleInterface *iface = event->accessibleInterface();
QWindow *window = iface ? QWindowsAccessibility::windowHelper(iface) : 0;
delete iface;
@@ -198,13 +198,13 @@ void QWindowsAccessibility::notifyAccessibilityUpdate(const QAccessibleEvent &ev
HWND hWnd = (HWND)platform->nativeResourceForWindow("handle", window);
static int eventNum = 0;
- if (event.type() != QAccessible::MenuCommand) { // MenuCommand is faked
+ if (event->type() != QAccessible::MenuCommand) { // MenuCommand is faked
// See comment "SENDING EVENTS TO OBJECTS WITH NO WINDOW HANDLE"
eventNum %= 50; //[0..49]
int eventId = - (eventNum - 1);
- qAccessibleRecentSentEvents()->insert(eventId, qMakePair(event.object(), event.child()));
- ptrNotifyWinEvent(event.type(), hWnd, OBJID_CLIENT, eventId );
+ qAccessibleRecentSentEvents()->insert(eventId, qMakePair(event->object(), event->child()));
+ ptrNotifyWinEvent(event->type(), hWnd, OBJID_CLIENT, eventId );
++eventNum;
}
diff --git a/src/plugins/platforms/windows/accessible/qwindowsaccessibility.h b/src/plugins/platforms/windows/accessible/qwindowsaccessibility.h
index 0c3aca0a03..3366c32daa 100644
--- a/src/plugins/platforms/windows/accessible/qwindowsaccessibility.h
+++ b/src/plugins/platforms/windows/accessible/qwindowsaccessibility.h
@@ -56,7 +56,7 @@ class QWindowsAccessibility : public QPlatformAccessibility
public:
QWindowsAccessibility();
static bool handleAccessibleObjectFromWindowRequest(HWND hwnd, WPARAM wParam, LPARAM lParam, LRESULT *lResult);
- virtual void notifyAccessibilityUpdate(const QAccessibleEvent &event);
+ virtual void notifyAccessibilityUpdate(QAccessibleEvent *event);
/*
virtual void setRootObject(QObject *o);
virtual void initialize();
diff --git a/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp b/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp
index 6c4d217cb4..5003d9effd 100644
--- a/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp
+++ b/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp
@@ -998,8 +998,14 @@ HRESULT STDMETHODCALLTYPE QWindowsMsaaAccessible::get_accRole(VARIANT varID, VAR
}
if (role != QAccessible::NoRole) {
- if (role == QAccessible::LayeredPane)
- role = QAccessible::Pane;
+ if (role >= QAccessible::LayeredPane) {
+ // This block should hopefully only be entered if the AT client
+ // does not support IAccessible2, since it should prefer IA2::role() then.
+ if (role == QAccessible::LayeredPane)
+ role = QAccessible::Pane;
+ else
+ role = QAccessible::Client;
+ }
(*pvarRole).vt = VT_I4;
(*pvarRole).lVal = role;
} else {
diff --git a/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.h b/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.h
index d7dda6b3e2..28f45eb9b5 100644
--- a/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.h
+++ b/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.h
@@ -59,14 +59,16 @@
QT_BEGIN_NAMESPACE
-#ifndef QT_NO_DEBUG
+#if !defined(QT_NO_DEBUG) && !defined(QT_NO_DEBUG_OUTPUT)
bool debug_accessibility();
# define accessibleDebug !debug_accessibility() ? (void)0 : qDebug
#else
# define accessibleDebug
#endif
+#ifndef QT_NO_DEBUG_OUTPUT
#define DEBUG_SHOW_ATCLIENT_COMMANDS
+#endif
#if defined(DEBUG_SHOW_ATCLIENT_COMMANDS)
void accessibleDebugClientCalls_helper(const char* funcName, const QAccessibleInterface *iface);
# define accessibleDebugClientCalls(iface) accessibleDebugClientCalls_helper(Q_FUNC_INFO, iface)
@@ -92,6 +94,7 @@ class QWindowsMsaaAccessible : public
public:
QWindowsMsaaAccessible(QAccessibleInterface *a)
: accessible(a)
+ , ref(0)
{
}
diff --git a/src/plugins/platforms/windows/main.cpp b/src/plugins/platforms/windows/main.cpp
index 6d7c89e086..9f6ce99836 100644
--- a/src/plugins/platforms/windows/main.cpp
+++ b/src/plugins/platforms/windows/main.cpp
@@ -59,8 +59,8 @@ QT_BEGIN_NAMESPACE
of QGuiApplication:
\list
- \li \c fontengine=native Indicates that the freetype font
- engine should not be used.
+ \li \c fontengine=native Indicates that native font engine should be used (default)
+ \li \c fontengine=freetype Indicates that freetype font engine should be used
\li \c gl=gdi Indicates that ARB Open GL functionality should not be used
\endlist
diff --git a/src/plugins/platforms/windows/qwindowsbackingstore.cpp b/src/plugins/platforms/windows/qwindowsbackingstore.cpp
index bbb6b5305f..fad7dbdbf4 100644
--- a/src/plugins/platforms/windows/qwindowsbackingstore.cpp
+++ b/src/plugins/platforms/windows/qwindowsbackingstore.cpp
@@ -78,11 +78,12 @@ QPaintDevice *QWindowsBackingStore::paintDevice()
void QWindowsBackingStore::flush(QWindow *window, const QRegion &region,
const QPoint &offset)
{
+ Q_ASSERT(window);
// TODO: Prepare paint for translucent windows.
const QRect br = region.boundingRect();
if (QWindowsContext::verboseBackingStore > 1)
qDebug() << __FUNCTION__ << window << offset << br;
- QWindowsWindow *rw = rasterWindow();
+ QWindowsWindow *rw = QWindowsWindow::baseWindowOf(window);
const HDC dc = rw->getDC();
if (!dc) {
qErrnoWarning("%s: GetDC failed", __FUNCTION__);
@@ -106,6 +107,7 @@ void QWindowsBackingStore::flush(QWindow *window, const QRegion &region,
void QWindowsBackingStore::resize(const QSize &size, const QRegion &region)
{
if (m_image.isNull() || m_image->image().size() != size) {
+#ifndef QT_NO_DEBUG_OUTPUT
if (QWindowsContext::verboseBackingStore) {
QDebug nsp = qDebug().nospace();
nsp << __FUNCTION__ << ' ' << rasterWindow()->window()
@@ -113,6 +115,7 @@ void QWindowsBackingStore::resize(const QSize &size, const QRegion &region)
if (!m_image.isNull())
nsp << " from: " << m_image->image().size();
}
+#endif
m_image.reset(new QWindowsNativeImage(size.width(), size.height(),
QWindowsNativeImage::systemFormat()));
}
diff --git a/src/plugins/platforms/windows/qwindowsclipboard.cpp b/src/plugins/platforms/windows/qwindowsclipboard.cpp
index cd555d71a1..4166e567c4 100644
--- a/src/plugins/platforms/windows/qwindowsclipboard.cpp
+++ b/src/plugins/platforms/windows/qwindowsclipboard.cpp
@@ -158,6 +158,7 @@ QVariant QWindowsInternalMimeData::retrieveData_sys(const QString &mimeType,
if (const QWindowsMime *converter = mc.converterToMime(mimeType, pDataObj))
result = converter->convertToMime(mimeType, pDataObj, type);
releaseDataObject(pDataObj);
+#ifndef QT_NO_DEBUG_OUTPUT
if (QWindowsContext::verboseOLE) {
QDebug nospace = qDebug().nospace();
nospace << __FUNCTION__ << ' ' << mimeType << ' ' << type
@@ -165,6 +166,7 @@ QVariant QWindowsInternalMimeData::retrieveData_sys(const QString &mimeType,
if (result.type() != QVariant::ByteArray)
nospace << ' ' << result;
}
+#endif
return result;
}
diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp
index c5b1dcce9f..6913bc8dd4 100644
--- a/src/plugins/platforms/windows/qwindowscontext.cpp
+++ b/src/plugins/platforms/windows/qwindowscontext.cpp
@@ -47,7 +47,9 @@
#include "qtwindowsglobal.h"
#include "qwindowsmime.h"
#include "qwindowsinputcontext.h"
+#ifndef QT_NO_ACCESSIBILITY
#include "accessible/qwindowsaccessibility.h"
+#endif
#include "qwindowsscreen.h"
#include "qwindowstheme.h"
@@ -698,7 +700,11 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message,
case QtWindows::UnknownEvent:
return false;
case QtWindows::AccessibleObjectFromWindowRequest:
+#ifndef QT_NO_ACCESSIBILITY
return QWindowsAccessibility::handleAccessibleObjectFromWindowRequest(hwnd, wParam, lParam, result);
+#else
+ return false;
+#endif
case QtWindows::DisplayChangedEvent:
return d->m_screenManager.handleDisplayChange(wParam, lParam);
default:
diff --git a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp
index a6bde74103..12ea880ab0 100644
--- a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp
+++ b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp
@@ -486,11 +486,11 @@ void QWindowsDialogThread::run()
}
template <class BaseClass>
-bool QWindowsDialogHelperBase<BaseClass>::show_sys(QPlatformDialogHelper::ShowFlags flags,
- Qt::WindowFlags,
+bool QWindowsDialogHelperBase<BaseClass>::show_sys(Qt::WindowFlags,
+ Qt::WindowModality windowModality,
QWindow *parent)
{
- const bool modal = flags & QPlatformDialogHelper::ShowModal;
+ const bool modal = (windowModality == Qt::ApplicationModal);
if (parent) {
m_ownerWindow = QWindowsWindow::handleOf(parent);
} else {
diff --git a/src/plugins/platforms/windows/qwindowsdialoghelpers.h b/src/plugins/platforms/windows/qwindowsdialoghelpers.h
index 3ae22e69eb..909ce5984e 100644
--- a/src/plugins/platforms/windows/qwindowsdialoghelpers.h
+++ b/src/plugins/platforms/windows/qwindowsdialoghelpers.h
@@ -69,8 +69,8 @@ public:
virtual void platformNativeDialogModalHelp();
virtual void _q_platformRunNativeAppModalPanel();
virtual void deleteNativeDialog_sys();
- virtual bool show_sys(QPlatformDialogHelper::ShowFlags flags,
- Qt::WindowFlags windowFlags,
+ virtual bool show_sys(Qt::WindowFlags windowFlags,
+ Qt::WindowModality windowModality,
QWindow *parent);
virtual void hide_sys();
virtual QVariant styleHint(QPlatformDialogHelper::StyleHint) const;
diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp
index 979b2a028b..caa1913bb5 100644
--- a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp
+++ b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp
@@ -62,6 +62,442 @@
QT_BEGIN_NAMESPACE
+// Helper classes for creating font engines directly from font data
+namespace {
+
+# pragma pack(1)
+
+ // Common structure for all formats of the "name" table
+ struct NameTable
+ {
+ quint16 format;
+ quint16 count;
+ quint16 stringOffset;
+ };
+
+ struct NameRecord
+ {
+ quint16 platformID;
+ quint16 encodingID;
+ quint16 languageID;
+ quint16 nameID;
+ quint16 length;
+ quint16 offset;
+ };
+
+ struct OffsetSubTable
+ {
+ quint32 scalerType;
+ quint16 numTables;
+ quint16 searchRange;
+ quint16 entrySelector;
+ quint16 rangeShift;
+ };
+
+ struct TableDirectory
+ {
+ quint32 identifier;
+ quint32 checkSum;
+ quint32 offset;
+ quint32 length;
+ };
+
+ struct OS2Table
+ {
+ quint16 version;
+ qint16 avgCharWidth;
+ quint16 weightClass;
+ quint16 widthClass;
+ quint16 type;
+ qint16 subscriptXSize;
+ qint16 subscriptYSize;
+ qint16 subscriptXOffset;
+ qint16 subscriptYOffset;
+ qint16 superscriptXSize;
+ qint16 superscriptYSize;
+ qint16 superscriptXOffset;
+ qint16 superscriptYOffset;
+ qint16 strikeOutSize;
+ qint16 strikeOutPosition;
+ qint16 familyClass;
+ quint8 panose[10];
+ quint32 unicodeRanges[4];
+ quint8 vendorID[4];
+ quint16 selection;
+ quint16 firstCharIndex;
+ quint16 lastCharIndex;
+ qint16 typoAscender;
+ qint16 typoDescender;
+ qint16 typoLineGap;
+ quint16 winAscent;
+ quint16 winDescent;
+ quint32 codepageRanges[2];
+ qint16 height;
+ qint16 capHeight;
+ quint16 defaultChar;
+ quint16 breakChar;
+ quint16 maxContext;
+ };
+
+# pragma pack()
+
+ class EmbeddedFont
+ {
+ public:
+ EmbeddedFont(const QByteArray &fontData) : m_fontData(fontData) {}
+
+ QString changeFamilyName(const QString &newFamilyName);
+ QByteArray data() const { return m_fontData; }
+ TableDirectory *tableDirectoryEntry(const QByteArray &tagName);
+ QString familyName(TableDirectory *nameTableDirectory = 0);
+
+ private:
+ QByteArray m_fontData;
+ };
+
+ TableDirectory *EmbeddedFont::tableDirectoryEntry(const QByteArray &tagName)
+ {
+ Q_ASSERT(tagName.size() == 4);
+ quint32 tagId = *(reinterpret_cast<const quint32 *>(tagName.constData()));
+
+ OffsetSubTable *offsetSubTable = reinterpret_cast<OffsetSubTable *>(m_fontData.data());
+ TableDirectory *tableDirectory = reinterpret_cast<TableDirectory *>(offsetSubTable + 1);
+
+ TableDirectory *nameTableDirectoryEntry = 0;
+ for (int i = 0; i < qFromBigEndian<quint16>(offsetSubTable->numTables); ++i, ++tableDirectory) {
+ if (tableDirectory->identifier == tagId) {
+ nameTableDirectoryEntry = tableDirectory;
+ break;
+ }
+ }
+
+ return nameTableDirectoryEntry;
+ }
+
+ QString EmbeddedFont::familyName(TableDirectory *nameTableDirectoryEntry)
+ {
+ QString name;
+
+ if (nameTableDirectoryEntry == 0)
+ nameTableDirectoryEntry = tableDirectoryEntry("name");
+
+ if (nameTableDirectoryEntry != 0) {
+ NameTable *nameTable = reinterpret_cast<NameTable *>(
+ m_fontData.data() + qFromBigEndian<quint32>(nameTableDirectoryEntry->offset));
+ NameRecord *nameRecord = reinterpret_cast<NameRecord *>(nameTable + 1);
+ for (int i = 0; i < qFromBigEndian<quint16>(nameTable->count); ++i, ++nameRecord) {
+ if (qFromBigEndian<quint16>(nameRecord->nameID) == 1
+ && qFromBigEndian<quint16>(nameRecord->platformID) == 3 // Windows
+ && qFromBigEndian<quint16>(nameRecord->languageID) == 0x0409) { // US English
+ const void *ptr = reinterpret_cast<const quint8 *>(nameTable)
+ + qFromBigEndian<quint16>(nameTable->stringOffset)
+ + qFromBigEndian<quint16>(nameRecord->offset);
+
+ const quint16 *s = reinterpret_cast<const quint16 *>(ptr);
+ const quint16 *e = s + qFromBigEndian<quint16>(nameRecord->length) / sizeof(quint16);
+ while (s != e)
+ name += QChar( qFromBigEndian<quint16>(*s++));
+ break;
+ }
+ }
+ }
+
+ return name;
+ }
+
+ QString EmbeddedFont::changeFamilyName(const QString &newFamilyName)
+ {
+ TableDirectory *nameTableDirectoryEntry = tableDirectoryEntry("name");
+ if (nameTableDirectoryEntry == 0)
+ return QString();
+
+ QString oldFamilyName = familyName(nameTableDirectoryEntry);
+
+ // Reserve size for name table header, five required name records and string
+ const int requiredRecordCount = 5;
+ quint16 nameIds[requiredRecordCount] = { 1, 2, 3, 4, 6 };
+
+ int sizeOfHeader = sizeof(NameTable) + sizeof(NameRecord) * requiredRecordCount;
+ int newFamilyNameSize = newFamilyName.size() * sizeof(quint16);
+
+ const QString regularString = QString::fromLatin1("Regular");
+ int regularStringSize = regularString.size() * sizeof(quint16);
+
+ // Align table size of table to 32 bits (pad with 0)
+ int fullSize = ((sizeOfHeader + newFamilyNameSize + regularStringSize) & ~3) + 4;
+
+ QByteArray newNameTable(fullSize, char(0));
+
+ {
+ NameTable *nameTable = reinterpret_cast<NameTable *>(newNameTable.data());
+ nameTable->count = qbswap<quint16>(requiredRecordCount);
+ nameTable->stringOffset = qbswap<quint16>(sizeOfHeader);
+
+ NameRecord *nameRecord = reinterpret_cast<NameRecord *>(nameTable + 1);
+ for (int i = 0; i < requiredRecordCount; ++i, nameRecord++) {
+ nameRecord->nameID = qbswap<quint16>(nameIds[i]);
+ nameRecord->encodingID = qbswap<quint16>(1);
+ nameRecord->languageID = qbswap<quint16>(0x0409);
+ nameRecord->platformID = qbswap<quint16>(3);
+ nameRecord->length = qbswap<quint16>(newFamilyNameSize);
+
+ // Special case for sub-family
+ if (nameIds[i] == 4) {
+ nameRecord->offset = qbswap<quint16>(newFamilyNameSize);
+ nameRecord->length = qbswap<quint16>(regularStringSize);
+ }
+ }
+
+ // nameRecord now points to string data
+ quint16 *stringStorage = reinterpret_cast<quint16 *>(nameRecord);
+ const quint16 *sourceString = newFamilyName.utf16();
+ for (int i = 0; i < newFamilyName.size(); ++i)
+ stringStorage[i] = qbswap<quint16>(sourceString[i]);
+ stringStorage += newFamilyName.size();
+
+ sourceString = regularString.utf16();
+ for (int i = 0; i < regularString.size(); ++i)
+ stringStorage[i] = qbswap<quint16>(sourceString[i]);
+ }
+
+ quint32 *p = reinterpret_cast<quint32 *>(newNameTable.data());
+ quint32 *tableEnd = reinterpret_cast<quint32 *>(newNameTable.data() + fullSize);
+
+ quint32 checkSum = 0;
+ while (p < tableEnd)
+ checkSum += qFromBigEndian<quint32>(*(p++));
+
+ nameTableDirectoryEntry->checkSum = qbswap<quint32>(checkSum);
+ nameTableDirectoryEntry->offset = qbswap<quint32>(m_fontData.size());
+ nameTableDirectoryEntry->length = qbswap<quint32>(fullSize);
+
+ m_fontData.append(newNameTable);
+
+ return oldFamilyName;
+ }
+
+#if !defined(QT_NO_DIRECTWRITE)
+
+ class DirectWriteFontFileStream: public IDWriteFontFileStream
+ {
+ public:
+ DirectWriteFontFileStream(const QByteArray &fontData)
+ : m_fontData(fontData)
+ , m_referenceCount(0)
+ {
+ }
+
+ ~DirectWriteFontFileStream()
+ {
+ }
+
+ HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **object);
+ ULONG STDMETHODCALLTYPE AddRef();
+ ULONG STDMETHODCALLTYPE Release();
+
+ HRESULT STDMETHODCALLTYPE ReadFileFragment(const void **fragmentStart, UINT64 fileOffset,
+ UINT64 fragmentSize, OUT void **fragmentContext);
+ void STDMETHODCALLTYPE ReleaseFileFragment(void *fragmentContext);
+ HRESULT STDMETHODCALLTYPE GetFileSize(OUT UINT64 *fileSize);
+ HRESULT STDMETHODCALLTYPE GetLastWriteTime(OUT UINT64 *lastWriteTime);
+
+ private:
+ QByteArray m_fontData;
+ ULONG m_referenceCount;
+ };
+
+ HRESULT STDMETHODCALLTYPE DirectWriteFontFileStream::QueryInterface(REFIID iid, void **object)
+ {
+ if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileStream)) {
+ *object = this;
+ AddRef();
+ return S_OK;
+ } else {
+ *object = NULL;
+ return E_NOINTERFACE;
+ }
+ }
+
+ ULONG STDMETHODCALLTYPE DirectWriteFontFileStream::AddRef()
+ {
+ return InterlockedIncrement(&m_referenceCount);
+ }
+
+ ULONG STDMETHODCALLTYPE DirectWriteFontFileStream::Release()
+ {
+ ULONG newCount = InterlockedDecrement(&m_referenceCount);
+ if (newCount == 0)
+ delete this;
+ return newCount;
+ }
+
+ HRESULT STDMETHODCALLTYPE DirectWriteFontFileStream::ReadFileFragment(
+ const void **fragmentStart,
+ UINT64 fileOffset,
+ UINT64 fragmentSize,
+ OUT void **fragmentContext)
+ {
+ *fragmentContext = NULL;
+ if (fragmentSize + fileOffset <= m_fontData.size()) {
+ *fragmentStart = m_fontData.data() + fileOffset;
+ return S_OK;
+ } else {
+ *fragmentStart = NULL;
+ return E_FAIL;
+ }
+ }
+
+ void STDMETHODCALLTYPE DirectWriteFontFileStream::ReleaseFileFragment(void *)
+ {
+ }
+
+ HRESULT STDMETHODCALLTYPE DirectWriteFontFileStream::GetFileSize(UINT64 *fileSize)
+ {
+ *fileSize = m_fontData.size();
+ return S_OK;
+ }
+
+ HRESULT STDMETHODCALLTYPE DirectWriteFontFileStream::GetLastWriteTime(UINT64 *lastWriteTime)
+ {
+ *lastWriteTime = 0;
+ return E_NOTIMPL;
+ }
+
+ class DirectWriteFontFileLoader: public IDWriteFontFileLoader
+ {
+ public:
+ DirectWriteFontFileLoader() : m_referenceCount(0) {}
+
+ ~DirectWriteFontFileLoader()
+ {
+ }
+
+ inline void addKey(const void *key, const QByteArray &fontData)
+ {
+ Q_ASSERT(!m_fontDatas.contains(key));
+ m_fontDatas.insert(key, fontData);
+ }
+
+ inline void removeKey(const void *key)
+ {
+ m_fontDatas.remove(key);
+ }
+
+ HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **object);
+ ULONG STDMETHODCALLTYPE AddRef();
+ ULONG STDMETHODCALLTYPE Release();
+
+ HRESULT STDMETHODCALLTYPE CreateStreamFromKey(void const *fontFileReferenceKey,
+ UINT32 fontFileReferenceKeySize,
+ OUT IDWriteFontFileStream **fontFileStream);
+
+ private:
+ ULONG m_referenceCount;
+ QHash<const void *, QByteArray> m_fontDatas;
+ };
+
+ HRESULT STDMETHODCALLTYPE DirectWriteFontFileLoader::QueryInterface(const IID &iid,
+ void **object)
+ {
+ if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileLoader)) {
+ *object = this;
+ AddRef();
+ return S_OK;
+ } else {
+ *object = NULL;
+ return E_NOINTERFACE;
+ }
+ }
+
+ ULONG STDMETHODCALLTYPE DirectWriteFontFileLoader::AddRef()
+ {
+ return InterlockedIncrement(&m_referenceCount);
+ }
+
+ ULONG STDMETHODCALLTYPE DirectWriteFontFileLoader::Release()
+ {
+ ULONG newCount = InterlockedDecrement(&m_referenceCount);
+ if (newCount == 0)
+ delete this;
+ return newCount;
+ }
+
+ HRESULT STDMETHODCALLTYPE DirectWriteFontFileLoader::CreateStreamFromKey(
+ void const *fontFileReferenceKey,
+ UINT32 fontFileReferenceKeySize,
+ IDWriteFontFileStream **fontFileStream)
+ {
+ Q_UNUSED(fontFileReferenceKeySize);
+
+ if (fontFileReferenceKeySize != sizeof(const void *)) {
+ qWarning("%s: Wrong key size", __FUNCTION__);
+ return E_FAIL;
+ }
+
+ const void *key = *reinterpret_cast<void * const *>(fontFileReferenceKey);
+ *fontFileStream = NULL;
+ if (!m_fontDatas.contains(key))
+ return E_FAIL;
+
+ QByteArray fontData = m_fontDatas.value(key);
+ DirectWriteFontFileStream *stream = new DirectWriteFontFileStream(fontData);
+ stream->AddRef();
+ *fontFileStream = stream;
+
+ return S_OK;
+ }
+
+ class CustomFontFileLoader
+ {
+ public:
+ CustomFontFileLoader() : m_directWriteFactory(0), m_directWriteFontFileLoader(0)
+ {
+ HRESULT hres = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED,
+ __uuidof(IDWriteFactory),
+ reinterpret_cast<IUnknown **>(&m_directWriteFactory));
+ if (FAILED(hres)) {
+ qErrnoWarning(hres, "%s: DWriteCreateFactory failed.", __FUNCTION__);
+ } else {
+ m_directWriteFontFileLoader = new DirectWriteFontFileLoader();
+ m_directWriteFactory->RegisterFontFileLoader(m_directWriteFontFileLoader);
+ }
+ }
+
+ ~CustomFontFileLoader()
+ {
+ if (m_directWriteFactory != 0 && m_directWriteFontFileLoader != 0)
+ m_directWriteFactory->UnregisterFontFileLoader(m_directWriteFontFileLoader);
+
+ if (m_directWriteFactory != 0)
+ m_directWriteFactory->Release();
+ }
+
+ void addKey(const void *key, const QByteArray &fontData)
+ {
+ if (m_directWriteFontFileLoader != 0)
+ m_directWriteFontFileLoader->addKey(key, fontData);
+ }
+
+ void removeKey(const void *key)
+ {
+ if (m_directWriteFontFileLoader != 0)
+ m_directWriteFontFileLoader->removeKey(key);
+ }
+
+ IDWriteFontFileLoader *loader() const
+ {
+ return m_directWriteFontFileLoader;
+ }
+
+ private:
+ IDWriteFactory *m_directWriteFactory;
+ DirectWriteFontFileLoader *m_directWriteFontFileLoader;
+ };
+
+#endif
+
+} // Anonymous namespace
+
/*!
\struct QWindowsFontEngineData
\brief Static constant data shared by the font engines.
@@ -536,6 +972,7 @@ static bool addFontToDatabase(QString familyName, const QString &scriptName,
const QFont::Weight weight = weightFromInteger(tm->tmWeight);
const QFont::Stretch stretch = QFont::Unstretched;
+#ifndef QT_NO_DEBUG_OUTPUT
if (QWindowsContext::verboseFonts > 2) {
QDebug nospace = qDebug().nospace();
nospace << __FUNCTION__ << familyName << scriptName
@@ -550,6 +987,7 @@ static bool addFontToDatabase(QString familyName, const QString &scriptName,
<< " Style=" << style << " Weight=" << weight
<< " stretch=" << stretch;
}
+#endif
QString englishName;
if (ttf && localizedName(familyName))
@@ -687,10 +1125,158 @@ QFontEngine * QWindowsFontDatabase::fontEngine(const QFontDef &fontDef,
QFontEngine *QWindowsFontDatabase::fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference)
{
- QFontEngine *fe = QPlatformFontDatabase::fontEngine(fontData, pixelSize, hintingPreference);
+ EmbeddedFont font(fontData);
+ QFontEngine *fontEngine = 0;
+
+#if !defined(QT_NO_DIRECTWRITE)
+ if (hintingPreference == QFont::PreferDefaultHinting
+ || hintingPreference == QFont::PreferFullHinting)
+#endif
+ {
+ GUID guid;
+ CoCreateGuid(&guid);
+
+ QString uniqueFamilyName = QLatin1Char('f')
+ + QString::number(guid.Data1, 36) + QLatin1Char('-')
+ + QString::number(guid.Data2, 36) + QLatin1Char('-')
+ + QString::number(guid.Data3, 36) + QLatin1Char('-')
+ + QString::number(*reinterpret_cast<quint64 *>(guid.Data4), 36);
+
+ QString actualFontName = font.changeFamilyName(uniqueFamilyName);
+ if (actualFontName.isEmpty()) {
+ qWarning("%s: Can't change family name of font", __FUNCTION__);
+ return 0;
+ }
+
+ DWORD count = 0;
+ QByteArray newFontData = font.data();
+ HANDLE fontHandle = AddFontMemResourceEx((void *)newFontData.constData(), newFontData.size(), 0,
+ &count);
+ if (count == 0 && fontHandle != 0) {
+ RemoveFontMemResourceEx(fontHandle);
+ fontHandle = 0;
+ }
+
+ if (fontHandle == 0) {
+ qWarning("%s: AddFontMemResourceEx failed", __FUNCTION__);
+ } else {
+ QFontDef request;
+ request.family = uniqueFamilyName;
+ request.pixelSize = pixelSize;
+ request.styleStrategy = QFont::NoFontMerging | QFont::PreferMatch;
+ request.hintingPreference = hintingPreference;
+
+ fontEngine = QWindowsFontDatabase::createEngine(QUnicodeTables::Common, request, 0,
+ QWindowsContext::instance()->defaultDPI(), false, QStringList(),
+ m_fontEngineData);
+
+ if (fontEngine) {
+ if (request.family != fontEngine->fontDef.family) {
+ qWarning("%s: Failed to load font. Got fallback instead: %s",
+ __FUNCTION__, qPrintable(fontEngine->fontDef.family));
+ if (fontEngine->cache_count == 0 && fontEngine->ref.load() == 0)
+ delete fontEngine;
+ fontEngine = 0;
+ } else {
+ Q_ASSERT(fontEngine->cache_count == 0 && fontEngine->ref.load() == 0);
+
+ // Override the generated font name
+ static_cast<QWindowsFontEngine *>(fontEngine)->setUniqueFamilyName(uniqueFamilyName);
+ fontEngine->fontDef.family = actualFontName;
+ UniqueFontData uniqueData;
+ uniqueData.handle = fontHandle;
+ uniqueData.refCount.ref();
+ m_uniqueFontData[uniqueFamilyName] = uniqueData;
+ }
+ } else {
+ RemoveFontMemResourceEx(fontHandle);
+ }
+ }
+ }
+#if !defined(QT_NO_DIRECTWRITE)
+ else {
+ CustomFontFileLoader fontFileLoader;
+ fontFileLoader.addKey(this, fontData);
+
+ IDWriteFactory *factory = 0;
+ HRESULT hres = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED,
+ __uuidof(IDWriteFactory),
+ reinterpret_cast<IUnknown **>(&factory));
+ if (FAILED(hres)) {
+ qErrnoWarning(hres, "%s: DWriteCreateFactory failed", __FUNCTION__);
+ return 0;
+ }
+
+ IDWriteFontFile *fontFile = 0;
+ void *key = this;
+
+ hres = factory->CreateCustomFontFileReference(&key, sizeof(void *),
+ fontFileLoader.loader(), &fontFile);
+ if (FAILED(hres)) {
+ qErrnoWarning(hres, "%s: CreateCustomFontFileReference failed", __FUNCTION__);
+ factory->Release();
+ return 0;
+ }
+
+ BOOL isSupportedFontType;
+ DWRITE_FONT_FILE_TYPE fontFileType;
+ DWRITE_FONT_FACE_TYPE fontFaceType;
+ UINT32 numberOfFaces;
+ fontFile->Analyze(&isSupportedFontType, &fontFileType, &fontFaceType, &numberOfFaces);
+ if (!isSupportedFontType) {
+ fontFile->Release();
+ factory->Release();
+ return 0;
+ }
+
+ IDWriteFontFace *directWriteFontFace = 0;
+ hres = factory->CreateFontFace(fontFaceType, 1, &fontFile, 0, DWRITE_FONT_SIMULATIONS_NONE,
+ &directWriteFontFace);
+ if (FAILED(hres)) {
+ qErrnoWarning(hres, "%s: CreateFontFace failed", __FUNCTION__);
+ fontFile->Release();
+ factory->Release();
+ return 0;
+ }
+
+ fontFile->Release();
+
+ fontEngine = new QWindowsFontEngineDirectWrite(directWriteFontFace, pixelSize,
+ m_fontEngineData);
+
+ // Get font family from font data
+ fontEngine->fontDef.family = font.familyName();
+
+ directWriteFontFace->Release();
+ factory->Release();
+ }
+#endif
+
+ // Get style and weight info
+ if (fontEngine != 0) {
+ TableDirectory *os2TableEntry = font.tableDirectoryEntry("OS/2");
+ if (os2TableEntry != 0) {
+ const OS2Table *os2Table =
+ reinterpret_cast<const OS2Table *>(fontData.constData()
+ + qFromBigEndian<quint32>(os2TableEntry->offset));
+
+ bool italic = qFromBigEndian<quint16>(os2Table->selection) & 1;
+ bool oblique = qFromBigEndian<quint16>(os2Table->selection) & 128;
+
+ if (italic)
+ fontEngine->fontDef.style = QFont::StyleItalic;
+ else if (oblique)
+ fontEngine->fontDef.style = QFont::StyleOblique;
+ else
+ fontEngine->fontDef.style = QFont::StyleNormal;
+
+ fontEngine->fontDef.weight = weightFromInteger(qFromBigEndian<quint16>(os2Table->weightClass));
+ }
+ }
+
if (QWindowsContext::verboseFonts)
- qDebug() << __FUNCTION__ << "FONTDATA" << fontData << pixelSize << hintingPreference << fe;
- return fe;
+ qDebug() << __FUNCTION__ << "FONTDATA" << fontData << pixelSize << hintingPreference << fontEngine;
+ return fontEngine;
}
QStringList QWindowsFontDatabase::fallbacksForFamily(const QString family, const QFont::Style &style, const QFont::StyleHint &styleHint, const QUnicodeTables::Script &script) const
@@ -905,6 +1491,22 @@ bool QWindowsFontDatabase::fontsAlwaysScalable() const
return true;
}
+void QWindowsFontDatabase::derefUniqueFont(const QString &uniqueFont)
+{
+ if (m_uniqueFontData.contains(uniqueFont)) {
+ if (!m_uniqueFontData[uniqueFont].refCount.deref()) {
+ RemoveFontMemResourceEx(m_uniqueFontData[uniqueFont].handle);
+ m_uniqueFontData.remove(uniqueFont);
+ }
+ }
+}
+
+void QWindowsFontDatabase::refUniqueFont(const QString &uniqueFont)
+{
+ if (m_uniqueFontData.contains(uniqueFont))
+ m_uniqueFontData[uniqueFont].refCount.ref();
+}
+
HFONT QWindowsFontDatabase::systemFont()
{
static const HFONT stock_sysfont = (HFONT)GetStockObject(SYSTEM_FONT);
diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase.h b/src/plugins/platforms/windows/qwindowsfontdatabase.h
index 3921992775..f442f492aa 100644
--- a/src/plugins/platforms/windows/qwindowsfontdatabase.h
+++ b/src/plugins/platforms/windows/qwindowsfontdatabase.h
@@ -87,6 +87,8 @@ public:
virtual QFont defaultFont() const { return systemDefaultFont(); }
virtual bool fontsAlwaysScalable() const;
+ void derefUniqueFont(const QString &uniqueFont);
+ void refUniqueFont(const QString &uniqueFont);
static QFont systemDefaultFont();
@@ -112,6 +114,13 @@ private:
};
QList<WinApplicationFont> m_applicationFonts;
+
+ struct UniqueFontData {
+ HANDLE handle;
+ QAtomicInt refCount;
+ };
+
+ QMap<QString, UniqueFontData> m_uniqueFontData;
};
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp
index 246b5b3710..42d30f1833 100644
--- a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp
+++ b/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp
@@ -144,6 +144,7 @@ static bool addFontToDatabase(QString familyName, const QString &scriptName,
const QFont::Weight weight = weightFromInteger(tm->tmWeight);
const QFont::Stretch stretch = QFont::Unstretched;
+#ifndef QT_NO_DEBUG_OUTPUT
if (QWindowsContext::verboseFonts > 2) {
QDebug nospace = qDebug().nospace();
nospace << __FUNCTION__ << faceName << fullName << scriptName
@@ -158,6 +159,7 @@ static bool addFontToDatabase(QString familyName, const QString &scriptName,
<< " Style=" << style << " Weight=" << weight
<< " stretch=" << stretch;
}
+#endif
QString englishName;
if (ttf && localizedName(faceName))
@@ -324,7 +326,7 @@ QFontEngine * QWindowsFontDatabaseFT::fontEngine(const QFontDef &fontDef, QUnico
QFontEngine *QWindowsFontDatabaseFT::fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference)
{
- QFontEngine *fe = QPlatformFontDatabase::fontEngine(fontData, pixelSize, hintingPreference);
+ QFontEngine *fe = QBasicFontDatabase::fontEngine(fontData, pixelSize, hintingPreference);
if (QWindowsContext::verboseFonts)
qDebug() << __FUNCTION__ << "FONTDATA" << fontData << pixelSize << hintingPreference << fe;
return fe;
diff --git a/src/plugins/platforms/windows/qwindowsfontengine.cpp b/src/plugins/platforms/windows/qwindowsfontengine.cpp
index 94072622eb..f4bd3f0c53 100644
--- a/src/plugins/platforms/windows/qwindowsfontengine.cpp
+++ b/src/plugins/platforms/windows/qwindowsfontengine.cpp
@@ -44,6 +44,7 @@
#define _WIN32_WINNT 0x0500
#endif
+#include "qwindowsintegration.h"
#include "qwindowsfontengine.h"
#include "qwindowsnativeimage.h"
#include "qwindowscontext.h"
@@ -319,6 +320,11 @@ QWindowsFontEngine::~QWindowsFontEngine()
if (QWindowsContext::verboseFonts)
if (QWindowsContext::verboseFonts)
qDebug("%s: font='%s", __FUNCTION__, qPrintable(_name));
+
+ if (!uniqueFamilyName.isEmpty()) {
+ QPlatformFontDatabase *pfdb = QWindowsIntegration::instance()->fontDatabase();
+ static_cast<QWindowsFontDatabase *>(pfdb)->derefUniqueFont(uniqueFamilyName);
+ }
}
HGDIOBJ QWindowsFontEngine::selectDesignFont() const
@@ -1133,14 +1139,23 @@ QFontEngine *QWindowsFontEngine::cloneWithSize(qreal pixelSize) const
if (!uniqueFamilyName.isEmpty())
request.family = uniqueFamilyName;
request.pixelSize = pixelSize;
+ // Disable font merging, as otherwise createEngine will return a multi-engine
+ // instance instead of the specific engine we wish to clone.
+ request.styleStrategy |= QFont::NoFontMerging;
QFontEngine *fontEngine =
QWindowsFontDatabase::createEngine(QUnicodeTables::Common, request, 0,
QWindowsContext::instance()->defaultDPI(),
false,
QStringList(), m_fontEngineData);
- if (fontEngine)
+ if (fontEngine) {
fontEngine->fontDef.family = actualFontName;
+ if (!uniqueFamilyName.isEmpty()) {
+ static_cast<QWindowsFontEngine *>(fontEngine)->setUniqueFamilyName(uniqueFamilyName);
+ QPlatformFontDatabase *pfdb = QWindowsIntegration::instance()->fontDatabase();
+ static_cast<QWindowsFontDatabase *>(pfdb)->refUniqueFont(uniqueFamilyName);
+ }
+ }
return fontEngine;
}
diff --git a/src/plugins/platforms/windows/qwindowsfontengine.h b/src/plugins/platforms/windows/qwindowsfontengine.h
index f8ebc896f2..c869095769 100644
--- a/src/plugins/platforms/windows/qwindowsfontengine.h
+++ b/src/plugins/platforms/windows/qwindowsfontengine.h
@@ -128,13 +128,9 @@ public:
bool getOutlineMetrics(glyph_t glyph, const QTransform &t, glyph_metrics_t *metrics) const;
- static QFontEngine *createEngine(int script, const QFontDef &request,
- HDC fontHdc, int dpi, bool rawMode,
- const QStringList &family_list,
- const QSharedPointer<QWindowsFontEngineData> &data);
-
QSharedPointer<QWindowsFontEngineData> fontEngineData() const { return m_fontEngineData; }
LOGFONT logfont() const { return m_logfont; }
+ void setUniqueFamilyName(const QString &newName) { uniqueFamilyName = newName; }
private:
QWindowsNativeImage *drawGDIGlyph(HFONT font, glyph_t, int margin, const QTransform &xform,
diff --git a/src/plugins/platforms/windows/qwindowsglcontext.cpp b/src/plugins/platforms/windows/qwindowsglcontext.cpp
index 098f15f0f0..f16a0ca73d 100644
--- a/src/plugins/platforms/windows/qwindowsglcontext.cpp
+++ b/src/plugins/platforms/windows/qwindowsglcontext.cpp
@@ -470,6 +470,7 @@ static int choosePixelFormat(HDC hdc,
pixelFormat = 0;
}
+#ifndef QT_NO_DEBUG_OUTPUT
if (QWindowsContext::verboseGL) {
QDebug nsp = qDebug().nospace();
nsp << __FUNCTION__;
@@ -481,6 +482,7 @@ static int choosePixelFormat(HDC hdc,
nsp << noshowbase << dec << "\n obtained px #" << pixelFormat
<< " of " << numFormats << "\n " << *obtainedPfd;
} // Debug
+#endif
return pixelFormat;
}
diff --git a/src/plugins/platforms/windows/qwindowsglcontext.h b/src/plugins/platforms/windows/qwindowsglcontext.h
index 5aac636f83..a0489e2d02 100644
--- a/src/plugins/platforms/windows/qwindowsglcontext.h
+++ b/src/plugins/platforms/windows/qwindowsglcontext.h
@@ -152,6 +152,7 @@ public:
explicit QWindowsGLContext(const QOpenGLStaticContextPtr &staticContext,
QOpenGLContext *context);
virtual ~QWindowsGLContext();
+ bool isSharing() const { return m_context->shareHandle(); }
bool isValid() const { return m_renderingContext; }
virtual QSurfaceFormat format() const { return m_obtainedFormat; }
diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp
index d8d04fc1b6..45f6ecf652 100644
--- a/src/plugins/platforms/windows/qwindowsintegration.cpp
+++ b/src/plugins/platforms/windows/qwindowsintegration.cpp
@@ -56,7 +56,9 @@
#include "qwindowsdrag.h"
#include "qwindowsinputcontext.h"
#include "qwindowskeymapper.h"
+#ifndef QT_NO_ACCESSIBILITY
#include "accessible/qwindowsaccessibility.h"
+#endif
#include <QtGui/QPlatformNativeInterface>
#include <QtGui/QWindowSystemInterface>
@@ -182,7 +184,9 @@ struct QWindowsIntegrationPrivate
QWindowsGuiEventDispatcher *m_eventDispatcher;
QOpenGLStaticContextPtr m_staticOpenGLContext;
QWindowsInputContext m_inputContext;
+#ifndef QT_NO_ACCESSIBILITY
QWindowsAccessibility m_accessibility;
+#endif
QWindowsServices m_services;
};
@@ -281,7 +285,6 @@ QPlatformOpenGLContext
* QML2 applications. */
enum FontDatabaseOption {
- FontDatabaseAuto,
FontDatabaseFreeType,
FontDatabaseNative
};
@@ -296,7 +299,7 @@ static inline FontDatabaseOption fontDatabaseOption(const QObject &nativeInterfa
if (argument == QLatin1String("native"))
return FontDatabaseNative;
}
- return FontDatabaseAuto;
+ return FontDatabaseNative;
}
QPlatformFontDatabase *QWindowsIntegration::fontDatabase() const
@@ -306,10 +309,6 @@ QPlatformFontDatabase *QWindowsIntegration::fontDatabase() const
d->m_fontDatabase = new QWindowsFontDatabase();
#else
FontDatabaseOption option = fontDatabaseOption(d->m_nativeInterface);
- if (option == FontDatabaseAuto) {
- option = QCoreApplication::applicationName() == QStringLiteral("QtQmlViewer") ?
- FontDatabaseFreeType : FontDatabaseNative;
- }
if (option == FontDatabaseFreeType) {
d->m_fontDatabase = new QWindowsFontDatabaseFT;
} else {
@@ -374,10 +373,12 @@ QPlatformInputContext * QWindowsIntegration::inputContext() const
return &d->m_inputContext;
}
+#ifndef QT_NO_ACCESSIBILITY
QPlatformAccessibility *QWindowsIntegration::accessibility() const
{
return &d->m_accessibility;
}
+#endif
QWindowsIntegration *QWindowsIntegration::instance()
{
diff --git a/src/plugins/platforms/windows/qwindowsintegration.h b/src/plugins/platforms/windows/qwindowsintegration.h
index 20fd790bfe..84bbf6103a 100644
--- a/src/plugins/platforms/windows/qwindowsintegration.h
+++ b/src/plugins/platforms/windows/qwindowsintegration.h
@@ -66,7 +66,9 @@ public:
virtual QPlatformClipboard *clipboard() const;
virtual QPlatformDrag *drag() const;
virtual QPlatformInputContext *inputContext() const;
+#ifndef QT_NO_ACCESSIBILITY
virtual QPlatformAccessibility *accessibility() const;
+#endif
virtual QPlatformNativeInterface *nativeInterface() const;
virtual QPlatformFontDatabase *fontDatabase() const;
virtual QStringList themeNames() const;
diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp
index 38a44e2b5a..87980487b7 100644
--- a/src/plugins/platforms/windows/qwindowswindow.cpp
+++ b/src/plugins/platforms/windows/qwindowswindow.cpp
@@ -338,9 +338,9 @@ void WindowCreationData::fromWindow(const QWindow *w, const Qt::WindowFlags flag
} else {
style |= WS_THICKFRAME;
}
+ if (flags & Qt::WindowTitleHint)
+ style |= WS_CAPTION; // Contains WS_DLGFRAME
}
- if (flags & Qt::WindowTitleHint)
- style |= WS_CAPTION;
if (flags & Qt::WindowSystemMenuHint)
style |= WS_SYSMENU;
if (flags & Qt::WindowMinimizeButtonHint)
diff --git a/src/plugins/platforms/windows/windows.pro b/src/plugins/platforms/windows/windows.pro
index 87bc7245c4..63275d3402 100644
--- a/src/plugins/platforms/windows/windows.pro
+++ b/src/plugins/platforms/windows/windows.pro
@@ -149,6 +149,7 @@ contains(QT_CONFIG, freetype) {
OTHER_FILES += windows.json
-include(accessible/accessible.pri)
+contains(QT_CONFIG, accessibility):include(accessible/accessible.pri)
+
target.path += $$[QT_INSTALL_PLUGINS]/platforms
INSTALLS += target
diff --git a/src/plugins/platforms/xcb/qxcbnativeinterface.cpp b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp
index fc320ee69c..cc00d0845e 100644
--- a/src/plugins/platforms/xcb/qxcbnativeinterface.cpp
+++ b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp
@@ -231,6 +231,7 @@ void * QXcbNativeInterface::eglContextForContext(QOpenGLContext *context)
return 0;
#endif
#else
+ Q_UNUSED(context)
return 0;
#endif
}
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index 6996c87f3f..ffce2f3956 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -1188,7 +1188,7 @@ void QXcbWindow::requestActivateWindow()
}
#if XCB_USE_MAEMO_WINDOW_PROPERTIES
-void QXcbWindow::setOrientation(Qt::ScreenOrientation orientation)
+void QXcbWindow::handleContentOrientationChange(Qt::ScreenOrientation orientation)
{
int angle = 0;
switch (orientation) {
diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h
index c8999de83d..523dd559c1 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.h
+++ b/src/plugins/platforms/xcb/qxcbwindow.h
@@ -95,7 +95,7 @@ public:
void requestActivateWindow();
#if XCB_USE_MAEMO_WINDOW_PROPERTIES
- void setOrientation(Qt::ScreenOrientation orientation);
+ void handleContentOrientationChange(Qt::ScreenOrientation orientation);
#endif
bool setKeyboardGrabEnabled(bool grab);
diff --git a/src/printsupport/dialogs/qabstractpagesetupdialog.h b/src/printsupport/dialogs/qabstractpagesetupdialog.h
index fce0d883dc..7f9286b676 100644
--- a/src/printsupport/dialogs/qabstractpagesetupdialog.h
+++ b/src/printsupport/dialogs/qabstractpagesetupdialog.h
@@ -54,7 +54,7 @@ QT_BEGIN_NAMESPACE
class QAbstractPageSetupDialogPrivate;
class QPrinter;
-// ### Qt 5: Remove this class
+// ### QtPrintNG: merge this class with QPageSetupDialog
class Q_PRINTSUPPORT_EXPORT QAbstractPageSetupDialog : public QDialog
{
Q_DECLARE_PRIVATE(QAbstractPageSetupDialog)
diff --git a/src/printsupport/dialogs/qabstractprintdialog.h b/src/printsupport/dialogs/qabstractprintdialog.h
index 564216aa26..9d7318eedf 100644
--- a/src/printsupport/dialogs/qabstractprintdialog.h
+++ b/src/printsupport/dialogs/qabstractprintdialog.h
@@ -54,7 +54,7 @@ QT_BEGIN_NAMESPACE
class QAbstractPrintDialogPrivate;
class QPrinter;
-// ### Qt 5: remove this class
+// ### QtPrintNG: merge this class with QPrintDialog
class Q_PRINTSUPPORT_EXPORT QAbstractPrintDialog : public QDialog
{
Q_DECLARE_PRIVATE(QAbstractPrintDialog)
diff --git a/src/printsupport/dialogs/qprintdialog_unix.cpp b/src/printsupport/dialogs/qprintdialog_unix.cpp
index 75c9664d1d..f7689c1620 100644
--- a/src/printsupport/dialogs/qprintdialog_unix.cpp
+++ b/src/printsupport/dialogs/qprintdialog_unix.cpp
@@ -825,7 +825,7 @@ void QUnixPrintWidgetPrivate::applyPrinterProperties(QPrinter *p)
return;
printer = p;
if (p->outputFileName().isEmpty()) {
- QString home = QString::fromLocal8Bit(qgetenv("HOME").constData());
+ QString home = QDir::homePath();
QString cur = QDir::currentPath();
if (home.at(home.length()-1) != QLatin1Char('/'))
home += QLatin1Char('/');
diff --git a/src/printsupport/kernel/qplatformprintersupport_qpa.cpp b/src/printsupport/kernel/qplatformprintersupport_qpa.cpp
index b6f65ee893..1ed28b8090 100644
--- a/src/printsupport/kernel/qplatformprintersupport_qpa.cpp
+++ b/src/printsupport/kernel/qplatformprintersupport_qpa.cpp
@@ -49,6 +49,16 @@
QT_BEGIN_NAMESPACE
+/*!
+ \class QPlatformPrinterSupport
+ \since 5.0
+ \internal
+ \preliminary
+ \ingroup qpa
+
+ \brief The QPlatformPrinterSupport class provides an abstraction for print support.
+ */
+
QPlatformPrinterSupport::QPlatformPrinterSupport()
{
}
@@ -128,9 +138,9 @@ void QPlatformPrinterSupport::setPrinterInfoCupsPrinterIndex(QPrinterInfo *p, in
Converts QSizeF in millimeters to a predefined PaperSize (returns Custom if
the size isn't a standard size)
*/
+extern QPrinter::PaperSize qSizeFTopaperSize(const QSizeF &);
QPrinter::PaperSize QPlatformPrinterSupport::convertQSizeFToPaperSize(const QSizeF &sizef)
{
- extern QPrinter::PaperSize qSizeFTopaperSize(const QSizeF &);
return qSizeFTopaperSize(sizef);
}
@@ -138,9 +148,9 @@ QPrinter::PaperSize QPlatformPrinterSupport::convertQSizeFToPaperSize(const QSiz
Converts a predefined PaperSize to a QSizeF in millimeters (returns
QSizeF(0.0, 0.0) if PaperSize is Custom)
*/
+extern QSizeF qt_paperSizeToQSizeF(QPrinter::PaperSize size);
QSizeF QPlatformPrinterSupport::convertPaperSizeToQSizeF(QPrinter::PaperSize paperSize)
{
- extern QSizeF qt_paperSizeToQSizeF(QPrinter::PaperSize size);
return qt_paperSizeToQSizeF(paperSize);
}
diff --git a/src/sql/doc/doc.pri b/src/sql/doc/doc.pri
new file mode 100644
index 0000000000..2bc2e005d4
--- /dev/null
+++ b/src/sql/doc/doc.pri
@@ -0,0 +1,3 @@
+qtPrepareTool(QDOC, qdoc)
+docs.commands += $$QDOC $$QT.sql.sources/doc/qtsql.qdocconf
+QMAKE_EXTRA_TARGETS += docs
diff --git a/src/sql/doc/images/foreignkeys.png b/src/sql/doc/images/foreignkeys.png
new file mode 100644
index 0000000000..7a6a19bb43
--- /dev/null
+++ b/src/sql/doc/images/foreignkeys.png
Binary files differ
diff --git a/doc/src/images/insertrowinmodelview.png b/src/sql/doc/images/insertrowinmodelview.png
index bddc401ad2..bddc401ad2 100644
--- a/doc/src/images/insertrowinmodelview.png
+++ b/src/sql/doc/images/insertrowinmodelview.png
Binary files differ
diff --git a/src/sql/doc/images/noforeignkeys.png b/src/sql/doc/images/noforeignkeys.png
new file mode 100644
index 0000000000..62a4452277
--- /dev/null
+++ b/src/sql/doc/images/noforeignkeys.png
Binary files differ
diff --git a/doc/src/images/qdatawidgetmapper-simple.png b/src/sql/doc/images/qdatawidgetmapper-simple.png
index 784a433c0b..784a433c0b 100644
--- a/doc/src/images/qdatawidgetmapper-simple.png
+++ b/src/sql/doc/images/qdatawidgetmapper-simple.png
Binary files differ
diff --git a/doc/src/images/relationaltable.png b/src/sql/doc/images/relationaltable.png
index bdfd40f703..bdfd40f703 100644
--- a/doc/src/images/relationaltable.png
+++ b/src/sql/doc/images/relationaltable.png
Binary files differ
diff --git a/src/sql/doc/qtsql.qdocconf b/src/sql/doc/qtsql.qdocconf
new file mode 100644
index 0000000000..ac0249ae08
--- /dev/null
+++ b/src/sql/doc/qtsql.qdocconf
@@ -0,0 +1,92 @@
+include(../../../doc/global/qt-cpp-ignore.qdocconf)
+
+project = QtSql
+description = Qt SQL Reference Documentation
+url = http://qt-project.org/doc/qt-5.0/qtsql
+version = 5.0.0
+
+sourceencoding = UTF-8
+outputencoding = UTF-8
+naturallanguage = en_US
+qhp.projects = QtSql
+
+qhp.QtSql.file = qtsql.qhp
+qhp.QtSql.namespace = org.qt-project.qtsql.500
+qhp.QtSql.virtualFolder = qdoc
+qhp.QtSql.indexTitle = Qt SQL Reference Documentation
+qhp.QtSql.indexRoot =
+
+qhp.QtSql.filterAttributes = qtsql 5.0.0 qtrefdoc
+qhp.QtSql.customFilters.Qt.name = QtSql 5.0.0
+qhp.QtSql.customFilters.Qt.filterAttributes = qtsql 5.0.0
+qhp.QtSql.subprojects = classes overviews examples
+qhp.QtSql.subprojects.classes.title = Classes
+qhp.QtSql.subprojects.classes.indexTitle = Qt SQL's Classes
+qhp.QtSql.subprojects.classes.selectors = class fake:headerfile
+qhp.QtSql.subprojects.classes.sortPages = true
+qhp.QtSql.subprojects.overviews.title = Overviews
+qhp.QtSql.subprojects.overviews.indexTitle = All Overviews and HOWTOs
+qhp.QtSql.subprojects.overviews.selectors = fake:page,group,module
+qhp.QtSql.subprojects.examples.title = Qt SQL Examples
+qhp.QtSql.subprojects.examples.indexTitle = Qt SQL Examples
+qhp.QtSql.subprojects.examples.selectors = fake:example
+
+dita.metadata.default.author = Qt Project
+dita.metadata.default.permissions = all
+dita.metadata.default.publisher = Qt Project
+dita.metadata.default.copyryear = 2012
+dita.metadata.default.copyrholder = Nokia
+dita.metadata.default.audience = programmer
+
+sources.fileextensions = "*.c++ *.cc *.cpp *.cxx *.mm *.qml *.qdoc"
+headers.fileextensions = "*.ch *.h *.h++ *.hh *.hpp *.hxx"
+
+examples.fileextensions = "*.cpp *.h *.js *.xq *.svg *.xml *.ui *.qhp *.qhcp *.qml *.css"
+examples.imageextensions = "*.png"
+
+outputdir = ../../../doc/qtsql
+tagfile = ../../../doc/qtsql/qtsql.tags
+
+HTML.generatemacrefs = "true"
+HTML.nobreadcrumbs = "true"
+
+HTML.templatedir = .
+
+HTML.stylesheets = ../../../doc/global/style/offline.css
+
+HTML.headerstyles = \
+ " <link rel=\"stylesheet\" type=\"text/css\" href=\"style/offline.css\" />\n"
+
+HTML.endheader = \
+ "</head>\n" \
+
+defines = Q_QDOC \
+ QT_.*_SUPPORT \
+ QT_.*_LIB \
+ QT_COMPAT \
+ QT_KEYPAD_NAVIGATION \
+ QT_NO_EGL \
+ Q_WS_.* \
+ Q_OS_.* \
+ Q_BYTE_ORDER \
+ QT_DEPRECATED \
+ QT_DEPRECATED_* \
+ Q_NO_USING_KEYWORD \
+ __cplusplus \
+ Q_COMPILER_INITIALIZER_LISTS
+
+versionsym = QT_VERSION_STR
+
+codeindent = 1
+
+depends += qtcore
+
+headerdirs += ..
+
+sourcedirs += ..
+
+exampledirs += ../../../examples \
+ ../ \
+ snippets
+
+imagedirs += images
diff --git a/doc/src/snippets/code/doc_src_qtsql.cpp b/src/sql/doc/snippets/code/doc_src_qtsql.cpp
index 88b80ba710..88b80ba710 100644
--- a/doc/src/snippets/code/doc_src_qtsql.cpp
+++ b/src/sql/doc/snippets/code/doc_src_qtsql.cpp
diff --git a/src/sql/doc/snippets/code/doc_src_qtsql.pro b/src/sql/doc/snippets/code/doc_src_qtsql.pro
new file mode 100644
index 0000000000..1fb8e4dea3
--- /dev/null
+++ b/src/sql/doc/snippets/code/doc_src_qtsql.pro
@@ -0,0 +1,3 @@
+#! [1]
+QT += sql
+#! [1]
diff --git a/doc/src/snippets/code/doc_src_sql-driver.cpp b/src/sql/doc/snippets/code/doc_src_sql-driver.cpp
index 5ad00eae3c..5ad00eae3c 100644
--- a/doc/src/snippets/code/doc_src_sql-driver.cpp
+++ b/src/sql/doc/snippets/code/doc_src_sql-driver.cpp
diff --git a/doc/src/snippets/code/doc_src_sql-driver.qdoc b/src/sql/doc/snippets/code/doc_src_sql-driver.qdoc
index 3fe8d6fbbd..3fe8d6fbbd 100644
--- a/doc/src/snippets/code/doc_src_sql-driver.qdoc
+++ b/src/sql/doc/snippets/code/doc_src_sql-driver.qdoc
diff --git a/doc/src/snippets/code/src_sql_kernel_qsqldatabase.cpp b/src/sql/doc/snippets/code/src_sql_kernel_qsqldatabase.cpp
index d181b6eb14..d181b6eb14 100644
--- a/doc/src/snippets/code/src_sql_kernel_qsqldatabase.cpp
+++ b/src/sql/doc/snippets/code/src_sql_kernel_qsqldatabase.cpp
diff --git a/doc/src/snippets/code/src_sql_kernel_qsqldriver.cpp b/src/sql/doc/snippets/code/src_sql_kernel_qsqldriver.cpp
index 254a35aba2..254a35aba2 100644
--- a/doc/src/snippets/code/src_sql_kernel_qsqldriver.cpp
+++ b/src/sql/doc/snippets/code/src_sql_kernel_qsqldriver.cpp
diff --git a/doc/src/snippets/code/src_sql_kernel_qsqlerror.cpp b/src/sql/doc/snippets/code/src_sql_kernel_qsqlerror.cpp
index 9914206193..9914206193 100644
--- a/doc/src/snippets/code/src_sql_kernel_qsqlerror.cpp
+++ b/src/sql/doc/snippets/code/src_sql_kernel_qsqlerror.cpp
diff --git a/doc/src/snippets/code/src_sql_kernel_qsqlquery.cpp b/src/sql/doc/snippets/code/src_sql_kernel_qsqlquery.cpp
index c540f8bd59..c540f8bd59 100644
--- a/doc/src/snippets/code/src_sql_kernel_qsqlquery.cpp
+++ b/src/sql/doc/snippets/code/src_sql_kernel_qsqlquery.cpp
diff --git a/doc/src/snippets/code/src_sql_kernel_qsqlresult.cpp b/src/sql/doc/snippets/code/src_sql_kernel_qsqlresult.cpp
index 773af85ab9..773af85ab9 100644
--- a/doc/src/snippets/code/src_sql_kernel_qsqlresult.cpp
+++ b/src/sql/doc/snippets/code/src_sql_kernel_qsqlresult.cpp
diff --git a/doc/src/snippets/code/src_sql_models_qsqlquerymodel.cpp b/src/sql/doc/snippets/code/src_sql_models_qsqlquerymodel.cpp
index 71c96b0207..71c96b0207 100644
--- a/doc/src/snippets/code/src_sql_models_qsqlquerymodel.cpp
+++ b/src/sql/doc/snippets/code/src_sql_models_qsqlquerymodel.cpp
diff --git a/doc/src/snippets/sqldatabase/sqldatabase.cpp b/src/sql/doc/snippets/sqldatabase/sqldatabase.cpp
index 81f806309a..81f806309a 100644
--- a/doc/src/snippets/sqldatabase/sqldatabase.cpp
+++ b/src/sql/doc/snippets/sqldatabase/sqldatabase.cpp
diff --git a/doc/src/sql/sql-programming/qsqldatatype-table.qdoc b/src/sql/doc/src/qsqldatatype-table.qdoc
index a7e03cf28f..a7e03cf28f 100644
--- a/doc/src/sql/sql-programming/qsqldatatype-table.qdoc
+++ b/src/sql/doc/src/qsqldatatype-table.qdoc
diff --git a/doc/src/sql/qtsql.qdoc b/src/sql/doc/src/qtsql.qdoc
index 6708deaaa8..594a812bb9 100644
--- a/doc/src/sql/qtsql.qdoc
+++ b/src/sql/doc/src/qtsql.qdoc
@@ -33,12 +33,12 @@
To include the definitions of the module's classes, use the
following directive:
- \snippet doc/src/snippets/code/doc_src_qtsql.cpp 0
+ \snippet code/doc_src_qtsql.cpp 0
To link against the module, add this line to your \l qmake \c
.pro file:
- \snippet doc/src/snippets/code/doc_src_qtsql.pro 1
+ \snippet code/doc_src_qtsql.pro 1
See the \l{SQL Programming} guide for information about using this
module in your applications.
diff --git a/doc/src/sql/sql-programming/sql-driver.qdoc b/src/sql/doc/src/sql-driver.qdoc
index 41995d8d38..7311416563 100644
--- a/doc/src/sql/sql-programming/sql-driver.qdoc
+++ b/src/sql/doc/src/sql-driver.qdoc
@@ -84,7 +84,7 @@
machine. Run \c{configure -help} to see what drivers can be
built. You should get an output similar to this:
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 0
+ \snippet code/doc_src_sql-driver.qdoc 0
The \c configure script cannot detect the necessary libraries
and include files if they are not in the standard paths, so it
@@ -117,11 +117,11 @@
Example stored procedure:
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 1
+ \snippet code/doc_src_sql-driver.qdoc 1
Source code to access the OUT values:
- \snippet doc/src/snippets/code/doc_src_sql-driver.cpp 2
+ \snippet code/doc_src_sql-driver.cpp 2
\b{Note:} \c{@outval1} and \c{@outval2} are variables local to the current
connection and will not be affected by queries sent from another host
@@ -151,13 +151,13 @@
libraries (here it is assumed that MySQL is installed in
\c{/usr/local}) and run \c{make}:
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 3
+ \snippet code/doc_src_sql-driver.qdoc 3
After installing Qt, as described in the \l{Installing Qt for X11
Platforms} document, you also need to install the plugin in the
standard location:
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 4
+ \snippet code/doc_src_sql-driver.qdoc 4
\section3 How to Build the QMYSQL Plugin on Windows
@@ -166,7 +166,7 @@
Build the plugin as follows (here it is assumed that MySQL is
installed in \c{C:\MySQL}):
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 5
+ \snippet code/doc_src_sql-driver.qdoc 5
If you are not using a Microsoft compiler, replace \c nmake with \c
make in the line above.
@@ -295,21 +295,21 @@
libraries and run make:
For Oracle version 9:
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 6
+ \snippet code/doc_src_sql-driver.qdoc 6
For Oracle version 10, we assume that you installed the RPM packages of the
Instant Client Package SDK (you need to adjust the version number accordingly):
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 7
+ \snippet code/doc_src_sql-driver.qdoc 7
\b{Note:} If you are using the Oracle Instant Client package,
you will need to set LD_LIBRARY_PATH when building the OCI SQL plugin
and when running an application that uses the OCI SQL plugin. You can
avoid this requirement by setting and RPATH and listing all of the
libraries to link to. Here is an example:
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 32
+ \snippet code/doc_src_sql-driver.qdoc 32
If you wish to build the OCI plugin manually with this method the procedure looks like this:
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 33
+ \snippet code/doc_src_sql-driver.qdoc 33
\section3 How to Build the OCI Plugin on Windows
@@ -321,7 +321,7 @@
Build the plugin as follows (here it is assumed that Oracle Client is
installed in \c{C:\oracle}):
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 8
+ \snippet code/doc_src_sql-driver.qdoc 8
If you are not using a Microsoft compiler, replace \c nmake with \c
make in the line above.
@@ -329,7 +329,7 @@
When you run your application you will also need to add the \c oci.dll
path to your \c PATH environment variable:
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 9
+ \snippet code/doc_src_sql-driver.qdoc 9
\b{Note:} This database plugin is not supported for Windows CE.
@@ -394,7 +394,7 @@
sets, will be accessible only if you set the query's forward only
mode to \e forward using \l QSqlQuery::setForwardOnly().
- \snippet doc/src/snippets/code/doc_src_sql-driver.cpp 10
+ \snippet code/doc_src_sql-driver.cpp 10
\b{Note:} The value returned by the stored procedure's return statement
is discarded.
@@ -423,14 +423,14 @@
libraries (here it is assumed that unixODBC is installed in
\c{/usr/local/unixODBC}) and run \c{make}:
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 11
+ \snippet code/doc_src_sql-driver.qdoc 11
\section3 How to Build the ODBC Plugin on Windows
The ODBC header and include files should already be installed in the
right directories. You just have to build the plugin as follows:
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 12
+ \snippet code/doc_src_sql-driver.qdoc 12
If you are not using a Microsoft compiler, replace \c nmake with \c
make in the line above.
@@ -478,12 +478,12 @@
libraries, run \c qmake the following way (assuming that the
PostgreSQL client is installed in \c{/usr}):
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 13
+ \snippet code/doc_src_sql-driver.qdoc 13
After installing Qt, as described in the \l{Installing Qt for X11 Platforms} document,
you also need to install the plugin in the standard location:
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 14
+ \snippet code/doc_src_sql-driver.qdoc 14
\section3 How to Build the QPSQL Plugin on Windows
@@ -491,7 +491,7 @@
compiler. Assuming that PostgreSQL was installed in \c{C:\psql},
build the plugin as follows:
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 15
+ \snippet code/doc_src_sql-driver.qdoc 15
Users of MinGW may wish to consult the following online document:
\l{PostgreSQL MinGW/Native Windows}.
@@ -529,7 +529,7 @@
point to the directory where you installed the client library and
execute \c{qmake}:
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 16
+ \snippet code/doc_src_sql-driver.qdoc 16
\section3 How to Build the QDTS Plugin on Windows
@@ -537,7 +537,7 @@
Open Client (\l{http://www.sybase.com}). You must include \c
NTWDBLIB.LIB to build the plugin:
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 17
+ \snippet code/doc_src_sql-driver.qdoc 17
By default the Microsoft library is used on Windows, if you want to
force the use of the Sybase Open Client, you must define \c
@@ -565,19 +565,19 @@
\section3 How to Build the QDB2 Plugin on Unix and Mac OS X
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 18
+ \snippet code/doc_src_sql-driver.qdoc 18
After installing Qt, as described in the \l{Installing Qt for X11 Platforms} document,
you also need to install the plugin in the standard location:
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 19
+ \snippet code/doc_src_sql-driver.qdoc 19
\section3 How to Build the QDB2 Plugin on Windows
The DB2 header and include files should already be installed in the
right directories. You just have to build the plugin as follows:
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 20
+ \snippet code/doc_src_sql-driver.qdoc 20
If you are not using a Microsoft compiler, replace \c nmake
with \c make in the line above.
@@ -640,16 +640,16 @@
it manually (replace \c $SQLITE with the directory where
SQLite resides):
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 21
+ \snippet code/doc_src_sql-driver.qdoc 21
After installing Qt, as described in the \l{Installing Qt for X11 Platforms} document,
you also need to install the plugin in the standard location:
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 22
+ \snippet code/doc_src_sql-driver.qdoc 22
On Windows:
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 23
+ \snippet code/doc_src_sql-driver.qdoc 23
\section3 QSQLITE File Format Compatibility
@@ -683,7 +683,7 @@
database file, no matter whether it is stored locally or on another
server.
- \snippet doc/src/snippets/code/doc_src_sql-driver.cpp 24
+ \snippet code/doc_src_sql-driver.cpp 24
You need the InterBase/Firebird development headers and libraries
to build this plugin.
@@ -698,7 +698,7 @@
be overridden by setting the ISC_DPB_LC_CTYPE parameter with
QSqlDatabase::setConnectOptions() before opening the connection.
- \snippet doc/src/snippets/code/doc_src_sql-driver.cpp 25
+ \snippet code/doc_src_sql-driver.cpp 25
If Qt doesn't support the given text encoding the driver will issue a
warning message and connect to the database using UNICODE_FSS.
@@ -712,7 +712,7 @@
procedure, only IN values need to be bound via QSqlQuery::bindValue(). The
RETURN/OUT values can be retrieved via QSqlQuery::value(). Example:
- \snippet doc/src/snippets/code/doc_src_sql-driver.cpp 26
+ \snippet code/doc_src_sql-driver.cpp 26
\section3 How to Build the QIBASE Plugin on Unix and Mac OS X
@@ -721,11 +721,11 @@
If you are using InterBase:
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 27
+ \snippet code/doc_src_sql-driver.qdoc 27
If you are using Firebird, the Firebird library has to be set explicitly:
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 28
+ \snippet code/doc_src_sql-driver.qdoc 28
\section3 How to Build the QIBASE Plugin on Windows
@@ -734,11 +734,11 @@
If you are using InterBase:
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 29
+ \snippet code/doc_src_sql-driver.qdoc 29
If you are using Firebird, the Firebird library has to be set explicitly:
- \snippet doc/src/snippets/code/doc_src_sql-driver.qdoc 30
+ \snippet code/doc_src_sql-driver.qdoc 30
If you are not using a Microsoft compiler, replace \c nmake
with \c make in the line above.
@@ -779,7 +779,7 @@
Make sure you have followed the guide to \l{Deploying Plugins}.
If you experience plugin load problems and see output like this:
- \snippet doc/src/snippets/code/doc_src_sql-driver.cpp 31
+ \snippet code/doc_src_sql-driver.cpp 31
the problem is usually that the plugin had the wrong \l{Deploying
Plugins#The Build Key}{build key}. This might require removing an
@@ -824,7 +824,7 @@
The following code can be used as a skeleton for a SQL driver:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 47
+ \snippet sqldatabase/sqldatabase.cpp 47
\codeline
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 48
+ \snippet sqldatabase/sqldatabase.cpp 48
*/
diff --git a/doc/src/sql/sql-programming/sql-programming.qdoc b/src/sql/doc/src/sql-programming.qdoc
index 6ebb40b755..53f89e72c9 100644
--- a/doc/src/sql/sql-programming/sql-programming.qdoc
+++ b/src/sql/doc/src/sql-programming.qdoc
@@ -129,7 +129,7 @@
following snippet shows how to create a \e{default} connection
and then open it:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 26
+ \snippet sqldatabase/sqldatabase.cpp 26
The first line creates the connection object, and the last line
opens it for use. In between, we initialize some connection
@@ -150,7 +150,7 @@
connection name. For example, here we establish two MySQL database
connections named \c{"first"} and \c{"second"}:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 27
+ \snippet sqldatabase/sqldatabase.cpp 27
After these connections have been initialized, \l{QSqlDatabase::}
{open()} for each one to establish the live connections. If the
@@ -163,9 +163,9 @@
connection name, it will return the default connection. For
example:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 28
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 29
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 30
+ \snippet sqldatabase/sqldatabase.cpp 28
+ \snippet sqldatabase/sqldatabase.cpp 29
+ \snippet sqldatabase/sqldatabase.cpp 30
To remove a database connection, first close the database using
QSqlDatabase::close(), then remove it using the static method
@@ -195,7 +195,7 @@
To execute an SQL statement, simply create a QSqlQuery object and
call QSqlQuery::exec() like this:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 31
+ \snippet sqldatabase/sqldatabase.cpp 31
The QSqlQuery constructor accepts an optional QSqlDatabase object
that specifies which database connection to use. In the example
@@ -215,7 +215,7 @@
to access the other records, until it returns false. Here's a
typical loop that iterates over all the records in order:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 32
+ \snippet sqldatabase/sqldatabase.cpp 32
The QSqlQuery::value() function returns the value of a field in
the current record. Fields are specified as zero-based indexes.
@@ -243,7 +243,7 @@
navigate to the last record and use the query's position to tell
us how many records there are.
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 33
+ \snippet sqldatabase/sqldatabase.cpp 33
If you iterate through a result set only using next() and seek()
with positive values, you can call
@@ -257,7 +257,7 @@
\c{SELECT}s. The following example inserts a record into a table
using \c{INSERT}:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 34
+ \snippet sqldatabase/sqldatabase.cpp 34
If you want to insert many records at the same time, it is often
more efficient to separate the query from the actual values being
@@ -265,11 +265,11 @@
placeholder syntaxes: named binding and positional binding.
Here's an example of named binding:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 35
+ \snippet sqldatabase/sqldatabase.cpp 35
Here's an example of positional binding:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 36
+ \snippet sqldatabase/sqldatabase.cpp 36
Both syntaxes work with all database drivers provided by Qt. If
the database supports the syntax natively, Qt simply forwards the
@@ -289,14 +289,14 @@
Updating a record is similar to inserting it into a table:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 37
+ \snippet sqldatabase/sqldatabase.cpp 37
You can also use named or positional binding to associate
parameters to actual values.
Finally, here's an example of a \c DELETE statement:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 38
+ \snippet sqldatabase/sqldatabase.cpp 38
\section2 Transactions
@@ -311,7 +311,7 @@
Example:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 39
+ \snippet sqldatabase/sqldatabase.cpp 39
Transactions can be used to ensure that a complex operation is
atomic (for example, looking up a foreign key and creating a
@@ -364,7 +364,7 @@
Example:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 40
+ \snippet sqldatabase/sqldatabase.cpp 40
After setting the query using QSqlQueryModel::setQuery(), you can
use QSqlQueryModel::record(int) to access the individual records.
@@ -383,7 +383,7 @@
Example:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 41
+ \snippet sqldatabase/sqldatabase.cpp 41
QSqlTableModel is a high-level alternative to QSqlQuery for
navigating and modifying individual SQL tables. It typically
@@ -394,7 +394,7 @@
following code will increase every employee's salary by 10 per
cent:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 42
+ \snippet sqldatabase/sqldatabase.cpp 42
You can also use QSqlTableModel::data() and
QSqlTableModel::setData(), which are inherited from
@@ -402,16 +402,16 @@
to update a record using
\l{QSqlTableModel::setData()}{setData()}:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 43
+ \snippet sqldatabase/sqldatabase.cpp 43
Here's how to insert a row and populate it:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 44
+ \snippet sqldatabase/sqldatabase.cpp 44
Here's how to delete five consecutive rows:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 45
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 46
+ \snippet sqldatabase/sqldatabase.cpp 45
+ \snippet sqldatabase/sqldatabase.cpp 46
The first argument to QSqlTableModel::removeRows() is the index
of the first row to delete.
@@ -463,10 +463,10 @@
The following code snippet shows how the QSqlRelationalTableModel
was set up:
- \snippet examples/sql/relationaltablemodel/relationaltablemodel.cpp 0
+ \snippet sql/relationaltablemodel/relationaltablemodel.cpp 0
\codeline
- \snippet examples/sql/relationaltablemodel/relationaltablemodel.cpp 1
- \snippet examples/sql/relationaltablemodel/relationaltablemodel.cpp 2
+ \snippet sql/relationaltablemodel/relationaltablemodel.cpp 1
+ \snippet sql/relationaltablemodel/relationaltablemodel.cpp 2
See the QSqlRelationalTableModel documentation for details.
*/
@@ -490,15 +490,15 @@
The following example creates a view based on an SQL data model:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 17
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 18
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 19
+ \snippet sqldatabase/sqldatabase.cpp 17
+ \snippet sqldatabase/sqldatabase.cpp 18
+ \snippet sqldatabase/sqldatabase.cpp 19
If the model is a read-write model (e.g., QSqlTableModel), the
view lets the user edit the fields. You can disable this by
calling
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 20
+ \snippet sqldatabase/sqldatabase.cpp 20
You can use the same model as a data source for multiple views.
If the user edits the model through one of the views, the other
@@ -511,7 +511,7 @@
model. The header's labels default to the table's field names.
For example:
- \snippet examples/sql/relationaltablemodel/relationaltablemodel.cpp 3
+ \snippet sql/relationaltablemodel/relationaltablemodel.cpp 3
QTableView also has a vertical header on the left with numbers
identifying the rows. If you insert rows programmatically using
@@ -545,13 +545,13 @@
read-write. The following two functions make fields 1 and 2 of a
query model editable:
- \snippet examples/sql/querymodel/editablesqlmodel.cpp 0
+ \snippet sql/querymodel/editablesqlmodel.cpp 0
\codeline
- \snippet examples/sql/querymodel/editablesqlmodel.cpp 1
+ \snippet sql/querymodel/editablesqlmodel.cpp 1
The setFirstName() helper function is defined as follows:
- \snippet examples/sql/querymodel/editablesqlmodel.cpp 2
+ \snippet sql/querymodel/editablesqlmodel.cpp 2
The setLastName() function is similar. See the
\l{sql/querymodel}{Query Model} example for the complete source code.
diff --git a/src/sql/drivers/mysql/qsql_mysql.cpp b/src/sql/drivers/mysql/qsql_mysql.cpp
index 8a5e0bb34b..9bd1de1851 100644
--- a/src/sql/drivers/mysql/qsql_mysql.cpp
+++ b/src/sql/drivers/mysql/qsql_mysql.cpp
@@ -420,7 +420,7 @@ QVariant QMYSQLResult::handle() const
{
#if MYSQL_VERSION_ID >= 40108
if(d->preparedQuery)
- return d->meta ? QVariant::fromValue(d->meta) : qVariantFromValue(d->stmt);
+ return d->meta ? QVariant::fromValue(d->meta) : QVariant::fromValue(d->stmt);
else
#endif
return QVariant::fromValue(d->result);
diff --git a/src/sql/drivers/odbc/qsql_odbc.cpp b/src/sql/drivers/odbc/qsql_odbc.cpp
index 70471d0c66..04bc0cc894 100644
--- a/src/sql/drivers/odbc/qsql_odbc.cpp
+++ b/src/sql/drivers/odbc/qsql_odbc.cpp
@@ -962,7 +962,8 @@ bool QODBCResult::reset (const QString& query)
return true;
}
- SQLINTEGER isScrollable, bufferLength;
+ SQLINTEGER bufferLength;
+ SQLULEN isScrollable;
r = SQLGetStmtAttr(d->hStmt, SQL_ATTR_CURSOR_SCROLLABLE, &isScrollable, SQL_IS_INTEGER, &bufferLength);
if(r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO)
QSqlResult::setForwardOnly(isScrollable==SQL_NONSCROLLABLE);
@@ -1502,8 +1503,8 @@ bool QODBCResult::exec()
int strSize = str.length() * sizeof(SQLTCHAR);
if (bindValueType(i) & QSql::Out) {
- QVarLengthArray<SQLTCHAR> ba(toSQLTCHAR(str));
- ba.reserve(str.capacity());
+ const QVarLengthArray<SQLTCHAR> a(toSQLTCHAR(str));
+ QByteArray ba((const char *)a.constData(), a.size() * sizeof(SQLTCHAR));
r = SQLBindParameter(d->hStmt,
i + 1,
qParamType[(QFlag)(bindValueType(i)) & QSql::InOut],
@@ -1511,10 +1512,10 @@ bool QODBCResult::exec()
strSize > 254 ? SQL_WLONGVARCHAR : SQL_WVARCHAR,
0, // god knows... don't change this!
0,
- (void *)ba.constData(),
+ (void *)ba.data(),
ba.size(),
ind);
- tmpStorage.append(QByteArray((const char *)ba.constData(), ba.size()*sizeof(SQLTCHAR)));
+ tmpStorage.append(ba);
break;
}
QByteArray strba((const char *)toSQLTCHAR(str).constData(), str.size()*sizeof(SQLTCHAR));
@@ -1584,7 +1585,8 @@ bool QODBCResult::exec()
return false;
}
- SQLINTEGER isScrollable, bufferLength;
+ SQLINTEGER bufferLength;
+ SQLULEN isScrollable;
r = SQLGetStmtAttr(d->hStmt, SQL_ATTR_CURSOR_SCROLLABLE, &isScrollable, SQL_IS_INTEGER, &bufferLength);
if(r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO)
QSqlResult::setForwardOnly(isScrollable==SQL_NONSCROLLABLE);
@@ -1638,7 +1640,7 @@ bool QODBCResult::exec()
QByteArray first = tmpStorage.takeFirst();
QVarLengthArray<SQLTCHAR> array;
array.append((SQLTCHAR *)first.constData(), first.size());
- values[i] = fromSQLTCHAR(array, first.size()/sizeof(SQLTCHAR*));
+ values[i] = fromSQLTCHAR(array, first.size()/sizeof(SQLTCHAR));
}
break;
}
diff --git a/src/sql/kernel/qsql.qdoc b/src/sql/kernel/qsql.qdoc
index 394c255b35..6fbfc0415d 100644
--- a/src/sql/kernel/qsql.qdoc
+++ b/src/sql/kernel/qsql.qdoc
@@ -35,7 +35,7 @@
\ingroup database
- \sa {QtSql Module}
+ \sa {Qt SQL Module}
*/
/*!
diff --git a/src/sql/kernel/qsqldatabase.cpp b/src/sql/kernel/qsqldatabase.cpp
index d4633cea57..f44f475d6c 100644
--- a/src/sql/kernel/qsqldatabase.cpp
+++ b/src/sql/kernel/qsqldatabase.cpp
@@ -390,7 +390,7 @@ void QSqlDatabasePrivate::disable()
snippet shows how to create and open a default connection to a
PostgreSQL database:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 0
+ \snippet sqldatabase/sqldatabase.cpp 0
Once the QSqlDatabase object has been created, set the connection
parameters with setDatabaseName(), setUserName(), setPassword(),
@@ -403,7 +403,7 @@ void QSqlDatabasePrivate::disable()
{addDatabase()}. Subsequently, you can get the default connection
by calling database() without the connection name argument:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 1
+ \snippet sqldatabase/sqldatabase.cpp 1
QSqlDatabase is a value class. Changes made to a database
connection via one instance of QSqlDatabase will affect other
@@ -440,7 +440,7 @@ void QSqlDatabasePrivate::disable()
If you have created your own custom driver, you must register it
with registerSqlDriver().
- \sa QSqlDriver, QSqlQuery, {QtSql Module}, {Threads and the SQL Module}
+ \sa QSqlDriver, QSqlQuery, {Qt SQL Module}, {Threads and the SQL Module}
*/
/*! \fn QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &connectionName)
@@ -472,7 +472,7 @@ void QSqlDatabasePrivate::disable()
setHostName(), setPort(), and setConnectOptions(), and, finally,
open().
- \sa database() removeDatabase() {Threads and the SQL Module}
+ \sa database(), removeDatabase(), {Threads and the SQL Module}
*/
QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &connectionName)
{
@@ -492,7 +492,7 @@ QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &conne
connectionName does not exist in the list of databases, an invalid
connection is returned.
- \sa isOpen() {Threads and the SQL Module}
+ \sa isOpen(), {Threads and the SQL Module}
*/
QSqlDatabase QSqlDatabase::database(const QString& connectionName, bool open)
@@ -512,11 +512,11 @@ QSqlDatabase QSqlDatabase::database(const QString& connectionName, bool open)
Example:
- \snippet doc/src/snippets/code/src_sql_kernel_qsqldatabase.cpp 0
+ \snippet code/src_sql_kernel_qsqldatabase.cpp 0
The correct way to do it:
- \snippet doc/src/snippets/code/src_sql_kernel_qsqldatabase.cpp 1
+ \snippet code/src_sql_kernel_qsqldatabase.cpp 1
To remove the default connection, which may have been created with a
call to addDatabase() not specifying a connection name, you can
@@ -524,7 +524,7 @@ QSqlDatabase QSqlDatabase::database(const QString& connectionName, bool open)
the database returned by database(). Note that if a default database
hasn't been created an invalid database will be returned.
- \sa database() connectionName() {Threads and the SQL Module}
+ \sa database(), connectionName(), {Threads and the SQL Module}
*/
void QSqlDatabase::removeDatabase(const QString& connectionName)
@@ -600,7 +600,7 @@ QStringList QSqlDatabase::drivers()
and don't want to compile it as a plugin.
Example:
- \snippet doc/src/snippets/code/src_sql_kernel_qsqldatabase.cpp 2
+ \snippet code/src_sql_kernel_qsqldatabase.cpp 2
QSqlDatabase takes ownership of the \a creator pointer, so you
mustn't delete it yourself.
@@ -831,8 +831,8 @@ QSqlQuery QSqlDatabase::exec(const QString & query) const
values. Returns true on success; otherwise returns false. Error
information can be retrieved using lastError().
- \sa lastError() setDatabaseName() setUserName() setPassword()
- \sa setHostName() setPort() setConnectOptions()
+ \sa lastError(), setDatabaseName(), setUserName(), setPassword(),
+ setHostName(), setPort(), setConnectOptions()
*/
bool QSqlDatabase::open()
@@ -924,7 +924,7 @@ bool QSqlDatabase::transaction()
Call lastError() to get information about errors.
- \sa QSqlQuery::isActive() QSqlDriver::hasFeature() rollback()
+ \sa QSqlQuery::isActive(), QSqlDriver::hasFeature(), rollback()
*/
bool QSqlDatabase::commit()
{
@@ -945,7 +945,7 @@ bool QSqlDatabase::commit()
Call lastError() to get information about errors.
- \sa QSqlQuery::isActive() QSqlDriver::hasFeature() commit()
+ \sa QSqlQuery::isActive(), QSqlDriver::hasFeature(), commit()
*/
bool QSqlDatabase::rollback()
{
@@ -974,12 +974,12 @@ bool QSqlDatabase::rollback()
connection string to open an \c .mdb file directly, instead of
having to create a DSN entry in the ODBC manager:
- \snippet doc/src/snippets/code/src_sql_kernel_qsqldatabase.cpp 3
+ \snippet code/src_sql_kernel_qsqldatabase.cpp 3
There is no default value.
- \sa databaseName() setUserName() setPassword() setHostName()
- \sa setPort() setConnectOptions() open()
+ \sa databaseName(), setUserName(), setPassword(), setHostName(),
+ setPort(), setConnectOptions(), open()
*/
void QSqlDatabase::setDatabaseName(const QString& name)
@@ -996,8 +996,8 @@ void QSqlDatabase::setDatabaseName(const QString& name)
There is no default value.
- \sa userName() setDatabaseName() setPassword() setHostName()
- \sa setPort() setConnectOptions() open()
+ \sa userName(), setDatabaseName(), setPassword(), setHostName(),
+ setPort(), setConnectOptions(), open()
*/
void QSqlDatabase::setUserName(const QString& name)
@@ -1018,8 +1018,8 @@ void QSqlDatabase::setUserName(const QString& name)
Qt. Use the open() call that takes a password as parameter to
avoid this behavior.
- \sa password() setUserName() setDatabaseName() setHostName()
- \sa setPort() setConnectOptions() open()
+ \sa password(), setUserName(), setDatabaseName(), setHostName(),
+ setPort(), setConnectOptions(), open()
*/
void QSqlDatabase::setPassword(const QString& password)
@@ -1036,8 +1036,8 @@ void QSqlDatabase::setPassword(const QString& password)
There is no default value.
- \sa hostName() setUserName() setPassword() setDatabaseName()
- \sa setPort() setConnectOptions() open()
+ \sa hostName(), setUserName(), setPassword(), setDatabaseName(),
+ setPort(), setConnectOptions(), open()
*/
void QSqlDatabase::setHostName(const QString& host)
@@ -1054,8 +1054,8 @@ void QSqlDatabase::setHostName(const QString& host)
There is no default value.
- \sa port() setUserName() setPassword() setHostName()
- \sa setDatabaseName() setConnectOptions() open()
+ \sa port(), setUserName(), setPassword(), setHostName(),
+ setDatabaseName(), setConnectOptions(), open()
*/
void QSqlDatabase::setPort(int port)
@@ -1130,7 +1130,7 @@ int QSqlDatabase::port() const
Returns the database driver used to access the database
connection.
- \sa addDatabase() drivers()
+ \sa addDatabase(), drivers()
*/
QSqlDriver* QSqlDatabase::driver() const
@@ -1278,7 +1278,7 @@ QSqlRecord QSqlDatabase::record(const QString& tablename) const
\endtable
Examples:
- \snippet doc/src/snippets/code/src_sql_kernel_qsqldatabase.cpp 4
+ \snippet code/src_sql_kernel_qsqldatabase.cpp 4
Refer to the client library documentation for more information
about the different options.
@@ -1325,9 +1325,9 @@ bool QSqlDatabase::isDriverAvailable(const QString& name)
application. For example, you can create a PostgreSQL connection
with your own QPSQL driver like this:
- \snippet doc/src/snippets/code/src_sql_kernel_qsqldatabase.cpp 5
+ \snippet code/src_sql_kernel_qsqldatabase.cpp 5
\codeline
- \snippet doc/src/snippets/code/src_sql_kernel_qsqldatabase.cpp 6
+ \snippet code/src_sql_kernel_qsqldatabase.cpp 6
The above code sets up a PostgreSQL connection and instantiates a
QPSQLDriver object. Next, addDatabase() is called to add the
@@ -1346,7 +1346,7 @@ bool QSqlDatabase::isDriverAvailable(const QString& name)
client library. Make sure the client library is in your linker's
search path, and add lines like these to your \c{.pro} file:
- \snippet doc/src/snippets/code/src_sql_kernel_qsqldatabase.cpp 7
+ \snippet code/src_sql_kernel_qsqldatabase.cpp 7
The method described works for all the supplied drivers. The only
difference will be in the driver constructor arguments. Here is a
@@ -1423,7 +1423,7 @@ QSqlDatabase QSqlDatabase::addDatabase(QSqlDriver* driver, const QString& connec
Returns true if the QSqlDatabase has a valid driver.
Example:
- \snippet doc/src/snippets/code/src_sql_kernel_qsqldatabase.cpp 8
+ \snippet code/src_sql_kernel_qsqldatabase.cpp 8
*/
bool QSqlDatabase::isValid() const
{
diff --git a/src/sql/kernel/qsqldriver.cpp b/src/sql/kernel/qsqldriver.cpp
index f48673f28f..284ef84f2d 100644
--- a/src/sql/kernel/qsqldriver.cpp
+++ b/src/sql/kernel/qsqldriver.cpp
@@ -133,7 +133,7 @@ QSqlDriver::~QSqlDriver()
/*!
\since 5.0
- \fn QSqlDriver::notification(const QString &name, NotificationSource source, const QString & payload)
+ \fn QSqlDriver::notification(const QString &name, QSqlDriver::NotificationSource source, const QVariant & payload)
This signal is emitted when the database posts an event notification
that the driver subscribes to. \a name identifies the event notification, \a source indicates the signal source,
@@ -682,11 +682,11 @@ QString QSqlDriver::formatValue(const QSqlField &field, bool trimStrings) const
This example retrieves the handle for a connection to sqlite:
- \snippet doc/src/snippets/code/src_sql_kernel_qsqldriver.cpp 0
+ \snippet code/src_sql_kernel_qsqldriver.cpp 0
This snippet returns the handle for PostgreSQL or MySQL:
- \snippet doc/src/snippets/code/src_sql_kernel_qsqldriver.cpp 1
+ \snippet code/src_sql_kernel_qsqldriver.cpp 1
\sa QSqlResult::handle()
*/
@@ -696,36 +696,6 @@ QVariant QSqlDriver::handle() const
}
/*!
- \fn QSqlRecord QSqlDriver::record(const QSqlQuery& query) const
-
- Use query.record() instead.
-*/
-
-/*!
- \fn QSqlRecord QSqlDriver::recordInfo(const QString& tablename) const
-
- Use record() instead.
-*/
-
-/*!
- \fn QSqlRecord QSqlDriver::recordInfo(const QSqlQuery& query) const
-
- Use query.record() instead.
-*/
-
-/*!
- \fn QString QSqlDriver::nullText() const
-
- sqlStatement() is now used to generate SQL. Use tr("NULL") for example, instead.
-*/
-
-/*!
- \fn QString QSqlDriver::formatValue(const QSqlField *field, bool trimStrings) const
-
- Use the other formatValue() overload instead.
-*/
-
-/*!
This function is called to subscribe to event notifications from the database.
\a name identifies the event notification.
@@ -743,7 +713,7 @@ QVariant QSqlDriver::handle() const
own QSqlDriver subclass,
\since 4.4
- \sa unsubscribeFromNotification() subscribedToNotifications() QSqlDriver::hasFeature()
+ \sa unsubscribeFromNotification(), subscribedToNotifications(), QSqlDriver::hasFeature()
*/
bool QSqlDriver::subscribeToNotification(const QString &name)
{
@@ -767,7 +737,7 @@ bool QSqlDriver::subscribeToNotification(const QString &name)
own QSqlDriver subclass,
\since 4.4
- \sa subscribeToNotification() subscribedToNotifications()
+ \sa subscribeToNotification(), subscribedToNotifications()
*/
bool QSqlDriver::unsubscribeFromNotification(const QString &name)
{
@@ -782,7 +752,7 @@ bool QSqlDriver::unsubscribeFromNotification(const QString &name)
own QSqlDriver subclass,
\since 4.4
- \sa subscribeToNotification() unsubscribeFromNotification()
+ \sa subscribeToNotification(), unsubscribeFromNotification()
*/
QStringList QSqlDriver::subscribedToNotifications() const
{
diff --git a/src/sql/kernel/qsqlerror.cpp b/src/sql/kernel/qsqlerror.cpp
index 79c7ee02c2..c1314a15a5 100644
--- a/src/sql/kernel/qsqlerror.cpp
+++ b/src/sql/kernel/qsqlerror.cpp
@@ -155,7 +155,7 @@ QSqlError::~QSqlError()
Returns the text of the error as reported by the driver. This may
contain database-specific descriptions. It may also be empty.
- \sa setDriverText() databaseText() text()
+ \sa setDriverText(), databaseText(), text()
*/
QString QSqlError::driverText() const
{
@@ -165,7 +165,7 @@ QString QSqlError::driverText() const
/*!
Sets the driver error text to the value of \a driverText.
- \sa driverText() setDatabaseText() text()
+ \sa driverText(), setDatabaseText(), text()
*/
void QSqlError::setDriverText(const QString& driverText)
@@ -177,7 +177,7 @@ void QSqlError::setDriverText(const QString& driverText)
Returns the text of the error as reported by the database. This
may contain database-specific descriptions; it may be empty.
- \sa setDatabaseText() driverText() text()
+ \sa setDatabaseText(), driverText(), text()
*/
QString QSqlError::databaseText() const
@@ -188,7 +188,7 @@ QString QSqlError::databaseText() const
/*!
Sets the database error text to the value of \a databaseText.
- \sa databaseText() setDriverText() text()
+ \sa databaseText(), setDriverText(), text()
*/
void QSqlError::setDatabaseText(const QString& databaseText)
@@ -245,7 +245,7 @@ void QSqlError::setNumber(int number)
This is a convenience function that returns databaseText() and
driverText() concatenated into a single string.
- \sa driverText() databaseText()
+ \sa driverText(), databaseText()
*/
QString QSqlError::text() const
@@ -261,7 +261,7 @@ QString QSqlError::text() const
Returns true if an error is set, otherwise false.
Example:
- \snippet doc/src/snippets/code/src_sql_kernel_qsqlerror.cpp 0
+ \snippet code/src_sql_kernel_qsqlerror.cpp 0
\sa type()
*/
diff --git a/src/sql/kernel/qsqlfield.cpp b/src/sql/kernel/qsqlfield.cpp
index 3160d25ef5..47162afb47 100644
--- a/src/sql/kernel/qsqlfield.cpp
+++ b/src/sql/kernel/qsqlfield.cpp
@@ -113,21 +113,21 @@ public:
Field data values are stored as QVariants. Using an incompatible
type is not permitted. For example:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 2
+ \snippet sqldatabase/sqldatabase.cpp 2
However, the field will attempt to cast certain data types to the
field data type where possible:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 3
+ \snippet sqldatabase/sqldatabase.cpp 3
QSqlField objects are rarely created explicitly in application
code. They are usually accessed indirectly through \l{QSqlRecord}s
that already contain a list of fields. For example:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 4
+ \snippet sqldatabase/sqldatabase.cpp 4
\dots
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 5
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 6
+ \snippet sqldatabase/sqldatabase.cpp 5
+ \snippet sqldatabase/sqldatabase.cpp 6
A QSqlField object can provide some meta-data about the field, for
example, its name(), variant type(), length(), precision(),
@@ -157,7 +157,8 @@ public:
Constructs an empty field called \a fieldName of variant type \a
type.
- \sa setRequiredStatus() setLength() setPrecision() setDefaultValue() setGenerated() setReadOnly()
+ \sa setRequiredStatus(), setLength(), setPrecision(), setDefaultValue(),
+ setGenerated(), setReadOnly()
*/
QSqlField::QSqlField(const QString& fieldName, QVariant::Type type)
{
@@ -216,7 +217,8 @@ QSqlField::~QSqlField()
/*!
Sets the required status of this field to \a required.
- \sa requiredStatus() setType() setLength() setPrecision() setDefaultValue() setGenerated() setReadOnly()
+ \sa requiredStatus(), setType(), setLength(), setPrecision(),
+ setDefaultValue(), setGenerated(), setReadOnly()
*/
void QSqlField::setRequiredStatus(RequiredStatus required)
{
@@ -237,7 +239,8 @@ void QSqlField::setRequiredStatus(RequiredStatus required)
maximum number of characters the string can hold; the meaning
varies for other types.
- \sa length() setType() setRequiredStatus() setPrecision() setDefaultValue() setGenerated() setReadOnly()
+ \sa length(), setType(), setRequiredStatus(), setPrecision(),
+ setDefaultValue(), setGenerated(), setReadOnly()
*/
void QSqlField::setLength(int fieldLength)
{
@@ -248,7 +251,8 @@ void QSqlField::setLength(int fieldLength)
/*!
Sets the field's \a precision. This only affects numeric fields.
- \sa precision() setType() setRequiredStatus() setLength() setDefaultValue() setGenerated() setReadOnly()
+ \sa precision(), setType(), setRequiredStatus(), setLength(),
+ setDefaultValue(), setGenerated(), setReadOnly()
*/
void QSqlField::setPrecision(int precision)
{
@@ -259,7 +263,8 @@ void QSqlField::setPrecision(int precision)
/*!
Sets the default value used for this field to \a value.
- \sa defaultValue() value() setType() setRequiredStatus() setLength() setPrecision() setGenerated() setReadOnly()
+ \sa defaultValue(), value(), setType(), setRequiredStatus(),
+ setLength(), setPrecision(), setGenerated(), setReadOnly()
*/
void QSqlField::setDefaultValue(const QVariant &value)
{
@@ -282,7 +287,8 @@ void QSqlField::setSqlType(int type)
QSqlQueryModel and QSqlTableModel will generate SQL for this
field.
- \sa isGenerated() setType() setRequiredStatus() setLength() setPrecision() setDefaultValue() setReadOnly()
+ \sa isGenerated(), setType(), setRequiredStatus(), setLength(),
+ setPrecision(), setDefaultValue(), setReadOnly()
*/
void QSqlField::setGenerated(bool gen)
{
@@ -302,7 +308,7 @@ void QSqlField::setGenerated(bool gen)
To set the value to NULL, use clear().
- \sa value() isReadOnly() defaultValue()
+ \sa value(), isReadOnly(), defaultValue()
*/
void QSqlField::setValue(const QVariant& value)
@@ -316,7 +322,7 @@ void QSqlField::setValue(const QVariant& value)
Clears the value of the field and sets it to NULL.
If the field is read-only, nothing happens.
- \sa setValue() isReadOnly() requiredStatus()
+ \sa setValue(), isReadOnly(), requiredStatus()
*/
void QSqlField::clear()
@@ -384,7 +390,8 @@ QVariant::Type QSqlField::type() const
/*!
Set's the field's variant type to \a type.
- \sa type() setRequiredStatus() setLength() setPrecision() setDefaultValue() setGenerated() setReadOnly()
+ \sa type(), setRequiredStatus(), setLength(), setPrecision(),
+ setDefaultValue(), setGenerated(), setReadOnly()
*/
void QSqlField::setType(QVariant::Type type)
{
@@ -399,7 +406,8 @@ void QSqlField::setType(QVariant::Type type)
Returns true if the field's value is read-only; otherwise returns
false.
- \sa setReadOnly() type() requiredStatus() length() precision() defaultValue() isGenerated()
+ \sa setReadOnly(), type(), requiredStatus(), length(), precision(),
+ defaultValue(), isGenerated()
*/
bool QSqlField::isReadOnly() const
{ return d->ro; }
@@ -424,7 +432,8 @@ void QSqlField::detach()
Returns true if this is a required field; otherwise returns false.
An \c INSERT will fail if a required field does not have a value.
- \sa setRequiredStatus() type() length() precision() defaultValue() isGenerated()
+ \sa setRequiredStatus(), type(), length(), precision(), defaultValue(),
+ isGenerated()
*/
QSqlField::RequiredStatus QSqlField::requiredStatus() const
{
@@ -437,7 +446,8 @@ QSqlField::RequiredStatus QSqlField::requiredStatus() const
If the returned value is negative, it means that the information
is not available from the database.
- \sa setLength() type() requiredStatus() precision() defaultValue() isGenerated()
+ \sa setLength(), type(), requiredStatus(), precision(), defaultValue(),
+ isGenerated()
*/
int QSqlField::length() const
{
@@ -451,7 +461,8 @@ int QSqlField::length() const
If the returned value is negative, it means that the information
is not available from the database.
- \sa setPrecision() type() requiredStatus() length() defaultValue() isGenerated()
+ \sa setPrecision(), type(), requiredStatus(), length(), defaultValue(),
+ isGenerated()
*/
int QSqlField::precision() const
{
@@ -461,7 +472,8 @@ int QSqlField::precision() const
/*!
Returns the field's default value (which may be NULL).
- \sa setDefaultValue() type() requiredStatus() length() precision() isGenerated()
+ \sa setDefaultValue(), type(), requiredStatus(), length(), precision(),
+ isGenerated()
*/
QVariant QSqlField::defaultValue() const
{
@@ -485,7 +497,8 @@ int QSqlField::typeID() const
Returns true if the field is generated; otherwise returns
false.
- \sa setGenerated() type() requiredStatus() length() precision() defaultValue()
+ \sa setGenerated(), type(), requiredStatus(), length(), precision(),
+ defaultValue()
*/
bool QSqlField::isGenerated() const
{
@@ -523,12 +536,6 @@ QDebug operator<<(QDebug dbg, const QSqlField &f)
#endif
/*!
- \fn void QSqlField::setNull()
-
- Use clear() instead.
-*/
-
-/*!
Returns true if the value is auto-generated by the database,
for example auto-increment primary key values.
diff --git a/src/sql/kernel/qsqlquery.cpp b/src/sql/kernel/qsqlquery.cpp
index e21a8f4956..78631b5e5f 100644
--- a/src/sql/kernel/qsqlquery.cpp
+++ b/src/sql/kernel/qsqlquery.cpp
@@ -148,7 +148,7 @@ QSqlQueryPrivate::~QSqlQueryPrivate()
For example:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 7
+ \snippet sqldatabase/sqldatabase.cpp 7
To access the data returned by a query, use value(int). Each
field in the data returned by a \c SELECT statement is accessed
@@ -161,7 +161,7 @@ QSqlQueryPrivate::~QSqlQueryPrivate()
explained below). To convert a field name into an index, use
record().\l{QSqlRecord::indexOf()}{indexOf()}, for example:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 8
+ \snippet sqldatabase/sqldatabase.cpp 8
QSqlQuery supports prepared query execution and the binding of
parameter values to placeholders. Some databases don't support
@@ -190,19 +190,19 @@ QSqlQueryPrivate::~QSqlQueryPrivate()
\b{Named binding using named placeholders:}
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 9
+ \snippet sqldatabase/sqldatabase.cpp 9
\b{Positional binding using named placeholders:}
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 10
+ \snippet sqldatabase/sqldatabase.cpp 10
\b{Binding values using positional placeholders (version 1):}
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 11
+ \snippet sqldatabase/sqldatabase.cpp 11
\b{Binding values using positional placeholders (version 2):}
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 12
+ \snippet sqldatabase/sqldatabase.cpp 12
\b{Binding values to a stored procedure:}
@@ -210,7 +210,7 @@ QSqlQueryPrivate::~QSqlQueryPrivate()
it a character through its in parameter, and taking its result in
the out parameter.
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 13
+ \snippet sqldatabase/sqldatabase.cpp 13
Note that unbound parameters will retain their values.
@@ -343,7 +343,7 @@ bool QSqlQuery::isNull(int field) const
Example:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 34
+ \snippet sqldatabase/sqldatabase.cpp 34
\sa isActive(), isValid(), next(), previous(), first(), last(),
seek()
@@ -384,7 +384,7 @@ bool QSqlQuery::exec(const QString& query)
The fields are numbered from left to right using the text of the
\c SELECT statement, e.g. in
- \snippet doc/src/snippets/code/src_sql_kernel_qsqlquery.cpp 0
+ \snippet code/src_sql_kernel_qsqlquery.cpp 0
field 0 is \c forename and field 1 is \c
surname. Using \c{SELECT *} is not recommended because the order
@@ -394,7 +394,7 @@ bool QSqlQuery::exec(const QString& query)
exist, if the query is inactive, or if the query is positioned on
an invalid record.
- \sa previous() next() first() last() seek() isActive() isValid()
+ \sa previous(), next(), first(), last(), seek(), isActive(), isValid()
*/
QVariant QSqlQuery::value(int index) const
@@ -411,7 +411,7 @@ QVariant QSqlQuery::value(int index) const
function returns QSql::BeforeFirstRow or
QSql::AfterLastRow, which are special negative values.
- \sa previous() next() first() last() seek() isActive() isValid()
+ \sa previous(), next(), first(), last(), seek(), isActive(), isValid()
*/
int QSqlQuery::at() const
@@ -495,7 +495,7 @@ const QSqlResult* QSqlQuery::result() const
\endlist
- \sa next() previous() first() last() at() isActive() isValid()
+ \sa next(), previous(), first(), last(), at(), isActive(), isValid()
*/
bool QSqlQuery::seek(int index, bool relative)
{
@@ -587,7 +587,7 @@ bool QSqlQuery::seek(int index, bool relative)
the last record and false is returned. If the record is successfully
retrieved, true is returned.
- \sa previous() first() last() seek() at() isActive() isValid()
+ \sa previous(), first(), last(), seek(), at(), isActive(), isValid()
*/
bool QSqlQuery::next()
{
@@ -636,7 +636,7 @@ bool QSqlQuery::next()
before the first record and false is returned. If the record is
successfully retrieved, true is returned.
- \sa next() first() last() seek() at() isActive() isValid()
+ \sa next(), first(), last(), seek(), at(), isActive(), isValid()
*/
bool QSqlQuery::previous()
{
@@ -671,7 +671,7 @@ bool QSqlQuery::previous()
return false. Returns true if successful. If unsuccessful the query
position is set to an invalid position and false is returned.
- \sa next() previous() last() seek() at() isActive() isValid()
+ \sa next(), previous(), last(), seek(), at(), isActive(), isValid()
*/
bool QSqlQuery::first()
{
@@ -695,7 +695,7 @@ bool QSqlQuery::first()
Returns true if successful. If unsuccessful the query position is
set to an invalid position and false is returned.
- \sa next() previous() first() seek() at() isActive() isValid()
+ \sa next(), previous(), first(), seek(), at(), isActive(), isValid()
*/
bool QSqlQuery::last()
@@ -717,7 +717,7 @@ bool QSqlQuery::last()
To determine the number of rows affected by a non-\c SELECT
statement, use numRowsAffected().
- \sa isActive() numRowsAffected() QSqlDriver::hasFeature()
+ \sa isActive(), numRowsAffected(), QSqlDriver::hasFeature()
*/
int QSqlQuery::size() const
{
@@ -732,7 +732,7 @@ int QSqlQuery::size() const
statements, the value is undefined; use size() instead. If the query
is not \l{isActive()}{active}, -1 is returned.
- \sa size() QSqlDriver::hasFeature()
+ \sa size(), QSqlDriver::hasFeature()
*/
int QSqlQuery::numRowsAffected() const
@@ -850,7 +850,7 @@ void QSqlQuery::setForwardOnly(bool forward)
Since the order of the columns is not defined, QSqlRecord::indexOf()
is used to obtain the index of a column.
- \snippet doc/src/snippets/code/src_sql_kernel_qsqlquery.cpp 1
+ \snippet code/src_sql_kernel_qsqlquery.cpp 1
\sa value()
*/
@@ -895,7 +895,7 @@ void QSqlQuery::clear()
Example:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 9
+ \snippet sqldatabase/sqldatabase.cpp 9
\sa exec(), bindValue(), addBindValue()
*/
@@ -937,7 +937,7 @@ bool QSqlQuery::prepare(const QString& query)
Note that the last error for this query is reset when exec() is
called.
- \sa prepare() bindValue() addBindValue() boundValue() boundValues()
+ \sa prepare(), bindValue(), addBindValue(), boundValue(), boundValues()
*/
bool QSqlQuery::exec()
{
@@ -968,11 +968,11 @@ bool QSqlQuery::exec()
Example:
- \snippet doc/src/snippets/code/src_sql_kernel_qsqlquery.cpp 2
+ \snippet code/src_sql_kernel_qsqlquery.cpp 2
The example above inserts four new rows into \c myTable:
- \snippet doc/src/snippets/code/src_sql_kernel_qsqlquery.cpp 3
+ \snippet code/src_sql_kernel_qsqlquery.cpp 3
To bind NULL values, a null QVariant of the relevant type has to be
added to the bound QVariantList; for example, \c
@@ -1021,7 +1021,7 @@ bool QSqlQuery::execBatch(BatchExecutionMode mode)
\endcode
Binding to name will bind to the first :name, but not the second.
- \sa addBindValue(), prepare(), exec(), boundValue() boundValues()
+ \sa addBindValue(), prepare(), exec(), boundValue(), boundValues()
*/
void QSqlQuery::bindValue(const QString& placeholder, const QVariant& val,
QSql::ParamType paramType
@@ -1051,7 +1051,7 @@ void QSqlQuery::bindValue(int pos, const QVariant& val, QSql::ParamType paramTyp
To bind a NULL value, use a null QVariant; for example, use \c
{QVariant(QVariant::String)} if you are binding a string.
- \sa bindValue(), prepare(), exec(), boundValue() boundValues()
+ \sa bindValue(), prepare(), exec(), boundValue(), boundValues()
*/
void QSqlQuery::addBindValue(const QVariant& val, QSql::ParamType paramType)
{
@@ -1061,7 +1061,7 @@ void QSqlQuery::addBindValue(const QVariant& val, QSql::ParamType paramType)
/*!
Returns the value for the \a placeholder.
- \sa boundValues() bindValue() addBindValue()
+ \sa boundValues(), bindValue(), addBindValue()
*/
QVariant QSqlQuery::boundValue(const QString& placeholder) const
{
@@ -1082,13 +1082,13 @@ QVariant QSqlQuery::boundValue(int pos) const
With named binding, the bound values can be examined in the
following ways:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 14
+ \snippet sqldatabase/sqldatabase.cpp 14
With positional binding, the code becomes:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 15
+ \snippet sqldatabase/sqldatabase.cpp 15
- \sa boundValue() bindValue() addBindValue()
+ \sa boundValue(), bindValue(), addBindValue()
*/
QMap<QString,QVariant> QSqlQuery::boundValues() const
{
@@ -1118,12 +1118,6 @@ QString QSqlQuery::executedQuery() const
}
/*!
- \fn bool QSqlQuery::prev()
-
- Use previous() instead.
-*/
-
-/*!
Returns the object ID of the most recent inserted row if the
database supports it. An invalid QVariant will be returned if the
query did not insert any value or if the database does not report
@@ -1190,7 +1184,7 @@ QSql::NumericalPrecisionPolicy QSqlQuery::numericalPrecisionPolicy() const
Sets the query to inactive. Bound values retain their values.
- \sa prepare() exec() isActive()
+ \sa prepare(), exec(), isActive()
*/
void QSqlQuery::finish()
{
@@ -1230,7 +1224,8 @@ void QSqlQuery::finish()
databases may have restrictions on which statements are allowed to
be used in a SQL batch.
- \sa QSqlDriver::hasFeature() setForwardOnly() next() isSelect() numRowsAffected() isActive() lastError()
+ \sa QSqlDriver::hasFeature(), setForwardOnly(), next(), isSelect(),
+ numRowsAffected(), isActive(), lastError()
*/
bool QSqlQuery::nextResult()
{
diff --git a/src/sql/kernel/qsqlrecord.cpp b/src/sql/kernel/qsqlrecord.cpp
index 93ef58914b..4349661835 100644
--- a/src/sql/kernel/qsqlrecord.cpp
+++ b/src/sql/kernel/qsqlrecord.cpp
@@ -189,7 +189,7 @@ bool QSqlRecord::operator==(const QSqlRecord &other) const
the record. If \a index is out of bounds, an invalid QVariant
is returned.
- \sa fieldName() isNull()
+ \sa fieldName(), isNull()
*/
QVariant QSqlRecord::value(int index) const
@@ -264,7 +264,7 @@ QSqlField QSqlRecord::field(const QString &name) const
/*!
Append a copy of field \a field to the end of the record.
- \sa insert() replace() remove()
+ \sa insert(), replace(), remove()
*/
void QSqlRecord::append(const QSqlField& field)
@@ -276,7 +276,7 @@ void QSqlRecord::append(const QSqlField& field)
/*!
Inserts the field \a field at position \a pos in the record.
- \sa append() replace() remove()
+ \sa append(), replace(), remove()
*/
void QSqlRecord::insert(int pos, const QSqlField& field)
{
@@ -288,7 +288,7 @@ void QSqlRecord::insert(int pos, const QSqlField& field)
Replaces the field at position \a pos with the given \a field. If
\a pos is out of range, nothing happens.
- \sa append() insert() remove()
+ \sa append(), insert(), remove()
*/
void QSqlRecord::replace(int pos, const QSqlField& field)
@@ -304,7 +304,7 @@ void QSqlRecord::replace(int pos, const QSqlField& field)
Removes the field at position \a pos. If \a pos is out of range,
nothing happens.
- \sa append() insert() replace()
+ \sa append(), insert(), replace()
*/
void QSqlRecord::remove(int pos)
@@ -319,7 +319,7 @@ void QSqlRecord::remove(int pos)
/*!
Removes all the record's fields.
- \sa clearValues() isEmpty()
+ \sa clearValues(), isEmpty()
*/
void QSqlRecord::clear()
@@ -332,7 +332,7 @@ void QSqlRecord::clear()
Returns true if there are no fields in the record; otherwise
returns false.
- \sa append() insert() clear()
+ \sa append(), insert(), clear()
*/
bool QSqlRecord::isEmpty() const
@@ -524,10 +524,4 @@ QDebug operator<<(QDebug dbg, const QSqlRecord &r)
}
#endif
-/*!
- \fn int QSqlRecord::position(const QString& name) const
-
- Use indexOf() instead.
-*/
-
QT_END_NAMESPACE
diff --git a/src/sql/kernel/qsqlresult.cpp b/src/sql/kernel/qsqlresult.cpp
index f9dbae306b..03e227bffc 100644
--- a/src/sql/kernel/qsqlresult.cpp
+++ b/src/sql/kernel/qsqlresult.cpp
@@ -953,7 +953,7 @@ void QSqlResult::virtual_hook(int, void *)
Example:
- \snippet doc/src/snippets/code/src_sql_kernel_qsqlresult.cpp 0
+ \snippet code/src_sql_kernel_qsqlresult.cpp 0
Here, we insert two rows into a SQL table, with each row containing three values.
@@ -1032,11 +1032,11 @@ bool QSqlResult::nextResult()
This example retrieves the handle for a sqlite result:
- \snippet doc/src/snippets/code/src_sql_kernel_qsqlresult.cpp 1
+ \snippet code/src_sql_kernel_qsqlresult.cpp 1
This snippet returns the handle for PostgreSQL or MySQL:
- \snippet doc/src/snippets/code/src_sql_kernel_qsqlresult.cpp 2
+ \snippet code/src_sql_kernel_qsqlresult.cpp 2
\sa QSqlDriver::handle()
*/
diff --git a/src/sql/models/qsqlquerymodel.cpp b/src/sql/models/qsqlquerymodel.cpp
index fefb87dcf5..723767344c 100644
--- a/src/sql/models/qsqlquerymodel.cpp
+++ b/src/sql/models/qsqlquerymodel.cpp
@@ -78,9 +78,11 @@ void QSqlQueryModelPrivate::prefetch(int limit)
atEnd = true; // this is the end.
}
if (newBottom.row() >= 0 && newBottom.row() > bottom.row()) {
- q->beginInsertRows(QModelIndex(), bottom.row() + 1, newBottom.row());
+ if (!resetting)
+ q->beginInsertRows(QModelIndex(), bottom.row() + 1, newBottom.row());
bottom = newBottom;
- q->endInsertRows();
+ if (!resetting)
+ q->endInsertRows();
} else {
bottom = newBottom;
}
@@ -109,7 +111,7 @@ void QSqlQueryModelPrivate::initColOffsets(int size)
the lower-level QSqlQuery and can be used to provide data to
view classes such as QTableView. For example:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 16
+ \snippet sqldatabase/sqldatabase.cpp 16
We set the model's query, then we set up the labels displayed in
the view header.
@@ -117,13 +119,13 @@ void QSqlQueryModelPrivate::initColOffsets(int size)
QSqlQueryModel can also be used to access a database
programmatically, without binding it to a view:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 21
+ \snippet sqldatabase/sqldatabase.cpp 21
The code snippet above extracts the \c salary field from record 4 in
the result set of the query \c{SELECT * from employee}. Assuming
that \c salary is column 2, we can rewrite the last line as follows:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 22
+ \snippet sqldatabase/sqldatabase.cpp 22
The model is read-only by default. To make it read-write, you
must subclass it and reimplement setData() and flags(). Another
@@ -175,9 +177,9 @@ QSqlQueryModel::~QSqlQueryModel()
This only affects databases that don't report back the size of a query
(see QSqlDriver::hasFeature()).
- To force fetching of the entire database, you can use the following:
+ To force fetching of the entire result set, you can use the following:
- \snippet doc/src/snippets/code/src_sql_models_qsqlquerymodel.cpp 0
+ \snippet code/src_sql_models_qsqlquerymodel.cpp 0
\a parent should always be an invalid QModelIndex.
@@ -208,6 +210,28 @@ bool QSqlQueryModel::canFetchMore(const QModelIndex &parent) const
return (!parent.isValid() && !d->atEnd);
}
+/*! \reimp
+ */
+void QSqlQueryModel::beginResetModel()
+{
+ Q_D(QSqlQueryModel);
+ if (!d->resetting) {
+ QAbstractTableModel::beginResetModel();
+ d->resetting = true;
+ }
+}
+
+/*! \reimp
+ */
+void QSqlQueryModel::endResetModel()
+{
+ Q_D(QSqlQueryModel);
+ if (d->resetting) {
+ d->resetting = false;
+ QAbstractTableModel::endResetModel();
+ }
+}
+
/*! \fn int QSqlQueryModel::rowCount(const QModelIndex &parent) const
\since 4.1
@@ -317,60 +341,47 @@ void QSqlQueryModel::queryChange()
void QSqlQueryModel::setQuery(const QSqlQuery &query)
{
Q_D(QSqlQueryModel);
+ beginResetModel();
+
QSqlRecord newRec = query.record();
bool columnsChanged = (newRec != d->rec);
- bool hasQuerySize = query.driver()->hasFeature(QSqlDriver::QuerySize);
- bool hasNewData = (newRec != QSqlRecord()) || !query.lastError().isValid();
if (d->colOffsets.size() != newRec.count() || columnsChanged)
d->initColOffsets(newRec.count());
- bool mustClearModel = d->bottom.isValid();
- if (mustClearModel) {
- d->atEnd = true;
- beginRemoveRows(QModelIndex(), 0, qMax(d->bottom.row(), 0));
- d->bottom = QModelIndex();
- }
-
+ d->bottom = QModelIndex();
d->error = QSqlError();
d->query = query;
d->rec = newRec;
+ d->atEnd = true;
- if (mustClearModel)
- endRemoveRows();
-
- d->atEnd = false;
-
- if (columnsChanged && hasNewData)
- reset();
+ if (query.isForwardOnly()) {
+ d->error = QSqlError(QLatin1String("Forward-only queries "
+ "cannot be used in a data model"),
+ QString(), QSqlError::ConnectionError);
+ endResetModel();
+ return;
+ }
- if (!query.isActive() || query.isForwardOnly()) {
- d->atEnd = true;
- d->bottom = QModelIndex();
- if (query.isForwardOnly())
- d->error = QSqlError(QLatin1String("Forward-only queries "
- "cannot be used in a data model"),
- QString(), QSqlError::ConnectionError);
- else
- d->error = query.lastError();
+ if (!query.isActive()) {
+ d->error = query.lastError();
+ endResetModel();
return;
}
- QModelIndex newBottom;
- if (hasQuerySize && d->query.size() > 0) {
- newBottom = createIndex(d->query.size() - 1, d->rec.count() - 1);
- beginInsertRows(QModelIndex(), 0, qMax(0, newBottom.row()));
- d->bottom = createIndex(d->query.size() - 1, columnsChanged ? 0 : d->rec.count() - 1);
- d->atEnd = true;
- endInsertRows();
+
+ if (query.driver()->hasFeature(QSqlDriver::QuerySize) && d->query.size() > 0) {
+ d->bottom = createIndex(d->query.size() - 1, d->rec.count() - 1);
} else {
- newBottom = createIndex(-1, d->rec.count() - 1);
+ d->bottom = createIndex(-1, d->rec.count() - 1);
+ d->atEnd = false;
}
- d->bottom = newBottom;
- queryChange();
// fetchMore does the rowsInserted stuff for incremental models
fetchMore();
+
+ endResetModel();
+ queryChange();
}
/*! \overload
@@ -383,7 +394,7 @@ void QSqlQueryModel::setQuery(const QSqlQuery &query)
was an error setting the query.
Example:
- \snippet doc/src/snippets/code/src_sql_models_qsqlquerymodel.cpp 1
+ \snippet code/src_sql_models_qsqlquerymodel.cpp 1
\sa query(), queryChange(), lastError()
*/
@@ -518,7 +529,7 @@ QSqlRecord QSqlQueryModel::record() const
By default, inserted columns are empty. To fill them with data,
reimplement data() and handle any inserted column separately:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 23
+ \snippet sqldatabase/sqldatabase.cpp 23
\sa removeColumns()
*/
diff --git a/src/sql/models/qsqlquerymodel.h b/src/sql/models/qsqlquerymodel.h
index b5e1a7a746..89b72c8222 100644
--- a/src/sql/models/qsqlquerymodel.h
+++ b/src/sql/models/qsqlquerymodel.h
@@ -90,6 +90,8 @@ public:
bool canFetchMore(const QModelIndex &parent = QModelIndex()) const;
protected:
+ void beginResetModel();
+ void endResetModel();
virtual void queryChange();
virtual QModelIndex indexInQuery(const QModelIndex &item) const;
diff --git a/src/sql/models/qsqlquerymodel_p.h b/src/sql/models/qsqlquerymodel_p.h
index 6e0349f032..3288d311a4 100644
--- a/src/sql/models/qsqlquerymodel_p.h
+++ b/src/sql/models/qsqlquerymodel_p.h
@@ -67,7 +67,7 @@ class QSqlQueryModelPrivate: public QAbstractItemModelPrivate
{
Q_DECLARE_PUBLIC(QSqlQueryModel)
public:
- QSqlQueryModelPrivate() : atEnd(false) {}
+ QSqlQueryModelPrivate() : atEnd(false), resetting(false) {}
~QSqlQueryModelPrivate();
void prefetch(int);
@@ -80,6 +80,7 @@ public:
uint atEnd : 1;
QVector<QHash<int, QVariant> > headers;
QVarLengthArray<int, 56> colOffsets; // used to calculate indexInQuery of columns
+ bool resetting;
};
// helpers for building SQL expressions
diff --git a/src/sql/models/qsqlrelationaldelegate.cpp b/src/sql/models/qsqlrelationaldelegate.cpp
index 79e026fe57..e58c68f139 100644
--- a/src/sql/models/qsqlrelationaldelegate.cpp
+++ b/src/sql/models/qsqlrelationaldelegate.cpp
@@ -53,7 +53,7 @@ QT_BEGIN_NAMESPACE
use the class, simply call QAbstractItemView::setItemDelegate()
on the view with an instance of QSqlRelationalDelegate:
- \snippet examples/sql/relationaltablemodel/relationaltablemodel.cpp 4
+ \snippet sql/relationaltablemodel/relationaltablemodel.cpp 4
The \l{sql/relationaltablemodel}{Relational Table Model} example
(shown below) illustrates how to use QSqlRelationalDelegate in
diff --git a/src/sql/models/qsqlrelationaltablemodel.cpp b/src/sql/models/qsqlrelationaltablemodel.cpp
index a3d45576ae..6d0304e165 100644
--- a/src/sql/models/qsqlrelationaltablemodel.cpp
+++ b/src/sql/models/qsqlrelationaltablemodel.cpp
@@ -340,10 +340,10 @@ void QSqlRelationalTableModelPrivate::clearCache()
The following code snippet shows how the QSqlRelationalTableModel
was set up:
- \snippet examples/sql/relationaltablemodel/relationaltablemodel.cpp 0
+ \snippet sql/relationaltablemodel/relationaltablemodel.cpp 0
\codeline
- \snippet examples/sql/relationaltablemodel/relationaltablemodel.cpp 1
- \snippet examples/sql/relationaltablemodel/relationaltablemodel.cpp 2
+ \snippet sql/relationaltablemodel/relationaltablemodel.cpp 1
+ \snippet sql/relationaltablemodel/relationaltablemodel.cpp 2
The setRelation() function calls establish a relationship between
two tables. The first call specifies that column 2 in table \c
@@ -359,7 +359,7 @@ void QSqlRelationalTableModelPrivate::clearCache()
call QAbstractItemView::setItemDelegate() on the view with an
instance of QSqlRelationalDelegate:
- \snippet examples/sql/relationaltablemodel/relationaltablemodel.cpp 4
+ \snippet sql/relationaltablemodel/relationaltablemodel.cpp 4
The \l{sql/relationaltablemodel} example illustrates how to use
QSqlRelationalTableModel in conjunction with
@@ -486,9 +486,9 @@ bool QSqlRelationalTableModel::setData(const QModelIndex &index, const QVariant
Example:
- \snippet examples/sql/relationaltablemodel/relationaltablemodel.cpp 0
+ \snippet sql/relationaltablemodel/relationaltablemodel.cpp 0
\codeline
- \snippet examples/sql/relationaltablemodel/relationaltablemodel.cpp 1
+ \snippet sql/relationaltablemodel/relationaltablemodel.cpp 1
The setRelation() call specifies that column 2 in table \c
employee is a foreign key that maps with field \c id of table \c
diff --git a/src/sql/models/qsqltablemodel.cpp b/src/sql/models/qsqltablemodel.cpp
index f7198978dd..30c3f032e0 100644
--- a/src/sql/models/qsqltablemodel.cpp
+++ b/src/sql/models/qsqltablemodel.cpp
@@ -213,7 +213,7 @@ QSqlRecord QSqlTableModelPrivate::primaryValues(int row) const
lower-level QSqlQuery and can be used to provide data to view
classes such as QTableView. For example:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 24
+ \snippet sqldatabase/sqldatabase.cpp 24
We set the SQL table's name and the edit strategy, then we set up
the labels displayed in the view header. The edit strategy
@@ -224,7 +224,7 @@ QSqlRecord QSqlTableModelPrivate::primaryValues(int row) const
QSqlTableModel can also be used to access a database
programmatically, without binding it to a view:
- \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 21
+ \snippet sqldatabase/sqldatabase.cpp 21
The code snippet above extracts the \c salary field from record 4 in
the result set of the query \c{SELECT * from employee}.
@@ -364,18 +364,9 @@ bool QSqlTableModel::select()
if (query.isEmpty())
return false;
- QSqlTableModelPrivate::CacheMap::Iterator it = d->cache.end();
- while (it != d->cache.constBegin()) {
- --it;
- // rows must be accounted for
- if (it.value().insert()) {
- beginRemoveRows(QModelIndex(), it.key(), it.key());
- it = d->cache.erase(it);
- endRemoveRows();
- } else {
- it = d->cache.erase(it);
- }
- }
+ beginResetModel();
+
+ d->clearCache();
QSqlQuery qu(query, d->db);
setQuery(qu);
@@ -383,8 +374,10 @@ bool QSqlTableModel::select()
if (!qu.isActive() || lastError().isValid()) {
// something went wrong - revert to non-select state
d->initRecordAndPrimaryIndex();
+ endResetModel();
return false;
}
+ endResetModel();
return true;
}
diff --git a/src/sql/sql.pro b/src/sql/sql.pro
index dbeed14386..e3f81f3498 100644
--- a/src/sql/sql.pro
+++ b/src/sql/sql.pro
@@ -21,6 +21,7 @@ DEFINES += QT_NO_CAST_FROM_ASCII
PRECOMPILED_HEADER = ../corelib/global/qt_pch.h
SQL_P = sql
+include(doc/doc.pri)
include(kernel/kernel.pri)
include(drivers/drivers.pri)
include(models/models.pri)
diff --git a/src/src.pro b/src/src.pro
index 4efa017065..46841569fc 100644
--- a/src/src.pro
+++ b/src/src.pro
@@ -65,7 +65,7 @@ src_concurrent.target = sub-concurrent
src_plugins.depends = src_gui src_sql src_xml src_platformsupport
}
-contains(QT_CONFIG, no-widgets): SRC_SUBDIRS -= src_opengl src_widgets src_printsupport src_testlib
+contains(QT_CONFIG, no-widgets): SRC_SUBDIRS -= src_opengl src_widgets src_printsupport
# This creates a sub-src rule
sub_src_target.CONFIG = recursive
diff --git a/src/testlib/qbenchmarkvalgrind.cpp b/src/testlib/qbenchmarkvalgrind.cpp
index 453c5ccda0..c4a4990a36 100644
--- a/src/testlib/qbenchmarkvalgrind.cpp
+++ b/src/testlib/qbenchmarkvalgrind.cpp
@@ -66,7 +66,7 @@ bool QBenchmarkValgrindUtils::haveValgrind()
if (!process.waitForFinished(-1))
return false;
const QByteArray out = process.readAllStandardOutput();
- const QRegExp rx(QLatin1String("^valgrind-([0-9]).([0-9]).[0-9]"));
+ QRegExp rx(QLatin1String("^valgrind-([0-9]).([0-9]).[0-9]"));
if (rx.indexIn(QLatin1String(out.data())) == -1)
return false;
bool ok;
@@ -110,7 +110,7 @@ qint64 QBenchmarkValgrindUtils::extractResult(const QString &fileName)
qint64 val = -1;
bool valSeen = false;
- const QRegExp rxValue(QLatin1String("^summary: (\\d+)"));
+ QRegExp rxValue(QLatin1String("^summary: (\\d+)"));
while (!file.atEnd()) {
const QString line(QLatin1String(file.readLine()));
if (rxValue.indexIn(line) != -1) {
@@ -139,7 +139,7 @@ QString QBenchmarkValgrindUtils::getNewestFileName()
int hiSuffix = -1;
QFileInfo lastFileInfo;
const QString pattern = QString::fromLatin1("%1.(\\d+)").arg(base);
- const QRegExp rx(pattern);
+ QRegExp rx(pattern);
foreach (QFileInfo fileInfo, fiList) {
const int index = rx.indexIn(fileInfo.fileName());
Q_ASSERT(index == 0);
diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp
index 08dd4a9f80..245245e1ca 100644
--- a/src/testlib/qtestcase.cpp
+++ b/src/testlib/qtestcase.cpp
@@ -908,7 +908,7 @@ QT_BEGIN_NAMESPACE
\brief The QTouchEventSequence class is used to simulate a sequence of touch events.
- To simulate a sequence of touch events on a specific device for a widget, call
+ To simulate a sequence of touch events on a specific device for a window or widget, call
QTest::touchEvent to create a QTouchEventSequence instance. Add touch events to
the sequence by calling press(), move(), release() and stationary(), and let the
instance run out of scope to commit the sequence to the event system.
@@ -920,7 +920,32 @@ QT_BEGIN_NAMESPACE
/*!
\fn QTest::QTouchEventSequence::~QTouchEventSequence()
- Commits this sequence of touch events and frees allocated resources.
+ Commits this sequence of touch events, unless autoCommit was disabled, and frees allocated resources.
+*/
+
+/*!
+ \fn void QTest::QTouchEventSequence::commit(bool processEvents)
+
+ Commits this sequence of touch events to the event system. Normally there is no need to call this
+ function because it is called from the destructor. However, if autoCommit is disabled, the events
+ only get committed upon explicitly calling this function.
+
+ In special cases tests may want to disable the processing of the events. This can be achieved by
+ setting \a processEvents to false. This results in merely queuing the events, the event loop will
+ not be forced to process them.
+*/
+
+/*!
+ \fn QTouchEventSequence &QTest::QTouchEventSequence::press(int touchId, const QPoint &pt, QWindow *window)
+ \since 5.0
+
+ Adds a press event for touchpoint \a touchId at position \a pt to this sequence and returns
+ a reference to this QTouchEventSequence.
+
+ The position \a pt is interpreted as relative to \a window. If \a window is the null pointer, then
+ \a pt is interpreted as relative to the window provided when instantiating this QTouchEventSequence.
+
+ Simulates that the user pressed the touch screen or pad with the finger identified by \a touchId.
*/
/*!
@@ -936,6 +961,19 @@ QT_BEGIN_NAMESPACE
*/
/*!
+ \fn QTouchEventSequence &QTest::QTouchEventSequence::move(int touchId, const QPoint &pt, QWindow *window)
+ \since 5.0
+
+ Adds a move event for touchpoint \a touchId at position \a pt to this sequence and returns
+ a reference to this QTouchEventSequence.
+
+ The position \a pt is interpreted as relative to \a window. If \a widnow is the null pointer, then
+ \a pt is interpreted as relative to the window provided when instantiating this QTouchEventSequence.
+
+ Simulates that the user moved the finger identified by \a touchId.
+*/
+
+/*!
\fn QTouchEventSequence &QTest::QTouchEventSequence::move(int touchId, const QPoint &pt, QWidget *widget)
Adds a move event for touchpoint \a touchId at position \a pt to this sequence and returns
@@ -948,6 +986,19 @@ QT_BEGIN_NAMESPACE
*/
/*!
+ \fn QTouchEventSequence &QTest::QTouchEventSequence::release(int touchId, const QPoint &pt, QWindow *window)
+ \since 5.0
+
+ Adds a release event for touchpoint \a touchId at position \a pt to this sequence and returns
+ a reference to this QTouchEventSequence.
+
+ The position \a pt is interpreted as relative to \a window. If \a window is the null pointer, then
+ \a pt is interpreted as relative to the window provided when instantiating this QTouchEventSequence.
+
+ Simulates that the user lifted the finger identified by \a touchId.
+*/
+
+/*!
\fn QTouchEventSequence &QTest::QTouchEventSequence::release(int touchId, const QPoint &pt, QWidget *widget)
Adds a release event for touchpoint \a touchId at position \a pt to this sequence and returns
@@ -969,7 +1020,24 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn QTouchEventSequence QTest::touchEvent(QWidget *widget, QTouchEvent::DeviceType deviceType)
+ \fn QTouchEventSequence QTest::touchEvent(QWindow *window, QTouchEvent::DeviceType deviceType, bool autoCommit)
+ \since 5.0
+
+ Creates and returns a QTouchEventSequence for the device \a deviceType to
+ simulate events for \a window.
+
+ When adding touch events to the sequence, \a window will also be used to translate
+ the position provided to screen coordinates, unless another window is provided in the
+ respective calls to press(), move() etc.
+
+ The touch events are committed to the event system when the destructor of the
+ QTouchEventSequence is called (ie when the object returned runs out of scope), unless
+ \a autoCommit is set to false. When \a autoCommit is false, commit() has to be called
+ manually.
+*/
+
+/*!
+ \fn QTouchEventSequence QTest::touchEvent(QWidget *widget, QTouchEvent::DeviceType deviceType, bool autoCommit)
Creates and returns a QTouchEventSequence for the device \a deviceType to
simulate events for \a widget.
@@ -979,7 +1047,9 @@ QT_BEGIN_NAMESPACE
respective calls to press(), move() etc.
The touch events are committed to the event system when the destructor of the
- QTouchEventSequence is called (ie when the object returned runs out of scope).
+ QTouchEventSequence is called (ie when the object returned runs out of scope), unless
+ \a autoCommit is set to false. When \a autoCommit is false, commit() has to be called
+ manually.
*/
static bool installCoverageTool(const char * appname, const char * testname)
diff --git a/src/testlib/qtestkeyboard.h b/src/testlib/qtestkeyboard.h
index 5625bd606c..2e43e864d5 100644
--- a/src/testlib/qtestkeyboard.h
+++ b/src/testlib/qtestkeyboard.h
@@ -91,7 +91,7 @@ namespace QTest
QTEST_ASSERT(qApp);
if (!window)
- window = QGuiApplication::activeWindow();
+ window = QGuiApplication::focusWindow();
QTEST_ASSERT(window);
diff --git a/src/testlib/qtesttouch.h b/src/testlib/qtesttouch.h
index 291a7219b3..6e456f375c 100644
--- a/src/testlib/qtesttouch.h
+++ b/src/testlib/qtesttouch.h
@@ -71,7 +71,8 @@ namespace QTest
public:
~QTouchEventSequence()
{
- commit();
+ if (commitWhenDestroyed)
+ commit();
}
QTouchEventSequence& press(int touchId, const QPoint &pt, QWindow *window = 0)
{
@@ -125,7 +126,7 @@ namespace QTest
}
#endif
- void commit()
+ void commit(bool processEvents = true)
{
if (!points.isEmpty()) {
if (targetWindow)
@@ -139,7 +140,8 @@ namespace QTest
}
#endif
}
- QCoreApplication::processEvents();
+ if (processEvents)
+ QCoreApplication::processEvents();
previousPoints = points;
points.clear();
}
@@ -170,17 +172,17 @@ namespace QTest
private:
#ifdef QT_WIDGETS_LIB
- QTouchEventSequence(QWidget *widget, QTouchDevice *aDevice)
- : targetWidget(widget), targetWindow(0), device(aDevice)
+ QTouchEventSequence(QWidget *widget, QTouchDevice *aDevice, bool autoCommit)
+ : targetWidget(widget), targetWindow(0), device(aDevice), commitWhenDestroyed(autoCommit)
{
}
#endif
- QTouchEventSequence(QWindow *window, QTouchDevice *aDevice)
+ QTouchEventSequence(QWindow *window, QTouchDevice *aDevice, bool autoCommit)
:
#ifdef QT_WIDGETS_LIB
targetWidget(0),
#endif
- targetWindow(window), device(aDevice)
+ targetWindow(window), device(aDevice), commitWhenDestroyed(autoCommit)
{
}
@@ -224,25 +226,28 @@ namespace QTest
#endif
QWindow *targetWindow;
QTouchDevice *device;
+ bool commitWhenDestroyed;
#ifdef QT_WIDGETS_LIB
- friend QTouchEventSequence touchEvent(QWidget *, QTouchDevice*);
+ friend QTouchEventSequence touchEvent(QWidget *, QTouchDevice*, bool);
#endif
- friend QTouchEventSequence touchEvent(QWindow *, QTouchDevice*);
+ friend QTouchEventSequence touchEvent(QWindow *, QTouchDevice*, bool);
};
#ifdef QT_WIDGETS_LIB
inline
QTouchEventSequence touchEvent(QWidget *widget,
- QTouchDevice *device)
+ QTouchDevice *device,
+ bool autoCommit = true)
{
- return QTouchEventSequence(widget, device);
+ return QTouchEventSequence(widget, device, autoCommit);
}
#endif
inline
QTouchEventSequence touchEvent(QWindow *window,
- QTouchDevice *device)
+ QTouchDevice *device,
+ bool autoCommit = true)
{
- return QTouchEventSequence(window, device);
+ return QTouchEventSequence(window, device, autoCommit);
}
}
diff --git a/src/testlib/testlib.pro b/src/testlib/testlib.pro
index 2f5b3229e4..e4ff21e2aa 100644
--- a/src/testlib/testlib.pro
+++ b/src/testlib/testlib.pro
@@ -14,6 +14,11 @@ unix:!embedded:QMAKE_PKGCONFIG_DESCRIPTION = Qt \
Library
HEADERS = qbenchmark.h \
+ qbenchmark_p.h \
+ qbenchmarkmeasurement_p.h \
+ qbenchmarkvalgrind_p.h \
+ qbenchmarkevent_p.h \
+ qbenchmarkmetric_p.h \
qsignalspy.h \
qtestaccessible.h \
qtestassert.h \
@@ -65,7 +70,7 @@ wince*::LIBS += libcmt.lib \
mac {
LIBS += -framework IOKit -framework Security
- contains(QT_CONFIG, coreservices) {
+ !ios {
LIBS_PRIVATE += -framework CoreServices
LIBS += -framework ApplicationServices
} else {
diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp
index 74cdc5874c..5680dcba70 100644
--- a/src/tools/moc/generator.cpp
+++ b/src/tools/moc/generator.cpp
@@ -415,22 +415,6 @@ void Generator::generateCode()
fprintf(out, " 0\n};\n\n");
}
- bool hasExtraData = (cdef->hasQObject && !isQt) || !extraList.isEmpty();
- if (hasExtraData) {
- fprintf(out, "const QMetaObjectExtraData %s::staticMetaObjectExtraData = {\n ",
- cdef->qualified.constData());
- if (extraList.isEmpty())
- fprintf(out, "0, ");
- else
- fprintf(out, "qt_meta_extradata_%s, ", qualifiedClassNameIdentifier.constData());
-
- if (cdef->hasQObject && !isQt)
- fprintf(out, " qt_static_metacall");
- else
- fprintf(out, " 0");
- fprintf(out, " \n};\n\n");
- }
-
//
// Finally create and initialize the static meta object
//
@@ -448,16 +432,20 @@ void Generator::generateCode()
fprintf(out, "qt_meta_stringdata_%s.data,\n"
" qt_meta_data_%s, ", qualifiedClassNameIdentifier.constData(),
qualifiedClassNameIdentifier.constData());
- if (!hasExtraData)
- fprintf(out, "0 }\n");
+ if (cdef->hasQObject && !isQt)
+ fprintf(out, " qt_static_metacall, ");
else
- fprintf(out, "&staticMetaObjectExtraData }\n");
- fprintf(out, "};\n");
+ fprintf(out, " 0, ");
+
+ if (extraList.isEmpty())
+ fprintf(out, "0, ");
+ else
+ fprintf(out, "qt_meta_extradata_%s, ", qualifiedClassNameIdentifier.constData());
+ fprintf(out, "0}\n};\n\n");
if(isQt)
return;
-
if (!cdef->hasQObject)
return;
diff --git a/src/tools/moc/outputrevision.h b/src/tools/moc/outputrevision.h
index cff0f98fca..590728db6c 100644
--- a/src/tools/moc/outputrevision.h
+++ b/src/tools/moc/outputrevision.h
@@ -43,6 +43,6 @@
#define OUTPUTREVISION_H
// if the output revision changes, you MUST change it in qobjectdefs.h too
-enum { mocOutputRevision = 65 }; // moc format output revision
+enum { mocOutputRevision = 66 }; // moc format output revision
#endif // OUTPUTREVISION_H
diff --git a/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp b/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp
index 8c75c8a27b..f9d6864567 100644
--- a/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp
+++ b/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp
@@ -353,7 +353,7 @@ static QByteArray qtTypeName(const QString &signature, const QDBusIntrospection:
QString oldAnnotationName = QString::fromLatin1("com.trolltech.QtDBus.QtTypeName");
if (paramId >= 0)
oldAnnotationName += QString::fromLatin1(".%1%2").arg(QLatin1String(direction)).arg(paramId);
- qttype = annotations.value(annotationName);
+ qttype = annotations.value(oldAnnotationName);
if (qttype.isEmpty()) {
fprintf(stderr, "Got unknown type `%s'\n", qPrintable(signature));
diff --git a/src/tools/qdoc/config.cpp b/src/tools/qdoc/config.cpp
index 8b356d1536..e715ea1112 100644
--- a/src/tools/qdoc/config.cpp
+++ b/src/tools/qdoc/config.cpp
@@ -150,6 +150,7 @@ QStringList MetaStack::getExpanded(const Location& location)
QT_STATIC_CONST_IMPL QString Config::dot = QLatin1String(".");
bool Config::generateExamples = true;
QString Config::overrideOutputDir;
+QString Config::installDir;
QSet<QString> Config::overrideOutputFormats;
QMap<QString, QString> Config::extractedDirs;
int Config::numInstances;
diff --git a/src/tools/qdoc/config.h b/src/tools/qdoc/config.h
index f36389eb32..6ed37fce03 100644
--- a/src/tools/qdoc/config.h
+++ b/src/tools/qdoc/config.h
@@ -111,6 +111,7 @@ public:
QT_STATIC_CONST QString dot;
static bool generateExamples;
+ static QString installDir;
static QString overrideOutputDir;
static QSet<QString> overrideOutputFormats;
@@ -135,6 +136,7 @@ private:
#define CONFIG_BASEDIR "basedir"
#define CONFIG_CODEINDENT "codeindent"
#define CONFIG_DEFINES "defines"
+#define CONFIG_DEPENDS "depends"
#define CONFIG_DESCRIPTION "description"
#define CONFIG_EDITION "edition"
#define CONFIG_ENDHEADER "endheader"
diff --git a/src/tools/qdoc/ditaxmlgenerator.cpp b/src/tools/qdoc/ditaxmlgenerator.cpp
index 1f986e35ff..0c88cbc529 100644
--- a/src/tools/qdoc/ditaxmlgenerator.cpp
+++ b/src/tools/qdoc/ditaxmlgenerator.cpp
@@ -70,9 +70,15 @@ QString DitaXmlGenerator::ditaTags[] =
{
"",
"alt",
+ "apiData",
+ "apiDef",
+ "apiDefItem",
"apiDesc",
+ "apiDetail",
+ "apiItemName",
"APIMap",
"apiName",
+ "apiRef",
"apiRelation",
"audience",
"author",
@@ -215,6 +221,34 @@ QString DitaXmlGenerator::ditaTags[] =
"prodname",
"prolog",
"publisher",
+ "qmlAttached",
+ "qmlDetail",
+ "qmlImportModule",
+ "qmlInheritedBy",
+ "qmlInherits",
+ "qmlInstantiates",
+ "qmlMethod",
+ "qmlMethodDef",
+ "qmlMethodDetail",
+ "qmlName",
+ "qmlProperty",
+ "qmlPropertyDef",
+ "qmlPropertyDetail",
+ "qmlPropertyGroup",
+ "qmlPropertyGroupDef",
+ "qmlPropertyGroupDetail",
+ "qmlQualifier",
+ "qmlSignal",
+ "qmlSignalDef",
+ "qmlSignalDetail",
+ "qmlSignalHandler",
+ "qmlSignalHandlerDef",
+ "qmlSignalHandlerDetail",
+ "qmlSignature",
+ "qmlSince",
+ "qmlType",
+ "qmlTypeDef",
+ "qmlTypeDetail",
"related-links",
"resourceid",
"revised",
@@ -335,18 +369,18 @@ DitaXmlGenerator::DitaTag DitaXmlGenerator::currentTag()
}
/*!
- Write the start tag \c{<apiDesc>}. if \a title is not
- empty, generate a GUID from it and write the GUID as the
- value of the \e{id} attribute.
+ Write the start \a tag. if \a title is not empty, generate
+ a GUID from it and write the GUID as the value of the \e{id}
+ attribute.
Then if \a outputclass is not empty, write it as the value
of the \a outputclass attribute.
Fiunally, set the section nesting level to 1 and return 1.
*/
-int DitaXmlGenerator::enterApiDesc(const QString& outputclass, const QString& title)
+int DitaXmlGenerator::enterDesc(DitaTag tag, const QString& outputclass, const QString& title)
{
- writeStartTag(DT_apiDesc);
+ writeStartTag(tag);
if (!title.isEmpty()) {
writeGuidAttribute(title);
//Are there cases where the spectitle is required?
@@ -646,6 +680,10 @@ void DitaXmlGenerator::generateTree(Tree *tree)
Generator::generateTree(tree);
generateCollisionPages();
+
+ QString fileBase = project.toLower().simplified().replace(" ", "-");
+ generateIndex(fileBase, projectUrl, projectDescription);
+
writeDitaMap(tree);
}
@@ -1797,7 +1835,7 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
writeLocation(nsn);
writeEndTag(); // <cxxClassDefinition>
- enterApiDesc(QString(),title);
+ enterDesc(DT_apiDesc,QString(),title);
#if 0
// To be removed, if really not needed.
Text brief = nsn->doc().briefText(); // zzz
@@ -1933,7 +1971,7 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
writeLocation(cn);
writeEndTag(); // <cxxClassDefinition>
- enterApiDesc(QString(),title);
+ enterDesc(DT_apiDesc,QString(),title);
#if 0
// To be removed, if really not needed.
Text brief = cn->doc().briefText(); // zzz
@@ -2059,7 +2097,7 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
writeProlog(inner);
writeStartTag(DT_cxxClassDetail);
- enterApiDesc(QString(),title);
+ enterDesc(DT_apiDesc,QString(),title);
#if 0
// To be removed, if really not needed.
Text brief = fn->doc().briefText(); // zzz
@@ -2173,15 +2211,20 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
rawTitle = marker->plainName(inner);
fullTitle = marker->plainFullName(inner);
title = rawTitle + " Element";
- //QString fullTitle = fake->fullTitle();
- //QString htmlTitle = fullTitle;
+ Node::clearPropertyGroupCount();
generateHeader(inner, fullTitle);
generateBrief(inner, marker); // <shortdesc>
writeProlog(inner);
- writeStartTag(DT_cxxClassDetail);
- enterApiDesc(QString(),title);
+ writeStartTag(DT_qmlTypeDetail);
+ generateQmlModuleDef(qcn);
+ generateQmlInherits(qcn,marker);
+ generateQmlInstantiates(qcn,marker);
+ generateQmlInheritedBy(qcn, marker);
+ generateQmlSince(qcn);
+
+ enterDesc(DT_apiDesc,QString(),title);
#if 0
// To be removed, if really not needed.
Text brief = qcn->doc().briefText(); // zzz
@@ -2191,10 +2234,6 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
writeEndTag(); // </p>
}
#endif
- generateQmlInstantiates(qcn, marker);
- generateQmlInherits(qcn, marker);
- generateQmlInheritedBy(qcn, marker);
- generateSince(qcn, marker);
enterSection("","");
generateBody(qcn, marker);
if (cn) {
@@ -2203,42 +2242,13 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
}
leaveSection();
leaveSection(); // </apiDesc>
+ writeEndTag(); // </qmlTypeDetail>
- QList<Section> summarySections;
- summarySections = marker->qmlSections(qcn,CodeMarker::Summary);
- if (!summarySections.isEmpty()) {
- enterSection("redundant",QString());
- s = summarySections.begin();
- while (s != summarySections.end()) {
- QString attr;
- if (!s->members.isEmpty()) {
- writeStartTag(DT_p);
- attr = cleanRef((*s).name).toLower() + " h2";
- xmlWriter().writeAttribute("outputclass",attr);
- writeCharacters(protectEnc((*s).name));
- writeEndTag(); // </p>
- generateQmlSummary(*s,qcn,marker);
- //generateSection(s->members, inner, marker, CodeMarker::Summary);
- //generateSectionInheritedList(*s, inner, marker);
- }
- ++s;
- }
- leaveSection();
- }
-
- QList<Section> detailSections;
- detailSections = marker->qmlSections(qcn,CodeMarker::Detailed);
- if (!detailSections.isEmpty()) {
- enterSection("details",QString());
- s = detailSections.begin();
- while (s != detailSections.end()) {
+ QList<Section> members = marker->qmlSections(qcn,CodeMarker::Detailed);
+ if (!members.isEmpty()) {
+ s = members.begin();
+ while (s != members.end()) {
if (!s->members.isEmpty()) {
- QString attr;
- writeStartTag(DT_p);
- attr = cleanRef((*s).name).toLower() + " h2";
- xmlWriter().writeAttribute("outputclass",attr);
- writeCharacters(protectEnc((*s).name));
- writeEndTag(); // </p>
NodeList::ConstIterator m = (*s).members.begin();
while (m != (*s).members.end()) {
generateDetailedQmlMember(*m, qcn, marker);
@@ -2247,14 +2257,11 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
}
++s;
}
- leaveSection();
}
- writeEndTag(); // </cxxClassDetail>
- writeEndTag(); // </cxxClass>
+ writeEndTag(); // </apiRef>
}
}
-
/*!
Write a list item for a \a link with the given \a text.
*/
@@ -2429,7 +2436,7 @@ void DitaXmlGenerator::writeRelatedLinks(const FakeNode* node, CodeMarker* marke
/*!
Returns "dita" for this subclass of class Generator.
*/
-QString DitaXmlGenerator::fileExtension(const Node * /* node */) const
+QString DitaXmlGenerator::fileExtension() const
{
return "dita";
}
@@ -2487,14 +2494,14 @@ void DitaXmlGenerator::generateHeader(const Node* node,
outputclass = "headerfile";
}
else if (node->subType() == Node::QmlClass) {
- mainTag = DT_cxxClass;
+ mainTag = DT_qmlType;
nameTag = DT_apiName;
- dtd = "dtd/cxxClass.dtd";
- version = "0.7.0";
+ dtd = "dtd/qmlType.dtd";
+ version = "0.1.0";
doctype = "<!DOCTYPE " + ditaTags[mainTag] +
- " PUBLIC \"-//NOKIA//DTD DITA C++ API Class Reference Type v" +
- version + "//EN\" \"" + dtd + "\">";
- outputclass = "QML-class";
+ " PUBLIC \"-//NOKIA//DTD DITA QML Type" +
+ "//EN\" \"" + dtd + "\">";
+ outputclass = "QML-type";
}
else {
mainTag = DT_topic;
@@ -4426,6 +4433,50 @@ void DitaXmlGenerator::generateQmlSummary(const Section& section,
}
/*!
+ Writes the QML property \a qpn to the current DITA XML file.
+ Assumes that the correct start tag has already been written,
+ but nothing has been written inside that tag. This function
+ begins by writing the GUID id attribute for the property.
+ */
+void DitaXmlGenerator::startQmlProperty(QmlPropertyNode* qpn,
+ const InnerNode* relative,
+ CodeMarker* marker)
+{
+ writeStartTag(DT_qmlProperty);
+ writeGuidAttribute((Node*)qpn);
+ writeStartTag(DT_apiName);
+ writeCharacters(qpn->name());
+ writeEndTag(); // </apiName>
+ generateBrief(qpn, marker); // <shortdesc>
+ writeStartTag(DT_qmlPropertyDetail);
+ writeStartTag(DT_qmlPropertyDef);
+ if (!qpn->isReadOnlySet())
+ qpn->setReadOnly(!qpn->isWritable(tree_));
+ if (qpn->isReadOnly()) {
+ writeStartTag(DT_qmlQualifier);
+ xmlWriter().writeAttribute("name","read-only");
+ xmlWriter().writeAttribute("value","read-only");
+ writeEndTag(); // </qmlQualifier>
+ }
+ if (qpn->isDefault()) {
+ writeStartTag(DT_qmlQualifier);
+ xmlWriter().writeAttribute("name","default");
+ xmlWriter().writeAttribute("value","default");
+ writeEndTag(); // </qmlQualifier>
+ }
+ if (qpn->isAttached()) {
+ writeStartTag(DT_qmlAttached);
+ xmlWriter().writeAttribute("name","attached");
+ xmlWriter().writeAttribute("value","yes");
+ writeEndTag(); // </qmlAttached>
+ }
+ writeStartTag(DT_apiData);
+ generateQmlItem(qpn, relative, marker, false);
+ writeEndTag(); // </apiData>
+ writeEndTag(); // </qmlPropertyDef>
+}
+
+/*!
Outputs the DITA detailed documentation for a section
on a QML element reference page.
*/
@@ -4435,71 +4486,57 @@ void DitaXmlGenerator::generateDetailedQmlMember(Node* node,
{
QString marked;
QmlPropertyNode* qpn = 0;
+
if (node->subType() == Node::QmlPropertyGroup) {
const QmlPropGroupNode* qpgn = static_cast<const QmlPropGroupNode*>(node);
NodeList::ConstIterator p = qpgn->childNodes().begin();
- writeStartTag(DT_ul);
- while (p != qpgn->childNodes().end()) {
- if ((*p)->type() == Node::QmlProperty) {
- qpn = static_cast<QmlPropertyNode*>(*p);
- writeStartTag(DT_li);
- writeGuidAttribute((Node*)qpn);
- QString attr;
- if (!qpn->isReadOnlySet())
- qpn->setReadOnly(!qpn->isWritable(tree_));
- if (qpn->isReadOnly())
- attr = "read-only";
- if (qpn->isDefault()) {
- if (!attr.isEmpty())
- attr += QLatin1Char(' ');
- attr += "default";
+ if (qpgn->childNodes().size() == 1) {
+ qpn = static_cast<QmlPropertyNode*>(*p);
+ startQmlProperty(qpn,relative,marker);
+ writeQmlDesc(node, marker);
+ writeEndTag(); // </qmlPropertyDetail>
+ writeEndTag(); // </qmlProperty>
+ }
+ else {
+ writeStartTag(DT_qmlPropertyGroup);
+ QString id = "id-qml-propertygroup-" + node->name();
+ id.replace('.','-');
+ xmlWriter().writeAttribute("id",id);
+ writeStartTag(DT_apiName);
+ //writeCharacters("...");
+ writeEndTag(); // </apiName>
+ writeStartTag(DT_qmlPropertyGroupDetail);
+ writeQmlDesc(node, marker);
+ writeEndTag(); // </qmlPropertyGroupDetail>
+ while (p != qpgn->childNodes().end()) {
+ if ((*p)->type() == Node::QmlProperty) {
+ qpn = static_cast<QmlPropertyNode*>(*p);
+ startQmlProperty(qpn,relative,marker);
+ writeEndTag(); // </qmlPropertyDetail>
+ writeEndTag(); // </qmlProperty>
}
- if (!attr.isEmpty())
- xmlWriter().writeAttribute("outputclass",attr);
- generateQmlItem(qpn, relative, marker, false);
- writeEndTag(); // </li>
+ ++p;
}
- ++p;
+ writeEndTag(); // </qmlPropertyGroup
}
- writeEndTag(); // </ul>
}
else if (node->type() == Node::QmlProperty) {
qpn = static_cast<QmlPropertyNode*>(node);
- /*
- If the QML property node has a single subproperty,
- override, replace qpn with that override node and
- proceed as normal.
- */
- if (qpn->qmlPropNodes().size() == 1) {
+ if (qpn->qmlPropNodes().isEmpty()) {
+ startQmlProperty(qpn,relative,marker);
+ writeQmlDesc(node, marker);
+ writeEndTag(); // </qmlPropertyDetail>
+ writeEndTag(); // </qmlProperty>
+ }
+ else if (qpn->qmlPropNodes().size() == 1) {
Node* n = qpn->qmlPropNodes().at(0);
- if (n->type() == Node::QmlProperty)
+ if (n->type() == Node::QmlProperty) {
qpn = static_cast<QmlPropertyNode*>(n);
- }
- /*
- Now qpn either has no overrides, or it has more
- than 1. If it has none, proceed to output as nortmal.
- */
- if (qpn->qmlPropNodes().isEmpty()) {
- writeStartTag(DT_ul);
- writeStartTag(DT_li);
- writeGuidAttribute((Node*)qpn);
- QString attr;
- if (!qpn->isReadOnlySet()) {
- if (qpn->declarativeCppNode())
- qpn->setReadOnly(!qpn->isWritable(tree_));
- }
- if (qpn->isReadOnly())
- attr = "read-only";
- if (qpn->isDefault()) {
- if (!attr.isEmpty())
- attr += QLatin1Char(' ');
- attr += "default";
- }
- if (!attr.isEmpty())
- xmlWriter().writeAttribute("outputclass",attr);
- generateQmlItem(qpn, relative, marker, false);
- writeEndTag(); // </li>
- writeEndTag(); // </ul>
+ startQmlProperty(qpn,relative,marker);
+ writeQmlDesc(node, marker);
+ writeEndTag(); // </qmlPropertyDetail>
+ writeEndTag(); // </qmlProperty>
+ }
}
else {
/*
@@ -4507,68 +4544,99 @@ void DitaXmlGenerator::generateDetailedQmlMember(Node* node,
Process the whole list as we would for a QML property
group.
*/
+ writeStartTag(DT_qmlPropertyGroup);
+ QString id = "id-qml-propertygroup-" + node->name();
+ id.replace('.','-');
+ xmlWriter().writeAttribute("id",id);
+ writeStartTag(DT_apiName);
+ //writeCharacters("...");
+ writeEndTag(); // </apiName>
+ writeStartTag(DT_qmlPropertyGroupDetail);
+ writeQmlDesc(node, marker);
+ writeEndTag(); // </qmlPropertyGroupDetail>
NodeList::ConstIterator p = qpn->qmlPropNodes().begin();
- writeStartTag(DT_ul);
while (p != qpn->qmlPropNodes().end()) {
if ((*p)->type() == Node::QmlProperty) {
QmlPropertyNode* q = static_cast<QmlPropertyNode*>(*p);
- writeStartTag(DT_li);
- writeGuidAttribute((Node*)q);
- QString attr;
- if (!qpn->isReadOnlySet())
- qpn->setReadOnly(!qpn->isWritable(tree_));
- if (qpn->isReadOnly())
- attr = "read-only";
- if (qpn->isDefault()) {
- if (!attr.isEmpty())
- attr += QLatin1Char(' ');
- attr += "default";
- }
- if (!attr.isEmpty())
- xmlWriter().writeAttribute("outputclass",attr);
- generateQmlItem(q, relative, marker, false);
- writeEndTag(); // </li>
+ startQmlProperty(q,relative,marker);
+ writeEndTag(); // </qmlPropertyDetail>
+ writeEndTag(); // </qmlProperty>
}
++p;
}
- writeEndTag(); // </ul>
+ writeEndTag(); // </qmlPropertyGroup
}
}
- else if (node->type() == Node::QmlSignal) {
- Node* n = const_cast<Node*>(node);
- writeStartTag(DT_ul);
- writeStartTag(DT_li);
- writeGuidAttribute(n);
- marked = getMarkedUpSynopsis(n, relative, marker, CodeMarker::Detailed);
- writeText(marked, marker, relative);
- writeEndTag(); // </li>
- writeEndTag(); // </ul>
- }
- else if (node->type() == Node::QmlSignalHandler) {
- Node* n = const_cast<Node*>(node);
- writeStartTag(DT_ul);
- writeStartTag(DT_li);
- writeGuidAttribute(n);
- marked = getMarkedUpSynopsis(n, relative, marker, CodeMarker::Detailed);
- writeText(marked, marker, relative);
- writeEndTag(); // </li>
- writeEndTag(); // </ul>
- }
- else if (node->type() == Node::QmlMethod) {
- Node* n = const_cast<Node*>(node);
- writeStartTag(DT_ul);
- writeStartTag(DT_li);
- writeGuidAttribute(n);
- marked = getMarkedUpSynopsis(n, relative, marker, CodeMarker::Detailed);
- writeText(marked, marker, relative);
- writeEndTag(); // </li>
- writeEndTag(); // </ul>
- }
+ else if (node->type() == Node::QmlSignal)
+ writeQmlRef(DT_qmlSignal,node,relative,marker);
+ else if (node->type() == Node::QmlSignalHandler)
+ writeQmlRef(DT_qmlSignalHandler,node,relative,marker);
+ else if (node->type() == Node::QmlMethod)
+ writeQmlRef(DT_qmlMethod,node,relative,marker);
+}
+
+/*!
+ Outputs the DITA detailed documentation for a section
+ on a QML element reference page.
+ */
+void DitaXmlGenerator::writeQmlRef(DitaTag tag,
+ Node* node,
+ const InnerNode* relative,
+ CodeMarker* marker)
+{
+ writeStartTag(tag);
+ Node* n = const_cast<Node*>(node);
+ writeGuidAttribute(n);
+ writeStartTag(DT_apiName);
+ writeCharacters(n->name());
+ writeEndTag(); // </apiName>
+ writeStartTag((DitaTag)((int)tag+2));
+ writeStartTag((DitaTag)((int)tag+1));
+ writeStartTag(DT_apiData);
+ QString marked = getMarkedUpSynopsis(n, relative, marker, CodeMarker::Detailed);
+ writeText(marked, marker, relative);
+ writeEndTag(); // </apiData>
+ if (node->isAttached()) {
+ writeStartTag(DT_qmlAttached);
+ xmlWriter().writeAttribute("name","attached");
+ xmlWriter().writeAttribute("value","yes");
+ writeEndTag(); // </qmlAttached>
+ }
+ writeEndTag(); // </qmlXxxDef>
+ writeQmlDesc(node, marker);
+ writeEndTag(); // </qmlXxxDetail>
+ writeEndTag(); // tag
+}
+
+/*!
+ Writes the <apiDesc> tag and its contents for the \a node.
+ The \a marker is used for markeing up the text body.
+ */
+void DitaXmlGenerator::writeQmlDesc(Node* node, CodeMarker* marker)
+{
+ writeStartTag(DT_apiDesc);
generateStatus(node, marker);
generateBody(node, marker);
generateThreadSafeness(node, marker);
generateSince(node, marker);
generateAlsoList(node, marker);
+ writeEndTag(); // </apiDesc>
+}
+
+/*!
+ This generates a <qmlTypeDef> in which the
+ QML module name and version number are specified.
+ */
+void DitaXmlGenerator::generateQmlModuleDef(QmlClassNode* qcn)
+{
+ writeStartTag(DT_qmlImportModule);
+ writeStartTag(DT_apiItemName);
+ writeCharacters(qcn->qmlModuleName());
+ writeEndTag(); // </apiItemName>
+ writeStartTag(DT_apiData);
+ writeCharacters(qcn->qmlModuleVersion());
+ writeEndTag(); // </apiData>
+ writeEndTag(); // </qmlImportModule>
}
/*!
@@ -4581,17 +4649,42 @@ void DitaXmlGenerator::generateQmlInherits(const QmlClassNode* qcn, CodeMarker*
return;
const FakeNode* base = qcn->qmlBase();
if (base) {
- writeStartTag(DT_p);
- xmlWriter().writeAttribute("outputclass","inherits");
+ writeStartTag(DT_qmlInherits);
+ //writeStartTag(DT_qmlTypeDef);
+ //xmlWriter().writeAttribute("outputclass","inherits");
+ writeStartTag(DT_apiData);
Text text;
- text << "[Inherits ";
text << Atom(Atom::LinkNode,CodeMarker::stringForNode(base));
text << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK);
text << Atom(Atom::String, base->name());
text << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK);
- text << "]";
generateText(text, qcn, marker);
- writeEndTag(); // </p>
+ writeEndTag(); // </apiData>
+ writeEndTag(); // </qmlInherits>
+ }
+}
+
+/*!
+ Output the "Inherit by" list for the QML element,
+ if it is inherited by any other elements.
+ */
+void DitaXmlGenerator::generateQmlInheritedBy(const QmlClassNode* qcn, CodeMarker* marker)
+{
+ if (qcn) {
+ NodeList subs;
+ QmlClassNode::subclasses(qcn->name(),subs);
+ if (!subs.isEmpty()) {
+ writeStartTag(DT_qmlInheritedBy);
+ //writeStartTag(DT_qmlTypeDef);
+ //xmlWriter().writeAttribute("outputclass","inherited-by");
+ writeStartTag(DT_apiData);
+ Text text;
+ appendSortedQmlNames(text,qcn,subs,marker);
+ text << Atom::ParaRight;
+ generateText(text, qcn, marker);
+ writeEndTag(); // </apiData>
+ writeEndTag(); // </qmlIneritedBy>
+ }
}
}
@@ -4606,22 +4699,39 @@ void DitaXmlGenerator::generateQmlInstantiates(QmlClassNode* qcn, CodeMarker* ma
{
ClassNode* cn = qcn->classNode();
if (cn && (cn->status() != Node::Internal)) {
- writeStartTag(DT_p);
- xmlWriter().writeAttribute("outputclass","instantiates");
+ writeStartTag(DT_qmlInstantiates);
+ //writeStartTag(DT_qmlTypeDef);
+ //xmlWriter().writeAttribute("outputclass","instantiates");
+ writeStartTag(DT_apiData);
Text text;
- text << "[";
- text << Atom(Atom::LinkNode,CodeMarker::stringForNode(qcn));
- text << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK);
- text << Atom(Atom::String, qcn->name());
- text << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK);
- text << " instantiates the C++ class ";
text << Atom(Atom::LinkNode,CodeMarker::stringForNode(cn));
text << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK);
text << Atom(Atom::String, cn->name());
text << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK);
- text << "]";
generateText(text, qcn, marker);
- writeEndTag(); // </p>
+ writeEndTag(); // </apiData>
+ writeEndTag(); // </qmlInstantiates>
+ }
+}
+
+/*!
+ Generate a <qmlXxxDef> for the "since" version string, if there is one.
+ */
+void DitaXmlGenerator::generateQmlSince(const Node* node)
+{
+ if (!node->since().isEmpty()) {
+ writeStartTag(DT_qmlSince);
+ //writeStartTag(DT_qmlTypeDef);
+ //xmlWriter().writeAttribute("outputclass","since");
+ writeStartTag(DT_apiItemName);
+ QStringList pieces = node->since().split(QLatin1Char(' '));
+ writeCharacters(pieces[0]);
+ writeEndTag(); // </apiItemName>
+ writeStartTag(DT_apiData);
+ if (pieces.size() > 1)
+ writeCharacters(pieces[1]);
+ writeEndTag(); // </apiData>
+ writeEndTag(); // </qmlSince>
}
}
@@ -5589,7 +5699,7 @@ void DitaXmlGenerator::writeApiDesc(const Node* node,
{
if (!node->doc().isEmpty()) {
inDetailedDescription = true;
- enterApiDesc(QString(),title);
+ enterDesc(DT_apiDesc,QString(),title);
generateBody(node, marker);
generateAlsoList(node, marker);
leaveSection();
@@ -5690,7 +5800,7 @@ DitaXmlGenerator::generateInnerNode(InnerNode* node)
}
/*!
- Returns true if \a format is "XML" or "HTML" .
+ Returns true if \a format is "DITAXML" or "HTML" .
*/
bool DitaXmlGenerator::canHandleFormat(const QString& format)
{
@@ -6048,23 +6158,32 @@ void DitaXmlGenerator::writeTopicrefs(NodeMultiMap* nmm, const QString& navtitle
xmlWriter().writeAttribute("navtitle",i.key());
xmlWriter().writeAttribute("href",fileName(i.value()));
switch (i.value()->type()) {
- case Node::Class: {
- const NamespaceNode* nn = static_cast<const NamespaceNode*>(i.value());
- const NodeList& c = nn->childNodes();
- for (int j=0; j<c.size(); ++j) {
- if (c[j]->isInternal() || c[j]->access() == Node::Private || c[j]->doc().isEmpty())
- continue;
- if (c[j]->type() == Node::Class) {
+ case Node::Class:
+ case Node::Namespace: {
+ const NamespaceNode* nn = static_cast<const NamespaceNode*>(i.value());
+ const NodeList& c = nn->childNodes();
+ QMap<QString, const Node*> tempMap;
+ for (int j=0; j<c.size(); ++j) {
+ if (c[j]->isInternal() || c[j]->access() == Node::Private || c[j]->doc().isEmpty())
+ continue;
+ if (c[j]->type() == Node::Class) {
+ tempMap.insert(c[j]->name(), c[j]);
+ }
+ }
+ QMap<QString, const Node*>::iterator classIterator = tempMap.begin();
+ while (classIterator != tempMap.end()) {
+ const Node* currentNode = static_cast<const Node*>(classIterator.value());
writeStartTag(DT_topicref);
- xmlWriter().writeAttribute("navtitle",c[j]->name());
- xmlWriter().writeAttribute("href",fileName(c[j]));
+ xmlWriter().writeAttribute("navtitle",currentNode->name());
+ xmlWriter().writeAttribute("href",fileName(currentNode));
writeEndTag(); // </topicref>
+ ++classIterator;
}
+
+ break;
}
- break;
- }
- default:
- break;
+ default:
+ break;
}
writeEndTag(); // </topicref>
++i;
diff --git a/src/tools/qdoc/ditaxmlgenerator.h b/src/tools/qdoc/ditaxmlgenerator.h
index 6ce42fc0b1..538a667849 100644
--- a/src/tools/qdoc/ditaxmlgenerator.h
+++ b/src/tools/qdoc/ditaxmlgenerator.h
@@ -79,9 +79,15 @@ public:
enum DitaTag {
DT_NONE,
DT_alt,
+ DT_apiData,
+ DT_apiDef,
+ DT_apiDefItem,
DT_apiDesc,
+ DT_apiDetail,
+ DT_apiItemName,
DT_APIMap,
DT_apiName,
+ DT_apiRef,
DT_apiRelation,
DT_audience,
DT_author,
@@ -224,6 +230,34 @@ public:
DT_prodname,
DT_prolog,
DT_publisher,
+ DT_qmlAttached,
+ DT_qmlDetail,
+ DT_qmlImportModule,
+ DT_qmlInheritedBy,
+ DT_qmlInherits,
+ DT_qmlInstantiates,
+ DT_qmlMethod,
+ DT_qmlMethodDef,
+ DT_qmlMethodDetail,
+ DT_qmlName,
+ DT_qmlProperty,
+ DT_qmlPropertyDef,
+ DT_qmlPropertyDetail,
+ DT_qmlPropertyGroup,
+ DT_qmlPropertyGroupDef,
+ DT_qmlPropertyGroupDetail,
+ DT_qmlQualifier,
+ DT_qmlSignal,
+ DT_qmlSignalDef,
+ DT_qmlSignalDetail,
+ DT_qmlSignalHandler,
+ DT_qmlSignalHandlerDEf,
+ DT_qmlSignalHandlerDetail,
+ DT_qmlSignature,
+ DT_qmlSince,
+ DT_qmlType,
+ DT_qmlTypeDef,
+ DT_qmlTypeDetail,
DT_relatedLinks,
DT_resourceid,
DT_revised,
@@ -281,7 +315,7 @@ protected:
CodeMarker* marker);
virtual void generateClassLikeNode(InnerNode* inner, CodeMarker* marker);
virtual void generateFakeNode(FakeNode* fake, CodeMarker* marker);
- virtual QString fileExtension(const Node* node) const;
+ virtual QString fileExtension() const;
virtual QString guidForNode(const Node* node);
virtual QString linkForNode(const Node* node, const Node* relative);
virtual QString refForAtom(Atom* atom, const Node* node);
@@ -377,12 +411,23 @@ private:
const Node* relative,
CodeMarker* marker,
bool summary);
+ void startQmlProperty(QmlPropertyNode* qpn,
+ const InnerNode* relative,
+ CodeMarker* marker);
+ void writeQmlRef(DitaTag tag,
+ Node* node,
+ const InnerNode* relative,
+ CodeMarker* marker);
+ void writeQmlDesc(Node* node, CodeMarker* marker);
void generateDetailedQmlMember(Node* node,
const InnerNode* relative,
CodeMarker* marker);
void generateQmlInherits(const QmlClassNode* qcn, CodeMarker* marker);
+ void generateQmlInheritedBy(const QmlClassNode* qcn, CodeMarker* marker);
void generateQmlInstantiates(QmlClassNode* qcn, CodeMarker* marker);
void generateInstantiatedBy(ClassNode* cn, CodeMarker* marker);
+ void generateQmlModuleDef(QmlClassNode* qcn);
+ void generateQmlSince(const Node* node);
void generateSection(const NodeList& nl,
const Node* relative,
@@ -446,7 +491,7 @@ private:
bool writeEndTag(DitaTag t=DT_NONE);
DitaTag currentTag();
void clearSectionNesting() { sectionNestingLevel = 0; }
- int enterApiDesc(const QString& outputclass, const QString& title);
+ int enterDesc(DitaTag tag, const QString& outputclass, const QString& title);
int enterSection(const QString& outputclass, const QString& title);
int leaveSection();
bool inSection() const { return (sectionNestingLevel > 0); }
diff --git a/src/tools/qdoc/generator.cpp b/src/tools/qdoc/generator.cpp
index 4258bc69d0..fb08c7e609 100644
--- a/src/tools/qdoc/generator.cpp
+++ b/src/tools/qdoc/generator.cpp
@@ -60,6 +60,7 @@
QT_BEGIN_NAMESPACE
QString Generator::baseDir_;
+Generator* Generator::currentGenerator_;
QStringList Generator::exampleDirs;
QStringList Generator::exampleImgExts;
QMap<QString, QMap<QString, QString> > Generator::fmtLeftMaps;
@@ -346,7 +347,7 @@ QString Generator::fileName(const Node* node) const
QString name = fileBase(node);
name += QLatin1Char('.');
- name += fileExtension(node);
+ name += fileExtension();
return name;
}
@@ -447,6 +448,173 @@ QMap<QString, QString>& Generator::formattingRightMap()
return fmtRightMaps[format()];
}
+/*!
+ Returns the full document location.
+ */
+QString Generator::fullDocumentLocation(const Node *node, bool subdir)
+{
+ if (!node)
+ return "";
+ if (!node->url().isEmpty())
+ return node->url();
+
+ QString parentName;
+ QString anchorRef;
+ QString fdl = "";
+
+ /*
+ If the output is being sent to subdirectories of the
+ output directory, and if the subdir parameter is set,
+ prepend the subdirectory name + '/' to the result.
+ */
+ if (subdir) {
+ fdl = node->outputSubdirectory();
+ if (!fdl.isEmpty())
+ fdl.append(QLatin1Char('/'));
+ }
+ if (node->type() == Node::Namespace) {
+
+ // The root namespace has no name - check for this before creating
+ // an attribute containing the location of any documentation.
+
+ if (!node->fileBase().isEmpty())
+ parentName = node->fileBase() + "." + currentGenerator()->fileExtension();
+ else
+ return "";
+ }
+ else if (node->type() == Node::Fake) {
+ if ((node->subType() == Node::QmlClass) ||
+ (node->subType() == Node::QmlBasicType)) {
+ QString fb = node->fileBase();
+ if (fb.startsWith(Generator::outputPrefix(QLatin1String("QML"))))
+ return fb + "." + currentGenerator()->fileExtension();
+ else {
+ QString mq = "";
+ if (!node->qmlModuleName().isEmpty()) {
+ mq = node->qmlModuleIdentifier().replace(QChar('.'),QChar('-'));
+ mq = mq.toLower() + "-";
+ }
+ return fdl+ Generator::outputPrefix(QLatin1String("QML")) + mq +
+ node->fileBase() + "." + currentGenerator()->fileExtension();
+ }
+ }
+ else
+ parentName = node->fileBase() + "." + currentGenerator()->fileExtension();
+ }
+ else if (node->fileBase().isEmpty())
+ return "";
+
+ Node *parentNode = 0;
+
+ if ((parentNode = node->relates())) {
+ parentName = fullDocumentLocation(node->relates());
+ }
+ else if ((parentNode = node->parent())) {
+ if (parentNode->subType() == Node::QmlPropertyGroup) {
+ parentNode = parentNode->parent();
+ parentName = fullDocumentLocation(parentNode);
+ }
+ else
+ parentName = fullDocumentLocation(node->parent());
+ }
+
+ switch (node->type()) {
+ case Node::Class:
+ case Node::Namespace:
+ if (parentNode && !parentNode->name().isEmpty()) {
+ parentName.remove("." + currentGenerator()->fileExtension());
+ parentName += QLatin1Char('-')
+ + node->fileBase().toLower() + "." + currentGenerator()->fileExtension();
+ } else {
+ parentName = node->fileBase() + "." + currentGenerator()->fileExtension();
+ }
+ break;
+ case Node::Function:
+ {
+ /*
+ Functions can be destructors, overloaded, or
+ have associated properties.
+ */
+ const FunctionNode *functionNode =
+ static_cast<const FunctionNode *>(node);
+
+ if (functionNode->metaness() == FunctionNode::Dtor)
+ anchorRef = "#dtor." + functionNode->name().mid(1);
+
+ else if (functionNode->associatedProperty())
+ return fullDocumentLocation(functionNode->associatedProperty());
+
+ else if (functionNode->overloadNumber() > 1)
+ anchorRef = QLatin1Char('#') + functionNode->name()
+ + "-" + QString::number(functionNode->overloadNumber());
+ else
+ anchorRef = QLatin1Char('#') + functionNode->name();
+ }
+
+ /*
+ Use node->name() instead of node->fileBase() as
+ the latter returns the name in lower-case. For
+ HTML anchors, we need to preserve the case.
+ */
+ break;
+ case Node::Enum:
+ anchorRef = QLatin1Char('#') + node->name() + "-enum";
+ break;
+ case Node::Typedef:
+ anchorRef = QLatin1Char('#') + node->name() + "-typedef";
+ break;
+ case Node::Property:
+ anchorRef = QLatin1Char('#') + node->name() + "-prop";
+ break;
+ case Node::QmlProperty:
+ anchorRef = QLatin1Char('#') + node->name() + "-prop";
+ break;
+ case Node::QmlSignal:
+ anchorRef = QLatin1Char('#') + node->name() + "-signal";
+ break;
+ case Node::QmlSignalHandler:
+ anchorRef = QLatin1Char('#') + node->name() + "-signal-handler";
+ break;
+ case Node::QmlMethod:
+ anchorRef = QLatin1Char('#') + node->name() + "-method";
+ break;
+ case Node::Variable:
+ anchorRef = QLatin1Char('#') + node->name() + "-var";
+ break;
+ case Node::Fake:
+ {
+ /*
+ Use node->fileBase() for fake nodes because they are represented
+ by pages whose file names are lower-case.
+ */
+ parentName = node->fileBase();
+ parentName.replace(QLatin1Char('/'), "-").replace(".", "-");
+ parentName += "." + currentGenerator()->fileExtension();
+ }
+ break;
+ default:
+ break;
+ }
+
+ // Various objects can be compat (deprecated) or obsolete.
+ if (node->type() != Node::Class && node->type() != Node::Namespace) {
+ switch (node->status()) {
+ case Node::Compat:
+ parentName.replace("." + currentGenerator()->fileExtension(),
+ "-compat." + currentGenerator()->fileExtension());
+ break;
+ case Node::Obsolete:
+ parentName.replace("." + currentGenerator()->fileExtension(),
+ "-obsolete." + currentGenerator()->fileExtension());
+ break;
+ default:
+ ;
+ }
+ }
+
+ return fdl + parentName.toLower() + anchorRef;
+}
+
QString Generator::fullName(const Node *node,
const Node *relative,
CodeMarker *marker) const
@@ -785,8 +953,7 @@ void Generator::generateFileList(const FakeNode* fake,
generateText(text, fake, marker);
}
-void Generator::generateInheritedBy(const ClassNode *classe,
- CodeMarker *marker)
+void Generator::generateInheritedBy(const ClassNode *classe, CodeMarker *marker)
{
if (!classe->derivedClasses().isEmpty()) {
Text text;
@@ -919,7 +1086,6 @@ void Generator::generateMaintainerList(const InnerNode* node, CodeMarker* marker
}
}
-#ifdef QDOC_QML
/*!
Output the "Inherit by" list for the QML element,
if it is inherited by any other elements.
@@ -939,18 +1105,14 @@ void Generator::generateQmlInheritedBy(const QmlClassNode* qcn,
}
}
}
-#endif
-#ifdef QDOC_QML
/*!
*/
void Generator::generateQmlInherits(const QmlClassNode* , CodeMarker* )
{
// stub.
}
-#endif
-#ifdef QDOC_QML
/*!
Extract sections of markup text surrounded by \e qmltext
and \e endqmltext and output them.
@@ -982,7 +1144,6 @@ bool Generator::generateQmlText(const Text& text,
}
return result;
}
-#endif
void Generator::generateReimplementedFrom(const FunctionNode *func,
CodeMarker *marker)
@@ -1449,6 +1610,7 @@ void Generator::initialize(const Config &config)
QList<Generator *>::ConstIterator g = generators.begin();
while (g != generators.end()) {
if (outputFormats.contains((*g)->format())) {
+ currentGenerator_ = (*g);
(*g)->initializeGenerator(config);
QStringList extraImages =
config.getCleanPathList(CONFIG_EXTRAIMAGES+Config::dot+(*g)->format());
diff --git a/src/tools/qdoc/generator.h b/src/tools/qdoc/generator.h
index c97e59602d..59df66b4a7 100644
--- a/src/tools/qdoc/generator.h
+++ b/src/tools/qdoc/generator.h
@@ -90,6 +90,8 @@ public:
virtual void terminateGenerator();
static const QString& baseDir() { return baseDir_; }
+ static Generator *currentGenerator() { return currentGenerator_; }
+ static QString fullDocumentLocation(const Node *node, bool subdir = false);
static Generator *generatorForFormat(const QString& format);
static void initialize(const Config& config);
static const QString& outputDir() { return outDir_; }
@@ -100,7 +102,7 @@ protected:
virtual void endSubPage();
virtual void endText(const Node *relative, CodeMarker *marker);
virtual QString fileBase(const Node* node) const;
- virtual QString fileExtension(const Node* node) const = 0;
+ virtual QString fileExtension() const = 0;
virtual QString fullName(const Node *node,
const Node *relative,
CodeMarker *marker) const;
@@ -171,6 +173,10 @@ protected:
QString plainCode(const QString& markedCode);
void setImageFileExtensions(const QStringList& extensions);
void unknownAtom(const Atom *atom);
+ void appendSortedQmlNames(Text& text,
+ const Node* base,
+ const NodeList& subs,
+ CodeMarker *marker);
QList<NameCollisionNode*> collisionNodes;
QMap<QString, QStringList> editionGroupMap;
@@ -185,6 +191,7 @@ protected:
private:
static QString baseDir_;
+ static Generator* currentGenerator_;
static QStringList exampleDirs;
static QStringList exampleImgExts;
static QMap<QString, QMap<QString, QString> > fmtLeftMaps;
@@ -219,10 +226,6 @@ private:
const ClassNode *classe,
const QList<RelatedClass> &classes,
CodeMarker *marker);
- void appendSortedQmlNames(Text& text,
- const Node* base,
- const NodeList& subs,
- CodeMarker *marker);
void generateReimplementedFrom(const FunctionNode *func,
CodeMarker *marker);
diff --git a/src/tools/qdoc/helpprojectwriter.cpp b/src/tools/qdoc/helpprojectwriter.cpp
index da2a43d7e8..590feba166 100644
--- a/src/tools/qdoc/helpprojectwriter.cpp
+++ b/src/tools/qdoc/helpprojectwriter.cpp
@@ -211,7 +211,7 @@ QStringList HelpProjectWriter::keywordDetails(const Node *node) const
details << node->name();
details << node->name();
}
- details << HtmlGenerator::fullDocumentLocation(node,true);
+ details << Generator::fullDocumentLocation(node,true);
return details;
}
@@ -271,12 +271,12 @@ bool HelpProjectWriter::generateSection(HelpProject &project,
case Node::Class:
project.keywords.append(keywordDetails(node));
- project.files.insert(HtmlGenerator::fullDocumentLocation(node,true));
+ project.files.insert(Generator::fullDocumentLocation(node,true));
break;
case Node::Namespace:
project.keywords.append(keywordDetails(node));
- project.files.insert(HtmlGenerator::fullDocumentLocation(node,true));
+ project.files.insert(Generator::fullDocumentLocation(node,true));
break;
case Node::Enum:
@@ -296,7 +296,7 @@ bool HelpProjectWriter::generateSection(HelpProject &project,
details << item.name(); // "name"
details << item.name(); // "id"
}
- details << HtmlGenerator::fullDocumentLocation(node,true);
+ details << Generator::fullDocumentLocation(node,true);
project.keywords.append(details);
}
}
@@ -328,7 +328,7 @@ bool HelpProjectWriter::generateSection(HelpProject &project,
if (node->relates()) {
project.memberStatus[node->relates()].insert(node->status());
- project.files.insert(HtmlGenerator::fullDocumentLocation(node->relates(),true));
+ project.files.insert(Generator::fullDocumentLocation(node->relates(),true));
} else if (node->parent())
project.memberStatus[node->parent()].insert(node->status());
}
@@ -342,7 +342,7 @@ bool HelpProjectWriter::generateSection(HelpProject &project,
// Use the location of any associated enum node in preference
// to that of the typedef.
if (enumNode)
- typedefDetails[2] = HtmlGenerator::fullDocumentLocation(enumNode,true);
+ typedefDetails[2] = Generator::fullDocumentLocation(enumNode,true);
project.keywords.append(typedefDetails);
}
@@ -350,7 +350,7 @@ bool HelpProjectWriter::generateSection(HelpProject &project,
case Node::Variable:
{
- QString location = HtmlGenerator::fullDocumentLocation(node,true);
+ QString location = Generator::fullDocumentLocation(node,true);
project.files.insert(location.left(location.lastIndexOf(QLatin1Char('#'))));
project.keywords.append(keywordDetails(node));
}
@@ -370,12 +370,12 @@ bool HelpProjectWriter::generateSection(HelpProject &project,
QStringList details;
details << keyword->string()
<< keyword->string()
- << HtmlGenerator::fullDocumentLocation(node,true) +
+ << Generator::fullDocumentLocation(node,true) +
QLatin1Char('#') + Doc::canonicalTitle(keyword->string());
project.keywords.append(details);
} else
fakeNode->doc().location().warning(
- tr("Bad keyword in %1").arg(HtmlGenerator::fullDocumentLocation(node,true))
+ tr("Bad keyword in %1").arg(Generator::fullDocumentLocation(node,true))
);
}
}
@@ -398,7 +398,7 @@ bool HelpProjectWriter::generateSection(HelpProject &project,
}
}
*/
- project.files.insert(HtmlGenerator::fullDocumentLocation(node,true));
+ project.files.insert(Generator::fullDocumentLocation(node,true));
}
break;
}
@@ -477,7 +477,7 @@ void HelpProjectWriter::generate(const Tree *tre)
void HelpProjectWriter::writeNode(HelpProject &project, QXmlStreamWriter &writer,
const Node *node)
{
- QString href = HtmlGenerator::fullDocumentLocation(node,true);
+ QString href = Generator::fullDocumentLocation(node,true);
QString objName = node->name();
switch (node->type()) {
@@ -625,12 +625,12 @@ void HelpProjectWriter::generateProject(HelpProject &project)
node = tree->findNode(QStringList("index.html"));
QString indexPath;
if (node)
- indexPath = HtmlGenerator::fullDocumentLocation(node,true);
+ indexPath = Generator::fullDocumentLocation(node,true);
else
indexPath = "index.html";
writer.writeAttribute("ref", indexPath);
writer.writeAttribute("title", project.indexTitle);
- project.files.insert(HtmlGenerator::fullDocumentLocation(rootNode));
+ project.files.insert(Generator::fullDocumentLocation(rootNode));
generateSections(project, writer, rootNode);
@@ -668,7 +668,7 @@ void HelpProjectWriter::generateProject(HelpProject &project)
const FakeNode *page = tree->findFakeNodeByTitle(atom->string());
writer.writeStartElement("section");
- QString indexPath = HtmlGenerator::fullDocumentLocation(page,true);
+ QString indexPath = Generator::fullDocumentLocation(page,true);
writer.writeAttribute("ref", indexPath);
writer.writeAttribute("title", atom->string());
project.files.insert(indexPath);
@@ -693,7 +693,7 @@ void HelpProjectWriter::generateProject(HelpProject &project)
if (!name.isEmpty()) {
writer.writeStartElement("section");
- QString indexPath = HtmlGenerator::fullDocumentLocation(tree->findFakeNodeByTitle(subproject.indexTitle),true);
+ QString indexPath = Generator::fullDocumentLocation(tree->findFakeNodeByTitle(subproject.indexTitle),true);
writer.writeAttribute("ref", indexPath);
writer.writeAttribute("title", subproject.title);
project.files.insert(indexPath);
diff --git a/src/tools/qdoc/htmlgenerator.cpp b/src/tools/qdoc/htmlgenerator.cpp
index 24dd31e0b5..806be0a3c6 100644
--- a/src/tools/qdoc/htmlgenerator.cpp
+++ b/src/tools/qdoc/htmlgenerator.cpp
@@ -1690,7 +1690,7 @@ void HtmlGenerator::generateFakeNode(FakeNode* fake, CodeMarker* marker)
/*!
Returns "html" for this subclass of Generator.
*/
-QString HtmlGenerator::fileExtension(const Node * /* node */) const
+QString HtmlGenerator::fileExtension() const
{
return "html";
}
@@ -1876,12 +1876,12 @@ void HtmlGenerator::generateHeader(const QString& title,
out() << " <link rel=\"prev\" href=\""
<< anchorPair.first << "\" />\n";
- navigationLinks += "[Previous: <a href=\"" + anchorPair.first + "\">";
+ navigationLinks += "<a class=\"prevPage\" href=\"" + anchorPair.first + "\">";
if (linkPair.first == linkPair.second && !anchorPair.second.isEmpty())
navigationLinks += protect(anchorPair.second);
else
navigationLinks += protect(linkPair.second);
- navigationLinks += "</a>]\n";
+ navigationLinks += "</a>\n";
}
if (node->links().contains(Node::NextLink)) {
linkPair = node->links()[Node::NextLink];
@@ -1894,12 +1894,12 @@ void HtmlGenerator::generateHeader(const QString& title,
out() << " <link rel=\"next\" href=\""
<< anchorPair.first << "\" />\n";
- navigationLinks += "[Next: <a href=\"" + anchorPair.first + "\">";
+ navigationLinks += "<a class=\"nextPage\" href=\"" + anchorPair.first + "\">";
if (linkPair.first == linkPair.second && !anchorPair.second.isEmpty())
navigationLinks += protect(anchorPair.second);
else
navigationLinks += protect(linkPair.second);
- navigationLinks += "</a>]\n";
+ navigationLinks += "</a>\n";
}
if (node->links().contains(Node::StartLink)) {
linkPair = node->links()[Node::StartLink];
@@ -2110,7 +2110,7 @@ QString HtmlGenerator::generateListOfAllMemberFile(const InnerNode *inner,
if (sections.isEmpty())
return QString();
- QString fileName = fileBase(inner) + "-members." + fileExtension(inner);
+ QString fileName = fileBase(inner) + "-members." + fileExtension();
beginSubPage(inner, fileName);
QString title = "List of All Members for " + inner->name();
generateHeader(title, inner, marker);
@@ -2142,7 +2142,7 @@ QString HtmlGenerator::generateAllQmlMembersFile(const QmlClassNode* qml_cn,
if (sections.isEmpty())
return QString();
- QString fileName = fileBase(qml_cn) + "-members." + fileExtension(qml_cn);
+ QString fileName = fileBase(qml_cn) + "-members." + fileExtension();
beginSubPage(qml_cn, fileName);
QString title = "List of All Members for " + qml_cn->name();
generateHeader(title, qml_cn, marker);
@@ -2181,11 +2181,11 @@ QString HtmlGenerator::generateLowStatusMemberFile(const InnerNode *inner,
if (status == CodeMarker::Compat) {
title = "Compatibility Members for " + inner->name();
- fileName = fileBase(inner) + "-compat." + fileExtension(inner);
+ fileName = fileBase(inner) + "-compat." + fileExtension();
}
else {
title = "Obsolete Members for " + inner->name();
- fileName = fileBase(inner) + "-obsolete." + fileExtension(inner);
+ fileName = fileBase(inner) + "-obsolete." + fileExtension();
}
beginSubPage(inner, fileName);
@@ -4319,170 +4319,6 @@ void HtmlGenerator::generateExtractionMark(const Node *node, ExtractionMarkType
}
}
-/*!
- Returns the full document location for HTML-based documentation.
- */
-QString HtmlGenerator::fullDocumentLocation(const Node *node, bool subdir)
-{
- if (!node)
- return "";
- if (!node->url().isEmpty())
- return node->url();
-
- QString parentName;
- QString anchorRef;
- QString fdl = "";
-
- /*
- If the output is being sent to subdirectories of the
- output directory, and if the subdir parameter is set,
- prepend the subdirectory name + '/' to the result.
- */
- if (subdir) {
- fdl = node->outputSubdirectory();
- if (!fdl.isEmpty())
- fdl.append(QLatin1Char('/'));
- }
- if (node->type() == Node::Namespace) {
-
- // The root namespace has no name - check for this before creating
- // an attribute containing the location of any documentation.
-
- if (!node->fileBase().isEmpty())
- parentName = node->fileBase() + ".html";
- else
- return "";
- }
- else if (node->type() == Node::Fake) {
- if ((node->subType() == Node::QmlClass) ||
- (node->subType() == Node::QmlBasicType)) {
- QString fb = node->fileBase();
- if (fb.startsWith(Generator::outputPrefix(QLatin1String("QML"))))
- return fb + ".html";
- else {
- QString mq = "";
- if (!node->qmlModuleName().isEmpty()) {
- mq = node->qmlModuleIdentifier().replace(QChar('.'),QChar('-'));
- mq = mq.toLower() + "-";
- }
- return fdl+ Generator::outputPrefix(QLatin1String("QML")) + mq +
- node->fileBase() + QLatin1String(".html");
- }
- }
- else
- parentName = node->fileBase() + ".html";
- }
- else if (node->fileBase().isEmpty())
- return "";
-
- Node *parentNode = 0;
-
- if ((parentNode = node->relates())) {
- parentName = fullDocumentLocation(node->relates());
- }
- else if ((parentNode = node->parent())) {
- if (parentNode->subType() == Node::QmlPropertyGroup) {
- parentNode = parentNode->parent();
- parentName = fullDocumentLocation(parentNode);
- }
- else
- parentName = fullDocumentLocation(node->parent());
- }
-
- switch (node->type()) {
- case Node::Class:
- case Node::Namespace:
- if (parentNode && !parentNode->name().isEmpty()) {
- parentName.remove(".html");
- parentName += QLatin1Char('-')
- + node->fileBase().toLower() + ".html";
- } else {
- parentName = node->fileBase() + ".html";
- }
- break;
- case Node::Function:
- {
- /*
- Functions can be destructors, overloaded, or
- have associated properties.
- */
- const FunctionNode *functionNode =
- static_cast<const FunctionNode *>(node);
-
- if (functionNode->metaness() == FunctionNode::Dtor)
- anchorRef = "#dtor." + functionNode->name().mid(1);
-
- else if (functionNode->associatedProperty())
- return fullDocumentLocation(functionNode->associatedProperty());
-
- else if (functionNode->overloadNumber() > 1)
- anchorRef = QLatin1Char('#') + functionNode->name()
- + "-" + QString::number(functionNode->overloadNumber());
- else
- anchorRef = QLatin1Char('#') + functionNode->name();
- }
-
- /*
- Use node->name() instead of node->fileBase() as
- the latter returns the name in lower-case. For
- HTML anchors, we need to preserve the case.
- */
- break;
- case Node::Enum:
- anchorRef = QLatin1Char('#') + node->name() + "-enum";
- break;
- case Node::Typedef:
- anchorRef = QLatin1Char('#') + node->name() + "-typedef";
- break;
- case Node::Property:
- anchorRef = QLatin1Char('#') + node->name() + "-prop";
- break;
- case Node::QmlProperty:
- anchorRef = QLatin1Char('#') + node->name() + "-prop";
- break;
- case Node::QmlSignal:
- anchorRef = QLatin1Char('#') + node->name() + "-signal";
- break;
- case Node::QmlSignalHandler:
- anchorRef = QLatin1Char('#') + node->name() + "-signal-handler";
- break;
- case Node::QmlMethod:
- anchorRef = QLatin1Char('#') + node->name() + "-method";
- break;
- case Node::Variable:
- anchorRef = QLatin1Char('#') + node->name() + "-var";
- break;
- case Node::Fake:
- {
- /*
- Use node->fileBase() for fake nodes because they are represented
- by pages whose file names are lower-case.
- */
- parentName = node->fileBase();
- parentName.replace(QLatin1Char('/'), "-").replace(".", "-");
- parentName += ".html";
- }
- break;
- default:
- break;
- }
-
- // Various objects can be compat (deprecated) or obsolete.
- if (node->type() != Node::Class && node->type() != Node::Namespace) {
- switch (node->status()) {
- case Node::Compat:
- parentName.replace(".html", "-compat.html");
- break;
- case Node::Obsolete:
- parentName.replace(".html", "-obsolete.html");
- break;
- default:
- ;
- }
- }
-
- return fdl + parentName.toLower() + anchorRef;
-}
/*!
This function outputs one or more manifest files in XML.
diff --git a/src/tools/qdoc/htmlgenerator.h b/src/tools/qdoc/htmlgenerator.h
index 403c1f0899..a4e6c2f368 100644
--- a/src/tools/qdoc/htmlgenerator.h
+++ b/src/tools/qdoc/htmlgenerator.h
@@ -94,7 +94,6 @@ public:
static QString protect(const QString &string, const QString &encoding = "ISO-8859-1");
static QString cleanRef(const QString& ref);
static QString sinceTitle(int i) { return sinceTitles[i]; }
- static QString fullDocumentLocation(const Node *node, bool subdir = false);
protected:
virtual void startText(const Node *relative, CodeMarker *marker);
@@ -103,7 +102,7 @@ protected:
CodeMarker *marker);
virtual void generateClassLikeNode(InnerNode* inner, CodeMarker* marker);
virtual void generateFakeNode(FakeNode* fake, CodeMarker* marker);
- virtual QString fileExtension(const Node *node) const;
+ virtual QString fileExtension() const;
virtual QString refForNode(const Node *node);
virtual QString linkForNode(const Node *node, const Node *relative);
virtual QString refForAtom(Atom *atom, const Node *node);
diff --git a/src/tools/qdoc/main.cpp b/src/tools/qdoc/main.cpp
index f7985bd389..f230f92f06 100644
--- a/src/tools/qdoc/main.cpp
+++ b/src/tools/qdoc/main.cpp
@@ -64,6 +64,7 @@
#include "qmlcodeparser.h"
#endif
+#include <qdatetime.h>
#include <qdebug.h>
#include "qtranslator.h"
@@ -99,6 +100,7 @@ static bool highlighting = false;
static bool showInternal = false;
static bool obsoleteLinks = false;
static QStringList defines;
+static QStringList indexDirs;
static QHash<QString, Tree *> trees;
/*!
@@ -114,6 +116,10 @@ static void printHelp()
"Display this information and exit\n"
" -highlighting "
"Turn on syntax highlighting (makes qdoc run slower)\n"
+ " -indexdir "
+ "Specify a directory where QDoc should search for indices to link to\n"
+ " -installdir "
+ "Specify the directory where the output will be after running \"make install\"\n"
" -no-examples "
"Do not generate documentation for examples\n"
" -obsoletelinks "
@@ -245,6 +251,48 @@ static void processQdocconfFile(const QString &fileName)
Read some XML indexes containing definitions from other documentation sets.
*/
QStringList indexFiles = config.getStringList(CONFIG_INDEXES);
+
+ QStringList dependModules = config.getStringList(CONFIG_DEPENDS);
+
+ if (dependModules.size() > 0) {
+ if (indexDirs.size() > 0) {
+ for (int i = 0; i < dependModules.size(); i++) {
+ QMultiMap<uint, QFileInfo> foundIndices;
+ for (int j = 0; j < indexDirs.size(); j++) {
+ QString fileToLookFor = indexDirs[j] + "/" + dependModules[i] +
+ "/" + dependModules[i] + ".index";
+ if (QFile::exists(fileToLookFor)) {
+ QFileInfo tempFileInfo(fileToLookFor);
+ foundIndices.insert(tempFileInfo.lastModified().toTime_t(), tempFileInfo);
+ }
+ }
+ if (foundIndices.size() > 1) {
+ /*
+ QDoc should always use the last entry in the multimap when there are
+ multiple index files for a module, since the last modified file has the
+ highest UNIX timestamp.
+ */
+ qDebug() << "Multiple indices found for dependency:" << dependModules[i];
+ qDebug() << "Using" << foundIndices.value(
+ foundIndices.keys()[foundIndices.size() - 1]).absoluteFilePath()
+ << "as index for" << dependModules[i];
+ indexFiles << foundIndices.value(
+ foundIndices.keys()[foundIndices.size() - 1]).absoluteFilePath();
+ }
+ else if (foundIndices.size() == 1) {
+ indexFiles << foundIndices.value(foundIndices.keys()[0]).absoluteFilePath();
+ }
+ else {
+ qDebug() << "No indices for" << dependModules[i] <<
+ "could be found in the specified index directories.";
+ }
+ }
+ }
+ else {
+ qDebug() << "Dependant modules specified, but not index directories were set."
+ << "There will probably be errors for missing links.";
+ }
+ }
tree->readIndexes(indexFiles);
QSet<QString> excludedDirs;
@@ -432,6 +480,20 @@ int main(int argc, char **argv)
else if (opt == "-no-examples") {
Config::generateExamples = false;
}
+ else if (opt == "-indexdir") {
+ if (QFile::exists(argv[i])) {
+ indexDirs += argv[i];
+ }
+ else {
+ qDebug() << "Cannot find index directory" << argv[i];
+ return EXIT_FAILURE;
+ }
+ i++;
+ }
+ else if (opt == "-installdir") {
+ Config::installDir = argv[i];
+ i++;
+ }
else if (opt == "-obsoletelinks") {
obsoleteLinks = true;
}
diff --git a/src/tools/qdoc/node.cpp b/src/tools/qdoc/node.cpp
index 24c0006dae..4d6c58a8a3 100644
--- a/src/tools/qdoc/node.cpp
+++ b/src/tools/qdoc/node.cpp
@@ -48,10 +48,23 @@
QT_BEGIN_NAMESPACE
+int Node::propertyGroupCount_ = 0;
ExampleNodeMap ExampleNode::exampleNodeMap;
QStringMap Node::operators_;
/*!
+ Increment the number of property groups seen in the current
+ file, and return the new value.
+ */
+int Node::incPropertyGroupCount() { return ++propertyGroupCount_; }
+
+/*!
+ Reset the number of property groups seen in the current file
+ to 0, because we are starting a new file.
+ */
+void Node::clearPropertyGroupCount() { propertyGroupCount_ = 0; }
+
+/*!
\class Node
\brief The Node class is a node in the Tree.
@@ -2182,17 +2195,26 @@ QmlBasicTypeNode::QmlBasicTypeNode(InnerNode *parent,
always a QmlClassNode.
*/
QmlPropGroupNode::QmlPropGroupNode(QmlClassNode* parent, const QString& name)
- //bool attached)
: FakeNode(parent, name, QmlPropertyGroup, Node::ApiPage)
-#if 0
- isdefault_(false),
- attached_(attached),
- readOnly_(-1)
-#endif
{
- // nothing.
+ idNumber_ = -1;
+}
+
+/*!
+ Return the property group node's id number for use in
+ constructing an id attribute for the property group.
+ If the id number is currently -1, increment the global
+ property group count and set the id number to the new
+ value.
+ */
+QString QmlPropGroupNode::idNumber()
+{
+ if (idNumber_ == -1)
+ idNumber_ = incPropertyGroupCount();
+ return QString().setNum(idNumber_);
}
+
/*!
Constructor for the QML property node, when the \a parent
is QML property group node. This constructor is only used
@@ -2632,7 +2654,7 @@ QString Node::idForNode() const
str += "-" + tail;
}
else
- qDebug() << "qdoc3 internal error: Operator missing from operators_ map:" << op;
+ qDebug() << "qdoc internal error: Operator missing from operators_ map:" << op;
}
else {
str += op;
@@ -2649,11 +2671,11 @@ QString Node::idForNode() const
if (parent_->subType() == QmlClass)
str = "qml-method-" + func->name();
else
- qDebug() << "qdoc3 internal error: Node subtype not handled:"
+ qDebug() << "qdoc internal error: Node subtype not handled:"
<< parent_->subType() << func->name();
}
else
- qDebug() << "qdoc3 internal error: Node type not handled:"
+ qDebug() << "qdoc internal error: Node type not handled:"
<< parent_->type() << func->name();
}
@@ -2662,50 +2684,53 @@ QString Node::idForNode() const
}
break;
case Node::Fake:
- {
- switch (subType()) {
- case Node::QmlClass:
- str = "qml-class-" + name();
- break;
- case Node::QmlPropertyGroup:
- str = "qml-property-" + name();
- break;
- case Node::Page:
- case Node::Group:
- case Node::Module:
- case Node::HeaderFile:
- str = title();
- if (str.isEmpty()) {
+ {
+ switch (subType()) {
+ case Node::QmlClass:
+ str = "qml-class-" + name();
+ break;
+ case Node::QmlPropertyGroup:
+ {
+ Node* n = const_cast<Node*>(this);
+ str = "qml-propertygroup-" + n->name();
+ }
+ break;
+ case Node::Page:
+ case Node::Group:
+ case Node::Module:
+ case Node::HeaderFile:
+ str = title();
+ if (str.isEmpty()) {
+ str = name();
+ if (str.endsWith(".html"))
+ str.remove(str.size()-5,5);
+ }
+ str.replace("/","-");
+ break;
+ case Node::File:
+ str = name();
+ str.replace("/","-");
+ break;
+ case Node::Example:
str = name();
- if (str.endsWith(".html"))
- str.remove(str.size()-5,5);
+ str.replace("/","-");
+ break;
+ case Node::QmlBasicType:
+ str = "qml-basic-type-" + name();
+ break;
+ case Node::QmlModule:
+ str = "qml-module-" + name();
+ break;
+ case Node::Collision:
+ str = title();
+ str.replace(": ","-");
+ break;
+ default:
+ qDebug() << "ERROR: A case was not handled in Node::idForNode():"
+ << "subType():" << subType() << "type():" << type();
+ break;
}
- str.replace("/","-");
- break;
- case Node::File:
- str = name();
- str.replace("/","-");
- break;
- case Node::Example:
- str = name();
- str.replace("/","-");
- break;
- case Node::QmlBasicType:
- str = "qml-basic-type-" + name();
- break;
- case Node::QmlModule:
- str = "qml-module-" + name();
- break;
- case Node::Collision:
- str = title();
- str.replace(": ","-");
- break;
- default:
- qDebug() << "ERROR: A case was not handled in Node::idForNode():"
- << "subType():" << subType() << "type():" << type();
- break;
}
- }
break;
case Node::QmlProperty:
str = "qml-property-" + name();
diff --git a/src/tools/qdoc/node.h b/src/tools/qdoc/node.h
index 45b5ded640..b0be5f0be8 100644
--- a/src/tools/qdoc/node.h
+++ b/src/tools/qdoc/node.h
@@ -190,6 +190,7 @@ public:
virtual bool isAbstract() const { return false; }
virtual bool isQmlPropertyGroup() const { return false; }
virtual bool isCollisionNode() const { return false; }
+ virtual bool isAttached() const { return false; }
virtual void setAbstract(bool ) { }
virtual QString title() const { return QString(); }
bool isInternal() const;
@@ -238,6 +239,7 @@ public:
virtual const ImportList* importList() const { return 0; }
virtual void setImportList(const ImportList& ) { }
virtual const Node* applyModuleIdentifier(const Node* ) const { return 0; }
+ virtual QString idNumber() { return "0"; }
QmlClassNode* qmlClassNode();
ClassNode* declarativeCppNode();
const QString& outputSubdirectory() const { return outSubDir_; }
@@ -251,6 +253,8 @@ public:
static QString pageTypeString(unsigned t);
static QString nodeTypeString(unsigned t);
static QString nodeSubtypeString(unsigned t);
+ static int incPropertyGroupCount();
+ static void clearPropertyGroupCount();
protected:
Node(Type type, InnerNode* parent, const QString& name);
@@ -288,6 +292,7 @@ private:
QString qmlModuleName_;
QString qmlModuleVersion_;
static QStringMap operators_;
+ static int propertyGroupCount_;
};
class FunctionNode;
@@ -563,28 +568,18 @@ class QmlPropGroupNode : public FakeNode
{
public:
QmlPropGroupNode(QmlClassNode* parent, const QString& name);
- //bool attached);
virtual ~QmlPropGroupNode() { }
virtual bool isQmlNode() const { return true; }
virtual bool isQtQuickNode() const { return parent()->isQtQuickNode(); }
virtual QString qmlModuleName() const { return parent()->qmlModuleName(); }
virtual QString qmlModuleVersion() const { return parent()->qmlModuleVersion(); }
virtual QString qmlModuleIdentifier() const { return parent()->qmlModuleIdentifier(); }
+ virtual QString idNumber();
const QString& element() const { return parent()->name(); }
-#if 0
- void setDefault() { isdefault_ = true; }
- void setReadOnly(int ro) { readOnly_ = ro; }
- int getReadOnly() const { return readOnly_; }
- bool isDefault() const { return isdefault_; }
- bool isAttached() const { return attached_; }
- bool isReadOnly() const { return (readOnly_ > 0); }
-private:
- bool isdefault_;
- bool attached_;
- int readOnly_;
-#endif
+ private:
+ int idNumber_;
};
class QmlPropertyNode;
@@ -619,8 +614,8 @@ public:
bool isStored() const { return fromFlagValue(stored_,true); }
bool isDesignable() const { return fromFlagValue(designable_,false); }
bool isWritable(Tree* tree);
- bool isAttached() const { return attached_; }
bool isReadOnly() const { return fromFlagValue(readOnly_,false); }
+ virtual bool isAttached() const { return attached_; }
virtual bool isQmlNode() const { return true; }
virtual bool isQtQuickNode() const { return parent()->isQtQuickNode(); }
virtual QString qmlModuleName() const { return parent()->qmlModuleName(); }
@@ -794,7 +789,7 @@ public:
QStringList reconstructParams(bool values = false) const;
QString signature(bool values = false) const;
const QString& element() const { return parent()->name(); }
- bool isAttached() const { return attached_; }
+ virtual bool isAttached() const { return attached_; }
virtual bool isQmlNode() const {
return ((type() == QmlSignal) ||
(type() == QmlMethod) ||
diff --git a/src/tools/qdoc/puredocparser.cpp b/src/tools/qdoc/puredocparser.cpp
index 2303591974..072e6331a0 100644
--- a/src/tools/qdoc/puredocparser.cpp
+++ b/src/tools/qdoc/puredocparser.cpp
@@ -57,7 +57,7 @@ PureDocParser::~PureDocParser()
QStringList PureDocParser::sourceFileNameFilter()
{
- return QStringList("*.qdoc");
+ return QStringList() << "*.qdoc" << "*.qtx" << "*.qtt";
}
QT_END_NAMESPACE
diff --git a/src/tools/qdoc/qdoc.pro b/src/tools/qdoc/qdoc.pro
index 09f9b7a0c1..484b0c6ba1 100644
--- a/src/tools/qdoc/qdoc.pro
+++ b/src/tools/qdoc/qdoc.pro
@@ -92,9 +92,9 @@ SOURCES += jscodemarker.cpp \
qmlmarkupvisitor.cpp \
qmlvisitor.cpp
-### Documentation for qdoc3 ###
+### Documentation for qdoc ###
-qtPrepareTool(QDOC, qdoc3)
+qtPrepareTool(QDOC, qdoc)
qtPrepareTool(QHELPGENERATOR, qhelpgenerator)
equals(QMAKE_DIR_SEP, /) {
@@ -104,11 +104,11 @@ equals(QMAKE_DIR_SEP, /) {
QDOC = $$replace(QDOC, "/", "\\")
}
-html-docs.commands = cd \"$$QT_BUILD_TREE/doc\" && $$QDOC $$QT_SOURCE_TREE/tools/qdoc3/doc/config/qdoc.qdocconf
+html-docs.commands = cd \"$$QT_BUILD_TREE/doc\" && $$QDOC $$QT_SOURCE_TREE/tools/qdoc/doc/config/qdoc.qdocconf
html-docs.files = $$QT_BUILD_TREE/doc/html
-qch-docs.commands = cd \"$$QT_BUILD_TREE/doc\" && $$QHELPGENERATOR $$QT_BUILD_TREE/tools/qdoc3/doc/html/qdoc.qhp -o $$QT_BUILD_TREE/tools/qdoc3/doc/qch/qdoc.qch
-qch-docs.files = $$QT_BUILD_TREE/tools/qdoc3/doc/qch
+qch-docs.commands = cd \"$$QT_BUILD_TREE/doc\" && $$QHELPGENERATOR $$QT_BUILD_TREE/tools/qdoc/doc/html/qdoc.qhp -o $$QT_BUILD_TREE/tools/qdoc/doc/qch/qdoc.qch
+qch-docs.files = $$QT_BUILD_TREE/tools/qdoc/doc/qch
qch-docs.path = $$[QT_INSTALL_DOCS]
qch-docs.CONFIG += no_check_exist directory
diff --git a/src/tools/qdoc/tree.cpp b/src/tools/qdoc/tree.cpp
index 3dfcfea48b..ac55cb7318 100644
--- a/src/tools/qdoc/tree.cpp
+++ b/src/tools/qdoc/tree.cpp
@@ -967,7 +967,18 @@ void Tree::readIndexFile(const QString& path)
file.close();
QDomElement indexElement = document.documentElement();
- QString indexUrl = indexElement.attribute("url", "");
+
+ // Generate a relative URL between the install dir and the index file
+ // when the -installdir command line option is set.
+ QString indexUrl;
+ if (Config::installDir.isEmpty()) {
+ indexUrl = indexElement.attribute("url", "");
+ }
+ else {
+ QDir installDir(Config::installDir);
+ indexUrl = installDir.relativeFilePath(path).section('/', 0, -2);
+ }
+
priv->basesList.clear();
priv->relatedList.clear();
@@ -1513,7 +1524,7 @@ bool Tree::generateIndexSection(QXmlStreamWriter& writer,
QString href = node->outputSubdirectory();
if (!href.isEmpty())
href.append(QLatin1Char('/'));
- href.append(HtmlGenerator::fullDocumentLocation(node));
+ href.append(Generator::fullDocumentLocation(node));
writer.writeAttribute("href", href);
if ((node->type() != Node::Fake) && (!node->isQmlNode()))
writer.writeAttribute("location", node->location().fileName());
@@ -2026,7 +2037,7 @@ void Tree::generateTagFileCompounds(QXmlStreamWriter& writer, const InnerNode* i
if (node->type() == Node::Class) {
writer.writeTextElement("name", node->fullDocumentName());
- writer.writeTextElement("filename", HtmlGenerator::fullDocumentLocation(node,true));
+ writer.writeTextElement("filename", Generator::fullDocumentLocation(node,true));
// Classes contain information about their base classes.
const ClassNode* classNode = static_cast<const ClassNode*>(node);
@@ -2044,7 +2055,7 @@ void Tree::generateTagFileCompounds(QXmlStreamWriter& writer, const InnerNode* i
generateTagFileCompounds(writer, static_cast<const InnerNode*>(node));
} else {
writer.writeTextElement("name", node->fullDocumentName());
- writer.writeTextElement("filename", HtmlGenerator::fullDocumentLocation(node,true));
+ writer.writeTextElement("filename", Generator::fullDocumentLocation(node,true));
// Recurse to write all members.
generateTagFileMembers(writer, static_cast<const InnerNode*>(node));
@@ -2163,7 +2174,7 @@ void Tree::generateTagFileMembers(QXmlStreamWriter& writer, const InnerNode* inn
"virtual " + functionNode->returnType());
writer.writeTextElement("name", objName);
- QStringList pieces = HtmlGenerator::fullDocumentLocation(node,true).split(QLatin1Char('#'));
+ QStringList pieces = Generator::fullDocumentLocation(node,true).split(QLatin1Char('#'));
writer.writeTextElement("anchorfile", pieces[0]);
writer.writeTextElement("anchor", pieces[1]);
@@ -2202,7 +2213,7 @@ void Tree::generateTagFileMembers(QXmlStreamWriter& writer, const InnerNode* inn
const PropertyNode* propertyNode = static_cast<const PropertyNode*>(node);
writer.writeAttribute("type", propertyNode->dataType());
writer.writeTextElement("name", objName);
- QStringList pieces = HtmlGenerator::fullDocumentLocation(node,true).split(QLatin1Char('#'));
+ QStringList pieces = Generator::fullDocumentLocation(node,true).split(QLatin1Char('#'));
writer.writeTextElement("anchorfile", pieces[0]);
writer.writeTextElement("anchor", pieces[1]);
writer.writeTextElement("arglist", "");
@@ -2214,7 +2225,7 @@ void Tree::generateTagFileMembers(QXmlStreamWriter& writer, const InnerNode* inn
{
const EnumNode* enumNode = static_cast<const EnumNode*>(node);
writer.writeTextElement("name", objName);
- QStringList pieces = HtmlGenerator::fullDocumentLocation(node).split(QLatin1Char('#'));
+ QStringList pieces = Generator::fullDocumentLocation(node).split(QLatin1Char('#'));
writer.writeTextElement("anchor", pieces[1]);
writer.writeTextElement("arglist", "");
writer.writeEndElement(); // member
@@ -2238,7 +2249,7 @@ void Tree::generateTagFileMembers(QXmlStreamWriter& writer, const InnerNode* inn
else
writer.writeAttribute("type", "");
writer.writeTextElement("name", objName);
- QStringList pieces = HtmlGenerator::fullDocumentLocation(node,true).split(QLatin1Char('#'));
+ QStringList pieces = Generator::fullDocumentLocation(node,true).split(QLatin1Char('#'));
writer.writeTextElement("anchorfile", pieces[0]);
writer.writeTextElement("anchor", pieces[1]);
writer.writeTextElement("arglist", "");
@@ -2382,9 +2393,7 @@ Node* Tree::findNodeRecursive(const QStringList& path,
else if (n->isCollisionNode()) {
if (acceptCollision)
return n;
- return n = findNodeRecursive(path, pathIndex, n, type, subtype);
- if (n)
- return n;
+ return findNodeRecursive(path, pathIndex, n, type, subtype);
}
else
return 0;
diff --git a/src/widgets/accessible/qaccessiblewidget.cpp b/src/widgets/accessible/qaccessiblewidget.cpp
index 796ce42118..17ba14de39 100644
--- a/src/widgets/accessible/qaccessiblewidget.cpp
+++ b/src/widgets/accessible/qaccessiblewidget.cpp
@@ -147,7 +147,7 @@ QString Q_WIDGETS_EXPORT qt_accHotKey(const QString &text)
{
int ampIndex = qt_accAmpIndex(text);
if (ampIndex != -1)
- return (QString)QKeySequence(Qt::ALT) + text.at(ampIndex + 1);
+ return QKeySequence(Qt::ALT).toString(QKeySequence::NativeText) + text.at(ampIndex + 1);
return QString();
}
@@ -172,6 +172,7 @@ public:
/*!
\class QAccessibleWidget
\brief The QAccessibleWidget class implements the QAccessibleInterface for QWidgets.
+ \internal
\ingroup accessibility
\inmodule QtWidgets
@@ -276,7 +277,7 @@ public:
*/
void QAccessibleWidget::addControllingSignal(const QString &signal)
{
- QByteArray s = QMetaObject::normalizedSignature(signal.toAscii());
+ QByteArray s = QMetaObject::normalizedSignature(signal.toLatin1());
if (object()->metaObject()->indexOfSignal(s) < 0)
qWarning("Signal %s unknown in %s", s.constData(), object()->metaObject()->className());
d->primarySignals << QLatin1String(s);
@@ -387,7 +388,7 @@ QAccessibleWidget::relations(QAccessible::Relation match /*= QAccessible::AllRel
QACConnectionObject *connectionSender = (QACConnectionObject*)sender;
QStringList senderPrimarySignals = static_cast<QAccessibleWidget*>(iface)->d->primarySignals;
for (int sig = 0; sig < senderPrimarySignals.count(); ++sig) {
- const QByteArray strSignal = senderPrimarySignals.at(sig).toAscii();
+ const QByteArray strSignal = senderPrimarySignals.at(sig).toLatin1();
if (connectionSender->isSender(object(), strSignal.constData()))
rels.append(qMakePair(iface, rel));
}
@@ -399,7 +400,7 @@ QAccessibleWidget::relations(QAccessible::Relation match /*= QAccessible::AllRel
QObjectList allReceivers;
QACConnectionObject *connectionObject = (QACConnectionObject*)object();
for (int sig = 0; sig < d->primarySignals.count(); ++sig) {
- const QObjectList receivers = connectionObject->receiverList(d->primarySignals.at(sig).toAscii());
+ const QObjectList receivers = connectionObject->receiverList(d->primarySignals.at(sig).toLatin1());
allReceivers += receivers;
}
diff --git a/src/widgets/dialogs/dialogs.pri b/src/widgets/dialogs/dialogs.pri
index f8ca43c5e4..53d1985fb5 100644
--- a/src/widgets/dialogs/dialogs.pri
+++ b/src/widgets/dialogs/dialogs.pri
@@ -20,27 +20,6 @@ HEADERS += \
dialogs/qfileinfogatherer_p.h \
dialogs/qwizard.h
-# TODO
-false:mac {
- OBJECTIVE_SOURCES += dialogs/qfiledialog_mac.mm \
- dialogs/qfontdialog_mac.mm \
- dialogs/qnspanelproxy_mac.mm
-
-# Compile qcolordialog_mac.mm with exception support, disregarding the -no-exceptions
-# configure option. (qcolordialog_mac needs to catch exceptions thrown by cocoa)
- EXCEPTION_SOURCES = dialogs/qcolordialog_mac.mm
- exceptions_compiler.commands = $$QMAKE_CXX -c
- exceptions_compiler.commands += $(CXXFLAGS) $(INCPATH) ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
- exceptions_compiler.commands += -fexceptions
- exceptions_compiler.dependency_type = TYPE_C
- exceptions_compiler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_OBJ)}
- exceptions_compiler.input = EXCEPTION_SOURCES
- exceptions_compiler.variable_out = OBJECTS
- exceptions_compiler.name = compiling[exceptopns] ${QMAKE_FILE_IN}
- silent:exceptions_compiler.commands = @echo compiling[exceptopns] ${QMAKE_FILE_IN} && $$exceptions_compiler.commands
- QMAKE_EXTRA_COMPILERS += exceptions_compiler
-}
-
win32 {
HEADERS += dialogs/qwizard_win_p.h
SOURCES += dialogs/qwizard_win.cpp
diff --git a/src/widgets/dialogs/qcolordialog.cpp b/src/widgets/dialogs/qcolordialog.cpp
index 606b9b00f7..d7a8f5dc21 100644
--- a/src/widgets/dialogs/qcolordialog.cpp
+++ b/src/widgets/dialogs/qcolordialog.cpp
@@ -1247,7 +1247,7 @@ inline bool QColorDialogPrivate::isAlphaVisible() const { return cs->isAlphaVisi
QColor QColorDialogPrivate::currentQColor() const
{
- if (nativeDialogInUse)
+ if (!options->testOption(QColorDialogOptions::DontUseNativeDialog) && nativeDialogInUse)
return platformColorDialogHelper()->currentColor_sys();
return cs->currentQColor();
}
@@ -1706,8 +1706,7 @@ void QColorDialog::setCurrentColor(const QColor &color)
d->selectColor(color);
d->setCurrentAlpha(color.alpha());
- // ### fixme: Call helper
- if (d->nativeDialogInUse)
+ if (!testOption(QColorDialog::DontUseNativeDialog) && d->nativeDialogInUse)
d->platformColorDialogHelper()->setCurrentColor_sys(color);
}
diff --git a/src/widgets/dialogs/qcolordialog_mac.mm b/src/widgets/dialogs/qcolordialog_mac.mm
deleted file mode 100644
index 1496ba8300..0000000000
--- a/src/widgets/dialogs/qcolordialog_mac.mm
+++ /dev/null
@@ -1,505 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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, Nokia gives you certain additional
-** rights. These rights are described in the Nokia 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.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qcolordialog_p.h"
-#if !defined(QT_NO_COLORDIALOG) && defined(Q_WS_MAC)
-#include <qapplication.h>
-#include <qtimer.h>
-#include <qdialogbuttonbox.h>
-#include <qabstracteventdispatcher.h>
-#include <private/qapplication_p.h>
-#include <private/qt_mac_p.h>
-#include <qdebug.h>
-#import <AppKit/AppKit.h>
-#import <Foundation/Foundation.h>
-
-#if !CGFLOAT_DEFINED
-typedef float CGFloat; // Should only not be defined on 32-bit platforms
-#endif
-
-
-#if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_5
-@protocol NSWindowDelegate <NSObject>
-- (void)windowDidResize:(NSNotification *)notification;
-- (BOOL)windowShouldClose:(id)window;
-@end
-#endif
-
-QT_USE_NAMESPACE
-
-@class QT_MANGLE_NAMESPACE(QCocoaColorPanelDelegate);
-
-@interface QT_MANGLE_NAMESPACE(QCocoaColorPanelDelegate) : NSObject<NSWindowDelegate> {
- NSColorPanel *mColorPanel;
- NSView *mStolenContentView;
- NSButton *mOkButton;
- NSButton *mCancelButton;
- QColorDialogPrivate *mPriv;
- QColor *mQtColor;
- CGFloat mMinWidth; // currently unused
- CGFloat mExtraHeight; // currently unused
- BOOL mHackedPanel;
- NSInteger mResultCode;
- BOOL mDialogIsExecuting;
- BOOL mResultSet;
-}
-- (id)initWithColorPanel:(NSColorPanel *)panel
- stolenContentView:(NSView *)stolenContentView
- okButton:(NSButton *)okButton
- cancelButton:(NSButton *)cancelButton
- priv:(QColorDialogPrivate *)priv;
-- (void)colorChanged:(NSNotification *)notification;
-- (void)relayout;
-- (void)onOkClicked;
-- (void)onCancelClicked;
-- (void)updateQtColor;
-- (NSColorPanel *)colorPanel;
-- (QColor)qtColor;
-- (void)finishOffWithCode:(NSInteger)result;
-- (void)showColorPanel;
-- (void)exec;
-- (void)setResultSet:(BOOL)result;
-@end
-
-@implementation QT_MANGLE_NAMESPACE(QCocoaColorPanelDelegate)
-- (id)initWithColorPanel:(NSColorPanel *)panel
- stolenContentView:(NSView *)stolenContentView
- okButton:(NSButton *)okButton
- cancelButton:(NSButton *)cancelButton
- priv:(QColorDialogPrivate *)priv
-{
- self = [super init];
-
- mColorPanel = panel;
- mStolenContentView = stolenContentView;
- mOkButton = okButton;
- mCancelButton = cancelButton;
- mPriv = priv;
- mMinWidth = 0.0;
- mExtraHeight = 0.0;
- mHackedPanel = (okButton != 0);
- mResultCode = NSCancelButton;
- mDialogIsExecuting = false;
- mResultSet = false;
-
- if (mHackedPanel) {
- [self relayout];
-
- [okButton setAction:@selector(onOkClicked)];
- [okButton setTarget:self];
-
- [cancelButton setAction:@selector(onCancelClicked)];
- [cancelButton setTarget:self];
- }
-
- [[NSNotificationCenter defaultCenter] addObserver:self
- selector:@selector(colorChanged:)
- name:NSColorPanelColorDidChangeNotification
- object:mColorPanel];
-
- mQtColor = new QColor();
- return self;
-}
-
-- (void)dealloc
-{
- QMacCocoaAutoReleasePool pool;
- if (mHackedPanel) {
- NSView *ourContentView = [mColorPanel contentView];
-
- // return stolen stuff to its rightful owner
- [mStolenContentView removeFromSuperview];
- [mColorPanel setContentView:mStolenContentView];
-
- [mOkButton release];
- [mCancelButton release];
- [ourContentView release];
- }
- [mColorPanel setDelegate:nil];
- [[NSNotificationCenter defaultCenter] removeObserver:self];
- delete mQtColor;
- [super dealloc];
-}
-
-- (void)setResultSet:(BOOL)result
-{
- mResultSet = result;
-}
-
-- (BOOL)windowShouldClose:(id)window
-{
- Q_UNUSED(window);
- if (!mHackedPanel)
- [self updateQtColor];
- if (mDialogIsExecuting) {
- [self finishOffWithCode:NSCancelButton];
- } else {
- mResultSet = true;
- mPriv->colorDialog()->reject();
- }
- return true;
-}
-
-- (void)windowDidResize:(NSNotification *)notification
-{
- Q_UNUSED(notification);
- if (mHackedPanel)
- [self relayout];
-}
-
-- (void)colorChanged:(NSNotification *)notification
-{
- Q_UNUSED(notification);
- [self updateQtColor];
-}
-
-- (void)relayout
-{
- Q_ASSERT(mHackedPanel);
-
- NSRect rect = [[mStolenContentView superview] frame];
-
- // should a priori be kept in sync with qfontdialog_mac.mm
- const CGFloat ButtonMinWidth = 78.0; // 84.0 for Carbon
- const CGFloat ButtonMinHeight = 32.0;
- const CGFloat ButtonSpacing = 0.0;
- const CGFloat ButtonTopMargin = 0.0;
- const CGFloat ButtonBottomMargin = 7.0;
- const CGFloat ButtonSideMargin = 9.0;
-
- [mOkButton sizeToFit];
- NSSize okSizeHint = [mOkButton frame].size;
-
- [mCancelButton sizeToFit];
- NSSize cancelSizeHint = [mCancelButton frame].size;
-
- const CGFloat ButtonWidth = qMin(qMax(ButtonMinWidth,
- qMax(okSizeHint.width, cancelSizeHint.width)),
- CGFloat((rect.size.width - 2.0 * ButtonSideMargin - ButtonSpacing) * 0.5));
- const CGFloat ButtonHeight = qMax(ButtonMinHeight,
- qMax(okSizeHint.height, cancelSizeHint.height));
-
- NSRect okRect = { { rect.size.width - ButtonSideMargin - ButtonWidth,
- ButtonBottomMargin },
- { ButtonWidth, ButtonHeight } };
- [mOkButton setFrame:okRect];
- [mOkButton setNeedsDisplay:YES];
-
- NSRect cancelRect = { { okRect.origin.x - ButtonSpacing - ButtonWidth,
- ButtonBottomMargin },
- { ButtonWidth, ButtonHeight } };
- [mCancelButton setFrame:cancelRect];
- [mCancelButton setNeedsDisplay:YES];
-
- const CGFloat Y = ButtonBottomMargin + ButtonHeight + ButtonTopMargin;
- NSRect stolenCVRect = { { 0.0, Y },
- { rect.size.width, rect.size.height - Y } };
- [mStolenContentView setFrame:stolenCVRect];
- [mStolenContentView setNeedsDisplay:YES];
-
- [[mStolenContentView superview] setNeedsDisplay:YES];
- mMinWidth = 2 * ButtonSideMargin + ButtonSpacing + 2 * ButtonWidth;
- mExtraHeight = Y;
-}
-
-- (void)onOkClicked
-{
- Q_ASSERT(mHackedPanel);
- [[mStolenContentView window] close];
- [self updateQtColor];
- [self finishOffWithCode:NSOKButton];
-}
-
-- (void)onCancelClicked
-{
- if (mHackedPanel) {
- [[mStolenContentView window] close];
- delete mQtColor;
- mQtColor = new QColor();
- [self finishOffWithCode:NSCancelButton];
- }
-}
-
-- (void)updateQtColor
-{
- delete mQtColor;
- mQtColor = new QColor();
- NSColor *color = [mColorPanel color];
- NSString *colorSpaceName = [color colorSpaceName];
- if (colorSpaceName == NSDeviceCMYKColorSpace) {
- CGFloat cyan = 0, magenta = 0, yellow = 0, black = 0, alpha = 0;
- [color getCyan:&cyan magenta:&magenta yellow:&yellow black:&black alpha:&alpha];
- mQtColor->setCmykF(cyan, magenta, yellow, black, alpha);
- } else if (colorSpaceName == NSCalibratedRGBColorSpace || colorSpaceName == NSDeviceRGBColorSpace) {
- CGFloat red = 0, green = 0, blue = 0, alpha = 0;
- [color getRed:&red green:&green blue:&blue alpha:&alpha];
- mQtColor->setRgbF(red, green, blue, alpha);
- } else if (colorSpaceName == NSNamedColorSpace) {
- NSColor *tmpColor = [color colorUsingColorSpaceName:NSCalibratedRGBColorSpace];
- CGFloat red = 0, green = 0, blue = 0, alpha = 0;
- [tmpColor getRed:&red green:&green blue:&blue alpha:&alpha];
- mQtColor->setRgbF(red, green, blue, alpha);
- } else {
- NSColorSpace *colorSpace = [color colorSpace];
- if ([colorSpace colorSpaceModel] == NSCMYKColorSpaceModel && [color numberOfComponents] == 5){
- CGFloat components[5];
- [color getComponents:components];
- mQtColor->setCmykF(components[0], components[1], components[2], components[3], components[4]);
- } else {
- NSColor *tmpColor = [color colorUsingColorSpaceName:NSCalibratedRGBColorSpace];
- CGFloat red = 0, green = 0, blue = 0, alpha = 0;
- [tmpColor getRed:&red green:&green blue:&blue alpha:&alpha];
- mQtColor->setRgbF(red, green, blue, alpha);
- }
- }
-
- mPriv->setCurrentQColor(*mQtColor);
-}
-
-- (NSColorPanel *)colorPanel
-{
- return mColorPanel;
-}
-
-- (QColor)qtColor
-{
- return *mQtColor;
-}
-
-- (void)finishOffWithCode:(NSInteger)code
-{
- mResultCode = code;
- if (mDialogIsExecuting) {
- // We stop the current modal event loop. The control
- // will then return inside -(void)exec below.
- // It's important that the modal event loop is stopped before
- // we accept/reject QColorDialog, since QColorDialog has its
- // own event loop that needs to be stopped last.
- [NSApp stopModalWithCode:code];
- } else {
- // Since we are not in a modal event loop, we can safely close
- // down QColorDialog
- // Calling accept() or reject() can in turn call closeCocoaColorPanel.
- // This check will prevent any such recursion.
- if (!mResultSet) {
- mResultSet = true;
- if (mResultCode == NSCancelButton) {
- mPriv->colorDialog()->reject();
- } else {
- mPriv->colorDialog()->accept();
- }
- }
- }
-}
-
-- (void)showColorPanel
-{
- mDialogIsExecuting = false;
- [mColorPanel makeKeyAndOrderFront:mColorPanel];
-}
-
-- (void)exec
-{
- QBoolBlocker nativeDialogOnTop(QApplicationPrivate::native_modal_dialog_active);
- QMacCocoaAutoReleasePool pool;
- mDialogIsExecuting = true;
- bool modalEnded = false;
- while (!modalEnded) {
-#ifndef QT_NO_EXCEPTIONS
- @try {
- [NSApp runModalForWindow:mColorPanel];
- modalEnded = true;
- } @catch (NSException *) {
- // For some reason, NSColorPanel throws an exception when
- // clicking on 'SelectedMenuItemColor' from the 'Developer'
- // palette (tab three).
- }
-#else
- [NSApp runModalForWindow:mColorPanel];
- modalEnded = true;
-#endif
- }
-
- QAbstractEventDispatcher::instance()->interrupt();
- if (mResultCode == NSCancelButton)
- mPriv->colorDialog()->reject();
- else
- mPriv->colorDialog()->accept();
-}
-
-@end
-
-QT_BEGIN_NAMESPACE
-
-extern void macStartInterceptNSPanelCtor();
-extern void macStopInterceptNSPanelCtor();
-extern NSButton *macCreateButton(const char *text, NSView *superview);
-
-void QColorDialogPrivate::openCocoaColorPanel(const QColor &initial,
- QWidget *parent, const QString &title, QColorDialog::ColorDialogOptions options)
-{
- Q_UNUSED(parent); // we would use the parent if only NSColorPanel could be a sheet
- QMacCocoaAutoReleasePool pool;
-
- if (!delegate) {
- /*
- The standard Cocoa color panel has no OK or Cancel button and
- is created as a utility window, whereas we want something like
- the Carbon color panel. We need to take the following steps:
-
- 1. Intercept the color panel constructor to turn off the
- NSUtilityWindowMask flag. This is done by temporarily
- replacing initWithContentRect:styleMask:backing:defer:
- in NSPanel by our own method.
-
- 2. Modify the color panel so that its content view is part
- of a new content view that contains it as well as two
- buttons (OK and Cancel).
-
- 3. Lay out the original content view and the buttons when
- the color panel is shown and whenever it is resized.
-
- 4. Clean up after ourselves.
- */
-
- bool hackColorPanel = !(options & QColorDialog::NoButtons);
-
- if (hackColorPanel)
- macStartInterceptNSPanelCtor();
- NSColorPanel *colorPanel = [NSColorPanel sharedColorPanel];
- if (hackColorPanel)
- macStopInterceptNSPanelCtor();
-
- [colorPanel setHidesOnDeactivate:false];
-
- // set up the Cocoa color panel
- [colorPanel setShowsAlpha:options & QColorDialog::ShowAlphaChannel];
- [colorPanel setTitle:(NSString*)(CFStringRef)QCFString(title)];
-
- NSView *stolenContentView = 0;
- NSButton *okButton = 0;
- NSButton *cancelButton = 0;
-
- if (hackColorPanel) {
- // steal the color panel's contents view
- stolenContentView = [colorPanel contentView];
- [stolenContentView retain];
- [colorPanel setContentView:0];
-
- // create a new content view and add the stolen one as a subview
- NSRect frameRect = { { 0.0, 0.0 }, { 0.0, 0.0 } };
- NSView *ourContentView = [[NSView alloc] initWithFrame:frameRect];
- [ourContentView addSubview:stolenContentView];
-
- // create OK and Cancel buttons and add these as subviews
- okButton = macCreateButton("&OK", ourContentView);
- cancelButton = macCreateButton("Cancel", ourContentView);
-
- [colorPanel setContentView:ourContentView];
- [colorPanel setDefaultButtonCell:[okButton cell]];
- }
-
- delegate = [[QT_MANGLE_NAMESPACE(QCocoaColorPanelDelegate) alloc] initWithColorPanel:colorPanel
- stolenContentView:stolenContentView
- okButton:okButton
- cancelButton:cancelButton
- priv:this];
- [colorPanel setDelegate:static_cast<QT_MANGLE_NAMESPACE(QCocoaColorPanelDelegate) *>(delegate)];
- }
- [static_cast<QT_MANGLE_NAMESPACE(QCocoaColorPanelDelegate) *>(delegate) setResultSet:NO];
- setCocoaPanelColor(initial);
- [static_cast<QT_MANGLE_NAMESPACE(QCocoaColorPanelDelegate) *>(delegate) showColorPanel];
-}
-
-void QColorDialogPrivate::closeCocoaColorPanel()
-{
- [static_cast<QT_MANGLE_NAMESPACE(QCocoaColorPanelDelegate) *>(delegate) onCancelClicked];
-}
-
-void QColorDialogPrivate::releaseCocoaColorPanelDelegate()
-{
- [static_cast<QT_MANGLE_NAMESPACE(QCocoaColorPanelDelegate) *>(delegate) release];
-}
-
-void QColorDialogPrivate::mac_nativeDialogModalHelp()
-{
- // Do a queued meta-call to open the native modal dialog so it opens after the new
- // event loop has started to execute (in QDialog::exec). Using a timer rather than
- // a queued meta call is intentional to ensure that the call is only delivered when
- // [NSApp run] runs (timers are handeled special in cocoa). If NSApp is not
- // running (which is the case if e.g a top-most QEventLoop has been
- // interrupted, and the second-most event loop has not yet been reactivated (regardless
- // if [NSApp run] is still on the stack)), showing a native modal dialog will fail.
- if (delegate){
- Q_Q(QColorDialog);
- QTimer::singleShot(1, q, SLOT(_q_macRunNativeAppModalPanel()));
- }
-}
-
-void QColorDialogPrivate::_q_macRunNativeAppModalPanel()
-{
- [static_cast<QT_MANGLE_NAMESPACE(QCocoaColorPanelDelegate) *>(delegate) exec];
-}
-
-void QColorDialogPrivate::setCocoaPanelColor(const QColor &color)
-{
- QMacCocoaAutoReleasePool pool;
- QT_MANGLE_NAMESPACE(QCocoaColorPanelDelegate) *theDelegate = static_cast<QT_MANGLE_NAMESPACE(QCocoaColorPanelDelegate) *>(delegate);
- NSColor *nsColor;
- const QColor::Spec spec = color.spec();
- if (spec == QColor::Cmyk) {
- nsColor = [NSColor colorWithDeviceCyan:color.cyanF()
- magenta:color.magentaF()
- yellow:color.yellowF()
- black:color.blackF()
- alpha:color.alphaF()];
- } else {
- nsColor = [NSColor colorWithCalibratedRed:color.redF()
- green:color.greenF()
- blue:color.blueF()
- alpha:color.alphaF()];
- }
- [[theDelegate colorPanel] setColor:nsColor];
-}
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/widgets/dialogs/qdialog.cpp b/src/widgets/dialogs/qdialog.cpp
index df76d0af0e..718d64bd27 100644
--- a/src/widgets/dialogs/qdialog.cpp
+++ b/src/widgets/dialogs/qdialog.cpp
@@ -108,11 +108,9 @@ bool QDialogPrivate::setNativeDialogVisible(bool visible)
{
if (QPlatformDialogHelper *helper = platformHelper()) {
if (visible) {
+ Q_Q(QDialog);
helperPrepareShow(helper);
- QPlatformDialogHelper::ShowFlags flags(0);
- if (q_func()->isModal())
- flags |= QPlatformDialogHelper::ShowModal;
- nativeDialogInUse = helper->show_sys(flags, q_func()->windowFlags(), parentWindow());
+ nativeDialogInUse = helper->show_sys(q->windowFlags(), q->windowModality(), parentWindow());
} else {
helper->hide_sys();
}
diff --git a/src/widgets/dialogs/qfiledialog_mac.mm b/src/widgets/dialogs/qfiledialog_mac.mm
deleted file mode 100644
index 01ec736550..0000000000
--- a/src/widgets/dialogs/qfiledialog_mac.mm
+++ /dev/null
@@ -1,741 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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, Nokia gives you certain additional
-** rights. These rights are described in the Nokia 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.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qfiledialog.h"
-
-#ifndef QT_NO_FILEDIALOG
-
-/*****************************************************************************
- QFileDialog debug facilities
- *****************************************************************************/
-//#define DEBUG_FILEDIALOG_FILTERS
-
-#include <qapplication.h>
-#include <private/qapplication_p.h>
-#include <private/qfiledialog_p.h>
-#include <private/qt_mac_p.h>
-#include <private/qt_cocoa_helpers_mac_p.h>
-#include <qregexp.h>
-#include <qbuffer.h>
-#include <qdebug.h>
-#include <qstringlist.h>
-#include <qaction.h>
-#include <qtextcodec.h>
-#include <qvarlengtharray.h>
-#include <qdesktopwidget.h>
-#include <stdlib.h>
-#include <qabstracteventdispatcher.h>
-#import <AppKit/NSSavePanel.h>
-#include "ui_qfiledialog.h"
-
-QT_BEGIN_NAMESPACE
-
-extern QStringList qt_make_filter_list(const QString &filter); // qfiledialog.cpp
-extern QStringList qt_clean_filter_list(const QString &filter); // qfiledialog.cpp
-extern const char *qt_file_dialog_filter_reg_exp; // qfiledialog.cpp
-extern bool qt_mac_is_macsheet(const QWidget *w); // qwidget_mac.mm
-
-QT_END_NAMESPACE
-
-QT_FORWARD_DECLARE_CLASS(QFileDialogPrivate)
-QT_FORWARD_DECLARE_CLASS(QString)
-QT_FORWARD_DECLARE_CLASS(QStringList)
-QT_FORWARD_DECLARE_CLASS(QWidget)
-QT_FORWARD_DECLARE_CLASS(QAction)
-QT_FORWARD_DECLARE_CLASS(QFileInfo)
-QT_USE_NAMESPACE
-
-@class QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate);
-
-@interface QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate)
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
- : NSObject<NSOpenSavePanelDelegate>
-#else
- : NSObject
-#endif
-{
- @public
- NSOpenPanel *mOpenPanel;
- NSSavePanel *mSavePanel;
- NSView *mAccessoryView;
- NSPopUpButton *mPopUpButton;
- NSTextField *mTextField;
- QFileDialogPrivate *mPriv;
- NSString *mCurrentDir;
- bool mConfirmOverwrite;
- int mReturnCode;
-
- QT_PREPEND_NAMESPACE(QFileDialog::AcceptMode) mAcceptMode;
- QT_PREPEND_NAMESPACE(QDir::Filters) *mQDirFilter;
- QT_PREPEND_NAMESPACE(QFileDialog::FileMode) mFileMode;
- QT_PREPEND_NAMESPACE(QFileDialog::Options) *mFileOptions;
-
- QString *mLastFilterCheckPath;
- QString *mCurrentSelection;
- QStringList *mQDirFilterEntryList;
- QStringList *mNameFilterDropDownList;
- QStringList *mSelectedNameFilter;
-}
-
-- (NSString *)strip:(const QString &)label;
-- (BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename;
-- (void)filterChanged:(id)sender;
-- (void)showModelessPanel;
-- (BOOL)runApplicationModalPanel;
-- (void)showWindowModalSheet:(QWidget *)docWidget;
-- (void)updateProperties;
-- (QStringList)acceptableExtensionsForSave;
-- (QString)removeExtensions:(const QString &)filter;
-- (void)createTextField;
-- (void)createPopUpButton:(const QString &)selectedFilter hideDetails:(BOOL)hideDetails;
-- (QStringList)findStrippedFilterWithVisualFilterName:(QString)name;
-- (void)createAccessory;
-
-@end
-
-@implementation QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate)
-
-- (id)initWithAcceptMode:(QT_PREPEND_NAMESPACE(QFileDialog::AcceptMode))acceptMode
- title:(const QString &)title
- hideNameFilterDetails:(bool)hideNameFilterDetails
- qDirFilter:(QT_PREPEND_NAMESPACE(QDir::Filters))qDirFilter
- fileOptions:(QT_PREPEND_NAMESPACE(QFileDialog::Options))fileOptions
- fileMode:(QT_PREPEND_NAMESPACE(QFileDialog::FileMode))fileMode
- selectFile:(const QString &)selectFile
- confirmOverwrite:(bool)confirm
- priv:(QFileDialogPrivate *)priv
-{
- self = [super init];
-
- mAcceptMode = acceptMode;
- if (mAcceptMode == QT_PREPEND_NAMESPACE(QFileDialog::AcceptOpen)){
- mOpenPanel = [NSOpenPanel openPanel];
- mSavePanel = mOpenPanel;
- } else {
- mSavePanel = [NSSavePanel savePanel];
- mOpenPanel = 0;
- }
-
- [mSavePanel setLevel:NSModalPanelWindowLevel];
- [mSavePanel setDelegate:self];
- mQDirFilter = new QT_PREPEND_NAMESPACE(QDir::Filters)(qDirFilter);
- mFileOptions = new QT_PREPEND_NAMESPACE(QFileDialog::Options)(fileOptions);
- mFileMode = fileMode;
- mConfirmOverwrite = confirm;
- mReturnCode = -1;
- mPriv = priv;
- mLastFilterCheckPath = new QString;
- mQDirFilterEntryList = new QStringList;
- mNameFilterDropDownList = new QStringList(priv->nameFilters);
- QString selectedVisualNameFilter = priv->qFileDialogUi->fileTypeCombo->currentText();
- mSelectedNameFilter = new QStringList([self findStrippedFilterWithVisualFilterName:selectedVisualNameFilter]);
-
- QFileInfo sel(selectFile);
- if (sel.isDir()){
- mCurrentDir = [qt_mac_QStringToNSString(sel.absoluteFilePath()) retain];
- mCurrentSelection = new QString;
- } else {
- mCurrentDir = [qt_mac_QStringToNSString(sel.absolutePath()) retain];
- mCurrentSelection = new QString(sel.absoluteFilePath());
- }
-
- [mSavePanel setTitle:qt_mac_QStringToNSString(title)];
- [self createPopUpButton:selectedVisualNameFilter hideDetails:hideNameFilterDetails];
- [self createTextField];
- [self createAccessory];
- [mSavePanel setAccessoryView:mNameFilterDropDownList->size() > 1 ? mAccessoryView : nil];
-
- if (mPriv){
- [mSavePanel setPrompt:[self strip:mPriv->acceptLabel]];
- if (mPriv->fileNameLabelExplicitlySat)
- [mSavePanel setNameFieldLabel:[self strip:mPriv->qFileDialogUi->fileNameLabel->text()]];
- }
-
- [self updateProperties];
- [mSavePanel retain];
- return self;
-}
-
-- (void)dealloc
-{
- delete mQDirFilter;
- delete mFileOptions;
- delete mLastFilterCheckPath;
- delete mQDirFilterEntryList;
- delete mNameFilterDropDownList;
- delete mSelectedNameFilter;
- delete mCurrentSelection;
-
- [mSavePanel orderOut:mSavePanel];
- [mSavePanel setAccessoryView:nil];
- [mPopUpButton release];
- [mTextField release];
- [mAccessoryView release];
- [mSavePanel setDelegate:nil];
- [mSavePanel release];
- [mCurrentDir release];
- [super dealloc];
-}
-
-- (NSString *)strip:(const QString &)label
-{
- QAction a(label, 0);
- return qt_mac_QStringToNSString(a.iconText());
-}
-
-- (void)closePanel
-{
- *mCurrentSelection = QT_PREPEND_NAMESPACE(qt_mac_NSStringToQString)([mSavePanel filename]);
- [mSavePanel close];
-}
-
-- (void)showModelessPanel
-{
- if (mOpenPanel){
- QFileInfo info(*mCurrentSelection);
- NSString *filename = QT_PREPEND_NAMESPACE(qt_mac_QStringToNSString)(info.fileName());
- NSString *filepath = QT_PREPEND_NAMESPACE(qt_mac_QStringToNSString)(info.filePath());
- bool selectable = (mAcceptMode == QFileDialog::AcceptSave)
- || [self panel:nil shouldShowFilename:filepath];
- [mOpenPanel
- beginForDirectory:mCurrentDir
- file:selectable ? filename : nil
- types:nil
- modelessDelegate:self
- didEndSelector:@selector(openPanelDidEnd:returnCode:contextInfo:)
- contextInfo:nil];
- }
-}
-
-- (BOOL)runApplicationModalPanel
-{
- QFileInfo info(*mCurrentSelection);
- NSString *filename = QT_PREPEND_NAMESPACE(qt_mac_QStringToNSString)(info.fileName());
- NSString *filepath = QT_PREPEND_NAMESPACE(qt_mac_QStringToNSString)(info.filePath());
- bool selectable = (mAcceptMode == QFileDialog::AcceptSave)
- || [self panel:nil shouldShowFilename:filepath];
- mReturnCode = [mSavePanel
- runModalForDirectory:mCurrentDir
- file:selectable ? filename : @"untitled"];
-
- QAbstractEventDispatcher::instance()->interrupt();
- return (mReturnCode == NSOKButton);
-}
-
-- (QT_PREPEND_NAMESPACE(QDialog::DialogCode))dialogResultCode
-{
- return (mReturnCode == NSOKButton) ? QT_PREPEND_NAMESPACE(QDialog::Accepted) : QT_PREPEND_NAMESPACE(QDialog::Rejected);
-}
-
-- (void)showWindowModalSheet:(QWidget *)docWidget
-{
- Q_UNUSED(docWidget);
- QFileInfo info(*mCurrentSelection);
- NSString *filename = QT_PREPEND_NAMESPACE(qt_mac_QStringToNSString)(info.fileName());
- NSString *filepath = QT_PREPEND_NAMESPACE(qt_mac_QStringToNSString)(info.filePath());
- bool selectable = (mAcceptMode == QFileDialog::AcceptSave)
- || [self panel:nil shouldShowFilename:filepath];
- [mSavePanel
- beginSheetForDirectory:mCurrentDir
- file:selectable ? filename : nil
- modalForWindow:QT_PREPEND_NAMESPACE(qt_mac_window_for)(docWidget)
- modalDelegate:self
- didEndSelector:@selector(openPanelDidEnd:returnCode:contextInfo:)
- contextInfo:nil];
-}
-
-- (BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename
-{
- Q_UNUSED(sender);
-
- if ([filename length] == 0)
- return NO;
-
- // Always accept directories regardless of their names (unless it is a bundle):
- BOOL isDir;
- if ([[NSFileManager defaultManager] fileExistsAtPath:filename isDirectory:&isDir] && isDir) {
- if ([mSavePanel treatsFilePackagesAsDirectories] == NO) {
- if ([[NSWorkspace sharedWorkspace] isFilePackageAtPath:filename] == NO)
- return YES;
- }
- }
-
- QString qtFileName = QT_PREPEND_NAMESPACE(qt_mac_NSStringToQString)(filename);
- QFileInfo info(qtFileName.normalized(QT_PREPEND_NAMESPACE(QString::NormalizationForm_C)));
- QString path = info.absolutePath();
- if (path != *mLastFilterCheckPath){
- *mLastFilterCheckPath = path;
- *mQDirFilterEntryList = info.dir().entryList(*mQDirFilter);
- }
- // Check if the QDir filter accepts the file:
- if (!mQDirFilterEntryList->contains(info.fileName()))
- return NO;
-
- // No filter means accept everything
- if (mSelectedNameFilter->isEmpty())
- return YES;
- // Check if the current file name filter accepts the file:
- for (int i=0; i<mSelectedNameFilter->size(); ++i) {
- if (QDir::match(mSelectedNameFilter->at(i), qtFileName))
- return YES;
- }
- return NO;
-}
-
-- (NSString *)panel:(id)sender userEnteredFilename:(NSString *)filename confirmed:(BOOL)okFlag
-{
- Q_UNUSED(sender);
- if (!okFlag)
- return filename;
- if (mConfirmOverwrite)
- return filename;
-
- // User has clicked save, and no overwrite confirmation should occur.
- // To get the latter, we need to change the name we return (hence the prefix):
- return [@"___qt_very_unlikely_prefix_" stringByAppendingString:filename];
-}
-
-- (void)setNameFilters:(const QStringList &)filters hideDetails:(BOOL)hideDetails
-{
- [mPopUpButton removeAllItems];
- *mNameFilterDropDownList = filters;
- if (filters.size() > 0){
- for (int i=0; i<filters.size(); ++i) {
- QString filter = hideDetails ? [self removeExtensions:filters.at(i)] : filters.at(i);
- [mPopUpButton addItemWithTitle:QT_PREPEND_NAMESPACE(qt_mac_QStringToNSString)(filter)];
- }
- [mPopUpButton selectItemAtIndex:0];
- [mSavePanel setAccessoryView:mAccessoryView];
- } else
- [mSavePanel setAccessoryView:nil];
-
- [self filterChanged:self];
-}
-
-- (void)filterChanged:(id)sender
-{
- // This mDelegate function is called when the _name_ filter changes.
- Q_UNUSED(sender);
- QString selection = mNameFilterDropDownList->value([mPopUpButton indexOfSelectedItem]);
- *mSelectedNameFilter = [self findStrippedFilterWithVisualFilterName:selection];
- [mSavePanel validateVisibleColumns];
- [self updateProperties];
- if (mPriv)
- mPriv->QNSOpenSavePanelDelegate_filterSelected([mPopUpButton indexOfSelectedItem]);
-}
-
-- (QString)currentNameFilter
-{
- return mNameFilterDropDownList->value([mPopUpButton indexOfSelectedItem]);
-}
-
-- (QStringList)selectedFiles
-{
- if (mOpenPanel)
- return QT_PREPEND_NAMESPACE(qt_mac_NSArrayToQStringList)([mOpenPanel filenames]);
- else{
- QStringList result;
- QString filename = QT_PREPEND_NAMESPACE(qt_mac_NSStringToQString)([mSavePanel filename]);
- result << filename.remove(QLatin1String("___qt_very_unlikely_prefix_"));
- return result;
- }
-}
-
-- (void)updateProperties
-{
- // Call this functions if mFileMode, mFileOptions,
- // mNameFilterDropDownList or mQDirFilter changes.
- // The savepanel does not contain the neccessary functions for this.
- bool chooseFilesOnly = mFileMode == QT_PREPEND_NAMESPACE(QFileDialog::ExistingFile)
- || mFileMode == QT_PREPEND_NAMESPACE(QFileDialog::ExistingFiles);
- bool chooseDirsOnly = mFileMode == QT_PREPEND_NAMESPACE(QFileDialog::Directory)
- || mFileMode == QT_PREPEND_NAMESPACE(QFileDialog::DirectoryOnly)
- || *mFileOptions & QT_PREPEND_NAMESPACE(QFileDialog::ShowDirsOnly);
-
- [mOpenPanel setCanChooseFiles:!chooseDirsOnly];
- [mOpenPanel setCanChooseDirectories:!chooseFilesOnly];
- [mSavePanel setCanCreateDirectories:!(*mFileOptions & QT_PREPEND_NAMESPACE(QFileDialog::ReadOnly))];
- [mOpenPanel setAllowsMultipleSelection:(mFileMode == QT_PREPEND_NAMESPACE(QFileDialog::ExistingFiles))];
- [mOpenPanel setResolvesAliases:!(*mFileOptions & QT_PREPEND_NAMESPACE(QFileDialog::DontResolveSymlinks))];
-
- QStringList ext = [self acceptableExtensionsForSave];
- if (mPriv && !ext.isEmpty() && !mPriv->defaultSuffix.isEmpty())
- ext.prepend(mPriv->defaultSuffix);
- [mSavePanel setAllowedFileTypes:ext.isEmpty() ? nil : QT_PREPEND_NAMESPACE(qt_mac_QStringListToNSMutableArray(ext))];
-
- if ([mSavePanel isVisible])
- [mOpenPanel validateVisibleColumns];
-}
-
-- (void)panelSelectionDidChange:(id)sender
-{
- Q_UNUSED(sender);
- if (mPriv) {
- QString selection = QT_PREPEND_NAMESPACE(qt_mac_NSStringToQString([mSavePanel filename]));
- if (selection != mCurrentSelection) {
- *mCurrentSelection = selection;
- mPriv->QNSOpenSavePanelDelegate_selectionChanged(selection);
- }
- }
-}
-
-- (void)openPanelDidEnd:(NSOpenPanel *)panel returnCode:(int)returnCode contextInfo:(void *)contextInfo
-{
- Q_UNUSED(panel);
- Q_UNUSED(contextInfo);
- mReturnCode = returnCode;
- if (mPriv)
- mPriv->QNSOpenSavePanelDelegate_panelClosed(returnCode == NSOKButton);
-}
-
-- (void)panel:(id)sender directoryDidChange:(NSString *)path
-{
- Q_UNUSED(sender);
- if (!mPriv)
- return;
- if ([path isEqualToString:mCurrentDir])
- return;
-
- [mCurrentDir release];
- mCurrentDir = [path retain];
- mPriv->QNSOpenSavePanelDelegate_directoryEntered(QT_PREPEND_NAMESPACE(qt_mac_NSStringToQString(mCurrentDir)));
-}
-
-/*
- Returns a list of extensions (e.g. "png", "jpg", "gif")
- for the current name filter. If a filter do not conform
- to the format *.xyz or * or *.*, an empty list
- is returned meaning accept everything.
-*/
-- (QStringList)acceptableExtensionsForSave
-{
- QStringList result;
- for (int i=0; i<mSelectedNameFilter->count(); ++i) {
- const QString &filter = mSelectedNameFilter->at(i);
- if (filter.startsWith(QLatin1String("*."))
- && !filter.contains(QLatin1Char('?'))
- && filter.count(QLatin1Char('*')) == 1) {
- result += filter.mid(2);
- } else {
- return QStringList(); // Accept everything
- }
- }
- return result;
-}
-
-- (QString)removeExtensions:(const QString &)filter
-{
- QRegExp regExp(QT_PREPEND_NAMESPACE(QString::fromLatin1)(QT_PREPEND_NAMESPACE(qt_file_dialog_filter_reg_exp)));
- if (regExp.indexIn(filter) != -1)
- return regExp.cap(1).trimmed();
- return filter;
-}
-
-- (void)createTextField
-{
- NSRect textRect = { { 0.0, 3.0 }, { 100.0, 25.0 } };
- mTextField = [[NSTextField alloc] initWithFrame:textRect];
- [[mTextField cell] setFont:[NSFont systemFontOfSize:
- [NSFont systemFontSizeForControlSize:NSRegularControlSize]]];
- [mTextField setAlignment:NSRightTextAlignment];
- [mTextField setEditable:false];
- [mTextField setSelectable:false];
- [mTextField setBordered:false];
- [mTextField setDrawsBackground:false];
- if (mPriv){
- [mTextField setStringValue:[self strip:mPriv->qFileDialogUi->fileTypeLabel->text()]];
- } else
- [mTextField setStringValue:QT_PREPEND_NAMESPACE(qt_mac_QStringToNSString)(QT_PREPEND_NAMESPACE(QFileDialog::tr)("Files of type:"))];
-}
-
-- (void)createPopUpButton:(const QString &)selectedFilter hideDetails:(BOOL)hideDetails
-{
- NSRect popUpRect = { { 100.0, 5.0 }, { 250.0, 25.0 } };
- mPopUpButton = [[NSPopUpButton alloc] initWithFrame:popUpRect pullsDown:NO];
- [mPopUpButton setTarget:self];
- [mPopUpButton setAction:@selector(filterChanged:)];
-
- QStringList *filters = mNameFilterDropDownList;
- if (filters->size() > 0){
- for (int i=0; i<mNameFilterDropDownList->size(); ++i) {
- QString filter = hideDetails ? [self removeExtensions:filters->at(i)] : filters->at(i);
- [mPopUpButton addItemWithTitle:QT_PREPEND_NAMESPACE(qt_mac_QStringToNSString)(filter)];
- if (filters->at(i).startsWith(selectedFilter))
- [mPopUpButton selectItemAtIndex:i];
- }
- }
-}
-
-- (QStringList) findStrippedFilterWithVisualFilterName:(QString)name
-{
- for (int i=0; i<mNameFilterDropDownList->size(); ++i) {
- if (mNameFilterDropDownList->at(i).startsWith(name))
- return qt_clean_filter_list(mNameFilterDropDownList->at(i));
- }
- return QStringList();
-}
-
-- (void)createAccessory
-{
- NSRect accessoryRect = { { 0.0, 0.0 }, { 450.0, 33.0 } };
- mAccessoryView = [[NSView alloc] initWithFrame:accessoryRect];
- [mAccessoryView addSubview:mTextField];
- [mAccessoryView addSubview:mPopUpButton];
-}
-
-@end
-
-QT_BEGIN_NAMESPACE
-
-void QFileDialogPrivate::QNSOpenSavePanelDelegate_selectionChanged(const QString &newPath)
-{
- emit q_func()->currentChanged(newPath);
-}
-
-void QFileDialogPrivate::QNSOpenSavePanelDelegate_panelClosed(bool accepted)
-{
- if (accepted)
- q_func()->accept();
- else
- q_func()->reject();
-}
-
-void QFileDialogPrivate::QNSOpenSavePanelDelegate_directoryEntered(const QString &newDir)
-{
- setLastVisitedDirectory(newDir);
- emit q_func()->directoryEntered(newDir);
-}
-
-void QFileDialogPrivate::QNSOpenSavePanelDelegate_filterSelected(int menuIndex)
-{
- emit q_func()->filterSelected(nameFilters.at(menuIndex));
-}
-
-extern OSErr qt_mac_create_fsref(const QString &, FSRef *); // qglobal.cpp
-extern void qt_mac_to_pascal_string(QString s, Str255 str, TextEncoding encoding=0, int len=-1); // qglobal.cpp
-
-void QFileDialogPrivate::setDirectory_sys(const QString &directory)
-{
- QMacCocoaAutoReleasePool pool;
- QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate);
- [delegate->mSavePanel setDirectory:qt_mac_QStringToNSString(directory)];
-}
-
-QString QFileDialogPrivate::directory_sys() const
-{
- QMacCocoaAutoReleasePool pool;
- QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate);
- return qt_mac_NSStringToQString([delegate->mSavePanel directory]);
-}
-
-void QFileDialogPrivate::selectFile_sys(const QString &filename)
-{
- QString filePath = filename;
- if (QDir::isRelativePath(filePath))
- filePath = QFileInfo(directory_sys(), filePath).filePath();
-
- // There seems to no way to select a file once the dialog is running.
- // So do the next best thing, set the file's directory:
- setDirectory_sys(QFileInfo(filePath).absolutePath());
-}
-
-QStringList QFileDialogPrivate::selectedFiles_sys() const
-{
- QMacCocoaAutoReleasePool pool;
- QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate);
- return [delegate selectedFiles];
-}
-
-void QFileDialogPrivate::setNameFilters_sys(const QStringList &filters)
-{
- QMacCocoaAutoReleasePool pool;
- QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate);
- bool hideDetails = q_func()->testOption(QFileDialog::HideNameFilterDetails);
- [delegate setNameFilters:filters hideDetails:hideDetails];
-}
-
-void QFileDialogPrivate::setFilter_sys()
-{
- Q_Q(QFileDialog);
- QMacCocoaAutoReleasePool pool;
- QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate);
- *(delegate->mQDirFilter) = model->filter();
- delegate->mFileMode = fileMode;
- [delegate->mSavePanel setTitle:qt_mac_QStringToNSString(q->windowTitle())];
- [delegate->mSavePanel setPrompt:[delegate strip:acceptLabel]];
- if (fileNameLabelExplicitlySat)
- [delegate->mSavePanel setNameFieldLabel:[delegate strip:qFileDialogUi->fileNameLabel->text()]];
-
- [delegate updateProperties];
-}
-
-void QFileDialogPrivate::selectNameFilter_sys(const QString &filter)
-{
- int index = nameFilters.indexOf(filter);
- if (index != -1) {
- QMacCocoaAutoReleasePool pool;
- QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate);
- [delegate->mPopUpButton selectItemAtIndex:index];
- [delegate filterChanged:nil];
- }
-}
-
-QString QFileDialogPrivate::selectedNameFilter_sys() const
-{
- QMacCocoaAutoReleasePool pool;
- QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate);
- int index = [delegate->mPopUpButton indexOfSelectedItem];
- return index != -1 ? nameFilters.at(index) : QString();
-}
-
-void QFileDialogPrivate::deleteNativeDialog_sys()
-{
- QMacCocoaAutoReleasePool pool;
- [reinterpret_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate) release];
- mDelegate = 0;
- nativeDialogInUse = false;
-}
-
-bool QFileDialogPrivate::setVisible_sys(bool visible)
-{
- Q_Q(QFileDialog);
- if (!visible == q->isHidden())
- return false;
-
- if (q->windowFlags() & Qt::WindowStaysOnTopHint) {
- // The native file dialog tries all it can to stay
- // on the NSModalPanel level. And it might also show
- // its own "create directory" dialog that we cannot control.
- // So we need to use the non-native version in this case...
- return false;
- }
-
- return visible ? showCocoaFilePanel() : hideCocoaFilePanel();
-}
-
-void QFileDialogPrivate::createNSOpenSavePanelDelegate()
-{
- Q_Q(QFileDialog);
- if (mDelegate)
- return;
-
- bool selectDir = q->selectedFiles().isEmpty();
- QString selection(selectDir ? q->directory().absolutePath() : q->selectedFiles().value(0));
- QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = [[QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) alloc]
- initWithAcceptMode:acceptMode
- title:q->windowTitle()
- hideNameFilterDetails:q->testOption(QFileDialog::HideNameFilterDetails)
- qDirFilter:model->filter()
- fileOptions:opts
- fileMode:fileMode
- selectFile:selection
- confirmOverwrite:!q->testOption(QFileDialog::DontConfirmOverwrite)
- priv:this];
-
- mDelegate = delegate;
-}
-
-bool QFileDialogPrivate::showCocoaFilePanel()
-{
- Q_Q(QFileDialog);
- QMacCocoaAutoReleasePool pool;
- createNSOpenSavePanelDelegate();
- QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate);
- if (qt_mac_is_macsheet(q))
- [delegate showWindowModalSheet:q->parentWidget()];
- else
- [delegate showModelessPanel];
- return true;
-}
-
-bool QFileDialogPrivate::hideCocoaFilePanel()
-{
- if (!mDelegate){
- // Nothing to do. We return false to leave the question
- // open regarding whether or not to go native:
- return false;
- } else {
- QMacCocoaAutoReleasePool pool;
- QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate);
- [delegate closePanel];
- // Even when we hide it, we are still using a
- // native dialog, so return true:
- return true;
- }
-}
-
-
-void QFileDialogPrivate::platformNativeDialogModalHelp()
-{
- // Do a queued meta-call to open the native modal dialog so it opens after the new
- // event loop has started to execute (in QDialog::exec). Using a timer rather than
- // a queued meta call is intentional to ensure that the call is only delivered when
- // [NSApp run] runs (timers are handeled special in cocoa). If NSApp is not
- // running (which is the case if e.g a top-most QEventLoop has been
- // interrupted, and the second-most event loop has not yet been reactivated (regardless
- // if [NSApp run] is still on the stack)), showing a native modal dialog will fail.
- if (nativeDialogInUse){
- Q_Q(QFileDialog);
- QTimer::singleShot(1, q, SLOT(_q_macRunNativeAppModalPanel()));
- }
-}
-
-void QFileDialogPrivate::_q_macRunNativeAppModalPanel()
-{
- QBoolBlocker nativeDialogOnTop(QApplicationPrivate::native_modal_dialog_active);
- Q_Q(QFileDialog);
- QMacCocoaAutoReleasePool pool;
- QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate);
- [delegate runApplicationModalPanel];
- dialogResultCode_sys() == QDialog::Accepted ? q->accept() : q->reject();
-}
-
-QDialog::DialogCode QFileDialogPrivate::dialogResultCode_sys()
-{
- QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate);
- return [delegate dialogResultCode];
-}
-
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_FILEDIALOG
-
diff --git a/src/widgets/dialogs/qfilesystemmodel.cpp b/src/widgets/dialogs/qfilesystemmodel.cpp
index a7ae4b366b..40cc100c53 100644
--- a/src/widgets/dialogs/qfilesystemmodel.cpp
+++ b/src/widgets/dialogs/qfilesystemmodel.cpp
@@ -2017,7 +2017,8 @@ bool QFileSystemModelPrivate::passNameFilters(const QFileSystemNode *node) const
// Check the name regularexpression filters
if (!(node->isDir() && (filters & QDir::AllDirs))) {
for (int i = 0; i < nameFilters.size(); ++i) {
- if (nameFilters.at(i).exactMatch(node->fileName))
+ QRegExp copy = nameFilters.at(i);
+ if (copy.exactMatch(node->fileName))
return true;
}
return false;
diff --git a/src/widgets/dialogs/qfontdialog.cpp b/src/widgets/dialogs/qfontdialog.cpp
index 7e71cd7cd4..b267f67422 100644
--- a/src/widgets/dialogs/qfontdialog.cpp
+++ b/src/widgets/dialogs/qfontdialog.cpp
@@ -171,11 +171,6 @@ void QFontDialogPrivate::init()
{
Q_Q(QFontDialog);
-#ifdef Q_WS_MAC
- nativeDialogInUse = false;
- delegate = 0;
-#endif
-
q->setSizeGripEnabled(true);
q->setWindowTitle(QFontDialog::tr("Select Font"));
@@ -805,8 +800,10 @@ void QFontDialog::setCurrentFont(const QFont &font)
d->strikeout->setChecked(font.strikeOut());
d->underline->setChecked(font.underline());
d->updateFamilies();
- if (QPlatformFontDialogHelper *helper = d->platformFontDialogHelper())
- helper->setCurrentFont_sys(font);
+ if (d->canBeNativeDialog()) {
+ if (QPlatformFontDialogHelper *helper = d->platformFontDialogHelper())
+ helper->setCurrentFont_sys(font);
+ }
#ifdef Q_WS_MAC
if (d->delegate)
@@ -824,8 +821,10 @@ void QFontDialog::setCurrentFont(const QFont &font)
QFont QFontDialog::currentFont() const
{
Q_D(const QFontDialog);
- if (const QPlatformFontDialogHelper *helper = d->platformFontDialogHelper())
- return helper->currentFont_sys();
+ if (d->canBeNativeDialog()) {
+ if (const QPlatformFontDialogHelper *helper = d->platformFontDialogHelper())
+ return helper->currentFont_sys();
+ }
return d->sampleEdit->font();
}
@@ -1013,9 +1012,9 @@ void QFontDialog::done(int result)
d->memberToDisconnectOnClose.clear();
}
-bool QFontDialogPrivate::canBeNativeDialog()
+bool QFontDialogPrivate::canBeNativeDialog() const
{
- Q_Q(QFontDialog);
+ Q_Q(const QFontDialog);
if (nativeDialogInUse)
return true;
if (q->testAttribute(Qt::WA_DontShowOnScreen))
diff --git a/src/widgets/dialogs/qfontdialog_mac.mm b/src/widgets/dialogs/qfontdialog_mac.mm
deleted file mode 100644
index bf8b88a0c9..0000000000
--- a/src/widgets/dialogs/qfontdialog_mac.mm
+++ /dev/null
@@ -1,676 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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, Nokia gives you certain additional
-** rights. These rights are described in the Nokia 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.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qfontdialog_p.h"
-#if !defined(QT_NO_FONTDIALOG) && defined(Q_WS_MAC)
-#include <qapplication.h>
-#include <qdialogbuttonbox.h>
-#include <qlineedit.h>
-#include <private/qapplication_p.h>
-#include <private/qfont_p.h>
-#include <private/qfontengine_p.h>
-#include <private/qt_cocoa_helpers_mac_p.h>
-#include <private/qt_mac_p.h>
-#include <qabstracteventdispatcher.h>
-#include <qdebug.h>
-#include <private/qfontengine_coretext_p.h>
-#import <AppKit/AppKit.h>
-#import <Foundation/Foundation.h>
-
-#if !CGFLOAT_DEFINED
-typedef float CGFloat; // Should only not be defined on 32-bit platforms
-#endif
-
-QT_BEGIN_NAMESPACE
-
-extern void macStartInterceptNSPanelCtor();
-extern void macStopInterceptNSPanelCtor();
-extern NSButton *macCreateButton(const char *text, NSView *superview);
-extern bool qt_mac_is_macsheet(const QWidget *w); // qwidget_mac.mm
-
-QT_END_NAMESPACE
-QT_USE_NAMESPACE
-
-// should a priori be kept in sync with qcolordialog_mac.mm
-const CGFloat ButtonMinWidth = 78.0;
-const CGFloat ButtonMinHeight = 32.0;
-const CGFloat ButtonSpacing = 0.0;
-const CGFloat ButtonTopMargin = 0.0;
-const CGFloat ButtonBottomMargin = 7.0;
-const CGFloat ButtonSideMargin = 9.0;
-
-// looks better with some margins
-const CGFloat DialogTopMargin = 7.0;
-const CGFloat DialogSideMargin = 9.0;
-
-const int StyleMask = NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask;
-
-@class QT_MANGLE_NAMESPACE(QCocoaFontPanelDelegate);
-
-
-#if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_5
-
-@protocol NSWindowDelegate <NSObject>
-- (NSSize)windowWillResize:(NSWindow *)window toSize:(NSSize)proposedFrameSize;
-@end
-
-#endif
-
-@interface QT_MANGLE_NAMESPACE(QCocoaFontPanelDelegate) : NSObject <NSWindowDelegate> {
- NSFontPanel *mFontPanel;
- NSView *mStolenContentView;
- NSButton *mOkButton;
- NSButton *mCancelButton;
- QFontDialogPrivate *mPriv;
- QFont *mQtFont;
- BOOL mPanelHackedWithButtons;
- CGFloat mDialogExtraWidth;
- CGFloat mDialogExtraHeight;
- int mReturnCode;
- BOOL mAppModal;
-}
-- (id)initWithFontPanel:(NSFontPanel *)panel
- stolenContentView:(NSView *)stolenContentView
- okButton:(NSButton *)okButton
- cancelButton:(NSButton *)cancelButton
- priv:(QFontDialogPrivate *)priv
- extraWidth:(CGFloat)extraWidth
- extraHeight:(CGFloat)extraHeight;
-- (void)showModelessPanel;
-- (void)showWindowModalSheet:(QWidget *)docWidget;
-- (void)runApplicationModalPanel;
-- (BOOL)isAppModal;
-- (void)changeFont:(id)sender;
-- (void)changeAttributes:(id)sender;
-- (BOOL)windowShouldClose:(id)window;
-- (NSSize)windowWillResize:(NSWindow *)window toSize:(NSSize)proposedFrameSize;
-- (void)relayout;
-- (void)relayoutToContentSize:(NSSize)frameSize;
-- (void)onOkClicked;
-- (void)onCancelClicked;
-- (NSFontPanel *)fontPanel;
-- (NSWindow *)actualPanel;
-- (NSSize)dialogExtraSize;
-- (void)setQtFont:(const QFont &)newFont;
-- (QFont)qtFont;
-- (void)finishOffWithCode:(NSInteger)result;
-- (void)cleanUpAfterMyself;
-- (void)setSubwindowStacking;
-@end
-
-static QFont qfontForCocoaFont(NSFont *cocoaFont, const QFont &resolveFont)
-{
- QFont newFont;
- if (cocoaFont) {
- int pSize = qRound([cocoaFont pointSize]);
- QString family(qt_mac_NSStringToQString([cocoaFont familyName]));
- QString typeface(qt_mac_NSStringToQString([cocoaFont fontName]));
-
- int hyphenPos = typeface.indexOf(QLatin1Char('-'));
- if (hyphenPos != -1) {
- typeface.remove(0, hyphenPos + 1);
- } else {
- typeface = QLatin1String("Normal");
- }
-
- newFont = QFontDatabase().font(family, typeface, pSize);
- newFont.setUnderline(resolveFont.underline());
- newFont.setStrikeOut(resolveFont.strikeOut());
-
- }
- return newFont;
-}
-
-@implementation QT_MANGLE_NAMESPACE(QCocoaFontPanelDelegate)
-- (id)initWithFontPanel:(NSFontPanel *)panel
- stolenContentView:(NSView *)stolenContentView
- okButton:(NSButton *)okButton
- cancelButton:(NSButton *)cancelButton
- priv:(QFontDialogPrivate *)priv
- extraWidth:(CGFloat)extraWidth
- extraHeight:(CGFloat)extraHeight
-{
- self = [super init];
- mFontPanel = panel;
- mStolenContentView = stolenContentView;
- mOkButton = okButton;
- mCancelButton = cancelButton;
- mPriv = priv;
- mPanelHackedWithButtons = (okButton != 0);
- mDialogExtraWidth = extraWidth;
- mDialogExtraHeight = extraHeight;
- mReturnCode = -1;
- mAppModal = false;
-
- if (mPanelHackedWithButtons) {
- [self relayout];
-
- [okButton setAction:@selector(onOkClicked)];
- [okButton setTarget:self];
-
- [cancelButton setAction:@selector(onCancelClicked)];
- [cancelButton setTarget:self];
- }
-
- mQtFont = new QFont();
- return self;
-}
-
-- (void)setSubwindowStacking
-{
- // Stack the native dialog in front of its parent, if any:
- QFontDialog *q = mPriv->fontDialog();
- if (!qt_mac_is_macsheet(q)) {
- if (QWidget *parent = q->parentWidget()) {
- if (parent->isWindow()) {
- [qt_mac_window_for(parent)
- addChildWindow:[mStolenContentView window] ordered:NSWindowAbove];
- }
- }
- }
-}
-
-- (void)dealloc
-{
- delete mQtFont;
- [super dealloc];
-}
-
-- (void)showModelessPanel
-{
- mAppModal = false;
- NSWindow *ourPanel = [mStolenContentView window];
- [ourPanel makeKeyAndOrderFront:self];
-}
-
-- (void)runApplicationModalPanel
-{
- QBoolBlocker nativeDialogOnTop(QApplicationPrivate::native_modal_dialog_active);
- mAppModal = true;
- NSWindow *ourPanel = [mStolenContentView window];
- [ourPanel setReleasedWhenClosed:NO];
- [NSApp runModalForWindow:ourPanel];
- QAbstractEventDispatcher::instance()->interrupt();
-
- if (mReturnCode == NSOKButton)
- mPriv->fontDialog()->accept();
- else
- mPriv->fontDialog()->reject();
-}
-
-- (BOOL)isAppModal
-{
- return mAppModal;
-}
-
-- (void)showWindowModalSheet:(QWidget *)docWidget
-{
- NSWindow *window = qt_mac_window_for(docWidget);
-
- mAppModal = false;
- NSWindow *ourPanel = [mStolenContentView window];
- [NSApp beginSheet:ourPanel
- modalForWindow:window
- modalDelegate:0
- didEndSelector:0
- contextInfo:0 ];
-
-}
-
-- (void)changeFont:(id)sender
-{
- NSFont *dummyFont = [NSFont userFontOfSize:12.0];
- [self setQtFont:qfontForCocoaFont([sender convertFont:dummyFont], *mQtFont)];
- if (mPriv)
- mPriv->updateSampleFont(*mQtFont);
-}
-
-- (void)changeAttributes:(id)sender
-{
- NSDictionary *dummyAttribs = [NSDictionary dictionary];
- NSDictionary *attribs = [sender convertAttributes:dummyAttribs];
-
- for (id key in attribs) {
- NSNumber *number = static_cast<NSNumber *>([attribs objectForKey:key]);
- if ([key isEqual:NSUnderlineStyleAttributeName]) {
- mQtFont->setUnderline([number intValue] != NSUnderlineStyleNone);
- } else if ([key isEqual:NSStrikethroughStyleAttributeName]) {
- mQtFont->setStrikeOut([number intValue] != NSUnderlineStyleNone);
- }
- }
-
- if (mPriv)
- mPriv->updateSampleFont(*mQtFont);
-}
-
-- (BOOL)windowShouldClose:(id)window
-{
- Q_UNUSED(window);
- if (mPanelHackedWithButtons) {
- [self onCancelClicked];
- } else {
- [self finishOffWithCode:NSCancelButton];
- }
- return true;
-}
-
-- (NSSize)windowWillResize:(NSWindow *)window toSize:(NSSize)proposedFrameSize
-{
- if (mFontPanel == window) {
- proposedFrameSize = [static_cast<id <NSWindowDelegate> >(mFontPanel) windowWillResize:mFontPanel toSize:proposedFrameSize];
- } else {
- /*
- Ugly hack: NSFontPanel rearranges the layout of its main
- component in windowWillResize:toSize:. So we temporarily
- restore the stolen content view to its rightful owner,
- call windowWillResize:toSize:, and steal the content view
- again.
- */
- [mStolenContentView removeFromSuperview];
- [mFontPanel setContentView:mStolenContentView];
- NSSize extraSize = [self dialogExtraSize];
- proposedFrameSize.width -= extraSize.width;
- proposedFrameSize.height -= extraSize.height;
- proposedFrameSize = [static_cast<id <NSWindowDelegate> >(mFontPanel) windowWillResize:mFontPanel toSize:proposedFrameSize];
- NSRect frameRect = { { 0.0, 0.0 }, proposedFrameSize };
- [mFontPanel setFrame:frameRect display:NO];
- [mFontPanel setContentView:0];
- [[window contentView] addSubview:mStolenContentView];
- proposedFrameSize.width += extraSize.width;
- proposedFrameSize.height += extraSize.height;
- }
- if (mPanelHackedWithButtons) {
- NSRect frameRect = { { 0.0, 0.0 }, proposedFrameSize };
- NSRect contentRect = [NSWindow contentRectForFrameRect:frameRect styleMask:[window styleMask]];
- [self relayoutToContentSize:contentRect.size];
- }
- return proposedFrameSize;
-}
-
-- (void)relayout
-{
- [self relayoutToContentSize:[[mStolenContentView superview] frame].size];
-}
-
-- (void)relayoutToContentSize:(NSSize)frameSize
-{
- Q_ASSERT(mPanelHackedWithButtons);
-
- [mOkButton sizeToFit];
- NSSize okSizeHint = [mOkButton frame].size;
-
- [mCancelButton sizeToFit];
- NSSize cancelSizeHint = [mCancelButton frame].size;
-
- const CGFloat ButtonWidth = qMin(qMax(ButtonMinWidth,
- qMax(okSizeHint.width, cancelSizeHint.width)),
- CGFloat((frameSize.width - 2.0 * ButtonSideMargin - ButtonSpacing) * 0.5));
- const CGFloat ButtonHeight = qMax(ButtonMinHeight,
- qMax(okSizeHint.height, cancelSizeHint.height));
-
- const CGFloat X = DialogSideMargin;
- const CGFloat Y = ButtonBottomMargin + ButtonHeight + ButtonTopMargin;
-
- NSRect okRect = { { frameSize.width - ButtonSideMargin - ButtonWidth,
- ButtonBottomMargin },
- { ButtonWidth, ButtonHeight } };
- [mOkButton setFrame:okRect];
- [mOkButton setNeedsDisplay:YES];
-
- NSRect cancelRect = { { okRect.origin.x - ButtonSpacing - ButtonWidth,
- ButtonBottomMargin },
- { ButtonWidth, ButtonHeight } };
- [mCancelButton setFrame:cancelRect];
- [mCancelButton setNeedsDisplay:YES];
-
- NSRect stolenCVRect = { { X, Y },
- { frameSize.width - X - X, frameSize.height - Y - DialogTopMargin } };
- [mStolenContentView setFrame:stolenCVRect];
- [mStolenContentView setNeedsDisplay:YES];
-
- [[mStolenContentView superview] setNeedsDisplay:YES];
-}
-
-- (void)onOkClicked
-{
- Q_ASSERT(mPanelHackedWithButtons);
- NSFontManager *fontManager = [NSFontManager sharedFontManager];
- [self setQtFont:qfontForCocoaFont([fontManager convertFont:[fontManager selectedFont]],
- *mQtFont)];
- [self finishOffWithCode:NSOKButton];
-}
-
-- (void)onCancelClicked
-{
- Q_ASSERT(mPanelHackedWithButtons);
- [self finishOffWithCode:NSCancelButton];
-}
-
-- (NSFontPanel *)fontPanel
-{
- return mFontPanel;
-}
-
-- (NSWindow *)actualPanel
-{
- return [mStolenContentView window];
-}
-
-- (NSSize)dialogExtraSize
-{
- // this must be recomputed each time, because sometimes the
- // NSFontPanel has the NSDocModalWindowMask flag set, and sometimes
- // not -- which affects the frame rect vs. content rect measurements
-
- // take the different frame rectangles into account for dialogExtra{Width,Height}
- NSRect someRect = { { 0.0, 0.0 }, { 100000.0, 100000.0 } };
- NSRect sharedFontPanelContentRect = [mFontPanel contentRectForFrameRect:someRect];
- NSRect ourPanelContentRect = [NSWindow contentRectForFrameRect:someRect styleMask:StyleMask];
-
- NSSize result = { mDialogExtraWidth, mDialogExtraHeight };
- result.width -= ourPanelContentRect.size.width - sharedFontPanelContentRect.size.width;
- result.height -= ourPanelContentRect.size.height - sharedFontPanelContentRect.size.height;
- return result;
-}
-
-- (void)setQtFont:(const QFont &)newFont
-{
- delete mQtFont;
- mQtFont = new QFont(newFont);
-}
-
-- (QFont)qtFont
-{
- return *mQtFont;
-}
-
-- (void)finishOffWithCode:(NSInteger)code
-{
- QFontDialog *q = mPriv->fontDialog();
- if (QWidget *parent = q->parentWidget()) {
- if (parent->isWindow()) {
- [qt_mac_window_for(parent) removeChildWindow:[mStolenContentView window]];
- }
- }
-
- if(code == NSOKButton)
- mPriv->sampleEdit->setFont([self qtFont]);
-
- if (mAppModal) {
- mReturnCode = code;
- [NSApp stopModalWithCode:code];
- } else {
- if (code == NSOKButton)
- mPriv->fontDialog()->accept();
- else
- mPriv->fontDialog()->reject();
- }
-}
-
-- (void)cleanUpAfterMyself
-{
- if (mPanelHackedWithButtons) {
- NSView *ourContentView = [mFontPanel contentView];
-
- // return stolen stuff to its rightful owner
- [mStolenContentView removeFromSuperview];
- [mFontPanel setContentView:mStolenContentView];
-
- [mOkButton release];
- [mCancelButton release];
- [ourContentView release];
- }
- [mFontPanel setDelegate:nil];
- [[NSFontManager sharedFontManager] setDelegate:nil];
- [[NSFontManager sharedFontManager] setTarget:nil];
-}
-@end
-
-QT_BEGIN_NAMESPACE
-
-void QFontDialogPrivate::closeCocoaFontPanel()
-{
- QMacCocoaAutoReleasePool pool;
- QT_MANGLE_NAMESPACE(QCocoaFontPanelDelegate) *theDelegate = static_cast<QT_MANGLE_NAMESPACE(QCocoaFontPanelDelegate) *>(delegate);
- NSWindow *ourPanel = [theDelegate actualPanel];
- [ourPanel close];
- if ([theDelegate isAppModal])
- [ourPanel release];
- [theDelegate cleanUpAfterMyself];
- [theDelegate release];
- this->delegate = 0;
- sharedFontPanelAvailable = true;
-}
-
-void QFontDialogPrivate::setFont(void *delegate, const QFont &font)
-{
- QMacCocoaAutoReleasePool pool;
- QFontEngine *fe = font.d->engineForScript(QUnicodeTables::Common);
- NSFontManager *mgr = [NSFontManager sharedFontManager];
- const NSFont *nsFont = 0;
-
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
- if (qstrcmp(fe->name(), "CoreText") == 0) {
- nsFont = reinterpret_cast<const NSFont *>(static_cast<QCoreTextFontEngineMulti *>(fe)->ctfont);
- } else
-#endif
- {
- int weight = 5;
- NSFontTraitMask mask = 0;
- if (font.style() == QFont::StyleItalic) {
- mask |= NSItalicFontMask;
- }
- if (font.weight() == QFont::Bold) {
- weight = 9;
- mask |= NSBoldFontMask;
- }
-
- NSFontManager *mgr = [NSFontManager sharedFontManager];
- QFontInfo fontInfo(font);
- nsFont = [mgr fontWithFamily:qt_mac_QStringToNSString(fontInfo.family())
- traits:mask
- weight:weight
- size:fontInfo.pointSize()];
- }
-
- [mgr setSelectedFont:const_cast<NSFont *>(nsFont) isMultiple:NO];
- [static_cast<QT_MANGLE_NAMESPACE(QCocoaFontPanelDelegate) *>(delegate) setQtFont:font];
-}
-
-void QFontDialogPrivate::createNSFontPanelDelegate()
-{
- if (delegate)
- return;
-
- sharedFontPanelAvailable = false;
- QMacCocoaAutoReleasePool pool;
- bool sharedFontPanelExisted = [NSFontPanel sharedFontPanelExists];
- NSFontPanel *sharedFontPanel = [NSFontPanel sharedFontPanel];
- [sharedFontPanel setHidesOnDeactivate:false];
-
- // hack to ensure that QCocoaApplication's validModesForFontPanel:
- // implementation is honored
- if (!sharedFontPanelExisted) {
- [sharedFontPanel makeKeyAndOrderFront:sharedFontPanel];
- [sharedFontPanel close];
- }
-
- NSPanel *ourPanel = 0;
- NSView *stolenContentView = 0;
- NSButton *okButton = 0;
- NSButton *cancelButton = 0;
-
- CGFloat dialogExtraWidth = 0.0;
- CGFloat dialogExtraHeight = 0.0;
-
- // compute dialogExtra{Width,Height}
- dialogExtraWidth = 2.0 * DialogSideMargin;
- dialogExtraHeight = DialogTopMargin + ButtonTopMargin + ButtonMinHeight + ButtonBottomMargin;
-
- // compute initial contents rectangle
- NSRect contentRect = [sharedFontPanel contentRectForFrameRect:[sharedFontPanel frame]];
- contentRect.size.width += dialogExtraWidth;
- contentRect.size.height += dialogExtraHeight;
-
- // create the new panel
- ourPanel = [[NSPanel alloc] initWithContentRect:contentRect
- styleMask:StyleMask
- backing:NSBackingStoreBuffered
- defer:YES];
- [ourPanel setReleasedWhenClosed:YES];
- stolenContentView = [sharedFontPanel contentView];
-
- // steal the font panel's contents view
- [stolenContentView retain];
- [sharedFontPanel setContentView:0];
-
- {
- // create a new content view and add the stolen one as a subview
- NSRect frameRect = { { 0.0, 0.0 }, { 0.0, 0.0 } };
- NSView *ourContentView = [[NSView alloc] initWithFrame:frameRect];
- [ourContentView addSubview:stolenContentView];
-
- // create OK and Cancel buttons and add these as subviews
- okButton = macCreateButton("&OK", ourContentView);
- cancelButton = macCreateButton("Cancel", ourContentView);
-
- [ourPanel setContentView:ourContentView];
- [ourPanel setDefaultButtonCell:[okButton cell]];
- }
-
- // create the delegate and set it
- QT_MANGLE_NAMESPACE(QCocoaFontPanelDelegate) *del = [[QT_MANGLE_NAMESPACE(QCocoaFontPanelDelegate) alloc] initWithFontPanel:sharedFontPanel
- stolenContentView:stolenContentView
- okButton:okButton
- cancelButton:cancelButton
- priv:this
- extraWidth:dialogExtraWidth
- extraHeight:dialogExtraHeight];
- delegate = del;
- [ourPanel setDelegate:del];
-
- [[NSFontManager sharedFontManager] setDelegate:del];
- [[NSFontManager sharedFontManager] setTarget:del];
- setFont(del, q_func()->currentFont());
-
- {
- // hack to get correct initial layout
- NSRect frameRect = [ourPanel frame];
- frameRect.size.width += 1.0;
- [ourPanel setFrame:frameRect display:NO];
- frameRect.size.width -= 1.0;
- frameRect.size = [del windowWillResize:ourPanel toSize:frameRect.size];
- [ourPanel setFrame:frameRect display:NO];
- [ourPanel center];
- }
- [del setSubwindowStacking];
- NSString *title = @"Select font";
- [ourPanel setTitle:title];
-}
-
-void QFontDialogPrivate::mac_nativeDialogModalHelp()
-{
- // Copied from QFileDialogPrivate
- // Do a queued meta-call to open the native modal dialog so it opens after the new
- // event loop has started to execute (in QDialog::exec). Using a timer rather than
- // a queued meta call is intentional to ensure that the call is only delivered when
- // [NSApp run] runs (timers are handeled special in cocoa). If NSApp is not
- // running (which is the case if e.g a top-most QEventLoop has been
- // interrupted, and the second-most event loop has not yet been reactivated (regardless
- // if [NSApp run] is still on the stack)), showing a native modal dialog will fail.
- if (nativeDialogInUse) {
- Q_Q(QFontDialog);
- QTimer::singleShot(1, q, SLOT(_q_macRunNativeAppModalPanel()));
- }
-}
-
-// The problem with the native font dialog is that OS X does not
-// offer a proper dialog, but a panel (i.e. without Ok and Cancel buttons).
-// This means we need to "construct" a native dialog by taking the panel
-// and "adding" the buttons.
-void QFontDialogPrivate::_q_macRunNativeAppModalPanel()
-{
- createNSFontPanelDelegate();
- QT_MANGLE_NAMESPACE(QCocoaFontPanelDelegate) *del = static_cast<QT_MANGLE_NAMESPACE(QCocoaFontPanelDelegate) *>(delegate);
- [del runApplicationModalPanel];
-}
-
-bool QFontDialogPrivate::showCocoaFontPanel()
-{
- if (!sharedFontPanelAvailable)
- return false;
-
- Q_Q(QFontDialog);
- QMacCocoaAutoReleasePool pool;
- createNSFontPanelDelegate();
- QT_MANGLE_NAMESPACE(QCocoaFontPanelDelegate) *del = static_cast<QT_MANGLE_NAMESPACE(QCocoaFontPanelDelegate) *>(delegate);
- if (qt_mac_is_macsheet(q))
- [del showWindowModalSheet:q->parentWidget()];
- else
- [del showModelessPanel];
- return true;
-}
-
-bool QFontDialogPrivate::hideCocoaFontPanel()
-{
- if (!delegate){
- // Nothing to do. We return false to leave the question
- // open regarding whether or not to go native:
- return false;
- } else {
- closeCocoaFontPanel();
- // Even when we hide it, we are still using a
- // native dialog, so return true:
- return true;
- }
-}
-bool QFontDialogPrivate::setVisible_sys(bool visible)
-{
- Q_Q(QFontDialog);
- if (!visible == q->isHidden())
- return false;
-
- return visible ? showCocoaFontPanel() : hideCocoaFontPanel();
-}
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/widgets/dialogs/qfontdialog_p.h b/src/widgets/dialogs/qfontdialog_p.h
index 9bf00d2657..75a9045d2b 100644
--- a/src/widgets/dialogs/qfontdialog_p.h
+++ b/src/widgets/dialogs/qfontdialog_p.h
@@ -143,7 +143,7 @@ public:
QPointer<QObject> receiverToDisconnectOnClose;
QByteArray memberToDisconnectOnClose;
- bool canBeNativeDialog();
+ bool canBeNativeDialog() const;
void _q_runNativeAppModalPanel();
#ifdef Q_WS_MAC
static void setFont(void *delegate, const QFont &font);
diff --git a/src/widgets/dialogs/qmessagebox.cpp b/src/widgets/dialogs/qmessagebox.cpp
index ea33dc8d0b..92915b1bb1 100644
--- a/src/widgets/dialogs/qmessagebox.cpp
+++ b/src/widgets/dialogs/qmessagebox.cpp
@@ -1371,7 +1371,7 @@ void QMessageBox::keyPressEvent(QKeyEvent *e)
for (int i = 0; i < buttons.count(); ++i) {
QAbstractButton *pb = buttons.at(i);
QKeySequence shortcut = pb->shortcut();
- if (!shortcut.isEmpty() && key == (shortcut[0] & ~Qt::MODIFIER_MASK)) {
+ if (!shortcut.isEmpty() && key == int(shortcut[0] & ~Qt::MODIFIER_MASK)) {
pb->animateClick();
return;
}
diff --git a/src/widgets/dialogs/qnspanelproxy_mac.mm b/src/widgets/dialogs/qnspanelproxy_mac.mm
deleted file mode 100644
index 403c3edc24..0000000000
--- a/src/widgets/dialogs/qnspanelproxy_mac.mm
+++ /dev/null
@@ -1,228 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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, Nokia gives you certain additional
-** rights. These rights are described in the Nokia 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.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <qdialogbuttonbox.h>
-#if defined(Q_WS_MAC)
-#include <private/qt_mac_p.h>
-#include <private/qcocoaintrospection_p.h>
-#import <AppKit/AppKit.h>
-#import <Foundation/Foundation.h>
-#import <objc/objc-class.h>
-
-QT_BEGIN_NAMESPACE
-static QWidget *currentWindow = 0;
-QT_END_NAMESPACE
-
-QT_USE_NAMESPACE
-
-@class QT_MANGLE_NAMESPACE(QNSPanelProxy);
-
-@interface QT_MANGLE_NAMESPACE(QNSPanelProxy) : NSWindow {
-}
-- (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)windowStyle
- backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation;
-- (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)windowStyle
- backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation screen:(NSScreen *)screen;
-- (id)qt_fakeInitWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)windowStyle
- backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation;
-- (id)qt_fakeInitWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)windowStyle
- backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation screen:(NSScreen *)screen;
-@end
-
-@implementation QT_MANGLE_NAMESPACE(QNSPanelProxy)
-- (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)windowStyle
- backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation
-{
- // remove evil flag
- windowStyle &= ~NSUtilityWindowMask;
- self = [self qt_fakeInitWithContentRect:contentRect styleMask:windowStyle
- backing:bufferingType defer:deferCreation];
- return self;
-}
-
-- (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)windowStyle
- backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation screen:(NSScreen *)screen
-{
- // remove evil flag
- windowStyle &= ~NSUtilityWindowMask;
- return [self qt_fakeInitWithContentRect:contentRect styleMask:windowStyle
- backing:bufferingType defer:deferCreation screen:screen];
-}
-
-- (id)qt_fakeInitWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)windowStyle
- backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation
-{
- Q_UNUSED(contentRect);
- Q_UNUSED(windowStyle);
- Q_UNUSED(bufferingType);
- Q_UNUSED(deferCreation);
- return nil;
-}
-
-- (id)qt_fakeInitWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)windowStyle
- backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation screen:(NSScreen *)screen
-{
- Q_UNUSED(contentRect);
- Q_UNUSED(windowStyle);
- Q_UNUSED(bufferingType);
- Q_UNUSED(deferCreation);
- Q_UNUSED(screen);
- return nil;
-}
-@end
-
-@class QT_MANGLE_NAMESPACE(QNSWindowProxy);
-
-@interface QT_MANGLE_NAMESPACE(QNSWindowProxy) : NSWindow {
-}
-- (void)setTitle:(NSString *)title;
-- (void)qt_fakeSetTitle:(NSString *)title;
-@end
-
-@implementation QT_MANGLE_NAMESPACE(QNSWindowProxy)
-- (void)setTitle:(NSString *)title
-{
- QCFString cftitle(currentWindow->windowTitle());
-
- // evil reverse engineering
- if ([title isEqualToString:@"Print"]
- || [title isEqualToString:@"Page Setup"]
- || [[self className] isEqualToString:@"PMPrintingWindow"])
- title = (NSString *)(static_cast<CFStringRef>(cftitle));
- return [self qt_fakeSetTitle:title];
-}
-
-- (void)qt_fakeSetTitle:(NSString *)title
-{
- Q_UNUSED(title);
-}
-@end
-
-QT_BEGIN_NAMESPACE
-
-/*
- Intercept the NSColorPanel constructor if the shared
- color panel doesn't exist yet. What's going on here is
- quite wacky, because we want to override the NSPanel
- constructor and at the same time call the old NSPanel
- constructor. So what we do is we effectively rename the
- old NSPanel constructor qt_fakeInitWithContentRect:...
- and have the new one call the old one.
-*/
-void macStartInterceptNSPanelCtor()
-{
- qt_cocoa_change_implementation(
- [NSPanel class],
- @selector(initWithContentRect:styleMask:backing:defer:),
- [QT_MANGLE_NAMESPACE(QNSPanelProxy) class],
- @selector(initWithContentRect:styleMask:backing:defer:),
- @selector(qt_fakeInitWithContentRect:styleMask:backing:defer:));
- qt_cocoa_change_implementation(
- [NSPanel class],
- @selector(initWithContentRect:styleMask:backing:defer:screen:),
- [QT_MANGLE_NAMESPACE(QNSPanelProxy) class],
- @selector(initWithContentRect:styleMask:backing:defer:screen:),
- @selector(qt_fakeInitWithContentRect:styleMask:backing:defer:screen:));
-}
-
-/*
- Restore things as they were.
-*/
-void macStopInterceptNSPanelCtor()
-{
- qt_cocoa_change_back_implementation(
- [NSPanel class],
- @selector(initWithContentRect:styleMask:backing:defer:screen:),
- @selector(qt_fakeInitWithContentRect:styleMask:backing:defer:screen:));
- qt_cocoa_change_back_implementation(
- [NSPanel class],
- @selector(initWithContentRect:styleMask:backing:defer:),
- @selector(qt_fakeInitWithContentRect:styleMask:backing:defer:));
-}
-
-/*
- Intercept the NSPrintPanel and NSPageLayout setTitle: calls. The
- hack is similar as for NSColorPanel above.
-*/
-void macStartInterceptWindowTitle(QWidget *window)
-{
- currentWindow = window;
- qt_cocoa_change_implementation(
- [NSWindow class],
- @selector(setTitle:),
- [QT_MANGLE_NAMESPACE(QNSWindowProxy) class],
- @selector(setTitle:),
- @selector(qt_fakeSetTitle:));
-}
-
-/*
- Restore things as they were.
-*/
-void macStopInterceptWindowTitle()
-{
- currentWindow = 0;
- qt_cocoa_change_back_implementation(
- [NSWindow class],
- @selector(setTitle:),
- @selector(qt_fakeSetTitle:));
-}
-
-/*
- Doesn't really belong in here.
-*/
-NSButton *macCreateButton(const char *text, NSView *superview)
-{
- static const NSRect buttonFrameRect = { { 0.0, 0.0 }, { 0.0, 0.0 } };
-
- NSButton *button = [[NSButton alloc] initWithFrame:buttonFrameRect];
- [button setButtonType:NSMomentaryLightButton];
- [button setBezelStyle:NSRoundedBezelStyle];
- [button setTitle:(NSString*)(CFStringRef)QCFString(QDialogButtonBox::tr(text)
- .remove(QLatin1Char('&')))];
- [[button cell] setFont:[NSFont systemFontOfSize:
- [NSFont systemFontSizeForControlSize:NSRegularControlSize]]];
- [superview addSubview:button];
- return button;
-}
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/widgets/graphicsview/qgraph_p.h b/src/widgets/graphicsview/qgraph_p.h
index e41bf5a5da..766c35dd0d 100644
--- a/src/widgets/graphicsview/qgraph_p.h
+++ b/src/widgets/graphicsview/qgraph_p.h
@@ -150,7 +150,7 @@ public:
// Creates a bidirectional edge
#if defined(QT_DEBUG) && 0
qDebug("Graph::createEdge(): %s",
- qPrintable(QString::fromAscii("%1-%2")
+ qPrintable(QString::fromLatin1("%1-%2")
.arg(first->toString()).arg(second->toString())));
#endif
if (edgeData(first, second)) {
@@ -167,7 +167,7 @@ public:
// Removes a bidirectional edge
#if defined(QT_DEBUG) && 0
qDebug("Graph::removeEdge(): %s",
- qPrintable(QString::fromAscii("%1-%2")
+ qPrintable(QString::fromLatin1("%1-%2")
.arg(first->toString()).arg(second->toString())));
#endif
EdgeData *data = edgeData(first, second);
@@ -180,7 +180,7 @@ public:
{
#if defined(QT_DEBUG) && 0
qDebug("Graph::takeEdge(): %s",
- qPrintable(QString::fromAscii("%1-%2")
+ qPrintable(QString::fromLatin1("%1-%2")
.arg(first->toString()).arg(second->toString())));
#endif
// Removes a bidirectional edge
@@ -236,7 +236,7 @@ public:
EdgeData *data = edgeData(v, v1);
bool forward = data->from == v;
if (forward) {
- edges += QString::fromAscii("\"%1\"->\"%2\" [label=\"[%3,%4,%5,%6,%7]\" color=\"#000000\"] \n")
+ edges += QString::fromLatin1("\"%1\"->\"%2\" [label=\"[%3,%4,%5,%6,%7]\" color=\"#000000\"] \n")
.arg(v->toString())
.arg(v1->toString())
.arg(data->minSize)
@@ -247,9 +247,9 @@ public:
;
}
}
- strVertices += QString::fromAscii("\"%1\" [label=\"%2\"]\n").arg(v->toString()).arg(v->toString());
+ strVertices += QString::fromLatin1("\"%1\" [label=\"%2\"]\n").arg(v->toString()).arg(v->toString());
}
- return QString::fromAscii("%1\n%2\n").arg(strVertices).arg(edges);
+ return QString::fromLatin1("%1\n%2\n").arg(strVertices).arg(edges);
}
#endif
diff --git a/src/widgets/graphicsview/qgraphicsanchorlayout_p.cpp b/src/widgets/graphicsview/qgraphicsanchorlayout_p.cpp
index 3d20f0b07c..a935179a2a 100644
--- a/src/widgets/graphicsview/qgraphicsanchorlayout_p.cpp
+++ b/src/widgets/graphicsview/qgraphicsanchorlayout_p.cpp
@@ -611,10 +611,10 @@ QString GraphPath::toString() const
{
QString string(QLatin1String("Path: "));
foreach(AnchorData *edge, positives)
- string += QString::fromAscii(" (+++) %1").arg(edge->toString());
+ string += QString::fromLatin1(" (+++) %1").arg(edge->toString());
foreach(AnchorData *edge, negatives)
- string += QString::fromAscii(" (---) %1").arg(edge->toString());
+ string += QString::fromLatin1(" (---) %1").arg(edge->toString());
return string;
}
@@ -765,9 +765,9 @@ static AnchorData *createSequence(Graph<AnchorVertex, AnchorData> *graph,
#if defined(QT_DEBUG) && 0
QString strVertices;
for (int i = 0; i < vertices.count(); ++i) {
- strVertices += QString::fromAscii("%1 - ").arg(vertices.at(i)->toString());
+ strVertices += QString::fromLatin1("%1 - ").arg(vertices.at(i)->toString());
}
- QString strPath = QString::fromAscii("%1 - %2%3").arg(before->toString(), strVertices, after->toString());
+ QString strPath = QString::fromLatin1("%1 - %2%3").arg(before->toString(), strVertices, after->toString());
qDebug("simplifying [%s] to [%s - %s]", qPrintable(strPath), qPrintable(before->toString()), qPrintable(after->toString()));
#endif
@@ -847,7 +847,7 @@ bool QGraphicsAnchorLayoutPrivate::simplifyGraph(Orientation orientation)
static int count = 0;
if (orientation == Horizontal) {
count++;
- dumpGraph(QString::fromAscii("%1-full").arg(count));
+ dumpGraph(QString::fromLatin1("%1-full").arg(count));
}
#endif
@@ -872,8 +872,8 @@ bool QGraphicsAnchorLayoutPrivate::simplifyGraph(Orientation orientation)
}
#if defined(QT_DEBUG) && 0
- dumpGraph(QString::fromAscii("%1-simplified-%2").arg(count).arg(
- QString::fromAscii(orientation == Horizontal ? "Horizontal" : "Vertical")));
+ dumpGraph(QString::fromLatin1("%1-simplified-%2").arg(count).arg(
+ QString::fromLatin1(orientation == Horizontal ? "Horizontal" : "Vertical")));
#endif
return true;
@@ -903,7 +903,7 @@ bool QGraphicsAnchorLayoutPrivate::replaceVertex(Orientation orientation, Anchor
AnchorVertex *otherV = replaceVertex_helper(ad, oldV, newV);
#if defined(QT_DEBUG)
- ad->name = QString::fromAscii("%1 --to--> %2").arg(ad->from->toString()).arg(ad->to->toString());
+ ad->name = QString::fromLatin1("%1 --to--> %2").arg(ad->from->toString()).arg(ad->to->toString());
#endif
bool newFeasible;
@@ -1766,7 +1766,7 @@ void QGraphicsAnchorLayoutPrivate::addAnchor_helper(QGraphicsLayoutItem *firstIt
data->from = v1;
data->to = v2;
#ifdef QT_DEBUG
- data->name = QString::fromAscii("%1 --to--> %2").arg(v1->toString()).arg(v2->toString());
+ data->name = QString::fromLatin1("%1 --to--> %2").arg(v1->toString()).arg(v2->toString());
#endif
// ### bit to track internal anchors, since inside AnchorData methods
// we don't have access to the 'q' pointer.
@@ -2999,11 +2999,11 @@ bool QGraphicsAnchorLayoutPrivate::hasConflicts() const
#ifdef QT_DEBUG
void QGraphicsAnchorLayoutPrivate::dumpGraph(const QString &name)
{
- QFile file(QString::fromAscii("anchorlayout.%1.dot").arg(name));
+ QFile file(QString::fromLatin1("anchorlayout.%1.dot").arg(name));
if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate))
qWarning("Could not write to %s", file.fileName().toLocal8Bit().constData());
- QString str = QString::fromAscii("digraph anchorlayout {\nnode [shape=\"rect\"]\n%1}");
+ QString str = QString::fromLatin1("digraph anchorlayout {\nnode [shape=\"rect\"]\n%1}");
QString dotContents = graph[0].serializeToDot();
dotContents += graph[1].serializeToDot();
file.write(str.arg(dotContents).toLocal8Bit());
diff --git a/src/widgets/graphicsview/qgraphicsanchorlayout_p.h b/src/widgets/graphicsview/qgraphicsanchorlayout_p.h
index 328461a363..df1db84ee8 100644
--- a/src/widgets/graphicsview/qgraphicsanchorlayout_p.h
+++ b/src/widgets/graphicsview/qgraphicsanchorlayout_p.h
@@ -181,7 +181,7 @@ struct AnchorData : public QSimplexVariable {
#ifdef QT_DEBUG
inline QString AnchorData::toString() const
{
- return QString::fromAscii("Anchor(%1)").arg(name);
+ return QString::fromLatin1("Anchor(%1)").arg(name);
}
#endif
@@ -193,7 +193,7 @@ struct SequentialAnchorData : public AnchorData
type = AnchorData::Sequential;
orientation = m_edges.at(0)->orientation;
#ifdef QT_DEBUG
- name = QString::fromAscii("%1 -- %2").arg(vertices.first()->toString(), vertices.last()->toString());
+ name = QString::fromLatin1("%1 -- %2").arg(vertices.first()->toString(), vertices.last()->toString());
#endif
}
@@ -221,7 +221,7 @@ struct ParallelAnchorData : public AnchorData
from = first->from;
to = first->to;
#ifdef QT_DEBUG
- name = QString::fromAscii("%1 | %2").arg(first->toString(), second->toString());
+ name = QString::fromLatin1("%1 | %2").arg(first->toString(), second->toString());
#endif
}
@@ -263,9 +263,9 @@ inline QString AnchorVertex::toString() const
return QLatin1String("NULL");
} else if (m_type == Pair) {
const AnchorVertexPair *vp = static_cast<const AnchorVertexPair *>(this);
- return QString::fromAscii("(%1, %2)").arg(vp->m_first->toString()).arg(vp->m_second->toString());
+ return QString::fromLatin1("(%1, %2)").arg(vp->m_first->toString()).arg(vp->m_second->toString());
} else if (!m_item) {
- return QString::fromAscii("NULL_%1").arg(quintptr(this));
+ return QString::fromLatin1("NULL_%1").arg(quintptr(this));
}
QString edge;
switch (m_edge) {
diff --git a/src/widgets/graphicsview/qgraphicswidget.cpp b/src/widgets/graphicsview/qgraphicswidget.cpp
index 5ac2269ff1..1f45582442 100644
--- a/src/widgets/graphicsview/qgraphicswidget.cpp
+++ b/src/widgets/graphicsview/qgraphicswidget.cpp
@@ -2410,7 +2410,7 @@ void QGraphicsWidget::dumpFocusChain()
qWarning("Found a focus chain that is not circular, (next == 0)");
break;
}
- qDebug() << i++ << QString::number(uint(next), 16) << next->className() << next->data(0) << QString::fromAscii("focusItem:%1").arg(next->hasFocus() ? '1' : '0') << QLatin1String("next:") << next->d_func()->focusNext->data(0) << QLatin1String("prev:") << next->d_func()->focusPrev->data(0);
+ qDebug() << i++ << QString::number(uint(next), 16) << next->className() << next->data(0) << QString::fromLatin1("focusItem:%1").arg(next->hasFocus() ? '1' : '0') << QLatin1String("next:") << next->d_func()->focusNext->data(0) << QLatin1String("prev:") << next->d_func()->focusPrev->data(0);
if (visited.contains(next)) {
qWarning("Already visited this node. However, I expected to dump until I found myself.");
break;
diff --git a/src/widgets/graphicsview/qgridlayoutengine.cpp b/src/widgets/graphicsview/qgridlayoutengine.cpp
index b981ed651a..f45fe44b34 100644
--- a/src/widgets/graphicsview/qgridlayoutengine.cpp
+++ b/src/widgets/graphicsview/qgridlayoutengine.cpp
@@ -783,11 +783,11 @@ void QGridLayoutRowInfo::dump(int indent) const
QString message;
if (stretches.value(i).value() >= 0)
- message += QString::fromAscii(" stretch %1").arg(stretches.value(i).value());
+ message += QString::fromLatin1(" stretch %1").arg(stretches.value(i).value());
if (spacings.value(i).value() >= 0.0)
- message += QString::fromAscii(" spacing %1").arg(spacings.value(i).value());
+ message += QString::fromLatin1(" spacing %1").arg(spacings.value(i).value());
if (alignments.value(i) != 0)
- message += QString::fromAscii(" alignment %1").arg(int(alignments.value(i)), 16);
+ message += QString::fromLatin1(" alignment %1").arg(int(alignments.value(i)), 16);
if (!message.isEmpty() || boxes.value(i) != QGridLayoutBox()) {
qDebug("%*s Row %d:%s", indent, "", i, qPrintable(message));
diff --git a/src/widgets/graphicsview/qsimplex_p.cpp b/src/widgets/graphicsview/qsimplex_p.cpp
index f5816e2d3c..e6a3dee519 100644
--- a/src/widgets/graphicsview/qsimplex_p.cpp
+++ b/src/widgets/graphicsview/qsimplex_p.cpp
@@ -356,14 +356,14 @@ void QSimplex::dumpMatrix()
QString str(QLatin1String(" "));
for (int j = 0; j < columns; ++j)
- str += QString::fromAscii(" <%1 >").arg(j, 2);
+ str += QString::fromLatin1(" <%1 >").arg(j, 2);
qDebug("%s", qPrintable(str));
for (int i = 0; i < rows; ++i) {
- str = QString::fromAscii("Row %1:").arg(i, 2);
+ str = QString::fromLatin1("Row %1:").arg(i, 2);
qreal *row = matrix + i * columns;
for (int j = 0; j < columns; ++j)
- str += QString::fromAscii("%1").arg(row[j], 7, 'f', 2);
+ str += QString::fromLatin1("%1").arg(row[j], 7, 'f', 2);
qDebug("%s", qPrintable(str));
}
qDebug("------------------------\n");
diff --git a/src/widgets/graphicsview/qsimplex_p.h b/src/widgets/graphicsview/qsimplex_p.h
index 00ed0b9957..0208ce5537 100644
--- a/src/widgets/graphicsview/qsimplex_p.h
+++ b/src/widgets/graphicsview/qsimplex_p.h
@@ -123,22 +123,22 @@ struct QSimplexConstraint
#ifdef QT_DEBUG
QString toString() {
QString result;
- result += QString::fromAscii("-- QSimplexConstraint %1 --").arg(quintptr(this), 0, 16);
+ result += QString::fromLatin1("-- QSimplexConstraint %1 --").arg(quintptr(this), 0, 16);
QHash<QSimplexVariable *, qreal>::const_iterator iter;
for (iter = variables.constBegin(); iter != variables.constEnd(); ++iter) {
- result += QString::fromAscii(" %1 x %2").arg(iter.value()).arg(quintptr(iter.key()), 0, 16);
+ result += QString::fromLatin1(" %1 x %2").arg(iter.value()).arg(quintptr(iter.key()), 0, 16);
}
switch (ratio) {
case LessOrEqual:
- result += QString::fromAscii(" (less) <= %1").arg(constant);
+ result += QString::fromLatin1(" (less) <= %1").arg(constant);
break;
case MoreOrEqual:
- result += QString::fromAscii(" (more) >= %1").arg(constant);
+ result += QString::fromLatin1(" (more) >= %1").arg(constant);
break;
default:
- result += QString::fromAscii(" (eqal) == %1").arg(constant);
+ result += QString::fromLatin1(" (eqal) == %1").arg(constant);
}
return result;
diff --git a/src/widgets/itemviews/qtreeview.cpp b/src/widgets/itemviews/qtreeview.cpp
index be78cdbf14..04835b63b4 100644
--- a/src/widgets/itemviews/qtreeview.cpp
+++ b/src/widgets/itemviews/qtreeview.cpp
@@ -1343,39 +1343,16 @@ void QTreeViewPrivate::_q_modelDestroyed()
QItemViewPaintPairs QTreeViewPrivate::draggablePaintPairs(const QModelIndexList &indexes, QRect *r) const
{
Q_ASSERT(r);
- return QAbstractItemViewPrivate::draggablePaintPairs(indexes, r);
Q_Q(const QTreeView);
- QRect &rect = *r;
- const QRect viewportRect = viewport->rect();
- int itemOffset = 0;
- int row = firstVisibleItem(&itemOffset);
- QPair<int, int> startEnd = startAndEndColumns(viewportRect);
- QVector<int> columns;
- for (int i = startEnd.first; i <= startEnd.second; ++i) {
- int logical = header->logicalIndex(i);
- if (!header->isSectionHidden(logical))
- columns += logical;
- }
- QSet<QModelIndex> visibleIndexes;
- for (; itemOffset < viewportRect.bottom() && row < viewItems.count(); ++row) {
- const QModelIndex &index = viewItems.at(row).index;
- for (int colIndex = 0; colIndex < columns.count(); ++colIndex)
- visibleIndexes += index.sibling(index.row(), columns.at(colIndex));
- itemOffset += itemHeight(row);
- }
-
- //now that we have the visible indexes, we can try to find those which are selected
- QItemViewPaintPairs ret;
- for (int i = 0; i < indexes.count(); ++i) {
- const QModelIndex &index = indexes.at(i);
- if (visibleIndexes.contains(index)) {
- const QRect current = q->visualRect(index);
- ret += qMakePair(current, index);
- rect |= current;
- }
- }
- rect &= viewportRect;
- return ret;
+ if (spanningIndexes.isEmpty())
+ return QAbstractItemViewPrivate::draggablePaintPairs(indexes, r);
+ QModelIndexList list;
+ foreach (const QModelIndex &idx, indexes) {
+ if (idx.column() > 0 && q->isFirstColumnSpanned(idx.row(), idx.parent()))
+ continue;
+ list << idx;
+ }
+ return QAbstractItemViewPrivate::draggablePaintPairs(list, r);
}
void QTreeViewPrivate::adjustViewOptionsForIndex(QStyleOptionViewItemV4 *option, const QModelIndex &current) const
@@ -1390,7 +1367,10 @@ void QTreeViewPrivate::adjustViewOptionsForIndex(QStyleOptionViewItemV4 *option,
QVector<int> logicalIndices; // index = visual index of visible columns only. data = logical index.
QVector<QStyleOptionViewItemV4::ViewItemPosition> viewItemPosList; // vector of left/middle/end for each logicalIndex, visible columns only.
- calcLogicalIndices(&logicalIndices, &viewItemPosList);
+ const bool spanning = viewItems.at(row).spanning;
+ const int left = (spanning ? header->visualIndex(0) : 0);
+ const int right = (spanning ? header->visualIndex(0) : header->count() - 1 );
+ calcLogicalIndices(&logicalIndices, &viewItemPosList, left, right);
int columnIndex = 0;
for (int visualIndex = 0; visualIndex < current.column(); ++visualIndex) {
@@ -1488,10 +1468,8 @@ static inline bool ancestorOf(QObject *widget, QObject *other)
return false;
}
-void QTreeViewPrivate::calcLogicalIndices(QVector<int> *logicalIndices, QVector<QStyleOptionViewItemV4::ViewItemPosition> *itemPositions) const
+void QTreeViewPrivate::calcLogicalIndices(QVector<int> *logicalIndices, QVector<QStyleOptionViewItemV4::ViewItemPosition> *itemPositions, int left, int right) const
{
- const int left = (spanning ? header->visualIndex(0) : leftAndRight.first);
- const int right = (spanning ? header->visualIndex(0) : leftAndRight.second);
const int columnCount = header->count();
/* 'left' and 'right' are the left-most and right-most visible visual indices.
Compute the first visible logical indices before and after the left and right.
@@ -1615,7 +1593,7 @@ void QTreeView::drawRow(QPainter *painter, const QStyleOptionViewItem &option,
QVector<int> logicalIndices;
QVector<QStyleOptionViewItemV4::ViewItemPosition> viewItemPosList; // vector of left/middle/end for each logicalIndex
- d->calcLogicalIndices(&logicalIndices, &viewItemPosList);
+ d->calcLogicalIndices(&logicalIndices, &viewItemPosList, left, right);
for (int currentLogicalSection = 0; currentLogicalSection < logicalIndices.count(); ++currentLogicalSection) {
int headerSection = logicalIndices.at(currentLogicalSection);
diff --git a/src/widgets/itemviews/qtreeview_p.h b/src/widgets/itemviews/qtreeview_p.h
index c8fb8853a6..091420e49e 100644
--- a/src/widgets/itemviews/qtreeview_p.h
+++ b/src/widgets/itemviews/qtreeview_p.h
@@ -170,7 +170,7 @@ public:
// logicalIndices: vector of currently visibly logical indices
// itemPositions: vector of view item positions (beginning/middle/end/onlyone)
- void calcLogicalIndices(QVector<int> *logicalIndices, QVector<QStyleOptionViewItemV4::ViewItemPosition> *itemPositions) const;
+ void calcLogicalIndices(QVector<int> *logicalIndices, QVector<QStyleOptionViewItemV4::ViewItemPosition> *itemPositions, int left, int right) const;
QHeaderView *header;
int indent;
diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp
index f672aef0eb..734c737e84 100644
--- a/src/widgets/kernel/qapplication.cpp
+++ b/src/widgets/kernel/qapplication.cpp
@@ -1954,13 +1954,11 @@ bool QApplication::event(QEvent *e)
}
/*!
+ \fn void QApplication::syncX()
Was used to synchronize with the X server in 4.x, here for source compatibility.
\internal
\obsolete
*/
-void QApplication::syncX()
-{
-}
void QApplicationPrivate::notifyLayoutDirectionChange()
{
@@ -2980,6 +2978,8 @@ bool QApplication::notify(QObject *receiver, QEvent *e)
d->checkReceiverThread(receiver);
#endif
+ QGuiApplicationPrivate::sendQWindowEventToQPlatformWindow(qobject_cast<QWindow *>(receiver), e);
+
// capture the current mouse/keyboard state
if(e->spontaneous()) {
if (e->type() == QEvent::MouseButtonPress
@@ -4245,26 +4245,20 @@ int QApplication::keyboardInputInterval()
*/
/*!
+ \fn QLocale QApplication::keyboardInputLocale()
\since 4.2
\obsolete
Returns the current keyboard input locale. Replaced with QInputMethod::locale()
*/
-QLocale QApplication::keyboardInputLocale()
-{
- return qApp ? qApp->inputMethod()->locale() : QLocale::c();
-}
/*!
+ \fn Qt::LayoutDirection QApplication::keyboardInputDirection()*
\since 4.2
\obsolete
Returns the current keyboard input direction. Replaced with QInputMethod::inputDirection()
*/
-Qt::LayoutDirection QApplication::keyboardInputDirection()
-{
- return qApp ? qApp->inputMethod()->inputDirection() : Qt::LeftToRight;
-}
bool qt_sendSpontaneousEvent(QObject *receiver, QEvent *event)
{
diff --git a/src/widgets/kernel/qapplication.h b/src/widgets/kernel/qapplication.h
index 206692e6d4..4aac97aece 100644
--- a/src/widgets/kernel/qapplication.h
+++ b/src/widgets/kernel/qapplication.h
@@ -97,7 +97,9 @@ class Q_WIDGETS_EXPORT QApplication : public QGuiApplication
public:
QApplication(int &argc, char **argv, int = ApplicationFlags);
+#ifdef QT_DEPRECATED
QT_DEPRECATED QApplication(int &argc, char **argv, bool GUIenabled, int = ApplicationFlags);
+#endif
QApplication(int &argc, char **argv, Type, int = ApplicationFlags);
virtual ~QApplication();
@@ -145,7 +147,9 @@ public:
static QWidget *topLevelAt(const QPoint &p);
static inline QWidget *topLevelAt(int x, int y) { return topLevelAt(QPoint(x, y)); }
- QT_DEPRECATED static void syncX();
+#if QT_DEPRECATED_SINCE(5, 0)
+ QT_DEPRECATED static inline void syncX() {}
+#endif
static void beep();
static void alert(QWidget *widget, int duration = 0);
@@ -182,8 +186,12 @@ public:
virtual void saveState(QSessionManager& sm);
#endif
- QT_DEPRECATED static QLocale keyboardInputLocale();
- QT_DEPRECATED static Qt::LayoutDirection keyboardInputDirection();
+#if QT_DEPRECATED_SINCE(5, 0)
+ QT_DEPRECATED static QLocale keyboardInputLocale()
+ { return qApp ? qApp->inputMethod()->locale() : QLocale::c(); }
+ QT_DEPRECATED static Qt::LayoutDirection keyboardInputDirection()
+ { return qApp ? qApp->inputMethod()->inputDirection() : Qt::LeftToRight; }
+#endif
static int exec();
bool notify(QObject *, QEvent *);
diff --git a/src/widgets/kernel/qapplication_p.h b/src/widgets/kernel/qapplication_p.h
index 8f67a29d84..b1f510c5a5 100644
--- a/src/widgets/kernel/qapplication_p.h
+++ b/src/widgets/kernel/qapplication_p.h
@@ -198,7 +198,7 @@ public:
static void dispatchEnterLeave(QWidget *enter, QWidget *leave);
//modality
- Q_DECL_OVERRIDE bool isWindowBlocked(QWindow *window, QWindow **blockingWindow = 0) const;
+ bool isWindowBlocked(QWindow *window, QWindow **blockingWindow = 0) const Q_DECL_OVERRIDE;
static bool isBlockedByModal(QWidget *widget);
static bool modalState();
static bool tryModalHelper(QWidget *widget, QWidget **rettop = 0);
@@ -346,8 +346,9 @@ public:
static HWND getHWNDForWidget(const QWidget *widget)
{
if (QWindow *window = windowForWidget(widget))
- return static_cast<HWND> (QGuiApplication::platformNativeInterface()->
- nativeResourceForWindow(QByteArrayLiteral("handle"), window));
+ if (window->handle())
+ return static_cast<HWND> (QGuiApplication::platformNativeInterface()->
+ nativeResourceForWindow(QByteArrayLiteral("handle"), window));
return 0;
}
#endif
diff --git a/src/widgets/kernel/qicon.cpp b/src/widgets/kernel/qicon.cpp
index 369e26c21e..62c99a64c8 100644
--- a/src/widgets/kernel/qicon.cpp
+++ b/src/widgets/kernel/qicon.cpp
@@ -266,7 +266,7 @@ QPixmap QPixmapIconEngine::pixmap(const QSize &size, QIcon::Mode mode, QIcon::St
actualSize.scale(size, Qt::KeepAspectRatio);
// #### Qt5 no idea what this really does, but we need to remove the QApp and style references
- QString key = QLatin1Literal("qt_")
+ QString key = QLatin1String("qt_")
% HexString<quint64>(pm.cacheKey())
% HexString<uint>(pe->mode)
% HexString<quint64>(QApplication::palette().cacheKey())
diff --git a/src/widgets/kernel/qiconloader.cpp b/src/widgets/kernel/qiconloader.cpp
index a0ee95c80c..e1828fd1f1 100644
--- a/src/widgets/kernel/qiconloader.cpp
+++ b/src/widgets/kernel/qiconloader.cpp
@@ -507,7 +507,7 @@ QPixmap PixmapEntry::pixmap(const QSize &size, QIcon::Mode mode, QIcon::State st
basePixmap.load(filename);
int actualSize = qMin(size.width(), size.height());
- QString key = QLatin1Literal("$qt_theme_")
+ QString key = QLatin1String("$qt_theme_")
% HexString<qint64>(basePixmap.cacheKey())
% HexString<int>(mode)
% HexString<qint64>(qApp->palette().cacheKey())
diff --git a/src/widgets/kernel/qlayoutitem.cpp b/src/widgets/kernel/qlayoutitem.cpp
index 8e08f5f39f..6cf3e1fe42 100644
--- a/src/widgets/kernel/qlayoutitem.cpp
+++ b/src/widgets/kernel/qlayoutitem.cpp
@@ -564,10 +564,8 @@ Qt::Orientations QWidgetItem::expandingDirections() const
Qt::Orientations e = wid->sizePolicy().expandingDirections();
/*
- ### Qt 4.0:
If the layout is expanding, we make the widget expanding, even if
- its own size policy isn't expanding. This behavior should be
- reconsidered.
+ its own size policy isn't expanding.
*/
if (wid->layout()) {
if (wid->sizePolicy().horizontalPolicy() & QSizePolicy::GrowFlag
diff --git a/src/widgets/kernel/qplatformmenu_qpa.cpp b/src/widgets/kernel/qplatformmenu_qpa.cpp
index cf11ed811d..95a70d9dcd 100644
--- a/src/widgets/kernel/qplatformmenu_qpa.cpp
+++ b/src/widgets/kernel/qplatformmenu_qpa.cpp
@@ -43,18 +43,30 @@
QT_BEGIN_NAMESPACE
-//
-// QPlatformMenuAction
-//
+/*!
+ \class QPlatformMenuAction
+ \since 5.0
+ \internal
+ \preliminary
+ \ingroup qpa
+
+ \brief The QPlatformMenuAction class provides an abstraction for menu actions.
+ */
QPlatformMenuAction::~QPlatformMenuAction()
{
}
-//
-// QPlatformMenu
-//
+/*!
+ \class QPlatformMenu
+ \since 5.0
+ \internal
+ \preliminary
+ \ingroup qpa
+
+ \brief The QPlatformMenu class provides an abstraction for menus.
+ */
QPlatformMenu::QPlatformMenu()
{
}
@@ -74,9 +86,15 @@ void QPlatformMenu::syncSeparatorsCollapsible(bool enable)
Q_UNUSED(enable);
}
-//
-// QPlatformMenuBar
-//
+/*!
+ \class QPlatformMenuBar
+ \since 5.0
+ \internal
+ \preliminary
+ \ingroup qpa
+
+ \brief The QPlatformMenuBar class provides an abstraction for menu bars.
+ */
QPlatformMenuBar::QPlatformMenuBar()
{
diff --git a/src/widgets/kernel/qwhatsthis.cpp b/src/widgets/kernel/qwhatsthis.cpp
index 9d3493dc8a..5df69be020 100644
--- a/src/widgets/kernel/qwhatsthis.cpp
+++ b/src/widgets/kernel/qwhatsthis.cpp
@@ -47,6 +47,7 @@
#include "qdesktopwidget.h"
#include "qevent.h"
#include "qpixmap.h"
+#include "qscreen.h"
#include "qpainter.h"
#include "qtimer.h"
#include "qhash.h"
@@ -232,8 +233,8 @@ QWhatsThat::~QWhatsThat()
void QWhatsThat::showEvent(QShowEvent *)
{
- background = QPixmap::grabWindow(QApplication::desktop()->internalWinId(),
- x(), y(), width(), height());
+ background = QGuiApplication::primaryScreen()->grabWindow(QApplication::desktop()->internalWinId(),
+ x(), y(), width(), height());
}
void QWhatsThat::mousePressEvent(QMouseEvent* e)
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp
index 648b78dbf6..9abba54390 100644
--- a/src/widgets/kernel/qwidget.cpp
+++ b/src/widgets/kernel/qwidget.cpp
@@ -10322,20 +10322,30 @@ void QWidget::setWindowModified(bool mod)
Q_D(QWidget);
setAttribute(Qt::WA_WindowModified, mod);
-#ifndef Q_WS_MAC
- if (!windowTitle().contains(QLatin1String("[*]")) && mod)
- qWarning("QWidget::setWindowModified: The window title does not contain a '[*]' placeholder");
-#endif
- d->setWindowTitle_helper(windowTitle());
- d->setWindowIconText_helper(windowIconText());
-#ifdef Q_WS_MAC
- d->setWindowModified_sys(mod);
-#endif
+ d->setWindowModified_helper();
QEvent e(QEvent::ModifiedChange);
QApplication::sendEvent(this, &e);
}
+void QWidgetPrivate::setWindowModified_helper()
+{
+ Q_Q(QWidget);
+ QWindow *window = q->windowHandle();
+ if (!window)
+ return;
+ QPlatformWindow *platformWindow = window->handle();
+ if (!platformWindow)
+ return;
+ bool on = q->testAttribute(Qt::WA_WindowModified);
+ if (!platformWindow->setWindowModified(on)) {
+ if (!q->windowTitle().contains(QLatin1String("[*]")) && on)
+ qWarning("QWidget::setWindowModified: The window title does not contain a '[*]' placeholder");
+ setWindowTitle_helper(q->windowTitle());
+ setWindowIconText_helper(q->windowIconText());
+ }
+}
+
#ifndef QT_NO_TOOLTIP
/*!
\property QWidget::toolTip
diff --git a/src/widgets/kernel/qwidget_p.h b/src/widgets/kernel/qwidget_p.h
index d3fcdce6a8..d7c0ec75b0 100644
--- a/src/widgets/kernel/qwidget_p.h
+++ b/src/widgets/kernel/qwidget_p.h
@@ -466,6 +466,7 @@ public:
void setWindowTitle_helper(const QString &cap);
void setWindowFilePath_helper(const QString &filePath);
+ void setWindowModified_helper();
bool setMinimumSize_helper(int &minw, int &minh);
bool setMaximumSize_helper(int &maxw, int &maxh);
@@ -745,7 +746,6 @@ public:
void update_sys(const QRect &rect);
void update_sys(const QRegion &rgn);
void setGeometry_sys_helper(int, int, int, int, bool);
- void setWindowModified_sys(bool b);
void updateMaximizeButton_sys();
void setWindowFilePath_sys(const QString &filePath);
void createWindow_sys();
diff --git a/src/widgets/kernel/qwidget_qpa.cpp b/src/widgets/kernel/qwidget_qpa.cpp
index 63c02a557c..a8175455b2 100644
--- a/src/widgets/kernel/qwidget_qpa.cpp
+++ b/src/widgets/kernel/qwidget_qpa.cpp
@@ -140,6 +140,7 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO
q->setAttribute(Qt::WA_PaintOnScreen, true);
}
+ setWindowModified_helper();
setWinId(win->winId());
// first check children. and create them if necessary
diff --git a/src/widgets/kernel/qwidgetsvariant.cpp b/src/widgets/kernel/qwidgetsvariant.cpp
index f6817cec8a..15935a5886 100644
--- a/src/widgets/kernel/qwidgetsvariant.cpp
+++ b/src/widgets/kernel/qwidgetsvariant.cpp
@@ -62,7 +62,8 @@ static void construct(QVariant::Private *x, const void *copy)
v_construct<QSizePolicy>(x, copy);
break;
default:
- Q_ASSERT(false);
+ qWarning("Trying to construct an instance of an invalid type, type id: %i", x->type);
+ x->type = QVariant::Invalid;
return;
}
x->is_null = !copy;
diff --git a/src/widgets/kernel/qwidgetwindow_qpa.cpp b/src/widgets/kernel/qwidgetwindow_qpa.cpp
index d124ec768a..0a45cce62e 100644
--- a/src/widgets/kernel/qwidgetwindow_qpa.cpp
+++ b/src/widgets/kernel/qwidgetwindow_qpa.cpp
@@ -478,7 +478,7 @@ void QWidgetWindow::handleWindowStateChangedEvent(QWindowStateChangeEvent *event
// Sent event if the state changed (that is, it is not triggered by
// QWidget::setWindowState(), which also sends an event to the widget).
- if (widgetState != m_widget->data->window_state) {
+ if (widgetState != int(m_widget->data->window_state)) {
m_widget->data->window_state = widgetState;
QWindowStateChangeEvent widgetEvent(eventState);
QGuiApplication::sendSpontaneousEvent(m_widget, &widgetEvent);
diff --git a/src/widgets/styles/qgtkstyle.cpp b/src/widgets/styles/qgtkstyle.cpp
index 87d335baad..dbaee40913 100644
--- a/src/widgets/styles/qgtkstyle.cpp
+++ b/src/widgets/styles/qgtkstyle.cpp
@@ -707,7 +707,7 @@ void QGtkStyle::drawPrimitive(PrimitiveElement element,
// thin rectangular images
const int pmSize = 64;
const int border = proxy()->pixelMetric(PM_DefaultFrameWidth, option, widget);
- const QString pmKey = QLatin1Literal("windowframe") % HexString<uint>(option->state);
+ const QString pmKey = QLatin1String("windowframe") % HexString<uint>(option->state);
QPixmap pixmap;
QRect pmRect(QPoint(0,0), QSize(pmSize, pmSize));
diff --git a/src/widgets/styles/qgtkstyle_p.cpp b/src/widgets/styles/qgtkstyle_p.cpp
index 0402859e31..37edf5d786 100644
--- a/src/widgets/styles/qgtkstyle_p.cpp
+++ b/src/widgets/styles/qgtkstyle_p.cpp
@@ -74,7 +74,21 @@
#include <QtWidgets/QToolBar>
#include <QtWidgets/QToolButton>
-#include <private/qt_x11_p.h>
+// X11 Includes:
+
+// the following is necessary to work around breakage in many versions
+// of XFree86's Xlib.h still in use
+// ### which versions?
+#if defined(_XLIB_H_) // crude hack, but...
+#error "cannot include <X11/Xlib.h> before this file"
+#endif
+#define XRegisterIMInstantiateCallback qt_XRegisterIMInstantiateCallback
+#define XUnregisterIMInstantiateCallback qt_XUnregisterIMInstantiateCallback
+#define XSetIMValues qt_XSetIMValues
+#include <X11/Xlib.h>
+#undef XRegisterIMInstantiateCallback
+#undef XUnregisterIMInstantiateCallback
+#undef XSetIMValues
QT_BEGIN_NAMESPACE
@@ -982,7 +996,7 @@ QString QGtkStylePrivate::openFilename(QWidget *parent, const QString &caption,
QWidget modal_widget;
modal_widget.setAttribute(Qt::WA_NoChildEventsForParent, true);
modal_widget.setParent(parent, Qt::Window);
- QApplicationPrivate::enterModal(&modal_widget);
+ QGuiApplicationPrivate::showModalWindow(modal_widget.windowHandle());
QString filename;
if (QGtkStylePrivate::gtk_dialog_run ((GtkDialog*)gtkFileChooser) == GTK_RESPONSE_ACCEPT) {
@@ -995,7 +1009,7 @@ QString QGtkStylePrivate::openFilename(QWidget *parent, const QString &caption,
}
}
- QApplicationPrivate::leaveModal(&modal_widget);
+ QApplicationPrivate::hideModalWindow(modal_widget.windowHandle());
gtk_widget_destroy (gtkFileChooser);
return filename;
}
@@ -1015,7 +1029,7 @@ QString QGtkStylePrivate::openDirectory(QWidget *parent, const QString &caption,
QWidget modal_widget;
modal_widget.setAttribute(Qt::WA_NoChildEventsForParent, true);
modal_widget.setParent(parent, Qt::Window);
- QApplicationPrivate::enterModal(&modal_widget);
+ QGuiApplicationPrivate::showModalWindow(modal_widget.windowHandle());
QString filename;
if (QGtkStylePrivate::gtk_dialog_run ((GtkDialog*)gtkFileChooser) == GTK_RESPONSE_ACCEPT) {
@@ -1024,7 +1038,7 @@ QString QGtkStylePrivate::openDirectory(QWidget *parent, const QString &caption,
g_free (gtk_filename);
}
- QApplicationPrivate::leaveModal(&modal_widget);
+ QApplicationPrivate::hideModalWindow(modal_widget.windowHandle());
gtk_widget_destroy (gtkFileChooser);
return filename;
}
@@ -1047,7 +1061,7 @@ QStringList QGtkStylePrivate::openFilenames(QWidget *parent, const QString &capt
QWidget modal_widget;
modal_widget.setAttribute(Qt::WA_NoChildEventsForParent, true);
modal_widget.setParent(parent, Qt::Window);
- QApplicationPrivate::enterModal(&modal_widget);
+ QGuiApplicationPrivate::showModalWindow(modal_widget.windowHandle());
if (gtk_dialog_run ((GtkDialog*)gtkFileChooser) == GTK_RESPONSE_ACCEPT) {
GSList *gtk_file_names = QGtkStylePrivate::gtk_file_chooser_get_filenames((GtkFileChooser*)gtkFileChooser);
@@ -1060,7 +1074,7 @@ QStringList QGtkStylePrivate::openFilenames(QWidget *parent, const QString &capt
}
}
- QApplicationPrivate::leaveModal(&modal_widget);
+ QApplicationPrivate::hideModalWindow(modal_widget.windowHandle());
gtk_widget_destroy (gtkFileChooser);
return filenames;
}
@@ -1080,7 +1094,7 @@ QString QGtkStylePrivate::saveFilename(QWidget *parent, const QString &caption,
QWidget modal_widget;
modal_widget.setAttribute(Qt::WA_NoChildEventsForParent, true);
modal_widget.setParent(parent, Qt::Window);
- QApplicationPrivate::enterModal(&modal_widget);
+ QGuiApplicationPrivate::showModalWindow(modal_widget.windowHandle());
QString filename;
if (QGtkStylePrivate::gtk_dialog_run ((GtkDialog*)gtkFileChooser) == GTK_RESPONSE_ACCEPT) {
@@ -1093,7 +1107,7 @@ QString QGtkStylePrivate::saveFilename(QWidget *parent, const QString &caption,
}
}
- QApplicationPrivate::leaveModal(&modal_widget);
+ QApplicationPrivate::hideModalWindow(modal_widget.windowHandle());
gtk_widget_destroy (gtkFileChooser);
return filename;
}
diff --git a/src/widgets/styles/qgtkstyle_p.h b/src/widgets/styles/qgtkstyle_p.h
index 02d659c1e4..b095820626 100644
--- a/src/widgets/styles/qgtkstyle_p.h
+++ b/src/widgets/styles/qgtkstyle_p.h
@@ -131,6 +131,7 @@ QT_END_NAMESPACE
class GConf;
class GConfClient;
+typedef struct _XDisplay Display;
typedef GConfClient* (*Ptr_gconf_client_get_default)();
typedef char* (*Ptr_gconf_client_get_string)(GConfClient*, const char*, GError **);
diff --git a/src/widgets/styles/qplastiquestyle.cpp b/src/widgets/styles/qplastiquestyle.cpp
index cae015ff82..51c6c441d0 100644
--- a/src/widgets/styles/qplastiquestyle.cpp
+++ b/src/widgets/styles/qplastiquestyle.cpp
@@ -487,7 +487,7 @@ static void qBrushSetAlphaF(QBrush *brush, qreal alpha)
// Modify the texture - ridiculously expensive.
QPixmap texture = brush->texture();
QPixmap pixmap;
- QString name = QLatin1Literal("qbrushtexture-alpha")
+ QString name = QLatin1String("qbrushtexture-alpha")
% HexString<qreal>(alpha)
% HexString<qint64>(texture.cacheKey());
if (!QPixmapCache::find(name, pixmap)) {
@@ -550,7 +550,7 @@ static QBrush qBrushLight(QBrush brush, int light)
// Modify the texture - ridiculously expensive.
QPixmap texture = brush.texture();
QPixmap pixmap;
- QString name = QLatin1Literal("qbrushtexture-light")
+ QString name = QLatin1String("qbrushtexture-light")
% HexString<int>(light)
% HexString<qint64>(texture.cacheKey());
@@ -612,7 +612,7 @@ static QBrush qBrushDark(QBrush brush, int dark)
// Modify the texture - ridiculously expensive.
QPixmap texture = brush.texture();
QPixmap pixmap;
- QString name = QLatin1Literal("qbrushtexture-dark")
+ QString name = QLatin1String("qbrushtexture-dark")
% HexString<int>(dark)
% HexString<qint64>(texture.cacheKey());
@@ -739,7 +739,7 @@ static QColor mergedColors(const QColor &colorA, const QColor &colorB, int facto
static void qt_plastique_draw_gradient(QPainter *painter, const QRect &rect, const QColor &gradientStart,
const QColor &gradientStop)
{
- QString gradientName = QLatin1Literal("qplastique-g")
+ QString gradientName = QLatin1String("qplastique-g")
% HexString<int>(rect.width())
% HexString<int>(rect.height())
% HexString<QRgb>(gradientStart.rgba())
diff --git a/src/widgets/styles/qstylesheetstyle.cpp b/src/widgets/styles/qstylesheetstyle.cpp
index 89e8f59315..46bf836369 100644
--- a/src/widgets/styles/qstylesheetstyle.cpp
+++ b/src/widgets/styles/qstylesheetstyle.cpp
@@ -691,7 +691,7 @@ static QList<QVariant> subControlLayout(const QString& layout)
{
QList<QVariant> buttons;
for (int i = 0; i < layout.count(); i++) {
- int button = layout[i].toAscii();
+ int button = layout[i].toLatin1();
switch (button) {
case 'm':
buttons.append(PseudoElement_MdiMinButton);
diff --git a/src/widgets/styles/qwindowsvistastyle.cpp b/src/widgets/styles/qwindowsvistastyle.cpp
index 86574f2587..138f5dbf17 100644
--- a/src/widgets/styles/qwindowsvistastyle.cpp
+++ b/src/widgets/styles/qwindowsvistastyle.cpp
@@ -41,6 +41,8 @@
#include "qwindowsvistastyle.h"
#include "qwindowsvistastyle_p.h"
+#include <qscreen.h>
+#include <qwindow.h>
#include <private/qstylehelper_p.h>
#include <private/qsystemlibrary_p.h>
#include <private/qapplication_p.h>
@@ -1655,10 +1657,18 @@ void QWindowsVistaStyle::drawComplexControl(ComplexControl control, const QStyle
t->setStartImage(startImage);
} else {
QPoint offset(0, 0);
- if (!widget->internalWinId())
- offset = widget->mapTo(widget->nativeParentWidget(), offset);
- t->setStartImage(QPixmap::grabWindow(widget->effectiveWinId(), offset.x(), offset.y(),
- option->rect.width(), option->rect.height()).toImage());
+ QWindow *window = widget->windowHandle();
+ if (!window) {
+ if (const QWidget *nativeParent = widget->nativeParentWidget()) {
+ offset = widget->mapTo(nativeParent, offset);
+ window = nativeParent->windowHandle();
+ }
+ }
+ if (window && window->handle()) {
+ const QPixmap pixmap = window->screen()->grabWindow(window->winId(),
+ offset.x(), offset.y(), option->rect.width(), option->rect.height());
+ t->setStartImage(pixmap.toImage());
+ }
}
} else {
startImage.fill(0);
diff --git a/src/widgets/styles/qwindowsxpstyle.cpp b/src/widgets/styles/qwindowsxpstyle.cpp
index 801c7f7e5c..091b27d87b 100644
--- a/src/widgets/styles/qwindowsxpstyle.cpp
+++ b/src/widgets/styles/qwindowsxpstyle.cpp
@@ -53,6 +53,7 @@
#include <qpainter.h>
#include <qpaintengine.h>
#include <qwidget.h>
+#include <qbackingstore.>
#include <qapplication.h>
#include <qpixmapcache.h>
@@ -708,24 +709,37 @@ void QWindowsXPStylePrivate::drawBackground(XPThemeData &themeData)
bool complexXForm = painter->deviceTransform().type() > QTransform::TxTranslate;
+ // Access paintDevice via engine since the painter may
+ // return the clip device which can still be a widget device in case of grabWidget().
+
bool translucentToplevel = false;
- QPaintDevice *pdev = painter->device();
- if (pdev->devType() == QInternal::Widget) {
- QWidget *win = ((QWidget *) pdev)->window();
- translucentToplevel = win->testAttribute(Qt::WA_TranslucentBackground);
+ const QPaintDevice *paintDevice = painter->device();
+ if (paintDevice->devType() == QInternal::Widget) {
+ const QWidget *window = static_cast<const QWidget *>(paintDevice)->window();
+ translucentToplevel = window->testAttribute(Qt::WA_TranslucentBackground);
}
- // Draw on backing store DC only for real widgets.
- // Access paintDevice via engine since the painter may
- // return the clip device which can still be a widget device in case of grabWidget().
- const bool useFallback = !themeData.widget
- || painter->paintEngine()->paintDevice()->devType() != QInternal::Widget
- || painter->opacity() != 1.0 || themeData.rotate
- || complexXForm || themeData.mirrorVertically
- || (themeData.mirrorHorizontally && pDrawThemeBackgroundEx == 0)
- || translucentToplevel;
- const HDC dc = useFallback ? HDC(0) : hdcForWidgetBackingStore(themeData.widget);
- if (dc && !useFallback) {
+ bool canDrawDirectly = false;
+ if (themeData.widget && painter->opacity() == 1.0 && !themeData.rotate
+ && !complexXForm && !themeData.mirrorVertically
+ && (!themeData.mirrorHorizontally || pDrawThemeBackgroundEx)
+ && !translucentToplevel) {
+ // Draw on backing store DC only for real widgets or backing store images.
+ const QPaintDevice *enginePaintDevice = painter->paintEngine()->paintDevice();
+ switch (enginePaintDevice->devType()) {
+ case QInternal::Widget:
+ canDrawDirectly = true;
+ break;
+ case QInternal::Image:
+ // Ensure the backing store has received as resize and is initialized.
+ if (QBackingStore *bs = backingStoreForWidget(themeData.widget))
+ if (bs->size().isValid() && bs->paintDevice() == enginePaintDevice)
+ canDrawDirectly = true;
+ }
+ }
+
+ const HDC dc = canDrawDirectly ? hdcForWidgetBackingStore(themeData.widget) : HDC(0);
+ if (dc) {
drawBackgroundDirectly(themeData);
} else {
drawBackgroundThruNativeBuffer(themeData);
@@ -1773,7 +1787,7 @@ case PE_Frame:
case PE_IndicatorHeaderArrow:
{
#if 0 // XP theme engine doesn't know about this :(
- name = QWindowsXPStylePrivate::HEADER");
+ name = QWindowsXPStylePrivate::HeaderTheme;
partId = HP_HEADERSORTARROW;
if (flags & State_Down)
stateId = HSAS_SORTEDDOWN;
@@ -1961,7 +1975,7 @@ case PE_Frame:
break;
}
- XPThemeData theme(0, p, themeNumber, partId, stateId, rect);
+ XPThemeData theme(widget, p, themeNumber, partId, stateId, rect);
if (!theme.isValid()) {
QWindowsStyle::drawPrimitive(pe, option, p, widget);
return;
diff --git a/src/widgets/styles/styles.pri b/src/widgets/styles/styles.pri
index 8f6996cfa3..91212f0178 100644
--- a/src/widgets/styles/styles.pri
+++ b/src/widgets/styles/styles.pri
@@ -37,9 +37,9 @@ contains( styles, all ) {
styles = mac windows windowsxp windowsvista
}
-!macx-*|!contains(QT_CONFIG, coreservices):styles -= mac
+!macx-*|ios:styles -= mac
-x11{
+contains(QT_CONFIG, gtkstyle) {
QMAKE_CXXFLAGS += $$QT_CFLAGS_QGTKSTYLE
LIBS_PRIVATE += $$QT_LIBS_QGTKSTYLE
styles += gtk
diff --git a/src/widgets/widgets/qabstractspinbox.cpp b/src/widgets/widgets/qabstractspinbox.cpp
index 8bab6a9a1d..6c556dc870 100644
--- a/src/widgets/widgets/qabstractspinbox.cpp
+++ b/src/widgets/widgets/qabstractspinbox.cpp
@@ -2028,8 +2028,8 @@ int QAbstractSpinBoxPrivate::variantCompare(const QVariant &arg1, const QVariant
switch (arg2.type()) {
case QVariant::Date:
Q_ASSERT_X(arg1.type() == QVariant::Date, "QAbstractSpinBoxPrivate::variantCompare",
- qPrintable(QString::fromAscii("Internal error 1 (%1)").
- arg(QString::fromAscii(arg1.typeName()))));
+ qPrintable(QString::fromLatin1("Internal error 1 (%1)").
+ arg(QString::fromLatin1(arg1.typeName()))));
if (arg1.toDate() == arg2.toDate()) {
return 0;
} else if (arg1.toDate() < arg2.toDate()) {
@@ -2039,8 +2039,8 @@ int QAbstractSpinBoxPrivate::variantCompare(const QVariant &arg1, const QVariant
}
case QVariant::Time:
Q_ASSERT_X(arg1.type() == QVariant::Time, "QAbstractSpinBoxPrivate::variantCompare",
- qPrintable(QString::fromAscii("Internal error 2 (%1)").
- arg(QString::fromAscii(arg1.typeName()))));
+ qPrintable(QString::fromLatin1("Internal error 2 (%1)").
+ arg(QString::fromLatin1(arg1.typeName()))));
if (arg1.toTime() == arg2.toTime()) {
return 0;
} else if (arg1.toTime() < arg2.toTime()) {
@@ -2079,9 +2079,9 @@ int QAbstractSpinBoxPrivate::variantCompare(const QVariant &arg1, const QVariant
return 0;
default:
Q_ASSERT_X(0, "QAbstractSpinBoxPrivate::variantCompare",
- qPrintable(QString::fromAscii("Internal error 3 (%1 %2)").
- arg(QString::fromAscii(arg1.typeName())).
- arg(QString::fromAscii(arg2.typeName()))));
+ qPrintable(QString::fromLatin1("Internal error 3 (%1 %2)").
+ arg(QString::fromLatin1(arg1.typeName())).
+ arg(QString::fromLatin1(arg2.typeName()))));
}
return -2;
}
diff --git a/src/widgets/widgets/qdatetimeedit.cpp b/src/widgets/widgets/qdatetimeedit.cpp
index 5e808c1ab5..0cdb2d1176 100644
--- a/src/widgets/widgets/qdatetimeedit.cpp
+++ b/src/widgets/widgets/qdatetimeedit.cpp
@@ -2208,7 +2208,7 @@ void QDateTimeEditPrivate::_q_editorCursorPositionChanged(int oldpos, int newpos
currentSectionIndex = s;
Q_ASSERT_X(currentSectionIndex < sectionNodes.size(),
"QDateTimeEditPrivate::_q_editorCursorPositionChanged()",
- qPrintable(QString::fromAscii("Internal error (%1 %2)").
+ qPrintable(QString::fromLatin1("Internal error (%1 %2)").
arg(currentSectionIndex).
arg(sectionNodes.size())));
diff --git a/src/widgets/widgets/qdialogbuttonbox.cpp b/src/widgets/widgets/qdialogbuttonbox.cpp
index 14643e77f6..b787522a50 100644
--- a/src/widgets/widgets/qdialogbuttonbox.cpp
+++ b/src/widgets/widgets/qdialogbuttonbox.cpp
@@ -211,7 +211,7 @@ static QDialogButtonBox::ButtonRole roleFor(QDialogButtonBox::StandardButton but
return QDialogButtonBox::InvalidRole;
}
-static const int layouts[2][5][14] =
+static const uint layouts[2][5][14] =
{
// Qt::Horizontal
{
@@ -406,7 +406,7 @@ void QDialogButtonBoxPrivate::layoutButtons()
tmpPolicy = 4; // Mac modeless
}
- const int *currentLayout = layouts[orientation == Qt::Vertical][tmpPolicy];
+ const uint *currentLayout = layouts[orientation == Qt::Vertical][tmpPolicy];
if (center)
buttonLayout->addStretch();
diff --git a/src/widgets/widgets/qprogressbar.cpp b/src/widgets/widgets/qprogressbar.cpp
index c02aa0e875..33c61796ea 100644
--- a/src/widgets/widgets/qprogressbar.cpp
+++ b/src/widgets/widgets/qprogressbar.cpp
@@ -314,8 +314,10 @@ void QProgressBar::setValue(int value)
d->value = value;
emit valueChanged(value);
#ifndef QT_NO_ACCESSIBILITY
- QAccessibleValueChangeEvent event(this, value);
- QAccessible::updateAccessibility(&event);
+ if (isVisible()) {
+ QAccessibleValueChangeEvent event(this, value);
+ QAccessible::updateAccessibility(&event);
+ }
#endif
if (d->repaintRequired())
repaint();
diff --git a/src/widgets/widgets/qsplitter.cpp b/src/widgets/widgets/qsplitter.cpp
index 44c450ca47..17e1c39cee 100644
--- a/src/widgets/widgets/qsplitter.cpp
+++ b/src/widgets/widgets/qsplitter.cpp
@@ -1702,7 +1702,7 @@ QTextStream& operator>>(QTextStream& ts, QSplitter& splitter)
line.replace(QLatin1Char(' '), QString());
line = line.toUpper();
- splitter.restoreState(line.toAscii());
+ splitter.restoreState(line.toLatin1());
return ts;
}
diff --git a/src/xml/doc/doc.pri b/src/xml/doc/doc.pri
new file mode 100644
index 0000000000..d02e45e64e
--- /dev/null
+++ b/src/xml/doc/doc.pri
@@ -0,0 +1,3 @@
+qtPrepareTool(QDOC, qdoc)
+docs.commands += $$QDOC $$QT.xml.sources/doc/qtxml.qdocconf
+QMAKE_EXTRA_TARGETS += docs
diff --git a/src/xml/doc/qtxml.qdocconf b/src/xml/doc/qtxml.qdocconf
new file mode 100644
index 0000000000..86dd4f9420
--- /dev/null
+++ b/src/xml/doc/qtxml.qdocconf
@@ -0,0 +1,92 @@
+include(../../../doc/global/qt-cpp-ignore.qdocconf)
+
+project = QtXml
+description = Qt XML Reference Documentation
+url = http://qt-project.org/doc/qt-5.0/qtxml
+version = 5.0.0
+
+sourceencoding = UTF-8
+outputencoding = UTF-8
+naturallanguage = en_US
+qhp.projects = QtXml
+
+qhp.QtXml.file = qtxml.qhp
+qhp.QtXml.namespace = org.qt-project.qtxml.500
+qhp.QtXml.virtualFolder = qdoc
+qhp.QtXml.indexTitle = Qt XML Reference Documentation
+qhp.QtXml.indexRoot =
+
+qhp.QtXml.filterAttributes = qtxml 5.0.0 qtrefdoc
+qhp.QtXml.customFilters.Qt.name = QtXml 5.0.0
+qhp.QtXml.customFilters.Qt.filterAttributes = qtxml 5.0.0
+qhp.QtXml.subprojects = classes overviews examples
+qhp.QtXml.subprojects.classes.title = Classes
+qhp.QtXml.subprojects.classes.indexTitle = Qt XML's Classes
+qhp.QtXml.subprojects.classes.selectors = class fake:headerfile
+qhp.QtXml.subprojects.classes.sortPages = true
+qhp.QtXml.subprojects.overviews.title = Overviews
+qhp.QtXml.subprojects.overviews.indexTitle = All Overviews and HOWTOs
+qhp.QtXml.subprojects.overviews.selectors = fake:page,group,module
+qhp.QtXml.subprojects.examples.title = Qt XML Examples
+qhp.QtXml.subprojects.examples.indexTitle = Qt XML Examples
+qhp.QtXml.subprojects.examples.selectors = fake:example
+
+dita.metadata.default.author = Qt Project
+dita.metadata.default.permissions = all
+dita.metadata.default.publisher = Qt Project
+dita.metadata.default.copyryear = 2012
+dita.metadata.default.copyrholder = Nokia
+dita.metadata.default.audience = programmer
+
+sources.fileextensions = "*.c++ *.cc *.cpp *.cxx *.mm *.qml *.qdoc"
+headers.fileextensions = "*.ch *.h *.h++ *.hh *.hpp *.hxx"
+
+examples.fileextensions = "*.cpp *.h *.js *.xq *.svg *.xml *.ui *.qhp *.qhcp *.qml *.css"
+examples.imageextensions = "*.png"
+
+outputdir = ../../../doc/qtxml
+tagfile = ../../../doc/qtxml/qtxml.tags
+
+HTML.generatemacrefs = "true"
+HTML.nobreadcrumbs = "true"
+
+HTML.templatedir = .
+
+HTML.stylesheets = ../../../doc/global/style/offline.css
+
+HTML.headerstyles = \
+ " <link rel=\"stylesheet\" type=\"text/css\" href=\"style/offline.css\" />\n"
+
+HTML.endheader = \
+ "</head>\n" \
+
+defines = Q_QDOC \
+ QT_.*_SUPPORT \
+ QT_.*_LIB \
+ QT_COMPAT \
+ QT_KEYPAD_NAVIGATION \
+ QT_NO_EGL \
+ Q_WS_.* \
+ Q_OS_.* \
+ Q_BYTE_ORDER \
+ QT_DEPRECATED \
+ QT_DEPRECATED_* \
+ Q_NO_USING_KEYWORD \
+ __cplusplus \
+ Q_COMPILER_INITIALIZER_LISTS
+
+versionsym = QT_VERSION_STR
+
+codeindent = 1
+
+depends += qtcore
+
+headerdirs += ..
+
+sourcedirs += ..
+
+exampledirs += ../../../examples \
+ ../ \
+ snippets
+
+imagedirs += images
diff --git a/doc/src/snippets/code/doc_src_qtxml.cpp b/src/xml/doc/snippets/code/doc_src_qtxml.cpp
index 976fffa1ae..976fffa1ae 100644
--- a/doc/src/snippets/code/doc_src_qtxml.cpp
+++ b/src/xml/doc/snippets/code/doc_src_qtxml.cpp
diff --git a/src/xml/doc/snippets/code/doc_src_qtxml.pro b/src/xml/doc/snippets/code/doc_src_qtxml.pro
new file mode 100644
index 0000000000..71d23856b0
--- /dev/null
+++ b/src/xml/doc/snippets/code/doc_src_qtxml.pro
@@ -0,0 +1,3 @@
+#! [1]
+QT += xml
+#! [1]
diff --git a/src/xml/doc/snippets/code/doc_src_qtxml.qdoc b/src/xml/doc/snippets/code/doc_src_qtxml.qdoc
new file mode 100644
index 0000000000..9640a1410b
--- /dev/null
+++ b/src/xml/doc/snippets/code/doc_src_qtxml.qdoc
@@ -0,0 +1,102 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//! [3]
+<quote>A quotation.</quote>
+//! [3]
+
+
+//! [4]
+<document xmlns:book = 'http://example.com/fnord/book/'
+ xmlns = 'http://example.com/fnord/' >
+//! [4]
+
+
+//! [5]
+<author xmlns:fnord = 'http://example.com/fnord/'
+ title="Ms"
+ fnord:title="Goddess"
+ name="Eris Kallisti"/>
+//! [5]
+
+
+//! [6]
+<document>
+<book>
+ <title>Practical XML</title>
+ <author title="Ms" name="Eris Kallisti"/>
+ <chapter>
+ <title>A Namespace Called fnord</title>
+ </chapter>
+</book>
+</document>
+//! [6]
+
+
+//! [7]
+<book:title>Practical XML</book:title>
+//! [7]
+
+
+//! [8]
+xmlns="http://example.com/fnord/"
+//! [8]
+
+
+//! [9]
+xmlns:book="http://example.com/fnord/book/"
+//! [9]
+
+
+//! [10]
+<document xmlns:book = 'http://example.com/fnord/book/'
+ xmlns = 'http://example.com/fnord/' >
+<book>
+ <book:title>Practical XML</book:title>
+ <book:author xmlns:fnord = 'http://example.com/fnord/'
+ title="Ms"
+ fnord:title="Goddess"
+ name="Eris Kallisti"/>
+ <chapter>
+ <title>A Namespace Called fnord</title>
+ </chapter>
+</book>
+</document>
+//! [10]
diff --git a/doc/src/snippets/code/src_xml_dom_qdom.cpp b/src/xml/doc/snippets/code/src_xml_dom_qdom.cpp
index f8c2382f04..f8c2382f04 100644
--- a/doc/src/snippets/code/src_xml_dom_qdom.cpp
+++ b/src/xml/doc/snippets/code/src_xml_dom_qdom.cpp
diff --git a/doc/src/snippets/code/src_xml_sax_qxml.cpp b/src/xml/doc/snippets/code/src_xml_sax_qxml.cpp
index 4b9dc4a129..4b9dc4a129 100644
--- a/doc/src/snippets/code/src_xml_sax_qxml.cpp
+++ b/src/xml/doc/snippets/code/src_xml_sax_qxml.cpp
diff --git a/doc/src/snippets/xml/rsslisting/handler.cpp b/src/xml/doc/snippets/rsslisting/handler.cpp
index 5cd2c45023..5cd2c45023 100644
--- a/doc/src/snippets/xml/rsslisting/handler.cpp
+++ b/src/xml/doc/snippets/rsslisting/handler.cpp
diff --git a/doc/src/snippets/xml/rsslisting/rsslisting.cpp b/src/xml/doc/snippets/rsslisting/rsslisting.cpp
index 5fb7c28da9..5fb7c28da9 100644
--- a/doc/src/snippets/xml/rsslisting/rsslisting.cpp
+++ b/src/xml/doc/snippets/rsslisting/rsslisting.cpp
diff --git a/doc/src/snippets/xml/simpleparse/main.cpp b/src/xml/doc/snippets/simpleparse/main.cpp
index bd00885d78..bd00885d78 100644
--- a/doc/src/snippets/xml/simpleparse/main.cpp
+++ b/src/xml/doc/snippets/simpleparse/main.cpp
diff --git a/src/xml/doc/src/external-resources.qdoc b/src/xml/doc/src/external-resources.qdoc
new file mode 100644
index 0000000000..2f0a67e553
--- /dev/null
+++ b/src/xml/doc/src/external-resources.qdoc
@@ -0,0 +1,36 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** GNU Free Documentation License
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of
+** this file.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms
+** and conditions contained in a signed written agreement between you
+** and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \externalpage http://www.w3.org/TR/REC-DOM-Level-1/
+ \title W3C DOM Level 1
+*/
+
+/*!
+ \externalpage http://www.w3.org/TR/DOM-Level-2-Core/
+ \title W3C DOM Level 2
+*/
diff --git a/doc/src/xml/qtxml.qdoc b/src/xml/doc/src/qtxml.qdoc
index 4ebc1acac6..519e61a6b5 100644
--- a/doc/src/xml/qtxml.qdoc
+++ b/src/xml/doc/src/qtxml.qdoc
@@ -37,14 +37,10 @@
To include the definitions of the module's classes, use the
following directive:
- \snippet doc/src/snippets/code/doc_src_qtxml.cpp 0
+ \snippet code/doc_src_qtxml.cpp 0
To link against the module, add this line to your \l qmake \c
.pro file:
- \snippet doc/src/snippets/code/doc_src_qtxml.pro 1
-
- Further XML support is provided by the \l{Qt Solutions} group who
- provide, for example, classes that support SOAP and MML with the
- Qt XML classes.
+ \snippet code/doc_src_qtxml.pro 1
*/
diff --git a/src/xml/doc/src/xml-processing.qdoc b/src/xml/doc/src/xml-processing.qdoc
new file mode 100644
index 0000000000..617815905e
--- /dev/null
+++ b/src/xml/doc/src/xml-processing.qdoc
@@ -0,0 +1,613 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** GNU Free Documentation License
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of
+** this file.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms
+** and conditions contained in a signed written agreement between you
+** and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \group xml-tools
+ \title XML Classes
+
+ \brief Classes that support XML, via, for example DOM and SAX.
+
+ These classes are relevant to XML users.
+
+ \generatelist{related}
+*/
+
+/*!
+ \page xml-processing.html
+ \title XML Processing
+ \ingroup technology-apis
+
+ \brief An Overview of the XML processing facilities in Qt.
+
+ In addition to core XML support, classes for higher level querying
+ and manipulation of XML data are provided by the Qt XML Patterns
+ module. In the QtSvg module, the QSvgRenderer and QSvgGenerator
+ classes can read and write a subset of SVG, an XML-based file
+ format. Qt also provides helper functions that may be useful to
+ those working with XML and XHTML: see Qt::escape() and
+ Qt::convertFromPlainText().
+
+ \section1 Topics:
+
+ \list
+ \li \l {Classes for XML Processing}
+ \li \l {An Introduction to Namespaces}
+ \li \l {XML Streaming}
+ \li \l {The SAX Interface}
+ \li \l {Working with the DOM Tree}
+ \endlist
+
+ \section1 Classes for XML Processing
+
+ These classes are relevant to XML users.
+
+ \annotatedlist xml-tools
+*/
+
+/*!
+ \page xml-namespaces.html
+ \title An Introduction to Namespaces
+ \target namespaces
+
+ \contentspage XML Processing
+ \nextpage XML Streaming
+
+ Parts of the Qt XML module documentation assume that you are familiar
+ with XML namespaces. Here we present a brief introduction; skip to
+ \link #namespacesConventions Qt XML documentation conventions \endlink
+ if you already know this material.
+
+ Namespaces are a concept introduced into XML to allow a more modular
+ design. With their help data processing software can easily resolve
+ naming conflicts in XML documents.
+
+ Consider the following example:
+
+ \snippet code/doc_src_qtxml.qdoc 6
+
+ Here we find three different uses of the name \e title. If you wish to
+ process this document you will encounter problems because each of the
+ \e titles should be displayed in a different manner -- even though
+ they have the same name.
+
+ The solution would be to have some means of identifying the first
+ occurrence of \e title as the title of a book, i.e. to use the \e
+ title element of a book namespace to distinguish it from, for example,
+ the chapter title, e.g.:
+ \snippet code/doc_src_qtxml.qdoc 7
+
+ \e book in this case is a \e prefix denoting the namespace.
+
+ Before we can apply a namespace to element or attribute names we must
+ declare it.
+
+ Namespaces are URIs like \e http://www.example.com/fnord/book/. This
+ does not mean that data must be available at this address; the URI is
+ simply used to provide a unique name.
+
+ We declare namespaces in the same way as attributes; strictly speaking
+ they \e are attributes. To make for example \e
+ http://www.example.com/fnord/ the document's default XML namespace \e
+ xmlns we write
+
+ \snippet code/doc_src_qtxml.qdoc 8
+
+ To distinguish the \e http://www.example.com/fnord/book/ namespace from
+ the default, we must supply it with a prefix:
+
+ \snippet code/doc_src_qtxml.qdoc 9
+
+ A namespace that is declared like this can be applied to element and
+ attribute names by prepending the appropriate prefix and a ":"
+ delimiter. We have already seen this with the \e book:title element.
+
+ Element names without a prefix belong to the default namespace. This
+ rule does not apply to attributes: an attribute without a prefix does
+ not belong to any of the declared XML namespaces at all. Attributes
+ always belong to the "traditional" namespace of the element in which
+ they appear. A "traditional" namespace is not an XML namespace, it
+ simply means that all attribute names belonging to one element must be
+ different. Later we will see how to assign an XML namespace to an
+ attribute.
+
+ Due to the fact that attributes without prefixes are not in any XML
+ namespace there is no collision between the attribute \e title (that
+ belongs to the \e author element) and for example the \e title element
+ within a \e chapter.
+
+ Let's clarify this with an example:
+ \snippet code/doc_src_qtxml.qdoc 10
+
+ Within the \e document element we have two namespaces declared. The
+ default namespace \e http://www.example.com/fnord/ applies to the \e
+ book element, the \e chapter element, the appropriate \e title element
+ and of course to \e document itself.
+
+ The \e book:author and \e book:title elements belong to the namespace
+ with the URI \e http://www.example.com/fnord/book/.
+
+ The two \e book:author attributes \e title and \e name have no XML
+ namespace assigned. They are only members of the "traditional"
+ namespace of the element \e book:author, meaning that for example two
+ \e title attributes in \e book:author are forbidden.
+
+ In the above example we circumvent the last rule by adding a \e title
+ attribute from the \e http://www.example.com/fnord/ namespace to \e
+ book:author: the \e fnord:title comes from the namespace with the
+ prefix \e fnord that is declared in the \e book:author element.
+
+ Clearly the \e fnord namespace has the same namespace URI as the
+ default namespace. So why didn't we simply use the default namespace
+ we'd already declared? The answer is quite complex:
+ \list
+ \li attributes without a prefix don't belong to any XML namespace at
+ all, not even to the default namespace;
+ \li additionally omitting the prefix would lead to a \e title-title clash;
+ \li writing it as \e xmlns:title would declare a new namespace with the
+ prefix \e title instead of applying the default \e xmlns namespace.
+ \endlist
+
+ With the Qt XML classes elements and attributes can be accessed in two
+ ways: either by refering to their qualified names consisting of the
+ namespace prefix and the "real" name (or \e local name) or by the
+ combination of local name and namespace URI.
+
+ More information on XML namespaces can be found at
+ \l http://www.w3.org/TR/REC-xml-names/.
+
+ \target namespacesConventions
+ \section1 Conventions Used in the Qt XML Documentation
+
+ The following terms are used to distinguish the parts of names within
+ the context of namespaces:
+ \list
+ \li The \e {qualified name}
+ is the name as it appears in the document. (In the above example \e
+ book:title is a qualified name.)
+ \li A \e {namespace prefix} in a qualified name
+ is the part to the left of the ":". (\e book is the namespace prefix in
+ \e book:title.)
+ \li The \e {local part} of a name (also refered to as the \e {local
+ name}) appears to the right of the ":". (Thus \e title is the
+ local part of \e book:title.)
+ \li The \e {namespace URI} ("Uniform Resource Identifier") is a unique
+ identifier for a namespace. It looks like a URL
+ (e.g. \e http://www.example.com/fnord/ ) but does not require
+ data to be accessible by the given protocol at the named address.
+ \endlist
+
+ Elements without a ":" (like \e chapter in the example) do not have a
+ namespace prefix. In this case the local part and the qualified name
+ are identical (i.e. \e chapter).
+
+ \sa {DOM Bookmarks Example}, {SAX Bookmarks Example}
+*/
+
+/*!
+ \page xml-streaming.html
+ \title XML Streaming
+
+ \previouspage An Introduction to Namespaces
+ \contentspage XML Processing
+ \nextpage The SAX Interface
+
+ Since version 4.3, Qt provides two new classes for reading and
+ writing XML: QXmlStreamReader and QXmlStreamWriter.
+
+ The QXmlStreamReader and QXmlStreamWriter are two new classes provided
+ in Qt 4.3 and later. A stream reader reports an XML document as a stream
+ of tokens. This differs from SAX as SAX applications provide handlers to
+ receive XML events from the parser whereas the QXmlStreamReader drives the
+ loop, pulling tokens from the reader when they are needed.
+ This pulling approach makes it possible to build recursive descent parsers,
+ allowing XML parsing code to be split into different methods or classes.
+
+ QXmlStreamReader is a well-formed XML 1.0 parser that excludes external
+ parsed entities. Hence, data provided by the stream reader adheres to the
+ W3C's criteria for well-formed XML, as long as no error occurs. Otherwise,
+ functions such as \l{QXmlStreamReader::atEnd()}{atEnd()},
+ \l{QXmlStreamReader::error()}{error()} and \l{QXmlStreamReader::hasError()}
+ {hasError()} can be used to check and view the errors.
+
+ An example of QXmlStreamReader implementation would be the \c XbelReader in
+ \l{QXmlStream Bookmarks Example}, which is a subclass of QXmlStreamReader.
+ The constructor takes \a treeWidget as a parameter and the class has Xbel
+ specific functions:
+
+ \snippet xml/streambookmarks/xbelreader.h 1
+
+ \dots
+ \snippet xml/streambookmarks/xbelreader.h 2
+ \dots
+
+ The \c read() function accepts a QIODevice and sets it with
+ \l{QXmlStreamReader::setDevice()}{setDevice()}. The
+ \l{QXmlStreamReader::raiseError()}{raiseError()} function is used to
+ display a custom error message, inidicating that the file's version
+ is incorrect.
+
+ \snippet xml/streambookmarks/xbelreader.cpp 1
+
+ The pendent to QXmlStreamReader is QXmlStreamWriter, which provides an XML
+ writer with a simple streaming API. QXmlStreamWriter operates on a
+ QIODevice and has specialised functions for all XML tokens or events you
+ want to write, such as \l{QXmlStreamWriter::writeDTD()}{writeDTD()},
+ \l{QXmlStreamWriter::writeCharacters()}{writeCharacters()},
+ \l{QXmlStreamWriter::writeComment()}{writeComment()} and so on.
+
+ To write XML document with QXmlStreamWriter, you start a document with the
+ \l{QXmlStreamWriter::writeStartDocument()}{writeStartDocument()} function
+ and end it with \l{QXmlStreamWriter::writeEndDocument()}
+ {writeEndDocument()}, which implicitly closes all remaining open tags.
+ Element tags are opened with \l{QXmlStreamWriter::writeStartDocument()}
+ {writeStartDocument()} and followed by
+ \l{QXmlStreamWriter::writeAttribute()}{writeAttribute()} or
+ \l{QXmlStreamWriter::writeAttributes()}{writeAttributes()},
+ element content, and then \l{QXmlStreamWriter::writeEndDocument()}
+ {writeEndDocument()}. Also, \l{QXmlStreamWriter::writeEmptyElement()}
+ {writeEmptyElement()} can be used to write empty elements.
+
+ Element content comprises characters, entity references or nested elements.
+ Content can be written with \l{QXmlStreamWriter::writeCharacters()}
+ {writeCharacters()}, a function that also takes care of escaping all
+ forbidden characters and character sequences,
+ \l{QXmlStreamWriter::writeEntityReference()}{writeEntityReference()},
+ or subsequent calls to \l{QXmlStreamWriter::writeStartElement()}
+ {writeStartElement()}.
+
+ The \c XbelWriter class from \l{QXmlStream Bookmarks Example} is a subclass
+ of QXmlStreamWriter. Its \c writeFile() function illustrates the core
+ functions of QXmlStreamWriter mentioned above:
+
+ \snippet xml/streambookmarks/xbelwriter.cpp 1
+*/
+
+/*!
+ \page xml-sax.html
+ \title The SAX interface
+
+ \previouspage XML Streaming
+ \contentspage XML Processing
+ \nextpage Working with the DOM Tree
+
+ SAX is an event-based standard interface for XML parsers.
+ The Qt interface follows the design of the SAX2 Java implementation.
+ Its naming scheme was adapted to fit the Qt naming conventions.
+ Details on SAX2 can be found at \l{http://www.saxproject.org}.
+
+ Support for SAX2 filters and the reader factory are under
+ development. The Qt implementation does not include the SAX1
+ compatibility classes present in the Java interface.
+
+ \section1 Introduction to SAX2
+
+ The SAX2 interface is an event-driven mechanism to provide the user with
+ document information. An "event" in this context means something
+ reported by the parser, for example, it has encountered a start tag,
+ or an end tag, etc.
+
+ To make it less abstract consider the following example:
+ \snippet code/doc_src_qtxml.qdoc 3
+
+ Whilst reading (a SAX2 parser is usually referred to as "reader")
+ the above document three events would be triggered:
+ \list 1
+ \li A start tag occurs (\c{<quote>}).
+ \li Character data (i.e. text) is found, "A quotation.".
+ \li An end tag is parsed (\c{</quote>}).
+ \endlist
+
+ Each time such an event occurs the parser reports it; you can set up
+ event handlers to respond to these events.
+
+ Whilst this is a fast and simple approach to read XML documents,
+ manipulation is difficult because data is not stored, simply handled
+ and discarded serially. The \l{Working with the DOM Tree}{DOM interface}
+ reads in and stores the whole document in a tree structure;
+ this takes more memory, but makes it easier to manipulate the
+ document's structure.
+
+ The Qt XML module provides an abstract class, \l QXmlReader, that
+ defines the interface for potential SAX2 readers. Qt includes a reader
+ implementation, \l QXmlSimpleReader, that is easy to adapt through
+ subclassing.
+
+ The reader reports parsing events through special handler classes:
+ \table
+ \header \li Handler class \li Description
+ \row \li \l QXmlContentHandler
+ \li Reports events related to the content of a document (e.g. the start tag
+ or characters).
+ \row \li \l QXmlDTDHandler
+ \li Reports events related to the DTD (e.g. notation declarations).
+ \row \li \l QXmlErrorHandler
+ \li Reports errors or warnings that occurred during parsing.
+ \row \li \l QXmlEntityResolver
+ \li Reports external entities during parsing and allows users to resolve
+ external entities themselves instead of leaving it to the reader.
+ \row \li \l QXmlDeclHandler
+ \li Reports further DTD related events (e.g. attribute declarations).
+ \row \li \l QXmlLexicalHandler
+ \li Reports events related to the lexical structure of the
+ document (the beginning of the DTD, comments etc.).
+ \endtable
+
+ These classes are abstract classes describing the interface. The \l
+ QXmlDefaultHandler class provides a "do nothing" default
+ implementation for all of them. Therefore users only need to overload
+ the QXmlDefaultHandler functions they are interested in.
+
+ To read input XML data a special class \l QXmlInputSource is used.
+
+ Apart from those already mentioned, the following SAX2 support classes
+ provide additional useful functionality:
+ \table
+ \header \li Class \li Description
+ \row \li \l QXmlAttributes
+ \li Used to pass attributes in a start element event.
+ \row \li \l QXmlLocator
+ \li Used to obtain the actual parsing position of an event.
+ \row \li \l QXmlNamespaceSupport
+ \li Used to implement namespace support for a reader. Note that
+ namespaces do not change the parsing behavior. They are only
+ reported through the handler.
+ \endtable
+
+ The \l{SAX Bookmarks example} illustrates how to subclass
+ QXmlDefaultHandler to read an XML bookmark file (XBEL) and
+ how to generate XML by hand.
+
+ \section1 SAX2 Features
+
+ The behavior of an XML reader depends on its support for certain
+ optional features. For example, a reader may have the feature "report
+ attributes used for namespace declarations and prefixes along with
+ the local name of a tag". Like every other feature this has a unique
+ name represented by a URI: it is called
+ \e http://xml.org/sax/features/namespace-prefixes.
+
+ The Qt SAX2 implementation can report whether the reader has
+ particular functionality using the QXmlReader::hasFeature()
+ function. Available features can be tested with QXmlReader::feature(),
+ and switched on or off using QXmlReader::setFeature().
+
+ Consider the example
+ \snippet code/doc_src_qtxml.qdoc 4
+ A reader that does not support the \e
+ http://xml.org/sax/features/namespace-prefixes feature would report
+ the element name \e document but not its attributes \e xmlns:book and
+ \e xmlns with their values. A reader with the feature \e
+ http://xml.org/sax/features/namespace-prefixes reports the namespace
+ attributes if the \link QXmlReader::feature() feature\endlink is
+ switched on.
+
+ Other features include \e http://xml.org/sax/features/namespace
+ (namespace processing, implies \e
+ http://xml.org/sax/features/namespace-prefixes) and \e
+ http://xml.org/sax/features/validation (the ability to report
+ validation errors).
+
+ Whilst SAX2 leaves it to the user to define and implement whatever
+ features are required, support for \e
+ http://xml.org/sax/features/namespace (and thus \e
+ http://xml.org/sax/features/namespace-prefixes) is mandantory.
+ The \l QXmlSimpleReader implementation of \l QXmlReader,
+ supports them, and can do namespace processing.
+
+ \l QXmlSimpleReader is not validating, so it
+ does not support \e http://xml.org/sax/features/validation.
+
+ \section1 Namespace Support via Features
+
+ As we have seen in the previous section, we can configure the
+ behavior of the reader when it comes to namespace
+ processing. This is done by setting and unsetting the
+ \e http://xml.org/sax/features/namespaces and
+ \e http://xml.org/sax/features/namespace-prefixes features.
+
+ They influence the reporting behavior in the following way:
+ \list 1
+ \li Namespace prefixes and local parts of elements and attributes can
+ be reported.
+ \li The qualified names of elements and attributes are reported.
+ \li \l QXmlContentHandler::startPrefixMapping() and \l
+ QXmlContentHandler::endPrefixMapping() are called by the reader.
+ \li Attributes that declare namespaces (i.e. the attribute \e xmlns and
+ attributes starting with \e{xmlns:}) are reported.
+ \endlist
+
+ Consider the following element:
+ \snippet code/doc_src_qtxml.qdoc 5
+ With \e http://xml.org/sax/features/namespace-prefixes set to true
+ the reader will report four attributes; but with the \e
+ namespace-prefixes feature set to false only three, with the \e
+ xmlns:fnord attribute defining a namespace being "invisible" to the
+ reader.
+
+ The \e http://xml.org/sax/features/namespaces feature is responsible
+ for reporting local names, namespace prefixes and URIs. With \e
+ http://xml.org/sax/features/namespaces set to true the parser will
+ report \e title as the local name of the \e fnord:title attribute, \e
+ fnord being the namespace prefix and \e http://example.com/fnord/ as
+ the namespace URI. When \e http://xml.org/sax/features/namespaces is
+ false none of them are reported.
+
+ In the current implementation the Qt XML classes follow the definition
+ that the prefix \e xmlns itself isn't associated with any namespace at all
+ (see \l{http://www.w3.org/TR/1999/REC-xml-names-19990114/#ns-using}).
+ Therefore even with \e http://xml.org/sax/features/namespaces and
+ \e http://xml.org/sax/features/namespace-prefixes both set to true
+ the reader won't return either a local name, a namespace prefix or
+ a namespace URI for \e xmlns:fnord.
+
+ This might be changed in the future following the W3C suggestion
+ \link http://www.w3.org/2000/xmlns/ http://www.w3.org/2000/xmlns/ \endlink
+ to associate \e xmlns with the namespace \e http://www.w3.org/2000/xmlns.
+
+ As the SAX2 standard suggests, \l QXmlSimpleReader defaults to having
+ \e http://xml.org/sax/features/namespaces set to true and
+ \e http://xml.org/sax/features/namespace-prefixes set to false.
+ When changing this behavior using \l QXmlSimpleReader::setFeature()
+ note that the combination of both features set to
+ false is illegal.
+
+ \section2 Summary
+
+ \l QXmlSimpleReader implements the following behavior:
+
+ \table
+ \header \li (namespaces, namespace-prefixes)
+ \li Namespace prefix and local part
+ \li Qualified names
+ \li Prefix mapping
+ \li xmlns attributes
+ \row \li (true, false) \li Yes \li Yes* \li Yes \li No
+ \row \li (true, true) \li Yes \li Yes \li Yes \li Yes
+ \row \li (false, true) \li No* \li Yes \li No* \li Yes
+ \row \li (false, false) \li {4,1} Illegal
+ \endtable
+
+ The behavior of the entries marked with an asterisk (*) is not specified by SAX.
+
+ \section1 Properties
+
+ Properties are a more general concept. They have a unique name,
+ represented as an URI, but their value is \c void*. Thus nearly
+ anything can be used as a property value. This concept involves some
+ danger, though: there is no means of ensuring type-safety; the user
+ must take care that they pass the right type. Properties are
+ useful if a reader supports special handler classes.
+
+ The URIs used for features and properties often look like URLs, e.g.
+ \c http://xml.org/sax/features/namespace. This does not mean that the
+ data required is at this address. It is simply a way of defining
+ unique names.
+
+ Anyone can define and use new SAX2 properties for their readers.
+ Property support is not mandatory.
+
+ To set or query properties the following functions are provided: \l
+ QXmlReader::setProperty(), \l QXmlReader::property() and \l
+ QXmlReader::hasProperty().
+*/
+
+/*!
+ \page xml-dom.tml
+ \title Working with the DOM Tree
+ \target dom
+
+ \previouspage The SAX Interface
+ \contentspage XML Processing
+
+ DOM Level 2 is a W3C Recommendation for XML interfaces that maps the
+ constituents of an XML document to a tree structure. The specification
+ of DOM Level 2 can be found at \l{http://www.w3.org/DOM/}.
+
+ \target domIntro
+ \section1 Introduction to DOM
+
+ DOM provides an interface to access and change the content and
+ structure of an XML file. It makes a hierarchical view of the document
+ (a tree view). Thus -- in contrast to the SAX2 interface -- an object
+ model of the document is resident in memory after parsing which makes
+ manipulation easy.
+
+ All DOM nodes in the document tree are subclasses of \l QDomNode. The
+ document itself is represented as a \l QDomDocument object.
+
+ Here are the available node classes and their potential child classes:
+
+ \list
+ \li \l QDomDocument: Possible children are
+ \list
+ \li \l QDomElement (at most one)
+ \li \l QDomProcessingInstruction
+ \li \l QDomComment
+ \li \l QDomDocumentType
+ \endlist
+ \li \l QDomDocumentFragment: Possible children are
+ \list
+ \li \l QDomElement
+ \li \l QDomProcessingInstruction
+ \li \l QDomComment
+ \li \l QDomText
+ \li \l QDomCDATASection
+ \li \l QDomEntityReference
+ \endlist
+ \li \l QDomDocumentType: No children
+ \li \l QDomEntityReference: Possible children are
+ \list
+ \li \l QDomElement
+ \li \l QDomProcessingInstruction
+ \li \l QDomComment
+ \li \l QDomText
+ \li \l QDomCDATASection
+ \li \l QDomEntityReference
+ \endlist
+ \li \l QDomElement: Possible children are
+ \list
+ \li \l QDomElement
+ \li \l QDomText
+ \li \l QDomComment
+ \li \l QDomProcessingInstruction
+ \li \l QDomCDATASection
+ \li \l QDomEntityReference
+ \endlist
+ \li \l QDomAttr: Possible children are
+ \list
+ \li \l QDomText
+ \li \l QDomEntityReference
+ \endlist
+ \li \l QDomProcessingInstruction: No children
+ \li \l QDomComment: No children
+ \li \l QDomText: No children
+ \li \l QDomCDATASection: No children
+ \li \l QDomEntity: Possible children are
+ \list
+ \li \l QDomElement
+ \li \l QDomProcessingInstruction
+ \li \l QDomComment
+ \li \l QDomText
+ \li \l QDomCDATASection
+ \li \l QDomEntityReference
+ \endlist
+ \li \l QDomNotation: No children
+ \endlist
+
+ With \l QDomNodeList and \l QDomNamedNodeMap two collection classes
+ are provided: \l QDomNodeList is a list of nodes,
+ and \l QDomNamedNodeMap is used to handle unordered sets of nodes
+ (often used for attributes).
+
+ The \l QDomImplementation class allows the user to query features of the
+ DOM implementation.
+
+ To get started please refer to the \l QDomDocument documentation.
+ You might also want to take a look at the \l{DOM Bookmarks example},
+ which illustrates how to read and write an XML bookmark file (XBEL)
+ using DOM.
+*/
diff --git a/src/xml/dom/qdom.cpp b/src/xml/dom/qdom.cpp
index 23a9db8e3a..0a6ec9542e 100644
--- a/src/xml/dom/qdom.cpp
+++ b/src/xml/dom/qdom.cpp
@@ -1081,7 +1081,7 @@ bool QDomImplementation::isNull()
the data.
\value ReturnNullNode The factory function should return a null node.
- \sa setInvalidDataPolicy() invalidDataPolicy()
+ \sa setInvalidDataPolicy(), invalidDataPolicy()
*/
/*!
@@ -1094,7 +1094,7 @@ bool QDomImplementation::isNull()
\value EncodingFromDocument The encoding is fetched from the document.
\value EncodingFromTextStream The encoding is fetched from the QTextStream.
- See also the overload of the save() function that takes an EncodingPolicy.
+ \sa QDomNode::save()
*/
/*!
@@ -1104,7 +1104,7 @@ bool QDomImplementation::isNull()
Returns the invalid data policy, which specifies what should be done when
a factory function in QDomDocument is passed invalid data.
- \sa setInvalidDataPolicy() InvalidDataPolicy
+ \sa setInvalidDataPolicy(), InvalidDataPolicy
*/
QDomImplementation::InvalidDataPolicy QDomImplementation::invalidDataPolicy()
@@ -1122,9 +1122,9 @@ QDomImplementation::InvalidDataPolicy QDomImplementation::invalidDataPolicy()
The \a policy is set for all instances of QDomDocument which already
exist and which will be created in the future.
- \snippet doc/src/snippets/code/src_xml_dom_qdom.cpp 0
+ \snippet code/src_xml_dom_qdom.cpp 0
- \sa invalidDataPolicy() InvalidDataPolicy
+ \sa invalidDataPolicy(), InvalidDataPolicy
*/
void QDomImplementation::setInvalidDataPolicy(InvalidDataPolicy policy)
@@ -1294,7 +1294,7 @@ int QDomNodeListPrivate::length() const
For a more general introduction of the DOM implementation see the
QDomDocument documentation.
- \sa QDomNode::childNodes() QDomDocument::elementsByTagName()
+ \sa QDomNode::childNodes(), QDomDocument::elementsByTagName()
*/
/*!
@@ -1991,11 +1991,12 @@ void QDomNodePrivate::setLocation(int lineNumber, int columnNumber)
The following example looks for the first element in an XML document and
prints the names of all the elements that are its direct children.
- \snippet doc/src/snippets/code/src_xml_dom_qdom.cpp 1
+
+ \snippet code/src_xml_dom_qdom.cpp 1
For further information about the Document Object Model see
- \l{http://www.w3.org/TR/REC-DOM-Level-1/}{Level 1} and
- \l{http://www.w3.org/TR/DOM-Level-2-Core/}{Level 2 Core}.
+ \l{W3C DOM Level 1}{Level 1} and
+ \l{W3C DOM Level 2}{Level 2 Core}.
For a more general introduction of the DOM implementation see the
QDomDocument documentation.
*/
@@ -2057,13 +2058,13 @@ QDomNode& QDomNode::operator=(const QDomNode &n)
structure in QDomDocument. The test for equality checks if the two
references point to the same underlying node. For example:
- \snippet doc/src/snippets/code/src_xml_dom_qdom.cpp 2
+ \snippet code/src_xml_dom_qdom.cpp 2
The two nodes (QDomElement is a QDomNode subclass) both refer to
the document's root element, and \c {element1 == element2} will
return true. On the other hand:
- \snippet doc/src/snippets/code/src_xml_dom_qdom.cpp 3
+ \snippet code/src_xml_dom_qdom.cpp 3
Even though both nodes are empty elements carrying the same name,
\c {element3 == element4} will return false because they refer to
@@ -2147,7 +2148,7 @@ QString QDomNode::nodeName() const
All the other subclasses do not have a node value and will return
an empty string.
- \sa setNodeValue() nodeName()
+ \sa setNodeValue(), nodeName()
*/
QString QDomNode::nodeValue() const
{
@@ -2192,8 +2193,8 @@ void QDomNode::setNodeValue(const QString& v)
Returns the type of the node.
\sa toAttr(), toCDATASection(), toDocumentFragment(),
- toDocument() toDocumentType(), toElement(), toEntityReference(),
- toText(), toEntity() toNotation(), toProcessingInstruction(),
+ toDocument(), toDocumentType(), toElement(), toEntityReference(),
+ toText(), toEntity(), toNotation(), toProcessingInstruction(),
toCharacterData(), toComment()
*/
QDomNode::NodeType QDomNode::nodeType() const
@@ -2220,7 +2221,9 @@ QDomNode QDomNode::parentNode() const
Most often you will call this function on a QDomElement object.
For example, if the XML document looks like this:
- \snippet doc/src/snippets/code/src_xml_dom_qdom.cpp 4
+
+ \snippet code/src_xml_dom_qdom.cpp 4
+
Then the list of child nodes for the "body"-element will contain
the node created by the &lt;h1&gt; tag and the node created by the
&lt;p&gt; tag.
@@ -2228,7 +2231,7 @@ QDomNode QDomNode::parentNode() const
The nodes in the list are not copied; so changing the nodes in the
list will also change the children of this node.
- \sa firstChild() lastChild()
+ \sa firstChild(), lastChild()
*/
QDomNodeList QDomNode::childNodes() const
{
@@ -2242,7 +2245,7 @@ QDomNodeList QDomNode::childNodes() const
\link isNull() null node\endlink is returned. Changing the
returned node will also change the node in the document tree.
- \sa lastChild() childNodes()
+ \sa lastChild(), childNodes()
*/
QDomNode QDomNode::firstChild() const
{
@@ -2256,7 +2259,7 @@ QDomNode QDomNode::firstChild() const
\link isNull() null node\endlink is returned. Changing the
returned node will also change the node in the document tree.
- \sa firstChild() childNodes()
+ \sa firstChild(), childNodes()
*/
QDomNode QDomNode::lastChild() const
{
@@ -2270,7 +2273,9 @@ QDomNode QDomNode::lastChild() const
returned node will also change the node in the document tree.
For example, if you have XML like this:
- \snippet doc/src/snippets/code/src_xml_dom_qdom.cpp 5
+
+ \snippet code/src_xml_dom_qdom.cpp 5
+
and this QDomNode represents the &lt;p&gt; tag, previousSibling()
will return the node representing the &lt;h1&gt; tag.
@@ -2288,7 +2293,9 @@ QDomNode QDomNode::previousSibling() const
returned node will also change the node in the document tree.
If you have XML like this:
- \snippet doc/src/snippets/code/src_xml_dom_qdom.cpp 6
+
+ \snippet code/src_xml_dom_qdom.cpp 6
+
and this QDomNode represents the <p> tag, nextSibling() will
return the node representing the <h2> tag.
@@ -2378,8 +2385,8 @@ bool QDomNode::isSupported(const QString& feature, const QString& version) const
namespaces. A namespace URI must be specified at creation time and
cannot be changed later.
- \sa prefix() localName() QDomDocument::createElementNS()
- QDomDocument::createAttributeNS()
+ \sa prefix(), localName(), QDomDocument::createElementNS(),
+ QDomDocument::createAttributeNS()
*/
QString QDomNode::namespaceURI() const
{
@@ -2406,8 +2413,9 @@ QString QDomNode::namespaceURI() const
an empty string; but it might be an empty string if the name does
not have a prefix.
- \sa setPrefix() localName() namespaceURI()
- QDomDocument::createElementNS() QDomDocument::createAttributeNS()
+ \sa setPrefix(), localName(), namespaceURI(),
+ QDomDocument::createElementNS(),
+ QDomDocument::createAttributeNS()
*/
QString QDomNode::prefix() const
{
@@ -2426,8 +2434,9 @@ QString QDomNode::prefix() const
namespaces. A namespace prefix must have be specified at creation
time; it is not possible to add a namespace prefix afterwards.
- \sa prefix() localName() namespaceURI()
- QDomDocument::createElementNS() QDomDocument::createAttributeNS()
+ \sa prefix(), localName(), namespaceURI(),
+ QDomDocument::createElementNS(),
+ QDomDocument::createAttributeNS()
*/
void QDomNode::setPrefix(const QString& pre)
{
@@ -2446,8 +2455,8 @@ void QDomNode::setPrefix(const QString& pre)
namespaces. A namespace must have been specified at creation time;
it is not possible to add a namespace afterwards.
- \sa prefix() namespaceURI() QDomDocument::createElementNS()
- QDomDocument::createAttributeNS()
+ \sa prefix(), namespaceURI(), QDomDocument::createElementNS(),
+ QDomDocument::createAttributeNS()
*/
QString QDomNode::localName() const
{
@@ -2488,7 +2497,7 @@ bool QDomNode::hasAttributes() const
The DOM specification disallow inserting attribute nodes, but due
to historical reasons QDom accept them nevertheless.
- \sa insertAfter() replaceChild() removeChild() appendChild()
+ \sa insertAfter(), replaceChild(), removeChild(), appendChild()
*/
QDomNode QDomNode::insertBefore(const QDomNode& newChild, const QDomNode& refChild)
{
@@ -2517,7 +2526,7 @@ QDomNode QDomNode::insertBefore(const QDomNode& newChild, const QDomNode& refChi
The DOM specification disallow inserting attribute nodes, but due
to historical reasons QDom accept them nevertheless.
- \sa insertBefore() replaceChild() removeChild() appendChild()
+ \sa insertBefore(), replaceChild(), removeChild(), appendChild()
*/
QDomNode QDomNode::insertAfter(const QDomNode& newChild, const QDomNode& refChild)
{
@@ -2540,7 +2549,7 @@ QDomNode QDomNode::insertAfter(const QDomNode& newChild, const QDomNode& refChil
Returns a new reference to \a oldChild on success or a \link
isNull() null node\endlink an failure.
- \sa insertBefore() insertAfter() removeChild() appendChild()
+ \sa insertBefore(), insertAfter(), removeChild(), appendChild()
*/
QDomNode QDomNode::replaceChild(const QDomNode& newChild, const QDomNode& oldChild)
{
@@ -2556,7 +2565,7 @@ QDomNode QDomNode::replaceChild(const QDomNode& newChild, const QDomNode& oldChi
Returns a new reference to \a oldChild on success or a \link
isNull() null node\endlink on failure.
- \sa insertBefore() insertAfter() replaceChild() appendChild()
+ \sa insertBefore(), insertAfter(), replaceChild(), appendChild()
*/
QDomNode QDomNode::removeChild(const QDomNode& oldChild)
{
@@ -2593,7 +2602,7 @@ QDomNode QDomNode::removeChild(const QDomNode& oldChild)
The DOM specification disallow inserting attribute nodes, but for
historical reasons, QDom accepts them anyway.
- \sa insertBefore() insertAfter() replaceChild() removeChild()
+ \sa insertBefore(), insertAfter(), replaceChild(), removeChild()
*/
QDomNode QDomNode::appendChild(const QDomNode& newChild)
{
@@ -2655,14 +2664,14 @@ QDomNode QDomNode::namedItem(const QString& name) const
/*!
Writes the XML representation of the node and all its children to
- the stream \a str. This function uses \a indent as the amount of
+ the stream \a stream. This function uses \a indent as the amount of
space to indent the node.
If the document contains invalid XML characters or characters that cannot be
encoded in the given encoding, the result and behavior is undefined.
If \a encodingPolicy is QDomNode::EncodingFromDocument and this node is a
- document node, the encoding of text stream \a str's encoding is set by
+ document node, the encoding of text stream \a stream's encoding is set by
treating a processing instruction by name "xml" as an XML declaration, if
one exists, and otherwise defaults to UTF-8. XML declarations are not
processing instructions, but this behavior exists for historical
@@ -2671,7 +2680,7 @@ QDomNode QDomNode::namedItem(const QString& name) const
If \a encodingPolicy is EncodingFromTextStream and this node is a document node, this
function behaves as save(QTextStream &str, int indent) with the exception that the encoding
- specified in the text stream \a str is used.
+ specified in the text stream \a stream is used.
If the document contains invalid XML characters or characters that cannot be
encoded in the given encoding, the result and behavior is undefined.
@@ -2917,7 +2926,7 @@ bool QDomNode::isComment() const
otherwise returns the first child element. Returns a null element if no
such child exists.
- \sa lastChildElement() previousSiblingElement() nextSiblingElement()
+ \sa lastChildElement(), previousSiblingElement(), nextSiblingElement()
*/
QDomElement QDomNode::firstChildElement(const QString &tagName) const
@@ -2937,7 +2946,7 @@ QDomElement QDomNode::firstChildElement(const QString &tagName) const
otherwise returns the last child element. Returns a null element if no
such child exists.
- \sa firstChildElement() previousSiblingElement() nextSiblingElement()
+ \sa firstChildElement(), previousSiblingElement(), nextSiblingElement()
*/
QDomElement QDomNode::lastChildElement(const QString &tagName) const
@@ -2957,7 +2966,7 @@ QDomElement QDomNode::lastChildElement(const QString &tagName) const
is non-empty; otherwise returns any next sibling element.
Returns a null element if no such sibling exists.
- \sa firstChildElement() previousSiblingElement() lastChildElement()
+ \sa firstChildElement(), previousSiblingElement(), lastChildElement()
*/
QDomElement QDomNode::nextSiblingElement(const QString &tagName) const
@@ -3283,7 +3292,7 @@ QDomNamedNodeMap::~QDomNamedNodeMap()
QDomNode::isNull() null node\endlink is returned. A node's name is
the name returned by QDomNode::nodeName().
- \sa setNamedItem() namedItemNS()
+ \sa setNamedItem(), namedItemNS()
*/
QDomNode QDomNamedNodeMap::namedItem(const QString& name) const
{
@@ -3300,7 +3309,7 @@ QDomNode QDomNamedNodeMap::namedItem(const QString& name) const
If the new node replaces an existing node, i.e. the map contains a
node with the same name, the replaced node is returned.
- \sa namedItem() removeNamedItem() setNamedItemNS()
+ \sa namedItem(), removeNamedItem(), setNamedItemNS()
*/
QDomNode QDomNamedNodeMap::setNamedItem(const QDomNode& newNode)
{
@@ -3316,7 +3325,7 @@ QDomNode QDomNamedNodeMap::setNamedItem(const QDomNode& newNode)
QDomNode::isNull() null node\endlink if the map did not contain a
node called \a name.
- \sa setNamedItem() namedItem() removeNamedItemNS()
+ \sa setNamedItem(), namedItem(), removeNamedItemNS()
*/
QDomNode QDomNamedNodeMap::removeNamedItem(const QString& name)
{
@@ -3347,7 +3356,7 @@ QDomNode QDomNamedNodeMap::item(int index) const
If the map does not contain such a node, a \link
QDomNode::isNull() null node\endlink is returned.
- \sa setNamedItemNS() namedItem()
+ \sa setNamedItemNS(), namedItem()
*/
QDomNode QDomNamedNodeMap::namedItemNS(const QString& nsURI, const QString& localName) const
{
@@ -3362,7 +3371,7 @@ QDomNode QDomNamedNodeMap::namedItemNS(const QString& nsURI, const QString& loca
it is replaced by \a newNode. If the new node replaces an existing
node, the replaced node is returned.
- \sa namedItemNS() removeNamedItemNS() setNamedItem()
+ \sa namedItemNS(), removeNamedItemNS(), setNamedItem()
*/
QDomNode QDomNamedNodeMap::setNamedItemNS(const QDomNode& newNode)
{
@@ -3380,7 +3389,7 @@ QDomNode QDomNamedNodeMap::setNamedItemNS(const QDomNode& newNode)
node with the local name \a localName and the namespace URI \a
nsURI.
- \sa setNamedItemNS() namedItemNS() removeNamedItem()
+ \sa setNamedItemNS(), namedItemNS(), removeNamedItem()
*/
QDomNode QDomNamedNodeMap::removeNamedItemNS(const QString& nsURI, const QString& localName)
{
@@ -3707,7 +3716,7 @@ QDomNamedNodeMap QDomDocumentType::notations() const
Returns the public identifier of the external DTD subset or
an empty string if there is no public identifier.
- \sa systemId() internalSubset() QDomImplementation::createDocumentType()
+ \sa systemId(), internalSubset(), QDomImplementation::createDocumentType()
*/
QString QDomDocumentType::publicId() const
{
@@ -3720,7 +3729,7 @@ QString QDomDocumentType::publicId() const
Returns the system identifier of the external DTD subset or
an empty string if there is no system identifier.
- \sa publicId() internalSubset() QDomImplementation::createDocumentType()
+ \sa publicId(), internalSubset(), QDomImplementation::createDocumentType()
*/
QString QDomDocumentType::systemId() const
{
@@ -3733,7 +3742,7 @@ QString QDomDocumentType::systemId() const
Returns the internal subset of the document type or an empty
string if there is no internal subset.
- \sa publicId() systemId()
+ \sa publicId(), systemId()
*/
QString QDomDocumentType::internalSubset() const
{
@@ -3753,7 +3762,7 @@ QString QDomDocumentType::internalSubset() const
Returns \c DocumentTypeNode.
- \sa isDocumentType() QDomNode::toDocumentType()
+ \sa isDocumentType(), QDomNode::toDocumentType()
*/
#undef IMPL
@@ -3855,7 +3864,7 @@ QDomDocumentFragment& QDomDocumentFragment::operator= (const QDomDocumentFragmen
Returns \c DocumentFragment.
- \sa isDocumentFragment() QDomNode::toDocumentFragment()
+ \sa isDocumentFragment(), QDomNode::toDocumentFragment()
*/
/**************************************************************
@@ -3945,7 +3954,7 @@ void QDomCharacterDataPrivate::appendData(const QString& arg)
The node type of the node containing this character data is
returned by nodeType().
- \sa QDomText QDomComment QDomCDATASection
+ \sa QDomText, QDomComment, QDomCDATASection
*/
/*!
@@ -4250,11 +4259,11 @@ void QDomAttrPrivate::save(QTextStream& s, int, int) const
For example, the following piece of XML produces an element with
no children, but two attributes:
- \snippet doc/src/snippets/code/src_xml_dom_qdom.cpp 7
+ \snippet code/src_xml_dom_qdom.cpp 7
You can access the attributes of an element with code like this:
- \snippet doc/src/snippets/code/src_xml_dom_qdom.cpp 8
+ \snippet code/src_xml_dom_qdom.cpp 8
This example also shows that changing an attribute received from
an element changes the attribute of the element. If you do not
@@ -4350,7 +4359,7 @@ QDomElement QDomAttr::ownerElement() const
Returns the value of the attribute or an empty string if the
attribute has not been specified.
- \sa specified() setValue()
+ \sa specified(), setValue()
*/
QString QDomAttr::value() const
{
@@ -4664,12 +4673,16 @@ void QDomElementPrivate::save(QTextStream& s, int depth, int indent) const
removeAttributeNS().
If you want to access the text of a node use text(), e.g.
- \snippet doc/src/snippets/code/src_xml_dom_qdom.cpp 9
+
+ \snippet code/src_xml_dom_qdom.cpp 9
+
The text() function operates recursively to find the text (since
not all elements contain text). If you want to find all the text
in all of a node's children, iterate over the children looking for
QDomText nodes, e.g.
- \snippet doc/src/snippets/code/src_xml_dom_qdom.cpp 10
+
+ \snippet code/src_xml_dom_qdom.cpp 10
+
Note that we attempt to convert each node to a text node and use
text() rather than using firstChild().toText().data() or
n.toText().data() directly on the node, because the node may not
@@ -4682,11 +4695,12 @@ void QDomElementPrivate::save(QTextStream& s, int depth, int indent) const
To browse the elements of a dom document use firstChildElement(), lastChildElement(),
nextSiblingElement() and previousSiblingElement(). For example, to iterate over all
child elements called "entry" in a root element called "database", you can use:
- \snippet doc/src/snippets/code/src_xml_dom_qdom.cpp 11
+
+ \snippet code/src_xml_dom_qdom.cpp 11
For further information about the Document Object Model see
- \l{http://www.w3.org/TR/REC-DOM-Level-1/}{Level 1} and
- \l{http://www.w3.org/TR/DOM-Level-2-Core/}{Level 2 Core}.
+ \l{W3C DOM Level 1}{Level 1} and
+ \l{W3C DOM Level 2}{Level 2 Core}.
For a more general introduction of the DOM implementation see the
QDomDocument documentation.
*/
@@ -4749,7 +4763,7 @@ void QDomElement::setTagName(const QString& name)
/*!
Returns the tag name of this element. For an XML element like this:
- \snippet doc/src/snippets/code/src_xml_dom_qdom.cpp 12
+ \snippet code/src_xml_dom_qdom.cpp 12
the tagname would return "img".
@@ -4766,7 +4780,7 @@ QString QDomElement::tagName() const
/*!
Returns a QDomNamedNodeMap containing all this element's attributes.
- \sa attribute() setAttribute() attributeNode() setAttributeNode()
+ \sa attribute(), setAttribute(), attributeNode(), setAttributeNode()
*/
QDomNamedNodeMap QDomElement::attributes() const
{
@@ -4779,7 +4793,7 @@ QDomNamedNodeMap QDomElement::attributes() const
Returns the attribute called \a name. If the attribute does not
exist \a defValue is returned.
- \sa setAttribute() attributeNode() setAttributeNode() attributeNS()
+ \sa setAttribute(), attributeNode(), setAttributeNode(), attributeNS()
*/
QString QDomElement::attribute(const QString& name, const QString& defValue) const
{
@@ -4793,7 +4807,7 @@ QString QDomElement::attribute(const QString& name, const QString& defValue) con
attribute with the same name exists, its value is replaced by \a
value.
- \sa attribute() setAttributeNode() setAttributeNS()
+ \sa attribute(), setAttributeNode(), setAttributeNS()
*/
void QDomElement::setAttribute(const QString& name, const QString& value)
{
@@ -4880,7 +4894,7 @@ void QDomElement::setAttribute(const QString& name, double value)
/*!
Removes the attribute called name \a name from this element.
- \sa setAttribute() attribute() removeAttributeNS()
+ \sa setAttribute(), attribute(), removeAttributeNS()
*/
void QDomElement::removeAttribute(const QString& name)
{
@@ -4891,10 +4905,10 @@ void QDomElement::removeAttribute(const QString& name)
/*!
Returns the QDomAttr object that corresponds to the attribute
- called \a name. If no such attribute exists a \link
- QDomNode::isNull() null attribute\endlink is returned.
+ called \a name. If no such attribute exists a
+ \l{QDomNode::isNull()}{null attribute} is returned.
- \sa setAttributeNode() attribute() setAttribute() attributeNodeNS()
+ \sa setAttributeNode(), attribute(), setAttribute(), attributeNodeNS()
*/
QDomAttr QDomElement::attributeNode(const QString& name)
{
@@ -4908,10 +4922,10 @@ QDomAttr QDomElement::attributeNode(const QString& name)
If the element has another attribute that has the same name as \a
newAttr, this function replaces that attribute and returns it;
- otherwise the function returns a \link QDomNode::isNull() null
- attribute\endlink.
+ otherwise the function returns a
+ \l{QDomNode::isNull()}{null attribute}.
- \sa attributeNode() setAttribute() setAttributeNodeNS()
+ \sa attributeNode(), setAttribute(), setAttributeNodeNS()
*/
QDomAttr QDomElement::setAttributeNode(const QDomAttr& newAttr)
{
@@ -4923,7 +4937,7 @@ QDomAttr QDomElement::setAttributeNode(const QDomAttr& newAttr)
/*!
Removes the attribute \a oldAttr from the element and returns it.
- \sa attributeNode() setAttributeNode()
+ \sa attributeNode(), setAttributeNode()
*/
QDomAttr QDomElement::removeAttributeNode(const QDomAttr& oldAttr)
{
@@ -4939,7 +4953,7 @@ QDomAttr QDomElement::removeAttributeNode(const QDomAttr& oldAttr)
elements in the returned list is the order they are encountered
during the preorder traversal.
- \sa elementsByTagNameNS() QDomDocument::elementsByTagName()
+ \sa elementsByTagNameNS(), QDomDocument::elementsByTagName()
*/
QDomNodeList QDomElement::elementsByTagName(const QString& tagname) const
{
@@ -4970,7 +4984,7 @@ bool QDomElement::hasAttribute(const QString& name) const
namespace URI \a nsURI. If the attribute does not exist \a
defValue is returned.
- \sa setAttributeNS() attributeNodeNS() setAttributeNodeNS() attribute()
+ \sa setAttributeNS(), attributeNodeNS(), setAttributeNodeNS(), attribute()
*/
QString QDomElement::attributeNS(const QString nsURI, const QString& localName, const QString& defValue) const
{
@@ -4989,7 +5003,7 @@ QString QDomElement::attributeNS(const QString nsURI, const QString& localName,
Although \a qName is the qualified name, the local name is used to
decide if an existing attribute's value should be replaced.
- \sa attributeNS() setAttributeNodeNS() setAttribute()
+ \sa attributeNS(), setAttributeNodeNS(), setAttribute()
*/
void QDomElement::setAttributeNS(const QString nsURI, const QString& qName, const QString& value)
{
@@ -5050,7 +5064,7 @@ void QDomElement::setAttributeNS(const QString nsURI, const QString& qName, doub
Removes the attribute with the local name \a localName and the
namespace URI \a nsURI from this element.
- \sa setAttributeNS() attributeNS() removeAttribute()
+ \sa setAttributeNS(), attributeNS(), removeAttribute()
*/
void QDomElement::removeAttributeNS(const QString& nsURI, const QString& localName)
{
@@ -5068,7 +5082,7 @@ void QDomElement::removeAttributeNS(const QString& nsURI, const QString& localNa
If no such attribute exists a \l{QDomNode::isNull()}{null
attribute} is returned.
- \sa setAttributeNode() attribute() setAttribute()
+ \sa setAttributeNode(), attribute(), setAttribute()
*/
QDomAttr QDomElement::attributeNodeNS(const QString& nsURI, const QString& localName)
{
@@ -5085,7 +5099,7 @@ QDomAttr QDomElement::attributeNodeNS(const QString& nsURI, const QString& local
attribute and returns it; otherwise the function returns a \link
QDomNode::isNull() null attribute\endlink.
- \sa attributeNodeNS() setAttributeNS() setAttributeNode()
+ \sa attributeNodeNS(), setAttributeNS(), setAttributeNode()
*/
QDomAttr QDomElement::setAttributeNodeNS(const QDomAttr& newAttr)
{
@@ -5101,7 +5115,7 @@ QDomAttr QDomElement::setAttributeNodeNS(const QDomAttr& newAttr)
as its root. The order of the elements in the returned list is the
order they are encountered during the preorder traversal.
- \sa elementsByTagName() QDomDocument::elementsByTagNameNS()
+ \sa elementsByTagName(), QDomDocument::elementsByTagNameNS()
*/
QDomNodeList QDomElement::elementsByTagNameNS(const QString& nsURI, const QString& localName) const
{
@@ -5124,12 +5138,12 @@ bool QDomElement::hasAttributeNS(const QString& nsURI, const QString& localName)
Returns the element's text or an empty string.
Example:
- \snippet doc/src/snippets/code/src_xml_dom_qdom.cpp 13
+ \snippet code/src_xml_dom_qdom.cpp 13
The function text() of the QDomElement for the \c{<h1>} tag,
will return the following text:
- \snippet doc/src/snippets/code/src_xml_dom_qdom.cpp 14
+ \snippet code/src_xml_dom_qdom.cpp 14
Comments are ignored by this function. It only evaluates QDomText
and QDomCDATASection objects.
@@ -5335,12 +5349,14 @@ void QDomCommentPrivate::save(QTextStream& s, int depth, int indent) const
\ingroup xml-tools
A comment in the parsed XML such as this:
- \snippet doc/src/snippets/code/src_xml_dom_qdom.cpp 15
+
+ \snippet code/src_xml_dom_qdom.cpp 15
+
is represented by QDomComment objects in the parsed Dom tree.
For further information about the Document Object Model see
- \l{http://www.w3.org/TR/REC-DOM-Level-1/} and
- \l{http://www.w3.org/TR/DOM-Level-2-Core/}.
+ \l{W3C DOM Level 1}{Level 1} and
+ \l{W3C DOM Level 2}{Level 2 Core}.
For a more general introduction of the DOM implementation see the
QDomDocument documentation.
*/
@@ -6102,7 +6118,7 @@ QString QDomProcessingInstruction::target() const
/*!
Returns the content of this processing instruction.
- \sa setData() target()
+ \sa setData(), target()
*/
QString QDomProcessingInstruction::data() const
{
@@ -6554,13 +6570,15 @@ void QDomDocumentPrivate::saveDocument(QTextStream& s, const int indent, QDomNod
tag with elementsByTagName() or with elementsByTagNameNS().
The QDom classes are typically used as follows:
- \snippet doc/src/snippets/code/src_xml_dom_qdom.cpp 16
+
+ \snippet code/src_xml_dom_qdom.cpp 16
Once \c doc and \c elem go out of scope, the whole internal tree
representing the XML document is deleted.
To create a document using DOM use code like this:
- \snippet doc/src/snippets/code/src_xml_dom_qdom.cpp 17
+
+ \snippet code/src_xml_dom_qdom.cpp 17
For further information about the Document Object Model see
the Document Object Model (DOM)
@@ -6705,8 +6723,8 @@ bool QDomDocument::setContent(const QString& text, bool namespaceProcessing, QSt
\li Any unparsed entity reference is replaced with an empty string.
\endlist
- \sa QDomNode::namespaceURI() QDomNode::localName()
- QDomNode::prefix() QString::isNull() QString::isEmpty()
+ \sa QDomNode::namespaceURI(), QDomNode::localName(),
+ QDomNode::prefix(), QString::isNull(), QString::isEmpty()
*/
bool QDomDocument::setContent(const QByteArray &data, bool namespaceProcessing, QString *errorMsg, int *errorLine, int *errorColumn)
{
@@ -6881,7 +6899,7 @@ QDomElement QDomDocument::documentElement() const
If \a tagName is not a valid XML name, the behavior of this function is governed
by QDomImplementation::InvalidDataPolicy.
- \sa createElementNS() QDomNode::appendChild() QDomNode::insertBefore()
+ \sa createElementNS(), QDomNode::appendChild(), QDomNode::insertBefore(),
QDomNode::insertAfter()
*/
QDomElement QDomDocument::createElement(const QString& tagName)
@@ -6911,7 +6929,7 @@ QDomDocumentFragment QDomDocument::createDocumentFragment()
data of an XML document (even in the form of character references), the
behavior of this function is governed by QDomImplementation::InvalidDataPolicy.
- \sa QDomNode::appendChild() QDomNode::insertBefore() QDomNode::insertAfter()
+ \sa QDomNode::appendChild(), QDomNode::insertBefore(), QDomNode::insertAfter()
*/
QDomText QDomDocument::createTextNode(const QString& value)
{
@@ -6927,7 +6945,7 @@ QDomText QDomDocument::createTextNode(const QString& value)
If \a value contains characters which cannot be stored in an XML comment,
the behavior of this function is governed by QDomImplementation::InvalidDataPolicy.
- \sa QDomNode::appendChild() QDomNode::insertBefore() QDomNode::insertAfter()
+ \sa QDomNode::appendChild(), QDomNode::insertBefore(), QDomNode::insertAfter()
*/
QDomComment QDomDocument::createComment(const QString& value)
{
@@ -6944,7 +6962,7 @@ QDomComment QDomDocument::createComment(const QString& value)
the behavior of this function is governed by
QDomImplementation::InvalidDataPolicy.
- \sa QDomNode::appendChild() QDomNode::insertBefore() QDomNode::insertAfter()
+ \sa QDomNode::appendChild(), QDomNode::insertBefore(), QDomNode::insertAfter()
*/
QDomCDATASection QDomDocument::createCDATASection(const QString& value)
{
@@ -6963,7 +6981,7 @@ QDomCDATASection QDomDocument::createCDATASection(const QString& value)
appear in a processing instruction, the behavior of this function is governed by
QDomImplementation::InvalidDataPolicy.
- \sa QDomNode::appendChild() QDomNode::insertBefore() QDomNode::insertAfter()
+ \sa QDomNode::appendChild(), QDomNode::insertBefore(), QDomNode::insertAfter()
*/
QDomProcessingInstruction QDomDocument::createProcessingInstruction(const QString& target,
const QString& data)
@@ -6997,7 +7015,7 @@ QDomAttr QDomDocument::createAttribute(const QString& name)
If \a name is not a valid XML name, the behavior of this function is governed by
QDomImplementation::InvalidDataPolicy.
- \sa QDomNode::appendChild() QDomNode::insertBefore() QDomNode::insertAfter()
+ \sa QDomNode::appendChild(), QDomNode::insertBefore(), QDomNode::insertAfter()
*/
QDomEntityReference QDomDocument::createEntityReference(const QString& name)
{
@@ -7012,7 +7030,7 @@ QDomEntityReference QDomDocument::createEntityReference(const QString& name)
the order they are encountered in a preorder traversal of the
element tree.
- \sa elementsByTagNameNS() QDomElement::elementsByTagName()
+ \sa elementsByTagNameNS(), QDomElement::elementsByTagName()
*/
QDomNodeList QDomDocument::elementsByTagName(const QString& tagname) const
{
@@ -7081,8 +7099,8 @@ QDomNodeList QDomDocument::elementsByTagName(const QString& tagname) const
\li The text is copied to the new node.
\endtable
- \sa QDomElement::setAttribute() QDomNode::insertBefore()
- QDomNode::insertAfter() QDomNode::replaceChild() QDomNode::removeChild()
+ \sa QDomElement::setAttribute(), QDomNode::insertBefore(),
+ QDomNode::insertAfter(), QDomNode::replaceChild(), QDomNode::removeChild(),
QDomNode::appendChild()
*/
QDomNode QDomDocument::importNode(const QDomNode& importedNode, bool deep)
@@ -7136,7 +7154,7 @@ QDomAttr QDomDocument::createAttributeNS(const QString& nsURI, const QString& qN
\a nsURI. The order of the node list is the order they are
encountered in a preorder traversal of the element tree.
- \sa elementsByTagName() QDomElement::elementsByTagNameNS()
+ \sa elementsByTagName(), QDomElement::elementsByTagNameNS()
*/
QDomNodeList QDomDocument::elementsByTagNameNS(const QString& nsURI, const QString& localName)
{
diff --git a/src/xml/sax/qxml.cpp b/src/xml/sax/qxml.cpp
index a5c206dc27..616ceeb042 100644
--- a/src/xml/sax/qxml.cpp
+++ b/src/xml/sax/qxml.cpp
@@ -1208,7 +1208,7 @@ void QXmlAttributes::clear()
\a uri and the local name is \a localPart. The value of the
attribute is \a value.
- \sa qName() uri() localName() value()
+ \sa qName(), uri(), localName(), value()
*/
void QXmlAttributes::append(const QString &qName, const QString &uri, const QString &localPart, const QString &value)
{
@@ -1266,7 +1266,7 @@ void QXmlAttributes::append(const QString &qName, const QString &uri, const QStr
raw XML file. The benefit of using the QXmlInputClass in such
cases is that it tries to use the correct encoding.
- \sa QXmlReader QXmlSimpleReader
+ \sa QXmlReader, QXmlSimpleReader
*/
// the following two are guaranteed not to be a character
@@ -1315,7 +1315,7 @@ QXmlInputSource::QXmlInputSource()
is 0 or it is not possible to read from the device, the input
source will contain no data.
- \sa setData() fetchData() QIODevice
+ \sa setData(), fetchData(), QIODevice
*/
QXmlInputSource::QXmlInputSource(QIODevice *dev)
{
@@ -1353,7 +1353,8 @@ supplied input is well-formed. Therefore, when reimplementing
this function, it is important to ensure that this behavior is
duplicated.
-\sa reset() fetchData() QXmlSimpleReader::parse() QXmlSimpleReader::parseContinue()
+\sa reset(), fetchData(), QXmlSimpleReader::parse(),
+ QXmlSimpleReader::parseContinue()
*/
QChar QXmlInputSource::next()
{
@@ -1400,7 +1401,7 @@ void QXmlInputSource::reset()
Returns the data the input source contains or an empty string if the
input source does not contain any data.
- \sa setData() QXmlInputSource() fetchData()
+ \sa setData(), QXmlInputSource(), fetchData()
*/
QString QXmlInputSource::data() const
{
@@ -1456,7 +1457,7 @@ void QXmlInputSource::setData(const QByteArray& dat)
You don't normally need to use this function if you use next().
- \sa data() next() QXmlInputSource()
+ \sa data(), next(), QXmlInputSource()
*/
void QXmlInputSource::fetchData()
@@ -2364,13 +2365,13 @@ events are reported.
it we can use the same handler for both of the following
reader functions:
- \snippet doc/src/snippets/xml/rsslisting/rsslisting.cpp 0
+ \snippet rsslisting/rsslisting.cpp 0
Since the reader will inform the handler of parsing errors, it is
necessary to reimplement QXmlErrorHandler::fatalError() if, for
example, we want to stop parsing when such an error occurs:
- \snippet doc/src/snippets/xml/rsslisting/handler.cpp 0
+ \snippet rsslisting/handler.cpp 0
The above function returns false, which tells the reader to stop
parsing. To continue to use the same reader,
@@ -3007,7 +3008,7 @@ void QXmlSimpleReaderPrivate::initIncrementalParsing()
create a reader, and define an input source to be used by the
reader:
- \snippet doc/src/snippets/xml/simpleparse/main.cpp 0
+ \snippet simpleparse/main.cpp 0
A handler lets us perform actions when the reader encounters
certain types of content, or if errors in the input are found. The
@@ -3016,7 +3017,7 @@ void QXmlSimpleReaderPrivate::initIncrementalParsing()
handler by subclassing QXmlDefaultHandler, and use this to handle
both error and content events:
- \snippet doc/src/snippets/xml/simpleparse/main.cpp 1
+ \snippet simpleparse/main.cpp 1
If you don't set at least the content and error handlers, the
parser will fall back on its default behavior---and will do
@@ -3026,7 +3027,7 @@ void QXmlSimpleReaderPrivate::initIncrementalParsing()
single pass using the parse() function with an argument that
specifies the input source:
- \snippet doc/src/snippets/xml/simpleparse/main.cpp 2
+ \snippet simpleparse/main.cpp 2
If you can't parse the entire input in one go (for example, it is
huge, or is being delivered over a network connection), data can
@@ -3041,7 +3042,7 @@ void QXmlSimpleReaderPrivate::initIncrementalParsing()
Aspects of the parsing behavior can be adapted using setFeature()
and setProperty().
- \snippet doc/src/snippets/code/src_xml_sax_qxml.cpp 0
+ \snippet code/src_xml_sax_qxml.cpp 0
QXmlSimpleReader is not reentrant. If you want to use the class
in threaded code, lock the code using QXmlSimpleReader with a
diff --git a/src/xml/xml.pro b/src/xml/xml.pro
index e860250507..b8c24496ae 100644
--- a/src/xml/xml.pro
+++ b/src/xml/xml.pro
@@ -23,5 +23,6 @@ win32-borland {
QMAKE_CXXFLAGS_WARN_ON += -w-use
}
+include(doc/doc.pri)
include(dom/dom.pri)
include(sax/sax.pri)
diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro
index 23221122d9..81d144dd03 100644
--- a/tests/auto/auto.pro
+++ b/tests/auto/auto.pro
@@ -14,16 +14,10 @@ SUBDIRS += \
other \
widgets \
printsupport \
+ cmake
cross_compile: SUBDIRS -= tools
!contains(QT_CONFIG, opengl): SUBDIRS -= opengl
!unix|embedded|!contains(QT_CONFIG, dbus): SUBDIRS -= dbus
contains(QT_CONFIG, no-widgets): SUBDIRS -= widgets
-
-# disable 'make check' on Mac OS X for the following subdirs for the time being
-mac {
- network.CONFIG += no_check_target
-}
-
-!contains(QT_CONFIG, concurrent): SUBDIRS -= concurrent
-
+!contains(QT_CONFIG, concurrent): SUBDIRS -= concurrent
diff --git a/tests/manual/cmake/CMakeLists.txt b/tests/auto/cmake/CMakeLists.txt
index f7b16946c1..b9b0e8c605 100644
--- a/tests/manual/cmake/CMakeLists.txt
+++ b/tests/auto/cmake/CMakeLists.txt
@@ -43,6 +43,7 @@ macro(expect_pass _dir)
"${CMAKE_CURRENT_BINARY_DIR}/${_dir}"
--build-generator ${CMAKE_GENERATOR}
--build-makeprogram ${CMAKE_MAKE_PROGRAM}
+ --build-options -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
)
endmacro()
@@ -73,14 +74,15 @@ macro(expect_fail _dir)
"${CMAKE_CURRENT_BINARY_DIR}/failbuild/${_dir}/build"
--build-generator ${CMAKE_GENERATOR}
--build-makeprogram ${CMAKE_MAKE_PROGRAM}
+ --build-options -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
)
endmacro()
-if(${CMAKE_VERSION} VERSION_GREATER 2.8.7)
+if(NOT ${CMAKE_VERSION} VERSION_LESS 2.8.7)
# Requires CMAKE_AUTOMOC function in CMake 2.8.7
expect_pass(pass1)
else()
- message("CMake version older than 2.8.7. Not running test \"pass1\"")
+ message("CMake version older than 2.8.7 (Found ${CMAKE_VERSION}). Not running test \"pass1\"")
endif()
expect_pass(pass2)
# Modules do not currently find their own dependencies.
@@ -90,4 +92,9 @@ expect_fail(fail5)
expect_pass("pass(needsquoting)6")
expect_pass(pass7)
expect_pass(pass8)
-expect_pass(pass9)
+
+# If QtDBus has been installed then run the tests for its macros.
+find_package(Qt5DBus QUIET)
+if (Qt5DBus_FOUND AND NOT APPLE)
+ expect_pass(pass9)
+endif()
diff --git a/tests/auto/cmake/cmake.pro b/tests/auto/cmake/cmake.pro
new file mode 100644
index 0000000000..0fe999b957
--- /dev/null
+++ b/tests/auto/cmake/cmake.pro
@@ -0,0 +1,54 @@
+
+CMAKE_VERSION = $$system(cmake --version)
+
+# Cause make to do nothing.
+TEMPLATE = subdirs
+
+check.commands =
+isEmpty(CMAKE_VERSION) {
+ message("cmake executable not found. Not running CMake unit tests")
+} else {
+ CTEST_VERSION = $$system(ctest --version)
+ isEmpty(CTEST_VERSION) {
+ message("ctest executable not found. Not running CMake unit tests")
+ } else {
+ CMAKE_VERSION = $$last(CMAKE_VERSION)
+ CMAKE_VERSION_MAJOR = $$section(CMAKE_VERSION, ., 0, 0)
+ CMAKE_VERSION_MINOR = $$section(CMAKE_VERSION, ., 1, 1)
+ CMAKE_VERSION_PATCH = $$section(CMAKE_VERSION, ., 2, 2)
+
+ VERSION_OK =
+ greaterThan(CMAKE_VERSION_MAJOR, 2) {
+ VERSION_OK = 1
+ } else:greaterThan(CMAKE_VERSION_MAJOR, 1):greaterThan(CMAKE_VERSION_MINOR, 8) {
+ VERSION_OK = 1
+ } else:greaterThan(CMAKE_VERSION_MAJOR, 1):greaterThan(CMAKE_VERSION_MINOR, 7):greaterThan(CMAKE_VERSION_PATCH, 2) {
+ VERSION_OK = 1
+ }
+
+ isEmpty(VERSION_OK) {
+ message("cmake $$CMAKE_VERSION is too old for this test.")
+ } else {
+ SET = set
+ equals(QMAKE_DIR_SEP, "/"):SET = export
+
+ CMAKE_BUILD_TYPE = Debug
+ CONFIG(release, debug|release):CMAKE_BUILD_TYPE = Release
+
+ BUILD_DIR = $$replace($$list($$OUT_PWD/build), /, $$QMAKE_DIR_SEP)
+
+ check.commands = \
+ cd . && $$SET CMAKE_PREFIX_PATH=$$[QT_INSTALL_PREFIX] && \
+ $(MKDIR) $$BUILD_DIR && cd $$BUILD_DIR && \
+ cmake $$_PRO_FILE_PWD_ -DCMAKE_BUILD_TYPE=$${CMAKE_BUILD_TYPE} && \
+ $(TESTRUNNER) ctest --output-on-failure
+
+ }
+ }
+}
+
+insignificant_test:!isEmpty(check.commands) {
+ check.commands = -$${check.commands}
+}
+
+QMAKE_EXTRA_TARGETS *= check
diff --git a/tests/manual/cmake/fail4/CMakeLists.txt b/tests/auto/cmake/fail4/CMakeLists.txt
index fdf90e17a7..fdf90e17a7 100644
--- a/tests/manual/cmake/fail4/CMakeLists.txt
+++ b/tests/auto/cmake/fail4/CMakeLists.txt
diff --git a/tests/manual/cmake/fail4/myobject.cpp b/tests/auto/cmake/fail4/myobject.cpp
index 292a76e569..292a76e569 100644
--- a/tests/manual/cmake/fail4/myobject.cpp
+++ b/tests/auto/cmake/fail4/myobject.cpp
diff --git a/tests/manual/cmake/fail4/myobject.h b/tests/auto/cmake/fail4/myobject.h
index cd8765d03f..cd8765d03f 100644
--- a/tests/manual/cmake/fail4/myobject.h
+++ b/tests/auto/cmake/fail4/myobject.h
diff --git a/tests/manual/cmake/fail4/pass4.qrc b/tests/auto/cmake/fail4/pass4.qrc
index 00a17f541f..00a17f541f 100644
--- a/tests/manual/cmake/fail4/pass4.qrc
+++ b/tests/auto/cmake/fail4/pass4.qrc
diff --git a/tests/manual/cmake/fail4/resource_file.txt b/tests/auto/cmake/fail4/resource_file.txt
index 2c604a4f18..2c604a4f18 100644
--- a/tests/manual/cmake/fail4/resource_file.txt
+++ b/tests/auto/cmake/fail4/resource_file.txt
diff --git a/tests/manual/cmake/fail5/CMakeLists.txt b/tests/auto/cmake/fail5/CMakeLists.txt
index 962314c818..962314c818 100644
--- a/tests/manual/cmake/fail5/CMakeLists.txt
+++ b/tests/auto/cmake/fail5/CMakeLists.txt
diff --git a/tests/manual/cmake/fail5/myobject.cpp b/tests/auto/cmake/fail5/myobject.cpp
index 292a76e569..292a76e569 100644
--- a/tests/manual/cmake/fail5/myobject.cpp
+++ b/tests/auto/cmake/fail5/myobject.cpp
diff --git a/tests/manual/cmake/fail5/myobject.h b/tests/auto/cmake/fail5/myobject.h
index cd8765d03f..cd8765d03f 100644
--- a/tests/manual/cmake/fail5/myobject.h
+++ b/tests/auto/cmake/fail5/myobject.h
diff --git a/tests/manual/cmake/pass(needsquoting)6/CMakeLists.txt b/tests/auto/cmake/pass(needsquoting)6/CMakeLists.txt
index 7b9561c588..7b9561c588 100644
--- a/tests/manual/cmake/pass(needsquoting)6/CMakeLists.txt
+++ b/tests/auto/cmake/pass(needsquoting)6/CMakeLists.txt
diff --git a/tests/manual/cmake/pass(needsquoting)6/mywidget.cpp b/tests/auto/cmake/pass(needsquoting)6/mywidget.cpp
index 7f8923810d..7f8923810d 100644
--- a/tests/manual/cmake/pass(needsquoting)6/mywidget.cpp
+++ b/tests/auto/cmake/pass(needsquoting)6/mywidget.cpp
diff --git a/tests/manual/cmake/pass(needsquoting)6/mywidget.h b/tests/auto/cmake/pass(needsquoting)6/mywidget.h
index 11968e6454..11968e6454 100644
--- a/tests/manual/cmake/pass(needsquoting)6/mywidget.h
+++ b/tests/auto/cmake/pass(needsquoting)6/mywidget.h
diff --git a/tests/manual/cmake/pass(needsquoting)6/mywidget.ui b/tests/auto/cmake/pass(needsquoting)6/mywidget.ui
index ac42ac4dc2..ac42ac4dc2 100644
--- a/tests/manual/cmake/pass(needsquoting)6/mywidget.ui
+++ b/tests/auto/cmake/pass(needsquoting)6/mywidget.ui
diff --git a/tests/manual/cmake/pass1/CMakeLists.txt b/tests/auto/cmake/pass1/CMakeLists.txt
index 970ca33078..970ca33078 100644
--- a/tests/manual/cmake/pass1/CMakeLists.txt
+++ b/tests/auto/cmake/pass1/CMakeLists.txt
diff --git a/tests/manual/cmake/pass1/three.cpp b/tests/auto/cmake/pass1/three.cpp
index 63bcbff480..63bcbff480 100644
--- a/tests/manual/cmake/pass1/three.cpp
+++ b/tests/auto/cmake/pass1/three.cpp
diff --git a/tests/manual/cmake/pass1/two.cpp b/tests/auto/cmake/pass1/two.cpp
index 24fcd5dba4..24fcd5dba4 100644
--- a/tests/manual/cmake/pass1/two.cpp
+++ b/tests/auto/cmake/pass1/two.cpp
diff --git a/tests/manual/cmake/pass2/CMakeLists.txt b/tests/auto/cmake/pass2/CMakeLists.txt
index c859f13fff..c859f13fff 100644
--- a/tests/manual/cmake/pass2/CMakeLists.txt
+++ b/tests/auto/cmake/pass2/CMakeLists.txt
diff --git a/tests/manual/cmake/pass2/myobject.cpp b/tests/auto/cmake/pass2/myobject.cpp
index a237b00c50..a237b00c50 100644
--- a/tests/manual/cmake/pass2/myobject.cpp
+++ b/tests/auto/cmake/pass2/myobject.cpp
diff --git a/tests/manual/cmake/pass2/myobject.h b/tests/auto/cmake/pass2/myobject.h
index cd8765d03f..cd8765d03f 100644
--- a/tests/manual/cmake/pass2/myobject.h
+++ b/tests/auto/cmake/pass2/myobject.h
diff --git a/tests/manual/cmake/pass2/pass2.qrc b/tests/auto/cmake/pass2/pass2.qrc
index 00a17f541f..00a17f541f 100644
--- a/tests/manual/cmake/pass2/pass2.qrc
+++ b/tests/auto/cmake/pass2/pass2.qrc
diff --git a/tests/manual/cmake/pass2/resource_file.txt b/tests/auto/cmake/pass2/resource_file.txt
index 2c604a4f18..2c604a4f18 100644
--- a/tests/manual/cmake/pass2/resource_file.txt
+++ b/tests/auto/cmake/pass2/resource_file.txt
diff --git a/tests/manual/cmake/pass3/CMakeLists.txt b/tests/auto/cmake/pass3/CMakeLists.txt
index 7fa6731f9b..7fa6731f9b 100644
--- a/tests/manual/cmake/pass3/CMakeLists.txt
+++ b/tests/auto/cmake/pass3/CMakeLists.txt
diff --git a/tests/manual/cmake/pass3/mywidget.cpp b/tests/auto/cmake/pass3/mywidget.cpp
index 7f8923810d..7f8923810d 100644
--- a/tests/manual/cmake/pass3/mywidget.cpp
+++ b/tests/auto/cmake/pass3/mywidget.cpp
diff --git a/tests/manual/cmake/pass3/mywidget.h b/tests/auto/cmake/pass3/mywidget.h
index 11968e6454..11968e6454 100644
--- a/tests/manual/cmake/pass3/mywidget.h
+++ b/tests/auto/cmake/pass3/mywidget.h
diff --git a/tests/manual/cmake/pass3/mywidget.ui b/tests/auto/cmake/pass3/mywidget.ui
index ac42ac4dc2..ac42ac4dc2 100644
--- a/tests/manual/cmake/pass3/mywidget.ui
+++ b/tests/auto/cmake/pass3/mywidget.ui
diff --git a/tests/manual/cmake/pass7/CMakeLists.txt b/tests/auto/cmake/pass7/CMakeLists.txt
index ecf6b3649e..ecf6b3649e 100644
--- a/tests/manual/cmake/pass7/CMakeLists.txt
+++ b/tests/auto/cmake/pass7/CMakeLists.txt
diff --git a/tests/manual/cmake/pass7/main.cpp b/tests/auto/cmake/pass7/main.cpp
index 0a6b09d877..0a6b09d877 100644
--- a/tests/manual/cmake/pass7/main.cpp
+++ b/tests/auto/cmake/pass7/main.cpp
diff --git a/tests/manual/cmake/pass8/CMakeLists.txt b/tests/auto/cmake/pass8/CMakeLists.txt
index 735b1bd26e..735b1bd26e 100644
--- a/tests/manual/cmake/pass8/CMakeLists.txt
+++ b/tests/auto/cmake/pass8/CMakeLists.txt
diff --git a/tests/manual/cmake/pass8/myobject.cpp b/tests/auto/cmake/pass8/myobject.cpp
index b6287b2540..b6287b2540 100644
--- a/tests/manual/cmake/pass8/myobject.cpp
+++ b/tests/auto/cmake/pass8/myobject.cpp
diff --git a/tests/manual/cmake/pass8/myobject.h b/tests/auto/cmake/pass8/myobject.h
index 71a65ee801..71a65ee801 100644
--- a/tests/manual/cmake/pass8/myobject.h
+++ b/tests/auto/cmake/pass8/myobject.h
diff --git a/tests/manual/cmake/pass9/CMakeLists.txt b/tests/auto/cmake/pass9/CMakeLists.txt
index 6aefd37696..bf8ff6b3da 100644
--- a/tests/manual/cmake/pass9/CMakeLists.txt
+++ b/tests/auto/cmake/pass9/CMakeLists.txt
@@ -3,13 +3,17 @@ cmake_minimum_required(VERSION 2.8)
project(pass9)
+find_package(Qt5Core REQUIRED)
find_package(Qt5DBus REQUIRED)
include_directories(
+ ${Qt5Core_INCLUDE_DIRS}
${Qt5DBus_INCLUDE_DIRS}
)
-add_definitions(${Qt5DBus_DEFINITIONS})
+add_definitions(${Qt5Core_DEFINITIONS} ${Qt5DBus_DEFINITIONS})
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Core_EXECUTABLE_COMPILE_FLAGS}")
set(CMAKE_INCLUDE_CURRENT_DIR ON)
@@ -29,4 +33,4 @@ qt5_add_dbus_adaptor(my_srcs
)
add_executable(myobject ${my_srcs} ${moc_files})
-target_link_libraries(myobject ${Qt5DBus_LIBRARIES})
+target_link_libraries(myobject ${Qt5DBus_LIBRARIES} ${Qt5Core_LIBRARIES})
diff --git a/tests/manual/cmake/pass9/mydbusobject.cpp b/tests/auto/cmake/pass9/mydbusobject.cpp
index ee211bbe9b..ee211bbe9b 100644
--- a/tests/manual/cmake/pass9/mydbusobject.cpp
+++ b/tests/auto/cmake/pass9/mydbusobject.cpp
diff --git a/tests/manual/cmake/pass9/mydbusobject.h b/tests/auto/cmake/pass9/mydbusobject.h
index dd9a023ffe..dd9a023ffe 100644
--- a/tests/manual/cmake/pass9/mydbusobject.h
+++ b/tests/auto/cmake/pass9/mydbusobject.h
diff --git a/tests/auto/concurrent/qtconcurrentfilter/qtconcurrentfilter.pro b/tests/auto/concurrent/qtconcurrentfilter/qtconcurrentfilter.pro
index eb0c054f6f..e82d101de0 100644
--- a/tests/auto/concurrent/qtconcurrentfilter/qtconcurrentfilter.pro
+++ b/tests/auto/concurrent/qtconcurrentfilter/qtconcurrentfilter.pro
@@ -3,5 +3,3 @@ TARGET = tst_qtconcurrentfilter
QT = core testlib concurrent
SOURCES = tst_qtconcurrentfilter.cpp
DEFINES += QT_STRICT_ITERATORS
-
-CONFIG += insignificant_test # See QTBUG-20688
diff --git a/tests/auto/concurrent/qtconcurrentfilter/tst_qtconcurrentfilter.cpp b/tests/auto/concurrent/qtconcurrentfilter/tst_qtconcurrentfilter.cpp
index c8d4c211a9..57f05cbeae 100644
--- a/tests/auto/concurrent/qtconcurrentfilter/tst_qtconcurrentfilter.cpp
+++ b/tests/auto/concurrent/qtconcurrentfilter/tst_qtconcurrentfilter.cpp
@@ -1472,6 +1472,8 @@ void tst_QtConcurrentFilter::noDetach()
QVERIFY(ll.isDetached() == false);
QtConcurrent::filter(l, waitFilterfn).waitForFinished();
+ if (!l.isDetached())
+ QEXPECT_FAIL("", "QTBUG-20688: Known unstable failure", Abort);
QVERIFY(l.isDetached() == true);
QVERIFY(ll.isDetached() == true);
}
diff --git a/tests/auto/corelib/animation/qanimationgroup/tst_qanimationgroup.cpp b/tests/auto/corelib/animation/qanimationgroup/tst_qanimationgroup.cpp
index 3abd851c89..db7f067680 100644
--- a/tests/auto/corelib/animation/qanimationgroup/tst_qanimationgroup.cpp
+++ b/tests/auto/corelib/animation/qanimationgroup/tst_qanimationgroup.cpp
@@ -145,9 +145,9 @@ void tst_QAnimationGroup::emptyGroup()
QCOMPARE(groupStateChangedSpy.count(), 2);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(groupStateChangedSpy.at(0).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(groupStateChangedSpy.at(0).first()),
QAnimationGroup::Running);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(groupStateChangedSpy.at(1).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(groupStateChangedSpy.at(1).first()),
QAnimationGroup::Stopped);
QCOMPARE(group.state(), QAnimationGroup::Stopped);
@@ -160,9 +160,9 @@ void tst_QAnimationGroup::emptyGroup()
group.start();
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(groupStateChangedSpy.at(2).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(groupStateChangedSpy.at(2).first()),
QAnimationGroup::Running);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(groupStateChangedSpy.at(3).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(groupStateChangedSpy.at(3).first()),
QAnimationGroup::Stopped);
QCOMPARE(group.state(), QAnimationGroup::Stopped);
diff --git a/tests/auto/corelib/animation/qparallelanimationgroup/tst_qparallelanimationgroup.cpp b/tests/auto/corelib/animation/qparallelanimationgroup/tst_qparallelanimationgroup.cpp
index 2fdf1de9c8..b7464c8467 100644
--- a/tests/auto/corelib/animation/qparallelanimationgroup/tst_qparallelanimationgroup.cpp
+++ b/tests/auto/corelib/animation/qparallelanimationgroup/tst_qparallelanimationgroup.cpp
@@ -270,18 +270,18 @@ void tst_QParallelAnimationGroup::stateChanged()
group.start();
//all the animations should be started
QCOMPARE(spy1.count(), 1);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(spy1.last().first()), TestAnimation::Running);
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(spy1.last().first()), TestAnimation::Running);
QCOMPARE(spy2.count(), 1);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(spy2.last().first()), TestAnimation::Running);
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(spy2.last().first()), TestAnimation::Running);
QCOMPARE(spy3.count(), 1);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(spy3.last().first()), TestAnimation::Running);
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(spy3.last().first()), TestAnimation::Running);
QCOMPARE(spy4.count(), 1);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(spy4.last().first()), TestAnimation::Running);
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(spy4.last().first()), TestAnimation::Running);
group.setCurrentTime(1500); //anim1 should be finished
QCOMPARE(group.state(), QAnimationGroup::Running);
QCOMPARE(spy1.count(), 2);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(spy1.last().first()), TestAnimation::Stopped);
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(spy1.last().first()), TestAnimation::Stopped);
QCOMPARE(spy2.count(), 1); //no change
QCOMPARE(spy3.count(), 1); //no change
QCOMPARE(spy4.count(), 1); //no change
@@ -290,7 +290,7 @@ void tst_QParallelAnimationGroup::stateChanged()
QCOMPARE(group.state(), QAnimationGroup::Running);
QCOMPARE(spy1.count(), 2); //no change
QCOMPARE(spy2.count(), 2);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(spy2.last().first()), TestAnimation::Stopped);
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(spy2.last().first()), TestAnimation::Stopped);
QCOMPARE(spy3.count(), 1); //no change
QCOMPARE(spy4.count(), 1); //no change
@@ -299,9 +299,9 @@ void tst_QParallelAnimationGroup::stateChanged()
QCOMPARE(spy1.count(), 2); //no change
QCOMPARE(spy2.count(), 2); //no change
QCOMPARE(spy3.count(), 2);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(spy3.last().first()), TestAnimation::Stopped);
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(spy3.last().first()), TestAnimation::Stopped);
QCOMPARE(spy4.count(), 2);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(spy4.last().first()), TestAnimation::Stopped);
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(spy4.last().first()), TestAnimation::Stopped);
//cleanup
spy1.clear();
@@ -318,22 +318,22 @@ void tst_QParallelAnimationGroup::stateChanged()
QCOMPARE(spy1.count(), 0);
QCOMPARE(spy2.count(), 0);
QCOMPARE(spy3.count(), 1);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(spy3.last().first()), TestAnimation::Running);
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(spy3.last().first()), TestAnimation::Running);
QCOMPARE(spy4.count(), 1);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(spy4.last().first()), TestAnimation::Running);
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(spy4.last().first()), TestAnimation::Running);
group.setCurrentTime(1500); //anim2 should be started
QCOMPARE(group.state(), QAnimationGroup::Running);
QCOMPARE(spy1.count(), 0); //no change
QCOMPARE(spy2.count(), 1);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(spy2.last().first()), TestAnimation::Running);
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(spy2.last().first()), TestAnimation::Running);
QCOMPARE(spy3.count(), 1); //no change
QCOMPARE(spy4.count(), 1); //no change
group.setCurrentTime(500); //anim1 is finally also started
QCOMPARE(group.state(), QAnimationGroup::Running);
QCOMPARE(spy1.count(), 1);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(spy1.last().first()), TestAnimation::Running);
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(spy1.last().first()), TestAnimation::Running);
QCOMPARE(spy2.count(), 1); //no change
QCOMPARE(spy3.count(), 1); //no change
QCOMPARE(spy4.count(), 1); //no change
@@ -341,13 +341,13 @@ void tst_QParallelAnimationGroup::stateChanged()
group.setCurrentTime(0); //everything should be stopped
QCOMPARE(group.state(), QAnimationGroup::Stopped);
QCOMPARE(spy1.count(), 2);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(spy1.last().first()), TestAnimation::Stopped);
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(spy1.last().first()), TestAnimation::Stopped);
QCOMPARE(spy2.count(), 2);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(spy2.last().first()), TestAnimation::Stopped);
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(spy2.last().first()), TestAnimation::Stopped);
QCOMPARE(spy3.count(), 2);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(spy3.last().first()), TestAnimation::Stopped);
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(spy3.last().first()), TestAnimation::Stopped);
QCOMPARE(spy4.count(), 2);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(spy4.last().first()), TestAnimation::Stopped);
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(spy4.last().first()), TestAnimation::Stopped);
}
void tst_QParallelAnimationGroup::clearGroup()
@@ -455,9 +455,9 @@ void tst_QParallelAnimationGroup::updateChildrenWithRunningGroup()
QCOMPARE(groupStateChangedSpy.count(), 1);
QCOMPARE(childStateChangedSpy.count(), 1);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(groupStateChangedSpy.at(0).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(groupStateChangedSpy.at(0).first()),
QAnimationGroup::Running);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(childStateChangedSpy.at(0).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(childStateChangedSpy.at(0).first()),
QAnimationGroup::Running);
// starting directly a running child will not have any effect
@@ -620,11 +620,11 @@ void tst_QParallelAnimationGroup::startGroupWithRunningChild()
anim2.start();
anim2.pause();
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(stateChangedSpy1.at(0).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(stateChangedSpy1.at(0).first()),
QAnimationGroup::Running);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(stateChangedSpy2.at(0).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(stateChangedSpy2.at(0).first()),
QAnimationGroup::Running);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(stateChangedSpy2.at(1).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(stateChangedSpy2.at(1).first()),
QAnimationGroup::Paused);
QCOMPARE(group.state(), QAnimationGroup::Stopped);
@@ -634,15 +634,15 @@ void tst_QParallelAnimationGroup::startGroupWithRunningChild()
group.start();
QCOMPARE(stateChangedSpy1.count(), 3);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(stateChangedSpy1.at(1).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(stateChangedSpy1.at(1).first()),
QAnimationGroup::Stopped);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(stateChangedSpy1.at(2).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(stateChangedSpy1.at(2).first()),
QAnimationGroup::Running);
QCOMPARE(stateChangedSpy2.count(), 4);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(stateChangedSpy2.at(2).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(stateChangedSpy2.at(2).first()),
QAnimationGroup::Stopped);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(stateChangedSpy2.at(3).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(stateChangedSpy2.at(3).first()),
QAnimationGroup::Running);
QCOMPARE(group.state(), QAnimationGroup::Running);
@@ -694,19 +694,19 @@ void tst_QParallelAnimationGroup::zeroDurationAnimation()
group.start();
QCOMPARE(stateChangedSpy1.count(), 2);
QCOMPARE(finishedSpy1.count(), 1);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(stateChangedSpy1.at(0).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(stateChangedSpy1.at(0).first()),
QAnimationGroup::Running);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(stateChangedSpy1.at(1).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(stateChangedSpy1.at(1).first()),
QAnimationGroup::Stopped);
QCOMPARE(stateChangedSpy2.count(), 1);
QCOMPARE(finishedSpy2.count(), 0);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(stateChangedSpy1.at(0).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(stateChangedSpy1.at(0).first()),
QAnimationGroup::Running);
QCOMPARE(stateChangedSpy3.count(), 1);
QCOMPARE(finishedSpy3.count(), 0);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(stateChangedSpy3.at(0).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(stateChangedSpy3.at(0).first()),
QAnimationGroup::Running);
@@ -770,9 +770,9 @@ void tst_QParallelAnimationGroup::stopUncontrolledAnimations()
group.start();
QCOMPARE(stateChangedSpy.count(), 2);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(stateChangedSpy.at(0).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(stateChangedSpy.at(0).first()),
QAnimationGroup::Running);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(stateChangedSpy.at(1).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(stateChangedSpy.at(1).first()),
QAnimationGroup::Stopped);
QCOMPARE(group.state(), QAnimationGroup::Running);
@@ -1000,10 +1000,10 @@ void tst_QParallelAnimationGroup::pauseResume()
new TestAnimation2(500, &group);
group.start();
QCOMPARE(spy.count(), 1); //the animation should have been started
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(spy.last().first()), TestAnimation::Running);
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(spy.last().first()), TestAnimation::Running);
group.setCurrentTime(250); //end of first animation
QCOMPARE(spy.count(), 2); //the animation should have been stopped
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(spy.last().first()), TestAnimation::Stopped);
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(spy.last().first()), TestAnimation::Stopped);
group.pause();
QCOMPARE(spy.count(), 2); //this shouldn't have changed
group.resume();
diff --git a/tests/auto/corelib/animation/qpropertyanimation/tst_qpropertyanimation.cpp b/tests/auto/corelib/animation/qpropertyanimation/tst_qpropertyanimation.cpp
index 05d1569988..11b95d82d8 100644
--- a/tests/auto/corelib/animation/qpropertyanimation/tst_qpropertyanimation.cpp
+++ b/tests/auto/corelib/animation/qpropertyanimation/tst_qpropertyanimation.cpp
@@ -702,7 +702,7 @@ Q_DECLARE_METATYPE(QAbstractAnimation::State)
QVariant numberInterpolator(const Number &f, const Number &t, qreal progress)
{
- return qVariantFromValue<Number>(Number(f.n + (t.n - f.n)*progress));
+ return QVariant::fromValue<Number>(Number(f.n + (t.n - f.n)*progress));
}
QVariant xaxisQPointInterpolator(const QPointF &f, const QPointF &t, qreal progress)
@@ -714,21 +714,21 @@ void tst_QPropertyAnimation::interpolated()
{
QObject o;
o.setProperty("point", QPointF()); //this will avoid warnings
- o.setProperty("number", qVariantFromValue<Number>(Number(42)));
- QCOMPARE(qVariantValue<Number>(o.property("number")), Number(42));
+ o.setProperty("number", QVariant::fromValue<Number>(Number(42)));
+ QCOMPARE(qvariant_cast<Number>(o.property("number")), Number(42));
{
qRegisterAnimationInterpolator<Number>(numberInterpolator);
QPropertyAnimation anim(&o, "number");
- anim.setStartValue(qVariantFromValue<Number>(Number(0)));
- anim.setEndValue(qVariantFromValue<Number>(Number(100)));
+ anim.setStartValue(QVariant::fromValue<Number>(Number(0)));
+ anim.setEndValue(QVariant::fromValue<Number>(Number(100)));
anim.setDuration(1000);
anim.start();
anim.pause();
anim.setCurrentTime(100);
- Number t(qVariantValue<Number>(o.property("number")));
+ Number t(qvariant_cast<Number>(o.property("number")));
QCOMPARE(t, Number(10));
anim.setCurrentTime(500);
- QCOMPARE(qVariantValue<Number>(o.property("number")), Number(50));
+ QCOMPARE(qvariant_cast<Number>(o.property("number")), Number(50));
}
{
qRegisterAnimationInterpolator<QPointF>(xaxisQPointInterpolator);
@@ -861,16 +861,16 @@ void tst_QPropertyAnimation::zeroDurationStart()
//let's check the first state change
const QVariantList firstChange = spy.first();
//old state
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(firstChange.last()), QAbstractAnimation::Stopped);
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(firstChange.last()), QAbstractAnimation::Stopped);
//new state
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(firstChange.first()), QAbstractAnimation::Running);
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(firstChange.first()), QAbstractAnimation::Running);
//let's check the first state change
const QVariantList secondChange = spy.last();
//old state
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(secondChange.last()), QAbstractAnimation::Running);
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(secondChange.last()), QAbstractAnimation::Running);
//new state
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(secondChange.first()), QAbstractAnimation::Stopped);
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(secondChange.first()), QAbstractAnimation::Stopped);
}
#define Pause 1
diff --git a/tests/auto/corelib/animation/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp b/tests/auto/corelib/animation/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp
index 63a4de5ac9..0ceeb6ce86 100644
--- a/tests/auto/corelib/animation/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp
+++ b/tests/auto/corelib/animation/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp
@@ -590,7 +590,7 @@ static bool compareStates(const QSignalSpy& spy, const StateList &expectedStates
}
QList<QVariant> args = spy.at(i);
QAbstractAnimation::State st = expectedStates.at(i);
- QAbstractAnimation::State actual = qVariantValue<QAbstractAnimation::State>(args.first());
+ QAbstractAnimation::State actual = qvariant_cast<QAbstractAnimation::State>(args.first());
if (equals && actual != st) {
equals = false;
break;
@@ -608,7 +608,7 @@ static bool compareStates(const QSignalSpy& spy, const StateList &expectedStates
}
if (i < spy.count()) {
QList<QVariant> args = spy.at(i);
- QAbstractAnimation::State actual = qVariantValue<QAbstractAnimation::State>(args.value(1));
+ QAbstractAnimation::State actual = qvariant_cast<QAbstractAnimation::State>(args.value(1));
if (!a.isEmpty())
a += QLatin1String(", ");
if (int(actual) >= 0 && int(actual) <= 2) {
@@ -677,20 +677,20 @@ void tst_QSequentialAnimationGroup::pauseAndResume()
<< QAbstractAnimation::Running
<< QAbstractAnimation::Stopped)));
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(a1StateChangedSpy.at(0).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(a1StateChangedSpy.at(0).first()),
QAnimationGroup::Running);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(a1StateChangedSpy.at(1).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(a1StateChangedSpy.at(1).first()),
QAnimationGroup::Paused);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(a1StateChangedSpy.at(2).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(a1StateChangedSpy.at(2).first()),
QAnimationGroup::Stopped);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(a1StateChangedSpy.at(3).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(a1StateChangedSpy.at(3).first()),
QAnimationGroup::Running);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(a1StateChangedSpy.at(4).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(a1StateChangedSpy.at(4).first()),
QAnimationGroup::Stopped);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(seqStateChangedSpy.at(0).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(seqStateChangedSpy.at(0).first()),
QAnimationGroup::Running);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(seqStateChangedSpy.at(1).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(seqStateChangedSpy.at(1).first()),
QAnimationGroup::Paused);
group.resume();
@@ -711,7 +711,7 @@ void tst_QSequentialAnimationGroup::pauseAndResume()
QVERIFY(a3_s_o1->currentLoopTime() >= 1);
QCOMPARE(seqStateChangedSpy.count(), 3); // Running,Paused,Running
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(seqStateChangedSpy.at(2).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(seqStateChangedSpy.at(2).first()),
QAnimationGroup::Running);
group.pause();
@@ -732,13 +732,13 @@ void tst_QSequentialAnimationGroup::pauseAndResume()
QVERIFY(a3_s_o1->currentLoopTime() >= 1);
QCOMPARE(seqStateChangedSpy.count(), 4); // Running,Paused,Running,Paused
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(seqStateChangedSpy.at(3).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(seqStateChangedSpy.at(3).first()),
QAnimationGroup::Paused);
group.stop();
QCOMPARE(seqStateChangedSpy.count(), 5); // Running,Paused,Running,Paused,Stopped
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(seqStateChangedSpy.at(4).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(seqStateChangedSpy.at(4).first()),
QAnimationGroup::Stopped);
}
@@ -782,25 +782,25 @@ void tst_QSequentialAnimationGroup::restart()
for (int i = 0; i < 3; i++) {
QCOMPARE(animsStateChanged[i]->count(), 4);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(animsStateChanged[i]->at(0).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(animsStateChanged[i]->at(0).first()),
QAnimationGroup::Running);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(animsStateChanged[i]->at(1).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(animsStateChanged[i]->at(1).first()),
QAnimationGroup::Stopped);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(animsStateChanged[i]->at(2).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(animsStateChanged[i]->at(2).first()),
QAnimationGroup::Running);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(animsStateChanged[i]->at(3).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(animsStateChanged[i]->at(3).first()),
QAnimationGroup::Stopped);
}
QCOMPARE(seqStateChangedSpy.count(), 2);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(seqStateChangedSpy.at(0).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(seqStateChangedSpy.at(0).first()),
QAnimationGroup::Running);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(seqStateChangedSpy.at(1).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(seqStateChangedSpy.at(1).first()),
QAnimationGroup::Stopped);
QCOMPARE(seqCurrentAnimChangedSpy.count(), 6);
for(int i=0; i<seqCurrentAnimChangedSpy.count(); i++)
- QCOMPARE(static_cast<QAbstractAnimation*>(anims[i%3]), qVariantValue<QAbstractAnimation*>(seqCurrentAnimChangedSpy.at(i).at(0)));
+ QCOMPARE(static_cast<QAbstractAnimation*>(anims[i%3]), qvariant_cast<QAbstractAnimation*>(seqCurrentAnimChangedSpy.at(i).at(0)));
group.start();
@@ -1124,9 +1124,9 @@ void tst_QSequentialAnimationGroup::updateChildrenWithRunningGroup()
QCOMPARE(groupStateChangedSpy.count(), 1);
QCOMPARE(childStateChangedSpy.count(), 1);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(groupStateChangedSpy.at(0).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(groupStateChangedSpy.at(0).first()),
QAnimationGroup::Running);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(childStateChangedSpy.at(0).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(childStateChangedSpy.at(0).first()),
QAnimationGroup::Running);
// starting directly a running child will not have any effect
@@ -1317,9 +1317,9 @@ void tst_QSequentialAnimationGroup::startGroupWithRunningChild()
QCOMPARE(anim2->state(), QAnimationGroup::Running);
QCOMPARE(stateChangedSpy2.count(), 4);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(stateChangedSpy2.at(2).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(stateChangedSpy2.at(2).first()),
QAnimationGroup::Stopped);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(stateChangedSpy2.at(3).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(stateChangedSpy2.at(3).first()),
QAnimationGroup::Running);
group.stop();
@@ -1357,9 +1357,9 @@ void tst_QSequentialAnimationGroup::zeroDurationAnimation()
group.start();
QCOMPARE(stateChangedSpy.count(), 2);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(stateChangedSpy.at(0).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(stateChangedSpy.at(0).first()),
QAnimationGroup::Running);
- QCOMPARE(qVariantValue<QAbstractAnimation::State>(stateChangedSpy.at(1).first()),
+ QCOMPARE(qvariant_cast<QAbstractAnimation::State>(stateChangedSpy.at(1).first()),
QAnimationGroup::Stopped);
QCOMPARE(anim1->state(), QAnimationGroup::Stopped);
diff --git a/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp b/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp
index 4144e82a29..719e29e412 100644
--- a/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp
+++ b/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp
@@ -528,8 +528,10 @@ void tst_QTextCodec::utf8Codec_data()
QTest::newRow("str0") << QByteArray("abcdefgh") << QString("abcdefgh") << -1;
QTest::newRow("str0-len") << QByteArray("abcdefgh") << QString("abc") << 3;
- QTest::newRow("str1") << QByteArray("\303\266\303\244\303\274\303\226\303\204\303\234\303\270\303\246\303\245\303\230\303\206\303\205") << QString("\366\344\374\326\304\334\370\346\345\330\306\305") << -1;
- QTest::newRow("str1-len") << QByteArray("\303\266\303\244\303\274\303\226\303\204\303\234\303\270\303\246\303\245\303\230\303\206\303\205") << QString("\366\344\374\326\304") << 10;
+ QTest::newRow("str1") << QByteArray("\303\266\303\244\303\274\303\226\303\204\303\234\303\270\303\246\303\245\303\230\303\206\303\205")
+ << QString::fromLatin1("\366\344\374\326\304\334\370\346\345\330\306\305") << -1;
+ QTest::newRow("str1-len") << QByteArray("\303\266\303\244\303\274\303\226\303\204\303\234\303\270\303\246\303\245\303\230\303\206\303\205")
+ << QString::fromLatin1("\366\344\374\326\304") << 10;
str += QChar(0x05e9);
str += QChar(0x05d3);
@@ -1565,7 +1567,7 @@ void tst_QTextCodec::utf8bom_data()
QTest::newRow("nobom")
<< QByteArray("\302\240", 2)
- << QString("\240");
+ << QString::fromLatin1("\240");
{
static const ushort data[] = { 0x201d };
diff --git a/tests/auto/corelib/io/qprocess/test/test.pro b/tests/auto/corelib/io/qprocess/test/test.pro
index fb21800976..0b8b761a83 100644
--- a/tests/auto/corelib/io/qprocess/test/test.pro
+++ b/tests/auto/corelib/io/qprocess/test/test.pro
@@ -8,9 +8,13 @@ TARGET = ../tst_qprocess
win32:TESTDATA += ../testBatFiles/*
include(../qprocess.pri)
+
+win32:CONFIG += insignificant_test # QTBUG-25342 - sometimes hangs
+
load(testcase) # for target.path and installTestHelperApp()
for(file, SUBPROGRAMS): installTestHelperApp("../$${file}/$${file}",$${file},$${file})
installTestHelperApp("../testProcessSpacesArgs/nospace",testProcessSpacesArgs,nospace)
installTestHelperApp("../testProcessSpacesArgs/one space",testProcessSpacesArgs,"one space")
installTestHelperApp("../testProcessSpacesArgs/two space s",testProcessSpacesArgs,"two space s")
installTestHelperApp("../test Space In Name/testSpaceInName","test Space In Name",testSpaceInName)
+
diff --git a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp
index c3c4607119..3ca9521d8b 100644
--- a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp
+++ b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp
@@ -264,9 +264,9 @@ void tst_QProcess::simpleStart()
process = 0;
QCOMPARE(spy.count(), 3);
- QCOMPARE(qVariantValue<QProcess::ProcessState>(spy.at(0).at(0)), QProcess::Starting);
- QCOMPARE(qVariantValue<QProcess::ProcessState>(spy.at(1).at(0)), QProcess::Running);
- QCOMPARE(qVariantValue<QProcess::ProcessState>(spy.at(2).at(0)), QProcess::NotRunning);
+ QCOMPARE(qvariant_cast<QProcess::ProcessState>(spy.at(0).at(0)), QProcess::Starting);
+ QCOMPARE(qvariant_cast<QProcess::ProcessState>(spy.at(1).at(0)), QProcess::Running);
+ QCOMPARE(qvariant_cast<QProcess::ProcessState>(spy.at(2).at(0)), QProcess::NotRunning);
}
//-----------------------------------------------------------------------------
void tst_QProcess::execute()
@@ -331,9 +331,9 @@ void tst_QProcess::crashTest()
process = 0;
QCOMPARE(stateSpy.count(), 3);
- QCOMPARE(qVariantValue<QProcess::ProcessState>(stateSpy.at(0).at(0)), QProcess::Starting);
- QCOMPARE(qVariantValue<QProcess::ProcessState>(stateSpy.at(1).at(0)), QProcess::Running);
- QCOMPARE(qVariantValue<QProcess::ProcessState>(stateSpy.at(2).at(0)), QProcess::NotRunning);
+ QCOMPARE(qvariant_cast<QProcess::ProcessState>(stateSpy.at(0).at(0)), QProcess::Starting);
+ QCOMPARE(qvariant_cast<QProcess::ProcessState>(stateSpy.at(1).at(0)), QProcess::Running);
+ QCOMPARE(qvariant_cast<QProcess::ProcessState>(stateSpy.at(2).at(0)), QProcess::NotRunning);
}
//-----------------------------------------------------------------------------
@@ -1571,8 +1571,8 @@ void tst_QProcess::failToStart()
int it = j * attempts + i + 1;
QCOMPARE(stateSpy.count(), it * 2);
- QCOMPARE(qVariantValue<QProcess::ProcessState>(stateSpy.at(it * 2 - 2).at(0)), QProcess::Starting);
- QCOMPARE(qVariantValue<QProcess::ProcessState>(stateSpy.at(it * 2 - 1).at(0)), QProcess::NotRunning);
+ QCOMPARE(qvariant_cast<QProcess::ProcessState>(stateSpy.at(it * 2 - 2).at(0)), QProcess::Starting);
+ QCOMPARE(qvariant_cast<QProcess::ProcessState>(stateSpy.at(it * 2 - 1).at(0)), QProcess::NotRunning);
}
}
}
diff --git a/tests/auto/corelib/io/qsettings/tst_qsettings.cpp b/tests/auto/corelib/io/qsettings/tst_qsettings.cpp
index dbb844d204..65ab63510c 100644
--- a/tests/auto/corelib/io/qsettings/tst_qsettings.cpp
+++ b/tests/auto/corelib/io/qsettings/tst_qsettings.cpp
@@ -1023,7 +1023,7 @@ void tst_QSettings::testVariantTypes()
#define testVal(key, val, tp, rtype) \
{ \
QSettings settings1(format, QSettings::UserScope, "software.org", "KillerAPP"); \
- settings1.setValue(key, qVariantFromValue(val)); \
+ settings1.setValue(key, QVariant::fromValue(val)); \
} \
QConfFile::clearCache(); \
{ \
@@ -1055,7 +1055,7 @@ void tst_QSettings::testVariantTypes()
QList<QVariant> l3;
QDate date = QDate::currentDate();
QTime time = QTime::currentTime();
- l3 << QString("ene") << 10 << qVariantFromValue(QColor(1, 2, 3)) << QVariant(QRect(1, 2, 3, 4))
+ l3 << QString("ene") << 10 << QVariant::fromValue(QColor(1, 2, 3)) << QVariant(QRect(1, 2, 3, 4))
<< QVariant(QSize(4, 56)) << QVariant(QPoint(4, 2)) << true << false << date << time;
testVal("key3", l3, QVariantList, List);
@@ -1989,6 +1989,9 @@ void tst_QSettings::setIniCodec()
QConfFile::clearCache();
+#ifdef Q_OS_WIN
+ QEXPECT_FAIL("", "QTBUG-25446", Abort);
+#endif
QCOMPARE(actualContents4, expeContents4);
QCOMPARE(actualContents5, expeContents5);
diff --git a/tests/auto/corelib/io/qtextstream/tst_qtextstream.cpp b/tests/auto/corelib/io/qtextstream/tst_qtextstream.cpp
index 37a1556cf9..6e330faa85 100644
--- a/tests/auto/corelib/io/qtextstream/tst_qtextstream.cpp
+++ b/tests/auto/corelib/io/qtextstream/tst_qtextstream.cpp
@@ -419,28 +419,28 @@ void tst_QTextStream::generateLineData(bool for_QString)
// one line
QTest::newRow("utf16-BE/nothing")
<< QByteArray("\xfe\xff"
- "\x00\xe5\x00\x67\x00\x65", 8) << (QStringList() << "\345ge");
+ "\x00\xe5\x00\x67\x00\x65", 8) << (QStringList() << QLatin1String("\345ge"));
QTest::newRow("utf16-LE/nothing")
<< QByteArray("\xff\xfe"
- "\xe5\x00\x67\x00\x65\x00", 8) << (QStringList() << "\345ge");
+ "\xe5\x00\x67\x00\x65\x00", 8) << (QStringList() << QLatin1String("\345ge"));
QTest::newRow("utf16-BE/lf")
<< QByteArray("\xfe\xff"
- "\x00\xe5\x00\x67\x00\x65\x00\x0a", 10) << (QStringList() << "\345ge");
+ "\x00\xe5\x00\x67\x00\x65\x00\x0a", 10) << (QStringList() << QLatin1String("\345ge"));
QTest::newRow("utf16-LE/lf")
<< QByteArray("\xff\xfe"
- "\xe5\x00\x67\x00\x65\x00\x0a\x00", 10) << (QStringList() << "\345ge");
+ "\xe5\x00\x67\x00\x65\x00\x0a\x00", 10) << (QStringList() << QLatin1String("\345ge"));
// two lines
QTest::newRow("utf16-BE/twolines")
<< QByteArray("\xfe\xff"
"\x00\xe5\x00\x67\x00\x65\x00\x0a"
"\x00\xe5\x00\x67\x00\x65\x00\x0a", 18)
- << (QStringList() << "\345ge" << "\345ge");
+ << (QStringList() << QLatin1String("\345ge") << QLatin1String("\345ge"));
QTest::newRow("utf16-LE/twolines")
<< QByteArray("\xff\xfe"
"\xe5\x00\x67\x00\x65\x00\x0a\x00"
"\xe5\x00\x67\x00\x65\x00\x0a\x00", 18)
- << (QStringList() << "\345ge" << "\345ge");
+ << (QStringList() << QLatin1String("\345ge") << QLatin1String("\345ge"));
// three lines
QTest::newRow("utf16-BE/threelines")
@@ -448,32 +448,32 @@ void tst_QTextStream::generateLineData(bool for_QString)
"\x00\xe5\x00\x67\x00\x65\x00\x0a"
"\x00\xe5\x00\x67\x00\x65\x00\x0a"
"\x00\xe5\x00\x67\x00\x65\x00\x0a", 26)
- << (QStringList() << "\345ge" << "\345ge" << "\345ge");
+ << (QStringList() << QLatin1String("\345ge") << QLatin1String("\345ge") << QLatin1String("\345ge"));
QTest::newRow("utf16-LE/threelines")
<< QByteArray("\xff\xfe"
"\xe5\x00\x67\x00\x65\x00\x0a\x00"
"\xe5\x00\x67\x00\x65\x00\x0a\x00"
"\xe5\x00\x67\x00\x65\x00\x0a\x00", 26)
- << (QStringList() << "\345ge" << "\345ge" << "\345ge");
+ << (QStringList() << QLatin1String("\345ge") << QLatin1String("\345ge") << QLatin1String("\345ge"));
// utf-32
QTest::newRow("utf32-BE/twolines")
<< QByteArray("\x00\x00\xfe\xff"
"\x00\x00\x00\xe5\x00\x00\x00\x67\x00\x00\x00\x65\x00\x00\x00\x0a"
"\x00\x00\x00\xe5\x00\x00\x00\x67\x00\x00\x00\x65\x00\x00\x00\x0a", 36)
- << (QStringList() << "\345ge" << "\345ge");
+ << (QStringList() << QLatin1String("\345ge") << QLatin1String("\345ge"));
QTest::newRow("utf32-LE/twolines")
<< QByteArray("\xff\xfe\x00\x00"
"\xe5\x00\x00\x00\x67\x00\x00\x00\x65\x00\x00\x00\x0a\x00\x00\x00"
"\xe5\x00\x00\x00\x67\x00\x00\x00\x65\x00\x00\x00\x0a\x00\x00\x00", 36)
- << (QStringList() << "\345ge" << "\345ge");
+ << (QStringList() << QLatin1String("\345ge") << QLatin1String("\345ge"));
}
// partials
QTest::newRow("cr") << QByteArray("\r") << (QStringList() << "");
QTest::newRow("oneline/cr") << QByteArray("ole\r") << (QStringList() << "ole");
if (!for_QString)
- QTest::newRow("utf16-BE/cr") << QByteArray("\xfe\xff\x00\xe5\x00\x67\x00\x65\x00\x0d", 10) << (QStringList() << "\345ge");
+ QTest::newRow("utf16-BE/cr") << QByteArray("\xfe\xff\x00\xe5\x00\x67\x00\x65\x00\x0d", 10) << (QStringList() << QLatin1String("\345ge"));
}
// ------------------------------------------------------------------------------
@@ -702,34 +702,34 @@ void tst_QTextStream::generateAllData(bool for_QString)
// one line
QTest::newRow("utf16-BE/nothing")
<< QByteArray("\xfe\xff"
- "\x00\xe5\x00\x67\x00\x65", 8) << QString("\345ge");
+ "\x00\xe5\x00\x67\x00\x65", 8) << QString::fromLatin1("\345ge");
QTest::newRow("utf16-LE/nothing")
<< QByteArray("\xff\xfe"
- "\xe5\x00\x67\x00\x65\x00", 8) << QString("\345ge");
+ "\xe5\x00\x67\x00\x65\x00", 8) << QString::fromLatin1("\345ge");
QTest::newRow("utf16-BE/lf")
<< QByteArray("\xfe\xff"
- "\x00\xe5\x00\x67\x00\x65\x00\x0a", 10) << QString("\345ge\n");
+ "\x00\xe5\x00\x67\x00\x65\x00\x0a", 10) << QString::fromLatin1("\345ge\n");
QTest::newRow("utf16-LE/lf")
<< QByteArray("\xff\xfe"
- "\xe5\x00\x67\x00\x65\x00\x0a\x00", 10) << QString("\345ge\n");
+ "\xe5\x00\x67\x00\x65\x00\x0a\x00", 10) << QString::fromLatin1("\345ge\n");
QTest::newRow("utf16-BE/crlf")
<< QByteArray("\xfe\xff"
- "\x00\xe5\x00\x67\x00\x65\x00\x0d\x00\x0a", 12) << QString("\345ge\r\n");
+ "\x00\xe5\x00\x67\x00\x65\x00\x0d\x00\x0a", 12) << QString::fromLatin1("\345ge\r\n");
QTest::newRow("utf16-LE/crlf")
<< QByteArray("\xff\xfe"
- "\xe5\x00\x67\x00\x65\x00\x0d\x00\x0a\x00", 12) << QString("\345ge\r\n");
+ "\xe5\x00\x67\x00\x65\x00\x0d\x00\x0a\x00", 12) << QString::fromLatin1("\345ge\r\n");
// two lines
QTest::newRow("utf16-BE/twolines")
<< QByteArray("\xfe\xff"
"\x00\xe5\x00\x67\x00\x65\x00\x0a"
"\x00\xe5\x00\x67\x00\x65\x00\x0a", 18)
- << QString("\345ge\n\345ge\n");
+ << QString::fromLatin1("\345ge\n\345ge\n");
QTest::newRow("utf16-LE/twolines")
<< QByteArray("\xff\xfe"
"\xe5\x00\x67\x00\x65\x00\x0a\x00"
"\xe5\x00\x67\x00\x65\x00\x0a\x00", 18)
- << QString("\345ge\n\345ge\n");
+ << QString::fromLatin1("\345ge\n\345ge\n");
// three lines
QTest::newRow("utf16-BE/threelines")
@@ -737,13 +737,13 @@ void tst_QTextStream::generateAllData(bool for_QString)
"\x00\xe5\x00\x67\x00\x65\x00\x0a"
"\x00\xe5\x00\x67\x00\x65\x00\x0a"
"\x00\xe5\x00\x67\x00\x65\x00\x0a", 26)
- << QString("\345ge\n\345ge\n\345ge\n");
+ << QString::fromLatin1("\345ge\n\345ge\n\345ge\n");
QTest::newRow("utf16-LE/threelines")
<< QByteArray("\xff\xfe"
"\xe5\x00\x67\x00\x65\x00\x0a\x00"
"\xe5\x00\x67\x00\x65\x00\x0a\x00"
"\xe5\x00\x67\x00\x65\x00\x0a\x00", 26)
- << QString("\345ge\n\345ge\n\345ge\n");
+ << QString::fromLatin1("\345ge\n\345ge\n\345ge\n");
}
}
@@ -2042,9 +2042,9 @@ void tst_QTextStream::generateStringData(bool for_QString)
if (!for_QString) {
QTest::newRow("utf16-BE (empty)") << QByteArray("\xff\xfe", 2) << QByteArray() << QString();
- QTest::newRow("utf16-BE (corrupt)") << QByteArray("\xff", 1) << QByteArray("\xff") << QString("\xff");
+ QTest::newRow("utf16-BE (corrupt)") << QByteArray("\xff", 1) << QByteArray("\xff") << QString::fromLatin1("\xff");
QTest::newRow("utf16-LE (empty)") << QByteArray("\xfe\xff", 2) << QByteArray() << QString();
- QTest::newRow("utf16-LE (corrupt)") << QByteArray("\xfe", 1) << QByteArray("\xfe") << QString("\xfe");
+ QTest::newRow("utf16-LE (corrupt)") << QByteArray("\xfe", 1) << QByteArray("\xfe") << QString::fromLatin1("\xfe");
}
}
diff --git a/tests/auto/corelib/io/qurl/tst_qurl.cpp b/tests/auto/corelib/io/qurl/tst_qurl.cpp
index f9fbb8cba8..608bdfb78b 100644
--- a/tests/auto/corelib/io/qurl/tst_qurl.cpp
+++ b/tests/auto/corelib/io/qurl/tst_qurl.cpp
@@ -1017,12 +1017,22 @@ void tst_QUrl::toLocalFile_data()
QTest::newRow("data0") << QString::fromLatin1("file:/a.txt") << QString::fromLatin1("/a.txt");
QTest::newRow("data4") << QString::fromLatin1("file:///a.txt") << QString::fromLatin1("/a.txt");
+#ifdef Q_OS_WIN
QTest::newRow("data5") << QString::fromLatin1("file:///c:/a.txt") << QString::fromLatin1("c:/a.txt");
+#else
+ QTest::newRow("data5") << QString::fromLatin1("file:///c:/a.txt") << QString::fromLatin1("/c:/a.txt");
+#endif
QTest::newRow("data6") << QString::fromLatin1("file://somehost/somedir/somefile") << QString::fromLatin1("//somehost/somedir/somefile");
QTest::newRow("data7") << QString::fromLatin1("file://somehost/") << QString::fromLatin1("//somehost/");
QTest::newRow("data8") << QString::fromLatin1("file://somehost") << QString::fromLatin1("//somehost");
QTest::newRow("data9") << QString::fromLatin1("file:////somehost/somedir/somefile") << QString::fromLatin1("//somehost/somedir/somefile");
QTest::newRow("data10") << QString::fromLatin1("FILE:/a.txt") << QString::fromLatin1("/a.txt");
+ QTest::newRow("data11") << QString::fromLatin1("file:///Mambo <%235>.mp3") << QString::fromLatin1("/Mambo <#5>.mp3");
+ QTest::newRow("data12") << QString::fromLatin1("file:///a%25.txt") << QString::fromLatin1("/a%.txt");
+ QTest::newRow("data13") << QString::fromLatin1("file:///a%25%25.txt") << QString::fromLatin1("/a%%.txt");
+ QTest::newRow("data14") << QString::fromLatin1("file:///a%25a%25.txt") << QString::fromLatin1("/a%a%.txt");
+ QTest::newRow("data15") << QString::fromLatin1("file:///a%1f.txt") << QString::fromLatin1("/a\x1f.txt");
+ QTest::newRow("data16") << QString::fromLatin1("file:///%2580.txt") << QString::fromLatin1("/%80.txt");
// and some that result in empty (i.e., not local)
QTest::newRow("xdata0") << QString::fromLatin1("/a.txt") << QString();
@@ -1059,6 +1069,14 @@ void tst_QUrl::fromLocalFile_data()
<< QString::fromLatin1("");
QTest::newRow("data6") << QString::fromLatin1("//somehost/") << QString::fromLatin1("file://somehost/")
<< QString::fromLatin1("/");
+ QTest::newRow("data7") << QString::fromLatin1("/Mambo <#5>.mp3") << QString::fromLatin1("file:///Mambo <%235>.mp3")
+ << QString::fromLatin1("/Mambo <#5>.mp3");
+ QTest::newRow("data8") << QString::fromLatin1("/a%.txt") << QString::fromLatin1("file:///a%25.txt")
+ << QString::fromLatin1("/a%25.txt");
+ QTest::newRow("data9") << QString::fromLatin1("/a%25.txt") << QString::fromLatin1("file:///a%2525.txt")
+ << QString::fromLatin1("/a%2525.txt");
+ QTest::newRow("data10") << QString::fromLatin1("/%80.txt") << QString::fromLatin1("file:///%2580.txt")
+ << QString::fromLatin1("/%2580.txt");
}
void tst_QUrl::fromLocalFile()
@@ -1069,7 +1087,7 @@ void tst_QUrl::fromLocalFile()
QUrl url = QUrl::fromLocalFile(theFile);
- QCOMPARE(url.toString(), theUrl);
+ QCOMPARE(url.toString(QUrl::MostDecoded), theUrl);
QCOMPARE(url.path(), thePath);
}
@@ -1616,7 +1634,7 @@ void tst_QUrl::isRelative_data()
QTest::newRow("man: URL, is relative") << "man:mmap" << false;
QTest::newRow("javascript: URL, is relative") << "javascript:doSomething()" << false;
QTest::newRow("file: URL, is relative") << "file:/blah" << false;
- QTest::newRow("/path, is relative") << "/path" << false;
+ QTest::newRow("/path, is relative") << "/path" << true;
QTest::newRow("something, is relative") << "something" << true;
// end kde
}
diff --git a/tests/auto/corelib/itemmodels/itemmodels.pro b/tests/auto/corelib/itemmodels/itemmodels.pro
index 851035e949..418c5e1678 100644
--- a/tests/auto/corelib/itemmodels/itemmodels.pro
+++ b/tests/auto/corelib/itemmodels/itemmodels.pro
@@ -7,5 +7,3 @@ SUBDIRS = qabstractitemmodel \
qitemselectionmodel \
qsortfilterproxymodel \
qstringlistmodel
-
-mac: qabstractitemmodel.CONFIG = no_check_target # QTBUG-22748
diff --git a/tests/auto/corelib/itemmodels/qitemmodel/tst_qitemmodel.cpp b/tests/auto/corelib/itemmodels/qitemmodel/tst_qitemmodel.cpp
index d27d685f37..6a15133b27 100644
--- a/tests/auto/corelib/itemmodels/qitemmodel/tst_qitemmodel.cpp
+++ b/tests/auto/corelib/itemmodels/qitemmodel/tst_qitemmodel.cpp
@@ -535,27 +535,27 @@ void tst_QItemModel::data()
// General Purpose roles
QVariant variant = currentModel->data(currentModel->index(0,0), Qt::ToolTipRole);
if (variant.isValid()) {
- QVERIFY(qVariantCanConvert<QString>(variant));
+ QVERIFY(variant.canConvert<QString>());
}
variant = currentModel->data(currentModel->index(0,0), Qt::StatusTipRole);
if (variant.isValid()) {
- QVERIFY(qVariantCanConvert<QString>(variant));
+ QVERIFY(variant.canConvert<QString>());
}
variant = currentModel->data(currentModel->index(0,0), Qt::WhatsThisRole);
if (variant.isValid()) {
- QVERIFY(qVariantCanConvert<QString>(variant));
+ QVERIFY(variant.canConvert<QString>());
}
variant = currentModel->data(currentModel->index(0,0), Qt::SizeHintRole);
if (variant.isValid()) {
- QVERIFY(qVariantCanConvert<QSize>(variant));
+ QVERIFY(variant.canConvert<QSize>());
}
// Appearance roles
QVariant fontVariant = currentModel->data(currentModel->index(0,0), Qt::FontRole);
if (fontVariant.isValid()) {
- QVERIFY(qVariantCanConvert<QFont>(fontVariant));
+ QVERIFY(fontVariant.canConvert<QFont>());
}
QVariant textAlignmentVariant = currentModel->data(currentModel->index(0,0), Qt::TextAlignmentRole);
@@ -569,12 +569,12 @@ void tst_QItemModel::data()
QVariant colorVariant = currentModel->data(currentModel->index(0,0), Qt::BackgroundColorRole);
if (colorVariant.isValid()) {
- QVERIFY(qVariantCanConvert<QColor>(colorVariant));
+ QVERIFY(colorVariant.canConvert<QColor>());
}
colorVariant = currentModel->data(currentModel->index(0,0), Qt::TextColorRole);
if (colorVariant.isValid()) {
- QVERIFY(qVariantCanConvert<QColor>(colorVariant));
+ QVERIFY(colorVariant.canConvert<QColor>());
}
QVariant checkStateVariant = currentModel->data(currentModel->index(0,0), Qt::CheckStateRole);
diff --git a/tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp b/tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp
index 55997a3ca0..2858bf64eb 100644
--- a/tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp
+++ b/tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp
@@ -54,6 +54,10 @@ private slots:
void method();
void invalidMethod();
+
+ void comparisonOperators();
+
+ void fromSignal();
};
struct CustomType { };
@@ -672,5 +676,65 @@ void tst_QMetaMethod::invalidMethod()
QVERIFY(!method3.isValid());
}
+void tst_QMetaMethod::comparisonOperators()
+{
+ static const QMetaObject *mo = &MethodTestObject::staticMetaObject;
+ for (int x = 0; x < 2; ++x) {
+ int count = x ? mo->constructorCount() : mo->methodCount();
+ for (int i = 0; i < count; ++i) {
+ QMetaMethod method = x ? mo->constructor(i) : mo->method(i);
+ const QMetaObject *methodMo = method.enclosingMetaObject();
+ for (int j = 0; j < count; ++j) {
+ QMetaMethod other = x ? mo->constructor(j) : mo->method(j);
+ bool expectedEqual = ((methodMo == other.enclosingMetaObject())
+ && (i == j));
+ QCOMPARE(method == other, expectedEqual);
+ QCOMPARE(method != other, !expectedEqual);
+ QCOMPARE(other == method, expectedEqual);
+ QCOMPARE(other != method, !expectedEqual);
+ }
+
+ QVERIFY(method != QMetaMethod());
+ QVERIFY(QMetaMethod() != method);
+ QVERIFY(!(method == QMetaMethod()));
+ QVERIFY(!(QMetaMethod() == method));
+ }
+ }
+
+ // Constructors and normal methods with identical index should not
+ // compare equal
+ for (int i = 0; i < qMin(mo->methodCount(), mo->constructorCount()); ++i) {
+ QMetaMethod method = mo->method(i);
+ QMetaMethod constructor = mo->constructor(i);
+ QVERIFY(method != constructor);
+ QVERIFY(!(method == constructor));
+ }
+}
+
+void tst_QMetaMethod::fromSignal()
+{
+#define FROMSIGNAL_HELPER(ObjectType, Name, Arguments) { \
+ void (ObjectType::*signal)Arguments = &ObjectType::Name; \
+ const QMetaObject *signalMeta = &ObjectType::staticMetaObject; \
+ QCOMPARE(QMetaMethod::fromSignal(signal), \
+ signalMeta->method(signalMeta->indexOfSignal(QMetaObject::normalizedSignature(#Name #Arguments)))); \
+ }
+
+ FROMSIGNAL_HELPER(MethodTestObject, voidSignal, ())
+ FROMSIGNAL_HELPER(MethodTestObject, voidSignalQString, (const QString&))
+ FROMSIGNAL_HELPER(QObject, destroyed, (QObject*))
+ FROMSIGNAL_HELPER(QObject, objectNameChanged, (const QString &))
+
+ // Inherited from QObject
+ FROMSIGNAL_HELPER(MethodTestObject, destroyed, (QObject*))
+ FROMSIGNAL_HELPER(MethodTestObject, objectNameChanged, (const QString &))
+
+ // Methods that are not signals; fromSignal should return invalid method
+ FROMSIGNAL_HELPER(MethodTestObject, voidSlot, ())
+ FROMSIGNAL_HELPER(QObject, deleteLater, ())
+
+#undef FROMSIGNAL_HELPER
+}
+
QTEST_MAIN(tst_QMetaMethod)
#include "tst_qmetamethod.moc"
diff --git a/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp b/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp
index 4b0a64ab54..cfb23989dc 100644
--- a/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp
+++ b/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp
@@ -1097,6 +1097,11 @@ void tst_QMetaObjectBuilder::relocatableData()
QMetaObject *meta = builder.toMetaObject();
QVERIFY(sameMetaObject(meta, &meta2));
+
+ QVERIFY(!meta2.d.extradata);
+ QVERIFY(!meta2.d.relatedMetaObjects);
+ QVERIFY(!meta2.d.static_metacall);
+
free(meta);
}
@@ -1316,25 +1321,8 @@ bool tst_QMetaObjectBuilder::sameMetaObject
return false;
}
- const QMetaObject **objects1 = 0;
- const QMetaObject **objects2 = 0;
- if (meta1->d.data[0] == meta2->d.data[0] && meta1->d.data[0] >= 2) {
- QMetaObjectExtraData *extra1 = (QMetaObjectExtraData *)(meta1->d.extradata);
- QMetaObjectExtraData *extra2 = (QMetaObjectExtraData *)(meta2->d.extradata);
- if (extra1 && !extra2)
- return false;
- if (extra2 && !extra1)
- return false;
- if (extra1 && extra2) {
- if (extra1->static_metacall != extra2->static_metacall)
- return false;
- objects1 = extra1->objects;
- objects2 = extra1->objects;
- }
- } else if (meta1->d.data[0] == meta2->d.data[0] && meta1->d.data[0] == 1) {
- objects1 = (const QMetaObject **)(meta1->d.extradata);
- objects2 = (const QMetaObject **)(meta2->d.extradata);
- }
+ const QMetaObject **objects1 = meta1->d.relatedMetaObjects;
+ const QMetaObject **objects2 = meta2->d.relatedMetaObjects;
if (objects1 && !objects2)
return false;
if (objects2 && !objects1)
@@ -1402,7 +1390,7 @@ private:
};
QMetaObject TestObject::staticMetaObject = {
- { 0, 0, 0, 0 }
+ { 0, 0, 0, 0, 0, 0 }
};
TestObject::TestObject(QObject *parent)
diff --git a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp
index 4eb26928ac..e9de52b821 100644
--- a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp
+++ b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp
@@ -260,7 +260,7 @@ Q_DECLARE_METATYPE(TestSpace::Foo)
void tst_QMetaType::namespaces()
{
TestSpace::Foo nf = { 11.12 };
- QVariant v = qVariantFromValue(nf);
+ QVariant v = QVariant::fromValue(nf);
QCOMPARE(qvariant_cast<TestSpace::Foo>(v).d, 11.12);
}
diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
index f429af7ce2..e5da03c890 100644
--- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
+++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
@@ -77,6 +77,12 @@ private slots:
void connectDisconnectNotify_data();
void connectDisconnectNotify();
void connectNotifyPtr();
+ void connectDisconnectNotifyMethod_data();
+ void connectDisconnectNotifyMethod();
+ void connectDisconnectNotifyMethodPMF();
+ void disconnectNotifyMethod_receiverDestroyed();
+ void connectNotifyMethod_connectSlotsByName();
+ void connectDisconnectNotifyMethod_shadowing();
void emitInDefinedOrder();
void customTypes();
void streamCustomTypes();
@@ -166,6 +172,7 @@ signals:
void signal4();
QT_MOC_COMPAT void signal5();
void signal6(void);
+ void signal7(int, const QString &);
public slots:
void aPublicSlot() { aPublicSlotCalled++; }
@@ -827,6 +834,7 @@ void tst_QObject::connectDisconnectNotify_data()
QTest::newRow("combo4") << SIGNAL( signal4( void ) )<< SLOT( slot4( void ) );
QTest::newRow("combo5") << SIGNAL( signal6( void ) ) << SLOT( slot4() );
QTest::newRow("combo6") << SIGNAL( signal6() ) << SLOT( slot4() );
+ QTest::newRow("combo7") << SIGNAL( signal7( int , const QString & ) ) << SLOT( slot4() );
}
void tst_QObject::connectDisconnectNotify()
@@ -887,6 +895,316 @@ void tst_QObject::connectNotifyPtr()
delete r;
}
+class NotifyMethodObject : public SenderObject, public ReceiverObject
+{
+public:
+ NotifyMethodObject() : SenderObject(), ReceiverObject()
+ {}
+
+ QList<QMetaMethod> connectedSignals;
+ QList<QMetaMethod> disconnectedSignals;
+ void clearNotifications()
+ {
+ connectedSignals.clear();
+ disconnectedSignals.clear();
+ }
+protected:
+ void connectNotify(const QMetaMethod &signal)
+ { connectedSignals.append(signal); }
+ void disconnectNotify(const QMetaMethod &signal)
+ { disconnectedSignals.append(signal); }
+};
+
+void tst_QObject::connectDisconnectNotifyMethod_data()
+{
+ tst_QObject::connectDisconnectNotify_data();
+}
+
+void tst_QObject::connectDisconnectNotifyMethod()
+{
+ NotifyMethodObject *s = new NotifyMethodObject;
+ NotifyMethodObject *r = new NotifyMethodObject;
+
+ QFETCH(QString, a_signal);
+ QFETCH(QString, a_slot);
+
+ // Obtaining meta methods
+ int signalIndx = ((SenderObject*)s)->metaObject()->indexOfSignal(
+ QMetaObject::normalizedSignature(a_signal.toLatin1().constData()+1).constData());
+ int methodIndx = ((ReceiverObject*)r)->metaObject()->indexOfMethod(
+ QMetaObject::normalizedSignature(a_slot.toLatin1().constData()+1).constData());
+ QMetaMethod signal = ((SenderObject*)s)->metaObject()->method(signalIndx);
+ QMetaMethod method = ((ReceiverObject*)r)->metaObject()->method(methodIndx);
+ QVERIFY(signal.isValid());
+ QVERIFY(method.isValid());
+
+ // Test connectNotify
+ QVERIFY(QObject::connect((SenderObject*)s, a_signal.toLatin1(), (ReceiverObject*)r, a_slot.toLatin1()));
+ QCOMPARE(s->connectedSignals.size(), 1);
+ QCOMPARE(s->connectedSignals.at(0), signal);
+ QVERIFY(s->disconnectedSignals.isEmpty());
+
+ // Test disconnectNotify
+ QVERIFY(QObject::disconnect((SenderObject*)s, a_signal.toLatin1(), (ReceiverObject*)r, a_slot.toLatin1()));
+ QCOMPARE(s->disconnectedSignals.size(), 1);
+ QCOMPARE(s->disconnectedSignals.at(0), signal);
+ QCOMPARE(s->connectedSignals.size(), 1);
+
+ // Reconnect
+ s->clearNotifications();
+ QVERIFY(QObject::connect((SenderObject*)s, a_signal.toLatin1(), (ReceiverObject*)r, a_slot.toLatin1()));
+ QCOMPARE(s->connectedSignals.size(), 1);
+ QCOMPARE(s->connectedSignals.at(0), signal);
+ QVERIFY(s->disconnectedSignals.isEmpty());
+
+ // Test disconnectNotify for a complete disconnect
+ QVERIFY(((SenderObject*)s)->disconnect((ReceiverObject*)r));
+ QCOMPARE(s->disconnectedSignals.size(), 1);
+ QCOMPARE(s->disconnectedSignals.at(0), QMetaMethod());
+ QCOMPARE(s->connectedSignals.size(), 1);
+
+ // Test connectNotify when connecting by QMetaMethod
+ s->clearNotifications();
+ QVERIFY(QObject::connect((SenderObject*)s, signal, (ReceiverObject*)r, method));
+ QCOMPARE(s->connectedSignals.size(), 1);
+ QCOMPARE(s->connectedSignals.at(0), signal);
+ QVERIFY(s->disconnectedSignals.isEmpty());
+
+ // Test disconnectNotify when disconnecting by QMetaMethod
+ QVERIFY(QObject::disconnect((SenderObject*)s, signal, (ReceiverObject*)r, method));
+ QCOMPARE(s->disconnectedSignals.size(), 1);
+ QCOMPARE(s->disconnectedSignals.at(0), signal);
+ QCOMPARE(s->connectedSignals.size(), 1);
+
+ // Reconnect
+ s->clearNotifications();
+ QVERIFY(QObject::connect((SenderObject*)s, a_signal.toLatin1(), (ReceiverObject*)r, a_slot.toLatin1()));
+
+ // Test disconnectNotify for a complete disconnect by QMetaMethod
+ QVERIFY(QObject::disconnect((SenderObject*)s, QMetaMethod(), 0, QMetaMethod()));
+ QCOMPARE(s->disconnectedSignals.size(), 1);
+ QCOMPARE(s->disconnectedSignals.at(0), QMetaMethod());
+ QCOMPARE(s->connectedSignals.size(), 1);
+
+ // Test connectNotify when connecting by index
+ s->clearNotifications();
+ QVERIFY(QMetaObject::connect((SenderObject*)s, signalIndx, (ReceiverObject*)r, methodIndx));
+ QCOMPARE(s->connectedSignals.size(), 1);
+ QCOMPARE(s->connectedSignals.at(0), signal);
+ QVERIFY(s->disconnectedSignals.isEmpty());
+
+ // Test disconnectNotify when disconnecting by index
+ QVERIFY(QMetaObject::disconnect((SenderObject*)s, signalIndx, (ReceiverObject*)r, methodIndx));
+ QCOMPARE(s->disconnectedSignals.size(), 1);
+ QCOMPARE(s->disconnectedSignals.at(0), signal);
+ QCOMPARE(s->connectedSignals.size(), 1);
+
+ delete s;
+ delete r;
+}
+
+static void connectDisconnectNotifyTestSlot() {}
+
+void tst_QObject::connectDisconnectNotifyMethodPMF()
+{
+ NotifyMethodObject *s = new NotifyMethodObject;
+ NotifyMethodObject *r = new NotifyMethodObject;
+
+ QMetaMethod signal = QMetaMethod::fromSignal(&SenderObject::signal1);
+
+ // Test connectNotify
+ QVERIFY(QObject::connect((SenderObject*)s, &SenderObject::signal1, (ReceiverObject*)r, &ReceiverObject::slot1));
+ QCOMPARE(s->connectedSignals.size(), 1);
+ QCOMPARE(s->connectedSignals.at(0), signal);
+ QVERIFY(s->disconnectedSignals.isEmpty());
+
+ // Test disconnectNotify
+ QVERIFY(QObject::disconnect((SenderObject*)s, &SenderObject::signal1, (ReceiverObject*)r, &ReceiverObject::slot1));
+ QCOMPARE(s->disconnectedSignals.size(), 1);
+ QCOMPARE(s->disconnectedSignals.at(0), signal);
+ QCOMPARE(s->connectedSignals.size(), 1);
+
+ // Reconnect
+ s->clearNotifications();
+ QVERIFY(QObject::connect((SenderObject*)s, &SenderObject::signal1, (ReceiverObject*)r, &ReceiverObject::slot1));
+ QCOMPARE(s->connectedSignals.size(), 1);
+ QCOMPARE(s->connectedSignals.at(0), signal);
+ QVERIFY(s->disconnectedSignals.isEmpty());
+
+ // Test disconnectNotify with wildcard slot
+ QVERIFY(QObject::disconnect((SenderObject*)s, &SenderObject::signal1, (ReceiverObject*)r, 0));
+ QCOMPARE(s->disconnectedSignals.size(), 1);
+ QCOMPARE(s->disconnectedSignals.at(0), signal);
+ QCOMPARE(s->connectedSignals.size(), 1);
+
+ // Reconnect
+ s->clearNotifications();
+ QMetaObject::Connection conn = connect((SenderObject*)s, &SenderObject::signal1,
+ (ReceiverObject*)r, &ReceiverObject::slot1);
+
+ // Test disconnectNotify when disconnecting by QMetaObject::Connection
+ QVERIFY(QObject::disconnect(conn));
+ // disconnectNotify() is not called, but it probably should be.
+ QVERIFY(s->disconnectedSignals.isEmpty());
+
+ // Test connectNotify when connecting by function pointer
+ s->clearNotifications();
+ QVERIFY(QObject::connect((SenderObject*)s, &SenderObject::signal1, connectDisconnectNotifyTestSlot));
+ QCOMPARE(s->connectedSignals.size(), 1);
+ QCOMPARE(s->connectedSignals.at(0), signal);
+ QVERIFY(s->disconnectedSignals.isEmpty());
+
+ delete s;
+ delete r;
+}
+
+void tst_QObject::disconnectNotifyMethod_receiverDestroyed()
+{
+ NotifyMethodObject *s = new NotifyMethodObject;
+ NotifyMethodObject *r = new NotifyMethodObject;
+
+ QVERIFY(QObject::connect((SenderObject*)s, SIGNAL(signal1()), (ReceiverObject*)r, SLOT(slot1())));
+
+ delete r;
+ // disconnectNotify() is not called, but it probably should be.
+ QVERIFY(s->disconnectedSignals.isEmpty());
+
+ delete s;
+}
+
+class ConnectByNameNotifySenderObject : public QObject
+{
+ Q_OBJECT
+public:
+ QList<QMetaMethod> connectedSignals;
+ QList<QMetaMethod> disconnectedSignals;
+ void clearNotifications()
+ {
+ connectedSignals.clear();
+ disconnectedSignals.clear();
+ }
+protected:
+ void connectNotify(const QMetaMethod &signal)
+ { connectedSignals.append(signal); }
+ void disconnectNotify(const QMetaMethod &signal)
+ { disconnectedSignals.append(signal); }
+Q_SIGNALS:
+ void signal1();
+};
+
+class ConnectByNameNotifyReceiverObject : public QObject
+{
+ Q_OBJECT
+ void createNotifyChild(const char *name)
+ {
+ QObject *o = new ConnectByNameNotifySenderObject;
+ o->setParent(this);
+ o->setObjectName(QString::fromLatin1(name));
+ }
+public:
+ ConnectByNameNotifyReceiverObject()
+ {
+ createNotifyChild("foo");
+ createNotifyChild("bar");
+ createNotifyChild("baz");
+ };
+
+public Q_SLOTS:
+ void on_foo_signal1() {}
+ void on_bar_signal1() {}
+ void on_baz_signal1() {}
+};
+
+void tst_QObject::connectNotifyMethod_connectSlotsByName()
+{
+ ConnectByNameNotifyReceiverObject testObject;
+ QList<ConnectByNameNotifySenderObject *> senders =
+ qFindChildren<ConnectByNameNotifySenderObject *>(&testObject);
+ for (int i = 0; i < senders.size(); ++i) {
+ ConnectByNameNotifySenderObject *o = senders.at(i);
+ QVERIFY(o->connectedSignals.isEmpty());
+ QVERIFY(o->disconnectedSignals.isEmpty());
+ }
+
+ QMetaObject::connectSlotsByName(&testObject);
+
+ for (int i = 0; i < senders.size(); ++i) {
+ ConnectByNameNotifySenderObject *o = senders.at(i);
+ QCOMPARE(o->connectedSignals.size(), 1);
+ QCOMPARE(o->connectedSignals.at(0), QMetaMethod::fromSignal(&ConnectByNameNotifySenderObject::signal1));
+ QVERIFY(o->disconnectedSignals.isEmpty());
+ }
+}
+
+class ConnectDisconnectNotifyShadowObject
+ : public ConnectByNameNotifySenderObject
+{
+ Q_OBJECT
+public Q_SLOTS:
+ void slot1() {}
+Q_SIGNALS:
+ void signal1();
+};
+
+void tst_QObject::connectDisconnectNotifyMethod_shadowing()
+{
+ ConnectDisconnectNotifyShadowObject s;
+ // Obtain QMetaMethods
+ QMetaMethod shadowedSignal1 = QMetaMethod::fromSignal(&ConnectByNameNotifySenderObject::signal1);
+ QMetaMethod redefinedSignal1 = QMetaMethod::fromSignal(&ConnectDisconnectNotifyShadowObject::signal1);
+ QVERIFY(shadowedSignal1 != redefinedSignal1);
+ int slot1Index = s.metaObject()->indexOfSlot("slot1()");
+ QVERIFY(slot1Index != -1);
+ QMetaMethod slot1 = s.metaObject()->method(slot1Index);
+
+ // Test connectNotify
+#ifndef QT_NO_DEBUG
+ const char *warning = "QMetaObject::indexOfSignal: signal signal1() from "
+ "ConnectByNameNotifySenderObject redefined in "
+ "ConnectDisconnectNotifyShadowObject";
+ QTest::ignoreMessage(QtWarningMsg, warning);
+#endif
+ QVERIFY(QObject::connect(&s, SIGNAL(signal1()), &s, SLOT(slot1())));
+ QCOMPARE(s.connectedSignals.size(), 1);
+ QCOMPARE(s.connectedSignals.at(0), redefinedSignal1);
+ QVERIFY(s.disconnectedSignals.isEmpty());
+
+ // Test disconnectNotify
+#ifndef QT_NO_DEBUG
+ QTest::ignoreMessage(QtWarningMsg, warning);
+#endif
+ QVERIFY(QObject::disconnect(&s, SIGNAL(signal1()), &s, SLOT(slot1())));
+ QCOMPARE(s.disconnectedSignals.size(), 1);
+ QCOMPARE(s.disconnectedSignals.at(0), redefinedSignal1);
+ QCOMPARE(s.connectedSignals.size(), 1);
+
+ // Test connectNotify when connecting by shadowed QMetaMethod
+ s.clearNotifications();
+ QVERIFY(QObject::connect(&s, shadowedSignal1, &s, slot1));
+ QCOMPARE(s.connectedSignals.size(), 1);
+ QCOMPARE(s.connectedSignals.at(0), shadowedSignal1);
+ QVERIFY(s.disconnectedSignals.isEmpty());
+
+ // Test disconnectNotify when disconnecting by shadowed QMetaMethod
+ QVERIFY(QObject::disconnect(&s, shadowedSignal1, &s, slot1));
+ QCOMPARE(s.disconnectedSignals.size(), 1);
+ QCOMPARE(s.disconnectedSignals.at(0), shadowedSignal1);
+ QCOMPARE(s.connectedSignals.size(), 1);
+
+ // Test connectNotify when connecting by redefined QMetaMethod
+ s.clearNotifications();
+ QVERIFY(QObject::connect(&s, redefinedSignal1, &s, slot1));
+ QCOMPARE(s.connectedSignals.size(), 1);
+ QCOMPARE(s.connectedSignals.at(0), redefinedSignal1);
+ QVERIFY(s.disconnectedSignals.isEmpty());
+
+ // Test disconnectNotify when disconnecting by redefined QMetaMethod
+ QVERIFY(QObject::disconnect(&s, redefinedSignal1, &s, slot1));
+ QCOMPARE(s.disconnectedSignals.size(), 1);
+ QCOMPARE(s.disconnectedSignals.at(0), redefinedSignal1);
+ QCOMPARE(s.connectedSignals.size(), 1);
+}
+
class SequenceObject : public ReceiverObject
{
Q_OBJECT
@@ -1733,12 +2051,12 @@ void tst_QObject::property()
CustomType *customPointer = 0;
QVariant customVariant = object.property("custom");
- customPointer = qVariantValue<CustomType *>(customVariant);
+ customPointer = qvariant_cast<CustomType *>(customVariant);
QCOMPARE(customPointer, object.custom());
CustomType custom;
customPointer = &custom;
- qVariantSetValue(customVariant, customPointer);
+ customVariant.setValue(customPointer);
property = mo->property(mo->indexOfProperty("custom"));
QVERIFY(property.isWritable());
@@ -1750,7 +2068,7 @@ void tst_QObject::property()
QCOMPARE(object.custom(), customPointer);
customVariant = object.property("custom");
- customPointer = qVariantValue<CustomType *>(customVariant);
+ customPointer = qvariant_cast<CustomType *>(customVariant);
QCOMPARE(object.custom(), customPointer);
// this enum property has a meta type, but it's not yet registered, so we know this fails
@@ -1783,22 +2101,22 @@ void tst_QObject::property()
var = object.property("priority");
QVERIFY(!var.isNull());
- QVERIFY(qVariantCanConvert<PropertyObject::Priority>(var));
- QCOMPARE(qVariantValue<PropertyObject::Priority>(var), PropertyObject::High);
+ QVERIFY(var.canConvert<PropertyObject::Priority>());
+ QCOMPARE(qvariant_cast<PropertyObject::Priority>(var), PropertyObject::High);
object.setPriority(PropertyObject::Low);
- QCOMPARE(qVariantValue<PropertyObject::Priority>(object.property("priority")), PropertyObject::Low);
+ QCOMPARE(qvariant_cast<PropertyObject::Priority>(object.property("priority")), PropertyObject::Low);
QVERIFY(object.setProperty("priority", PropertyObject::VeryHigh));
- QCOMPARE(qVariantValue<PropertyObject::Priority>(object.property("priority")), PropertyObject::VeryHigh);
+ QCOMPARE(qvariant_cast<PropertyObject::Priority>(object.property("priority")), PropertyObject::VeryHigh);
QVERIFY(object.setProperty("priority", "High"));
- QCOMPARE(qVariantValue<PropertyObject::Priority>(object.property("priority")), PropertyObject::High);
+ QCOMPARE(qvariant_cast<PropertyObject::Priority>(object.property("priority")), PropertyObject::High);
QVERIFY(!object.setProperty("priority", QVariant()));
var = object.property("priority");
- QCOMPARE(qVariantValue<PropertyObject::Priority>(var), PropertyObject::High);
+ QCOMPARE(qvariant_cast<PropertyObject::Priority>(var), PropertyObject::High);
object.setPriority(PropertyObject::Low);
- QCOMPARE(qVariantValue<PropertyObject::Priority>(object.property("priority")), PropertyObject::Low);
+ QCOMPARE(qvariant_cast<PropertyObject::Priority>(object.property("priority")), PropertyObject::Low);
object.setProperty("priority", var);
- QCOMPARE(qVariantValue<PropertyObject::Priority>(object.property("priority")), PropertyObject::High);
+ QCOMPARE(qvariant_cast<PropertyObject::Priority>(object.property("priority")), PropertyObject::High);
qRegisterMetaType<CustomString>("CustomString");
QVERIFY(mo->indexOfProperty("customString") != -1);
@@ -2684,10 +3002,10 @@ void tst_QObject::floatProperty()
QVERIFY(prop.isValid());
QVERIFY(prop.type() == uint(QMetaType::type("float")));
QVERIFY(!prop.write(&obj, QVariant("Hello")));
- QVERIFY(prop.write(&obj, qVariantFromValue(128.0f)));
+ QVERIFY(prop.write(&obj, QVariant::fromValue(128.0f)));
QVariant v = prop.read(&obj);
QVERIFY(int(v.userType()) == QMetaType::Float);
- QVERIFY(qVariantValue<float>(v) == 128.0f);
+ QVERIFY(qvariant_cast<float>(v) == 128.0f);
}
void tst_QObject::qrealProperty()
@@ -2700,15 +3018,15 @@ void tst_QObject::qrealProperty()
QVERIFY(prop.type() == uint(QMetaType::type("qreal")));
QVERIFY(!prop.write(&obj, QVariant("Hello")));
- QVERIFY(prop.write(&obj, qVariantFromValue(128.0f)));
+ QVERIFY(prop.write(&obj, QVariant::fromValue(128.0f)));
QVariant v = prop.read(&obj);
QCOMPARE(v.userType(), qMetaTypeId<qreal>());
- QVERIFY(qVariantValue<qreal>(v) == 128.0);
+ QVERIFY(qvariant_cast<qreal>(v) == 128.0);
- QVERIFY(prop.write(&obj, qVariantFromValue(double(127))));
+ QVERIFY(prop.write(&obj, QVariant::fromValue(double(127))));
v = prop.read(&obj);
QCOMPARE(v.userType(), qMetaTypeId<qreal>());
- QVERIFY(qVariantValue<qreal>(v) == 127.0);
+ QVERIFY(qvariant_cast<qreal>(v) == 127.0);
}
class DynamicPropertyObject : public PropertyObject
@@ -3456,6 +3774,7 @@ public:
void tst_QObject::isSignalConnected()
{
ManySignals o;
+ const QMetaObject *meta = o.metaObject();
o.rec = 0;
#ifdef QT_BUILD_INTERNAL
QObjectPrivate *priv = QObjectPrivate::get(&o);
@@ -3466,6 +3785,13 @@ void tst_QObject::isSignalConnected()
QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig29()")));
QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig60()")));
#endif
+ QVERIFY(!o.isSignalConnected(meta->method(meta->indexOfSignal("destroyed()"))));
+ QVERIFY(!o.isSignalConnected(meta->method(meta->indexOfSignal("sig00()"))));
+ QVERIFY(!o.isSignalConnected(meta->method(meta->indexOfSignal("sig05()"))));
+ QVERIFY(!o.isSignalConnected(meta->method(meta->indexOfSignal("sig15()"))));
+ QVERIFY(!o.isSignalConnected(meta->method(meta->indexOfSignal("sig29()"))));
+ QVERIFY(!o.isSignalConnected(meta->method(meta->indexOfSignal("sig60()"))));
+ QVERIFY(!o.isSignalConnected(meta->method(meta->indexOfSignal("sig69()"))));
QObject::connect(&o, SIGNAL(sig00()), &o, SIGNAL(sig69()));
QObject::connect(&o, SIGNAL(sig34()), &o, SIGNAL(sig03()));
@@ -3484,6 +3810,18 @@ void tst_QObject::isSignalConnected()
QVERIFY(priv->isSignalConnected(priv->signalIndex("sig69()")));
QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig18()")));
#endif
+ QVERIFY(!o.isSignalConnected(meta->method(meta->indexOfSignal("destroyed()"))));
+ QVERIFY(!o.isSignalConnected(meta->method(meta->indexOfSignal("destroyed(QObject*)"))));
+ QVERIFY(!o.isSignalConnected(meta->method(meta->indexOfSignal("sig05()"))));
+ QVERIFY(!o.isSignalConnected(meta->method(meta->indexOfSignal("sig15()"))));
+ QVERIFY(!o.isSignalConnected(meta->method(meta->indexOfSignal("sig29()"))));
+
+ QVERIFY(o.isSignalConnected(meta->method(meta->indexOfSignal("sig00()"))));
+ QVERIFY(o.isSignalConnected(meta->method(meta->indexOfSignal("sig03()"))));
+ QVERIFY(o.isSignalConnected(meta->method(meta->indexOfSignal("sig34()"))));
+ QVERIFY(o.isSignalConnected(meta->method(meta->indexOfSignal("sig69()"))));
+ QVERIFY(!o.isSignalConnected(meta->method(meta->indexOfSignal("sig18()"))));
+
QObject::connect(&o, SIGNAL(sig18()), &o, SIGNAL(sig29()));
QObject::connect(&o, SIGNAL(sig29()), &o, SIGNAL(sig62()));
@@ -3497,6 +3835,11 @@ void tst_QObject::isSignalConnected()
QVERIFY(priv->isSignalConnected(priv->signalIndex("sig69()")));
QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig27()")));
#endif
+ QVERIFY(o.isSignalConnected(meta->method(meta->indexOfSignal("sig18()"))));
+ QVERIFY(o.isSignalConnected(meta->method(meta->indexOfSignal("sig62()"))));
+ QVERIFY(o.isSignalConnected(meta->method(meta->indexOfSignal("sig28()"))));
+ QVERIFY(o.isSignalConnected(meta->method(meta->indexOfSignal("sig69()"))));
+ QVERIFY(!o.isSignalConnected(meta->method(meta->indexOfSignal("sig27()"))));
QCOMPARE(o.rec, 0);
emit o.sig01();
@@ -3527,6 +3870,12 @@ void tst_QObject::isSignalConnected()
QCOMPARE(o.rec, 2);
emit o.sig36();
QCOMPARE(o.rec, 2);
+
+ QObject::connect(&o, &QObject::destroyed, qt_noop);
+ QVERIFY(o.isSignalConnected(meta->method(meta->indexOfSignal("destroyed()"))));
+ QVERIFY(o.isSignalConnected(meta->method(meta->indexOfSignal("destroyed(QObject*)"))));
+
+ QVERIFY(!o.isSignalConnected(QMetaMethod()));
}
void tst_QObject::qMetaObjectConnect()
diff --git a/tests/auto/corelib/kernel/qtimer/tst_qtimer.cpp b/tests/auto/corelib/kernel/qtimer/tst_qtimer.cpp
index e4ecfb6f2d..0e42572b03 100644
--- a/tests/auto/corelib/kernel/qtimer/tst_qtimer.cpp
+++ b/tests/auto/corelib/kernel/qtimer/tst_qtimer.cpp
@@ -39,6 +39,12 @@
**
****************************************************************************/
+#ifdef QT_GUI_LIB
+# include <QtGui/QGuiApplication>
+#else
+# include <QtCore/QCoreApplication>
+#endif
+
#include <QtTest/QtTest>
#include <qtimer.h>
diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
index 7d821f038b..569e448d88 100644
--- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
+++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
@@ -102,6 +102,8 @@ private slots:
void constructor();
void copy_constructor();
+ void constructor_invalid_data();
+ void constructor_invalid();
void isNull();
void swap();
@@ -346,6 +348,67 @@ void tst_QVariant::constructor()
QVERIFY(!var8.isNull());
}
+void tst_QVariant::constructor_invalid_data()
+{
+ QTest::addColumn<uint>("typeId");
+
+ QTest::newRow("-1") << uint(-1);
+ QTest::newRow("-122234567") << uint(-122234567);
+ QTest::newRow("0xfffffffff") << uint(0xfffffffff);
+ QTest::newRow("LastCoreType + 1") << uint(QMetaType::LastCoreType + 1);
+ QVERIFY(!QMetaType::isRegistered(QMetaType::LastCoreType + 1));
+ QTest::newRow("LastGuiType + 1") << uint(QMetaType::LastGuiType + 1);
+ QVERIFY(!QMetaType::isRegistered(QMetaType::LastGuiType + 1));
+ QTest::newRow("LastWidgetsType + 1") << uint(QMetaType::LastWidgetsType + 1);
+ QVERIFY(!QMetaType::isRegistered(QMetaType::LastWidgetsType + 1));
+}
+
+struct MessageHandlerInvalidType
+{
+ MessageHandlerInvalidType()
+ : oldMsgHandler(qInstallMsgHandler(handler))
+ {
+ ok = false;
+ }
+
+ ~MessageHandlerInvalidType()
+ {
+ qInstallMsgHandler(oldMsgHandler);
+ }
+
+ QtMsgHandler oldMsgHandler;
+
+ static void handler(QtMsgType type, const char *txt)
+ {
+ QString msg = QString::fromLatin1(txt);
+ // uint(-1) can be platform dependent so we check only beginning of the message.
+ ok = msg.startsWith("Trying to construct an instance of an invalid type, type id:");
+ QVERIFY2(ok, (QString::fromLatin1("Message is not started correctly: '") + msg + '\'').toLatin1().constData());
+ }
+ static bool ok;
+};
+bool MessageHandlerInvalidType::ok;
+
+void tst_QVariant::constructor_invalid()
+{
+
+ QFETCH(uint, typeId);
+ {
+ MessageHandlerInvalidType msg;
+ QVariant variant(static_cast<QVariant::Type>(typeId));
+ QVERIFY(!variant.isValid());
+ QVERIFY(variant.userType() == QMetaType::UnknownType);
+ QVERIFY(msg.ok);
+ }
+ {
+ MessageHandlerInvalidType msg;
+ QVariant variant(typeId, /* copy */ 0);
+ QVERIFY(!variant.isValid());
+ QVERIFY(variant.userType() == QMetaType::UnknownType);
+ QVERIFY(msg.ok);
+ }
+}
+
void tst_QVariant::copy_constructor()
{
QVariant var7(QVariant::Int);
@@ -447,20 +510,20 @@ void tst_QVariant::canConvert_data()
QVariant var(QBitArray(0));
QTest::newRow("BitArray")
<< var << Y << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N;
- var = qVariantFromValue(QBitmap());
+ var = QVariant::fromValue(QBitmap());
QTest::newRow("Bitmap")
<< var << N << Y << N << N << N << N << N << N << N << N << N << Y << N << N << N << N << N << N << N << N << Y << N << N << N << N << N << N << N << N << N << N;
- var = qVariantFromValue(QBrush());
+ var = QVariant::fromValue(QBrush());
QTest::newRow("Brush")
<< var << N << N << N << Y << N << Y << N << N << N << N << N << N << N << N << N << N << N << N << N << N << Y << N << N << N << N << N << N << N << N << N << N;
var = QVariant(QByteArray());
QTest::newRow("ByteArray")
<< var << N << N << Y << N << Y << Y << N << N << N << Y << N << N << Y << N << N << N << Y << N << N << N << N << N << N << N << N << N << Y << N << N << Y << Y;
- var = qVariantFromValue(QColor());
+ var = QVariant::fromValue(QColor());
QTest::newRow("Color")
<< var << N << N << N << Y << Y << Y << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << Y << N << N << N << N;
#ifndef QT_NO_CURSOR
- var = qVariantFromValue(QCursor());
+ var = QVariant::fromValue(QCursor());
QTest::newRow("Cursor")
<< var << N << N << N << N << N << N << Y << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N;
#endif
@@ -476,13 +539,13 @@ void tst_QVariant::canConvert_data()
var = QVariant(0.1f);
QTest::newRow("Float")
<< var << N << N << Y << N << Y << N << N << N << N << Y << N << N << Y << N << N << N << Y << N << N << N << N << N << N << N << N << N << Y << N << N << Y << Y;
- var = qVariantFromValue(QFont());
+ var = QVariant::fromValue(QFont());
QTest::newRow("Font")
<< var << N << N << N << N << N << N << N << N << N << N << Y << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << Y << N << N << N << N;
- var = qVariantFromValue(QIcon());
+ var = QVariant::fromValue(QIcon());
QTest::newRow("Icon")
<< var << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N;
- var = qVariantFromValue(QImage());
+ var = QVariant::fromValue(QImage());
QTest::newRow("Image")
<< var << N << Y << N << N << N << N << N << N << N << N << N << Y << N << N << N << N << N << N << N << N << Y << N << N << N << N << N << N << N << N << N << N;
var = QVariant((int)1);
@@ -491,7 +554,7 @@ void tst_QVariant::canConvert_data()
var = QVariant();
QTest::newRow("Invalid")
<< var << N << N << N << N << N << N << N << N << N << N << N << N << N << Y << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N;
- var = qVariantFromValue(QKeySequence());
+ var = QVariant::fromValue(QKeySequence());
QTest::newRow("KeySequence")
<< var << N << N << N << N << N << N << N << N << N << N << N << N << Y << N << Y << N << N << N << N << N << N << N << N << N << N << N << Y << N << N << N << N;
var = QVariant(QList<QVariant>());
@@ -503,16 +566,16 @@ void tst_QVariant::canConvert_data()
var = QVariant(QMap<QString,QVariant>());
QTest::newRow("Map")
<< var << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << Y << N << N << N << N << N << N << N << N << N << N << N << N << N;
- var = qVariantFromValue(QPalette());
+ var = QVariant::fromValue(QPalette());
QTest::newRow("Palette")
<< var << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << Y << N << N << N << N << N << N << N << N << N << N << N << N;
- var = qVariantFromValue(QPen());
+ var = QVariant::fromValue(QPen());
QTest::newRow("Pen")
<< var << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << Y << N << N << N << N << N << N << N << N << N << N << N;
- var = qVariantFromValue(QPixmap());
+ var = QVariant::fromValue(QPixmap());
QTest::newRow("Pixmap")
<< var << N << Y << N << Y << N << N << N << N << N << N << N << Y << N << N << N << N << N << N << N << N << Y << N << N << N << N << N << N << N << N << N << N;
- var = qVariantFromValue(QPolygon());
+ var = QVariant::fromValue(QPolygon());
QTest::newRow("PointArray")
<< var << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N;
var = QVariant(QPoint());
@@ -521,13 +584,13 @@ void tst_QVariant::canConvert_data()
var = QVariant(QRect());
QTest::newRow("Rect")
<< var << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << Y << N << N << N << N << N << N << N << N;
- var = qVariantFromValue(QRegion());
+ var = QVariant::fromValue(QRegion());
QTest::newRow("Region")
<< var << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << Y << N << N << N << N << N << N << N;
var = QVariant(QSize());
QTest::newRow("Size")
<< var << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << Y << N << N << N << N << N << N;
- var = qVariantFromValue(QSizePolicy());
+ var = QVariant::fromValue(QSizePolicy());
QTest::newRow("SizePolicy")
<< var << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << N << Y << N << N << N << N << N;
var = QVariant(QString());
@@ -648,7 +711,7 @@ void tst_QVariant::toInt_data()
QTest::newRow( "signedint-string" ) << QVariant( QString("-123") ) << -123 << true;
QTest::newRow( "signedlonglong0" ) << QVariant( (qlonglong)-34 ) << -34 << true;
QTest::newRow( "QChar" ) << QVariant(QChar('a')) << int('a') << true;
- QTest::newRow( "keysequence" ) << qVariantFromValue( QKeySequence( Qt::Key_A ) ) << 65 << true;
+ QTest::newRow( "keysequence" ) << QVariant::fromValue( QKeySequence( Qt::Key_A ) ) << 65 << true;
QByteArray bytearray(4, ' ');
bytearray[0] = 'T';
bytearray[1] = 'e';
@@ -955,7 +1018,7 @@ void tst_QVariant::toColor()
QFETCH( QColor, result );
QVERIFY( value.isValid() );
QVERIFY( value.canConvert( QVariant::Color ) );
- QColor d = qVariantValue<QColor>(value);
+ QColor d = qvariant_cast<QColor>(value);
QCOMPARE( d, result );
}
@@ -979,7 +1042,7 @@ void tst_QVariant::toPixmap()
QFETCH( QPixmap, result );
QVERIFY( value.isValid() );
QVERIFY( value.canConvert( QVariant::Pixmap ) );
- QPixmap d = qVariantValue<QPixmap>(value);
+ QPixmap d = qvariant_cast<QPixmap>(value);
QCOMPARE( d, result );
}
@@ -999,7 +1062,7 @@ void tst_QVariant::toImage()
QFETCH( QImage, result );
QVERIFY( value.isValid() );
QVERIFY( value.canConvert( QVariant::Image ) );
- QImage d = qVariantValue<QImage>(value);
+ QImage d = qvariant_cast<QImage>(value);
QCOMPARE( d, result );
}
@@ -1021,7 +1084,7 @@ void tst_QVariant::toBrush()
QFETCH( QBrush, result );
QVERIFY( value.isValid() );
QVERIFY( value.canConvert( QVariant::Brush ) );
- QBrush d = qVariantValue<QBrush>(value);
+ QBrush d = qvariant_cast<QBrush>(value);
QCOMPARE( d, result );
}
@@ -1040,7 +1103,7 @@ void tst_QVariant::toFont()
QFETCH( QFont, result );
QVERIFY( value.isValid() );
QVERIFY( value.canConvert( QVariant::Font ) );
- QFont d = qVariantValue<QFont>(value);
+ QFont d = qvariant_cast<QFont>(value);
QCOMPARE( d, result );
}
@@ -1064,7 +1127,7 @@ void tst_QVariant::toKeySequence()
QFETCH( QKeySequence, result );
QVERIFY( value.isValid() );
QVERIFY( value.canConvert( QVariant::KeySequence ) );
- QKeySequence d = qVariantValue<QKeySequence>(value);
+ QKeySequence d = qvariant_cast<QKeySequence>(value);
QCOMPARE( d, result );
}
@@ -1226,7 +1289,7 @@ void tst_QVariant::toString_data()
QTest::newRow( "qdate" ) << QVariant( QDate( 2002, 1, 1 ) ) << QString( "2002-01-01" );
QTest::newRow( "qtime" ) << QVariant( QTime( 12, 34, 56 ) ) << QString( "12:34:56" );
QTest::newRow( "qdatetime" ) << QVariant( QDateTime( QDate( 2002, 1, 1 ), QTime( 12, 34, 56 ) ) ) << QString( "2002-01-01T12:34:56" );
- QTest::newRow( "qkeysequence" ) << qVariantFromValue( QKeySequence( Qt::CTRL + Qt::Key_A ) )
+ QTest::newRow( "qkeysequence" ) << QVariant::fromValue( QKeySequence( Qt::CTRL + Qt::Key_A ) )
#ifndef Q_OS_MAC
<< QString( "Ctrl+A" );
#else
@@ -1234,8 +1297,8 @@ void tst_QVariant::toString_data()
#endif
QFont font( "times", 12 );
- QTest::newRow( "qfont" ) << qVariantFromValue( font ) << QString("times,12,-1,5,50,0,0,0,0,0");
- QTest::newRow( "qcolor" ) << qVariantFromValue( QColor( 10, 10, 10 ) ) << QString( "#0a0a0a" );
+ QTest::newRow( "qfont" ) << QVariant::fromValue( font ) << QString("times,12,-1,5,50,0,0,0,0,0");
+ QTest::newRow( "qcolor" ) << QVariant::fromValue( QColor( 10, 10, 10 ) ) << QString( "#0a0a0a" );
QTest::newRow( "llong" ) << QVariant( (qlonglong)Q_INT64_C(123456789012) ) <<
QString( "123456789012" );
}
@@ -1342,10 +1405,10 @@ void tst_QVariant::toRegularExpression()
void tst_QVariant::matrix()
{
QVariant variant;
- QMatrix matrix = qVariantValue<QMatrix>(variant);
+ QMatrix matrix = qvariant_cast<QMatrix>(variant);
QVERIFY(matrix.isIdentity());
- qVariantSetValue(variant, QMatrix().rotate(90));
- QCOMPARE(QMatrix().rotate(90), qVariantValue<QMatrix>(variant));
+ variant.setValue(QMatrix().rotate(90));
+ QCOMPARE(QMatrix().rotate(90), qvariant_cast<QMatrix>(variant));
void *mmatrix = QMetaType::create(QVariant::Matrix, 0);
QVERIFY(mmatrix);
@@ -1355,12 +1418,12 @@ void tst_QVariant::matrix()
void tst_QVariant::matrix4x4()
{
QVariant variant;
- QMatrix4x4 matrix = qVariantValue<QMatrix4x4>(variant);
+ QMatrix4x4 matrix = qvariant_cast<QMatrix4x4>(variant);
QVERIFY(matrix.isIdentity());
QMatrix4x4 m;
m.scale(2.0f);
- qVariantSetValue(variant, m);
- QCOMPARE(m, qVariantValue<QMatrix4x4>(variant));
+ variant.setValue(m);
+ QCOMPARE(m, qvariant_cast<QMatrix4x4>(variant));
void *mmatrix = QMetaType::create(QVariant::Matrix4x4, 0);
QVERIFY(mmatrix);
@@ -1370,10 +1433,10 @@ void tst_QVariant::matrix4x4()
void tst_QVariant::transform()
{
QVariant variant;
- QTransform matrix = qVariantValue<QTransform>(variant);
+ QTransform matrix = qvariant_cast<QTransform>(variant);
QVERIFY(matrix.isIdentity());
- qVariantSetValue(variant, QTransform().rotate(90));
- QCOMPARE(QTransform().rotate(90), qVariantValue<QTransform>(variant));
+ variant.setValue(QTransform().rotate(90));
+ QCOMPARE(QTransform().rotate(90), qvariant_cast<QTransform>(variant));
void *mmatrix = QMetaType::create(QVariant::Transform, 0);
QVERIFY(mmatrix);
@@ -1384,10 +1447,10 @@ void tst_QVariant::transform()
void tst_QVariant::vector2D()
{
QVariant variant;
- QVector2D vector = qVariantValue<QVector2D>(variant);
+ QVector2D vector = qvariant_cast<QVector2D>(variant);
QVERIFY(vector.isNull());
- qVariantSetValue(variant, QVector2D(0.1, 0.2));
- QCOMPARE(QVector2D(0.1, 0.2), qVariantValue<QVector2D>(variant));
+ variant.setValue(QVector2D(0.1, 0.2));
+ QCOMPARE(QVector2D(0.1, 0.2), qvariant_cast<QVector2D>(variant));
void *pvector = QMetaType::create(QVariant::Vector2D, 0);
QVERIFY(pvector);
@@ -1397,10 +1460,10 @@ void tst_QVariant::vector2D()
void tst_QVariant::vector3D()
{
QVariant variant;
- QVector3D vector = qVariantValue<QVector3D>(variant);
+ QVector3D vector = qvariant_cast<QVector3D>(variant);
QVERIFY(vector.isNull());
- qVariantSetValue(variant, QVector3D(0.1, 0.2, 0.3));
- QCOMPARE(QVector3D(0.1, 0.2, 0.3), qVariantValue<QVector3D>(variant));
+ variant.setValue(QVector3D(0.1, 0.2, 0.3));
+ QCOMPARE(QVector3D(0.1, 0.2, 0.3), qvariant_cast<QVector3D>(variant));
void *pvector = QMetaType::create(QVariant::Vector3D, 0);
QVERIFY(pvector);
@@ -1410,10 +1473,10 @@ void tst_QVariant::vector3D()
void tst_QVariant::vector4D()
{
QVariant variant;
- QVector4D vector = qVariantValue<QVector4D>(variant);
+ QVector4D vector = qvariant_cast<QVector4D>(variant);
QVERIFY(vector.isNull());
- qVariantSetValue(variant, QVector4D(0.1, 0.2, 0.3, 0.4));
- QCOMPARE(QVector4D(0.1, 0.2, 0.3, 0.4), qVariantValue<QVector4D>(variant));
+ variant.setValue(QVector4D(0.1, 0.2, 0.3, 0.4));
+ QCOMPARE(QVector4D(0.1, 0.2, 0.3, 0.4), qvariant_cast<QVector4D>(variant));
void *pvector = QMetaType::create(QVariant::Vector4D, 0);
QVERIFY(pvector);
@@ -1423,10 +1486,10 @@ void tst_QVariant::vector4D()
void tst_QVariant::quaternion()
{
QVariant variant;
- QQuaternion quaternion = qVariantValue<QQuaternion>(variant);
+ QQuaternion quaternion = qvariant_cast<QQuaternion>(variant);
QVERIFY(quaternion.isIdentity());
- qVariantSetValue(variant, QQuaternion(0.1, 0.2, 0.3, 0.4));
- QCOMPARE(QQuaternion(0.1, 0.2, 0.3, 0.4), qVariantValue<QQuaternion>(variant));
+ variant.setValue(QQuaternion(0.1, 0.2, 0.3, 0.4));
+ QCOMPARE(QQuaternion(0.1, 0.2, 0.3, 0.4), qvariant_cast<QQuaternion>(variant));
void *pquaternion = QMetaType::create(QVariant::Quaternion, 0);
QVERIFY(pquaternion);
@@ -1483,14 +1546,14 @@ void tst_QVariant::writeToReadFromDataStream_data()
bytearray[3] = 't';
bytearray[4] = '\0';
QTest::newRow( "bytearray_valid" ) << QVariant( bytearray ) << false;
- QTest::newRow( "bitmap_invalid" ) << qVariantFromValue( QBitmap() ) << true;
+ QTest::newRow( "bitmap_invalid" ) << QVariant::fromValue( QBitmap() ) << true;
QBitmap bitmap( 10, 10 );
bitmap.fill( Qt::red );
- QTest::newRow( "bitmap_valid" ) << qVariantFromValue( bitmap ) << false;
- QTest::newRow( "brush_valid" ) << qVariantFromValue( QBrush( Qt::red ) ) << false;
- QTest::newRow( "color_valid" ) << qVariantFromValue( QColor( Qt::red ) ) << false;
+ QTest::newRow( "bitmap_valid" ) << QVariant::fromValue( bitmap ) << false;
+ QTest::newRow( "brush_valid" ) << QVariant::fromValue( QBrush( Qt::red ) ) << false;
+ QTest::newRow( "color_valid" ) << QVariant::fromValue( QColor( Qt::red ) ) << false;
#ifndef QT_NO_CURSOR
- QTest::newRow( "cursor_valid" ) << qVariantFromValue( QCursor( Qt::PointingHandCursor ) ) << false;
+ QTest::newRow( "cursor_valid" ) << QVariant::fromValue( QCursor( Qt::PointingHandCursor ) ) << false;
#endif
QTest::newRow( "date_invalid" ) << QVariant( QDate() ) << true;
QTest::newRow( "date_valid" ) << QVariant( QDate( 2002, 07, 06 ) ) << false;
@@ -1498,14 +1561,14 @@ void tst_QVariant::writeToReadFromDataStream_data()
QTest::newRow( "datetime_valid" ) << QVariant( QDateTime( QDate( 2002, 07, 06 ), QTime( 14, 0, 0 ) ) ) << false;
QTest::newRow( "double_valid" ) << QVariant( 123.456 ) << false;
QTest::newRow( "float_valid" ) << QVariant( 123.456f ) << false;
- QTest::newRow( "font_valid" ) << qVariantFromValue( QFont( "times", 12 ) ) << false;
- QTest::newRow( "pixmap_invalid" ) << qVariantFromValue( QPixmap() ) << true;
+ QTest::newRow( "font_valid" ) << QVariant::fromValue( QFont( "times", 12 ) ) << false;
+ QTest::newRow( "pixmap_invalid" ) << QVariant::fromValue( QPixmap() ) << true;
QPixmap pixmap( 10, 10 );
pixmap.fill( Qt::red );
- QTest::newRow( "pixmap_valid" ) << qVariantFromValue( pixmap ) << false;
+ QTest::newRow( "pixmap_valid" ) << QVariant::fromValue( pixmap ) << false;
// QTest::newRow( "iconset_valid" ) << QVariant( QIcon( pixmap ) ) << false;
- QTest::newRow( "image_invalid" ) << qVariantFromValue( QImage() ) << true;
- QTest::newRow( "keysequence_valid" ) << qVariantFromValue( QKeySequence( Qt::CTRL + Qt::Key_A ) ) << false;
+ QTest::newRow( "image_invalid" ) << QVariant::fromValue( QImage() ) << true;
+ QTest::newRow( "keysequence_valid" ) << QVariant::fromValue( QKeySequence( Qt::CTRL + Qt::Key_A ) ) << false;
QTest::newRow( "int_valid" ) << QVariant( -123 ) << false;
typedef QMap<QString, QVariant> variantsMap;
variantsMap vMap;
@@ -1514,15 +1577,15 @@ void tst_QVariant::writeToReadFromDataStream_data()
vMap.insert( "double", QVariant( 3.45 ) );
vMap.insert( "float", QVariant( 3.45f ) );
QTest::newRow( "map_valid" ) << QVariant( vMap ) << false;
- QTest::newRow( "palette_valid" ) << qVariantFromValue(QPalette(QColor("turquoise"))) << false;
- QTest::newRow( "pen_valid" ) << qVariantFromValue( QPen( Qt::red ) ) << false;
- QTest::newRow( "pointarray_invalid" ) << qVariantFromValue( QPolygon() ) << true;
- QTest::newRow( "pointarray_valid" ) << qVariantFromValue( QPolygon( QRect( 10, 10, 20, 20 ) ) ) << false;
- QTest::newRow( "region_invalid" ) << qVariantFromValue( QRegion() ) << true;
- QTest::newRow( "region_valid" ) << qVariantFromValue( QRegion( 10, 10, 20, 20 ) ) << false;
- QTest::newRow( "sizepolicy_valid" ) << qVariantFromValue( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) ) << false;
- QTest::newRow( "point_invalid" ) << qVariantFromValue( QPoint() ) << true;
- QTest::newRow( "point_valid" ) << qVariantFromValue( QPoint( 10, 10 ) ) << false;
+ QTest::newRow( "palette_valid" ) << QVariant::fromValue(QPalette(QColor("turquoise"))) << false;
+ QTest::newRow( "pen_valid" ) << QVariant::fromValue( QPen( Qt::red ) ) << false;
+ QTest::newRow( "pointarray_invalid" ) << QVariant::fromValue( QPolygon() ) << true;
+ QTest::newRow( "pointarray_valid" ) << QVariant::fromValue( QPolygon( QRect( 10, 10, 20, 20 ) ) ) << false;
+ QTest::newRow( "region_invalid" ) << QVariant::fromValue( QRegion() ) << true;
+ QTest::newRow( "region_valid" ) << QVariant::fromValue( QRegion( 10, 10, 20, 20 ) ) << false;
+ QTest::newRow( "sizepolicy_valid" ) << QVariant::fromValue( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) ) << false;
+ QTest::newRow( "point_invalid" ) << QVariant::fromValue( QPoint() ) << true;
+ QTest::newRow( "point_valid" ) << QVariant::fromValue( QPoint( 10, 10 ) ) << false;
QTest::newRow( "rect_invalid" ) << QVariant( QRect() ) << true;
QTest::newRow( "rect_valid" ) << QVariant( QRect( 10, 10, 20, 20 ) ) << false;
QTest::newRow( "size_invalid" ) << QVariant( QSize( 0, 0 ) ) << true;
@@ -2067,7 +2130,7 @@ void tst_QVariant::userType()
{
QVariant userVar;
- qVariantSetValue(userVar, data);
+ userVar.setValue(data);
QCOMPARE(userVar.type(), QVariant::UserType);
QCOMPARE(userVar.userType(), qMetaTypeId<MyType>());
@@ -2078,7 +2141,7 @@ void tst_QVariant::userType()
QVariant userVar2(userVar);
QVERIFY(userVar == userVar2);
- qVariantSetValue(userVar2, data2);
+ userVar2.setValue(data2);
QVERIFY(userVar != userVar2);
const MyType *varData = static_cast<const MyType *>(userVar.constData());
@@ -2087,7 +2150,7 @@ void tst_QVariant::userType()
QCOMPARE(varData->text, data.text);
QVariant userVar3;
- qVariantSetValue(userVar3, data2);
+ userVar3.setValue(data2);
userVar3 = userVar2;
QVERIFY(userVar2 == userVar3);
@@ -2096,7 +2159,7 @@ void tst_QVariant::userType()
QCOMPARE(instanceCount, 2);
{
QVariant userVar;
- qVariantSetValue(userVar, &data);
+ userVar.setValue(&data);
QCOMPARE(userVar.type(), QVariant::UserType);
QCOMPARE(userVar.userType(), qMetaTypeId<MyType*>());
@@ -2107,7 +2170,7 @@ void tst_QVariant::userType()
QVariant userVar2(userVar);
QVERIFY(userVar == userVar2);
- qVariantSetValue(userVar2, &data2);
+ userVar2.setValue(&data2);
QVERIFY(userVar != userVar2);
MyType * const*varData = reinterpret_cast<MyType *const *>(userVar.constData());
@@ -2115,7 +2178,7 @@ void tst_QVariant::userType()
QCOMPARE(*varData, &data);
QVariant userVar3;
- qVariantSetValue(userVar3, &data2);
+ userVar3.setValue(&data2);
/* This check is correct now. userVar2 contains a pointer to data2 and so
* does userVar3. */
@@ -2127,7 +2190,7 @@ void tst_QVariant::userType()
QCOMPARE(instanceCount, 2);
QVariant myCarrier;
- qVariantSetValue(myCarrier, data);
+ myCarrier.setValue(data);
QCOMPARE(instanceCount, 3);
{
QVariant second = myCarrier;
@@ -2138,7 +2201,7 @@ void tst_QVariant::userType()
QCOMPARE(instanceCount, 3);
MyType data3(0, "null");
- data3 = qVariantValue<MyType>(myCarrier);
+ data3 = qvariant_cast<MyType>(myCarrier);
QCOMPARE(data3.number, 1);
QCOMPARE(data3.text, (const char *)"eins");
#ifndef Q_CC_SUN
@@ -2151,7 +2214,7 @@ void tst_QVariant::userType()
const MyType data(3, "drei");
QVariant myCarrier;
- qVariantSetValue(myCarrier, data);
+ myCarrier.setValue(data);
QCOMPARE(myCarrier.typeName(), "MyType");
const MyType data2 = qvariant_cast<MyType>(myCarrier);
@@ -2163,7 +2226,7 @@ void tst_QVariant::userType()
short s = 42;
QVariant myCarrier;
- qVariantSetValue(myCarrier, s);
+ myCarrier.setValue(s);
QCOMPARE((int)qvariant_cast<short>(myCarrier), 42);
}
@@ -2171,7 +2234,7 @@ void tst_QVariant::userType()
qlonglong ll = Q_INT64_C(42);
QVariant myCarrier;
- qVariantSetValue(myCarrier, ll);
+ myCarrier.setValue(ll);
QCOMPARE(qvariant_cast<int>(myCarrier), 42);
}
@@ -2192,14 +2255,14 @@ void tst_QVariant::podUserType()
pod.a = 10;
pod.b = 20;
- QVariant pod_as_variant = qVariantFromValue(pod);
+ QVariant pod_as_variant = QVariant::fromValue(pod);
MyTypePOD pod2 = qvariant_cast<MyTypePOD>(pod_as_variant);
QCOMPARE(pod.a, pod2.a);
QCOMPARE(pod.b, pod2.b);
- qVariantSetValue(pod_as_variant, pod);
- pod2 = qVariantValue<MyTypePOD>(pod_as_variant);
+ pod_as_variant.setValue(pod);
+ pod2 = qvariant_cast<MyTypePOD>(pod_as_variant);
QCOMPARE(pod.a, pod2.a);
QCOMPARE(pod.b, pod2.b);
@@ -2266,7 +2329,7 @@ void tst_QVariant::data()
v = f;
QVERIFY(v.data());
- QCOMPARE(*static_cast<float *>(v.data()), qVariantValue<float>(v));
+ QCOMPARE(*static_cast<float *>(v.data()), qvariant_cast<float>(v));
v = ll;
QVERIFY(v.data());
@@ -2345,12 +2408,12 @@ void tst_QVariant::variant_to()
QStringList sl;
sl << QLatin1String("blah");
- qVariantSetValue(v3, sl);
+ v3.setValue(sl);
Foo foo;
foo.i = 42;
- qVariantSetValue(v4, foo);
+ v4.setValue(foo);
QCOMPARE(qvariant_cast<double>(v1), 4.2);
QCOMPARE(qvariant_cast<float>(v1), 4.2f);
@@ -2365,7 +2428,7 @@ void tst_QVariant::variant_to()
QCOMPARE(qvariant_cast<int>(v1), 4);
- QVariant n = qVariantFromValue<short>(42);
+ QVariant n = QVariant::fromValue<short>(42);
QCOMPARE(qvariant_cast<int>(n), 42);
QCOMPARE(qvariant_cast<uint>(n), 42u);
QCOMPARE(qvariant_cast<double>(n), 42.0);
@@ -2373,7 +2436,7 @@ void tst_QVariant::variant_to()
QCOMPARE(qvariant_cast<short>(n), short(42));
QCOMPARE(qvariant_cast<ushort>(n), ushort(42));
- n = qVariantFromValue(43l);
+ n = QVariant::fromValue(43l);
QCOMPARE(qvariant_cast<int>(n), 43);
QCOMPARE(qvariant_cast<uint>(n), 43u);
QCOMPARE(qvariant_cast<double>(n), 43.0);
@@ -2385,7 +2448,7 @@ void tst_QVariant::variant_to()
QCOMPARE(qvariant_cast<ulong>(n), 44ul);
QCOMPARE(qvariant_cast<float>(n), 44.0f);
- QCOMPARE(qVariantFromValue(0.25f).toDouble(), 0.25);
+ QCOMPARE(QVariant::fromValue(0.25f).toDouble(), 0.25);
}
struct Blah { int i; };
@@ -2437,10 +2500,10 @@ void tst_QVariant::url()
QVariant v3(str); //built with a QString
QCOMPARE(v2.toUrl(), url);
- QVERIFY(qVariantCanConvert<QUrl>(v3));
+ QVERIFY(v3.canConvert<QUrl>());
QCOMPARE(v2.toUrl(), v3.toUrl());
- QVERIFY(qVariantCanConvert<QString>(v2));
+ QVERIFY(v2.canConvert<QString>());
QCOMPARE(v2.toString(), str);
QCOMPARE(v3.toString(), str);
}
@@ -2615,7 +2678,7 @@ void tst_QVariant::convertToQUint8() const
* It's of type QVariant::Int. */
const QVariant v0 = anInt;
- QVERIFY(qVariantCanConvert<qint8>(v0));
+ QVERIFY(v0.canConvert<qint8>());
QCOMPARE(int(qvariant_cast<qint8>(v0)), 32);
QCOMPARE(int(v0.toInt()), 32);
QCOMPARE(v0.toString(), QString("32"));
@@ -2633,7 +2696,7 @@ void tst_QVariant::convertToQUint8() const
const quint8 anInt = 32;
const QVariant v0 = anInt;
- QVERIFY(qVariantCanConvert<quint8>(v0));
+ QVERIFY(v0.canConvert<quint8>());
QCOMPARE(int(qvariant_cast<quint8>(v0)), 32);
QCOMPARE(int(v0.toUInt()), 32);
QCOMPARE(v0.toString(), QString("32"));
@@ -2644,7 +2707,7 @@ void tst_QVariant::convertToQUint8() const
const qint16 anInt = 32;
const QVariant v0 = anInt;
- QVERIFY(qVariantCanConvert<qint16>(v0));
+ QVERIFY(v0.canConvert<qint16>());
QCOMPARE(int(qvariant_cast<qint16>(v0)), 32);
QCOMPARE(int(v0.toInt()), 32);
QCOMPARE(v0.toString(), QString("32"));
@@ -2655,7 +2718,7 @@ void tst_QVariant::convertToQUint8() const
const quint16 anInt = 32;
const QVariant v0 = anInt;
- QVERIFY(qVariantCanConvert<quint16>(v0));
+ QVERIFY(v0.canConvert<quint16>());
QCOMPARE(int(qvariant_cast<quint16>(v0)), 32);
QCOMPARE(int(v0.toUInt()), 32);
QCOMPARE(v0.toString(), QString("32"));
@@ -2670,8 +2733,8 @@ void tst_QVariant::comparePointers() const
MyClass myClass;
- QVariant v = qVariantFromValue<void *>(&myClass);
- QVariant v2 = qVariantFromValue<void *>(&myClass);
+ QVariant v = QVariant::fromValue<void *>(&myClass);
+ QVariant v2 = QVariant::fromValue<void *>(&myClass);
QCOMPARE(v, v2);
}
@@ -2686,15 +2749,15 @@ void tst_QVariant::voidStar() const
void *p2 = p1;
QVariant v1, v2;
- v1 = qVariantFromValue(p1);
+ v1 = QVariant::fromValue(p1);
v2 = v1;
QVERIFY(v1 == v2);
- v2 = qVariantFromValue(p2);
+ v2 = QVariant::fromValue(p2);
QVERIFY(v1 == v2);
p2 = 0;
- v2 = qVariantFromValue(p2);
+ v2 = QVariant::fromValue(p2);
QVERIFY(v1 != v2);
}
@@ -2703,14 +2766,14 @@ void tst_QVariant::dataStar() const
qRegisterMetaType<Data*>();
Data *p1 = new Data;
- QVariant v1 = qVariantFromValue(p1);
+ QVariant v1 = QVariant::fromValue(p1);
QCOMPARE(v1.userType(), qMetaTypeId<Data*>());
QCOMPARE(qvariant_cast<Data*>(v1), p1);
QVariant v2 = v1;
QVERIFY(v1 == v2);
- v2 = qVariantFromValue(p1);
+ v2 = QVariant::fromValue(p1);
QVERIFY(v1 == v2);
delete p1;
}
@@ -2748,10 +2811,10 @@ void tst_QVariant::canConvertQStringList_data() const
template<typename T> void convertMetaType()
{
- QVERIFY(qVariantFromValue<T>(10).isValid());
- QVERIFY(qVariantFromValue<T>(10).canConvert(QVariant::Int));
- QCOMPARE(qVariantFromValue<T>(10).toInt(), 10);
- QCOMPARE(qVariantFromValue<T>(10), qVariantFromValue<T>(10));
+ QVERIFY(QVariant::fromValue<T>(10).isValid());
+ QVERIFY(QVariant::fromValue<T>(10).canConvert(QVariant::Int));
+ QCOMPARE(QVariant::fromValue<T>(10).toInt(), 10);
+ QCOMPARE(QVariant::fromValue<T>(10), QVariant::fromValue<T>(10));
}
#define CONVERT_META_TYPE(Type) \
@@ -2818,6 +2881,8 @@ Q_DECLARE_METATYPE( MyClass )
void tst_QVariant::loadUnknownUserType()
{
qRegisterMetaType<MyClass>("MyClass");
+ QTest::ignoreMessage(QtWarningMsg, "QVariant::load: unable to load type "
+ + QByteArray::number(qMetaTypeId<MyClass>()) +".");
char data[] = {0, 0, QMetaType::User >> 8 , char(QMetaType::User), 0, 0, 0, 0, 8, 'M', 'y', 'C', 'l', 'a', 's', 's', 0};
QByteArray ba(data, sizeof(data));
@@ -2829,13 +2894,14 @@ void tst_QVariant::loadUnknownUserType()
void tst_QVariant::loadBrokenUserType()
{
- char data[] = {0, 0, 0, 127, 0, 112 };
+ QTest::ignoreMessage(QtWarningMsg, "Trying to construct an instance of an invalid type, type id: 127");
+ char data[] = {0, 0, 0, 127, 0 };
QByteArray ba(data, sizeof(data));
QDataStream ds(&ba, QIODevice::ReadOnly);
QVariant var;
var.load(ds);
- QCOMPARE(ds.status(), QDataStream::ReadPastEnd);
+ QCOMPARE(ds.status(), QDataStream::Ok);
}
void tst_QVariant::invalidDate() const
@@ -2872,11 +2938,11 @@ void tst_QVariant::compareCustomTypes() const
WontCompare f1;
f1.x = 0;
- const QVariant variant1(qVariantFromValue(f1));
+ const QVariant variant1(QVariant::fromValue(f1));
WontCompare f2;
f2.x = 0;
- const QVariant variant2(qVariantFromValue(f2));
+ const QVariant variant2(QVariant::fromValue(f2));
/* We compare pointers. */
QVERIFY(variant1 != variant2);
@@ -2898,10 +2964,10 @@ void tst_QVariant::copyingUserTypes() const
QVariant var;
QVariant var3;
const QHostAddress ha("127.0.0.1");
- qVariantSetValue(var, ha);
+ var.setValue(ha);
var3 = var;
- QCOMPARE(qVariantValue<QHostAddress>(var3), ha);
+ QCOMPARE(qvariant_cast<QHostAddress>(var3), ha);
}
void tst_QVariant::convertBoolToByteArray() const
@@ -2912,7 +2978,7 @@ void tst_QVariant::convertBoolToByteArray() const
const QVariant variant(input);
- QCOMPARE(qVariantCanConvert<bool>(variant), canConvert);
+ QCOMPARE(variant.canConvert<bool>(), canConvert);
if(canConvert) {
/* Just call this function so we run the code path. */
@@ -2980,7 +3046,7 @@ void tst_QVariant::convertByteArrayToBool() const
const QVariant variant(input);
QCOMPARE(variant.type(), QVariant::Bool);
QCOMPARE(variant.toBool(), input);
- QVERIFY(qVariantCanConvert<bool>(variant));
+ QVERIFY(variant.canConvert<bool>());
QCOMPARE(variant.toByteArray(), output);
}
@@ -3055,7 +3121,7 @@ void tst_QVariant::setValue()
QVERIFY( !v1.isDetached() );
QVERIFY( !v2.isDetached() );
- qVariantSetValue(v2, 3); //set an integer value
+ v2.setValue(3); //set an integer value
QVERIFY( v1.isDetached() );
QVERIFY( v2.isDetached() );
@@ -3134,7 +3200,7 @@ template<class T> void playWithVariant(const T &orig, bool isNull, const QString
}
QCOMPARE(qvariant_cast<T>(v2), qvariant_cast<T>(v));
QCOMPARE(v2.toString(), toString);
- v3 = qVariantFromValue(orig);
+ v3 = QVariant::fromValue(orig);
QVERIFY(v3.isValid());
QCOMPARE(v3.isNull(), isNull);
@@ -3344,7 +3410,7 @@ void tst_QVariant::moreCustomTypes()
PLAY_WITH_VARIANT( qint32(17), false, "17", 17, true);
PLAY_WITH_VARIANT(quint64(18), false, "18", 18, true);
PLAY_WITH_VARIANT( qint64(19), false, "19", 19, true);
- PLAY_WITH_VARIANT( qint8(-12), false, "\xf4", -12, true);
+ PLAY_WITH_VARIANT( qint8(-12), false, QLatin1String("\xf4"), -12, true); // qint8 is char, so it gets converted via QChar
PLAY_WITH_VARIANT( qint16(-13), false, "-13", -13, true);
PLAY_WITH_VARIANT( qint32(-14), false, "-14", -14, true);
PLAY_WITH_VARIANT( qint64(-15), false, "-15", -15, true);
diff --git a/tests/auto/corelib/plugin/qfactoryloader/test/test.pro b/tests/auto/corelib/plugin/qfactoryloader/test/test.pro
index d03af231aa..1ec4db8756 100644
--- a/tests/auto/corelib/plugin/qfactoryloader/test/test.pro
+++ b/tests/auto/corelib/plugin/qfactoryloader/test/test.pro
@@ -18,4 +18,3 @@ win32 {
}
mac: CONFIG -= app_bundle
-mac: CONFIG += insignificant_test # QTBUG-22765
diff --git a/tests/auto/corelib/plugin/qpluginloader/tst/tst.pro b/tests/auto/corelib/plugin/qpluginloader/tst/tst.pro
index 810efe856c..a8dad32720 100644
--- a/tests/auto/corelib/plugin/qpluginloader/tst/tst.pro
+++ b/tests/auto/corelib/plugin/qpluginloader/tst/tst.pro
@@ -13,5 +13,3 @@ win32 {
}
TESTDATA += ../elftest
-
-mac: CONFIG += insignificant_test # QTBUG-22765
diff --git a/tests/auto/corelib/tools/qbytearray/tst_qbytearray.cpp b/tests/auto/corelib/tools/qbytearray/tst_qbytearray.cpp
index 267aa71085..e84eb95447 100644
--- a/tests/auto/corelib/tools/qbytearray/tst_qbytearray.cpp
+++ b/tests/auto/corelib/tools/qbytearray/tst_qbytearray.cpp
@@ -170,10 +170,10 @@ static const struct StaticByteArrays {
const char string[8];
} shiftedNotNullTerminated;
-} statics = {{{ Q_REFCOUNT_INITIALIZE_STATIC, /* length = */ 4, 0, 0, sizeof(QByteArrayData) }, "data"}
- ,{{ Q_REFCOUNT_INITIALIZE_STATIC, /* length = */ 4, 0, 0, sizeof(QByteArrayData) }, "dataBAD"}
- ,{{ Q_REFCOUNT_INITIALIZE_STATIC, /* length = */ 4, 0, 0, sizeof(QByteArrayData) + sizeof(char) }, 0, "data"}
- ,{{ Q_REFCOUNT_INITIALIZE_STATIC, /* length = */ 4, 0, 0, sizeof(QByteArrayData) + sizeof(char) }, 0, "dataBAD"}
+} statics = {{Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER(4), "data"}
+ ,{Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER(4), "dataBAD"}
+ ,{Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(4, sizeof(QByteArrayData) + sizeof(char)), 0, "data"}
+ ,{Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(4, sizeof(QByteArrayData) + sizeof(char)), 0, "dataBAD"}
};
static const QByteArrayDataPtr staticStandard = { const_cast<QByteArrayData *>(&statics.standard.data) };
diff --git a/tests/auto/corelib/tools/qchar/tst_qchar.cpp b/tests/auto/corelib/tools/qchar/tst_qchar.cpp
index 14c43d0088..1a568073cf 100644
--- a/tests/auto/corelib/tools/qchar/tst_qchar.cpp
+++ b/tests/auto/corelib/tools/qchar/tst_qchar.cpp
@@ -276,8 +276,65 @@ void tst_QChar::isLetterOrNumber()
void tst_QChar::isPrint()
{
+ // noncharacters, reserved (General_Gategory =Cn)
+ QVERIFY(!QChar(0x2064).isPrint());
+ QVERIFY(!QChar(0x2069).isPrint());
+ QVERIFY(!QChar(0xfdd0).isPrint());
+ QVERIFY(!QChar(0xfdef).isPrint());
+ QVERIFY(!QChar(0xfff0).isPrint());
+ QVERIFY(!QChar(0xfff8).isPrint());
+ QVERIFY(!QChar(0xfffe).isPrint());
+ QVERIFY(!QChar(0xffff).isPrint());
+/*
+ QVERIFY(!QChar::isPrint(0xe0000u));
+ QVERIFY(!QChar::isPrint(0xe0002u));
+ QVERIFY(!QChar::isPrint(0xe001fu));
+ QVERIFY(!QChar::isPrint(0xe0080u));
+ QVERIFY(!QChar::isPrint(0xe00ffu));
+*/
+
+ // Other_Default_Ignorable_Code_Point, Variation_Selector
+ QVERIFY(QChar(0x034f).isPrint());
+ QVERIFY(QChar(0x115f).isPrint());
+ QVERIFY(QChar(0x180b).isPrint());
+ QVERIFY(QChar(0x180d).isPrint());
+ QVERIFY(QChar(0x3164).isPrint());
+ QVERIFY(QChar(0xfe00).isPrint());
+ QVERIFY(QChar(0xfe0f).isPrint());
+ QVERIFY(QChar(0xffa0).isPrint());
+/*
+ QVERIFY(QChar::isPrint(0xe0100u));
+ QVERIFY(QChar::isPrint(0xe01efu));
+*/
+
+ // Cf, Cs, Cc, White_Space, Annotation Characters
+ QVERIFY(!QChar(0x0008).isPrint());
+ QVERIFY(!QChar(0x000a).isPrint());
+ QVERIFY(QChar(0x0020).isPrint());
+ QVERIFY(QChar(0x00a0).isPrint());
+ QVERIFY(!QChar(0x00ad).isPrint());
+ QVERIFY(!QChar(0x0085).isPrint());
+ QVERIFY(!QChar(0xd800).isPrint());
+ QVERIFY(!QChar(0xdc00).isPrint());
+ QVERIFY(!QChar(0xfeff).isPrint());
+/*
+ QVERIFY(!QChar::isPrint(0x1d173u));
+*/
+
+ QVERIFY(QChar('0').isPrint());
QVERIFY(QChar('A').isPrint());
- QVERIFY(!QChar(0x1aff).isPrint()); // General_Gategory =Cn
+ QVERIFY(QChar('a').isPrint());
+
+ QVERIFY(!QChar(0x0370).isPrint()); // assigned in 5.1
+ QVERIFY(!QChar(0x0524).isPrint()); // assigned in 5.2
+ QVERIFY(!QChar(0x0526).isPrint()); // assigned in 6.0
+ QVERIFY(!QChar(0x08a0).isPrint()); // assigned in 6.1
+ QVERIFY(!QChar(0x1aff).isPrint()); // not assigned
+ QVERIFY(!QChar(0x1e9e).isPrint()); // assigned in 5.1
+/*
+ QVERIFY(!QChar::isPrint(0x1b000u)); // assigned in 6.0
+ QVERIFY(!QChar::isPrint(0x110d0u)); // assigned in 5.1
+*/
}
void tst_QChar::isUpper()
@@ -551,6 +608,14 @@ void tst_QChar::mirroredChar()
void tst_QChar::decomposition()
{
+ // Hangul syllables
+ for (uint ucs = 0xac00; ucs <= 0xd7af; ++ucs) {
+ QChar::Decomposition expected = QChar::unicodeVersion(ucs) > QChar::Unicode_Unassigned ? QChar::Canonical : QChar::NoDecomposition;
+ QString desc = QString::fromLatin1("ucs = 0x%1, tag = %2, expected = %3")
+ .arg(QString::number(ucs, 16)).arg(QChar::decompositionTag(ucs)).arg(expected);
+ QVERIFY2(QChar::decompositionTag(ucs) == expected, desc.toLatin1());
+ }
+
QVERIFY(QChar((ushort)0xa0).decompositionTag() == QChar::NoBreak);
QVERIFY(QChar((ushort)0xa8).decompositionTag() == QChar::Compat);
QVERIFY(QChar((ushort)0x41).decompositionTag() == QChar::NoDecomposition);
@@ -748,6 +813,25 @@ void tst_QChar::normalization_manual()
QVERIFY(composed.normalized(QString::NormalizationForm_KD) == decomposed);
QVERIFY(composed.normalized(QString::NormalizationForm_KC) == decomposed);
}
+ { // hangul
+ QString composed;
+ composed += QChar(0xc154);
+ composed += QChar(0x11f0);
+ QString decomposed;
+ decomposed += QChar(0x1109);
+ decomposed += QChar(0x1167);
+ decomposed += QChar(0x11f0);
+
+ QVERIFY(composed.normalized(QString::NormalizationForm_D) == decomposed);
+ QVERIFY(composed.normalized(QString::NormalizationForm_C) == composed);
+ QVERIFY(composed.normalized(QString::NormalizationForm_KD) == decomposed);
+ QVERIFY(composed.normalized(QString::NormalizationForm_KC) == composed);
+
+ QVERIFY(decomposed.normalized(QString::NormalizationForm_D) == decomposed);
+ QVERIFY(decomposed.normalized(QString::NormalizationForm_C) == composed);
+ QVERIFY(decomposed.normalized(QString::NormalizationForm_KD) == decomposed);
+ QVERIFY(decomposed.normalized(QString::NormalizationForm_KC) == composed);
+ }
}
void tst_QChar::normalizationCorrections()
diff --git a/tests/auto/corelib/tools/qeasingcurve/tst_qeasingcurve.cpp b/tests/auto/corelib/tools/qeasingcurve/tst_qeasingcurve.cpp
index 40e3cd08b6..487007e4cf 100644
--- a/tests/auto/corelib/tools/qeasingcurve/tst_qeasingcurve.cpp
+++ b/tests/auto/corelib/tools/qeasingcurve/tst_qeasingcurve.cpp
@@ -526,7 +526,7 @@ void tst_QEasingCurve::properties()
obj.setEasing(inOutBack);
- QEasingCurve easing = qVariantValue<QEasingCurve>(obj.property("easing"));
+ QEasingCurve easing = qvariant_cast<QEasingCurve>(obj.property("easing"));
QCOMPARE(easing.type(), QEasingCurve::InOutBack);
QCOMPARE(easing.overshoot(), overshoot);
QCOMPARE(easing.amplitude(), amplitude);
@@ -538,9 +538,9 @@ void tst_QEasingCurve::properties()
period = linear.period();
obj.setProperty("easing",
- qVariantFromValue(QEasingCurve(QEasingCurve::Linear)));
+ QVariant::fromValue(QEasingCurve(QEasingCurve::Linear)));
- easing = qVariantValue<QEasingCurve>(obj.property("easing"));
+ easing = qvariant_cast<QEasingCurve>(obj.property("easing"));
QCOMPARE(easing.type(), QEasingCurve::Linear);
QCOMPARE(easing.overshoot(), overshoot);
QCOMPARE(easing.amplitude(), amplitude);
diff --git a/tests/auto/corelib/tools/qlocale/test/test.pro b/tests/auto/corelib/tools/qlocale/test/test.pro
index 28e127e307..25023fad4d 100644
--- a/tests/auto/corelib/tools/qlocale/test/test.pro
+++ b/tests/auto/corelib/tools/qlocale/test/test.pro
@@ -16,5 +16,4 @@ win32 {
load(testcase) # for target.path and installTestHelperApp()
installTestHelperApp("../syslocaleapp/syslocaleapp",syslocaleapp,syslocaleapp)
-mac: CONFIG += insignificant_test # QTBUG-22769
win32:CONFIG+= insignificant_test # QTBUG-25284
diff --git a/tests/auto/corelib/tools/qstring/tst_qstring.cpp b/tests/auto/corelib/tools/qstring/tst_qstring.cpp
index 1905c9c049..4ac1221643 100644
--- a/tests/auto/corelib/tools/qstring/tst_qstring.cpp
+++ b/tests/auto/corelib/tools/qstring/tst_qstring.cpp
@@ -39,6 +39,16 @@
**
****************************************************************************/
+#ifdef QT_NO_CAST_FROM_ASCII
+# undef QT_NO_CAST_FROM_ASCII
+#endif
+#ifdef QT_NO_CAST_TO_ASCII
+# undef QT_NO_CAST_TO_ASCII
+#endif
+#ifdef QT_ASCII_CAST_WARNINGS
+# undef QT_ASCII_CAST_WARNINGS
+#endif
+
#include <QtTest/QtTest>
#include <qregexp.h>
#include <qregularexpression.h>
@@ -623,7 +633,7 @@ void tst_QString::utf8_data()
QTest::newRow( "str0" ) << QByteArray("abcdefgh")
<< QString("abcdefgh");
QTest::newRow( "str1" ) << QByteArray("\303\266\303\244\303\274\303\226\303\204\303\234\303\270\303\246\303\245\303\230\303\206\303\205")
- << QString("\366\344\374\326\304\334\370\346\345\330\306\305") ;
+ << QString::fromLatin1("\366\344\374\326\304\334\370\346\345\330\306\305") ;
str += QChar( 0x05e9 );
str += QChar( 0x05d3 );
str += QChar( 0x05d2 );
@@ -885,41 +895,11 @@ void tst_QString::constructorQByteArray()
void tst_QString::STL()
{
-#ifndef QT_NO_CAST_TO_ASCII
- QString qt( "QString" );
-
std::string stdstr( "QString" );
- QString stlqt;
-
- // constructor
- stlqt = QString( stdstr );
- QCOMPARE( stlqt, qt );
-
- // assignment
- stlqt = stdstr;
- QCOMPARE( stlqt, qt );
-
- std::string stdstr2 = stlqt;
- QCOMPARE( stdstr2, stdstr );
-
- // prepend
- stlqt = QString();
- stlqt.prepend( stdstr );
- QCOMPARE( stlqt, qt );
-
- // append
- stlqt = QString();
- stlqt.append( stdstr );
- QCOMPARE( stlqt, qt );
-
- // pathologics (null-strings not supported by many STLs, so test only empty strings)
- stdstr = std::string();
- stlqt = stdstr;
- QVERIFY( stlqt.isEmpty() );
- std::string stdstr3 = stlqt;
- QVERIFY( !stdstr3.length() );
-#endif
+ QString stlqt = QString::fromStdString(stdstr);
+ QCOMPARE(stlqt, QString::fromLatin1(stdstr.c_str()));
+ QCOMPARE(stlqt.toStdString(), stdstr);
const wchar_t arr[] = {'h', 'e', 'l', 'l', 'o', 0};
std::wstring stlStr = arr;
@@ -3297,7 +3277,7 @@ void tst_QString::check_QTextIOStream()
a="";
QTextStream ts(&a);
ts << "pi \261= " << 3.125;
- QCOMPARE(a,(QString)"pi \261= 3.125");
+ QCOMPARE(a, QString::fromLatin1("pi \261= 3.125"));
}
{
a="123 456";
@@ -3426,8 +3406,10 @@ void tst_QString::fromUtf8_data()
QTest::newRow("str0") << QByteArray("abcdefgh") << QString("abcdefgh") << -1;
QTest::newRow("str0-len") << QByteArray("abcdefgh") << QString("abc") << 3;
- QTest::newRow("str1") << QByteArray("\303\266\303\244\303\274\303\226\303\204\303\234\303\270\303\246\303\245\303\230\303\206\303\205") << QString("\366\344\374\326\304\334\370\346\345\330\306\305") << -1;
- QTest::newRow("str1-len") << QByteArray("\303\266\303\244\303\274\303\226\303\204\303\234\303\270\303\246\303\245\303\230\303\206\303\205") << QString("\366\344\374\326\304") << 10;
+ QTest::newRow("str1") << QByteArray("\303\266\303\244\303\274\303\226\303\204\303\234\303\270\303\246\303\245\303\230\303\206\303\205")
+ << QString::fromLatin1("\366\344\374\326\304\334\370\346\345\330\306\305") << -1;
+ QTest::newRow("str1-len") << QByteArray("\303\266\303\244\303\274\303\226\303\204\303\234\303\270\303\246\303\245\303\230\303\206\303\205")
+ << QString::fromLatin1("\366\344\374\326\304") << 10;
str += QChar(0x05e9);
str += QChar(0x05d3);
@@ -3474,9 +3456,9 @@ void tst_QString::fromUtf8_data()
QTest::newRow("null5") << QByteArray() << QString() << 5;
QTest::newRow("empty-1") << QByteArray("\0abcd", 5) << QString() << -1;
QTest::newRow("empty0") << QByteArray() << QString() << 0;
- QTest::newRow("empty5") << QByteArray("\0abcd", 5) << QString::fromAscii("\0abcd", 5) << 5;
- QTest::newRow("other-1") << QByteArray("ab\0cd", 5) << QString::fromAscii("ab") << -1;
- QTest::newRow("other5") << QByteArray("ab\0cd", 5) << QString::fromAscii("ab\0cd", 5) << 5;
+ QTest::newRow("empty5") << QByteArray("\0abcd", 5) << QString::fromLatin1("\0abcd", 5) << 5;
+ QTest::newRow("other-1") << QByteArray("ab\0cd", 5) << QString::fromLatin1("ab") << -1;
+ QTest::newRow("other5") << QByteArray("ab\0cd", 5) << QString::fromLatin1("ab\0cd", 5) << 5;
str = "Old Italic: ";
str += QChar(0xd800);
@@ -4390,13 +4372,13 @@ void tst_QString::localeAwareCompare_data()
below.
*/
#ifdef Q_OS_WIN // assume c locale to be english
- QTest::newRow("c1") << MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT) << QString("\xe5") << QString("\xe4") << 1;
- QTest::newRow("c2") << MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT) << QString("\xe4") << QString("\xf6") << -1;
- QTest::newRow("c3") << MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT) << QString("\xe5") << QString("\xf6") << -1;
+ QTest::newRow("c1") << MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT) << QString::fromLatin1("\xe5") << QString::fromLatin1("\xe4") << 1;
+ QTest::newRow("c2") << MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT) << QString::fromLatin1("\xe4") << QString::fromLatin1("\xf6") << -1;
+ QTest::newRow("c3") << MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT) << QString::fromLatin1("\xe5") << QString::fromLatin1("\xf6") << -1;
#else
- QTest::newRow("c1") << QString("C") << QString("\xe5") << QString("\xe4") << 1;
- QTest::newRow("c2") << QString("C") << QString("\xe4") << QString("\xf6") << -1;
- QTest::newRow("c3") << QString("C") << QString("\xe5") << QString("\xf6") << -1;
+ QTest::newRow("c1") << QString("C") << QString::fromLatin1("\xe5") << QString::fromLatin1("\xe4") << 1;
+ QTest::newRow("c2") << QString("C") << QString::fromLatin1("\xe4") << QString::fromLatin1("\xf6") << -1;
+ QTest::newRow("c3") << QString("C") << QString::fromLatin1("\xe5") << QString::fromLatin1("\xf6") << -1;
#endif
/*
@@ -4422,20 +4404,20 @@ void tst_QString::localeAwareCompare_data()
all come after z.
*/
#ifdef Q_OS_MAC
- QTest::newRow("swedish1") << QString("sv_SE.ISO8859-1") << QString("\xe5") << QString("\xe4") << -1;
- QTest::newRow("swedish2") << QString("sv_SE.ISO8859-1") << QString("\xe4") << QString("\xf6") << -1;
- QTest::newRow("swedish3") << QString("sv_SE.ISO8859-1") << QString("\xe5") << QString("\xf6") << -1;
- QTest::newRow("swedish4") << QString("sv_SE.ISO8859-1") << QString("z") << QString("\xe5") << -1;
+ QTest::newRow("swedish1") << QString("sv_SE.ISO8859-1") << QString::fromLatin1("\xe5") << QString::fromLatin1("\xe4") << -1;
+ QTest::newRow("swedish2") << QString("sv_SE.ISO8859-1") << QString::fromLatin1("\xe4") << QString::fromLatin1("\xf6") << -1;
+ QTest::newRow("swedish3") << QString("sv_SE.ISO8859-1") << QString::fromLatin1("\xe5") << QString::fromLatin1("\xf6") << -1;
+ QTest::newRow("swedish4") << QString("sv_SE.ISO8859-1") << QString::fromLatin1("z") << QString::fromLatin1("\xe5") << -1;
#elif defined(Q_OS_WIN)
- QTest::newRow("swedish1") << MAKELCID(MAKELANGID(LANG_SWEDISH, SUBLANG_SWEDISH), SORT_DEFAULT) << QString("\xe5") << QString("\xe4") << -1;
- QTest::newRow("swedish2") << MAKELCID(MAKELANGID(LANG_SWEDISH, SUBLANG_SWEDISH), SORT_DEFAULT) << QString("\xe4") << QString("\xf6") << -1;
- QTest::newRow("swedish3") << MAKELCID(MAKELANGID(LANG_SWEDISH, SUBLANG_SWEDISH), SORT_DEFAULT) << QString("\xe5") << QString("\xf6") << -1;
- QTest::newRow("swedish4") << MAKELCID(MAKELANGID(LANG_SWEDISH, SUBLANG_SWEDISH), SORT_DEFAULT) << QString("z") << QString("\xe5") << -1;
+ QTest::newRow("swedish1") << MAKELCID(MAKELANGID(LANG_SWEDISH, SUBLANG_SWEDISH), SORT_DEFAULT) << QString::fromLatin1("\xe5") << QString::fromLatin1("\xe4") << -1;
+ QTest::newRow("swedish2") << MAKELCID(MAKELANGID(LANG_SWEDISH, SUBLANG_SWEDISH), SORT_DEFAULT) << QString::fromLatin1("\xe4") << QString::fromLatin1("\xf6") << -1;
+ QTest::newRow("swedish3") << MAKELCID(MAKELANGID(LANG_SWEDISH, SUBLANG_SWEDISH), SORT_DEFAULT) << QString::fromLatin1("\xe5") << QString::fromLatin1("\xf6") << -1;
+ QTest::newRow("swedish4") << MAKELCID(MAKELANGID(LANG_SWEDISH, SUBLANG_SWEDISH), SORT_DEFAULT) << QString::fromLatin1("z") << QString::fromLatin1("\xe5") << -1;
#else
- QTest::newRow("swedish1") << QString("sv_SE") << QString("\xe5") << QString("\xe4") << -1;
- QTest::newRow("swedish2") << QString("sv_SE") << QString("\xe4") << QString("\xf6") << -1;
- QTest::newRow("swedish3") << QString("sv_SE") << QString("\xe5") << QString("\xf6") << -1;
- QTest::newRow("swedish4") << QString("sv_SE") << QString("z") << QString("\xe5") << -1;
+ QTest::newRow("swedish1") << QString("sv_SE") << QString::fromLatin1("\xe5") << QString::fromLatin1("\xe4") << -1;
+ QTest::newRow("swedish2") << QString("sv_SE") << QString::fromLatin1("\xe4") << QString::fromLatin1("\xf6") << -1;
+ QTest::newRow("swedish3") << QString("sv_SE") << QString::fromLatin1("\xe5") << QString::fromLatin1("\xf6") << -1;
+ QTest::newRow("swedish4") << QString("sv_SE") << QString::fromLatin1("z") << QString::fromLatin1("\xe5") << -1;
#endif
#if 0
@@ -4443,9 +4425,9 @@ void tst_QString::localeAwareCompare_data()
In Norwegian, ae (E6) comes before o with stroke (D8), which
comes before a with ring above (E5).
*/
- QTest::newRow("norwegian1") << QString("no_NO") << QString("\xe6") << QString("\xd8") << -1;
- QTest::newRow("norwegian2") << QString("no_NO") << QString("\xd8") << QString("\xe5") << -1;
- QTest::newRow("norwegian3") << QString("no_NO") << QString("\xe6") << QString("\xe5") << -1;
+ QTest::newRow("norwegian1") << QString("no_NO") << QString::fromLatin1("\xe6") << QString::fromLatin1("\xd8") << -1;
+ QTest::newRow("norwegian2") << QString("no_NO") << QString::fromLatin1("\xd8") << QString::fromLatin1("\xe5") << -1;
+ QTest::newRow("norwegian3") << QString("no_NO") << QString::fromLatin1("\xe6") << QString::fromLatin1("\xe5") << -1;
#endif
/*
@@ -4453,17 +4435,17 @@ void tst_QString::localeAwareCompare_data()
which comes before o diaresis (F6).
*/
#ifdef Q_OS_MAC
- QTest::newRow("german1") << QString("de_DE.ISO8859-1") << QString("z") << QString("\xe4") << 1;
- QTest::newRow("german2") << QString("de_DE.ISO8859-1") << QString("\xe4") << QString("\xf6") << -1;
- QTest::newRow("german3") << QString("de_DE.ISO8859-1") << QString("z") << QString("\xf6") << 1;
+ QTest::newRow("german1") << QString("de_DE.ISO8859-1") << QString::fromLatin1("z") << QString::fromLatin1("\xe4") << 1;
+ QTest::newRow("german2") << QString("de_DE.ISO8859-1") << QString::fromLatin1("\xe4") << QString::fromLatin1("\xf6") << -1;
+ QTest::newRow("german3") << QString("de_DE.ISO8859-1") << QString::fromLatin1("z") << QString::fromLatin1("\xf6") << 1;
#elif defined(Q_OS_WIN)
- QTest::newRow("german1") << MAKELCID(MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN), SORT_DEFAULT) << QString("z") << QString("\xe4") << 1;
- QTest::newRow("german2") << MAKELCID(MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN), SORT_DEFAULT) << QString("\xe4") << QString("\xf6") << -1;
- QTest::newRow("german3") << MAKELCID(MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN), SORT_DEFAULT) << QString("z") << QString("\xf6") << 1;
+ QTest::newRow("german1") << MAKELCID(MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN), SORT_DEFAULT) << QString::fromLatin1("z") << QString::fromLatin1("\xe4") << 1;
+ QTest::newRow("german2") << MAKELCID(MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN), SORT_DEFAULT) << QString::fromLatin1("\xe4") << QString::fromLatin1("\xf6") << -1;
+ QTest::newRow("german3") << MAKELCID(MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN), SORT_DEFAULT) << QString::fromLatin1("z") << QString::fromLatin1("\xf6") << 1;
#else
- QTest::newRow("german1") << QString("de_DE") << QString("z") << QString("\xe4") << 1;
- QTest::newRow("german2") << QString("de_DE") << QString("\xe4") << QString("\xf6") << -1;
- QTest::newRow("german3") << QString("de_DE") << QString("z") << QString("\xf6") << 1;
+ QTest::newRow("german1") << QString("de_DE") << QString::fromLatin1("z") << QString::fromLatin1("\xe4") << 1;
+ QTest::newRow("german2") << QString("de_DE") << QString::fromLatin1("\xe4") << QString::fromLatin1("\xf6") << -1;
+ QTest::newRow("german3") << QString("de_DE") << QString::fromLatin1("z") << QString::fromLatin1("\xf6") << 1;
#endif
}
diff --git a/tests/auto/corelib/tools/qstringbuilder/qstringbuilder1/stringbuilder.cpp b/tests/auto/corelib/tools/qstringbuilder/qstringbuilder1/stringbuilder.cpp
index 556b9ac16a..d0f82a38b7 100644
--- a/tests/auto/corelib/tools/qstringbuilder/qstringbuilder1/stringbuilder.cpp
+++ b/tests/auto/corelib/tools/qstringbuilder/qstringbuilder1/stringbuilder.cpp
@@ -57,6 +57,11 @@
#define UNICODE_LITERAL_EXTRA u"s\u00f6m\u00eb l\u00eft\u00ebr\u00e4l" "EXTRA"
#endif
+#ifndef P
+# error You need to define P
+# define P +
+#endif
+
//fix for gcc4.0: if the operator+ does not exist without QT_USE_FAST_OPERATOR_PLUS
#ifndef QT_USE_FAST_CONCATENATION
#define Q %
@@ -68,7 +73,6 @@ void runScenario()
{
// this code is latin1. TODO: replace it with the utf8 block below, once
// strings default to utf8.
- QLatin1Literal l1literal(LITERAL);
QLatin1String l1string(LITERAL);
QString string(l1string);
QStringRef stringref(&string, 2, 10);
@@ -78,14 +82,10 @@ void runScenario()
QString r3 = QString::fromUtf8(UTF8_LITERAL UTF8_LITERAL);
QString r;
- r = l1literal Q l1literal;
- QCOMPARE(r, r2);
r = string P string;
QCOMPARE(r, r2);
r = stringref Q stringref;
QCOMPARE(r, QString(stringref.toString() + stringref.toString()));
- r = string Q l1literal;
- QCOMPARE(r, r2);
r = string P l1string;
QCOMPARE(r, r2);
r = string Q QStringLiteral(LITERAL);
diff --git a/tests/auto/corelib/tools/qtimeline/qtimeline.pro b/tests/auto/corelib/tools/qtimeline/qtimeline.pro
index cac8074038..3a6c120b5a 100644
--- a/tests/auto/corelib/tools/qtimeline/qtimeline.pro
+++ b/tests/auto/corelib/tools/qtimeline/qtimeline.pro
@@ -2,4 +2,3 @@ CONFIG += testcase parallel_test
TARGET = tst_qtimeline
QT = core testlib
SOURCES = tst_qtimeline.cpp
-win32:CONFIG+=insignificant_test # unstable, QTBUG-24796
diff --git a/tests/auto/corelib/tools/qtimeline/tst_qtimeline.cpp b/tests/auto/corelib/tools/qtimeline/tst_qtimeline.cpp
index f05497d7a2..b15de5c1df 100644
--- a/tests/auto/corelib/tools/qtimeline/tst_qtimeline.cpp
+++ b/tests/auto/corelib/tools/qtimeline/tst_qtimeline.cpp
@@ -184,9 +184,10 @@ void tst_QTimeLine::duration()
timeLine.start();
QTest::qWait(999);
QCOMPARE(timeLine.state(), QTimeLine::Running);
- QVERIFY(timeLine.currentTime() > 0.9);
- QTest::qWait(50);
+ QVERIFY(timeLine.currentTime() > 900);
+ QTest::qWait(100);
QCOMPARE(timeLine.state(), QTimeLine::NotRunning);
+ QCOMPARE(timeLine.currentTime(), 1000);
// The duration shouldn't change
QCOMPARE(timeLine.duration(), 1000);
}
@@ -368,6 +369,8 @@ void tst_QTimeLine::interpolation()
QCOMPARE(timeLine.state(), QTimeLine::Running);
// Smooth accellerates slowly so in the beginning so it is farther behind
+ if (firstValue >= timeLine.currentFrame())
+ QEXPECT_FAIL("", "QTBUG-24796: QTimeLine exhibits inconsistent timing behaviour", Abort);
QVERIFY(firstValue < timeLine.currentFrame());
QTest::qWait(200);
QVERIFY(endValue > timeLine.currentFrame());
@@ -456,24 +459,33 @@ void tst_QTimeLine::toggleDirection()
void tst_QTimeLine::frameChanged()
{
QTimeLine timeLine;
+ timeLine.setCurveShape(QTimeLine::LinearCurve);
timeLine.setFrameRange(0,9);
- timeLine.setUpdateInterval(1000);
+ timeLine.setUpdateInterval(800);
QSignalSpy spy(&timeLine, SIGNAL(frameChanged(int)));
QVERIFY(spy.isValid());
+
+ // Test what happens when duration expires before all frames are emitted.
timeLine.start();
- QTest::qWait(timeLine.duration()*2);
+ QTest::qWait(timeLine.duration()/2);
+ QCOMPARE(timeLine.state(), QTimeLine::Running);
+ QCOMPARE(spy.count(), 0);
+ QTest::qWait(timeLine.duration());
+ if (timeLine.state() != QTimeLine::NotRunning)
+ QEXPECT_FAIL("", "QTBUG-24796: QTimeLine runs slower than it should", Abort);
QCOMPARE(timeLine.state(), QTimeLine::NotRunning);
- // Probably 10
- QVERIFY(spy.count() <= 10 && spy.count() > 0);
+ if (spy.count() != 1)
+ QEXPECT_FAIL("", "QTBUG-24796: QTimeLine runs slower than it should", Abort);
+ QCOMPARE(spy.count(), 1);
+ // Test what happens when the frames are all emitted well before duration expires.
timeLine.setUpdateInterval(5);
spy.clear();
timeLine.setCurrentTime(0);
timeLine.start();
QTest::qWait(timeLine.duration()*2);
QCOMPARE(timeLine.state(), QTimeLine::NotRunning);
- // Probably 1
- QVERIFY(spy.count() <= 10 && spy.count() > 0);
+ QCOMPARE(spy.count(), 10);
}
void tst_QTimeLine::stopped()
diff --git a/tests/auto/corelib/xml/qxmlstream/tst_qxmlstream.cpp b/tests/auto/corelib/xml/qxmlstream/tst_qxmlstream.cpp
index 8a60bb1876..4442094541 100644
--- a/tests/auto/corelib/xml/qxmlstream/tst_qxmlstream.cpp
+++ b/tests/auto/corelib/xml/qxmlstream/tst_qxmlstream.cpp
@@ -1252,7 +1252,7 @@ void tst_QXmlStream::writeWithCodec() const
QVERIFY(codec);
writer.setCodec(codec);
- const char *latin2 = "hé hé";
+ const char *latin2 = "h\xe9 h\xe9";
const QString string = codec->toUnicode(latin2);
diff --git a/tests/auto/dbus/qdbusabstractadaptor/tst_qdbusabstractadaptor.cpp b/tests/auto/dbus/qdbusabstractadaptor/tst_qdbusabstractadaptor.cpp
index 30571fadd6..7e31f6091c 100644
--- a/tests/auto/dbus/qdbusabstractadaptor/tst_qdbusabstractadaptor.cpp
+++ b/tests/auto/dbus/qdbusabstractadaptor/tst_qdbusabstractadaptor.cpp
@@ -1064,11 +1064,11 @@ void tst_QDBusAbstractAdaptor::writeProperties()
valueSpy.clear();
properties.call(QDBus::BlockWithGui, "Set", "local." + name, QString("prop1"),
- qVariantFromValue(QDBusVariant(name)));
+ QVariant::fromValue(QDBusVariant(name)));
QVERIFY(valueSpy.isEmpty()); // call mustn't have succeeded
properties.call(QDBus::BlockWithGui, "Set", "local." + name, QString("prop2"),
- qVariantFromValue(QDBusVariant(name)));
+ QVariant::fromValue(QDBusVariant(name)));
QCOMPARE(valueSpy, name);
QCOMPARE(QString(slotSpy), QString("void %1::setProp2(const QString &)").arg(name));
}
@@ -1570,11 +1570,11 @@ void tst_QDBusAbstractAdaptor::writePropertiesPeer()
clearValueSpyPeer();
properties.call(QDBus::BlockWithGui, "Set", "local." + name, QString("prop1"),
- qVariantFromValue(QDBusVariant(name)));
+ QVariant::fromValue(QDBusVariant(name)));
QVERIFY(valueSpyPeer().isEmpty()); // call mustn't have succeeded
properties.call(QDBus::BlockWithGui, "Set", "local." + name, QString("prop2"),
- qVariantFromValue(QDBusVariant(name)));
+ QVariant::fromValue(QDBusVariant(name)));
QCOMPARE(valueSpyPeer(), name);
QCOMPARE(QString(slotSpyPeer()), QString("void %1::setProp2(const QString &)").arg(name));
}
@@ -1774,9 +1774,9 @@ void tst_QDBusAbstractAdaptor::typeMatching_data()
QTest::addColumn<QVariant>("value");
QTest::newRow("bool") << "Bool" << "b" << QVariant(true);
- QTest::newRow("byte") << "UChar" << "y" << qVariantFromValue(uchar(42));
- QTest::newRow("short") << "Short" << "n" << qVariantFromValue(short(-43));
- QTest::newRow("ushort") << "UShort" << "q" << qVariantFromValue(ushort(44));
+ QTest::newRow("byte") << "UChar" << "y" << QVariant::fromValue(uchar(42));
+ QTest::newRow("short") << "Short" << "n" << QVariant::fromValue(short(-43));
+ QTest::newRow("ushort") << "UShort" << "q" << QVariant::fromValue(ushort(44));
QTest::newRow("int") << "Int" << "i" << QVariant(42);
QTest::newRow("uint") << "UInt" << "u" << QVariant(42U);
QTest::newRow("qlonglong") << "LongLong" << "x" << QVariant(Q_INT64_C(42));
@@ -1784,12 +1784,12 @@ void tst_QDBusAbstractAdaptor::typeMatching_data()
QTest::newRow("double") << "Double" << "d" << QVariant(2.5);
QTest::newRow("string") << "String" << "s" << QVariant("Hello, World!");
- QTest::newRow("variant") << "Variant" << "v" << qVariantFromValue(QDBusVariant("Hello again!"));
+ QTest::newRow("variant") << "Variant" << "v" << QVariant::fromValue(QDBusVariant("Hello again!"));
QTest::newRow("list") << "List" << "av" << QVariant(QVariantList()
<< 42
<< QString("foo")
<< QByteArray("bar")
- << qVariantFromValue(QDBusVariant(QString("baz"))));
+ << QVariant::fromValue(QDBusVariant(QString("baz"))));
QTest::newRow("stringlist") << "StringList" << "as" << QVariant(QStringList() << "Hello" << "world");
QTest::newRow("bytearray") << "ByteArray" << "ay" << QVariant(QByteArray("foo"));
@@ -1798,24 +1798,24 @@ void tst_QDBusAbstractAdaptor::typeMatching_data()
map["The answer to life, the Universe and everything"] = 42u; // uint
map["In the beginning..."] = QString("There was nothing"); // string
map["but Unix came and said"] = QByteArray("\"Hello, World\""); // bytearray
- map["two"] = qVariantFromValue(short(2)); // short
+ map["two"] = QVariant::fromValue(short(2)); // short
QTest::newRow("map") << "Map" << "a{sv}" << QVariant(map);
StringStringMap ssmap;
ssmap["a"] = "A";
ssmap["A"] = "a";
- QTest::newRow("ssmap") << "SSMap" << "a{ss}" << qVariantFromValue(ssmap);
+ QTest::newRow("ssmap") << "SSMap" << "a{ss}" << QVariant::fromValue(ssmap);
LLDateTimeMap lldtmap;
lldtmap[-1] = QDateTime();
QDateTime now = QDateTime::currentDateTime();
lldtmap[now.toTime_t()] = now; // array of struct of int64 and struct of 3 ints and struct of 4 ints and int
- QTest::newRow("lldtmap") << "LLDateTimeMap" << "a{x((iii)(iiii)i)}" << qVariantFromValue(lldtmap);
+ QTest::newRow("lldtmap") << "LLDateTimeMap" << "a{x((iii)(iiii)i)}" << QVariant::fromValue(lldtmap);
MyStruct s;
s.i = 42;
s.s = "A value";
- QTest::newRow("struct") << "Struct" << "(is)" << qVariantFromValue(s);
+ QTest::newRow("struct") << "Struct" << "(is)" << QVariant::fromValue(s);
}
void tst_QDBusAbstractAdaptor::typeMatching()
diff --git a/tests/auto/dbus/qdbusabstractinterface/pinger.h b/tests/auto/dbus/qdbusabstractinterface/pinger.h
index 7fc6e640fe..0b6e8343bb 100644
--- a/tests/auto/dbus/qdbusabstractinterface/pinger.h
+++ b/tests/auto/dbus/qdbusabstractinterface/pinger.h
@@ -81,19 +81,19 @@ public:
inline RegisteredType complexProp() const
{ return qvariant_cast< RegisteredType >(property("complexProp")); }
inline void setComplexProp(RegisteredType value)
- { setProperty("complexProp", qVariantFromValue(value)); }
+ { setProperty("complexProp", QVariant::fromValue(value)); }
Q_PROPERTY(QString stringProp READ stringProp WRITE setStringProp)
inline QString stringProp() const
{ return qvariant_cast< QString >(property("stringProp")); }
inline void setStringProp(const QString &value)
- { setProperty("stringProp", qVariantFromValue(value)); }
+ { setProperty("stringProp", QVariant::fromValue(value)); }
Q_PROPERTY(QDBusVariant variantProp READ variantProp WRITE setVariantProp)
inline QDBusVariant variantProp() const
{ return qvariant_cast< QDBusVariant >(property("variantProp")); }
inline void setVariantProp(const QDBusVariant &value)
- { setProperty("variantProp", qVariantFromValue(value)); }
+ { setProperty("variantProp", QVariant::fromValue(value)); }
public Q_SLOTS: // METHODS
inline QDBusPendingReply<RegisteredType> complexMethod()
@@ -120,7 +120,7 @@ public Q_SLOTS: // METHODS
inline QDBusPendingReply<int> sleepMethod(int in0)
{
QList<QVariant> argumentList;
- argumentList << qVariantFromValue(in0);
+ argumentList << QVariant::fromValue(in0);
return asyncCallWithArgumentList(QLatin1String("sleepMethod"), argumentList);
}
diff --git a/tests/auto/dbus/qdbusabstractinterface/tst_qdbusabstractinterface.cpp b/tests/auto/dbus/qdbusabstractinterface/tst_qdbusabstractinterface.cpp
index 59ec2955e4..fcc2a32920 100644
--- a/tests/auto/dbus/qdbusabstractinterface/tst_qdbusabstractinterface.cpp
+++ b/tests/auto/dbus/qdbusabstractinterface/tst_qdbusabstractinterface.cpp
@@ -495,7 +495,7 @@ void tst_QDBusAbstractInterface::callWithTimeout()
QDBusMessage msg = QDBusMessage::createMethodCall(server_serviceName,
server_objectPath, server_interfaceName, "sleepMethod");
- msg << 100;
+ msg << 100; // sleep 100 ms
{
// Call with no timeout -> works
@@ -505,7 +505,7 @@ void tst_QDBusAbstractInterface::callWithTimeout()
}
{
- // Call with 1 sec timeout -> fails
+ // Call with 1 msec timeout -> fails
QDBusMessage reply = con.call(msg, QDBus::Block, 1);
QCOMPARE(reply.type(), QDBusMessage::ErrorMessage);
}
@@ -520,11 +520,17 @@ void tst_QDBusAbstractInterface::callWithTimeout()
QCOMPARE(reply.arguments().at(0).toInt(), 42);
}
{
- // Call with 1 sec timeout -> fails
+ // Call with 1 msec timeout -> fails
iface.setTimeout(1);
QDBusMessage reply = iface.call("sleepMethod", 100);
QCOMPARE(reply.type(), QDBusMessage::ErrorMessage);
}
+ {
+ // Call with 300 msec timeout -> works
+ iface.setTimeout(300);
+ QDBusMessage reply = iface.call("sleepMethod", 100);
+ QCOMPARE(reply.arguments().at(0).toInt(), 42);
+ }
// Now using generated code
com::trolltech::QtDBus::Pinger p(server_serviceName, server_objectPath, QDBusConnection::sessionBus());
@@ -535,7 +541,7 @@ void tst_QDBusAbstractInterface::callWithTimeout()
QCOMPARE(int(reply), 42);
}
{
- // Call with 1 sec timeout -> fails
+ // Call with 1 msec timeout -> fails
p.setTimeout(1);
QDBusReply<int> reply = p.sleepMethod(100);
QVERIFY(!reply.isValid());
@@ -582,7 +588,7 @@ void tst_QDBusAbstractInterface::variantPropWrite()
QVERIFY2(p, "Not connected to D-Bus");
QDBusVariant expectedValue = QDBusVariant(Q_INT64_C(-47));
- QVERIFY(p->setProperty("variantProp", qVariantFromValue(expectedValue)));
+ QVERIFY(p->setProperty("variantProp", QVariant::fromValue(expectedValue)));
QCOMPARE(targetObj.m_variantProp.variant(), expectedValue.variant());
}
@@ -603,7 +609,7 @@ void tst_QDBusAbstractInterface::complexPropWrite()
QVERIFY2(p, "Not connected to D-Bus");
RegisteredType expectedValue = RegisteredType("This is a value");
- QVERIFY(p->setProperty("complexProp", qVariantFromValue(expectedValue)));
+ QVERIFY(p->setProperty("complexProp", QVariant::fromValue(expectedValue)));
QCOMPARE(targetObj.m_complexProp, expectedValue);
}
@@ -652,7 +658,7 @@ void tst_QDBusAbstractInterface::variantPropWritePeer()
resetServer();
QDBusVariant expectedValue = QDBusVariant(Q_INT64_C(-47));
- QVERIFY(p->setProperty("variantProp", qVariantFromValue(expectedValue)));
+ QVERIFY(p->setProperty("variantProp", QVariant::fromValue(expectedValue)));
QEXPECT_FAIL("", "QTBUG-24262 peer tests are broken", Abort);
QCOMPARE(targetObj.m_variantProp.variant(), expectedValue.variant());
}
@@ -676,7 +682,7 @@ void tst_QDBusAbstractInterface::complexPropWritePeer()
resetServer();
RegisteredType expectedValue = RegisteredType("This is a value");
- QVERIFY(p->setProperty("complexProp", qVariantFromValue(expectedValue)));
+ QVERIFY(p->setProperty("complexProp", QVariant::fromValue(expectedValue)));
QEXPECT_FAIL("", "QTBUG-24262 peer tests are broken", Abort);
QCOMPARE(targetObj.m_complexProp, expectedValue);
}
diff --git a/tests/auto/dbus/qdbusinterface/tst_qdbusinterface.cpp b/tests/auto/dbus/qdbusinterface/tst_qdbusinterface.cpp
index af2355aa5d..f6520ce946 100644
--- a/tests/auto/dbus/qdbusinterface/tst_qdbusinterface.cpp
+++ b/tests/auto/dbus/qdbusinterface/tst_qdbusinterface.cpp
@@ -161,7 +161,7 @@ int prop1Peer()
void setComplexPropPeer(QList<int> val)
{
QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "setComplexProp");
- req << qVariantFromValue(val);
+ req << QVariant::fromValue(val);
QDBusMessage reply = QDBusConnection::sessionBus().call(req);
}
@@ -474,7 +474,7 @@ void tst_QDBusInterface::callMethod()
MyObject::callCount = 0;
// call a SLOT method
- QDBusMessage reply = iface.call("ping", qVariantFromValue(QDBusVariant("foo")));
+ QDBusMessage reply = iface.call("ping", QVariant::fromValue(QDBusVariant("foo")));
QCOMPARE(MyObject::callCount, 1);
QCOMPARE(reply.type(), QDBusMessage::ReplyMessage);
@@ -493,7 +493,7 @@ void tst_QDBusInterface::callMethod()
QCOMPARE(dv.variant().toString(), QString("foo"));
// call an INVOKABLE method
- reply = iface.call("ping_invokable", qVariantFromValue(QDBusVariant("bar")));
+ reply = iface.call("ping_invokable", QVariant::fromValue(QDBusVariant("bar")));
QCOMPARE(MyObject::callCount, 2);
QCOMPARE(reply.type(), QDBusMessage::ReplyMessage);
@@ -708,7 +708,7 @@ void tst_QDBusInterface::callMethodPeer()
resetPeer();
// call a SLOT method
- QDBusMessage reply = iface.call("ping", qVariantFromValue(QDBusVariant("foo")));
+ QDBusMessage reply = iface.call("ping", QVariant::fromValue(QDBusVariant("foo")));
QCOMPARE(callCountPeer(), 1);
QCOMPARE(reply.type(), QDBusMessage::ReplyMessage);
@@ -728,7 +728,7 @@ void tst_QDBusInterface::callMethodPeer()
QCOMPARE(dv.variant().toString(), QString("foo"));
// call an INVOKABLE method
- reply = iface.call("ping_invokable", qVariantFromValue(QDBusVariant("bar")));
+ reply = iface.call("ping_invokable", QVariant::fromValue(QDBusVariant("bar")));
QCOMPARE(callCountPeer(), 2);
QCOMPARE(reply.type(), QDBusMessage::ReplyMessage);
@@ -1066,7 +1066,7 @@ void tst_QDBusInterface::complexPropertyWrite()
obj.m_complexProp.clear();
MyObject::callCount = 0;
- QVERIFY(iface.setProperty("complexProp", qVariantFromValue(arg)));
+ QVERIFY(iface.setProperty("complexProp", QVariant::fromValue(arg)));
QCOMPARE(MyObject::callCount, 1);
QCOMPARE(obj.m_complexProp, arg);
}
@@ -1129,7 +1129,7 @@ void tst_QDBusInterface::complexPropertyWritePeer()
resetPeer();
QList<int> arg = QList<int>() << -47 << 42;
- QVERIFY(iface.setProperty("complexProp", qVariantFromValue(arg)));
+ QVERIFY(iface.setProperty("complexProp", QVariant::fromValue(arg)));
QCOMPARE(callCountPeer(), 1);
QCOMPARE(complexPropPeer(), arg);
}
diff --git a/tests/auto/dbus/qdbuslocalcalls/tst_qdbuslocalcalls.cpp b/tests/auto/dbus/qdbuslocalcalls/tst_qdbuslocalcalls.cpp
index 871ae6948d..340455c2bd 100644
--- a/tests/auto/dbus/qdbuslocalcalls/tst_qdbuslocalcalls.cpp
+++ b/tests/auto/dbus/qdbuslocalcalls/tst_qdbuslocalcalls.cpp
@@ -185,7 +185,7 @@ void tst_QDBusLocalCalls::makeCallsVariant()
QFETCH(QVariant, value);
QDBusMessage callMsg = QDBusMessage::createMethodCall(conn.baseService(),
"/", QString(), "echo");
- callMsg << qVariantFromValue(QDBusVariant(value));
+ callMsg << QVariant::fromValue(QDBusVariant(value));
QDBusMessage replyMsg = doCall(callMsg);
QCOMPARE(int(replyMsg.type()), int(QDBusMessage::ReplyMessage));
@@ -222,7 +222,7 @@ void tst_QDBusLocalCalls::makeCallsComplex()
value << 1 << -42 << 47;
QDBusMessage callMsg = QDBusMessage::createMethodCall(conn.baseService(),
"/", QString(), "echo");
- callMsg << qVariantFromValue(value);
+ callMsg << QVariant::fromValue(value);
QDBusMessage replyMsg = doCall(callMsg);
QCOMPARE(int(replyMsg.type()), int(QDBusMessage::ReplyMessage));
diff --git a/tests/auto/dbus/qdbusmarshall/tst_qdbusmarshall.cpp b/tests/auto/dbus/qdbusmarshall/tst_qdbusmarshall.cpp
index 8412fb85be..8a7e809b15 100644
--- a/tests/auto/dbus/qdbusmarshall/tst_qdbusmarshall.cpp
+++ b/tests/auto/dbus/qdbusmarshall/tst_qdbusmarshall.cpp
@@ -182,9 +182,9 @@ void basicNumericTypes_data()
{
QTest::newRow("bool") << QVariant(false) << "b" << "false";
QTest::newRow("bool2") << QVariant(true) << "b" << "true";
- QTest::newRow("byte") << qVariantFromValue(uchar(1)) << "y" << "1";
- QTest::newRow("int16") << qVariantFromValue(short(2)) << "n" << "2";
- QTest::newRow("uint16") << qVariantFromValue(ushort(3)) << "q" << "3";
+ QTest::newRow("byte") << QVariant::fromValue(uchar(1)) << "y" << "1";
+ QTest::newRow("int16") << QVariant::fromValue(short(2)) << "n" << "2";
+ QTest::newRow("uint16") << QVariant::fromValue(ushort(3)) << "q" << "3";
QTest::newRow("int") << QVariant(1) << "i" << "1";
QTest::newRow("uint") << QVariant(2U) << "u" << "2";
QTest::newRow("int64") << QVariant(Q_INT64_C(3)) << "x" << "3";
@@ -195,8 +195,8 @@ void basicNumericTypes_data()
void basicStringTypes_data()
{
QTest::newRow("string") << QVariant("ping") << "s" << "\"ping\"";
- QTest::newRow("objectpath") << qVariantFromValue(QDBusObjectPath("/org/kde")) << "o" << "[ObjectPath: /org/kde]";
- QTest::newRow("signature") << qVariantFromValue(QDBusSignature("g")) << "g" << "[Signature: g]";
+ QTest::newRow("objectpath") << QVariant::fromValue(QDBusObjectPath("/org/kde")) << "o" << "[ObjectPath: /org/kde]";
+ QTest::newRow("signature") << QVariant::fromValue(QDBusSignature("g")) << "g" << "[Signature: g]";
QTest::newRow("emptystring") << QVariant("") << "s" << "\"\"";
QTest::newRow("nullstring") << QVariant(QString()) << "s" << "\"\"";
}
@@ -210,17 +210,17 @@ void tst_QDBusMarshall::sendBasic_data()
basicStringTypes_data();
if (fileDescriptorPassing)
- QTest::newRow("file-descriptor") << qVariantFromValue(QDBusUnixFileDescriptor(fileDescriptorForTest())) << "h" << "[Unix FD: valid]";
+ QTest::newRow("file-descriptor") << QVariant::fromValue(QDBusUnixFileDescriptor(fileDescriptorForTest())) << "h" << "[Unix FD: valid]";
}
void tst_QDBusMarshall::sendVariant_data()
{
sendBasic_data();
- QTest::newRow("variant") << qVariantFromValue(QDBusVariant(1)) << "v" << "[Variant(int): 1]";
+ QTest::newRow("variant") << QVariant::fromValue(QDBusVariant(1)) << "v" << "[Variant(int): 1]";
QDBusVariant nested(1);
- QTest::newRow("variant-variant") << qVariantFromValue(QDBusVariant(qVariantFromValue(nested))) << "v"
+ QTest::newRow("variant-variant") << QVariant::fromValue(QDBusVariant(QVariant::fromValue(nested))) << "v"
<< "[Variant(QDBusVariant): [Variant(int): 1]]";
}
@@ -252,70 +252,70 @@ void tst_QDBusMarshall::sendArrays_data()
QTest::newRow("bytearray") << QVariant(bytearray) << "ay" << "{102, 111, 111}";
QList<bool> bools;
- QTest::newRow("emptyboollist") << qVariantFromValue(bools) << "ab" << "[Argument: ab {}]";
+ QTest::newRow("emptyboollist") << QVariant::fromValue(bools) << "ab" << "[Argument: ab {}]";
bools << false << true << false;
- QTest::newRow("boollist") << qVariantFromValue(bools) << "ab" << "[Argument: ab {false, true, false}]";
+ QTest::newRow("boollist") << QVariant::fromValue(bools) << "ab" << "[Argument: ab {false, true, false}]";
QList<short> shorts;
- QTest::newRow("emptyshortlist") << qVariantFromValue(shorts) << "an" << "[Argument: an {}]";
+ QTest::newRow("emptyshortlist") << QVariant::fromValue(shorts) << "an" << "[Argument: an {}]";
shorts << 42 << -43 << 44 << 45 << -32768 << 32767;
- QTest::newRow("shortlist") << qVariantFromValue(shorts) << "an"
+ QTest::newRow("shortlist") << QVariant::fromValue(shorts) << "an"
<< "[Argument: an {42, -43, 44, 45, -32768, 32767}]";
QList<ushort> ushorts;
- QTest::newRow("emptyushortlist") << qVariantFromValue(ushorts) << "aq" << "[Argument: aq {}]";
+ QTest::newRow("emptyushortlist") << QVariant::fromValue(ushorts) << "aq" << "[Argument: aq {}]";
ushorts << 12u << 13u << 14u << 15 << 65535;
- QTest::newRow("ushortlist") << qVariantFromValue(ushorts) << "aq" << "[Argument: aq {12, 13, 14, 15, 65535}]";
+ QTest::newRow("ushortlist") << QVariant::fromValue(ushorts) << "aq" << "[Argument: aq {12, 13, 14, 15, 65535}]";
QList<int> ints;
- QTest::newRow("emptyintlist") << qVariantFromValue(ints) << "ai" << "[Argument: ai {}]";
+ QTest::newRow("emptyintlist") << QVariant::fromValue(ints) << "ai" << "[Argument: ai {}]";
ints << 42 << -43 << 44 << 45 << 2147483647 << -2147483647-1;
- QTest::newRow("intlist") << qVariantFromValue(ints) << "ai" << "[Argument: ai {42, -43, 44, 45, 2147483647, -2147483648}]";
+ QTest::newRow("intlist") << QVariant::fromValue(ints) << "ai" << "[Argument: ai {42, -43, 44, 45, 2147483647, -2147483648}]";
QList<uint> uints;
- QTest::newRow("emptyuintlist") << qVariantFromValue(uints) << "au" << "[Argument: au {}]";
+ QTest::newRow("emptyuintlist") << QVariant::fromValue(uints) << "au" << "[Argument: au {}]";
uints << uint(12) << uint(13) << uint(14) << 4294967295U;
- QTest::newRow("uintlist") << qVariantFromValue(uints) << "au" << "[Argument: au {12, 13, 14, 4294967295}]";
+ QTest::newRow("uintlist") << QVariant::fromValue(uints) << "au" << "[Argument: au {12, 13, 14, 4294967295}]";
QList<qlonglong> llints;
- QTest::newRow("emptyllintlist") << qVariantFromValue(llints) << "ax" << "[Argument: ax {}]";
+ QTest::newRow("emptyllintlist") << QVariant::fromValue(llints) << "ax" << "[Argument: ax {}]";
llints << Q_INT64_C(99) << Q_INT64_C(-100)
<< Q_INT64_C(-9223372036854775807)-1 << Q_INT64_C(9223372036854775807);
- QTest::newRow("llintlist") << qVariantFromValue(llints) << "ax"
+ QTest::newRow("llintlist") << QVariant::fromValue(llints) << "ax"
<< "[Argument: ax {99, -100, -9223372036854775808, 9223372036854775807}]";
QList<qulonglong> ullints;
- QTest::newRow("emptyullintlist") << qVariantFromValue(ullints) << "at" << "[Argument: at {}]";
+ QTest::newRow("emptyullintlist") << QVariant::fromValue(ullints) << "at" << "[Argument: at {}]";
ullints << Q_UINT64_C(66) << Q_UINT64_C(67)
<< Q_UINT64_C(18446744073709551615);
- QTest::newRow("ullintlist") << qVariantFromValue(ullints) << "at" << "[Argument: at {66, 67, 18446744073709551615}]";
+ QTest::newRow("ullintlist") << QVariant::fromValue(ullints) << "at" << "[Argument: at {66, 67, 18446744073709551615}]";
QList<double> doubles;
- QTest::newRow("emptydoublelist") << qVariantFromValue(doubles) << "ad" << "[Argument: ad {}]";
+ QTest::newRow("emptydoublelist") << QVariant::fromValue(doubles) << "ad" << "[Argument: ad {}]";
doubles << 1.2 << 2.2 << 4.4
<< -std::numeric_limits<double>::infinity()
<< std::numeric_limits<double>::infinity()
<< std::numeric_limits<double>::quiet_NaN();
- QTest::newRow("doublelist") << qVariantFromValue(doubles) << "ad" << "[Argument: ad {1.2, 2.2, 4.4, -inf, inf, nan}]";
+ QTest::newRow("doublelist") << QVariant::fromValue(doubles) << "ad" << "[Argument: ad {1.2, 2.2, 4.4, -inf, inf, nan}]";
QList<QDBusObjectPath> objectPaths;
- QTest::newRow("emptyobjectpathlist") << qVariantFromValue(objectPaths) << "ao" << "[Argument: ao {}]";
+ QTest::newRow("emptyobjectpathlist") << QVariant::fromValue(objectPaths) << "ao" << "[Argument: ao {}]";
objectPaths << QDBusObjectPath("/") << QDBusObjectPath("/foo");
- QTest::newRow("objectpathlist") << qVariantFromValue(objectPaths) << "ao" << "[Argument: ao {[ObjectPath: /], [ObjectPath: /foo]}]";
+ QTest::newRow("objectpathlist") << QVariant::fromValue(objectPaths) << "ao" << "[Argument: ao {[ObjectPath: /], [ObjectPath: /foo]}]";
if (fileDescriptorPassing) {
QList<QDBusUnixFileDescriptor> fileDescriptors;
- QTest::newRow("emptyfiledescriptorlist") << qVariantFromValue(fileDescriptors) << "ah" << "[Argument: ah {}]";
+ QTest::newRow("emptyfiledescriptorlist") << QVariant::fromValue(fileDescriptors) << "ah" << "[Argument: ah {}]";
fileDescriptors << QDBusUnixFileDescriptor(fileDescriptorForTest()) << QDBusUnixFileDescriptor(1);
- QTest::newRow("filedescriptorlist") << qVariantFromValue(fileDescriptors) << "ah" << "[Argument: ah {[Unix FD: valid], [Unix FD: valid]}]";
+ QTest::newRow("filedescriptorlist") << QVariant::fromValue(fileDescriptors) << "ah" << "[Argument: ah {[Unix FD: valid], [Unix FD: valid]}]";
}
QVariantList variants;
QTest::newRow("emptyvariantlist") << QVariant(variants) << "av" << "[Argument: av {}]";
variants << QString("Hello") << QByteArray("World") << 42 << -43.0 << 44U << Q_INT64_C(-45)
- << Q_UINT64_C(46) << true << qVariantFromValue(short(-47))
- << qVariantFromValue(QDBusSignature("av"))
- << qVariantFromValue(QDBusVariant(qVariantFromValue(QDBusObjectPath("/"))));
+ << Q_UINT64_C(46) << true << QVariant::fromValue(short(-47))
+ << QVariant::fromValue(QDBusSignature("av"))
+ << QVariant::fromValue(QDBusVariant(QVariant::fromValue(QDBusObjectPath("/"))));
QTest::newRow("variantlist") << QVariant(variants) << "av"
<< "[Argument: av {[Variant(QString): \"Hello\"], [Variant(QByteArray): {87, 111, 114, 108, 100}], [Variant(int): 42], [Variant(double): -43], [Variant(uint): 44], [Variant(qlonglong): -45], [Variant(qulonglong): 46], [Variant(bool): true], [Variant(short): -47], [Variant: [Signature: av]], [Variant: [Variant: [ObjectPath: /]]]}]";
}
@@ -328,132 +328,132 @@ void tst_QDBusMarshall::sendArrayOfArrays_data()
// arrays:
QList<QStringList> strings;
- QTest::newRow("empty-list-of-stringlist") << qVariantFromValue(strings) << "aas"
+ QTest::newRow("empty-list-of-stringlist") << QVariant::fromValue(strings) << "aas"
<< "[Argument: aas {}]";
strings << QStringList();
- QTest::newRow("list-of-emptystringlist") << qVariantFromValue(strings) << "aas"
+ QTest::newRow("list-of-emptystringlist") << QVariant::fromValue(strings) << "aas"
<< "[Argument: aas {{}}]";
strings << (QStringList() << "hello" << "world")
<< (QStringList() << "hi" << "there")
<< (QStringList() << QString());
- QTest::newRow("stringlist") << qVariantFromValue(strings) << "aas"
+ QTest::newRow("stringlist") << QVariant::fromValue(strings) << "aas"
<< "[Argument: aas {{}, {\"hello\", \"world\"}, {\"hi\", \"there\"}, {\"\"}}]";
QList<QByteArray> bytearray;
- QTest::newRow("empty-list-of-bytearray") << qVariantFromValue(bytearray) << "aay"
+ QTest::newRow("empty-list-of-bytearray") << QVariant::fromValue(bytearray) << "aay"
<< "[Argument: aay {}]";
bytearray << QByteArray();
- QTest::newRow("list-of-emptybytearray") << qVariantFromValue(bytearray) << "aay"
+ QTest::newRow("list-of-emptybytearray") << QVariant::fromValue(bytearray) << "aay"
<< "[Argument: aay {{}}]";
bytearray << "foo" << "bar" << "baz" << "" << QByteArray();
- QTest::newRow("bytearray") << qVariantFromValue(bytearray) << "aay"
+ QTest::newRow("bytearray") << QVariant::fromValue(bytearray) << "aay"
<< "[Argument: aay {{}, {102, 111, 111}, {98, 97, 114}, {98, 97, 122}, {}, {}}]";
QList<QList<bool> > bools;
- QTest::newRow("empty-list-of-boollist") << qVariantFromValue(bools) << "aab"
+ QTest::newRow("empty-list-of-boollist") << QVariant::fromValue(bools) << "aab"
<< "[Argument: aab {}]";
bools << QList<bool>();
- QTest::newRow("list-of-emptyboollist") << qVariantFromValue(bools) << "aab"
+ QTest::newRow("list-of-emptyboollist") << QVariant::fromValue(bools) << "aab"
<< "[Argument: aab {[Argument: ab {}]}]";
bools << (QList<bool>() << false << true) << (QList<bool>() << false) << (QList<bool>());
- QTest::newRow("boollist") << qVariantFromValue(bools) << "aab"
+ QTest::newRow("boollist") << QVariant::fromValue(bools) << "aab"
<< "[Argument: aab {[Argument: ab {}], [Argument: ab {false, true}], [Argument: ab {false}], [Argument: ab {}]}]";
QList<QList<short> > shorts;
- QTest::newRow("empty-list-of-shortlist") << qVariantFromValue(shorts) << "aan"
+ QTest::newRow("empty-list-of-shortlist") << QVariant::fromValue(shorts) << "aan"
<< "[Argument: aan {}]";
shorts << QList<short>();
- QTest::newRow("list-of-emptyshortlist") << qVariantFromValue(shorts) << "aan"
+ QTest::newRow("list-of-emptyshortlist") << QVariant::fromValue(shorts) << "aan"
<< "[Argument: aan {[Argument: an {}]}]";
shorts << (QList<short>() << 42 << -43 << 44 << 45)
<< (QList<short>() << -32768 << 32767)
<< (QList<short>());
- QTest::newRow("shortlist") << qVariantFromValue(shorts) << "aan"
+ QTest::newRow("shortlist") << QVariant::fromValue(shorts) << "aan"
<< "[Argument: aan {[Argument: an {}], [Argument: an {42, -43, 44, 45}], [Argument: an {-32768, 32767}], [Argument: an {}]}]";
QList<QList<ushort> > ushorts;
- QTest::newRow("empty-list-of-ushortlist") << qVariantFromValue(ushorts) << "aaq"
+ QTest::newRow("empty-list-of-ushortlist") << QVariant::fromValue(ushorts) << "aaq"
<< "[Argument: aaq {}]";
ushorts << QList<ushort>();
- QTest::newRow("list-of-emptyushortlist") << qVariantFromValue(ushorts) << "aaq"
+ QTest::newRow("list-of-emptyushortlist") << QVariant::fromValue(ushorts) << "aaq"
<< "[Argument: aaq {[Argument: aq {}]}]";
ushorts << (QList<ushort>() << 12u << 13u << 14u << 15)
<< (QList<ushort>() << 65535)
<< (QList<ushort>());
- QTest::newRow("ushortlist") << qVariantFromValue(ushorts) << "aaq"
+ QTest::newRow("ushortlist") << QVariant::fromValue(ushorts) << "aaq"
<< "[Argument: aaq {[Argument: aq {}], [Argument: aq {12, 13, 14, 15}], [Argument: aq {65535}], [Argument: aq {}]}]";
QList<QList<int> > ints;
- QTest::newRow("empty-list-of-intlist") << qVariantFromValue(ints) << "aai"
+ QTest::newRow("empty-list-of-intlist") << QVariant::fromValue(ints) << "aai"
<< "[Argument: aai {}]";
ints << QList<int>();
- QTest::newRow("list-of-emptyintlist") << qVariantFromValue(ints) << "aai"
+ QTest::newRow("list-of-emptyintlist") << QVariant::fromValue(ints) << "aai"
<< "[Argument: aai {[Argument: ai {}]}]";
ints << (QList<int>() << 42 << -43 << 44 << 45)
<< (QList<int>() << 2147483647 << -2147483647-1)
<< (QList<int>());
- QTest::newRow("intlist") << qVariantFromValue(ints) << "aai"
+ QTest::newRow("intlist") << QVariant::fromValue(ints) << "aai"
<< "[Argument: aai {[Argument: ai {}], [Argument: ai {42, -43, 44, 45}], [Argument: ai {2147483647, -2147483648}], [Argument: ai {}]}]";
QList<QList<uint> > uints;
- QTest::newRow("empty-list-of-uintlist") << qVariantFromValue(uints) << "aau"
+ QTest::newRow("empty-list-of-uintlist") << QVariant::fromValue(uints) << "aau"
<< "[Argument: aau {}]";
uints << QList<uint>();
- QTest::newRow("list-of-emptyuintlist") << qVariantFromValue(uints) << "aau"
+ QTest::newRow("list-of-emptyuintlist") << QVariant::fromValue(uints) << "aau"
<< "[Argument: aau {[Argument: au {}]}]";
uints << (QList<uint>() << uint(12) << uint(13) << uint(14))
<< (QList<uint>() << 4294967295U)
<< (QList<uint>());
- QTest::newRow("uintlist") << qVariantFromValue(uints) << "aau"
+ QTest::newRow("uintlist") << QVariant::fromValue(uints) << "aau"
<< "[Argument: aau {[Argument: au {}], [Argument: au {12, 13, 14}], [Argument: au {4294967295}], [Argument: au {}]}]";
QList<QList<qlonglong> > llints;
- QTest::newRow("empty-list-of-llintlist") << qVariantFromValue(llints) << "aax"
+ QTest::newRow("empty-list-of-llintlist") << QVariant::fromValue(llints) << "aax"
<< "[Argument: aax {}]";
llints << QList<qlonglong>();
- QTest::newRow("list-of-emptyllintlist") << qVariantFromValue(llints) << "aax"
+ QTest::newRow("list-of-emptyllintlist") << QVariant::fromValue(llints) << "aax"
<< "[Argument: aax {[Argument: ax {}]}]";
llints << (QList<qlonglong>() << Q_INT64_C(99) << Q_INT64_C(-100))
<< (QList<qlonglong>() << Q_INT64_C(-9223372036854775807)-1 << Q_INT64_C(9223372036854775807))
<< (QList<qlonglong>());
- QTest::newRow("llintlist") << qVariantFromValue(llints) << "aax"
+ QTest::newRow("llintlist") << QVariant::fromValue(llints) << "aax"
<< "[Argument: aax {[Argument: ax {}], [Argument: ax {99, -100}], [Argument: ax {-9223372036854775808, 9223372036854775807}], [Argument: ax {}]}]";
QList<QList<qulonglong> > ullints;
- QTest::newRow("empty-list-of-ullintlist") << qVariantFromValue(ullints) << "aat"
+ QTest::newRow("empty-list-of-ullintlist") << QVariant::fromValue(ullints) << "aat"
<< "[Argument: aat {}]";
ullints << QList<qulonglong>();
- QTest::newRow("list-of-emptyullintlist") << qVariantFromValue(ullints) << "aat"
+ QTest::newRow("list-of-emptyullintlist") << QVariant::fromValue(ullints) << "aat"
<< "[Argument: aat {[Argument: at {}]}]";
ullints << (QList<qulonglong>() << Q_UINT64_C(66) << Q_UINT64_C(67))
<< (QList<qulonglong>() << Q_UINT64_C(18446744073709551615))
<< (QList<qulonglong>());
- QTest::newRow("ullintlist") << qVariantFromValue(ullints) << "aat"
+ QTest::newRow("ullintlist") << QVariant::fromValue(ullints) << "aat"
<< "[Argument: aat {[Argument: at {}], [Argument: at {66, 67}], [Argument: at {18446744073709551615}], [Argument: at {}]}]";
QList<QList<double> > doubles;
- QTest::newRow("empty-list-ofdoublelist") << qVariantFromValue(doubles) << "aad"
+ QTest::newRow("empty-list-ofdoublelist") << QVariant::fromValue(doubles) << "aad"
<< "[Argument: aad {}]";
doubles << QList<double>();
- QTest::newRow("list-of-emptydoublelist") << qVariantFromValue(doubles) << "aad"
+ QTest::newRow("list-of-emptydoublelist") << QVariant::fromValue(doubles) << "aad"
<< "[Argument: aad {[Argument: ad {}]}]";
doubles << (QList<double>() << 1.2 << 2.2 << 4.4)
<< (QList<double>() << -std::numeric_limits<double>::infinity()
<< std::numeric_limits<double>::infinity()
<< std::numeric_limits<double>::quiet_NaN())
<< (QList<double>());
- QTest::newRow("doublelist") << qVariantFromValue(doubles) << "aad"
+ QTest::newRow("doublelist") << QVariant::fromValue(doubles) << "aad"
<< "[Argument: aad {[Argument: ad {}], [Argument: ad {1.2, 2.2, 4.4}], [Argument: ad {-inf, inf, nan}], [Argument: ad {}]}]";
QList<QVariantList> variants;
- QTest::newRow("emptyvariantlist") << qVariantFromValue(variants) << "aav"
+ QTest::newRow("emptyvariantlist") << QVariant::fromValue(variants) << "aav"
<< "[Argument: aav {}]";
variants << QVariantList();
- QTest::newRow("emptyvariantlist") << qVariantFromValue(variants) << "aav"
+ QTest::newRow("emptyvariantlist") << QVariant::fromValue(variants) << "aav"
<< "[Argument: aav {[Argument: av {}]}]";
variants << (QVariantList() << QString("Hello") << QByteArray("World"))
<< (QVariantList() << 42 << -43.0 << 44U << Q_INT64_C(-45))
- << (QVariantList() << Q_UINT64_C(46) << true << qVariantFromValue(short(-47)));
- QTest::newRow("variantlist") << qVariantFromValue(variants) << "aav"
+ << (QVariantList() << Q_UINT64_C(46) << true << QVariant::fromValue(short(-47)));
+ QTest::newRow("variantlist") << QVariant::fromValue(variants) << "aav"
<< "[Argument: aav {[Argument: av {}], [Argument: av {[Variant(QString): \"Hello\"], [Variant(QByteArray): {87, 111, 114, 108, 100}]}], [Argument: av {[Variant(int): 42], [Variant(double): -43], [Variant(uint): 44], [Variant(qlonglong): -45]}], [Argument: av {[Variant(qulonglong): 46], [Variant(bool): true], [Variant(short): -47]}]}]";
}
@@ -464,65 +464,65 @@ void tst_QDBusMarshall::sendMaps_data()
QTest::addColumn<QString>("stringResult");
QMap<int, QString> ismap;
- QTest::newRow("empty-is-map") << qVariantFromValue(ismap) << "a{is}"
+ QTest::newRow("empty-is-map") << QVariant::fromValue(ismap) << "a{is}"
<< "[Argument: a{is} {}]";
ismap[1] = "a";
ismap[2000] = "b";
ismap[-47] = "c";
- QTest::newRow("is-map") << qVariantFromValue(ismap) << "a{is}"
+ QTest::newRow("is-map") << QVariant::fromValue(ismap) << "a{is}"
<< "[Argument: a{is} {-47 = \"c\", 1 = \"a\", 2000 = \"b\"}]";
QMap<QString, QString> ssmap;
- QTest::newRow("empty-ss-map") << qVariantFromValue(ssmap) << "a{ss}"
+ QTest::newRow("empty-ss-map") << QVariant::fromValue(ssmap) << "a{ss}"
<< "[Argument: a{ss} {}]";
ssmap["a"] = "a";
ssmap["c"] = "b";
ssmap["b"] = "c";
- QTest::newRow("ss-map") << qVariantFromValue(ssmap) << "a{ss}"
+ QTest::newRow("ss-map") << QVariant::fromValue(ssmap) << "a{ss}"
<< "[Argument: a{ss} {\"a\" = \"a\", \"b\" = \"c\", \"c\" = \"b\"}]";
QVariantMap svmap;
- QTest::newRow("empty-sv-map") << qVariantFromValue(svmap) << "a{sv}"
+ QTest::newRow("empty-sv-map") << QVariant::fromValue(svmap) << "a{sv}"
<< "[Argument: a{sv} {}]";
svmap["a"] = 1;
svmap["c"] = "b";
svmap["b"] = QByteArray("c");
svmap["d"] = 42U;
- svmap["e"] = qVariantFromValue(short(-47));
- svmap["f"] = qVariantFromValue(QDBusVariant(0));
- QTest::newRow("sv-map1") << qVariantFromValue(svmap) << "a{sv}"
+ svmap["e"] = QVariant::fromValue(short(-47));
+ svmap["f"] = QVariant::fromValue(QDBusVariant(0));
+ QTest::newRow("sv-map1") << QVariant::fromValue(svmap) << "a{sv}"
<< "[Argument: a{sv} {\"a\" = [Variant(int): 1], \"b\" = [Variant(QByteArray): {99}], \"c\" = [Variant(QString): \"b\"], \"d\" = [Variant(uint): 42], \"e\" = [Variant(short): -47], \"f\" = [Variant: [Variant(int): 0]]}]";
QMap<QDBusObjectPath, QString> osmap;
- QTest::newRow("empty-os-map") << qVariantFromValue(osmap) << "a{os}"
+ QTest::newRow("empty-os-map") << QVariant::fromValue(osmap) << "a{os}"
<< "[Argument: a{os} {}]";
osmap[QDBusObjectPath("/")] = "root";
osmap[QDBusObjectPath("/foo")] = "foo";
osmap[QDBusObjectPath("/bar/baz")] = "bar and baz";
- QTest::newRow("os-map") << qVariantFromValue(osmap) << "a{os}"
+ QTest::newRow("os-map") << QVariant::fromValue(osmap) << "a{os}"
<< "[Argument: a{os} {[ObjectPath: /] = \"root\", [ObjectPath: /bar/baz] = \"bar and baz\", [ObjectPath: /foo] = \"foo\"}]";
QMap<QDBusSignature, QString> gsmap;
- QTest::newRow("empty-gs-map") << qVariantFromValue(gsmap) << "a{gs}"
+ QTest::newRow("empty-gs-map") << QVariant::fromValue(gsmap) << "a{gs}"
<< "[Argument: a{gs} {}]";
gsmap[QDBusSignature("i")] = "int32";
gsmap[QDBusSignature("s")] = "string";
gsmap[QDBusSignature("a{gs}")] = "array of dict_entry of (signature, string)";
- QTest::newRow("gs-map") << qVariantFromValue(gsmap) << "a{gs}"
+ QTest::newRow("gs-map") << QVariant::fromValue(gsmap) << "a{gs}"
<< "[Argument: a{gs} {[Signature: a{gs}] = \"array of dict_entry of (signature, string)\", [Signature: i] = \"int32\", [Signature: s] = \"string\"}]";
if (fileDescriptorPassing) {
- svmap["zzfiledescriptor"] = qVariantFromValue(QDBusUnixFileDescriptor(fileDescriptorForTest()));
- QTest::newRow("sv-map1-fd") << qVariantFromValue(svmap) << "a{sv}"
+ svmap["zzfiledescriptor"] = QVariant::fromValue(QDBusUnixFileDescriptor(fileDescriptorForTest()));
+ QTest::newRow("sv-map1-fd") << QVariant::fromValue(svmap) << "a{sv}"
<< "[Argument: a{sv} {\"a\" = [Variant(int): 1], \"b\" = [Variant(QByteArray): {99}], \"c\" = [Variant(QString): \"b\"], \"d\" = [Variant(uint): 42], \"e\" = [Variant(short): -47], \"f\" = [Variant: [Variant(int): 0]], \"zzfiledescriptor\" = [Variant(QDBusUnixFileDescriptor): [Unix FD: valid]]}]";
}
svmap.clear();
- svmap["ismap"] = qVariantFromValue(ismap);
- svmap["ssmap"] = qVariantFromValue(ssmap);
- svmap["osmap"] = qVariantFromValue(osmap);
- svmap["gsmap"] = qVariantFromValue(gsmap);
- QTest::newRow("sv-map2") << qVariantFromValue(svmap) << "a{sv}"
+ svmap["ismap"] = QVariant::fromValue(ismap);
+ svmap["ssmap"] = QVariant::fromValue(ssmap);
+ svmap["osmap"] = QVariant::fromValue(osmap);
+ svmap["gsmap"] = QVariant::fromValue(gsmap);
+ QTest::newRow("sv-map2") << QVariant::fromValue(svmap) << "a{sv}"
<< "[Argument: a{sv} {\"gsmap\" = [Variant: [Argument: a{gs} {[Signature: a{gs}] = \"array of dict_entry of (signature, string)\", [Signature: i] = \"int32\", [Signature: s] = \"string\"}]], \"ismap\" = [Variant: [Argument: a{is} {-47 = \"c\", 1 = \"a\", 2000 = \"b\"}]], \"osmap\" = [Variant: [Argument: a{os} {[ObjectPath: /] = \"root\", [ObjectPath: /bar/baz] = \"bar and baz\", [ObjectPath: /foo] = \"foo\"}]], \"ssmap\" = [Variant: [Argument: a{ss} {\"a\" = \"a\", \"b\" = \"c\", \"c\" = \"b\"}]]}]";
}
@@ -554,33 +554,33 @@ void tst_QDBusMarshall::sendStructs_data()
<< "[Argument: ((iii)(iiii)i) [Argument: (iii) 2006, 6, 18], [Argument: (iiii) 12, 25, 0, 0], 0]";
MyStruct ms = { 1, "Hello, World" };
- QTest::newRow("int-string") << qVariantFromValue(ms) << "(is)" << "[Argument: (is) 1, \"Hello, World\"]";
+ QTest::newRow("int-string") << QVariant::fromValue(ms) << "(is)" << "[Argument: (is) 1, \"Hello, World\"]";
MyVariantMapStruct mvms = { "Hello, World", QVariantMap() };
- QTest::newRow("string-variantmap") << qVariantFromValue(mvms) << "(sa{sv})" << "[Argument: (sa{sv}) \"Hello, World\", [Argument: a{sv} {}]]";
+ QTest::newRow("string-variantmap") << QVariant::fromValue(mvms) << "(sa{sv})" << "[Argument: (sa{sv}) \"Hello, World\", [Argument: a{sv} {}]]";
// use only basic types, otherwise comparison will fail
mvms.map["int"] = 42;
mvms.map["uint"] = 42u;
- mvms.map["short"] = qVariantFromValue<short>(-47);
+ mvms.map["short"] = QVariant::fromValue<short>(-47);
mvms.map["bytearray"] = QByteArray("Hello, world");
- QTest::newRow("string-variantmap2") << qVariantFromValue(mvms) << "(sa{sv})" << "[Argument: (sa{sv}) \"Hello, World\", [Argument: a{sv} {\"bytearray\" = [Variant(QByteArray): {72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100}], \"int\" = [Variant(int): 42], \"short\" = [Variant(short): -47], \"uint\" = [Variant(uint): 42]}]]";
+ QTest::newRow("string-variantmap2") << QVariant::fromValue(mvms) << "(sa{sv})" << "[Argument: (sa{sv}) \"Hello, World\", [Argument: a{sv} {\"bytearray\" = [Variant(QByteArray): {72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100}], \"int\" = [Variant(int): 42], \"short\" = [Variant(short): -47], \"uint\" = [Variant(uint): 42]}]]";
QList<MyVariantMapStruct> list;
- QTest::newRow("empty-list-of-string-variantmap") << qVariantFromValue(list) << "a(sa{sv})" << "[Argument: a(sa{sv}) {}]";
+ QTest::newRow("empty-list-of-string-variantmap") << QVariant::fromValue(list) << "a(sa{sv})" << "[Argument: a(sa{sv}) {}]";
list << mvms;
- QTest::newRow("list-of-string-variantmap") << qVariantFromValue(list) << "a(sa{sv})" << "[Argument: a(sa{sv}) {[Argument: (sa{sv}) \"Hello, World\", [Argument: a{sv} {\"bytearray\" = [Variant(QByteArray): {72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100}], \"int\" = [Variant(int): 42], \"short\" = [Variant(short): -47], \"uint\" = [Variant(uint): 42]}]]}]";
+ QTest::newRow("list-of-string-variantmap") << QVariant::fromValue(list) << "a(sa{sv})" << "[Argument: a(sa{sv}) {[Argument: (sa{sv}) \"Hello, World\", [Argument: a{sv} {\"bytearray\" = [Variant(QByteArray): {72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100}], \"int\" = [Variant(int): 42], \"short\" = [Variant(short): -47], \"uint\" = [Variant(uint): 42]}]]}]";
if (fileDescriptorPassing) {
MyFileDescriptorStruct fds;
fds.fd = QDBusUnixFileDescriptor(fileDescriptorForTest());
- QTest::newRow("fdstruct") << qVariantFromValue(fds) << "(h)" << "[Argument: (h) [Unix FD: valid]]";
+ QTest::newRow("fdstruct") << QVariant::fromValue(fds) << "(h)" << "[Argument: (h) [Unix FD: valid]]";
QList<MyFileDescriptorStruct> fdlist;
- QTest::newRow("empty-list-of-fdstruct") << qVariantFromValue(fdlist) << "a(h)" << "[Argument: a(h) {}]";
+ QTest::newRow("empty-list-of-fdstruct") << QVariant::fromValue(fdlist) << "a(h)" << "[Argument: a(h) {}]";
fdlist << fds;
- QTest::newRow("list-of-fdstruct") << qVariantFromValue(fdlist) << "a(h)" << "[Argument: a(h) {[Argument: (h) [Unix FD: valid]]}]";
+ QTest::newRow("list-of-fdstruct") << QVariant::fromValue(fdlist) << "a(h)" << "[Argument: a(h) {[Argument: (h) [Unix FD: valid]]}]";
}
}
@@ -591,23 +591,23 @@ void tst_QDBusMarshall::sendComplex_data()
QTest::addColumn<QString>("stringResult");
QList<QDateTime> dtlist;
- QTest::newRow("empty-datetimelist") << qVariantFromValue(dtlist) << "a((iii)(iiii)i)"
+ QTest::newRow("empty-datetimelist") << QVariant::fromValue(dtlist) << "a((iii)(iiii)i)"
<< "[Argument: a((iii)(iiii)i) {}]";
dtlist << QDateTime();
- QTest::newRow("list-of-emptydatetime") << qVariantFromValue(dtlist) << "a((iii)(iiii)i)"
+ QTest::newRow("list-of-emptydatetime") << QVariant::fromValue(dtlist) << "a((iii)(iiii)i)"
<< "[Argument: a((iii)(iiii)i) {[Argument: ((iii)(iiii)i) [Argument: (iii) 0, 0, 0], [Argument: (iiii) -1, -1, -1, -1], 0]}]";
dtlist << QDateTime(QDate(1977, 9, 13), QTime(0, 0, 0))
<< QDateTime(QDate(2006, 6, 18), QTime(13, 14, 0));
- QTest::newRow("datetimelist") << qVariantFromValue(dtlist) << "a((iii)(iiii)i)"
+ QTest::newRow("datetimelist") << QVariant::fromValue(dtlist) << "a((iii)(iiii)i)"
<< "[Argument: a((iii)(iiii)i) {[Argument: ((iii)(iiii)i) [Argument: (iii) 0, 0, 0], [Argument: (iiii) -1, -1, -1, -1], 0], [Argument: ((iii)(iiii)i) [Argument: (iii) 1977, 9, 13], [Argument: (iiii) 0, 0, 0, 0], 0], [Argument: ((iii)(iiii)i) [Argument: (iii) 2006, 6, 18], [Argument: (iiii) 13, 14, 0, 0], 0]}]";
QMap<qlonglong, QDateTime> lldtmap;
- QTest::newRow("empty-lldtmap") << qVariantFromValue(lldtmap) << "a{x((iii)(iiii)i)}"
+ QTest::newRow("empty-lldtmap") << QVariant::fromValue(lldtmap) << "a{x((iii)(iiii)i)}"
<< "[Argument: a{x((iii)(iiii)i)} {}]";
lldtmap[0] = QDateTime();
lldtmap[1] = QDateTime(QDate(1970, 1, 1), QTime(0, 0, 1), Qt::UTC);
lldtmap[1150629776] = QDateTime(QDate(2006, 6, 18), QTime(11, 22, 56), Qt::UTC);
- QTest::newRow("lldtmap") << qVariantFromValue(lldtmap) << "a{x((iii)(iiii)i)}"
+ QTest::newRow("lldtmap") << QVariant::fromValue(lldtmap) << "a{x((iii)(iiii)i)}"
<< "[Argument: a{x((iii)(iiii)i)} {0 = [Argument: ((iii)(iiii)i) [Argument: (iii) 0, 0, 0], [Argument: (iiii) -1, -1, -1, -1], 0], 1 = [Argument: ((iii)(iiii)i) [Argument: (iii) 1970, 1, 1], [Argument: (iiii) 0, 0, 1, 0], 1], 1150629776 = [Argument: ((iii)(iiii)i) [Argument: (iii) 2006, 6, 18], [Argument: (iiii) 11, 22, 56, 0], 1]}]";
@@ -631,18 +631,18 @@ void tst_QDBusMarshall::sendComplex_data()
svmap["c"] = "b";
svmap["b"] = QByteArray("c");
svmap["d"] = 42U;
- svmap["e"] = qVariantFromValue(short(-47));
- svmap["f"] = qVariantFromValue(QDBusVariant(0));
+ svmap["e"] = QVariant::fromValue(short(-47));
+ svmap["f"] = QVariant::fromValue(QDBusVariant(0));
svmap["date"] = QDate(1977, 1, 1);
svmap["time"] = QTime(8, 58, 0);
svmap["datetime"] = QDateTime(QDate(13, 9, 2008), QTime(8, 59, 31));
svmap["pointf"] = QPointF(0.5, -0.5);
- svmap["ismap"] = qVariantFromValue(ismap);
- svmap["ssmap"] = qVariantFromValue(ssmap);
- svmap["gsmap"] = qVariantFromValue(gsmap);
- svmap["dtlist"] = qVariantFromValue(dtlist);
- svmap["lldtmap"] = qVariantFromValue(lldtmap);
- QTest::newRow("sv-map") << qVariantFromValue(svmap) << "a{sv}"
+ svmap["ismap"] = QVariant::fromValue(ismap);
+ svmap["ssmap"] = QVariant::fromValue(ssmap);
+ svmap["gsmap"] = QVariant::fromValue(gsmap);
+ svmap["dtlist"] = QVariant::fromValue(dtlist);
+ svmap["lldtmap"] = QVariant::fromValue(lldtmap);
+ QTest::newRow("sv-map") << QVariant::fromValue(svmap) << "a{sv}"
<< "[Argument: a{sv} {\"a\" = [Variant(int): 1], \"b\" = [Variant(QByteArray): {99}], \"c\" = [Variant(QString): \"b\"], \"d\" = [Variant(uint): 42], \"date\" = [Variant: [Argument: (iii) 1977, 1, 1]], \"datetime\" = [Variant: [Argument: ((iii)(iiii)i) [Argument: (iii) 0, 0, 0], [Argument: (iiii) 8, 59, 31, 0], 0]], \"dtlist\" = [Variant: [Argument: a((iii)(iiii)i) {[Argument: ((iii)(iiii)i) [Argument: (iii) 0, 0, 0], [Argument: (iiii) -1, -1, -1, -1], 0], [Argument: ((iii)(iiii)i) [Argument: (iii) 1977, 9, 13], [Argument: (iiii) 0, 0, 0, 0], 0], [Argument: ((iii)(iiii)i) [Argument: (iii) 2006, 6, 18], [Argument: (iiii) 13, 14, 0, 0], 0]}]], \"e\" = [Variant(short): -47], \"f\" = [Variant: [Variant(int): 0]], \"gsmap\" = [Variant: [Argument: a{gs} {[Signature: a{gs}] = \"array of dict_entry of (signature, string)\", [Signature: i] = \"int32\", [Signature: s] = \"string\"}]], \"ismap\" = [Variant: [Argument: a{is} {-47 = \"c\", 1 = \"a\", 2000 = \"b\"}]], \"lldtmap\" = [Variant: [Argument: a{x((iii)(iiii)i)} {0 = [Argument: ((iii)(iiii)i) [Argument: (iii) 0, 0, 0], [Argument: (iiii) -1, -1, -1, -1], 0], 1 = [Argument: ((iii)(iiii)i) [Argument: (iii) 1970, 1, 1], [Argument: (iiii) 0, 0, 1, 0], 1], 1150629776 = [Argument: ((iii)(iiii)i) [Argument: (iii) 2006, 6, 18], [Argument: (iiii) 11, 22, 56, 0], 1]}]], \"pointf\" = [Variant: [Argument: (dd) 0.5, -0.5]], \"ssmap\" = [Variant: [Argument: a{ss} {\"a\" = \"a\", \"b\" = \"c\", \"c\" = \"b\"}]], \"time\" = [Variant: [Argument: (iiii) 8, 58, 0, 0]]}]";
}
@@ -657,83 +657,83 @@ void tst_QDBusMarshall::sendArgument_data()
arg = QDBusArgument();
arg << true;
- QTest::newRow("bool") << qVariantFromValue(arg) << "b" << int(QDBusArgument::BasicType);;
+ QTest::newRow("bool") << QVariant::fromValue(arg) << "b" << int(QDBusArgument::BasicType);;
arg = QDBusArgument();
arg << false;
- QTest::newRow("bool2") << qVariantFromValue(arg) << "b" << int(QDBusArgument::BasicType);
+ QTest::newRow("bool2") << QVariant::fromValue(arg) << "b" << int(QDBusArgument::BasicType);
arg = QDBusArgument();
arg << uchar(1);
- QTest::newRow("byte") << qVariantFromValue(arg) << "y" << int(QDBusArgument::BasicType);
+ QTest::newRow("byte") << QVariant::fromValue(arg) << "y" << int(QDBusArgument::BasicType);
arg = QDBusArgument();
arg << short(2);
- QTest::newRow("int16") << qVariantFromValue(arg) << "n" << int(QDBusArgument::BasicType);
+ QTest::newRow("int16") << QVariant::fromValue(arg) << "n" << int(QDBusArgument::BasicType);
arg = QDBusArgument();
arg << ushort(3);
- QTest::newRow("uint16") << qVariantFromValue(arg) << "q" << int(QDBusArgument::BasicType);
+ QTest::newRow("uint16") << QVariant::fromValue(arg) << "q" << int(QDBusArgument::BasicType);
arg = QDBusArgument();
arg << 1;
- QTest::newRow("int32") << qVariantFromValue(arg) << "i" << int(QDBusArgument::BasicType);
+ QTest::newRow("int32") << QVariant::fromValue(arg) << "i" << int(QDBusArgument::BasicType);
arg = QDBusArgument();
arg << 2U;
- QTest::newRow("uint32") << qVariantFromValue(arg) << "u" << int(QDBusArgument::BasicType);
+ QTest::newRow("uint32") << QVariant::fromValue(arg) << "u" << int(QDBusArgument::BasicType);
arg = QDBusArgument();
arg << Q_INT64_C(3);
- QTest::newRow("int64") << qVariantFromValue(arg) << "x" << int(QDBusArgument::BasicType);
+ QTest::newRow("int64") << QVariant::fromValue(arg) << "x" << int(QDBusArgument::BasicType);
arg = QDBusArgument();
arg << Q_UINT64_C(4);
- QTest::newRow("uint64") << qVariantFromValue(arg) << "t" << int(QDBusArgument::BasicType);
+ QTest::newRow("uint64") << QVariant::fromValue(arg) << "t" << int(QDBusArgument::BasicType);
arg = QDBusArgument();
arg << 42.5;
- QTest::newRow("double") << qVariantFromValue(arg) << "d" << int(QDBusArgument::BasicType);
+ QTest::newRow("double") << QVariant::fromValue(arg) << "d" << int(QDBusArgument::BasicType);
arg = QDBusArgument();
arg << QLatin1String("ping");
- QTest::newRow("string") << qVariantFromValue(arg) << "s" << int(QDBusArgument::BasicType);
+ QTest::newRow("string") << QVariant::fromValue(arg) << "s" << int(QDBusArgument::BasicType);
arg = QDBusArgument();
arg << QDBusObjectPath("/org/kde");
- QTest::newRow("objectpath") << qVariantFromValue(arg) << "o" << int(QDBusArgument::BasicType);
+ QTest::newRow("objectpath") << QVariant::fromValue(arg) << "o" << int(QDBusArgument::BasicType);
arg = QDBusArgument();
arg << QDBusSignature("g");
- QTest::newRow("signature") << qVariantFromValue(arg) << "g" << int(QDBusArgument::BasicType);
+ QTest::newRow("signature") << QVariant::fromValue(arg) << "g" << int(QDBusArgument::BasicType);
arg = QDBusArgument();
arg << QLatin1String("");
- QTest::newRow("emptystring") << qVariantFromValue(arg) << "s" << int(QDBusArgument::BasicType);
+ QTest::newRow("emptystring") << QVariant::fromValue(arg) << "s" << int(QDBusArgument::BasicType);
arg = QDBusArgument();
arg << QString();
- QTest::newRow("nullstring") << qVariantFromValue(arg) << "s" << int(QDBusArgument::BasicType);
+ QTest::newRow("nullstring") << QVariant::fromValue(arg) << "s" << int(QDBusArgument::BasicType);
if (fileDescriptorPassing) {
arg = QDBusArgument();
arg << QDBusUnixFileDescriptor(fileDescriptorForTest());
- QTest::newRow("filedescriptor") << qVariantFromValue(arg) << "h" << int(QDBusArgument::BasicType);
+ QTest::newRow("filedescriptor") << QVariant::fromValue(arg) << "h" << int(QDBusArgument::BasicType);
}
arg = QDBusArgument();
arg << QDBusVariant(1);
- QTest::newRow("variant") << qVariantFromValue(arg) << "v" << int(QDBusArgument::VariantType);
+ QTest::newRow("variant") << QVariant::fromValue(arg) << "v" << int(QDBusArgument::VariantType);
arg = QDBusArgument();
- arg << QDBusVariant(qVariantFromValue(QDBusVariant(1)));
- QTest::newRow("variant-variant") << qVariantFromValue(arg) << "v" << int(QDBusArgument::VariantType);
+ arg << QDBusVariant(QVariant::fromValue(QDBusVariant(1)));
+ QTest::newRow("variant-variant") << QVariant::fromValue(arg) << "v" << int(QDBusArgument::VariantType);
arg = QDBusArgument();
arg.beginArray(QVariant::Int);
arg << 1 << 2 << 3 << -4;
arg.endArray();
- QTest::newRow("array-of-int") << qVariantFromValue(arg) << "ai" << int(QDBusArgument::ArrayType);
+ QTest::newRow("array-of-int") << QVariant::fromValue(arg) << "ai" << int(QDBusArgument::ArrayType);
arg = QDBusArgument();
arg.beginMap(QVariant::Int, QVariant::UInt);
@@ -744,13 +744,13 @@ void tst_QDBusMarshall::sendArgument_data()
arg << 3 << 4U;
arg.endMapEntry();
arg.endMap();
- QTest::newRow("map") << qVariantFromValue(arg) << "a{iu}" << int(QDBusArgument::MapType);
+ QTest::newRow("map") << QVariant::fromValue(arg) << "a{iu}" << int(QDBusArgument::MapType);
arg = QDBusArgument();
arg.beginStructure();
arg << 1 << 2U << short(-3) << ushort(4) << 5.0 << false;
arg.endStructure();
- QTest::newRow("structure") << qVariantFromValue(arg) << "(iunqdb)" << int(QDBusArgument::StructureType);
+ QTest::newRow("structure") << QVariant::fromValue(arg) << "(iunqdb)" << int(QDBusArgument::StructureType);
}
void tst_QDBusMarshall::sendBasic()
@@ -790,7 +790,7 @@ void tst_QDBusMarshall::sendVariant()
QDBusMessage msg = QDBusMessage::createMethodCall(serviceName,
objectPath, interfaceName, "ping");
- msg << qVariantFromValue(QDBusVariant(value));
+ msg << QVariant::fromValue(QDBusVariant(value));
QDBusMessage reply = con.call(msg);
// qDebug() << reply;
@@ -851,7 +851,7 @@ void tst_QDBusMarshall::sendArgument()
sendArg.beginStructure();
sendArg.appendVariant(value);
sendArg.endStructure();
- msg.setArguments(QVariantList() << qVariantFromValue(sendArg));
+ msg.setArguments(QVariantList() << QVariant::fromValue(sendArg));
reply = con.call(msg);
QCOMPARE(reply.signature(), QString("(%1)").arg(sig));
@@ -883,7 +883,7 @@ void tst_QDBusMarshall::sendSignalErrors()
QVERIFY(con.isConnected());
QDBusMessage msg = QDBusMessage::createSignal("/foo", "local.interfaceName",
"signalName");
- msg << qVariantFromValue(QDBusObjectPath());
+ msg << QVariant::fromValue(QDBusObjectPath());
QTest::ignoreMessage(QtWarningMsg, "QDBusConnection: error: could not send signal path \"/foo\" interface \"local.interfaceName\" member \"signalName\": Marshalling failed: Invalid object path passed in arguments");
QVERIFY(!con.send(msg));
@@ -893,20 +893,20 @@ void tst_QDBusMarshall::sendSignalErrors()
QTest::ignoreMessage(QtWarningMsg, "QDBusObjectPath: invalid path \"abc\"");
path.setPath("abc");
- msg << qVariantFromValue(path);
+ msg << QVariant::fromValue(path);
QTest::ignoreMessage(QtWarningMsg, "QDBusConnection: error: could not send signal path \"/foo\" interface \"local.interfaceName\" member \"signalName\": Marshalling failed: Invalid object path passed in arguments");
QVERIFY(!con.send(msg));
QDBusSignature sig;
- msg.setArguments(QVariantList() << qVariantFromValue(sig));
+ msg.setArguments(QVariantList() << QVariant::fromValue(sig));
QTest::ignoreMessage(QtWarningMsg, "QDBusConnection: error: could not send signal path \"/foo\" interface \"local.interfaceName\" member \"signalName\": Marshalling failed: Invalid signature passed in arguments");
QVERIFY(!con.send(msg));
QTest::ignoreMessage(QtWarningMsg, "QDBusSignature: invalid signature \"a\"");
sig.setSignature("a");
msg.setArguments(QVariantList());
- msg << qVariantFromValue(sig);
+ msg << QVariant::fromValue(sig);
QTest::ignoreMessage(QtWarningMsg, "QDBusConnection: error: could not send signal path \"/foo\" interface \"local.interfaceName\" member \"signalName\": Marshalling failed: Invalid signature passed in arguments");
QVERIFY(!con.send(msg));
}
@@ -956,7 +956,7 @@ void tst_QDBusMarshall::sendCallErrors_data()
<< "Marshalling failed: Variant containing QVariant::Invalid passed in arguments"
<< "QDBusMarshaller: cannot add an invalid QVariant";
QTest::newRow("invalid-variant1") << serviceName << objectPath << interfaceName << "ping"
- << (QVariantList() << qVariantFromValue(QDBusVariant()))
+ << (QVariantList() << QVariant::fromValue(QDBusVariant()))
<< "org.freedesktop.DBus.Error.Failed"
<< "Marshalling failed: Variant containing QVariant::Invalid passed in arguments"
<< "QDBusMarshaller: cannot add a null QDBusVariant";
@@ -970,20 +970,20 @@ void tst_QDBusMarshall::sendCallErrors_data()
// this type is known to the meta type system, but not registered with D-Bus
qRegisterMetaType<UnregisteredType>();
QTest::newRow("extra-unregistered") << serviceName << objectPath << interfaceName << "ping"
- << (QVariantList() << qVariantFromValue(UnregisteredType()))
+ << (QVariantList() << QVariant::fromValue(UnregisteredType()))
<< "org.freedesktop.DBus.Error.Failed"
<< "Marshalling failed: Unregistered type UnregisteredType passed in arguments"
<< QString("QDBusMarshaller: type `UnregisteredType' (%1) is not registered with D-BUS. Use qDBusRegisterMetaType to register it")
.arg(qMetaTypeId<UnregisteredType>());
QTest::newRow("invalid-object-path-arg") << serviceName << objectPath << interfaceName << "ping"
- << (QVariantList() << qVariantFromValue(QDBusObjectPath()))
+ << (QVariantList() << QVariant::fromValue(QDBusObjectPath()))
<< "org.freedesktop.DBus.Error.Failed"
<< "Marshalling failed: Invalid object path passed in arguments"
<< "";
QTest::newRow("invalid-signature-arg") << serviceName << objectPath << interfaceName << "ping"
- << (QVariantList() << qVariantFromValue(QDBusSignature()))
+ << (QVariantList() << QVariant::fromValue(QDBusSignature()))
<< "org.freedesktop.DBus.Error.Failed"
<< "Marshalling failed: Invalid signature passed in arguments"
<< "";
@@ -991,7 +991,7 @@ void tst_QDBusMarshall::sendCallErrors_data()
// invalid file descriptor
if (fileDescriptorPassing) {
QTest::newRow("invalid-file-descriptor") << serviceName << objectPath << interfaceName << "ping"
- << (QVariantList() << qVariantFromValue(QDBusUnixFileDescriptor(-1)))
+ << (QVariantList() << QVariant::fromValue(QDBusUnixFileDescriptor(-1)))
<< "org.freedesktop.DBus.Error.Failed"
<< "Marshalling failed: Invalid file descriptor passed in arguments"
<< "";
@@ -1200,7 +1200,7 @@ QVariant demarshallPrimitiveAs(const QDBusArgument& dbusArg)
{
T val;
dbusArg >> val;
- return qVariantFromValue(val);
+ return QVariant::fromValue(val);
}
QVariant demarshallPrimitiveAs(int typeIndex, const QDBusArgument& dbusArg)
@@ -1247,7 +1247,7 @@ void tst_QDBusMarshall::demarshallPrimitives()
sendArg.beginStructure();
sendArg.appendVariant(value);
sendArg.endStructure();
- msg.setArguments(QVariantList() << qVariantFromValue(sendArg));
+ msg.setArguments(QVariantList() << QVariant::fromValue(sendArg));
QDBusMessage reply = con.call(msg);
const QDBusArgument receiveArg = qvariant_cast<QDBusArgument>(reply.arguments().at(0));
@@ -1279,15 +1279,15 @@ void tst_QDBusMarshall::demarshallStrings_data()
typedef QPair<QVariant, char> ValSigPair;
const QList<ValSigPair> nullStringTypes
= QList<ValSigPair>()
- << ValSigPair(qVariantFromValue(QString()), 's')
- << ValSigPair(qVariantFromValue(QDBusObjectPath()), 'o')
- << ValSigPair(qVariantFromValue(QDBusSignature()), 'g');
+ << ValSigPair(QVariant::fromValue(QString()), 's')
+ << ValSigPair(QVariant::fromValue(QDBusObjectPath()), 'o')
+ << ValSigPair(QVariant::fromValue(QDBusSignature()), 'g');
foreach (ValSigPair valSigPair, nullStringTypes) {
QTest::newRow("bool(false)") << QVariant(false) << valSigPair.second << valSigPair.first;
QTest::newRow("bool(true)") << QVariant(true) << valSigPair.second << valSigPair.first;
- QTest::newRow("byte") << qVariantFromValue(uchar(1)) << valSigPair.second << valSigPair.first;
- QTest::newRow("int16") << qVariantFromValue(short(2)) << valSigPair.second << valSigPair.first;
- QTest::newRow("uint16") << qVariantFromValue(ushort(3)) << valSigPair.second << valSigPair.first;
+ QTest::newRow("byte") << QVariant::fromValue(uchar(1)) << valSigPair.second << valSigPair.first;
+ QTest::newRow("int16") << QVariant::fromValue(short(2)) << valSigPair.second << valSigPair.first;
+ QTest::newRow("uint16") << QVariant::fromValue(ushort(3)) << valSigPair.second << valSigPair.first;
QTest::newRow("int") << QVariant(1) << valSigPair.second << valSigPair.first;
QTest::newRow("uint") << QVariant(2U) << valSigPair.second << valSigPair.first;
QTest::newRow("int64") << QVariant(Q_INT64_C(3)) << valSigPair.second << valSigPair.first;
@@ -1299,32 +1299,32 @@ void tst_QDBusMarshall::demarshallStrings_data()
// to check released functionality is maintained even after checks have
// been added to string demarshalling
QTest::newRow("empty string->invalid objectpath") << QVariant("")
- << 'o' << qVariantFromValue(QDBusObjectPath());
+ << 'o' << QVariant::fromValue(QDBusObjectPath());
QTest::newRow("null string->invalid objectpath") << QVariant(QString())
- << 'o' << qVariantFromValue(QDBusObjectPath());
+ << 'o' << QVariant::fromValue(QDBusObjectPath());
QTest::newRow("string->invalid objectpath") << QVariant("invalid objectpath")
- << 'o' << qVariantFromValue(QDBusObjectPath());
+ << 'o' << QVariant::fromValue(QDBusObjectPath());
QTest::newRow("string->valid objectpath") << QVariant("/org/kde")
- << 'o' << qVariantFromValue(QDBusObjectPath("/org/kde"));
+ << 'o' << QVariant::fromValue(QDBusObjectPath("/org/kde"));
QTest::newRow("empty string->invalid signature") << QVariant("")
- << 'g' << qVariantFromValue(QDBusSignature());
+ << 'g' << QVariant::fromValue(QDBusSignature());
QTest::newRow("null string->invalid signature") << QVariant(QString())
- << 'g' << qVariantFromValue(QDBusSignature());
+ << 'g' << QVariant::fromValue(QDBusSignature());
QTest::newRow("string->invalid signature") << QVariant("_invalid signature")
- << 'g' << qVariantFromValue(QDBusSignature());
+ << 'g' << QVariant::fromValue(QDBusSignature());
QTest::newRow("string->valid signature") << QVariant("s")
- << 'g' << qVariantFromValue(QDBusSignature("s"));
+ << 'g' << QVariant::fromValue(QDBusSignature("s"));
- QTest::newRow("objectpath->string") << qVariantFromValue(QDBusObjectPath("/org/kde"))
- << 's' << qVariantFromValue(QString("/org/kde"));
- QTest::newRow("objectpath->invalid signature") << qVariantFromValue(QDBusObjectPath("/org/kde"))
- << 'g' << qVariantFromValue(QDBusSignature());
+ QTest::newRow("objectpath->string") << QVariant::fromValue(QDBusObjectPath("/org/kde"))
+ << 's' << QVariant::fromValue(QString("/org/kde"));
+ QTest::newRow("objectpath->invalid signature") << QVariant::fromValue(QDBusObjectPath("/org/kde"))
+ << 'g' << QVariant::fromValue(QDBusSignature());
- QTest::newRow("signature->string") << qVariantFromValue(QDBusSignature("s"))
- << 's' << qVariantFromValue(QString("s"));
- QTest::newRow("signature->invalid objectpath") << qVariantFromValue(QDBusSignature("s"))
- << 'o' << qVariantFromValue(QDBusObjectPath());
+ QTest::newRow("signature->string") << QVariant::fromValue(QDBusSignature("s"))
+ << 's' << QVariant::fromValue(QString("s"));
+ QTest::newRow("signature->invalid objectpath") << QVariant::fromValue(QDBusSignature("s"))
+ << 'o' << QVariant::fromValue(QDBusObjectPath());
}
QVariant demarshallAsString(const QDBusArgument& dbusArg, char targetSig)
@@ -1338,12 +1338,12 @@ QVariant demarshallAsString(const QDBusArgument& dbusArg, char targetSig)
case 'o': {
QDBusObjectPath op;
dbusArg >> op;
- return qVariantFromValue(op);
+ return QVariant::fromValue(op);
}
case 'g' : {
QDBusSignature sig;
dbusArg >> sig;
- return qVariantFromValue(sig);
+ return QVariant::fromValue(sig);
}
default: {
return QVariant();
@@ -1367,7 +1367,7 @@ void tst_QDBusMarshall::demarshallStrings()
sendArg.beginStructure();
sendArg.appendVariant(value);
sendArg.endStructure();
- msg.setArguments(QVariantList() << qVariantFromValue(sendArg));
+ msg.setArguments(QVariantList() << QVariant::fromValue(sendArg));
QDBusMessage reply = con.call(msg);
const QDBusArgument receiveArg = qvariant_cast<QDBusArgument>(reply.arguments().at(0));
@@ -1391,15 +1391,15 @@ void tst_QDBusMarshall::demarshallInvalidStringList_data()
// Arrays of non-string type should not demarshall to a string list
QList<bool> bools;
- QTest::newRow("emptyboollist") << qVariantFromValue(bools);
+ QTest::newRow("emptyboollist") << QVariant::fromValue(bools);
bools << false << true << false;
- QTest::newRow("boollist") << qVariantFromValue(bools);
+ QTest::newRow("boollist") << QVariant::fromValue(bools);
// Structures should not demarshall to a QByteArray
QTest::newRow("struct of strings")
- << qVariantFromValue(QVariantList() << QString("foo") << QString("bar"));
+ << QVariant::fromValue(QVariantList() << QString("foo") << QString("bar"));
QTest::newRow("struct of mixed types")
- << qVariantFromValue(QVariantList() << QString("foo") << int(42) << double(3.14));
+ << QVariant::fromValue(QVariantList() << QString("foo") << int(42) << double(3.14));
}
void tst_QDBusMarshall::demarshallInvalidStringList()
@@ -1416,7 +1416,7 @@ void tst_QDBusMarshall::demarshallInvalidStringList()
sendArg.beginStructure();
sendArg.appendVariant(value);
sendArg.endStructure();
- msg.setArguments(QVariantList() << qVariantFromValue(sendArg));
+ msg.setArguments(QVariantList() << QVariant::fromValue(sendArg));
QDBusMessage reply = con.call(msg);
const QDBusArgument receiveArg = qvariant_cast<QDBusArgument>(reply.arguments().at(0));
@@ -1440,16 +1440,16 @@ void tst_QDBusMarshall::demarshallInvalidByteArray_data()
// Arrays of other types than byte should not demarshall to a QByteArray
QList<bool> bools;
- QTest::newRow("empty array of bool") << qVariantFromValue(bools);
+ QTest::newRow("empty array of bool") << QVariant::fromValue(bools);
bools << true << false << true;
- QTest::newRow("non-empty array of bool") << qVariantFromValue(bools);
+ QTest::newRow("non-empty array of bool") << QVariant::fromValue(bools);
// Structures should not demarshall to a QByteArray
QTest::newRow("struct of bytes")
- << qVariantFromValue(QVariantList() << uchar(1) << uchar(2));
+ << QVariant::fromValue(QVariantList() << uchar(1) << uchar(2));
QTest::newRow("struct of mixed types")
- << qVariantFromValue(QVariantList() << int(42) << QString("foo") << double(3.14));
+ << QVariant::fromValue(QVariantList() << int(42) << QString("foo") << double(3.14));
}
void tst_QDBusMarshall::demarshallInvalidByteArray()
@@ -1466,7 +1466,7 @@ void tst_QDBusMarshall::demarshallInvalidByteArray()
sendArg.beginStructure();
sendArg.appendVariant(value);
sendArg.endStructure();
- msg.setArguments(QVariantList() << qVariantFromValue(sendArg));
+ msg.setArguments(QVariantList() << QVariant::fromValue(sendArg));
QDBusMessage reply = con.call(msg);
const QDBusArgument receiveArg = qvariant_cast<QDBusArgument>(reply.arguments().at(0));
diff --git a/tests/auto/gui/image/qimage/tst_qimage.cpp b/tests/auto/gui/image/qimage/tst_qimage.cpp
index c5c2b13b3e..65571f13c2 100644
--- a/tests/auto/gui/image/qimage/tst_qimage.cpp
+++ b/tests/auto/gui/image/qimage/tst_qimage.cpp
@@ -88,9 +88,7 @@ private slots:
void dotsPerMeterZero();
void convertToFormatPreserveDotsPrMeter();
-#ifndef QT_NO_IMAGE_TEXT
void convertToFormatPreserveText();
-#endif
void rotate_data();
void rotate();
@@ -1143,7 +1141,6 @@ void tst_QImage::convertToFormatPreserveDotsPrMeter()
QCOMPARE(img.dotsPerMeterY(), dpmy);
}
-#ifndef QT_NO_IMAGE_TEXT
void tst_QImage::convertToFormatPreserveText()
{
QImage img(100, 100, QImage::Format_ARGB32_Premultiplied);
@@ -1168,7 +1165,6 @@ void tst_QImage::convertToFormatPreserveText()
QCOMPARE(imgResult2.text(), result);
QCOMPARE(imgResult2.textKeys(), listResult);
}
-#endif // QT_NO_IMAGE_TEXT
void tst_QImage::setColorCount()
{
diff --git a/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp b/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp
index 876d69ea1c..12c90445cb 100644
--- a/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp
+++ b/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp
@@ -1487,7 +1487,8 @@ void tst_QImageReader::supportsOption_data()
<< (QIntList() << QImageIOHandler::Gamma
<< QImageIOHandler::Description
<< QImageIOHandler::Quality
- << QImageIOHandler::Size);
+ << QImageIOHandler::Size
+ << QImageIOHandler::ScaledSize);
}
void tst_QImageReader::supportsOption()
diff --git a/tests/auto/gui/image/qimagewriter/tst_qimagewriter.cpp b/tests/auto/gui/image/qimagewriter/tst_qimagewriter.cpp
index 827fa3606c..f28f84dc60 100644
--- a/tests/auto/gui/image/qimagewriter/tst_qimagewriter.cpp
+++ b/tests/auto/gui/image/qimagewriter/tst_qimagewriter.cpp
@@ -394,7 +394,8 @@ void tst_QImageWriter::supportsOption_data()
<< (QIntList() << QImageIOHandler::Gamma
<< QImageIOHandler::Description
<< QImageIOHandler::Quality
- << QImageIOHandler::Size);
+ << QImageIOHandler::Size
+ << QImageIOHandler::ScaledSize);
}
void tst_QImageWriter::supportsOption()
diff --git a/tests/auto/gui/kernel/kernel.pro b/tests/auto/gui/kernel/kernel.pro
index 0bd988b68c..8f191bd42d 100644
--- a/tests/auto/gui/kernel/kernel.pro
+++ b/tests/auto/gui/kernel/kernel.pro
@@ -7,6 +7,7 @@ SUBDIRS=\
qfileopenevent \
qguieventdispatcher \
qguimetatype \
+ qguitimer \
qguivariant \
qinputmethod \
qkeysequence \
diff --git a/tests/auto/gui/kernel/qbackingstore/qbackingstore.pro b/tests/auto/gui/kernel/qbackingstore/qbackingstore.pro
index cc0a2c69f7..211be4c1c0 100644
--- a/tests/auto/gui/kernel/qbackingstore/qbackingstore.pro
+++ b/tests/auto/gui/kernel/qbackingstore/qbackingstore.pro
@@ -4,6 +4,3 @@ TARGET = tst_qbackingstore
QT += core-private gui-private testlib
SOURCES += tst_qbackingstore.cpp
-
-mac: CONFIG += insignificant_test # QTBUG-23059
-win32: CONFIG += insignificant_test # QTBUG-24885
diff --git a/tests/auto/gui/kernel/qclipboard/test/test.pro b/tests/auto/gui/kernel/qclipboard/test/test.pro
index 4be6769592..d7a67ae3b6 100644
--- a/tests/auto/gui/kernel/qclipboard/test/test.pro
+++ b/tests/auto/gui/kernel/qclipboard/test/test.pro
@@ -15,8 +15,6 @@ wince* {
DEPLOYMENT += rsc reg_resource
}
-mac: CONFIG += insignificant_test # QTBUG-23057
-
load(testcase) # for target.path and installTestHelperApp()
installTestHelperApp("../copier/copier",copier,copier)
installTestHelperApp("../paster/paster",paster,paster)
diff --git a/tests/auto/gui/kernel/qclipboard/tst_qclipboard.cpp b/tests/auto/gui/kernel/qclipboard/tst_qclipboard.cpp
index 7f41f0651e..466764f81e 100644
--- a/tests/auto/gui/kernel/qclipboard/tst_qclipboard.cpp
+++ b/tests/auto/gui/kernel/qclipboard/tst_qclipboard.cpp
@@ -158,7 +158,7 @@ void tst_QClipboard::testSignals()
QCOMPARE(selectionChangedSpy.count(), 0);
QCOMPARE(changedSpy.count(), 1);
QCOMPARE(changedSpy.at(0).count(), 1);
- QCOMPARE(qVariantValue<QClipboard::Mode>(changedSpy.at(0).at(0)), QClipboard::Clipboard);
+ QCOMPARE(qvariant_cast<QClipboard::Mode>(changedSpy.at(0).at(0)), QClipboard::Clipboard);
changedSpy.clear();
@@ -168,7 +168,7 @@ void tst_QClipboard::testSignals()
QCOMPARE(selectionChangedSpy.count(), 1);
QCOMPARE(changedSpy.count(), 1);
QCOMPARE(changedSpy.at(0).count(), 1);
- QCOMPARE(qVariantValue<QClipboard::Mode>(changedSpy.at(0).at(0)), QClipboard::Selection);
+ QCOMPARE(qvariant_cast<QClipboard::Mode>(changedSpy.at(0).at(0)), QClipboard::Selection);
} else {
QCOMPARE(selectionChangedSpy.count(), 0);
}
@@ -183,7 +183,7 @@ void tst_QClipboard::testSignals()
QCOMPARE(searchChangedSpy.count(), 1);
QCOMPARE(changedSpy.count(), 1);
QCOMPARE(changedSpy.at(0).count(), 1);
- QCOMPARE(qVariantValue<QClipboard::Mode>(changedSpy.at(0).at(0)), QClipboard::FindBuffer);
+ QCOMPARE(qvariant_cast<QClipboard::Mode>(changedSpy.at(0).at(0)), QClipboard::FindBuffer);
} else {
QCOMPARE(searchChangedSpy.count(), 0);
}
diff --git a/tests/auto/gui/kernel/qguiapplication/qguiapplication.pro b/tests/auto/gui/kernel/qguiapplication/qguiapplication.pro
index 777e2c6b1a..fffa097d73 100644
--- a/tests/auto/gui/kernel/qguiapplication/qguiapplication.pro
+++ b/tests/auto/gui/kernel/qguiapplication/qguiapplication.pro
@@ -2,5 +2,3 @@ CONFIG += testcase
TARGET = tst_qguiapplication
QT += core gui testlib
SOURCES = tst_qguiapplication.cpp
-
-win32:CONFIG += insignificant_test # QTBUG-24186
diff --git a/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp b/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp
index c0242d95c5..29b65d1fd4 100644
--- a/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp
+++ b/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp
@@ -116,6 +116,9 @@ void tst_QGuiApplication::focusObject()
QTest::qWaitForWindowShown(&window2);
QTRY_COMPARE(app.focusWindow(), &window2);
QCOMPARE(app.focusObject(), &obj3);
+#ifdef Q_OS_WIN
+ QEXPECT_FAIL("", "QTBUG-24186", Abort);
+#endif
QCOMPARE(spy.count(), 1);
// focus change on unfocused window does not show
@@ -238,6 +241,9 @@ void tst_QGuiApplication::changeFocusWindow()
window2.requestActivateWindow();
QTRY_COMPARE(app.focusWindow(), &window2);
QCOMPARE(window1.windowDuringFocusAboutToChange, &window1);
+#ifdef Q_OS_WIN
+ QEXPECT_FAIL("", "QTBUG-24186", Abort);
+#endif
QCOMPARE(window1.windowDuringFocusOut, &window2);
}
diff --git a/tests/auto/gui/kernel/qguitimer/qguitimer.pro b/tests/auto/gui/kernel/qguitimer/qguitimer.pro
new file mode 100644
index 0000000000..8a71e48007
--- /dev/null
+++ b/tests/auto/gui/kernel/qguitimer/qguitimer.pro
@@ -0,0 +1,4 @@
+CONFIG += testcase
+TARGET = tst_qguitimer
+QT = core gui testlib
+SOURCES += ../../../corelib/kernel/qtimer/tst_qtimer.cpp
diff --git a/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp b/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp
index c4db74b6ec..588584545c 100644
--- a/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp
+++ b/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp
@@ -197,26 +197,26 @@ void tst_QKeySequence::operatorQString_data()
QTest::addColumn<int>("keycode");
QTest::addColumn<QString>("keystring");
- QTest::newRow( "No modifier" ) << 0 << int(Qt::Key_Aring | Qt::UNICODE_ACCEL) << QString( "\x0c5" );
+ QTest::newRow( "No modifier" ) << 0 << int(Qt::Key_Aring | Qt::UNICODE_ACCEL) << QString::fromLatin1( "\x0c5" );
#ifndef Q_OS_MAC
QTest::newRow( "Ctrl+Left" ) << int(Qt::CTRL) << int(Qt::Key_Left) << QString( "Ctrl+Left" );
QTest::newRow( "Ctrl+," ) << int(Qt::CTRL) << int(Qt::Key_Comma) << QString( "Ctrl+," );
QTest::newRow( "Alt+Left" ) << int(Qt::ALT) << int(Qt::Key_Left) << QString( "Alt+Left" );
QTest::newRow( "Alt+Shift+Left" ) << int(Qt::ALT | Qt::SHIFT) << int(Qt::Key_Left) << QString( "Alt+Shift+Left" );
- QTest::newRow( "Ctrl" ) << int(Qt::CTRL) << int(Qt::Key_Aring | Qt::UNICODE_ACCEL) << QString( "Ctrl+\x0c5" );
- QTest::newRow( "Alt" ) << int(Qt::ALT) << int(Qt::Key_Aring | Qt::UNICODE_ACCEL) << QString( "Alt+\x0c5" );
- QTest::newRow( "Shift" ) << int(Qt::SHIFT) << int(Qt::Key_Aring | Qt::UNICODE_ACCEL) << QString( "Shift+\x0c5" );
- QTest::newRow( "Meta" ) << int(Qt::META) << int(Qt::Key_Aring | Qt::UNICODE_ACCEL) << QString( "Meta+\x0c5" );
+ QTest::newRow( "Ctrl" ) << int(Qt::CTRL) << int(Qt::Key_Aring | Qt::UNICODE_ACCEL) << QString::fromLatin1( "Ctrl+\x0c5" );
+ QTest::newRow( "Alt" ) << int(Qt::ALT) << int(Qt::Key_Aring | Qt::UNICODE_ACCEL) << QString::fromLatin1( "Alt+\x0c5" );
+ QTest::newRow( "Shift" ) << int(Qt::SHIFT) << int(Qt::Key_Aring | Qt::UNICODE_ACCEL) << QString::fromLatin1( "Shift+\x0c5" );
+ QTest::newRow( "Meta" ) << int(Qt::META) << int(Qt::Key_Aring | Qt::UNICODE_ACCEL) << QString::fromLatin1( "Meta+\x0c5" );
#else
QTest::newRow( "Ctrl+Left" ) << int(Qt::CTRL) << int(Qt::Key_Left) << MacCtrl + macSymbolForQtKey(Qt::Key_Left);
QTest::newRow( "Ctrl+," ) << int(Qt::CTRL) << int(Qt::Key_Comma) << MacCtrl + ",";
QTest::newRow( "Alt+Left" ) << int(Qt::ALT) << int(Qt::Key_Left) << MacAlt + macSymbolForQtKey(Qt::Key_Left);
QTest::newRow( "Alt+Shift+Left" ) << int(Qt::ALT | Qt::SHIFT) << int(Qt::Key_Left) << MacAlt + MacShift + macSymbolForQtKey(Qt::Key_Left);
- QTest::newRow( "Ctrl" ) << int(Qt::CTRL) << int(Qt::Key_Aring | Qt::UNICODE_ACCEL) << MacCtrl + "\x0c5";
- QTest::newRow( "Alt" ) << int(Qt::ALT) << int(Qt::Key_Aring | Qt::UNICODE_ACCEL) << MacAlt + "\x0c5";
- QTest::newRow( "Shift" ) << int(Qt::SHIFT) << int(Qt::Key_Aring | Qt::UNICODE_ACCEL) << MacShift + "\x0c5";
- QTest::newRow( "Meta" ) << int(Qt::META) << int(Qt::Key_Aring | Qt::UNICODE_ACCEL) << MacMeta + "\x0c5";
+ QTest::newRow( "Ctrl" ) << int(Qt::CTRL) << int(Qt::Key_Aring | Qt::UNICODE_ACCEL) << MacCtrl + QLatin1String("\x0c5");
+ QTest::newRow( "Alt" ) << int(Qt::ALT) << int(Qt::Key_Aring | Qt::UNICODE_ACCEL) << MacAlt + QLatin1String("\x0c5");
+ QTest::newRow( "Shift" ) << int(Qt::SHIFT) << int(Qt::Key_Aring | Qt::UNICODE_ACCEL) << MacShift + QLatin1String("\x0c5");
+ QTest::newRow( "Meta" ) << int(Qt::META) << int(Qt::Key_Aring | Qt::UNICODE_ACCEL) << MacMeta + QLatin1String("\x0c5");
#endif
}
@@ -448,10 +448,10 @@ void tst_QKeySequence::toString_data()
QTest::newRow("Ctrl+Left") << QString("Ctrl+Left") << QString("Ctrl+Left") << QString("Ctrl+Left");
QTest::newRow("Alt+Left") << QString("Alt+Left") << QString("Alt+Left") << QString("Alt+Left");
QTest::newRow("Alt+Shift+Left") << QString("Alt+Shift+Left") << QString("Alt+Shift+Left") << QString("Alt+Shift+Left");
- QTest::newRow("Ctrl") << QString("Ctrl+\x0c5") << QString("Ctrl+\x0c5") << QString("Ctrl+\x0c5");
- QTest::newRow("Alt") << QString("Alt+\x0c5") << QString("Alt+\x0c5") << QString("Alt+\x0c5");
- QTest::newRow("Shift") << QString("Shift+\x0c5") << QString("Shift+\x0c5") << QString("Shift+\x0c5");
- QTest::newRow("Meta") << QString("Meta+\x0c5") << QString("Meta+\x0c5") << QString("Meta+\x0c5");
+ QTest::newRow("Ctrl") << QString::fromLatin1("Ctrl+\x0c5") << QString::fromLatin1("Ctrl+\x0c5") << QString::fromLatin1("Ctrl+\x0c5");
+ QTest::newRow("Alt") << QString::fromLatin1("Alt+\x0c5") << QString::fromLatin1("Alt+\x0c5") << QString::fromLatin1("Alt+\x0c5");
+ QTest::newRow("Shift") << QString::fromLatin1("Shift+\x0c5") << QString::fromLatin1("Shift+\x0c5") << QString::fromLatin1("Shift+\x0c5");
+ QTest::newRow("Meta") << QString::fromLatin1("Meta+\x0c5") << QString::fromLatin1("Meta+\x0c5") << QString::fromLatin1("Meta+\x0c5");
QTest::newRow("Ctrl+Plus") << QString("Ctrl++") << QString("Ctrl++") << QString("Ctrl++");
QTest::newRow("Ctrl+,") << QString("Ctrl+,") << QString("Ctrl+,") << QString("Ctrl+,");
QTest::newRow("Ctrl+,,Ctrl+,") << QString("Ctrl+,,Ctrl+,") << QString("Ctrl+,, Ctrl+,") << QString("Ctrl+,, Ctrl+,");
@@ -467,10 +467,10 @@ void tst_QKeySequence::toString_data()
<< MacAlt + MacShift + macSymbolForQtKey(Qt::Key_Left);
*/
QTest::newRow("Ctrl+Right,Left") << MacCtrl + "Right, Left" << QString("Ctrl+Right, Left") << MacCtrl + macSymbolForQtKey(Qt::Key_Right) + QString(", ") + macSymbolForQtKey(Qt::Key_Left);
- QTest::newRow("Ctrl") << MacCtrl + "\x0c5" << QString("Ctrl+\x0c5") << MacCtrl + "\x0c5";
- QTest::newRow("Alt") << MacAlt + "\x0c5" << QString("Alt+\x0c5") << MacAlt + "\x0c5";
- QTest::newRow("Shift") << MacShift + "\x0c5" << QString("Shift+\x0c5") << MacShift + "\x0c5";
- QTest::newRow("Meta") << MacMeta + "\x0c5" << QString("Meta+\x0c5") << MacMeta + "\x0c5";
+ QTest::newRow("Ctrl") << MacCtrl + QLatin1String("\x0c5") << QString::fromLatin1("Ctrl+\x0c5") << MacCtrl + QLatin1String("\x0c5");
+ QTest::newRow("Alt") << MacAlt + QLatin1String("\x0c5") << QString::fromLatin1("Alt+\x0c5") << MacAlt + QLatin1String("\x0c5");
+ QTest::newRow("Shift") << MacShift + QLatin1String("\x0c5") << QString::fromLatin1("Shift+\x0c5") << MacShift + QLatin1String("\x0c5");
+ QTest::newRow("Meta") << MacMeta + QLatin1String("\x0c5") << QString::fromLatin1("Meta+\x0c5") << MacMeta + QLatin1String("\x0c5");
QTest::newRow("Ctrl+Plus") << MacCtrl + "+" << QString("Ctrl++") << MacCtrl + "+";
QTest::newRow("Ctrl+,") << MacCtrl + "," << QString("Ctrl+,") << MacCtrl + ",";
QTest::newRow("Ctrl+,,Ctrl+,") << MacCtrl + ",, " + MacCtrl + "," << QString("Ctrl+,, Ctrl+,") << MacCtrl + ",, " + MacCtrl + ",";
diff --git a/tests/auto/gui/kernel/qwindow/qwindow.pro b/tests/auto/gui/kernel/qwindow/qwindow.pro
index fb8132afab..363f7dd92e 100644
--- a/tests/auto/gui/kernel/qwindow/qwindow.pro
+++ b/tests/auto/gui/kernel/qwindow/qwindow.pro
@@ -6,5 +6,4 @@ QT += core-private gui-private testlib
SOURCES += tst_qwindow.cpp
mac: CONFIG += insignificant_test # QTBUG-23059
-win32: CONFIG += insignificant_test # QTBUG-24904
diff --git a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
index 3dc2886b80..ae5bf55b72 100644
--- a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
+++ b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
@@ -70,6 +70,7 @@ private slots:
void activateAndClose();
void mouseEventSequence();
void windowModality();
+ void inputReentrancy();
void initTestCase()
{
@@ -141,11 +142,14 @@ private:
void tst_QWindow::eventOrderOnShow()
{
- QRect geometry(80, 80, 40, 40);
+ // Some platforms enforce minimum widths for windows, which can cause extra resize
+ // events, so set the width to suitably large value to avoid those.
+ QRect geometry(80, 80, 300, 40);
Window window;
window.setGeometry(geometry);
window.show();
+ QCoreApplication::processEvents();
QTRY_COMPARE(window.received(QEvent::Show), 1);
QTRY_COMPARE(window.received(QEvent::Resize), 1);
@@ -157,12 +161,15 @@ void tst_QWindow::eventOrderOnShow()
void tst_QWindow::positioning()
{
- QRect geometry(80, 80, 40, 40);
+ // Some platforms enforce minimum widths for windows, which can cause extra resize
+ // events, so set the width to suitably large value to avoid those.
+ QRect geometry(80, 80, 300, 40);
Window window;
window.setGeometry(geometry);
QCOMPARE(window.geometry(), geometry);
window.show();
+ QCoreApplication::processEvents();
QTRY_COMPARE(window.received(QEvent::Resize), 1);
QTRY_VERIFY(window.received(QEvent::Expose) > 0);
@@ -176,12 +183,11 @@ void tst_QWindow::positioning()
QPoint originalFramePos = window.framePos();
window.setWindowState(Qt::WindowFullScreen);
-#ifdef Q_OS_WIN
- QEXPECT_FAIL("", "QTBUG-24904 - Too many resize events on setting window state", Continue);
-#endif
+ QCoreApplication::processEvents();
QTRY_COMPARE(window.received(QEvent::Resize), 2);
window.setWindowState(Qt::WindowNoState);
+ QCoreApplication::processEvents();
QTRY_COMPARE(window.received(QEvent::Resize), 3);
QTRY_COMPARE(originalPos, window.pos());
@@ -218,12 +224,14 @@ void tst_QWindow::isExposed()
window.setGeometry(geometry);
QCOMPARE(window.geometry(), geometry);
window.show();
+ QCoreApplication::processEvents();
QTRY_VERIFY(window.received(QEvent::Expose) > 0);
QTRY_VERIFY(window.isExposed());
window.hide();
+ QCoreApplication::processEvents();
#ifdef Q_OS_MAC
QEXPECT_FAIL("", "This test fails on Mac OS X, see QTBUG-23059", Abort);
#endif
@@ -235,8 +243,11 @@ void tst_QWindow::isExposed()
void tst_QWindow::isActive()
{
Window window;
- window.setGeometry(80, 80, 40, 40);
+ // Some platforms enforce minimum widths for windows, which can cause extra resize
+ // events, so set the width to suitably large value to avoid those.
+ window.setGeometry(80, 80, 300, 40);
window.show();
+ QCoreApplication::processEvents();
QTRY_VERIFY(window.isExposed());
QTRY_COMPARE(window.received(QEvent::Resize), 1);
@@ -256,6 +267,7 @@ void tst_QWindow::isActive()
QVERIFY(child.isActive());
// parent shouldn't receive new resize events from child being shown
+ QCoreApplication::processEvents();
QTRY_COMPARE(window.received(QEvent::Resize), 1);
QTRY_COMPARE(window.received(QEvent::FocusIn), 1);
QTRY_COMPARE(window.received(QEvent::FocusOut), 1);
@@ -266,12 +278,13 @@ void tst_QWindow::isActive()
Window dialog;
dialog.setTransientParent(&window);
- dialog.setGeometry(110, 110, 30, 30);
+ dialog.setGeometry(110, 110, 300, 30);
dialog.show();
dialog.requestActivateWindow();
QTRY_VERIFY(dialog.isExposed());
+ QCoreApplication::processEvents();
QTRY_COMPARE(dialog.received(QEvent::Resize), 1);
QTRY_VERIFY(QGuiApplication::focusWindow() == &dialog);
QVERIFY(dialog.isActive());
@@ -285,6 +298,7 @@ void tst_QWindow::isActive()
window.requestActivateWindow();
QTRY_VERIFY(QGuiApplication::focusWindow() == &window);
+ QCoreApplication::processEvents();
QTRY_COMPARE(dialog.received(QEvent::FocusOut), 1);
QTRY_COMPARE(window.received(QEvent::FocusIn), 2);
@@ -314,6 +328,8 @@ public:
mouseSequenceSignature += 'p';
mousePressButton = event->button();
mousePressScreenPos = event->screenPos();
+ if (spinLoopWhenPressed)
+ QCoreApplication::processEvents();
}
}
void mouseReleaseEvent(QMouseEvent *event) {
@@ -329,6 +345,7 @@ public:
if (ignoreMouse) {
event->ignore();
} else {
+ ++mouseMovedCount;
mouseMoveButton = event->button();
mouseMoveScreenPos = event->screenPos();
}
@@ -352,6 +369,8 @@ public:
switch (points.at(i).state()) {
case Qt::TouchPointPressed:
++touchPressedCount;
+ if (spinLoopWhenPressed)
+ QCoreApplication::processEvents();
break;
case Qt::TouchPointReleased:
++touchReleasedCount;
@@ -365,7 +384,7 @@ public:
}
}
void resetCounters() {
- mousePressedCount = mouseReleasedCount = mouseDoubleClickedCount = 0;
+ mousePressedCount = mouseReleasedCount = mouseMovedCount = mouseDoubleClickedCount = 0;
mouseSequenceSignature = QString();
touchPressedCount = touchReleasedCount = touchMovedCount = 0;
}
@@ -374,18 +393,21 @@ public:
keyPressCode = keyReleaseCode = 0;
mousePressButton = mouseReleaseButton = mouseMoveButton = 0;
ignoreMouse = ignoreTouch = false;
+ spinLoopWhenPressed = false;
resetCounters();
}
int keyPressCode, keyReleaseCode;
int mousePressButton, mouseReleaseButton, mouseMoveButton;
- int mousePressedCount, mouseReleasedCount, mouseDoubleClickedCount;
+ int mousePressedCount, mouseReleasedCount, mouseMovedCount, mouseDoubleClickedCount;
QString mouseSequenceSignature;
QPointF mousePressScreenPos, mouseMoveScreenPos;
int touchPressedCount, touchReleasedCount, touchMovedCount;
QEvent::Type touchEventType;
bool ignoreMouse, ignoreTouch;
+
+ bool spinLoopWhenPressed;
};
void tst_QWindow::testInputEvents()
@@ -839,5 +861,49 @@ void tst_QWindow::windowModality()
QCOMPARE(spy.count(), 3);
}
+void tst_QWindow::inputReentrancy()
+{
+ InputTestWindow window;
+ window.spinLoopWhenPressed = true;
+
+ window.setGeometry(80, 80, 40, 40);
+ window.show();
+ QTest::qWaitForWindowShown(&window);
+
+ // Queue three events.
+ QPointF local(12, 34);
+ QWindowSystemInterface::handleMouseEvent(&window, local, local, Qt::LeftButton);
+ local += QPointF(2, 2);
+ QWindowSystemInterface::handleMouseEvent(&window, local, local, Qt::LeftButton);
+ QWindowSystemInterface::handleMouseEvent(&window, local, local, Qt::NoButton);
+ // Process them. However, the event handler for the press will also call
+ // processEvents() so the move and release will be delivered before returning
+ // from mousePressEvent(). The point is that no events should get lost.
+ QCoreApplication::processEvents();
+ QCOMPARE(window.mousePressButton, int(Qt::LeftButton));
+ QCOMPARE(window.mouseReleaseButton, int(Qt::LeftButton));
+ QCOMPARE(window.mousePressedCount, 1);
+ QCOMPARE(window.mouseMovedCount, 1);
+ QCOMPARE(window.mouseReleasedCount, 1);
+
+ // Now the same for touch.
+ QList<QWindowSystemInterface::TouchPoint> points;
+ QWindowSystemInterface::TouchPoint tp1;
+ tp1.id = 1;
+ tp1.state = Qt::TouchPointPressed;
+ tp1.area = QRectF(10, 10, 4, 4);
+ points << tp1;
+ QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
+ points[0].state = Qt::TouchPointMoved;
+ points[0].area = QRectF(20, 20, 8, 8);
+ QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
+ points[0].state = Qt::TouchPointReleased;
+ QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
+ QCoreApplication::processEvents();
+ QCOMPARE(window.touchPressedCount, 1);
+ QCOMPARE(window.touchMovedCount, 1);
+ QCOMPARE(window.touchReleasedCount, 1);
+}
+
#include <tst_qwindow.moc>
QTEST_MAIN(tst_QWindow)
diff --git a/tests/auto/gui/math3d/qmatrixnxn/tst_qmatrixnxn.cpp b/tests/auto/gui/math3d/qmatrixnxn/tst_qmatrixnxn.cpp
index 698470ac60..c89d10a543 100644
--- a/tests/auto/gui/math3d/qmatrixnxn/tst_qmatrixnxn.cpp
+++ b/tests/auto/gui/math3d/qmatrixnxn/tst_qmatrixnxn.cpp
@@ -3358,13 +3358,13 @@ void tst_QMatrixNxN::properties()
QMatrix4x4 m1(uniqueValues4);
obj.setMatrix(m1);
- QMatrix4x4 m2 = qVariantValue<QMatrix4x4>(obj.property("matrix"));
+ QMatrix4x4 m2 = qvariant_cast<QMatrix4x4>(obj.property("matrix"));
QVERIFY(isSame(m2, uniqueValues4));
QMatrix4x4 m3(transposedValues4);
- obj.setProperty("matrix", qVariantFromValue(m3));
+ obj.setProperty("matrix", QVariant::fromValue(m3));
- m2 = qVariantValue<QMatrix4x4>(obj.property("matrix"));
+ m2 = qvariant_cast<QMatrix4x4>(obj.property("matrix"));
QVERIFY(isSame(m2, transposedValues4));
}
diff --git a/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp b/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp
index 1690afcac4..a4e1f940fc 100644
--- a/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp
+++ b/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp
@@ -855,16 +855,16 @@ void tst_QQuaternion::properties()
obj.setQuaternion(QQuaternion(6.0f, 7.0f, 8.0f, 9.0f));
- QQuaternion q = qVariantValue<QQuaternion>(obj.property("quaternion"));
+ QQuaternion q = qvariant_cast<QQuaternion>(obj.property("quaternion"));
QCOMPARE(q.scalar(), (qreal)6.0f);
QCOMPARE(q.x(), (qreal)7.0f);
QCOMPARE(q.y(), (qreal)8.0f);
QCOMPARE(q.z(), (qreal)9.0f);
obj.setProperty("quaternion",
- qVariantFromValue(QQuaternion(-6.0f, -7.0f, -8.0f, -9.0f)));
+ QVariant::fromValue(QQuaternion(-6.0f, -7.0f, -8.0f, -9.0f)));
- q = qVariantValue<QQuaternion>(obj.property("quaternion"));
+ q = qvariant_cast<QQuaternion>(obj.property("quaternion"));
QCOMPARE(q.scalar(), (qreal)-6.0f);
QCOMPARE(q.x(), (qreal)-7.0f);
QCOMPARE(q.y(), (qreal)-8.0f);
diff --git a/tests/auto/gui/math3d/qvectornd/tst_qvectornd.cpp b/tests/auto/gui/math3d/qvectornd/tst_qvectornd.cpp
index 067773074e..72a4ecef97 100644
--- a/tests/auto/gui/math3d/qvectornd/tst_qvectornd.cpp
+++ b/tests/auto/gui/math3d/qvectornd/tst_qvectornd.cpp
@@ -2077,38 +2077,38 @@ void tst_QVectorND::properties()
obj.setVector3D(QVector3D(3.0f, 4.0f, 5.0f));
obj.setVector4D(QVector4D(6.0f, 7.0f, 8.0f, 9.0f));
- QVector2D v2 = qVariantValue<QVector2D>(obj.property("vector2D"));
+ QVector2D v2 = qvariant_cast<QVector2D>(obj.property("vector2D"));
QCOMPARE(v2.x(), (qreal)1.0f);
QCOMPARE(v2.y(), (qreal)2.0f);
- QVector3D v3 = qVariantValue<QVector3D>(obj.property("vector3D"));
+ QVector3D v3 = qvariant_cast<QVector3D>(obj.property("vector3D"));
QCOMPARE(v3.x(), (qreal)3.0f);
QCOMPARE(v3.y(), (qreal)4.0f);
QCOMPARE(v3.z(), (qreal)5.0f);
- QVector4D v4 = qVariantValue<QVector4D>(obj.property("vector4D"));
+ QVector4D v4 = qvariant_cast<QVector4D>(obj.property("vector4D"));
QCOMPARE(v4.x(), (qreal)6.0f);
QCOMPARE(v4.y(), (qreal)7.0f);
QCOMPARE(v4.z(), (qreal)8.0f);
QCOMPARE(v4.w(), (qreal)9.0f);
obj.setProperty("vector2D",
- qVariantFromValue(QVector2D(-1.0f, -2.0f)));
+ QVariant::fromValue(QVector2D(-1.0f, -2.0f)));
obj.setProperty("vector3D",
- qVariantFromValue(QVector3D(-3.0f, -4.0f, -5.0f)));
+ QVariant::fromValue(QVector3D(-3.0f, -4.0f, -5.0f)));
obj.setProperty("vector4D",
- qVariantFromValue(QVector4D(-6.0f, -7.0f, -8.0f, -9.0f)));
+ QVariant::fromValue(QVector4D(-6.0f, -7.0f, -8.0f, -9.0f)));
- v2 = qVariantValue<QVector2D>(obj.property("vector2D"));
+ v2 = qvariant_cast<QVector2D>(obj.property("vector2D"));
QCOMPARE(v2.x(), (qreal)-1.0f);
QCOMPARE(v2.y(), (qreal)-2.0f);
- v3 = qVariantValue<QVector3D>(obj.property("vector3D"));
+ v3 = qvariant_cast<QVector3D>(obj.property("vector3D"));
QCOMPARE(v3.x(), (qreal)-3.0f);
QCOMPARE(v3.y(), (qreal)-4.0f);
QCOMPARE(v3.z(), (qreal)-5.0f);
- v4 = qVariantValue<QVector4D>(obj.property("vector4D"));
+ v4 = qvariant_cast<QVector4D>(obj.property("vector4D"));
QCOMPARE(v4.x(), (qreal)-6.0f);
QCOMPARE(v4.y(), (qreal)-7.0f);
QCOMPARE(v4.z(), (qreal)-8.0f);
diff --git a/tests/auto/gui/qopengl/qopengl.pro b/tests/auto/gui/qopengl/qopengl.pro
index d0af96df37..ee1b1e39bc 100644
--- a/tests/auto/gui/qopengl/qopengl.pro
+++ b/tests/auto/gui/qopengl/qopengl.pro
@@ -8,5 +8,4 @@ QT += gui gui-private core-private testlib
SOURCES += tst_qopengl.cpp
-mac: CONFIG += insignificant_test # QTBUG-23061
win32:CONFIG += insignificant_test # QTBUG-24192
diff --git a/tests/auto/gui/text/qfontdatabase/qfontdatabase.pro b/tests/auto/gui/text/qfontdatabase/qfontdatabase.pro
index c853aaa100..8be6fe22d1 100644
--- a/tests/auto/gui/text/qfontdatabase/qfontdatabase.pro
+++ b/tests/auto/gui/text/qfontdatabase/qfontdatabase.pro
@@ -9,5 +9,3 @@ wince* {
additionalFiles.path = .
DEPLOYMENT += additionalFiles
}
-
-mac: CONFIG += insignificant_test # QTBUG-23062
diff --git a/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp b/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp
index 7a1cc53c57..9510b9719a 100644
--- a/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp
+++ b/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp
@@ -265,7 +265,10 @@ void tst_QFontDatabase::addAppFont()
QVERIFY(QFontDatabase::removeApplicationFont(id));
QCOMPARE(fontDbChangedSpy.count(), 2);
- QVERIFY(db.families() == oldFamilies);
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("font file", "QTBUG-23062", Continue);
+#endif
+ QCOMPARE(db.families(), oldFamilies);
}
QTEST_MAIN(tst_QFontDatabase)
diff --git a/tests/auto/gui/text/qfontmetrics/tst_qfontmetrics.cpp b/tests/auto/gui/text/qfontmetrics/tst_qfontmetrics.cpp
index 4dbdf9a4f1..8144696e8e 100644
--- a/tests/auto/gui/text/qfontmetrics/tst_qfontmetrics.cpp
+++ b/tests/auto/gui/text/qfontmetrics/tst_qfontmetrics.cpp
@@ -233,7 +233,7 @@ void tst_QFontMetrics::bypassShaping()
template<class FontMetrics> void elidedMultiLength_helper()
{
- QString text1 = "Long Text 1\x9cShorter\x9csmall";
+ QString text1 = QLatin1String("Long Text 1\x9cShorter\x9csmall");
QString text1_long = "Long Text 1";
QString text1_short = "Shorter";
QString text1_small = "small";
diff --git a/tests/auto/gui/text/qrawfont/qrawfont.pro b/tests/auto/gui/text/qrawfont/qrawfont.pro
index 8cac4abc57..149ad6442e 100644
--- a/tests/auto/gui/text/qrawfont/qrawfont.pro
+++ b/tests/auto/gui/text/qrawfont/qrawfont.pro
@@ -9,5 +9,3 @@ SOURCES += \
INCLUDEPATH += $$QT_SOURCE_TREE/src/3rdparty/harfbuzz/src
TESTDATA += testfont_bold_italic.ttf testfont.ttf
-
-win32:CONFIG += insignificant_test # QTBUG-24197
diff --git a/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp b/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp
index 99e53f3261..a3fe7b5368 100644
--- a/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp
+++ b/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp
@@ -295,6 +295,15 @@ void tst_QRawFont::advances()
bool supportsSubPixelPositions = font_d->fontEngine->supportsSubPixelPositions();
QVector<QPointF> advances = font.advancesForGlyphIndexes(glyphIndices);
for (int i=0; i<glyphIndices.size(); ++i) {
+#ifdef Q_OS_WIN
+ // In Windows, freetype engine returns advance of 9 when full hinting is used (default) for
+ // some of the glyphs.
+ if (font_d->fontEngine->type() == QFontEngine::Freetype
+ && (hintingPreference == QFont::PreferFullHinting || hintingPreference == QFont::PreferDefaultHinting)
+ && (i == 0 || i == 5)) {
+ QEXPECT_FAIL("", "Advance for some glyphs is not the expected with Windows Freetype engine (9 instead of 8)", Continue);
+ }
+#endif
QVERIFY(qFuzzyCompare(qRound(advances.at(i).x()), 8.0));
if (supportsSubPixelPositions)
QVERIFY(advances.at(i).x() > 8.0);
@@ -879,7 +888,7 @@ void tst_QRawFont::multipleRawFontsFromData()
testFontBoldItalic.loadFromData(file.readAll(), 11, QFont::PreferDefaultHinting);
QVERIFY(testFont.familyName() != (testFontBoldItalic.familyName())
- || testFont.styleName() != (testFontBoldItalic.styleName()));
+ || testFont.style() != (testFontBoldItalic.style()));
}
#endif // QT_NO_RAWFONT
diff --git a/tests/auto/gui/text/qstatictext/qstatictext.pro b/tests/auto/gui/text/qstatictext/qstatictext.pro
index 67f2e047a4..9abc3245ed 100644
--- a/tests/auto/gui/text/qstatictext/qstatictext.pro
+++ b/tests/auto/gui/text/qstatictext/qstatictext.pro
@@ -3,5 +3,3 @@ TARGET = tst_qstatictext
QT += testlib
QT += core core-private gui gui-private
SOURCES += tst_qstatictext.cpp
-
-mac: CONFIG += insignificant_test # QTBUG-23063
diff --git a/tests/auto/gui/text/qtextlayout/qtextlayout.pro b/tests/auto/gui/text/qtextlayout/qtextlayout.pro
index f35239bc6a..7addbe88dc 100644
--- a/tests/auto/gui/text/qtextlayout/qtextlayout.pro
+++ b/tests/auto/gui/text/qtextlayout/qtextlayout.pro
@@ -5,3 +5,5 @@ HEADERS +=
SOURCES += tst_qtextlayout.cpp
DEFINES += QT_COMPILES_IN_HARFBUZZ
INCLUDEPATH += $$QT_SOURCE_TREE/src/3rdparty/harfbuzz/src
+
+mac:CONFIG+=insignificant_test # QTBUG-23050
diff --git a/tests/auto/gui/text/qtextscriptengine/qtextscriptengine.pro b/tests/auto/gui/text/qtextscriptengine/qtextscriptengine.pro
index 516fa67f11..6dcb1b44a0 100644
--- a/tests/auto/gui/text/qtextscriptengine/qtextscriptengine.pro
+++ b/tests/auto/gui/text/qtextscriptengine/qtextscriptengine.pro
@@ -6,5 +6,3 @@ QT += core-private gui-private testlib
HEADERS +=
SOURCES += tst_qtextscriptengine.cpp
INCLUDEPATH += $$QT_SOURCE_TREE/src/3rdparty/harfbuzz/src
-
-mac: CONFIG += insignificant_test # QTBUG-23064
diff --git a/tests/auto/gui/text/qtextscriptengine/tst_qtextscriptengine.cpp b/tests/auto/gui/text/qtextscriptengine/tst_qtextscriptengine.cpp
index d566f0a20d..5a53f09e77 100644
--- a/tests/auto/gui/text/qtextscriptengine/tst_qtextscriptengine.cpp
+++ b/tests/auto/gui/text/qtextscriptengine/tst_qtextscriptengine.cpp
@@ -1173,11 +1173,12 @@ void tst_QTextScriptEngine::combiningMarks_qtbug15675()
QFont font("Monaco");
QTextLayout layout(s, font);
- QTextEngine *e = layout.d;
+ QTextEngine *e = layout.engine();
e->itemize();
e->shape(0);
QVERIFY(e->layoutData->items[0].num_glyphs == 4);
+ QEXPECT_FAIL("", "QTBUG-23064", Abort);
QVERIFY(e->layoutData->glyphLayout.advances_y[2] > 0);
#elif defined(Q_WS_X11)
QFontDatabase db;
@@ -1317,6 +1318,9 @@ void tst_QTextScriptEngine::thaiWithZWJ()
QCOMPARE(logClusters[i], ushort(i));
for (int i = 0; i < 10; i++)
QCOMPARE(logClusters[i+7], ushort(0));
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("", "QTBUG-23064", Abort);
+#endif
QCOMPARE(logClusters[17], ushort(1));
// The only characters that we should be hiding are the ZWJ and ZWNJ characters in position 1
diff --git a/tests/auto/gui/text/text.pro b/tests/auto/gui/text/text.pro
index c24fe7553d..5055ab61a3 100644
--- a/tests/auto/gui/text/text.pro
+++ b/tests/auto/gui/text/text.pro
@@ -31,7 +31,3 @@ win32:SUBDIRS -= qtextpiecetable
qstatictext \
qtextlayout \
qtextpiecetable \
-
-mac {
- qtextlayout.CONFIG = no_check_target # QTBUG-23050
-}
diff --git a/tests/auto/network/access/qnetworkcookie/tst_qnetworkcookie.cpp b/tests/auto/network/access/qnetworkcookie/tst_qnetworkcookie.cpp
index bcd9cbdff7..4df1084eac 100644
--- a/tests/auto/network/access/qnetworkcookie/tst_qnetworkcookie.cpp
+++ b/tests/auto/network/access/qnetworkcookie/tst_qnetworkcookie.cpp
@@ -238,7 +238,7 @@ void tst_QNetworkCookie::parseSingleCookie_data()
QTest::newRow("path-with-quotes2") << "a=b; path = \"/with\\\"Quotes\"" << cookie;
cookie.setPath(QString::fromUtf8("/R\303\251sum\303\251"));
- QTest::newRow("path-with-utf8") << "a=b;path=/R\303\251sum\303\251" << cookie;
+ QTest::newRow("path-with-utf8") << QString::fromUtf8("a=b;path=/R\303\251sum\303\251") << cookie;
QTest::newRow("path-with-utf8-2") << "a=b;path=/R%C3%A9sum%C3%A9" << cookie;
cookie.setPath(QString());
@@ -256,9 +256,9 @@ void tst_QNetworkCookie::parseSingleCookie_data()
cookie.setDomain(QString::fromUtf8(".d\303\270gn\303\245pent.troll.no"));
QTest::newRow("idn-domain1") << "a=b;domain=.xn--dgnpent-gxa2o.troll.no" << cookie;
- QTest::newRow("idn-domain2") << "a=b;domain=.d\303\270gn\303\245pent.troll.no" << cookie;
+ QTest::newRow("idn-domain2") << QString::fromUtf8("a=b;domain=.d\303\270gn\303\245pent.troll.no") << cookie;
QTest::newRow("idn-domain3") << "a=b;domain=.XN--DGNPENT-GXA2O.TROLL.NO" << cookie;
- QTest::newRow("idn-domain4") << "a=b;domain=.D\303\230GN\303\205PENT.troll.NO" << cookie;
+ QTest::newRow("idn-domain4") << QString::fromUtf8("a=b;domain=.D\303\230GN\303\205PENT.troll.NO") << cookie;
cookie.setDomain(".qt.nokia.com");
cookie.setPath("/");
@@ -595,7 +595,7 @@ void tst_QNetworkCookie::parseSingleCookie()
QFETCH(QString, cookieString);
QFETCH(QNetworkCookie, expectedCookie);
- QList<QNetworkCookie> result = QNetworkCookie::parseCookies(cookieString.toLatin1());
+ QList<QNetworkCookie> result = QNetworkCookie::parseCookies(cookieString.toUtf8());
//QEXPECT_FAIL("network2", "QDateTime parsing problem: the date is beyond year 8000", Abort);
QCOMPARE(result.count(), 1);
@@ -723,7 +723,7 @@ void tst_QNetworkCookie::parseMultipleCookies()
QFETCH(QString, cookieString);
QFETCH(QList<QNetworkCookie>, expectedCookies);
- QList<QNetworkCookie> result = QNetworkCookie::parseCookies(cookieString.toLatin1());
+ QList<QNetworkCookie> result = QNetworkCookie::parseCookies(cookieString.toUtf8());
QEXPECT_FAIL("network1", "Apparently multiple cookies set in one request (and an invalid date)", Abort);
QCOMPARE(result, expectedCookies);
diff --git a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
index 2d784fcbbc..824f5fc507 100644
--- a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
@@ -405,6 +405,10 @@ private Q_SLOTS:
void backgroundRequest_data();
void backgroundRequest();
+ void backgroundRequestInterruption_data();
+ void backgroundRequestInterruption();
+ void backgroundRequestConnectInBackground_data();
+ void backgroundRequestConnectInBackground();
// NOTE: This test must be last!
void parentingRepliesToTheApp();
@@ -1402,6 +1406,11 @@ void tst_QNetworkReply::cleanup()
// clear cookies
cookieJar->setAllCookies(QList<QNetworkCookie>());
+
+ // disconnect manager signals
+ manager.disconnect(SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)));
+ manager.disconnect(SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)));
+ manager.disconnect(SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)));
}
void tst_QNetworkReply::stateChecking()
@@ -3812,9 +3821,13 @@ void tst_QNetworkReply::ioPutToFileFromSocket()
QFETCH(QByteArray, data);
SocketPair socketpair;
- socketpair.create();
- QVERIFY(socketpair.endPoints[0] && socketpair.endPoints[1]);
+ QTRY_VERIFY(socketpair.create()); //QTRY_VERIFY as a workaround for QTBUG-24451
+#ifdef Q_OS_WIN
+ //128k and 2M tests regularly fail. Assumed same characteristics as ioPostToHttpFromSocket
+ if (data.size() > 1000)
+ QSKIP("unstable on windows - QTBUG-25386");
+#endif
socketpair.endPoints[0]->write(data);
QNetworkReplyPtr reply(manager.put(QNetworkRequest(url), socketpair.endPoints[1]));
socketpair.endPoints[0]->close();
@@ -4100,9 +4113,13 @@ void tst_QNetworkReply::ioPostToHttpFromSocket()
QFETCH(QByteArray, data);
QFETCH(QUrl, url);
QFETCH(QNetworkProxy, proxy);
+#ifdef Q_OS_WIN
+ //QTBUG-25386 hits one of the 128k tests 50% of the time, one of the 4k tests rarely (but at least 1%)
+ if (data.size() > 1000)
+ QSKIP("unstable on windows - QTBUG-25386");
+#endif
SocketPair socketpair;
- socketpair.create();
- QVERIFY(socketpair.endPoints[0] && socketpair.endPoints[1]);
+ QTRY_VERIFY(socketpair.create()); //QTRY_VERIFY as a workaround for QTBUG-24451
socketpair.endPoints[0]->write(data);
@@ -4173,8 +4190,7 @@ void tst_QNetworkReply::ioPostToHttpFromSocketSynchronous()
QFETCH(QByteArray, data);
SocketPair socketpair;
- QVERIFY(socketpair.create());
- QVERIFY(socketpair.endPoints[0] && socketpair.endPoints[1]);
+ QTRY_VERIFY(socketpair.create()); //QTRY_VERIFY as a workaround for QTBUG-24451
socketpair.endPoints[0]->write(data);
socketpair.endPoints[0]->waitForBytesWritten(5000);
// ### for 4.8: make the socket pair unbuffered, to not read everything in one go in QNetworkReplyImplPrivate::setup()
@@ -4292,8 +4308,7 @@ void tst_QNetworkReply::ioPostToHttpNoBufferFlag()
QByteArray data = QByteArray("daaaaaaataaaaaaa");
// create a sequential QIODevice by feeding the data into a local TCP server
SocketPair socketpair;
- socketpair.create();
- QVERIFY(socketpair.endPoints[0] && socketpair.endPoints[1]);
+ QTRY_VERIFY(socketpair.create()); //QTRY_VERIFY as a workaround for QTBUG-24451
socketpair.endPoints[0]->write(data);
QUrl url = "http://" + QtNetworkSettings::serverName() + "/qtest/protected/cgi-bin/md5sum.cgi";
@@ -6811,25 +6826,45 @@ void tst_QNetworkReply::ftpAuthentication()
void tst_QNetworkReply::backgroundRequest_data()
{
+ QTest::addColumn<QUrl>("url");
QTest::addColumn<bool>("background");
QTest::addColumn<int>("policy");
QTest::addColumn<QNetworkReply::NetworkError>("error");
- QTest::newRow("fg, normal") << false << 0 << QNetworkReply::NoError;
- QTest::newRow("bg, normal") << true << 0 << QNetworkReply::NoError;
- QTest::newRow("fg, nobg") << false << (int)QNetworkSession::NoBackgroundTrafficPolicy << QNetworkReply::NoError;
- QTest::newRow("bg, nobg") << true << (int)QNetworkSession::NoBackgroundTrafficPolicy << QNetworkReply::BackgroundRequestNotAllowedError;
+ QUrl httpurl("http://" + QtNetworkSettings::serverName());
+ QUrl httpsurl("https://" + QtNetworkSettings::serverName());
+ QUrl ftpurl("ftp://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt");
+
+ QTest::newRow("http, fg, normal") << httpurl << false << (int)QNetworkSession::NoPolicy << QNetworkReply::NoError;
+ QTest::newRow("http, bg, normal") << httpurl << true << (int)QNetworkSession::NoPolicy << QNetworkReply::NoError;
+ QTest::newRow("http, fg, nobg") << httpurl << false << (int)QNetworkSession::NoBackgroundTrafficPolicy << QNetworkReply::NoError;
+ QTest::newRow("http, bg, nobg") << httpurl << true << (int)QNetworkSession::NoBackgroundTrafficPolicy << QNetworkReply::BackgroundRequestNotAllowedError;
+
+#ifndef QT_NO_SSL
+ QTest::newRow("https, fg, normal") << httpsurl << false << (int)QNetworkSession::NoPolicy << QNetworkReply::NoError;
+ QTest::newRow("https, bg, normal") << httpsurl << true << (int)QNetworkSession::NoPolicy << QNetworkReply::NoError;
+ QTest::newRow("https, fg, nobg") << httpsurl << false << (int)QNetworkSession::NoBackgroundTrafficPolicy << QNetworkReply::NoError;
+ QTest::newRow("https, bg, nobg") << httpsurl << true << (int)QNetworkSession::NoBackgroundTrafficPolicy << QNetworkReply::BackgroundRequestNotAllowedError;
+#endif
+
+ QTest::newRow("ftp, fg, normal") << ftpurl << false << (int)QNetworkSession::NoPolicy << QNetworkReply::NoError;
+ QTest::newRow("ftp, bg, normal") << ftpurl << true << (int)QNetworkSession::NoPolicy << QNetworkReply::NoError;
+ QTest::newRow("ftp, fg, nobg") << ftpurl << false << (int)QNetworkSession::NoBackgroundTrafficPolicy << QNetworkReply::NoError;
+ QTest::newRow("ftp, bg, nobg") << ftpurl << true << (int)QNetworkSession::NoBackgroundTrafficPolicy << QNetworkReply::BackgroundRequestNotAllowedError;
}
+//test purpose: background requests can't be started when not allowed
void tst_QNetworkReply::backgroundRequest()
{
#ifdef QT_BUILD_INTERNAL
+#ifndef QT_NO_BEARERMANAGEMENT
+ QFETCH(QUrl, url);
QFETCH(bool, background);
QFETCH(int, policy);
QFETCH(QNetworkReply::NetworkError, error);
- QNetworkRequest request(QUrl("http://" + QtNetworkSettings::serverName()));
+ QNetworkRequest request(url);
if (background)
request.setAttribute(QNetworkRequest::BackgroundRequestAttribute, QVariant::fromValue(true));
@@ -6837,6 +6872,11 @@ void tst_QNetworkReply::backgroundRequest()
//this preconstructs the session so we can change policies in advance
manager.setConfiguration(networkConfiguration);
+#ifndef QT_NO_SSL
+ connect(&manager, SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)),
+ SLOT(sslErrors(QNetworkReply*,QList<QSslError>)));
+#endif
+
const QWeakPointer<const QNetworkSession> session = QNetworkAccessManagerPrivate::getNetworkSession(&manager);
QVERIFY(session);
QNetworkSession::UsagePolicies original = session.data()->usagePolicies();
@@ -6851,6 +6891,138 @@ void tst_QNetworkReply::backgroundRequest()
QVERIFY(reply->isFinished());
QCOMPARE(reply->error(), error);
#endif
+#endif
+}
+
+void tst_QNetworkReply::backgroundRequestInterruption_data()
+{
+ QTest::addColumn<QUrl>("url");
+ QTest::addColumn<bool>("background");
+ QTest::addColumn<QNetworkReply::NetworkError>("error");
+
+ QUrl httpurl("http://" + QtNetworkSettings::serverName() + "/qtest/mediumfile");
+ QUrl httpsurl("https://" + QtNetworkSettings::serverName() + "/qtest/mediumfile");
+ QUrl ftpurl("ftp://" + QtNetworkSettings::serverName() + "/qtest/bigfile");
+
+ QTest::newRow("http, fg, nobg") << httpurl << false << QNetworkReply::NoError;
+ QTest::newRow("http, bg, nobg") << httpurl << true << QNetworkReply::BackgroundRequestNotAllowedError;
+
+#ifndef QT_NO_SSL
+ QTest::newRow("https, fg, nobg") << httpsurl << false << QNetworkReply::NoError;
+ QTest::newRow("https, bg, nobg") << httpsurl << true << QNetworkReply::BackgroundRequestNotAllowedError;
+#endif
+
+ QTest::newRow("ftp, fg, nobg") << ftpurl << false << QNetworkReply::NoError;
+ QTest::newRow("ftp, bg, nobg") << ftpurl << true << QNetworkReply::BackgroundRequestNotAllowedError;
+
+}
+
+//test purpose: background requests in progress are aborted when policy changes to disallow them
+void tst_QNetworkReply::backgroundRequestInterruption()
+{
+#ifdef QT_BUILD_INTERNAL
+#ifndef QT_NO_BEARERMANAGEMENT
+ QFETCH(QUrl, url);
+ QFETCH(bool, background);
+ QFETCH(QNetworkReply::NetworkError, error);
+
+ QNetworkRequest request(url);
+
+ if (background)
+ request.setAttribute(QNetworkRequest::BackgroundRequestAttribute, QVariant::fromValue(true));
+
+ //this preconstructs the session so we can change policies in advance
+ manager.setConfiguration(networkConfiguration);
+
+#ifndef QT_NO_SSL
+ connect(&manager, SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)),
+ SLOT(sslErrors(QNetworkReply*,QList<QSslError>)));
+#endif
+
+ const QWeakPointer<const QNetworkSession> session = QNetworkAccessManagerPrivate::getNetworkSession(&manager);
+ QVERIFY(session);
+ QNetworkSession::UsagePolicies original = session.data()->usagePolicies();
+ QNetworkSessionPrivate::setUsagePolicies(*const_cast<QNetworkSession *>(session.data()), QNetworkSession::NoPolicy);
+
+ request.setAttribute(QNetworkRequest::MaximumDownloadBufferSizeAttribute, 8192);
+ QNetworkReplyPtr reply(manager.get(request));
+ reply->setReadBufferSize(1024);
+
+ QSignalSpy spy(reply.data(), SIGNAL(readyRead()));
+ QTRY_VERIFY(spy.count() > 0);
+
+ QNetworkSessionPrivate::setUsagePolicies(*const_cast<QNetworkSession *>(session.data()), QNetworkSession::NoBackgroundTrafficPolicy);
+
+ QVERIFY(waitForFinish(reply) != Timeout);
+ if (session)
+ QNetworkSessionPrivate::setUsagePolicies(*const_cast<QNetworkSession *>(session.data()), original);
+
+ QVERIFY(reply->isFinished());
+ QCOMPARE(reply->error(), error);
+#endif
+#endif
+}
+
+void tst_QNetworkReply::backgroundRequestConnectInBackground_data()
+{
+ QTest::addColumn<QUrl>("url");
+ QTest::addColumn<bool>("background");
+
+ QUrl httpurl("http://" + QtNetworkSettings::serverName());
+ QUrl ftpurl("ftp://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt");
+
+ QTest::newRow("http, fg") << httpurl << false;
+ QTest::newRow("http, bg") << httpurl << true;
+
+ QTest::newRow("ftp, fg") << ftpurl << false;
+ QTest::newRow("ftp, bg") << ftpurl << true;
+}
+
+//test purpose: check that backgroundness is propagated to the network session
+void tst_QNetworkReply::backgroundRequestConnectInBackground()
+{
+#ifdef QT_BUILD_INTERNAL
+#ifndef QT_NO_BEARERMANAGEMENT
+ QFETCH(QUrl, url);
+ QFETCH(bool, background);
+
+ QNetworkRequest request(url);
+
+ if (background)
+ request.setAttribute(QNetworkRequest::BackgroundRequestAttribute, QVariant::fromValue(true));
+
+ QWeakPointer<const QNetworkSession> session = QNetworkAccessManagerPrivate::getNetworkSession(&manager);
+ //force QNAM to reopen the session.
+ if (session && session.data()->isOpen()) {
+ const_cast<QNetworkSession *>(session.data())->close();
+ QCoreApplication::processEvents(); //let signals propagate inside QNAM
+ }
+
+ //this preconstructs the session so we can change policies in advance
+ manager.setConfiguration(networkConfiguration);
+
+ session = QNetworkAccessManagerPrivate::getNetworkSession(&manager);
+ QVERIFY(session);
+ QNetworkSession::UsagePolicies original = session.data()->usagePolicies();
+ QNetworkSessionPrivate::setUsagePolicies(*const_cast<QNetworkSession *>(session.data()), QNetworkSession::NoPolicy);
+
+ QNetworkReplyPtr reply(manager.get(request));
+
+ QVERIFY(waitForFinish(reply) != Timeout);
+ session = QNetworkAccessManagerPrivate::getNetworkSession(&manager);
+ if (session) {
+ QVariant cib = session.data()->sessionProperty(QStringLiteral("ConnectInBackground"));
+ if (!cib.isValid())
+ QSKIP("inconclusive - ConnectInBackground session property not supported by the bearer plugin");
+ QCOMPARE(cib.toBool(), background);
+ QNetworkSessionPrivate::setUsagePolicies(*const_cast<QNetworkSession *>(session.data()), original);
+ } else {
+ QSKIP("inconclusive - network session has been destroyed");
+ }
+
+ QVERIFY(reply->isFinished());
+#endif
+#endif
}
// NOTE: This test must be last testcase in tst_qnetworkreply!
diff --git a/tests/auto/network/access/qnetworkrequest/tst_qnetworkrequest.cpp b/tests/auto/network/access/qnetworkrequest/tst_qnetworkrequest.cpp
index 928dc48125..25764aacce 100644
--- a/tests/auto/network/access/qnetworkrequest/tst_qnetworkrequest.cpp
+++ b/tests/auto/network/access/qnetworkrequest/tst_qnetworkrequest.cpp
@@ -282,21 +282,21 @@ void tst_QNetworkRequest::setHeader_data()
cookie.setName("a");
cookie.setValue("b");
QTest::newRow("Cookie-1") << QNetworkRequest::CookieHeader
- << qVariantFromValue(QList<QNetworkCookie>() << cookie)
+ << QVariant::fromValue(QList<QNetworkCookie>() << cookie)
<< true << "Cookie"
<< "a=b";
QTest::newRow("SetCookie-1") << QNetworkRequest::SetCookieHeader
- << qVariantFromValue(QList<QNetworkCookie>() << cookie)
+ << QVariant::fromValue(QList<QNetworkCookie>() << cookie)
<< true << "Set-Cookie"
<< "a=b";
cookie.setPath("/");
QTest::newRow("Cookie-2") << QNetworkRequest::CookieHeader
- << qVariantFromValue(QList<QNetworkCookie>() << cookie)
+ << QVariant::fromValue(QList<QNetworkCookie>() << cookie)
<< true << "Cookie"
<< "a=b";
QTest::newRow("SetCookie-2") << QNetworkRequest::SetCookieHeader
- << qVariantFromValue(QList<QNetworkCookie>() << cookie)
+ << QVariant::fromValue(QList<QNetworkCookie>() << cookie)
<< true << "Set-Cookie"
<< "a=b; path=/";
@@ -304,11 +304,11 @@ void tst_QNetworkRequest::setHeader_data()
cookie2.setName("c");
cookie2.setValue("d");
QTest::newRow("Cookie-3") << QNetworkRequest::CookieHeader
- << qVariantFromValue(QList<QNetworkCookie>() << cookie << cookie2)
+ << QVariant::fromValue(QList<QNetworkCookie>() << cookie << cookie2)
<< true << "Cookie"
<< "a=b; c=d";
QTest::newRow("SetCookie-3") << QNetworkRequest::SetCookieHeader
- << qVariantFromValue(QList<QNetworkCookie>() << cookie << cookie2)
+ << QVariant::fromValue(QList<QNetworkCookie>() << cookie << cookie2)
<< true << "Set-Cookie"
<< "a=b; path=/, c=d";
}
@@ -388,17 +388,17 @@ void tst_QNetworkRequest::rawHeaderParsing_data()
cookie.setName("a");
cookie.setValue("b");
QTest::newRow("Cookie-1") << QNetworkRequest::CookieHeader
- << qVariantFromValue(QList<QNetworkCookie>() << cookie)
+ << QVariant::fromValue(QList<QNetworkCookie>() << cookie)
<< true << "Cookie"
<< "a=b";
QTest::newRow("SetCookie-1") << QNetworkRequest::SetCookieHeader
- << qVariantFromValue(QList<QNetworkCookie>() << cookie)
+ << QVariant::fromValue(QList<QNetworkCookie>() << cookie)
<< true << "Set-Cookie"
<< "a=b";
cookie.setPath("/");
QTest::newRow("SetCookie-2") << QNetworkRequest::SetCookieHeader
- << qVariantFromValue(QList<QNetworkCookie>() << cookie)
+ << QVariant::fromValue(QList<QNetworkCookie>() << cookie)
<< true << "Set-Cookie"
<< "a=b; path=/";
@@ -407,12 +407,12 @@ void tst_QNetworkRequest::rawHeaderParsing_data()
cookie2.setName("c");
cookie2.setValue("d");
QTest::newRow("Cookie-3") << QNetworkRequest::CookieHeader
- << qVariantFromValue(QList<QNetworkCookie>() << cookie << cookie2)
+ << QVariant::fromValue(QList<QNetworkCookie>() << cookie << cookie2)
<< true << "Cookie"
<< "a=b; c=d";
cookie.setPath("/");
QTest::newRow("SetCookie-3") << QNetworkRequest::SetCookieHeader
- << qVariantFromValue(QList<QNetworkCookie>() << cookie << cookie2)
+ << QVariant::fromValue(QList<QNetworkCookie>() << cookie << cookie2)
<< true << "Set-Cookie"
<< "a=b; path=/, c=d";
}
diff --git a/tests/auto/network/kernel/kernel.pro b/tests/auto/network/kernel/kernel.pro
index 32ba8b41b7..14080a0548 100644
--- a/tests/auto/network/kernel/kernel.pro
+++ b/tests/auto/network/kernel/kernel.pro
@@ -3,7 +3,7 @@ SUBDIRS=\
qdnslookup \
qdnslookup_appless \
qhostinfo \
-# qnetworkproxyfactory \ # Uses a hardcoded proxy configuration
+ qnetworkproxyfactory \
qauthenticator \
qnetworkproxy \
qnetworkinterface \
diff --git a/tests/auto/network/kernel/qdnslookup/tst_qdnslookup.cpp b/tests/auto/network/kernel/qdnslookup/tst_qdnslookup.cpp
index c1400b82af..b4ef1b803b 100644
--- a/tests/auto/network/kernel/qdnslookup/tst_qdnslookup.cpp
+++ b/tests/auto/network/kernel/qdnslookup/tst_qdnslookup.cpp
@@ -97,8 +97,10 @@ void tst_QDnsLookup::lookup_data()
QTest::newRow("mx-empty") << int(QDnsLookup::MX) << "" << int(QDnsLookup::InvalidRequestError) << "" << "" << "" << "" << "" << "" << QByteArray();
QTest::newRow("mx-notfound") << int(QDnsLookup::MX) << "invalid." << int(QDnsLookup::NotFoundError) << "" << "" << "" << "" << "" << "" << QByteArray();
QTest::newRow("mx-ascii") << int(QDnsLookup::MX) << "troll.no" << int(QDnsLookup::NoError) << "" << "" << "10 smtp.trolltech.com" << "" << "" << "" << QByteArray();
+#if 0
// FIXME: we need an IDN MX record in the troll.no domain
QTest::newRow("mx-idn") << int(QDnsLookup::MX) << QString::fromUtf8("råkat.se") << int(QDnsLookup::NoError) << "" << "" << "10 mail.cdr.se" << "" << "" << "" << QByteArray();
+#endif
QTest::newRow("ns-empty") << int(QDnsLookup::NS) << "" << int(QDnsLookup::InvalidRequestError) << "" << "" << "" << "" << "" << "" << QByteArray();
QTest::newRow("ns-notfound") << int(QDnsLookup::NS) << "invalid." << int(QDnsLookup::NotFoundError) << "" << "" << "" << "" << "" << "" << QByteArray();
@@ -111,8 +113,10 @@ void tst_QDnsLookup::lookup_data()
QTest::newRow("srv-empty") << int(QDnsLookup::SRV) << "" << int(QDnsLookup::InvalidRequestError) << "" << "" << "" << "" << "" << "" << QByteArray();
QTest::newRow("srv-notfound") << int(QDnsLookup::SRV) << "invalid." << int(QDnsLookup::NotFoundError) << "" << "" << "" << "" << "" << "" << QByteArray();
+#if 0
// FIXME: we need SRV records in the troll.no domain
QTest::newRow("srv-idn") << int(QDnsLookup::SRV) << QString::fromUtf8("_xmpp-client._tcp.råkat.se") << int(QDnsLookup::NoError) << "" << "" << "" << "" << "" << "5 0 5224 jabber.cdr.se" << QByteArray();
+#endif
QTest::newRow("txt-empty") << int(QDnsLookup::TXT) << "" << int(QDnsLookup::InvalidRequestError) << "" << "" << "" << "" << "" << "" << QByteArray();
QTest::newRow("txt-notfound") << int(QDnsLookup::TXT) << "invalid." << int(QDnsLookup::NotFoundError) << "" << "" << "" << "" << "" << "" << QByteArray();
diff --git a/tests/auto/network/kernel/qnetworkinterface/qnetworkinterface.pro b/tests/auto/network/kernel/qnetworkinterface/qnetworkinterface.pro
index ba401579a6..694dec2ed7 100644
--- a/tests/auto/network/kernel/qnetworkinterface/qnetworkinterface.pro
+++ b/tests/auto/network/kernel/qnetworkinterface/qnetworkinterface.pro
@@ -3,5 +3,3 @@ TARGET = tst_qnetworkinterface
SOURCES += tst_qnetworkinterface.cpp
QT = core network testlib
-
-win32:CONFIG+=insignificant_test # QTBUG-24451 - localAddress()
diff --git a/tests/auto/network/kernel/qnetworkproxyfactory/tst_qnetworkproxyfactory.cpp b/tests/auto/network/kernel/qnetworkproxyfactory/tst_qnetworkproxyfactory.cpp
index 9b7d21eff8..d8f5a0428f 100644
--- a/tests/auto/network/kernel/qnetworkproxyfactory/tst_qnetworkproxyfactory.cpp
+++ b/tests/auto/network/kernel/qnetworkproxyfactory/tst_qnetworkproxyfactory.cpp
@@ -133,6 +133,10 @@ void tst_QNetworkProxyFactory::systemProxyForQuery_data()
QTest::newRow("imap") << (int)QNetworkProxyQuery::TcpSocket << QUrl() << QString() << QString("qt-project.org") << 0 << (int)QNetworkProxy::TunnelingCapability;
QTest::newRow("autobind-server") << (int)QNetworkProxyQuery::TcpServer << QUrl() << QString() << QString() << 0 << (int)QNetworkProxy::ListeningCapability;
QTest::newRow("web-server") << (int)QNetworkProxyQuery::TcpServer << QUrl() << QString() << QString() << 80 << (int)QNetworkProxy::ListeningCapability;
+ //windows: these should be bypassed if "bypass proxy server for local addresses" is ticked
+ foreach (QHostAddress address, QNetworkInterface::allAddresses()) {
+ QTest::newRow(qPrintable(address.toString())) << (int)QNetworkProxyQuery::TcpSocket << QUrl() << QString() << address.toString() << 0 << 0;
+ }
//UDP
QTest::newRow("udp") << (int)QNetworkProxyQuery::UdpSocket << QUrl() << QString() << QString() << 0 << (int)QNetworkProxy::UdpTunnelingCapability;
diff --git a/tests/auto/network/network.pro b/tests/auto/network/network.pro
index 2048d14dc8..64262a8632 100644
--- a/tests/auto/network/network.pro
+++ b/tests/auto/network/network.pro
@@ -6,7 +6,5 @@ SUBDIRS=\
ssl \
socket \
-win32 {
- socket.CONFIG += no_check_target # QTBUG-24451 - all socket tests require waitForX
- bearer.CONFIG += no_check_target # QTBUG-24503 - these tests fail if machine has a WLAN adaptor
-}
+win32: socket.CONFIG += no_check_target # QTBUG-24451 - all socket tests require waitForX
+win32|mac:bearer.CONFIG += no_check_target # QTBUG-24503 - these tests fail if machine has a WLAN adaptor
diff --git a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp
index 2715bfc5dc..eeda46dfdc 100644
--- a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp
+++ b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp
@@ -383,7 +383,7 @@ void tst_QLocalSocket::listenAndConnect()
QVERIFY(socket->error() != QLocalSocket::UnknownSocketError);
QCOMPARE(socket->state(), QLocalSocket::UnconnectedState);
//QVERIFY(socket->socketDescriptor() == -1);
- QCOMPARE(qVariantValue<QLocalSocket::LocalSocketError>(spyError.first()[0]),
+ QCOMPARE(qvariant_cast<QLocalSocket::LocalSocketError>(spyError.first()[0]),
QLocalSocket::ServerNotFoundError);
}
@@ -403,19 +403,19 @@ void tst_QLocalSocket::listenAndConnect()
QVERIFY(spyError.count() >= 0);
if (canListen) {
if (spyError.count() > 0)
- QCOMPARE(qVariantValue<QLocalSocket::LocalSocketError>(spyError.first()[0]),
+ QCOMPARE(qvariant_cast<QLocalSocket::LocalSocketError>(spyError.first()[0]),
QLocalSocket::SocketTimeoutError);
} else {
- QCOMPARE(qVariantValue<QLocalSocket::LocalSocketError>(spyError.first()[0]),
+ QCOMPARE(qvariant_cast<QLocalSocket::LocalSocketError>(spyError.first()[0]),
QLocalSocket::ServerNotFoundError);
}
// Check first and last state
- QCOMPARE(qVariantValue<QLocalSocket::LocalSocketState>(spyStateChanged.first()[0]),
+ QCOMPARE(qvariant_cast<QLocalSocket::LocalSocketState>(spyStateChanged.first()[0]),
QLocalSocket::ConnectingState);
if (canListen)
- QCOMPARE(qVariantValue<QLocalSocket::LocalSocketState>(spyStateChanged.last()[0]),
+ QCOMPARE(qvariant_cast<QLocalSocket::LocalSocketState>(spyStateChanged.last()[0]),
QLocalSocket::ConnectedState);
QCOMPARE(spyStateChanged.count(), 2);
QCOMPARE(spyReadyRead.count(), 0);
@@ -1153,7 +1153,7 @@ void tst_QLocalSocket::verifyListenWithDescriptor_data()
QTest::addColumn<bool>("abstract");
QTest::addColumn<bool>("bound");
- QTest::newRow("normal") << QDir::tempPath() + QLatin1Literal("/testsocket") << false << true;
+ QTest::newRow("normal") << QDir::tempPath() + QLatin1String("/testsocket") << false << true;
#ifdef Q_OS_LINUX
QTest::newRow("absrtact") << QString::fromLatin1("abstractsocketname") << true << true;
QTest::newRow("abstractwithslash") << QString::fromLatin1("abstractsocketwitha/inthename") << true << true;
diff --git a/tests/auto/network/socket/qsocks5socketengine/qsocks5socketengine.pro b/tests/auto/network/socket/qsocks5socketengine/qsocks5socketengine.pro
index 9e37aec5ce..c9793952ce 100644
--- a/tests/auto/network/socket/qsocks5socketengine/qsocks5socketengine.pro
+++ b/tests/auto/network/socket/qsocks5socketengine/qsocks5socketengine.pro
@@ -10,6 +10,6 @@ MOC_DIR=tmp
QT = core-private network-private testlib
-linux-*:system(". /etc/lsb-release && [ $DISTRIB_CODENAME = oneiric ]"):CONFIG += insignificant_test # QTBUG-23380
+linux-*:system(". /etc/lsb-release && [ $DISTRIB_CODENAME = oneiric ]"):DEFINES+=UBUNTU_ONEIRIC # QTBUG-23380
requires(contains(QT_CONFIG,private_tests))
diff --git a/tests/auto/network/socket/qsocks5socketengine/tst_qsocks5socketengine.cpp b/tests/auto/network/socket/qsocks5socketengine/tst_qsocks5socketengine.cpp
index 0c0690babe..3cc1f32622 100644
--- a/tests/auto/network/socket/qsocks5socketengine/tst_qsocks5socketengine.cpp
+++ b/tests/auto/network/socket/qsocks5socketengine/tst_qsocks5socketengine.cpp
@@ -130,7 +130,7 @@ private slots:
{
QTcpSocket *client = nextPendingConnection();
connect(client, SIGNAL(readyRead()), SLOT(handleClientCommand()));
- client->setProperty("pendingResponses", qVariantFromValue(responses));
+ client->setProperty("pendingResponses", QVariant::fromValue(responses));
}
void handleClientCommand()
@@ -145,7 +145,7 @@ private slots:
client->disconnectFromHost();
else
client->write(pendingResponses.dequeue());
- client->setProperty("pendingResponses", qVariantFromValue(pendingResponses));
+ client->setProperty("pendingResponses", QVariant::fromValue(pendingResponses));
}
};
@@ -551,7 +551,16 @@ void tst_QSocks5SocketEngine::udpTest()
QVERIFY(udpSocket.state() == QAbstractSocket::UnconnectedState);
// Bind #1
+#if defined(UBUNTU_ONEIRIC) && defined(__x86_64__)
+ {
+ bool bindSuccessful = udpSocket.bind(QHostAddress("0.0.0.0"), 0);
+ if (!bindSuccessful)
+ QEXPECT_FAIL("", "QTBUG-23380: Fails on some Ubuntu 11.10 x64 configurations", Abort);
+ QVERIFY(bindSuccessful);
+ }
+#else
QVERIFY(udpSocket.bind(QHostAddress("0.0.0.0"), 0));
+#endif
QVERIFY(udpSocket.state() == QAbstractSocket::BoundState);
QVERIFY(udpSocket.localPort() != 0);
diff --git a/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp b/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp
index 3c7c3a3da0..13c5d961d7 100644
--- a/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp
+++ b/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp
@@ -2212,9 +2212,9 @@ void tst_QTcpSocket::connectionRefused()
QCOMPARE(socket->error(), QAbstractSocket::ConnectionRefusedError);
QCOMPARE(stateSpy.count(), 3);
- QCOMPARE(qVariantValue<QAbstractSocket::SocketState>(stateSpy.at(0).at(0)), QAbstractSocket::HostLookupState);
- QCOMPARE(qVariantValue<QAbstractSocket::SocketState>(stateSpy.at(1).at(0)), QAbstractSocket::ConnectingState);
- QCOMPARE(qVariantValue<QAbstractSocket::SocketState>(stateSpy.at(2).at(0)), QAbstractSocket::UnconnectedState);
+ QCOMPARE(qvariant_cast<QAbstractSocket::SocketState>(stateSpy.at(0).at(0)), QAbstractSocket::HostLookupState);
+ QCOMPARE(qvariant_cast<QAbstractSocket::SocketState>(stateSpy.at(1).at(0)), QAbstractSocket::ConnectingState);
+ QCOMPARE(qvariant_cast<QAbstractSocket::SocketState>(stateSpy.at(2).at(0)), QAbstractSocket::UnconnectedState);
QCOMPARE(errorSpy.count(), 1);
delete socket;
diff --git a/tests/auto/network/socket/qudpsocket/test/test.pro b/tests/auto/network/socket/qudpsocket/test/test.pro
index 6ff5dca813..48e076b2ab 100644
--- a/tests/auto/network/socket/qudpsocket/test/test.pro
+++ b/tests/auto/network/socket/qudpsocket/test/test.pro
@@ -22,4 +22,4 @@ wince* {
TARGET = tst_qudpsocket
-CONFIG+=insignificant_test
+CONFIG+=insignificant_test # QTBUG-25367, QTBUG-25368
diff --git a/tests/auto/network/ssl/qsslsocket/qsslsocket.pro b/tests/auto/network/ssl/qsslsocket/qsslsocket.pro
index bb04e0b9c4..c24fe22518 100644
--- a/tests/auto/network/ssl/qsslsocket/qsslsocket.pro
+++ b/tests/auto/network/ssl/qsslsocket/qsslsocket.pro
@@ -31,9 +31,6 @@ wince* {
DEFINES += SRCDIR=\\\"$$PWD/\\\"
}
-# QTBUG-23575
-linux-*:system(". /etc/lsb-release && [ $DISTRIB_CODENAME = oneiric ]"):DEFINES+=UBUNTU_ONEIRIC
+linux-*:system(". /etc/lsb-release && [ $DISTRIB_CODENAME = oneiric ]"):DEFINES+=UBUNTU_ONEIRIC # QTBUG-24234
requires(contains(QT_CONFIG,private_tests))
-
-win32:CONFIG += insignificant_test # QTBUG-24234
diff --git a/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp b/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp
index 23e87b7f3b..34bc361e4b 100644
--- a/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp
+++ b/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp
@@ -189,6 +189,8 @@ private slots:
void encryptWithoutConnecting();
void resume_data();
void resume();
+ void qtbug18498_peek();
+ void qtbug18498_peek2();
void setEmptyDefaultConfiguration(); // this test should be last
static void exitLoop()
@@ -1764,8 +1766,8 @@ void tst_QSslSocket::verifyMode()
loop.exec();
QVERIFY(clientSocket.isEncrypted());
-#if defined(UBUNTU_ONEIRIC) && defined(__x86_64__)
- QEXPECT_FAIL("", "QTBUG-23575 - Fails on this platform", Abort);
+#if (defined(UBUNTU_ONEIRIC) && defined(__x86_64__)) || defined(Q_OS_WIN) || defined(Q_OS_MAC)
+ QEXPECT_FAIL("", "QTBUG-24234", Abort);
#endif
QVERIFY(server.socket->sslErrors().isEmpty());
}
@@ -1791,8 +1793,8 @@ void tst_QSslSocket::peerVerifyError()
QVERIFY(!socket->waitForEncrypted(10000));
QVERIFY(!peerVerifyErrorSpy.isEmpty());
QVERIFY(!sslErrorsSpy.isEmpty());
- QCOMPARE(qVariantValue<QSslError>(peerVerifyErrorSpy.last().at(0)).error(), QSslError::HostNameMismatch);
- QCOMPARE(qVariantValue<QList<QSslError> >(sslErrorsSpy.at(0).at(0)).size(), peerVerifyErrorSpy.size());
+ QCOMPARE(qvariant_cast<QSslError>(peerVerifyErrorSpy.last().at(0)).error(), QSslError::HostNameMismatch);
+ QCOMPARE(qvariant_cast<QList<QSslError> >(sslErrorsSpy.at(0).at(0)).size(), peerVerifyErrorSpy.size());
}
void tst_QSslSocket::disconnectFromHostWhenConnecting()
@@ -2198,6 +2200,261 @@ void tst_QSslSocket::resume()
}
}
+class WebSocket : public QSslSocket
+{
+ Q_OBJECT
+public:
+ explicit WebSocket(qintptr socketDescriptor,
+ const QString &keyFile = SRCDIR "certs/fluke.key",
+ const QString &certFile = SRCDIR "certs/fluke.cert");
+
+protected slots:
+ void onReadyReadFirstBytes(void);
+
+private:
+ void _startServerEncryption(void);
+
+ QString m_keyFile;
+ QString m_certFile;
+
+private:
+ Q_DISABLE_COPY(WebSocket)
+};
+
+WebSocket::WebSocket (qintptr socketDescriptor, const QString &keyFile, const QString &certFile)
+ : m_keyFile(keyFile),
+ m_certFile(certFile)
+{
+ QVERIFY(setSocketDescriptor(socketDescriptor, QAbstractSocket::ConnectedState, QIODevice::ReadWrite | QIODevice::Unbuffered));
+ connect (this, SIGNAL(readyRead()), this, SLOT(onReadyReadFirstBytes()));
+}
+
+void WebSocket::_startServerEncryption (void)
+{
+ QFile file(m_keyFile);
+ QVERIFY(file.open(QIODevice::ReadOnly));
+ QSslKey key(file.readAll(), QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey);
+ QVERIFY(!key.isNull());
+ setPrivateKey(key);
+
+ QList<QSslCertificate> localCert = QSslCertificate::fromPath(m_certFile);
+ QVERIFY(!localCert.isEmpty());
+ QVERIFY(localCert.first().handle());
+ setLocalCertificate(localCert.first());
+
+ QVERIFY(!peerAddress().isNull());
+ QVERIFY(peerPort() != 0);
+ QVERIFY(!localAddress().isNull());
+ QVERIFY(localPort() != 0);
+
+ setProtocol(QSsl::AnyProtocol);
+ setPeerVerifyMode(QSslSocket::VerifyNone);
+ ignoreSslErrors();
+ startServerEncryption();
+}
+
+void WebSocket::onReadyReadFirstBytes (void)
+{
+ peek(1);
+ disconnect(this,SIGNAL(readyRead()), this, SLOT(onReadyReadFirstBytes()));
+ _startServerEncryption();
+}
+
+class SslServer4 : public QTcpServer
+{
+ Q_OBJECT
+public:
+ SslServer4() : socket(0) {}
+ WebSocket *socket;
+
+protected:
+ void incomingConnection(qintptr socketDescriptor)
+ {
+ socket = new WebSocket(socketDescriptor);
+ }
+};
+
+void tst_QSslSocket::qtbug18498_peek()
+{
+ QFETCH_GLOBAL(bool, setProxy);
+ if (setProxy)
+ return;
+
+ SslServer4 server;
+ QSslSocket *client = new QSslSocket(this);
+
+ QVERIFY(server.listen(QHostAddress::LocalHost));
+ client->connectToHost("127.0.0.1", server.serverPort());
+ QVERIFY(client->waitForConnected(5000));
+ QVERIFY(server.waitForNewConnection(1000));
+ client->setObjectName("client");
+ client->ignoreSslErrors();
+
+ connect(client, SIGNAL(encrypted()), this, SLOT(exitLoop()));
+ connect(client, SIGNAL(disconnected()), this, SLOT(exitLoop()));
+
+ client->startClientEncryption();
+ WebSocket *serversocket = server.socket;
+ QVERIFY(serversocket);
+ serversocket->setObjectName("server");
+
+ enterLoop(1);
+ QVERIFY(!timeout());
+ QVERIFY(serversocket->isEncrypted());
+ QVERIFY(client->isEncrypted());
+
+ QByteArray data("abc123");
+ client->write(data.data());
+
+ connect(serversocket, SIGNAL(readyRead()), this, SLOT(exitLoop()));
+ enterLoop(1);
+ QVERIFY(!timeout());
+
+ QByteArray peek1_data;
+ peek1_data.reserve(data.size());
+ QByteArray peek2_data;
+ QByteArray read_data;
+
+ int lngth = serversocket->peek(peek1_data.data(), 10);
+ peek1_data.resize(lngth);
+
+ peek2_data = serversocket->peek(10);
+ read_data = serversocket->readAll();
+
+ QCOMPARE(peek1_data, data);
+ QCOMPARE(peek2_data, data);
+ QCOMPARE(read_data, data);
+}
+
+class SslServer5 : public QTcpServer
+{
+ Q_OBJECT
+public:
+ SslServer5() : socket(0) {}
+ QSslSocket *socket;
+
+protected:
+ void incomingConnection(qintptr socketDescriptor)
+ {
+ socket = new QSslSocket;
+ socket->setSocketDescriptor(socketDescriptor);
+ }
+};
+
+void tst_QSslSocket::qtbug18498_peek2()
+{
+ QFETCH_GLOBAL(bool, setProxy);
+ if (setProxy)
+ return;
+
+ SslServer5 listener;
+ QVERIFY(listener.listen(QHostAddress::Any));
+ QScopedPointer<QSslSocket> client(new QSslSocket);
+ client->connectToHost(QHostAddress::LocalHost, listener.serverPort());
+ QVERIFY(client->waitForConnected(5000));
+ QVERIFY(listener.waitForNewConnection(1000));
+
+ QScopedPointer<QSslSocket> server(listener.socket);
+
+ QVERIFY(server->write("HELLO\r\n", 7));
+ QElapsedTimer stopwatch;
+ stopwatch.start();
+ while (client->bytesAvailable() < 7 && stopwatch.elapsed() < 5000)
+ QTest::qWait(100);
+ char c;
+ QVERIFY(client->peek(&c,1) == 1);
+ QCOMPARE(c, 'H');
+ QVERIFY(client->read(&c,1) == 1);
+ QCOMPARE(c, 'H');
+ QByteArray b = client->peek(2);
+ QCOMPARE(b, QByteArray("EL"));
+ char a[3];
+ QVERIFY(client->peek(a, 2) == 2);
+ QCOMPARE(a[0], 'E');
+ QCOMPARE(a[1], 'L');
+ QCOMPARE(client->readAll(), QByteArray("ELLO\r\n"));
+
+ //check data split between QIODevice and plain socket buffers.
+ QByteArray bigblock;
+ bigblock.fill('#', QIODEVICE_BUFFERSIZE + 1024);
+ QVERIFY(client->write(QByteArray("head")));
+ QVERIFY(client->write(bigblock));
+ while (server->bytesAvailable() < bigblock.length() + 4 && stopwatch.elapsed() < 5000)
+ QTest::qWait(100);
+ QCOMPARE(server->read(4), QByteArray("head"));
+ QCOMPARE(server->peek(bigblock.length()), bigblock);
+ b.reserve(bigblock.length());
+ b.resize(server->peek(b.data(), bigblock.length()));
+ QCOMPARE(b, bigblock);
+
+ //check oversized peek
+ QCOMPARE(server->peek(bigblock.length() * 3), bigblock);
+ b.reserve(bigblock.length() * 3);
+ b.resize(server->peek(b.data(), bigblock.length() * 3));
+ QCOMPARE(b, bigblock);
+
+ QCOMPARE(server->readAll(), bigblock);
+
+ QVERIFY(client->write("STARTTLS\r\n"));
+ stopwatch.start();
+ // ### Qt5 use QTRY_VERIFY
+ while (server->bytesAvailable() < 10 && stopwatch.elapsed() < 5000)
+ QTest::qWait(100);
+ QVERIFY(server->peek(&c,1) == 1);
+ QCOMPARE(c, 'S');
+ b = server->peek(3);
+ QCOMPARE(b, QByteArray("STA"));
+ QCOMPARE(server->read(5), QByteArray("START"));
+ QVERIFY(server->peek(a, 3) == 3);
+ QCOMPARE(a[0], 'T');
+ QCOMPARE(a[1], 'L');
+ QCOMPARE(a[2], 'S');
+ QCOMPARE(server->readAll(), QByteArray("TLS\r\n"));
+
+ QFile file(SRCDIR "certs/fluke.key");
+ QVERIFY(file.open(QIODevice::ReadOnly));
+ QSslKey key(file.readAll(), QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey);
+ QVERIFY(!key.isNull());
+ server->setPrivateKey(key);
+
+ QList<QSslCertificate> localCert = QSslCertificate::fromPath(SRCDIR "certs/fluke.cert");
+ QVERIFY(!localCert.isEmpty());
+ QVERIFY(localCert.first().handle());
+ server->setLocalCertificate(localCert.first());
+
+ server->setProtocol(QSsl::AnyProtocol);
+ server->setPeerVerifyMode(QSslSocket::VerifyNone);
+
+ server->ignoreSslErrors();
+ client->ignoreSslErrors();
+
+ server->startServerEncryption();
+ client->startClientEncryption();
+
+ QVERIFY(server->write("hello\r\n", 7));
+ stopwatch.start();
+ while (client->bytesAvailable() < 7 && stopwatch.elapsed() < 5000)
+ QTest::qWait(100);
+ QVERIFY(server->mode() == QSslSocket::SslServerMode && client->mode() == QSslSocket::SslClientMode);
+ QVERIFY(client->peek(&c,1) == 1);
+ QCOMPARE(c, 'h');
+ QVERIFY(client->read(&c,1) == 1);
+ QCOMPARE(c, 'h');
+ b = client->peek(2);
+ QCOMPARE(b, QByteArray("el"));
+ QCOMPARE(client->readAll(), QByteArray("ello\r\n"));
+
+ QVERIFY(client->write("goodbye\r\n"));
+ stopwatch.start();
+ while (server->bytesAvailable() < 9 && stopwatch.elapsed() < 5000)
+ QTest::qWait(100);
+ QVERIFY(server->peek(&c,1) == 1);
+ QCOMPARE(c, 'g');
+ QCOMPARE(server->readAll(), QByteArray("goodbye\r\n"));
+ client->disconnectFromHost();
+ QVERIFY(client->waitForDisconnected(5000));
+}
+
void tst_QSslSocket::setEmptyDefaultConfiguration() // this test should be last, as it has some side effects
{
// used to produce a crash in QSslConfigurationPrivate::deepCopyDefaultConfiguration, QTBUG-13265
diff --git a/tests/auto/network/ssl/qsslsocket_onDemandCertificates_member/qsslsocket_onDemandCertificates_member.pro b/tests/auto/network/ssl/qsslsocket_onDemandCertificates_member/qsslsocket_onDemandCertificates_member.pro
index 5aeb0e48ac..33b55b4638 100644
--- a/tests/auto/network/ssl/qsslsocket_onDemandCertificates_member/qsslsocket_onDemandCertificates_member.pro
+++ b/tests/auto/network/ssl/qsslsocket_onDemandCertificates_member/qsslsocket_onDemandCertificates_member.pro
@@ -22,5 +22,3 @@ wince* {
}
requires(contains(QT_CONFIG,private_tests))
-
-win32:CONFIG+=insignificant_test # QTBUG-24451 - all
diff --git a/tests/auto/network/ssl/qsslsocket_onDemandCertificates_static/qsslsocket_onDemandCertificates_static.pro b/tests/auto/network/ssl/qsslsocket_onDemandCertificates_static/qsslsocket_onDemandCertificates_static.pro
index 3955ea106c..8a500a3d99 100644
--- a/tests/auto/network/ssl/qsslsocket_onDemandCertificates_static/qsslsocket_onDemandCertificates_static.pro
+++ b/tests/auto/network/ssl/qsslsocket_onDemandCertificates_static/qsslsocket_onDemandCertificates_static.pro
@@ -22,5 +22,3 @@ wince* {
}
requires(contains(QT_CONFIG,private_tests))
-
-win32:CONFIG+=insignificant_test # QTBUG-24451 - all
diff --git a/tests/auto/opengl/qgl/qgl.pro b/tests/auto/opengl/qgl/qgl.pro
index db82d9a256..40da265417 100644
--- a/tests/auto/opengl/qgl/qgl.pro
+++ b/tests/auto/opengl/qgl/qgl.pro
@@ -10,4 +10,5 @@ QT += widgets widgets-private opengl-private gui-private core-private testlib
SOURCES += tst_qgl.cpp
RESOURCES = qgl.qrc
-CONFIG+=insignificant_test
+win32:CONFIG+=insignificant_test # QTBUG-25293
+linux-*:system(". /etc/lsb-release && [ $DISTRIB_CODENAME = lucid ]"): CONFIG+=insignificant_test # QTBUG-25293
diff --git a/tests/auto/opengl/qglthreads/qglthreads.pro b/tests/auto/opengl/qglthreads/qglthreads.pro
index 1534472ef6..9b8d9a5301 100644
--- a/tests/auto/opengl/qglthreads/qglthreads.pro
+++ b/tests/auto/opengl/qglthreads/qglthreads.pro
@@ -10,4 +10,4 @@ x11 {
LIBS += $$QMAKE_LIBS_X11
}
-CONFIG+=insignificant_test # QTBUG-22560
+win32|linux-*:CONFIG+=insignificant_test # QTBUG-22560
diff --git a/tests/auto/other/headersclean/headersclean.pri b/tests/auto/other/headersclean/headersclean.pri
index c95380e3b9..e81c000768 100644
--- a/tests/auto/other/headersclean/headersclean.pri
+++ b/tests/auto/other/headersclean/headersclean.pri
@@ -10,7 +10,7 @@
# The flags here come from http://wiki.qt-project.org/Coding_Conventions#Conventions_for_public_header_files
# -Wold-style-cast cannot be used, /usr/include/bits/byteswap.h defines the macro bswap_16 using C style casts :(
# -Wfloat-equal cannot be used, qrect.h and qvector2d.h do exact comparisons in isNull and operator==. Would need #pragmas.
-*-g++*: QMAKE_CXXFLAGS += -Woverloaded-virtual -Wshadow -Wundef
+*-g++*: QMAKE_CXXFLAGS += -Wshadow -Wundef
# Other nice flags
*-g++*: QMAKE_CXXFLAGS += -Wnon-virtual-dtor -ansi -Wcast-align -Wchar-subscripts -Wpointer-arith -Wformat-security
diff --git a/tests/auto/other/lancelot/lancelot.pro b/tests/auto/other/lancelot/lancelot.pro
index ced8aceb99..534452ed14 100644
--- a/tests/auto/other/lancelot/lancelot.pro
+++ b/tests/auto/other/lancelot/lancelot.pro
@@ -11,5 +11,3 @@ RESOURCES += images.qrc
include($$PWD/../../../baselineserver/shared/qbaselinetest.pri)
TESTDATA += scripts/*
-
-CONFIG += insignificant_test # QTBUG-21402
diff --git a/tests/auto/other/lancelot/paintcommands.cpp b/tests/auto/other/lancelot/paintcommands.cpp
index 969db62acb..4e45c75e4d 100644
--- a/tests/auto/other/lancelot/paintcommands.cpp
+++ b/tests/auto/other/lancelot/paintcommands.cpp
@@ -694,7 +694,7 @@ void PaintCommands::runCommand(const QString &scriptLine)
QString firstWord = scriptLine.section(QRegExp("\\s"), 0, 0);
QList<int> indices = s_commandHash.values(firstWord);
foreach(int idx, indices) {
- const PaintCommandInfos &command = s_commandInfoTable.at(idx);
+ PaintCommandInfos command = s_commandInfoTable.at(idx);
if (command.regExp.indexIn(scriptLine) >= 0) {
(this->*(command.paintMethod))(command.regExp);
return;
diff --git a/tests/auto/other/lancelot/tst_lancelot.cpp b/tests/auto/other/lancelot/tst_lancelot.cpp
index 4bb0bae243..897f238aa5 100644
--- a/tests/auto/other/lancelot/tst_lancelot.cpp
+++ b/tests/auto/other/lancelot/tst_lancelot.cpp
@@ -186,6 +186,9 @@ void tst_Lancelot::testOpenGL_data()
void tst_Lancelot::testOpenGL()
{
+#ifdef Q_OS_MAC
+ QSKIP("QTBUG-22792: This test function crashes on Mac OS X");
+#endif
bool ok = false;
QGLWidget glWidget;
if (glWidget.isValid() && glWidget.format().directRendering()
diff --git a/tests/auto/other/modeltest/modeltest.cpp b/tests/auto/other/modeltest/modeltest.cpp
index 876b6a1365..98f66000f6 100644
--- a/tests/auto/other/modeltest/modeltest.cpp
+++ b/tests/auto/other/modeltest/modeltest.cpp
@@ -414,27 +414,27 @@ void ModelTest::data()
// General Purpose roles that should return a QString
QVariant variant = model->data ( model->index ( 0, 0 ), Qt::ToolTipRole );
if ( variant.isValid() ) {
- QVERIFY( qVariantCanConvert<QString> ( variant ) );
+ QVERIFY( variant.canConvert<QString>() );
}
variant = model->data ( model->index ( 0, 0 ), Qt::StatusTipRole );
if ( variant.isValid() ) {
- QVERIFY( qVariantCanConvert<QString> ( variant ) );
+ QVERIFY( variant.canConvert<QString>() );
}
variant = model->data ( model->index ( 0, 0 ), Qt::WhatsThisRole );
if ( variant.isValid() ) {
- QVERIFY( qVariantCanConvert<QString> ( variant ) );
+ QVERIFY( variant.canConvert<QString>() );
}
// General Purpose roles that should return a QSize
variant = model->data ( model->index ( 0, 0 ), Qt::SizeHintRole );
if ( variant.isValid() ) {
- QVERIFY( qVariantCanConvert<QSize> ( variant ) );
+ QVERIFY( variant.canConvert<QSize>() );
}
// General Purpose roles that should return a QFont
QVariant fontVariant = model->data ( model->index ( 0, 0 ), Qt::FontRole );
if ( fontVariant.isValid() ) {
- QVERIFY( qVariantCanConvert<QFont> ( fontVariant ) );
+ QVERIFY( fontVariant.canConvert<QFont>() );
}
// Check that the alignment is one we know about
@@ -447,12 +447,12 @@ void ModelTest::data()
// General Purpose roles that should return a QColor
QVariant colorVariant = model->data ( model->index ( 0, 0 ), Qt::BackgroundColorRole );
if ( colorVariant.isValid() ) {
- QVERIFY( qVariantCanConvert<QColor> ( colorVariant ) );
+ QVERIFY( colorVariant.canConvert<QColor>() );
}
colorVariant = model->data ( model->index ( 0, 0 ), Qt::TextColorRole );
if ( colorVariant.isValid() ) {
- QVERIFY( qVariantCanConvert<QColor> ( colorVariant ) );
+ QVERIFY( colorVariant.canConvert<QColor>() );
}
// Check that the "check state" is one we know about.
diff --git a/tests/auto/other/other.pro b/tests/auto/other/other.pro
index 2a6dc1d662..8c86a95c59 100644
--- a/tests/auto/other/other.pro
+++ b/tests/auto/other/other.pro
@@ -5,7 +5,7 @@ SUBDIRS=\
collections \
compiler \
exceptionsafety \
- exceptionsafety_objects \
+ # exceptionsafety_objects \ # QObjectPrivate is not safe
gestures \
headersclean \
lancelot \
@@ -42,5 +42,3 @@ wince*|!contains(QT_CONFIG, accessibility):SUBDIRS -= qaccessibility
qdirectpainter
!linux*-g++*:SUBDIRS -= exceptionsafety_objects
-
-mac: lancelot.CONFIG = no_check_target # QTBUG-22792
diff --git a/tests/auto/other/qaccessibility/qaccessibility.pro b/tests/auto/other/qaccessibility/qaccessibility.pro
index 388e6ab29d..0c224ad0a8 100644
--- a/tests/auto/other/qaccessibility/qaccessibility.pro
+++ b/tests/auto/other/qaccessibility/qaccessibility.pro
@@ -12,8 +12,6 @@ wince*: {
DEPLOYMENT += accessneeded
}
-mac: CONFIG += insignificant_test # QTBUG-22812
-
win32 {
!*g++: include(../../../../src/3rdparty/iaccessible2/iaccessible2.pri)
LIBS += -loleacc -loleaut32 -lole32
diff --git a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
index 977013ab8c..ba1e73a99b 100644
--- a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
+++ b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
@@ -1747,6 +1747,9 @@ void tst_QAccessibility::mdiSubWindowTest()
const QRect widgetGeometry = testWindow->contentsRect();
const QPoint globalWidgetPos = QPoint(globalPos.x() + widgetGeometry.x(),
globalPos.y() + widgetGeometry.y());
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("", "QTBUG-22812", Abort);
+#endif
QCOMPARE(childRect(interface), QRect(globalWidgetPos, widgetGeometry.size()));
// childAt
diff --git a/tests/auto/other/qfocusevent/qfocusevent.pro b/tests/auto/other/qfocusevent/qfocusevent.pro
index ee2cf22a6a..5f799291c6 100644
--- a/tests/auto/other/qfocusevent/qfocusevent.pro
+++ b/tests/auto/other/qfocusevent/qfocusevent.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qfocusevent
QT += widgets testlib
SOURCES += tst_qfocusevent.cpp
-mac: CONFIG += insignificant_test # QTBUG-22815
diff --git a/tests/auto/other/qfocusevent/tst_qfocusevent.cpp b/tests/auto/other/qfocusevent/tst_qfocusevent.cpp
index 946003fc72..05a609c8a6 100644
--- a/tests/auto/other/qfocusevent/tst_qfocusevent.cpp
+++ b/tests/auto/other/qfocusevent/tst_qfocusevent.cpp
@@ -378,6 +378,9 @@ void tst_QFocusEvent::checkReason_ActiveWindow()
#if defined(Q_OS_IRIX)
QEXPECT_FAIL("", "IRIX requires explicit activateWindow(), so this test does not make any sense.", Abort);
#endif
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("", "QTBUG-22815", Abort);
+#endif
QTRY_VERIFY(childFocusWidgetOne->focusInEventRecieved);
QVERIFY(childFocusWidgetOne->focusInEventGotFocus);
diff --git a/tests/auto/printsupport/kernel/qprinter/qprinter.pro b/tests/auto/printsupport/kernel/qprinter/qprinter.pro
index ebf8edea32..d3abd1677a 100644
--- a/tests/auto/printsupport/kernel/qprinter/qprinter.pro
+++ b/tests/auto/printsupport/kernel/qprinter/qprinter.pro
@@ -3,4 +3,4 @@ TARGET = tst_qprinter
QT += printsupport widgets testlib
SOURCES += tst_qprinter.cpp
-mac*:CONFIG+=insignificant_test
+mac*:CONFIG+=insignificant_test # QTBUG-25292
diff --git a/tests/auto/printsupport/kernel/qprinterinfo/qprinterinfo.pro b/tests/auto/printsupport/kernel/qprinterinfo/qprinterinfo.pro
index b0e69dca2e..f397f48bb8 100644
--- a/tests/auto/printsupport/kernel/qprinterinfo/qprinterinfo.pro
+++ b/tests/auto/printsupport/kernel/qprinterinfo/qprinterinfo.pro
@@ -5,5 +5,3 @@ SOURCES += tst_qprinterinfo.cpp
QT += printsupport network testlib
DEFINES += QT_USE_USING_NAMESPACE
-
-mac: CONFIG += insignificant_test # QTBUG-23060
diff --git a/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp b/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp
index 626c5049f0..fb2db21743 100644
--- a/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp
+++ b/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp
@@ -2078,7 +2078,7 @@ void tst_QSqlDatabase::eventNotificationPSQL()
QCOMPARE(spy.count(), 1);
QList<QVariant> arguments = spy.takeFirst();
QCOMPARE(arguments.at(0).toString(), procedureName);
- QCOMPARE(qVariantValue<QSqlDriver::NotificationSource>(arguments.at(1)), QSqlDriver::SelfSource);
+ QCOMPARE(qvariant_cast<QSqlDriver::NotificationSource>(arguments.at(1)), QSqlDriver::SelfSource);
QCOMPARE(qvariant_cast<QVariant>(arguments.at(2)).toString(), payload);
QVERIFY_SQL(driver, unsubscribeFromNotification(procedureName));
}
diff --git a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
index 559afc4ef4..4a0eab0f83 100644
--- a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
+++ b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
@@ -211,6 +211,8 @@ private slots:
void QTBUG_5765();
void QTBUG_14132_data() { generic_data("QOCI"); }
void QTBUG_14132();
+ void QTBUG_18435_data() { generic_data("QODBC"); }
+ void QTBUG_18435();
void QTBUG_21884_data() { generic_data("QSQLITE"); }
void QTBUG_21884();
void QTBUG_16967_data() { generic_data("QSQLITE"); }
@@ -2801,9 +2803,9 @@ void tst_QSqlQuery::task_250026()
data258.fill( 'A', 258 );
data1026.fill( 'A', 1026 );
QVERIFY_SQL( q, prepare( "insert into " + tableName + "(longfield) VALUES (:longfield)" ) );
- q.bindValue( "longfield", data258 );
+ q.bindValue( ":longfield", data258 );
QVERIFY_SQL( q, exec() );
- q.bindValue( "longfield", data1026 );
+ q.bindValue( ":longfield", data1026 );
QVERIFY_SQL( q, exec() );
QVERIFY_SQL( q, exec( "select * from " + tableName ) );
QVERIFY_SQL( q, next() );
@@ -2999,7 +3001,7 @@ void tst_QSqlQuery::QTBUG_551()
q.bindValue(":outp", outLst, QSql::Out);
QVERIFY_SQL(q, execBatch(QSqlQuery::ValuesAsColumns) );
- res_outLst = qVariantValue<QVariantList>(q.boundValues()[":outp"]);
+ res_outLst = qvariant_cast<QVariantList>(q.boundValues()[":outp"]);
QCOMPARE(res_outLst[0].toString(), QLatin1String("1. Value is 0"));
QCOMPARE(res_outLst[1].toString(), QLatin1String("2. Value is 1"));
QCOMPARE(res_outLst[2].toString(), QLatin1String("3. Value is 2"));
@@ -3024,6 +3026,36 @@ void tst_QSqlQuery::QTBUG_14132()
QCOMPARE(q.boundValue(0).toString(), QLatin1String("OUTSTRING"));
}
+void tst_QSqlQuery::QTBUG_18435()
+{
+ QFETCH(QString, dbName);
+ QSqlDatabase db = QSqlDatabase::database(dbName);
+ CHECK_DATABASE(db);
+
+ if (!db.driverName().startsWith("QODBC") || !tst_Databases::isSqlServer(db))
+ return;
+
+ QSqlQuery q(db);
+ QString procName(qTableName("qtbug_18435_proc", __FILE__));
+
+ q.exec("DROP PROCEDURE " + procName);
+ const QString stmt =
+ "CREATE PROCEDURE " + procName + " @key nvarchar(50) OUTPUT AS\n"
+ "BEGIN\n"
+ " SET NOCOUNT ON\n"
+ " SET @key = 'TEST'\n"
+ "END\n";
+
+ QVERIFY_SQL(q, exec(stmt));
+ QVERIFY_SQL(q, prepare("{CALL "+ procName +"(?)}"));
+ const QString testStr = "0123";
+ q.bindValue(0, testStr, QSql::Out);
+ QVERIFY_SQL(q, exec());
+ QCOMPARE(q.boundValue(0).toString(), QLatin1String("TEST"));
+
+ QVERIFY_SQL(q, exec("DROP PROCEDURE " + procName));
+}
+
void tst_QSqlQuery::QTBUG_5251()
{
QFETCH( QString, dbName );
@@ -3494,7 +3526,10 @@ void tst_QSqlQuery::aggregateFunctionTypes()
// First test without any entries
QVERIFY_SQL(q, exec("SELECT SUM(id) FROM " + tableName));
QVERIFY(q.next());
- QCOMPARE(q.record().field(0).type(), QVariant::Invalid);
+ if (db.driverName().startsWith("QSQLITE"))
+ QCOMPARE(q.record().field(0).type(), QVariant::Invalid);
+ else
+ QCOMPARE(q.record().field(0).type(), QVariant::Int);
QVERIFY_SQL(q, exec("INSERT INTO " + tableName + " (id) VALUES (1)"));
QVERIFY_SQL(q, exec("INSERT INTO " + tableName + " (id) VALUES (2)"));
@@ -3506,8 +3541,13 @@ void tst_QSqlQuery::aggregateFunctionTypes()
QVERIFY_SQL(q, exec("SELECT AVG(id) FROM " + tableName));
QVERIFY(q.next());
- QCOMPARE(q.value(0).toDouble(), 1.5);
- QCOMPARE(q.record().field(0).type(), QVariant::Double);
+ if (db.driverName().startsWith("QSQLITE")) {
+ QCOMPARE(q.value(0).toDouble(), 1.5);
+ QCOMPARE(q.record().field(0).type(), QVariant::Double);
+ } else {
+ QCOMPARE(q.value(0).toInt(), 1);
+ QCOMPARE(q.record().field(0).type(), QVariant::Int);
+ }
QVERIFY_SQL(q, exec("SELECT COUNT(id) FROM " + tableName));
QVERIFY(q.next());
@@ -3529,12 +3569,15 @@ void tst_QSqlQuery::aggregateFunctionTypes()
tst_Databases::safeDropTable( db, tableName );
QSqlQuery q(db);
- QVERIFY_SQL(q, exec("CREATE TABLE " + tableName + " (id DOUBLE)"));
+ QVERIFY_SQL(q, exec("CREATE TABLE " + tableName + " (id REAL)"));
// First test without any entries
QVERIFY_SQL(q, exec("SELECT SUM(id) FROM " + tableName));
QVERIFY(q.next());
- QCOMPARE(q.record().field(0).type(), QVariant::Invalid);
+ if (db.driverName().startsWith("QSQLITE"))
+ QCOMPARE(q.record().field(0).type(), QVariant::Invalid);
+ else
+ QCOMPARE(q.record().field(0).type(), QVariant::Double);
QVERIFY_SQL(q, exec("INSERT INTO " + tableName + " (id) VALUES (1.5)"));
QVERIFY_SQL(q, exec("INSERT INTO " + tableName + " (id) VALUES (2.5)"));
@@ -3583,7 +3626,10 @@ void tst_QSqlQuery::aggregateFunctionTypes()
QVERIFY_SQL(q, exec("SELECT MAX(txt) FROM " + tableName));
QVERIFY(q.next());
- QCOMPARE(q.record().field(0).type(), QVariant::Invalid);
+ if (db.driverName().startsWith("QSQLITE"))
+ QCOMPARE(q.record().field(0).type(), QVariant::Invalid);
+ else
+ QCOMPARE(q.record().field(0).type(), QVariant::String);
QVERIFY_SQL(q, exec("INSERT INTO " + tableName + " (id, txt) VALUES (1, 'lower')"));
QVERIFY_SQL(q, exec("INSERT INTO " + tableName + " (id, txt) VALUES (2, 'upper')"));
diff --git a/tests/auto/sql/models/qsqlquerymodel/tst_qsqlquerymodel.cpp b/tests/auto/sql/models/qsqlquerymodel/tst_qsqlquerymodel.cpp
index 33793c013d..1c1319630e 100644
--- a/tests/auto/sql/models/qsqlquerymodel/tst_qsqlquerymodel.cpp
+++ b/tests/auto/sql/models/qsqlquerymodel/tst_qsqlquerymodel.cpp
@@ -478,22 +478,23 @@ void tst_QSqlQueryModel::fetchMore()
CHECK_DATABASE(db);
QSqlQueryModel model;
- QSignalSpy spy(&model, SIGNAL(rowsInserted(QModelIndex, int, int)));
+ QSignalSpy modelAboutToBeResetSpy(&model, SIGNAL(modelAboutToBeReset()));
+ QSignalSpy modelResetSpy(&model, SIGNAL(modelReset()));
model.setQuery(QSqlQuery("select * from " + qTableName("many", __FILE__), db));
int rowCount = model.rowCount();
- QCOMPARE(spy.value(0).value(1).toInt(), 0);
- QCOMPARE(spy.value(0).value(2).toInt(), rowCount - 1);
+ QCOMPARE(modelAboutToBeResetSpy.count(), 1);
+ QCOMPARE(modelResetSpy.count(), 1);
// If the driver doesn't return the query size fetchMore() causes the
// model to grow and new signals are emitted
+ QSignalSpy rowsInsertedSpy(&model, SIGNAL(rowsInserted(QModelIndex, int, int)));
if (!db.driver()->hasFeature(QSqlDriver::QuerySize)) {
- spy.clear();
model.fetchMore();
int newRowCount = model.rowCount();
- QCOMPARE(spy.value(0).value(1).toInt(), rowCount);
- QCOMPARE(spy.value(0).value(2).toInt(), newRowCount - 1);
+ QCOMPARE(rowsInsertedSpy.value(0).value(1).toInt(), rowCount);
+ QCOMPARE(rowsInsertedSpy.value(0).value(2).toInt(), newRowCount - 1);
}
}
@@ -519,7 +520,8 @@ void tst_QSqlQueryModel::withSortFilterProxyModel()
QTableView view;
view.setModel(&proxy);
- QSignalSpy modelRowsRemovedSpy(&model, SIGNAL(rowsRemoved(const QModelIndex &, int, int)));
+ QSignalSpy modelAboutToBeResetSpy(&model, SIGNAL(modelAboutToBeReset()));
+ QSignalSpy modelResetSpy(&model, SIGNAL(modelReset()));
QSignalSpy modelRowsInsertedSpy(&model, SIGNAL(rowsInserted(const QModelIndex &, int, int)));
model.setQuery(QSqlQuery("SELECT * FROM " + qTableName("test3", __FILE__), db));
view.scrollToBottom();
@@ -528,19 +530,14 @@ void tst_QSqlQueryModel::withSortFilterProxyModel()
QCOMPARE(proxy.rowCount(), 511);
- // The second call to setQuery() clears the model by removing it's rows.
- // Only 256 rows because that is what was cached.
- QCOMPARE(modelRowsRemovedSpy.count(), 1);
- QCOMPARE(modelRowsRemovedSpy.value(0).value(1).toInt(), 0);
- QCOMPARE(modelRowsRemovedSpy.value(0).value(2).toInt(), 255);
-
- // The call to scrollToBottom() forces the model to fetch all rows,
- // which will be done in two steps.
- QCOMPARE(modelRowsInsertedSpy.count(), 2);
- QCOMPARE(modelRowsInsertedSpy.value(0).value(1).toInt(), 0);
- QCOMPARE(modelRowsInsertedSpy.value(0).value(2).toInt(), 255);
- QCOMPARE(modelRowsInsertedSpy.value(1).value(1).toInt(), 256);
- QCOMPARE(modelRowsInsertedSpy.value(1).value(2).toInt(), 510);
+ // setQuery() resets the model accompanied by begin and end signals
+ QCOMPARE(modelAboutToBeResetSpy.count(), 1);
+ QCOMPARE(modelResetSpy.count(), 1);
+
+ // The call to scrollToBottom() forces the model to fetch additional rows.
+ QCOMPARE(modelRowsInsertedSpy.count(), 1);
+ QCOMPARE(modelRowsInsertedSpy.value(0).value(1).toInt(), 256);
+ QCOMPARE(modelRowsInsertedSpy.value(0).value(2).toInt(), 510);
}
// For task 155402: When the model is already empty when setQuery() is called
@@ -553,22 +550,19 @@ void tst_QSqlQueryModel::setQuerySignalEmission()
CHECK_DATABASE(db);
QSqlQueryModel model;
- QSignalSpy modelRowsAboutToBeRemovedSpy(&model, SIGNAL(rowsAboutToBeRemoved(const QModelIndex &, int, int)));
- QSignalSpy modelRowsRemovedSpy(&model, SIGNAL(rowsRemoved(const QModelIndex &, int, int)));
+ QSignalSpy modelAboutToBeResetSpy(&model, SIGNAL(modelAboutToBeReset()));
+ QSignalSpy modelResetSpy(&model, SIGNAL(modelReset()));
- // First select, the model was empty and no rows had to be removed!
+ // First select, the model was empty and no rows had to be removed, but model resets anyway.
model.setQuery(QSqlQuery("SELECT * FROM " + qTableName("test", __FILE__), db));
- QCOMPARE(modelRowsAboutToBeRemovedSpy.count(), 0);
- QCOMPARE(modelRowsRemovedSpy.count(), 0);
+ QCOMPARE(modelAboutToBeResetSpy.count(), 1);
+ QCOMPARE(modelResetSpy.count(), 1);
// Second select, the model wasn't empty and two rows had to be removed!
+ // setQuery() resets the model accompanied by begin and end signals
model.setQuery(QSqlQuery("SELECT * FROM " + qTableName("test", __FILE__), db));
- QCOMPARE(modelRowsAboutToBeRemovedSpy.count(), 1);
- QCOMPARE(modelRowsAboutToBeRemovedSpy.value(0).value(1).toInt(), 0);
- QCOMPARE(modelRowsAboutToBeRemovedSpy.value(0).value(2).toInt(), 1);
- QCOMPARE(modelRowsRemovedSpy.count(), 1);
- QCOMPARE(modelRowsRemovedSpy.value(0).value(1).toInt(), 0);
- QCOMPARE(modelRowsRemovedSpy.value(0).value(2).toInt(), 1);
+ QCOMPARE(modelAboutToBeResetSpy.count(), 2);
+ QCOMPARE(modelResetSpy.count(), 2);
}
// For task 170783: When the query's result set is empty no rows should be inserted,
diff --git a/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp b/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp
index 2cea8b3546..89085df6c9 100644
--- a/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp
+++ b/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp
@@ -1338,39 +1338,13 @@ void tst_QSqlTableModel::setFilter()
QCOMPARE(model.rowCount(), 1);
QCOMPARE(model.data(model.index(0, 0)).toInt(), 1);
- QSignalSpy rowsRemovedSpy(&model, SIGNAL(rowsRemoved(QModelIndex,int,int)));
- QSignalSpy rowsAboutToBeRemovedSpy(&model,
- SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)));
- QSignalSpy rowsInsertedSpy(&model, SIGNAL(rowsInserted(QModelIndex,int,int)));
- QSignalSpy rowsAboutToBeInsertedSpy(&model,
- SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)));
+ QSignalSpy modelAboutToBeResetSpy(&model, SIGNAL(modelAboutToBeReset()));
+ QSignalSpy modelResetSpy(&model, SIGNAL(modelReset()));
model.setFilter("id = 2");
// check the signals
- QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
- QCOMPARE(rowsRemovedSpy.count(), 1);
- QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
- QCOMPARE(rowsInsertedSpy.count(), 1);
- QList<QVariant> args = rowsAboutToBeRemovedSpy.takeFirst();
- QCOMPARE(args.count(), 3);
- QCOMPARE(qvariant_cast<QModelIndex>(args.at(0)), QModelIndex());
- QCOMPARE(args.at(1).toInt(), 0);
- QCOMPARE(args.at(2).toInt(), 0);
- args = rowsRemovedSpy.takeFirst();
- QCOMPARE(args.count(), 3);
- QCOMPARE(qvariant_cast<QModelIndex>(args.at(0)), QModelIndex());
- QCOMPARE(args.at(1).toInt(), 0);
- QCOMPARE(args.at(2).toInt(), 0);
- args = rowsInsertedSpy.takeFirst();
- QCOMPARE(args.count(), 3);
- QCOMPARE(qvariant_cast<QModelIndex>(args.at(0)), QModelIndex());
- QCOMPARE(args.at(1).toInt(), 0);
- QCOMPARE(args.at(2).toInt(), 0);
- args = rowsAboutToBeInsertedSpy.takeFirst();
- QCOMPARE(args.count(), 3);
- QCOMPARE(qvariant_cast<QModelIndex>(args.at(0)), QModelIndex());
- QCOMPARE(args.at(1).toInt(), 0);
- QCOMPARE(args.at(2).toInt(), 0);
+ QCOMPARE(modelAboutToBeResetSpy.count(), 1);
+ QCOMPARE(modelResetSpy.count(), 1);
QCOMPARE(model.rowCount(), 1);
QCOMPARE(model.data(model.index(0, 0)).toInt(), 2);
@@ -1500,7 +1474,8 @@ void tst_QSqlTableModel::insertRecordsInLoop()
record.setValue(1, "Testman");
record.setValue(2, 1);
- QSignalSpy spyRowsRemoved(&model, SIGNAL(rowsRemoved(const QModelIndex &, int, int)));
+ QSignalSpy modelAboutToBeResetSpy(&model, SIGNAL(modelAboutToBeReset()));
+ QSignalSpy modelResetSpy(&model, SIGNAL(modelReset()));
QSignalSpy spyRowsInserted(&model, SIGNAL(rowsInserted(const QModelIndex &, int, int)));
for (int i = 0; i < 10; i++) {
QVERIFY(model.insertRecord(model.rowCount(), record));
@@ -1509,18 +1484,9 @@ void tst_QSqlTableModel::insertRecordsInLoop()
}
model.submitAll(); // submitAll() calls select() which clears and repopulates the table
- int firstRowIndex = 0, lastRowIndex = 12;
- QCOMPARE(spyRowsRemoved.count(), 11);
- // QSqlTableModel emits 10 signals for its 10 inserted rows
- QCOMPARE(spyRowsRemoved.at(0).at(1).toInt(), lastRowIndex);
- QCOMPARE(spyRowsRemoved.at(9).at(1).toInt(), firstRowIndex + 3);
- // QSqlQueryModel emits 1 signal for its 3 rows
- QCOMPARE(spyRowsRemoved.at(10).at(1).toInt(), firstRowIndex);
- QCOMPARE(spyRowsRemoved.at(10).at(2).toInt(), firstRowIndex + 2);
-
- QCOMPARE(spyRowsInserted.at(10).at(1).toInt(), firstRowIndex);
- QCOMPARE(spyRowsInserted.at(10).at(2).toInt(), lastRowIndex);
- QCOMPARE(spyRowsInserted.count(), 11);
+ // model emits reset signals
+ QCOMPARE(modelAboutToBeResetSpy.count(), 1);
+ QCOMPARE(modelResetSpy.count(), 1);
QCOMPARE(model.rowCount(), 13);
QCOMPARE(model.columnCount(), 3);
diff --git a/tests/auto/tools/moc/tst_moc.cpp b/tests/auto/tools/moc/tst_moc.cpp
index 78e18f9229..1bf016d6f5 100644
--- a/tests/auto/tools/moc/tst_moc.cpp
+++ b/tests/auto/tools/moc/tst_moc.cpp
@@ -847,10 +847,7 @@ void tst_Moc::testExtraDataForEnum()
const QMetaObject *mobjUser = &EnumUserClass::staticMetaObject;
QCOMPARE(mobjUser->enumeratorCount(), 0);
- const QMetaObjectExtraData *extra = reinterpret_cast<const QMetaObjectExtraData *>(mobjUser->d.extradata);
- QVERIFY(extra);
-
- const QMetaObject **objects = extra->objects;
+ const QMetaObject **objects = mobjUser->d.relatedMetaObjects;
QVERIFY(objects);
QVERIFY(objects[0] == mobjSource);
QVERIFY(objects[1] == 0);
@@ -863,13 +860,13 @@ void tst_Moc::namespaceTypeProperty()
QByteArray ba = QByteArray("points");
QVariant v = tst.property(ba);
QVERIFY(v.isValid());
- myNS::Points p = qVariantValue<myNS::Points>(v);
+ myNS::Points p = qvariant_cast<myNS::Points>(v);
QCOMPARE(p.p1, 0xBEEF);
QCOMPARE(p.p2, 0xBABE);
p.p1 = 0xCAFE;
p.p2 = 0x1EE7;
- QVERIFY(tst.setProperty(ba, qVariantFromValue(p)));
- myNS::Points pp = qVariantValue<myNS::Points>(tst.property(ba));
+ QVERIFY(tst.setProperty(ba, QVariant::fromValue(p)));
+ myNS::Points pp = qvariant_cast<myNS::Points>(tst.property(ba));
QCOMPARE(p.p1, pp.p1);
QCOMPARE(p.p2, pp.p2);
}
@@ -1184,16 +1181,16 @@ void tst_Moc::qprivateproperties()
PrivatePropertyTest test;
test.setProperty("foo", 1);
- QCOMPARE(test.property("foo"), qVariantFromValue(1));
+ QCOMPARE(test.property("foo"), QVariant::fromValue(1));
test.setProperty("bar", 2);
- QCOMPARE(test.property("bar"), qVariantFromValue(2));
+ QCOMPARE(test.property("bar"), QVariant::fromValue(2));
test.setProperty("plop", 3);
- QCOMPARE(test.property("plop"), qVariantFromValue(3));
+ QCOMPARE(test.property("plop"), QVariant::fromValue(3));
test.setProperty("baz", 4);
- QCOMPARE(test.property("baz"), qVariantFromValue(4));
+ QCOMPARE(test.property("baz"), QVariant::fromValue(4));
}
diff --git a/tests/auto/widgets/dialogs/dialogs.pro b/tests/auto/widgets/dialogs/dialogs.pro
index e74323a305..53e2338158 100644
--- a/tests/auto/widgets/dialogs/dialogs.pro
+++ b/tests/auto/widgets/dialogs/dialogs.pro
@@ -16,3 +16,5 @@ SUBDIRS=\
!contains(QT_CONFIG, private_tests): SUBDIRS -= \
qsidebar \
+
+mac:qinputdialog.CONFIG += no_check_target # QTBUG-25496
diff --git a/tests/auto/widgets/dialogs/qdialog/qdialog.pro b/tests/auto/widgets/dialogs/qdialog/qdialog.pro
index 779c10ed66..2c4d10dd0b 100644
--- a/tests/auto/widgets/dialogs/qdialog/qdialog.pro
+++ b/tests/auto/widgets/dialogs/qdialog/qdialog.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qdialog
QT += widgets testlib
SOURCES += tst_qdialog.cpp
-mac:CONFIG += insignificant_test # QTBUG-24977
diff --git a/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp b/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp
index 14c2be5bd8..a62c1a8f9a 100644
--- a/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp
+++ b/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp
@@ -504,7 +504,7 @@ void tst_QFiledialog::completer()
// press 'keys' for the input
for (int i = 0; i < input.count(); ++i)
- QTest::keyPress(lineEdit, input[i].toAscii());
+ QTest::keyPress(lineEdit, input[i].toLatin1());
QStringList expectedFiles;
if (expected == -1) {
@@ -1061,11 +1061,11 @@ void tst_QFiledialog::historyBack()
QCOMPARE(backButton->isEnabled(), true);
QCOMPARE(forwardButton->isEnabled(), true);
QCOMPARE(spy.count(), 3);
- QString currentPath = qVariantValue<QString>(spy.last().first());
+ QString currentPath = qvariant_cast<QString>(spy.last().first());
QCOMPARE(model->index(currentPath), model->index(temp));
backButton->click();
- currentPath = qVariantValue<QString>(spy.last().first());
+ currentPath = qvariant_cast<QString>(spy.last().first());
QCOMPARE(currentPath, home);
QCOMPARE(backButton->isEnabled(), false);
QCOMPARE(forwardButton->isEnabled(), true);
@@ -1101,39 +1101,39 @@ void tst_QFiledialog::historyForward()
backButton->click();
QCOMPARE(forwardButton->isEnabled(), true);
- QCOMPARE(model->index(qVariantValue<QString>(spy.last().first())), model->index(temp));
+ QCOMPARE(model->index(qvariant_cast<QString>(spy.last().first())), model->index(temp));
forwardButton->click();
- QCOMPARE(model->index(qVariantValue<QString>(spy.last().first())), model->index(desktop));
+ QCOMPARE(model->index(qvariant_cast<QString>(spy.last().first())), model->index(desktop));
QCOMPARE(backButton->isEnabled(), true);
QCOMPARE(forwardButton->isEnabled(), false);
QCOMPARE(spy.count(), 4);
backButton->click();
- QCOMPARE(model->index(qVariantValue<QString>(spy.last().first())), model->index(temp));
+ QCOMPARE(model->index(qvariant_cast<QString>(spy.last().first())), model->index(temp));
QCOMPARE(backButton->isEnabled(), true);
backButton->click();
- QCOMPARE(model->index(qVariantValue<QString>(spy.last().first())), model->index(home));
+ QCOMPARE(model->index(qvariant_cast<QString>(spy.last().first())), model->index(home));
QCOMPARE(backButton->isEnabled(), false);
QCOMPARE(forwardButton->isEnabled(), true);
QCOMPARE(spy.count(), 6);
forwardButton->click();
- QCOMPARE(model->index(qVariantValue<QString>(spy.last().first())), model->index(temp));
+ QCOMPARE(model->index(qvariant_cast<QString>(spy.last().first())), model->index(temp));
backButton->click();
- QCOMPARE(model->index(qVariantValue<QString>(spy.last().first())), model->index(home));
+ QCOMPARE(model->index(qvariant_cast<QString>(spy.last().first())), model->index(home));
QCOMPARE(spy.count(), 8);
forwardButton->click();
- QCOMPARE(model->index(qVariantValue<QString>(spy.last().first())), model->index(temp));
+ QCOMPARE(model->index(qvariant_cast<QString>(spy.last().first())), model->index(temp));
forwardButton->click();
- QCOMPARE(model->index(qVariantValue<QString>(spy.last().first())), model->index(desktop));
+ QCOMPARE(model->index(qvariant_cast<QString>(spy.last().first())), model->index(desktop));
backButton->click();
- QCOMPARE(model->index(qVariantValue<QString>(spy.last().first())), model->index(temp));
+ QCOMPARE(model->index(qvariant_cast<QString>(spy.last().first())), model->index(temp));
backButton->click();
- QCOMPARE(model->index(qVariantValue<QString>(spy.last().first())), model->index(home));
+ QCOMPARE(model->index(qvariant_cast<QString>(spy.last().first())), model->index(home));
fd.setDirectory(desktop);
QCOMPARE(forwardButton->isEnabled(), false);
}
diff --git a/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp b/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp
index 4a6f714a7c..d90c6f8851 100644
--- a/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp
+++ b/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp
@@ -568,7 +568,7 @@ void tst_QFileDialog2::completionOnLevelAfterRoot()
// - No another dir with same start
QString testDir;
foreach (const QString &entry, entryList) {
- if (entry.size() > 5 && QString(entry.toAscii()).compare(entry) == 0) {
+ if (entry.size() > 5 && QString(entry.toLatin1()).compare(entry) == 0) {
bool invalid = false;
for (int i = 0; i < 5; i++) {
if (!entry.at(i).isLetter()) {
@@ -605,7 +605,7 @@ void tst_QFileDialog2::completionOnLevelAfterRoot()
#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
//I love testlib :D
for (int i = 0; i < 5; i++)
- QTest::keyClick(edit, testDir.at(i).toLower().toAscii() - 'a' + Qt::Key_A);
+ QTest::keyClick(edit, testDir.at(i).toLower().toLatin1() - 'a' + Qt::Key_A);
#else
QTest::keyClick(edit, Qt::Key_E);
QTest::keyClick(edit, Qt::Key_T);
diff --git a/tests/auto/widgets/dialogs/qfontdialog/tst_qfontdialog.cpp b/tests/auto/widgets/dialogs/qfontdialog/tst_qfontdialog.cpp
index 6b2caf17d7..533014b1c9 100644
--- a/tests/auto/widgets/dialogs/qfontdialog/tst_qfontdialog.cpp
+++ b/tests/auto/widgets/dialogs/qfontdialog/tst_qfontdialog.cpp
@@ -160,12 +160,9 @@ class FriendlyFontDialog : public QFontDialog
void tst_QFontDialog::task256466_wrongStyle()
{
-#ifdef Q_OS_MAC
- QSKIP("Test crashes on Mac OS X, see QTBUG-24321");
-#endif
-
QFontDatabase fdb;
FriendlyFontDialog dialog;
+ dialog.setOption(QFontDialog::DontUseNativeDialog);
QListView *familyList = reinterpret_cast<QListView*>(dialog.d_func()->familyList);
QListView *styleList = reinterpret_cast<QListView*>(dialog.d_func()->styleList);
QListView *sizeList = reinterpret_cast<QListView*>(dialog.d_func()->sizeList);
diff --git a/tests/auto/widgets/dialogs/qinputdialog/tst_qinputdialog.cpp b/tests/auto/widgets/dialogs/qinputdialog/tst_qinputdialog.cpp
index a38c2d070d..f6c10bc2e9 100644
--- a/tests/auto/widgets/dialogs/qinputdialog/tst_qinputdialog.cpp
+++ b/tests/auto/widgets/dialogs/qinputdialog/tst_qinputdialog.cpp
@@ -110,7 +110,7 @@ void testTypingValue(
sbox->selectAll();
for (int i = 0; i < value.size(); ++i) {
const QChar valChar = value[i];
- _keyClick(static_cast<QWidget *>(sbox), valChar.toAscii()); // ### always guaranteed to work?
+ _keyClick(static_cast<QWidget *>(sbox), valChar.toLatin1()); // ### always guaranteed to work?
if (sbox->hasAcceptableInput())
QVERIFY(okButton->isEnabled());
else
@@ -123,7 +123,7 @@ void testTypingValue(QLineEdit *ledit, QPushButton *okButton, const QString &val
ledit->selectAll();
for (int i = 0; i < value.size(); ++i) {
const QChar valChar = value[i];
- _keyClick(ledit, valChar.toAscii()); // ### always guaranteed to work?
+ _keyClick(ledit, valChar.toLatin1()); // ### always guaranteed to work?
QVERIFY(ledit->hasAcceptableInput());
QVERIFY(okButton->isEnabled());
}
diff --git a/tests/auto/widgets/effects/qgraphicseffect/qgraphicseffect.pro b/tests/auto/widgets/effects/qgraphicseffect/qgraphicseffect.pro
index d21ff564dd..177d1a7c42 100644
--- a/tests/auto/widgets/effects/qgraphicseffect/qgraphicseffect.pro
+++ b/tests/auto/widgets/effects/qgraphicseffect/qgraphicseffect.pro
@@ -5,4 +5,3 @@ QT += widgets widgets-private testlib
QT += core-private gui-private
SOURCES += tst_qgraphicseffect.cpp
-CONFIG += parallel_test
diff --git a/tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/tst_qgraphicsanchorlayout1.cpp b/tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/tst_qgraphicsanchorlayout1.cpp
index 97feb642dc..7687fd4b67 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/tst_qgraphicsanchorlayout1.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/tst_qgraphicsanchorlayout1.cpp
@@ -167,7 +167,7 @@ public:
{
setContentsMargins( 0,0,0,0 );
if (name.isEmpty())
- setData(0, QString::fromAscii("w%1").arg(quintptr(this)));
+ setData(0, QString::fromLatin1("w%1").arg(quintptr(this)));
else
setData(0, name);
}
@@ -1711,7 +1711,7 @@ void tst_QGraphicsAnchorLayout1::testBasicLayout()
// Create dummy widgets
QList<QGraphicsWidget *> widgets;
for (int i = 0; i < widgetCount; ++i) {
- TestWidget *w = new TestWidget(0, QString::fromAscii("W%1").arg(i));
+ TestWidget *w = new TestWidget(0, QString::fromLatin1("W%1").arg(i));
widgets << w;
}
diff --git a/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp b/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
index 51ce7f909c..5da996bd59 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
@@ -458,7 +458,7 @@ void tst_QGraphicsGridLayout::addItem_data()
int column = b;
int rowSpan = c;
int columnSpan = d;
- QString name = QString::fromAscii("(%1,%2,%3,%4").arg(a).arg(b).arg(c).arg(d);
+ QString name = QString::fromLatin1("(%1,%2,%3,%4").arg(a).arg(b).arg(c).arg(d);
Qt::Alignment alignment = Qt::AlignLeft;
QTest::newRow(name.toLatin1()) << row << column << rowSpan << columnSpan << alignment;
}}}}
@@ -1114,7 +1114,7 @@ void tst_QGraphicsGridLayout::itemAt()
if (i >= 0 && i < layout->count()) {
QVERIFY(layout->itemAt(i));
} else {
- QTest::ignoreMessage(QtWarningMsg, QString::fromAscii("QGraphicsGridLayout::itemAt: invalid index %1").arg(i).toLatin1().constData());
+ QTest::ignoreMessage(QtWarningMsg, QString::fromLatin1("QGraphicsGridLayout::itemAt: invalid index %1").arg(i).toLatin1().constData());
QCOMPARE(layout->itemAt(i), static_cast<QGraphicsLayoutItem*>(0));
}
}
@@ -1146,7 +1146,7 @@ void tst_QGraphicsGridLayout::removeAt()
layout->removeAt(0);
QCOMPARE(item0->parentLayoutItem(), static_cast<QGraphicsLayoutItem *>(0));
QCOMPARE(layout->count(), 0);
- QTest::ignoreMessage(QtWarningMsg, QString::fromAscii("QGraphicsGridLayout::removeAt: invalid index 0").toLatin1().constData());
+ QTest::ignoreMessage(QtWarningMsg, QString::fromLatin1("QGraphicsGridLayout::removeAt: invalid index 0").toLatin1().constData());
layout->removeAt(0);
QCOMPARE(layout->count(), 0);
delete widget;
@@ -1169,11 +1169,11 @@ void tst_QGraphicsGridLayout::removeItem()
QCOMPARE(l->count(), 4);
// Avoid crashing. Note that the warning message might change in the future.
- QTest::ignoreMessage(QtWarningMsg, QString::fromAscii("QGraphicsGridLayout::removeAt: invalid index -1").toLatin1().constData());
+ QTest::ignoreMessage(QtWarningMsg, QString::fromLatin1("QGraphicsGridLayout::removeAt: invalid index -1").toLatin1().constData());
l->removeItem(0);
QCOMPARE(l->count(), 4);
- QTest::ignoreMessage(QtWarningMsg, QString::fromAscii("QGraphicsGridLayout::removeAt: invalid index -1").toLatin1().constData());
+ QTest::ignoreMessage(QtWarningMsg, QString::fromLatin1("QGraphicsGridLayout::removeAt: invalid index -1").toLatin1().constData());
l->removeItem(new QGraphicsWidget);
QCOMPARE(l->count(), 4);
}
diff --git a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
index 639a1f61a9..a6f846045f 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
@@ -2219,7 +2219,7 @@ void tst_QGraphicsItem::setMatrix()
QApplication::instance()->processEvents();
QCOMPARE(spy.count(), 3);
- QList<QRectF> rlist = qVariantValue<QList<QRectF> >(spy.last().at(0));
+ QList<QRectF> rlist = qvariant_cast<QList<QRectF> >(spy.last().at(0));
QCOMPARE(rlist.size(), 3);
QCOMPARE(rlist.at(0), rotatedRect); // From item.setMatrix() (clearing rotated rect)
@@ -4450,13 +4450,13 @@ protected:
break;
case QGraphicsItem::ItemMatrixChange: {
QVariant variant;
- qVariantSetValue<QMatrix>(variant, matrix());
+ variant.setValue<QMatrix>(matrix());
oldValues << variant;
}
break;
case QGraphicsItem::ItemTransformChange: {
QVariant variant;
- qVariantSetValue<QTransform>(variant, transform());
+ variant.setValue<QTransform>(transform());
oldValues << variant;
}
break;
@@ -4478,7 +4478,7 @@ protected:
case QGraphicsItem::ItemSelectedHasChanged:
break;
case QGraphicsItem::ItemParentChange:
- oldValues << qVariantFromValue<void *>(parentItem());
+ oldValues << QVariant::fromValue<void *>(parentItem());
break;
case QGraphicsItem::ItemParentHasChanged:
break;
@@ -4489,11 +4489,11 @@ protected:
oldValues << children().size();
break;
case QGraphicsItem::ItemSceneChange:
- oldValues << qVariantFromValue<QGraphicsScene *>(scene());
+ oldValues << QVariant::fromValue<QGraphicsScene *>(scene());
if (itemSceneChangeTargetScene
- && qVariantValue<QGraphicsScene *>(value)
- && itemSceneChangeTargetScene != qVariantValue<QGraphicsScene *>(value)) {
- return qVariantFromValue<QGraphicsScene *>(itemSceneChangeTargetScene);
+ && qvariant_cast<QGraphicsScene *>(value)
+ && itemSceneChangeTargetScene != qvariant_cast<QGraphicsScene *>(value)) {
+ return QVariant::fromValue<QGraphicsScene *>(itemSceneChangeTargetScene);
}
return value;
case QGraphicsItem::ItemSceneHasChanged:
@@ -4573,17 +4573,17 @@ void tst_QGraphicsItem::itemChange()
}
{
// ItemMatrixChange / ItemTransformHasChanged
- qVariantSetValue<QMatrix>(tester.itemChangeReturnValue, QMatrix().rotate(90));
+ tester.itemChangeReturnValue.setValue<QMatrix>(QMatrix().rotate(90));
tester.setMatrix(QMatrix().translate(50, 0), true);
++changeCount; // notification sent too
QCOMPARE(tester.changes.size(), ++changeCount);
QCOMPARE(int(tester.changes.at(tester.changes.size() - 2)), int(QGraphicsItem::ItemMatrixChange));
QCOMPARE(int(tester.changes.last()), int(QGraphicsItem::ItemTransformHasChanged));
- QCOMPARE(qVariantValue<QMatrix>(tester.values.at(tester.values.size() - 2)),
+ QCOMPARE(qvariant_cast<QMatrix>(tester.values.at(tester.values.size() - 2)),
QMatrix().translate(50, 0));
QCOMPARE(tester.values.last(), QVariant(QTransform(QMatrix().rotate(90))));
QVariant variant;
- qVariantSetValue<QMatrix>(variant, QMatrix());
+ variant.setValue<QMatrix>(QMatrix());
QCOMPARE(tester.oldValues.last(), variant);
QCOMPARE(tester.matrix(), QMatrix().rotate(90));
}
@@ -4593,19 +4593,19 @@ void tst_QGraphicsItem::itemChange()
++changeCount; // notification sent too
// ItemTransformChange / ItemTransformHasChanged
- qVariantSetValue<QTransform>(tester.itemChangeReturnValue, QTransform().rotate(90));
+ tester.itemChangeReturnValue.setValue<QTransform>(QTransform().rotate(90));
tester.translate(50, 0);
++changeCount; // notification sent too
++changeCount;
QCOMPARE(tester.changes.size(), changeCount);
QCOMPARE(tester.changes.at(tester.changes.size() - 2), QGraphicsItem::ItemTransformChange);
QCOMPARE(tester.changes.at(tester.changes.size() - 1), QGraphicsItem::ItemTransformHasChanged);
- QCOMPARE(qVariantValue<QTransform>(tester.values.at(tester.values.size() - 2)),
+ QCOMPARE(qvariant_cast<QTransform>(tester.values.at(tester.values.size() - 2)),
QTransform().translate(50, 0));
- QCOMPARE(qVariantValue<QTransform>(tester.values.at(tester.values.size() - 1)),
+ QCOMPARE(qvariant_cast<QTransform>(tester.values.at(tester.values.size() - 1)),
QTransform().rotate(90));
QVariant variant;
- qVariantSetValue<QTransform>(variant, QTransform());
+ variant.setValue<QTransform>(QTransform());
QCOMPARE(tester.oldValues.last(), variant);
QCOMPARE(tester.transform(), QTransform().rotate(90));
}
@@ -4690,9 +4690,9 @@ void tst_QGraphicsItem::itemChange()
QCOMPARE(tester.changes.size(), changeCount);
QCOMPARE(tester.changes.at(tester.changes.size() - 2), QGraphicsItem::ItemFlagsChange);
QCOMPARE(tester.changes.at(tester.changes.size() - 1), QGraphicsItem::ItemFlagsHaveChanged);
- QVariant expectedFlags = qVariantFromValue<quint32>(QGraphicsItem::GraphicsItemFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemSendsGeometryChanges));
+ QVariant expectedFlags = QVariant::fromValue<quint32>(QGraphicsItem::GraphicsItemFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemSendsGeometryChanges));
QCOMPARE(tester.values.at(tester.values.size() - 2), expectedFlags);
- QCOMPARE(tester.values.at(tester.values.size() - 1), qVariantFromValue<quint32>((quint32)QGraphicsItem::ItemIsSelectable));
+ QCOMPARE(tester.values.at(tester.values.size() - 1), QVariant::fromValue<quint32>((quint32)QGraphicsItem::ItemIsSelectable));
}
{
// ItemSelectedChange
@@ -4739,12 +4739,12 @@ void tst_QGraphicsItem::itemChange()
}
{
// ItemParentChange
- qVariantSetValue<QGraphicsItem *>(tester.itemChangeReturnValue, 0);
+ tester.itemChangeReturnValue.setValue<QGraphicsItem *>(0);
tester.setParentItem(&testerHelper);
QCOMPARE(tester.changes.size(), ++changeCount);
QCOMPARE(tester.changes.last(), QGraphicsItem::ItemParentChange);
- QCOMPARE(qVariantValue<QGraphicsItem *>(tester.values.last()), (QGraphicsItem *)&testerHelper);
- QCOMPARE(qVariantValue<QGraphicsItem *>(tester.oldValues.last()), (QGraphicsItem *)0);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(tester.values.last()), (QGraphicsItem *)&testerHelper);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(tester.oldValues.last()), (QGraphicsItem *)0);
QCOMPARE(tester.parentItem(), (QGraphicsItem *)0);
}
{
@@ -4771,14 +4771,14 @@ void tst_QGraphicsItem::itemChange()
testerHelper.setParentItem(&tester);
QCOMPARE(tester.changes.size(), ++changeCount);
QCOMPARE(tester.changes.last(), QGraphicsItem::ItemChildAddedChange);
- QCOMPARE(qVariantValue<QGraphicsItem *>(tester.values.last()), (QGraphicsItem *)&testerHelper);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(tester.values.last()), (QGraphicsItem *)&testerHelper);
}
{
// ItemChildRemovedChange 1
testerHelper.setParentItem(0);
QCOMPARE(tester.changes.size(), ++changeCount);
QCOMPARE(tester.changes.last(), QGraphicsItem::ItemChildRemovedChange);
- QCOMPARE(qVariantValue<QGraphicsItem *>(tester.values.last()), (QGraphicsItem *)&testerHelper);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(tester.values.last()), (QGraphicsItem *)&testerHelper);
// ItemChildRemovedChange 1
ItemChangeTester *test = new ItemChangeTester;
@@ -4819,10 +4819,10 @@ void tst_QGraphicsItem::itemChange()
ItemChangeTester *child = new ItemChangeTester;
child->setParentItem(&parent);
QCOMPARE(parent.changes.last(), QGraphicsItem::ItemChildAddedChange);
- QCOMPARE(qVariantValue<QGraphicsItem *>(parent.values.last()), (QGraphicsItem *)child);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(parent.values.last()), (QGraphicsItem *)child);
delete child;
QCOMPARE(parent.changes.last(), QGraphicsItem::ItemChildRemovedChange);
- QCOMPARE(qVariantValue<QGraphicsItem *>(parent.values.last()), (QGraphicsItem *)child);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(parent.values.last()), (QGraphicsItem *)child);
}
{
// !!! Note: If this test crashes because of double-deletion, there's
@@ -4841,8 +4841,8 @@ void tst_QGraphicsItem::itemChange()
QCOMPARE(tester.changes.at(tester.changes.size() - 1), QGraphicsItem::ItemSceneHasChanged);
// Item's old value was 0
// Item's current value is scene
- QCOMPARE(qVariantValue<QGraphicsScene *>(tester.oldValues.last()), (QGraphicsScene *)0);
- QCOMPARE(qVariantValue<QGraphicsScene *>(tester.values.last()), (QGraphicsScene *)&scene);
+ QCOMPARE(qvariant_cast<QGraphicsScene *>(tester.oldValues.last()), (QGraphicsScene *)0);
+ QCOMPARE(qvariant_cast<QGraphicsScene *>(tester.values.last()), (QGraphicsScene *)&scene);
scene2.addItem(&tester);
++changeCount; // ItemSceneChange (0) was: (scene)
++changeCount; // ItemSceneHasChanged (0)
@@ -4858,16 +4858,16 @@ void tst_QGraphicsItem::itemChange()
// Item's last old value was scene
// Item's last current value is 0
- QCOMPARE(qVariantValue<QGraphicsScene *>(tester.oldValues.at(tester.oldValues.size() - 2)), (QGraphicsScene *)&scene);
- QCOMPARE(qVariantValue<QGraphicsScene *>(tester.oldValues.at(tester.oldValues.size() - 1)), (QGraphicsScene *)0);
- QCOMPARE(qVariantValue<QGraphicsScene *>(tester.values.at(tester.values.size() - 4)), (QGraphicsScene *)0);
- QCOMPARE(qVariantValue<QGraphicsScene *>(tester.values.at(tester.values.size() - 3)), (QGraphicsScene *)0);
- QCOMPARE(qVariantValue<QGraphicsScene *>(tester.values.at(tester.values.size() - 2)), (QGraphicsScene *)&scene2);
- QCOMPARE(qVariantValue<QGraphicsScene *>(tester.values.at(tester.values.size() - 1)), (QGraphicsScene *)&scene2);
+ QCOMPARE(qvariant_cast<QGraphicsScene *>(tester.oldValues.at(tester.oldValues.size() - 2)), (QGraphicsScene *)&scene);
+ QCOMPARE(qvariant_cast<QGraphicsScene *>(tester.oldValues.at(tester.oldValues.size() - 1)), (QGraphicsScene *)0);
+ QCOMPARE(qvariant_cast<QGraphicsScene *>(tester.values.at(tester.values.size() - 4)), (QGraphicsScene *)0);
+ QCOMPARE(qvariant_cast<QGraphicsScene *>(tester.values.at(tester.values.size() - 3)), (QGraphicsScene *)0);
+ QCOMPARE(qvariant_cast<QGraphicsScene *>(tester.values.at(tester.values.size() - 2)), (QGraphicsScene *)&scene2);
+ QCOMPARE(qvariant_cast<QGraphicsScene *>(tester.values.at(tester.values.size() - 1)), (QGraphicsScene *)&scene2);
// Item's last old value was 0
// Item's last current value is scene2
- QCOMPARE(qVariantValue<QGraphicsScene *>(tester.oldValues.last()), (QGraphicsScene *)0);
- QCOMPARE(qVariantValue<QGraphicsScene *>(tester.values.last()), (QGraphicsScene *)&scene2);
+ QCOMPARE(qvariant_cast<QGraphicsScene *>(tester.oldValues.last()), (QGraphicsScene *)0);
+ QCOMPARE(qvariant_cast<QGraphicsScene *>(tester.values.last()), (QGraphicsScene *)&scene2);
scene2.removeItem(&tester);
++changeCount; // ItemSceneChange (0) was: (scene2)
@@ -4879,9 +4879,9 @@ void tst_QGraphicsItem::itemChange()
QCOMPARE(tester.changes.at(tester.changes.size() - 1), QGraphicsItem::ItemSceneHasChanged);
// Item's last old value was scene2
// Item's last current value is 0
- QCOMPARE(qVariantValue<QGraphicsScene *>(tester.oldValues.last()), (QGraphicsScene *)&scene2);
- QCOMPARE(qVariantValue<QGraphicsScene *>(tester.values.at(tester.values.size() - 2)), (QGraphicsScene *)0);
- QCOMPARE(qVariantValue<QGraphicsScene *>(tester.values.at(tester.values.size() - 1)), (QGraphicsScene *)0);
+ QCOMPARE(qvariant_cast<QGraphicsScene *>(tester.oldValues.last()), (QGraphicsScene *)&scene2);
+ QCOMPARE(qvariant_cast<QGraphicsScene *>(tester.values.at(tester.values.size() - 2)), (QGraphicsScene *)0);
+ QCOMPARE(qvariant_cast<QGraphicsScene *>(tester.values.at(tester.values.size() - 1)), (QGraphicsScene *)0);
tester.itemSceneChangeTargetScene = &scene;
scene2.addItem(&tester);
@@ -4890,9 +4890,9 @@ void tst_QGraphicsItem::itemChange()
++changeCount; // ItemSceneHasChanged (scene)
QCOMPARE(tester.values.size(), changeCount);
- QCOMPARE(qVariantValue<QGraphicsScene *>(tester.values.at(tester.values.size() - 3)), (QGraphicsScene *)&scene2);
- QCOMPARE(qVariantValue<QGraphicsScene *>(tester.values.at(tester.values.size() - 2)), (QGraphicsScene *)&scene);
- QCOMPARE(qVariantValue<QGraphicsScene *>(tester.values.at(tester.values.size() - 1)), (QGraphicsScene *)&scene);
+ QCOMPARE(qvariant_cast<QGraphicsScene *>(tester.values.at(tester.values.size() - 3)), (QGraphicsScene *)&scene2);
+ QCOMPARE(qvariant_cast<QGraphicsScene *>(tester.values.at(tester.values.size() - 2)), (QGraphicsScene *)&scene);
+ QCOMPARE(qvariant_cast<QGraphicsScene *>(tester.values.at(tester.values.size() - 1)), (QGraphicsScene *)&scene);
QCOMPARE(tester.scene(), &scene);
tester.itemSceneChangeTargetScene = 0;
diff --git a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/qgraphicsproxywidget.pro b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/qgraphicsproxywidget.pro
index f2bd7bde70..7fd6db1dd6 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/qgraphicsproxywidget.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/qgraphicsproxywidget.pro
@@ -6,7 +6,4 @@ QT += core-private gui-private
SOURCES += tst_qgraphicsproxywidget.cpp
-# ### fixme: QTBUG-20756 crashes on xcb
-contains(QT_CONFIG,xcb):CONFIG+=insignificant_test
-
-win32:CONFIG += insignificant_test # QTBUG-24294
+contains(QT_CONFIG,xcb):CONFIG+=insignificant_test # QTBUG-25294
diff --git a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp
index fef21c19f7..2b143c5d98 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp
@@ -1498,6 +1498,9 @@ void tst_QGraphicsProxyWidget::scrollUpdate()
// QRect(0, 0, 200, 12) is the first update, expanded (-2, -2, 2, 2)
// QRect(0, 12, 102, 10) is the scroll update, expanded (-2, -2, 2, 2),
// intersected with the above update.
+#ifdef Q_OS_WIN
+ QEXPECT_FAIL("", "QTBUG-24294", Abort);
+#endif
QCOMPARE(view.paintEventRegion.rects(),
QVector<QRect>() << QRect(0, 0, 200, 12) << QRect(0, 12, 102, 10));
QCOMPARE(widget->npaints, 2);
@@ -2472,6 +2475,9 @@ void tst_QGraphicsProxyWidget::popup_basic()
QTest::mousePress(view.viewport(), Qt::LeftButton, 0,
view.mapFromScene(proxy->mapToScene(proxy->boundingRect().center())));
+#ifdef Q_OS_WIN
+ QEXPECT_FAIL("", "QTBUG-24294", Abort);
+#endif
QTRY_COMPARE(box->pos(), QPoint());
QCOMPARE(proxy->childItems().count(), 1);
@@ -3376,11 +3382,13 @@ void tst_QGraphicsProxyWidget::updateAndDelete()
// Update and hide.
proxy->update();
proxy->hide();
-#ifdef Q_OS_MAC
- QEXPECT_FAIL("", "QTBUG-23700", Abort);
+#ifdef Q_OS_WIN
+ QEXPECT_FAIL("", "QTBUG-24294", Abort);
#endif
-
QTRY_COMPARE(view.npaints, 1);
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("", "QTBUG-23700", Continue);
+#endif
QCOMPARE(view.paintEventRegion, expectedRegion);
proxy->show();
diff --git a/tests/auto/widgets/graphicsview/qgraphicsscene/qgraphicsscene.pro b/tests/auto/widgets/graphicsview/qgraphicsscene/qgraphicsscene.pro
index c0a9075d10..8a084472b8 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsscene/qgraphicsscene.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicsscene/qgraphicsscene.pro
@@ -17,5 +17,3 @@ wince* {
DEPLOYMENT += rootFiles renderFiles
DEFINES += SRCDIR=\\\".\\\"
}
-
-win32:CONFIG += insignificant_test # QTBUG-24295
diff --git a/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp b/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp
index df529c6095..3686619fea 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp
@@ -2830,7 +2830,7 @@ void tst_QGraphicsScene::update()
// Check that the update region is correct
QCOMPARE(spy.count(), 1);
QRectF region;
- foreach (QRectF rectF, qVariantValue<QList<QRectF> >(spy.at(0).at(0)))
+ foreach (QRectF rectF, qvariant_cast<QList<QRectF> >(spy.at(0).at(0)))
region |= rectF;
QCOMPARE(region, QRectF(-100, -100, 200, 200));
}
diff --git a/tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro b/tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro
index 59ad89ed1f..20cff5500a 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro
@@ -6,7 +6,3 @@ QT += core-private gui-private
SOURCES += tst_qgraphicsview.cpp tst_qgraphicsview_2.cpp
DEFINES += QT_NO_CAST_TO_ASCII
-
-linux-*:system(". /etc/lsb-release && [ $DISTRIB_CODENAME = oneiric ]"):CONFIG+=insignificant_test # QTBUG-16063
-
-win32|mac:CONFIG += insignificant_test # QTBUG-24296
diff --git a/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp b/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
index 1838977749..156d815765 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
@@ -3423,6 +3423,9 @@ void tst_QGraphicsView::moveItemWhileScrolling()
int a = adjustForAntialiasing ? 2 : 1;
expectedRegion += QRect(40, 50, 10, 10).adjusted(-a, -a, a, a);
expectedRegion += QRect(40, 60, 10, 10).adjusted(-a, -a, a, a);
+#ifdef Q_OS_WIN
+ QEXPECT_FAIL("", "QTBUG-24296", Abort);
+#endif
COMPARE_REGIONS(view.lastPaintedRegion, expectedRegion);
}
@@ -4386,10 +4389,8 @@ void tst_QGraphicsView::task259503_scrollingArtifacts()
if (itSTimeToTest)
{
-// qDebug() << event->region();
-// qDebug() << updateRegion;
-#ifndef Q_OS_MAC
- QEXPECT_FAIL("", "The event region doesn't include the original item position region. See QTBUG-4416", Continue);
+#ifndef Q_OS_WIN
+ QEXPECT_FAIL("", "QTBUG-24296", Continue);
#endif
QCOMPARE(event->region(), updateRegion);
}
diff --git a/tests/auto/widgets/graphicsview/qgraphicswidget/qgraphicswidget.pro b/tests/auto/widgets/graphicsview/qgraphicswidget/qgraphicswidget.pro
index 2fc45b48de..6acb63089e 100644
--- a/tests/auto/widgets/graphicsview/qgraphicswidget/qgraphicswidget.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicswidget/qgraphicswidget.pro
@@ -6,4 +6,4 @@ QT += core-private gui-private
SOURCES += tst_qgraphicswidget.cpp
-linux-*:system(". /etc/lsb-release && [ $DISTRIB_CODENAME = oneiric ]"):CONFIG += insignificant_test # QTBUG-23616
+linux-*:system(". /etc/lsb-release && [ $DISTRIB_CODENAME = lucid ]"):DEFINES+=UBUNTU_LUCID # QTBUG-20778
diff --git a/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp b/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp
index 3c98f8936c..7a5aabe714 100644
--- a/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp
@@ -1515,7 +1515,7 @@ void tst_QGraphicsWidget::setTabOrderAndReparent()
for (i = 1; i < 4; ++i) {
QGraphicsWidget *wid = new QGraphicsWidget;
wid->setFocusPolicy(Qt::StrongFocus);
- wid->setData(0, QString::fromAscii("w%1").arg(i));
+ wid->setData(0, QString::fromLatin1("w%1").arg(i));
scene.addItem(wid);
if (i == 1)
w1 = wid;
@@ -1555,7 +1555,7 @@ void tst_QGraphicsWidget::setTabOrderAndReparent()
for (i = 1; i < 5; ++i) {
QGraphicsWidget *wid = new QGraphicsWidget;
wid->setFocusPolicy(Qt::StrongFocus);
- wid->setData(0, QString::fromAscii("w%1").arg(i));
+ wid->setData(0, QString::fromLatin1("w%1").arg(i));
scene.addItem(wid);
if (i == 1)
w1 = wid;
@@ -3191,7 +3191,7 @@ void tst_QGraphicsWidget::initialShow2()
view.show();
QTest::qWaitForWindowShown(&view);
-#ifndef Q_OS_MAC
+#if defined(Q_OS_WIN) || defined(UBUNTU_LUCID)
QEXPECT_FAIL("", "QTBUG-20778", Abort);
#endif
QTRY_COMPARE(widget->repaints, expectedRepaintCount);
@@ -3211,11 +3211,11 @@ void tst_QGraphicsWidget::itemChangeEvents()
break;
}
case QEvent::ParentAboutToChange: {
- valueDuringEvents.insert(QEvent::ParentAboutToChange, qVariantFromValue(parentItem()));
+ valueDuringEvents.insert(QEvent::ParentAboutToChange, QVariant::fromValue(parentItem()));
break;
}
case QEvent::ParentChange: {
- valueDuringEvents.insert(QEvent::ParentChange, qVariantFromValue(parentItem()));
+ valueDuringEvents.insert(QEvent::ParentChange, QVariant::fromValue(parentItem()));
break;
}
case QEvent::CursorChange: {
@@ -3252,10 +3252,10 @@ void tst_QGraphicsWidget::itemChangeEvents()
TestGraphicsWidget *item = new TestGraphicsWidget;
item->setParentItem(parent);
// ParentAboutToChange should be triggered before the parent has changed
- QTRY_COMPARE(qVariantValue<QGraphicsItem *>(item->valueDuringEvents.value(QEvent::ParentAboutToChange)),
+ QTRY_COMPARE(qvariant_cast<QGraphicsItem *>(item->valueDuringEvents.value(QEvent::ParentAboutToChange)),
static_cast<QGraphicsItem *>(0));
// ParentChange should be triggered after the parent has changed
- QTRY_COMPARE(qVariantValue<QGraphicsItem *>(item->valueDuringEvents.value(QEvent::ParentChange)),
+ QTRY_COMPARE(qvariant_cast<QGraphicsItem *>(item->valueDuringEvents.value(QEvent::ParentChange)),
static_cast<QGraphicsItem *>(parent));
// ShowEvent should be triggered before the item is shown
diff --git a/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp b/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp
index 1518403a64..3846433e29 100644
--- a/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp
+++ b/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp
@@ -1545,7 +1545,7 @@ public:
return QVariant();
}
if (role == Qt::DisplayRole) {
- return QString::fromAscii("%1,%2").arg(index.row()).arg(index.column());
+ return QString::fromLatin1("%1,%2").arg(index.row()).arg(index.column());
}
return QVariant();
}
diff --git a/tests/auto/widgets/itemviews/qitemdelegate/qitemdelegate.pro b/tests/auto/widgets/itemviews/qitemdelegate/qitemdelegate.pro
index d1a7686637..d90f6fd154 100644
--- a/tests/auto/widgets/itemviews/qitemdelegate/qitemdelegate.pro
+++ b/tests/auto/widgets/itemviews/qitemdelegate/qitemdelegate.pro
@@ -4,5 +4,3 @@ QT += widgets testlib
SOURCES += tst_qitemdelegate.cpp
win32:!wince*: LIBS += -lUser32
-
-linux-*:system(". /etc/lsb-release && [ $DISTRIB_CODENAME = oneiric ]"):CONFIG+=insignificant_test # QTBUG-23637
diff --git a/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp b/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp
index 9bb08edcce..be649db9d8 100644
--- a/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp
+++ b/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp
@@ -1277,7 +1277,7 @@ void tst_QListView::scrollBarRanges()
QStringListModel model(&lv);
QStringList list;
for (int i = 0; i < rowCount; ++i)
- list << QString::fromAscii("Item %1").arg(i);
+ list << QString::fromLatin1("Item %1").arg(i);
model.setStringList(list);
lv.setModel(&model);
@@ -1375,7 +1375,7 @@ void tst_QListView::scrollBarAsNeeded()
QStringList list;
int i;
for (i = 0; i < rowCounts[r]; ++i)
- list << QString::fromAscii("Item %1").arg(i);
+ list << QString::fromLatin1("Item %1").arg(i);
model.setStringList(list);
QApplication::processEvents();
@@ -1383,7 +1383,7 @@ void tst_QListView::scrollBarAsNeeded()
QStringList replacement;
for (i = 0; i < itemCount; ++i) {
- replacement << QString::fromAscii("Item %1").arg(i);
+ replacement << QString::fromLatin1("Item %1").arg(i);
}
model.setStringList(replacement);
@@ -2059,7 +2059,7 @@ void tst_QListView::taskQTBUG_12308_wrongFlowLayout()
QListWidgetItem *item = new QListWidgetItem();
item->setText(QString("Item %L1").arg(i));
lw.addItem(item);
- if (!item->text().contains(QString::fromAscii("1")))
+ if (!item->text().contains(QString::fromLatin1("1")))
item->setHidden(true);
}
lw.show();
diff --git a/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp b/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp
index 35e13e2f0a..afc24cd493 100644
--- a/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp
+++ b/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp
@@ -1667,6 +1667,8 @@ void tst_QListWidget::QTBUG14363_completerWithAnyKeyPressedEditTriggers()
listWidget.show();
listWidget.setCurrentItem(item);
QTest::qWaitForWindowShown(&listWidget);
+ listWidget.setFocus();
+ QCOMPARE(qApp->focusWidget(), &listWidget);
QTest::keyClick(listWidget.viewport(), Qt::Key_C);
diff --git a/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp b/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
index e1f175ad1b..6c082fe35f 100644
--- a/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
+++ b/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
@@ -210,6 +210,8 @@ private slots:
void indexRowSizeHint();
void addRowsWhileSectionsAreHidden();
void filterProxyModelCrash();
+ void renderToPixmap_data();
+ void renderToPixmap();
void styleOptionViewItem();
void keyboardNavigationWithDisabled();
@@ -2125,12 +2127,12 @@ void tst_QTreeView::resizeColumnToContents()
for (int r = 0; r < model.rowCount(); ++r) {
for (int c = 0; c < model.columnCount(); ++c) {
QModelIndex idx = model.index(r, c);
- model.setData(idx, QString::fromAscii("%1,%2").arg(r).arg(c) );
+ model.setData(idx, QString::fromLatin1("%1,%2").arg(r).arg(c) );
model.insertColumns(0, 2, idx);
model.insertRows(0, 6, idx);
for (int i = 0; i < 6; ++i) {
for (int j = 0; j < 2 ; ++j) {
- model.setData(model.index(i, j, idx), QString::fromAscii("child%1%2").arg(i).arg(j));
+ model.setData(model.index(i, j, idx), QString::fromLatin1("child%1%2").arg(i).arg(j));
}
}
}
@@ -2890,6 +2892,37 @@ void tst_QTreeView::filterProxyModelCrash()
view.repaint(); //used to crash
}
+void tst_QTreeView::renderToPixmap_data()
+{
+ QTest::addColumn<int>("row");
+ QTest::newRow("row-0") << 0;
+ QTest::newRow("row-1") << 1;
+}
+
+void tst_QTreeView::renderToPixmap()
+{
+ QFETCH(int, row);
+ PublicView view;
+ QStandardItemModel model;
+
+ model.appendRow(new QStandardItem("Spanning"));
+ model.appendRow(QList<QStandardItem*>() << new QStandardItem("Not") << new QStandardItem("Spanning"));
+
+ view.setModel(&model);
+ view.setFirstColumnSpanned(0, QModelIndex(), true);
+
+#ifdef QT_BUILD_INTERNAL
+ {
+ // We select the index at row=0 because it spans the
+ // column (regression test for an assert)
+ // We select the index at row=1 for coverage.
+ QItemSelection sel(model.index(row,0), model.index(row,1));
+ QRect rect;
+ view.aiv_priv()->renderToPixmap(sel.indexes(), &rect);
+ }
+#endif
+}
+
void tst_QTreeView::styleOptionViewItem()
{
class MyDelegate : public QStyledItemDelegate
@@ -2990,6 +3023,22 @@ void tst_QTreeView::styleOptionViewItem()
view.setFirstColumnSpanned(2, QModelIndex(), true);
view.setAlternatingRowColors(true);
+#ifdef QT_BUILD_INTERNAL
+ {
+ // Test the rendering to pixmap before painting the widget.
+ // The rendering to pixmap should not depend on having been
+ // painted already yet.
+ delegate.count = 0;
+ QItemSelection sel(model.index(0,0), model.index(0,modelColumns-1));
+ QRect rect;
+ view.aiv_priv()->renderToPixmap(sel.indexes(), &rect);
+ if (delegate.count != visibleColumns) {
+ qDebug() << rect << view.rect() << view.isVisible();
+ }
+ QTRY_COMPARE(delegate.count, visibleColumns);
+ }
+#endif
+
delegate.count = 0;
delegate.allCollapsed = true;
view.showMaximized();
@@ -3011,7 +3060,10 @@ void tst_QTreeView::styleOptionViewItem()
QItemSelection sel(model.index(0,0), model.index(0,modelColumns-1));
QRect rect;
view.aiv_priv()->renderToPixmap(sel.indexes(), &rect);
- QTRY_VERIFY(delegate.count == visibleColumns);
+ if (delegate.count != visibleColumns) {
+ qDebug() << rect << view.rect() << view.isVisible();
+ }
+ QTRY_COMPARE(delegate.count, visibleColumns);
#endif
//test dynamic models
diff --git a/tests/auto/widgets/kernel/kernel.pro b/tests/auto/widgets/kernel/kernel.pro
index cf909b7e87..e1c245d9d1 100644
--- a/tests/auto/widgets/kernel/kernel.pro
+++ b/tests/auto/widgets/kernel/kernel.pro
@@ -17,5 +17,3 @@ SUBDIRS=\
qshortcut \
SUBDIRS -= qsound
-
-mac: qwidget.CONFIG += no_check_target # crashes, see QTBUG-23695
diff --git a/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp b/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp
index 91ecbf23a2..288e41c6ef 100644
--- a/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp
+++ b/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp
@@ -605,8 +605,6 @@ public slots:
void tst_QApplication::quitOnLastWindowClosed()
{
-#ifndef Q_OS_MAC
- // Test hangs on Mac OS X, see QTBUG-24319
{
int argc = 0;
QApplication app(argc, 0, QApplication::GuiServer);
@@ -621,7 +619,6 @@ void tst_QApplication::quitOnLastWindowClosed()
// lastWindowClosed() signal should only be sent after the last dialog is closed
QCOMPARE(appSpy.count(), 2);
}
-#endif
{
int argc = 0;
QApplication app(argc, 0, QApplication::GuiServer);
@@ -1469,8 +1466,8 @@ void tst_QApplication::focusChanged()
QApplication::setActiveWindow(&parent1); // needs this on twm (focus follows mouse)
QCOMPARE(spy.count(), 1);
QCOMPARE(spy.at(0).count(), 2);
- old = qVariantValue<QWidget*>(spy.at(0).at(0));
- now = qVariantValue<QWidget*>(spy.at(0).at(1));
+ old = qvariant_cast<QWidget*>(spy.at(0).at(0));
+ now = qvariant_cast<QWidget*>(spy.at(0).at(1));
QVERIFY(now == &le1);
QVERIFY(now == QApplication::focusWidget());
QVERIFY(old == 0);
@@ -1479,8 +1476,8 @@ void tst_QApplication::focusChanged()
pb1.setFocus();
QCOMPARE(spy.count(), 1);
- old = qVariantValue<QWidget*>(spy.at(0).at(0));
- now = qVariantValue<QWidget*>(spy.at(0).at(1));
+ old = qvariant_cast<QWidget*>(spy.at(0).at(0));
+ now = qvariant_cast<QWidget*>(spy.at(0).at(1));
QVERIFY(now == &pb1);
QVERIFY(now == QApplication::focusWidget());
QVERIFY(old == &le1);
@@ -1488,8 +1485,8 @@ void tst_QApplication::focusChanged()
lb1.setFocus();
QCOMPARE(spy.count(), 1);
- old = qVariantValue<QWidget*>(spy.at(0).at(0));
- now = qVariantValue<QWidget*>(spy.at(0).at(1));
+ old = qvariant_cast<QWidget*>(spy.at(0).at(0));
+ now = qvariant_cast<QWidget*>(spy.at(0).at(1));
QVERIFY(now == &lb1);
QVERIFY(now == QApplication::focusWidget());
QVERIFY(old == &pb1);
@@ -1497,8 +1494,8 @@ void tst_QApplication::focusChanged()
lb1.clearFocus();
QCOMPARE(spy.count(), 1);
- old = qVariantValue<QWidget*>(spy.at(0).at(0));
- now = qVariantValue<QWidget*>(spy.at(0).at(1));
+ old = qvariant_cast<QWidget*>(spy.at(0).at(0));
+ now = qvariant_cast<QWidget*>(spy.at(0).at(1));
QVERIFY(now == 0);
QVERIFY(now == QApplication::focusWidget());
QVERIFY(old == &lb1);
@@ -1516,8 +1513,8 @@ void tst_QApplication::focusChanged()
parent2.show();
QApplication::setActiveWindow(&parent2); // needs this on twm (focus follows mouse)
QVERIFY(spy.count() > 0); // one for deactivation, one for activation on Windows
- old = qVariantValue<QWidget*>(spy.at(spy.count()-1).at(0));
- now = qVariantValue<QWidget*>(spy.at(spy.count()-1).at(1));
+ old = qvariant_cast<QWidget*>(spy.at(spy.count()-1).at(0));
+ now = qvariant_cast<QWidget*>(spy.at(spy.count()-1).at(1));
QVERIFY(now == &le2);
QVERIFY(now == QApplication::focusWidget());
QVERIFY(old == 0);
@@ -1550,8 +1547,8 @@ void tst_QApplication::focusChanged()
QVERIFY(now == QApplication::focusWidget());
} else {
QVERIFY(spy.count() > 0);
- old = qVariantValue<QWidget*>(spy.at(0).at(0));
- now = qVariantValue<QWidget*>(spy.at(0).at(1));
+ old = qvariant_cast<QWidget*>(spy.at(0).at(0));
+ now = qvariant_cast<QWidget*>(spy.at(0).at(1));
QVERIFY(now == &pb2);
QVERIFY(now == QApplication::focusWidget());
QVERIFY(old == &le2);
@@ -1564,8 +1561,8 @@ void tst_QApplication::focusChanged()
} else {
tab.simulate(now);
QVERIFY(spy.count() > 0);
- old = qVariantValue<QWidget*>(spy.at(0).at(0));
- now = qVariantValue<QWidget*>(spy.at(0).at(1));
+ old = qvariant_cast<QWidget*>(spy.at(0).at(0));
+ now = qvariant_cast<QWidget*>(spy.at(0).at(1));
QVERIFY(now == &le2);
QVERIFY(now == QApplication::focusWidget());
QVERIFY(old == &pb2);
@@ -1578,8 +1575,8 @@ void tst_QApplication::focusChanged()
} else {
backtab.simulate(now);
QVERIFY(spy.count() > 0);
- old = qVariantValue<QWidget*>(spy.at(0).at(0));
- now = qVariantValue<QWidget*>(spy.at(0).at(1));
+ old = qvariant_cast<QWidget*>(spy.at(0).at(0));
+ now = qvariant_cast<QWidget*>(spy.at(0).at(1));
QVERIFY(now == &pb2);
QVERIFY(now == QApplication::focusWidget());
QVERIFY(old == &le2);
@@ -1594,8 +1591,8 @@ void tst_QApplication::focusChanged()
} else {
backtab.simulate(now);
QVERIFY(spy.count() > 0);
- old = qVariantValue<QWidget*>(spy.at(0).at(0));
- now = qVariantValue<QWidget*>(spy.at(0).at(1));
+ old = qvariant_cast<QWidget*>(spy.at(0).at(0));
+ now = qvariant_cast<QWidget*>(spy.at(0).at(1));
QVERIFY(now == &le2);
QVERIFY(now == QApplication::focusWidget());
QVERIFY(old == &pb2);
@@ -1608,8 +1605,8 @@ void tst_QApplication::focusChanged()
QVERIFY(now == QApplication::focusWidget());
} else {
QVERIFY(spy.count() > 0);
- old = qVariantValue<QWidget*>(spy.at(0).at(0));
- now = qVariantValue<QWidget*>(spy.at(0).at(1));
+ old = qvariant_cast<QWidget*>(spy.at(0).at(0));
+ now = qvariant_cast<QWidget*>(spy.at(0).at(1));
QVERIFY(now == &pb2);
QVERIFY(now == QApplication::focusWidget());
QVERIFY(old == &le2);
@@ -1617,8 +1614,8 @@ void tst_QApplication::focusChanged()
click.simulate(old);
QVERIFY(spy.count() > 0);
- old = qVariantValue<QWidget*>(spy.at(0).at(0));
- now = qVariantValue<QWidget*>(spy.at(0).at(1));
+ old = qvariant_cast<QWidget*>(spy.at(0).at(0));
+ now = qvariant_cast<QWidget*>(spy.at(0).at(1));
QVERIFY(now == &le2);
QVERIFY(now == QApplication::focusWidget());
QVERIFY(old == &pb2);
@@ -1632,10 +1629,10 @@ void tst_QApplication::focusChanged()
//on windows, the change of focus is made in 2 steps
//(the focusChanged SIGNAL is emitted twice)
if (spy.count()==1)
- old = qVariantValue<QWidget*>(spy.at(spy.count()-1).at(0));
+ old = qvariant_cast<QWidget*>(spy.at(spy.count()-1).at(0));
else
- old = qVariantValue<QWidget*>(spy.at(spy.count()-2).at(0));
- now = qVariantValue<QWidget*>(spy.at(spy.count()-1).at(1));
+ old = qvariant_cast<QWidget*>(spy.at(spy.count()-2).at(0));
+ now = qvariant_cast<QWidget*>(spy.at(spy.count()-1).at(1));
QVERIFY(now == &le1);
QVERIFY(now == QApplication::focusWidget());
QVERIFY(old == &le2);
diff --git a/tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp b/tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp
index c43ea065f3..6b424ab4b4 100644
--- a/tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp
+++ b/tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp
@@ -540,7 +540,7 @@ public:
}
private:
void init(int numPixels = -1){
- setText(QString::fromAscii("(%1,%2)").arg(sh.width()).arg(sh.height()));
+ setText(QString::fromLatin1("(%1,%2)").arg(sh.width()).arg(sh.height()));
setFrameStyle(QFrame::Box | QFrame::Plain);
setNumberOfPixels(numPixels);
}
@@ -797,12 +797,12 @@ void tst_QGridLayout::minMaxSize_data()
<< SizeInfo(QPoint(10, 10), QSize( 90, 90), QSize(100,100))
<< SizeInfo(QPoint(10 + 100 + 1, 10), QSize( 90, 90))
);
- QTest::newRow("2x1 grid, extend to minimumSize, motif") << QString::fromAscii("motif") << 2 << 1
+ QTest::newRow("2x1 grid, extend to minimumSize, motif") << QString::fromLatin1("motif") << 2 << 1
<< int(QSizePolicy::Preferred) << QSize() << (SizeInfoList()
<< SizeInfo(QPoint(11, 11), QSize( 90, 90), QSize(100,100))
<< SizeInfo(QPoint(11 + 100 + 6, 11), QSize( 90, 90))
);
- QTest::newRow("2x1 grid, extend to minimumSize, windows") << QString::fromAscii("windows") << 2 << 1
+ QTest::newRow("2x1 grid, extend to minimumSize, windows") << QString::fromLatin1("windows") << 2 << 1
<< int(QSizePolicy::Preferred) << QSize() << (SizeInfoList()
<< SizeInfo(QPoint(11, 11), QSize( 90, 90), QSize(100,100))
<< SizeInfo(QPoint(11 + 100 + 6, 11), QSize( 90, 90))
@@ -1430,7 +1430,7 @@ void tst_QGridLayout::layoutSpacingImplementation_data()
w->setLayout(layout);
int pw = up->sizeHint().width();
int ph = up->sizeHint().height();
- QByteArray testName = QString::fromAscii("arrowpad with %1 empty rows, %2 empty columns").arg(yoff).arg(xoff).toLatin1();
+ QByteArray testName = QString::fromLatin1("arrowpad with %1 empty rows, %2 empty columns").arg(yoff).arg(xoff).toLatin1();
QTest::newRow(testName.data())
<< w << (PointList()
<< QPoint(0 + pw + 5, 3)
diff --git a/tests/auto/widgets/kernel/qshortcut/tst_qshortcut.cpp b/tests/auto/widgets/kernel/qshortcut/tst_qshortcut.cpp
index 61efb6e3f3..971f60bb3e 100644
--- a/tests/auto/widgets/kernel/qshortcut/tst_qshortcut.cpp
+++ b/tests/auto/widgets/kernel/qshortcut/tst_qshortcut.cpp
@@ -580,8 +580,8 @@ void tst_QShortcut::text_data()
Qt::UNICODE_ACCEL + Qt::Key_K
*/
/* see comments above on the #ifdef'ery */
- QTest::newRow("T06 - slot1") << SetupAccel << TriggerSlot1 << QString("\x0C5")<< 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << NoResult;
- QTest::newRow("T07 - slot2") << SetupAccel << TriggerSlot2 << QString("Shift+\x0C5")<< 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << NoResult;
+ QTest::newRow("T06 - slot1") << SetupAccel << TriggerSlot1 << QString::fromLatin1("\x0C5")<< 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << NoResult;
+ QTest::newRow("T07 - slot2") << SetupAccel << TriggerSlot2 << QString::fromLatin1("Shift+\x0C5")<< 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << NoResult;
QTest::newRow("T08 - slot2") << SetupAccel << TriggerSlot1 << QString("K") << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << NoResult;
QTest::newRow("T:Qt::Key_aring") << TestAccel << NoWidget << QString("") << int(Qt::Key_Aring) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << Slot1Triggered;
QTest::newRow("T:Qt::Key_Aring") << TestAccel << NoWidget << QString("") << int(Qt::SHIFT+Qt::Key_Aring) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << Slot2Triggered;
@@ -1204,25 +1204,25 @@ void tst_QShortcut::sendKeyEvents(QWidget *w, int k1, QChar c1, int k2, QChar c2
k4 &= ~Qt::MODIFIER_MASK;
- if (k1 || c1.toAscii()) {
+ if (k1 || c1.toLatin1()) {
QString c(c1.unicode() == QChar::Null ? QString() : QString(c1));
QTest::sendKeyEvent(QTest::Press, w, static_cast<Qt::Key>(k1), c, b1);
QTest::sendKeyEvent(QTest::Release, w, static_cast<Qt::Key>(k1), c, b1);
}
- if (k2 || c2.toAscii()) {
+ if (k2 || c2.toLatin1()) {
QString c(c2.unicode() == QChar::Null ? QString() : QString(c2));
QTest::sendKeyEvent(QTest::Press, w, static_cast<Qt::Key>(k2), c, b2);
QTest::sendKeyEvent(QTest::Release, w, static_cast<Qt::Key>(k2), c, b2);
}
- if (k3 || c3.toAscii()) {
+ if (k3 || c3.toLatin1()) {
QString c(c3.unicode() == QChar::Null ? QString() : QString(c3));
QTest::sendKeyEvent(QTest::Press, w, static_cast<Qt::Key>(k3), c, b3);
QTest::sendKeyEvent(QTest::Release, w, static_cast<Qt::Key>(k3), c, b3);
}
- if (k4 || c4.toAscii()) {
+ if (k4 || c4.toLatin1()) {
QString c(c4.unicode() == QChar::Null ? QString() : QString(c4));
QTest::sendKeyEvent(QTest::Press, w, static_cast<Qt::Key>(k4), c, b4);
QTest::sendKeyEvent(QTest::Release, w, static_cast<Qt::Key>(k4), c, b4);
diff --git a/tests/auto/widgets/kernel/qwidget/qwidget.pro b/tests/auto/widgets/kernel/qwidget/qwidget.pro
index 23fd2459bf..678796d2e5 100644
--- a/tests/auto/widgets/kernel/qwidget/qwidget.pro
+++ b/tests/auto/widgets/kernel/qwidget/qwidget.pro
@@ -21,4 +21,4 @@ x11 {
!wince*:win32: LIBS += -luser32 -lgdi32
-CONFIG+=insignificant_test
+CONFIG+=insignificant_test # QTBUG-25300, QTBUG-23695
diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
index 0c769d55da..6e88c6e74e 100644
--- a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
+++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
@@ -66,6 +66,7 @@
#include <QtGui/qpaintengine.h>
#include <QtGui/qbackingstore.h>
#include <QtGui/qguiapplication.h>
+#include <QtGui/qscreen.h>
#include <qmenubar.h>
#include <qtableview.h>
#include <qtreewidget.h>
@@ -73,17 +74,13 @@
#include <QtWidgets/QGraphicsView>
#include <QtWidgets/QGraphicsProxyWidget>
-#ifdef Q_WS_QWS
-# include <qscreen_qws.h>
-#endif
-
#if defined(Q_OS_MAC)
#include "tst_qwidget_mac_helpers.h" // Abstract the ObjC stuff out so not everyone must run an ObjC++ compile.
#endif
#include <QtTest/QtTest>
-#if defined(Q_OS_WIN)
+#ifdef Q_OS_WIN
# include <QtCore/qt_windows.h>
# include <QtGui/private/qguiapplication_p.h>
# include <QtGui/QPlatformNativeInterface>
@@ -98,27 +95,32 @@ static HWND winHandleOf(const QWidget *w)
qWarning() << "Cannot obtain native handle for " << w;
return 0;
}
-#endif
-#if defined(Q_WS_WIN)
-# include <qt_windows.h>
-# if !defined(Q_OS_WINCE)
-#define Q_CHECK_PAINTEVENTS \
+# ifdef Q_OS_WINCE
+# define Q_CHECK_PAINTEVENTS
+# ifdef Q_OS_WINCE_WM
+# include <qguifunctions_wince.h>
+// taken from qguifunctions_wce.cpp
+# define SPI_GETPLATFORMTYPE 257
+static bool qt_wince_is_platform(const QString &platformString) {
+ wchar_t tszPlatform[64];
+ if (SystemParametersInfo(SPI_GETPLATFORMTYPE,
+ sizeof(tszPlatform)/sizeof(*tszPlatform),tszPlatform,0))
+ if (0 == _tcsicmp(reinterpret_cast<const wchar_t *> (platformString.utf16()), tszPlatform))
+ return true;
+ return false;
+}
+static inline bool qt_wince_is_smartphone() { return qt_wince_is_platform(QString::fromLatin1("Smartphone")); }
+# endif // Q_OS_WINCE_WM
+# else // Q_OS_WINCE
+# define Q_CHECK_PAINTEVENTS \
if (::SwitchDesktop(::GetThreadDesktop(::GetCurrentThreadId())) == 0) \
QSKIP("desktop is not visible, this test would fail");
-# else
-# define Q_CHECK_PAINTEVENTS
-# endif
-#elif defined(Q_WS_X11)
-# include <private/qt_x11_p.h>
-# include <qx11info_x11.h>
-#elif defined(Q_WS_QWS)
-# include <qwindowsystem_qws.h>
-#endif
+# endif // !Q_OS_WINCE
+#else // Q_OS_WIN
+# define Q_CHECK_PAINTEVENTS
+#endif // else Q_OS_WIN
-#if !defined(Q_WS_WIN)
-#define Q_CHECK_PAINTEVENTS
-#endif
#if defined(Q_OS_WINCE_WM)
#include <qguifunctions_wince.h>
@@ -148,11 +150,6 @@ bool macHasAccessToWindowsServer()
}
#endif
-
-#if defined(Bool)
-#undef Bool
-#endif
-
class tst_QWidget : public QObject
{
Q_OBJECT
@@ -187,24 +184,18 @@ private slots:
void focusChainOnHide();
void focusChainOnReparent();
void setTabOrder();
-#ifdef Q_WS_WIN
+#ifdef Q_OS_WIN
void activation();
#endif
void reparent();
-#ifndef Q_WS_X11
void windowState();
-#endif
void showMaximized();
void showFullScreen();
void showMinimized();
void showMinimizedKeepsFocus();
-#ifndef Q_WS_QWS
void icon();
-#endif
void hideWhenFocusWidgetIsChild();
-#ifndef Q_OS_IRIX
void normalGeometry();
-#endif
void setGeometry();
#ifndef Q_OS_WINCE
void windowOpacity();
@@ -215,11 +206,9 @@ private slots:
void stackUnder();
#endif
void testContentsPropagation();
-#ifndef Q_OS_IRIX
void saveRestoreGeometry();
void restoreVersion1Geometry_data();
void restoreVersion1Geometry();
-#endif
void widgetAt();
#ifdef Q_OS_MAC
@@ -257,17 +246,13 @@ private slots:
void scroll();
#endif
-#ifndef Q_WS_X11
// tests QWidget::setGeometry()
void setWindowGeometry_data();
void setWindowGeometry();
-#endif
-#if !defined(Q_WS_X11) && !defined(Q_OS_IRIX)
// tests QWidget::move() and resize()
void windowMoveResize_data();
void windowMoveResize();
-#endif
void moveChild_data();
void moveChild();
@@ -277,12 +262,9 @@ private slots:
void subtractOpaqueSiblings();
#endif
-#ifdef Q_WS_WIN
- void getDC();
-#ifndef Q_OS_WINCE
+#if defined (Q_OS_WIN) && !defined(Q_OS_WINCE)
void setGeometry_win();
#endif
-#endif
void setLocale();
void deleteStyle();
@@ -291,11 +273,10 @@ private slots:
void setCursor();
void setToolTip();
void testWindowIconChangeEventPropagation();
-#ifdef Q_WS_X11
+
void minAndMaxSizeWithX11BypassWindowManagerHint();
- void showHideShow();
+ void showHideShowX11();
void clean_qt_x11_enforce_cursor();
-#endif
void childEvents();
void render();
@@ -317,39 +298,30 @@ private slots:
void setContentsMargins();
-#ifndef Q_OS_IRIX
void moveWindowInShowEvent_data();
void moveWindowInShowEvent();
-#endif
void repaintWhenChildDeleted();
void hideOpaqueChildWhileHidden();
-#if !defined(Q_OS_WINCE) && !defined(Q_WS_QWS)
+#if !defined(Q_OS_WINCE)
void updateWhileMinimized();
#endif
-#if defined(Q_WS_WIN) || defined(Q_WS_X11)
void alienWidgets();
-#endif
void adjustSize();
void adjustSize_data();
void updateGeometry();
void updateGeometry_data();
void sendUpdateRequestImmediately();
-#ifndef Q_OS_IRIX
void doubleRepaint();
-#endif
void resizeInPaintEvent();
void opaqueChildren();
void setMaskInResizeEvent();
void moveInResizeEvent();
-#if defined(Q_WS_WIN) || defined(Q_WS_X11)
- // We don't support immediate repaint right after show on
- // other platforms. Must be compatible with Qt 4.3.
void immediateRepaintAfterShow();
void immediateRepaintAfterInvalidateBuffer();
-#endif
+
void effectiveWinId();
void effectiveWinId2();
void customDpi();
@@ -358,15 +330,13 @@ private slots:
void quitOnCloseAttribute();
void moveRect();
-#if defined (Q_WS_WIN)
+#if defined (Q_OS_WIN)
void gdiPainting();
void paintOnScreenPossible();
#endif
void reparentStaticWidget();
void QTBUG6883_reparentStaticWidget2();
-#ifdef Q_WS_QWS
- void updateOutsideSurfaceClip();
-#endif
+
void translucentWidget();
void setClearAndResizeMask();
@@ -415,21 +385,13 @@ private slots:
private:
bool ensureScreenSize(int width, int height);
QWidget *testWidget;
+
+ const QString m_platform;
};
bool tst_QWidget::ensureScreenSize(int width, int height)
{
QSize available;
-#ifdef Q_WS_QWS
- available = QDesktopWidget().availableGeometry().size();
- if (available.width() < width || available.height() < height) {
- QScreen *screen = QScreen::instance();
- if (!screen)
- return false;
- screen->setMode(width, height, screen->depth());
- }
-#endif // Q_WS_QWS
-
available = QDesktopWidget().availableGeometry().size();
return (available.width() >= width && available.height() >= height);
}
@@ -455,9 +417,6 @@ void tst_QWidget::getSetCheck()
obj1.setMinimumWidth(INT_MIN);
QCOMPARE(obj1.minimumWidth(), 0); // A widgets width can never be less than 0
obj1.setMinimumWidth(INT_MAX);
-#ifndef Q_WS_QWS //QWS doesn't allow toplevels to be bigger than the screen
- QCOMPARE(obj1.minimumWidth(), QWIDGETSIZE_MAX); // The largest minimum size should only be as big as the maximium
-#endif
child1.setMinimumWidth(0);
QCOMPARE(child1.minimumWidth(), 0);
@@ -473,9 +432,6 @@ void tst_QWidget::getSetCheck()
obj1.setMinimumHeight(INT_MIN);
QCOMPARE(obj1.minimumHeight(), 0); // A widgets height can never be less than 0
obj1.setMinimumHeight(INT_MAX);
-#ifndef Q_WS_QWS //QWS doesn't allow toplevels to be bigger than the screen
- QCOMPARE(obj1.minimumHeight(), QWIDGETSIZE_MAX); // The largest minimum size should only be as big as the maximium
-#endif
child1.setMinimumHeight(0);
QCOMPARE(child1.minimumHeight(), 0);
@@ -577,15 +533,14 @@ void tst_QWidget::getSetCheck()
QCOMPARE(true, obj1.autoFillBackground());
delete var1;
-#if defined (Q_WS_WIN) && !defined(Q_OS_WINCE)
+#if defined (Q_OS_WIN) && !defined(Q_OS_WINCE)
obj1.setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint);
- HWND handle = obj1.winId();
- long flags = GetWindowLong(handle, GWL_STYLE);
- QVERIFY(flags & WS_POPUP);
+ const HWND handle = winHandleOf(&obj1);
+ QVERIFY(GetWindowLong(handle, GWL_STYLE) & WS_POPUP);
#endif
}
-tst_QWidget::tst_QWidget()
+tst_QWidget::tst_QWidget() : m_platform(qApp->platformName().toLower())
{
QFont font;
font.setBold(true);
@@ -1685,11 +1640,7 @@ void tst_QWidget::setTabOrder()
container.show();
container.activateWindow();
qApp->setActiveWindow(&container);
-#ifdef Q_WS_X11
- QTest::qWaitForWindowShown(&container);
- QTest::qWait(50);
-#endif
-
+ QTest::qWaitForWindowShown(container.windowHandle());
QTest::qWait(100);
QTRY_VERIFY(lastEdit->hasFocus());
@@ -1703,7 +1654,7 @@ void tst_QWidget::setTabOrder()
QVERIFY(firstEdit->hasFocus());
}
-#ifdef Q_WS_WIN
+#ifdef Q_OS_WIN
void tst_QWidget::activation()
{
Q_CHECK_PAINTEVENTS
@@ -1740,7 +1691,7 @@ void tst_QWidget::activation()
QVERIFY(qApp->activeWindow() == &widget1);
widget2.showNormal();
QTest::qWait(waitTime);
-#if defined(Q_WS_WIN) && !defined(Q_OS_WINCE)
+#ifndef Q_OS_WINCE
if (QSysInfo::WindowsVersion >= QSysInfo::WV_VISTA)
QEXPECT_FAIL("", "MS introduced new behavior after XP", Continue);
#endif
@@ -1750,12 +1701,12 @@ void tst_QWidget::activation()
QTest::qWait(waitTime);
QVERIFY(qApp->activeWindow() == &widget1);
}
-#endif
+#endif // Q_OS_WIN
-// Many window managers do not support window state properly, which causes this test to fail.
-#ifndef Q_WS_X11
void tst_QWidget::windowState()
{
+ if (m_platform == QStringLiteral("xcb"))
+ QSKIP("X11: Many window managers do not support window state properly, which causes this test to fail.");
#ifdef Q_OS_WINCE_WM
QPoint pos(500, 500);
QSize size(200, 200);
@@ -1873,7 +1824,6 @@ void tst_QWidget::windowState()
QTRY_COMPARE(widget1.pos(), pos);
QTRY_COMPARE(widget1.size(), size);
}
-#endif
void tst_QWidget::showMaximized()
{
@@ -2217,13 +2167,7 @@ void tst_QWidget::showMinimizedKeepsFocus()
window.showMinimized();
QTest::qWait(30);
QTRY_VERIFY(window.isMinimized());
-#ifdef Q_WS_QWS
- QEXPECT_FAIL("", "QWS does not implement showMinimized()", Continue);
-#endif
QCOMPARE(window.focusWidget(), static_cast<QWidget*>(0));
-#ifdef Q_WS_QWS
- QEXPECT_FAIL("", "QWS does not implement showMinimized()", Continue);
-#endif
QTRY_COMPARE(qApp->focusWidget(), static_cast<QWidget*>(0));
window.showNormal();
@@ -2281,17 +2225,16 @@ void tst_QWidget::reparent()
child.setGeometry(childPos.x(), childPos.y(), child.width(), child.height());
child.show();
-#ifdef Q_WS_X11
- // On X11, the window manager will apply NorthWestGravity rules to 'child', which
- // means the top-left corner of the window frame will be placed at 'childPos',
- // causing this test to fail
-#else
+ if (m_platform == QStringLiteral("xcb"))
+ QEXPECT_FAIL("", "On X11, the window manager will apply NorthWestGravity rules to 'child', which"
+ " means the top-left corner of the window frame will be placed at 'childPos'"
+ " causing this test to fail.", Continue);
+
QCOMPARE(child.geometry().topLeft(), childPos);
-#endif
QTRY_COMPARE(childTLW.pos(), tlwPos);
// This following part of the test only makes sense on Windows.
-#ifdef Q_WS_WIN
+#ifdef Q_OS_WIN
QWidget childTLWChild(&childTLW);
childTLWChild.setObjectName("childTLWChild");
@@ -2314,17 +2257,17 @@ void tst_QWidget::reparent()
QWidget grandChildTLWChild(&grandChildTLW);
grandChildTLWChild.setObjectName("grandChildTLWChild");
- QVERIFY(IsWindow(childTLW.winId()));
- QVERIFY(IsWindow(childTLWChild.winId()));
- QVERIFY(IsWindow(grandChildTLW.winId()));
- QVERIFY(IsWindow(grandChildTLWChild.winId()));
+ QVERIFY(IsWindow(winHandleOf(&childTLW)));
+ QVERIFY(IsWindow(winHandleOf(&childTLWChild)));
+ QVERIFY(IsWindow(winHandleOf(&grandChildTLW)));
+ QVERIFY(IsWindow(winHandleOf(&grandChildTLWChild)));
parent.show();
- QVERIFY(IsWindow(childTLW.winId()));
- QVERIFY(IsWindow(childTLWChild.winId()));
- QVERIFY(IsWindow(grandChildTLW.winId()));
- QVERIFY(IsWindow(grandChildTLWChild.winId()));
+ QVERIFY(IsWindow(winHandleOf(&childTLW)));
+ QVERIFY(IsWindow(winHandleOf(&childTLWChild)));
+ QVERIFY(IsWindow(winHandleOf(&grandChildTLW)));
+ QVERIFY(IsWindow(winHandleOf(&grandChildTLWChild)));
child.setParent(&parent);
child.move(10,10);
@@ -2333,16 +2276,15 @@ void tst_QWidget::reparent()
// this appears to stabelize results
qApp->processEvents();
- QVERIFY(IsWindow(childTLW.winId()));
- QVERIFY(IsWindow(childTLWChild.winId()));
+ QVERIFY(IsWindow(winHandleOf(&childTLW)));
+ QVERIFY(IsWindow(winHandleOf(&childTLWChild)));
- QVERIFY(IsWindow(grandChildTLW.winId()));
- QVERIFY(IsWindow(grandChildTLWChild.winId()));
+ QVERIFY(IsWindow(winHandleOf(&grandChildTLW)));
+ QVERIFY(IsWindow(winHandleOf(&grandChildTLWChild)));
#endif
}
// Qt/Embedded does it differently.
-#ifndef Q_WS_QWS
void tst_QWidget::icon()
{
QPixmap p(20,20);
@@ -2357,7 +2299,6 @@ void tst_QWidget::icon()
testWidget->showNormal();
QVERIFY(!testWidget->windowIcon().isNull());
}
-#endif
void tst_QWidget::hideWhenFocusWidgetIsChild()
{
@@ -2378,10 +2319,9 @@ void tst_QWidget::hideWhenFocusWidgetIsChild()
edit->setFocus();
qApp->processEvents();
QString actualFocusWidget, expectedFocusWidget;
-#ifdef Q_WS_X11
- if (!qApp->focusWidget())
- QSKIP("Your window manager is too broken for this test");
-#endif
+ if (!qApp->focusWidget() && m_platform == QStringLiteral("xcb"))
+ QSKIP("X11: Your window manager is too broken for this test");
+
QVERIFY(qApp->focusWidget());
actualFocusWidget.sprintf("%p %s %s", qApp->focusWidget(), qApp->focusWidget()->objectName().toLatin1().constData(), qApp->focusWidget()->metaObject()->className());
expectedFocusWidget.sprintf("%p %s %s", edit, edit->objectName().toLatin1().constData(), edit->metaObject()->className());
@@ -2397,8 +2337,6 @@ void tst_QWidget::hideWhenFocusWidgetIsChild()
delete parentWidget;
}
-// 4DWM issues on IRIX makes this test fail.
-#ifndef Q_OS_IRIX
void tst_QWidget::normalGeometry()
{
QWidget parent;
@@ -2500,7 +2438,6 @@ void tst_QWidget::normalGeometry()
QTest::qWait(10);
QTRY_COMPARE(parent.normalGeometry(), geom);
}
-#endif
void tst_QWidget::setGeometry()
{
@@ -2835,17 +2772,13 @@ void tst_QWidget::stackUnder()
parent->show();
QTest::qWaitForWindowShown(parent);
QTest::qWait(10);
-#ifdef Q_WS_QWS
- QApplication::sendPostedEvents(); //glib workaround
-#endif
-
QList<QObject *> list1;
list1 << child1 << child2 << child3 << child4;
QVERIFY(parent->children() == list1);
foreach (UpdateWidget *child, allChildren) {
int expectedPaintEvents = child == child4 ? 1 : 0;
-#if defined(Q_WS_WIN) || defined(Q_OS_MAC)
+#if defined(Q_OS_WIN) || defined(Q_OS_MAC)
if (expectedPaintEvents == 1 && child->numPaintEvents == 2)
QEXPECT_FAIL(0, "Mac and Windows issues double repaints for Z-Order change", Continue);
#endif
@@ -2944,13 +2877,9 @@ protected:
void tst_QWidget::testContentsPropagation()
{
ContentsPropagationWidget widget;
-#ifdef Q_WS_QWS
- widget.resize(500,500);
-#else
widget.setFixedSize(500, 500);
-#endif
widget.setContentsPropagation(false);
- QPixmap widgetSnapshot = QPixmap::grabWidget(&widget);
+ QPixmap widgetSnapshot = widget.grab(QRect(QPoint(0, 0), QSize(-1, -1)));
QPixmap correct(500, 500);
drawPolygon(&correct, 500, 500);
@@ -2960,7 +2889,7 @@ void tst_QWidget::testContentsPropagation()
QVERIFY(widgetSnapshot.toImage() != correct.toImage());
widget.setContentsPropagation(true);
- widgetSnapshot = QPixmap::grabWidget(&widget);
+ widgetSnapshot = widgetSnapshot = widget.grab(QRect(QPoint(0, 0), QSize(-1, -1)));
//widgetSnapshot.save("snap2.png", "PNG");
QCOMPARE(widgetSnapshot, correct);
@@ -2970,8 +2899,7 @@ void tst_QWidget::testContentsPropagation()
Test that saving and restoring window geometry with
saveGeometry() and restoreGeometry() works.
*/
-// 4DWM issues on IRIX makes this test fail.
-#ifndef Q_OS_IRIX
+
void tst_QWidget::saveRestoreGeometry()
{
const QPoint position(100, 100);
@@ -3100,10 +3028,7 @@ void tst_QWidget::saveRestoreGeometry()
QTRY_COMPARE(widget.geometry(), geom);
}
}
-#endif
-// 4DWM issues on IRIX makes this test fail.
-#ifndef Q_OS_IRIX
void tst_QWidget::restoreVersion1Geometry_data()
{
QTest::addColumn<QString>("fileName");
@@ -3178,9 +3103,7 @@ void tst_QWidget::restoreVersion1Geometry()
widgetToSave.move(expectedPosition);
widgetToSave.resize(expectedSize);
widgetToSave.show();
-#ifdef Q_WS_X11
- qt_x11_wait_for_window_manager(&widget);
-#endif
+ QTest::qWaitForWindowShown(widget.windowHandle());
QTest::qWait(500); // stabilize
widgetToSave.setWindowState(Qt::WindowStates(expectedWindowState));
QTest::qWait(500); // stabilize
@@ -3195,7 +3118,6 @@ void tst_QWidget::restoreVersion1Geometry()
}
#endif
}
-#endif
void tst_QWidget::widgetAt()
{
@@ -3278,57 +3200,6 @@ void tst_QWidget::widgetAt()
delete w1;
}
-#if defined(Q_WS_X11)
-bool getProperty(Display *display, Window target, Atom type, Atom property,
- unsigned char** data, unsigned long* count)
-{
- Atom atom_return;
- int size;
- unsigned long nitems, bytes_left;
-
- int ret = XGetWindowProperty(display, target, property,
- 0l, 1l, false,
- type, &atom_return, &size,
- &nitems, &bytes_left, data);
- if (ret != Success || nitems < 1)
- return false;
-
- if (bytes_left != 0) {
- XFree(*data);
- unsigned long remain = ((size / 8) * nitems) + bytes_left;
- ret = XGetWindowProperty(display, target,
- property, 0l, remain, false,
- type, &atom_return, &size,
- &nitems, &bytes_left, data);
- if (ret != Success)
- return false;
- }
-
- *count = nitems;
- return true;
-}
-
-QString textPropertyToString(Display *display, XTextProperty& text_prop)
-{
- QString ret;
- if (text_prop.value && text_prop.nitems > 0) {
- if (text_prop.encoding == XA_STRING) {
- ret = reinterpret_cast<char *>(text_prop.value);
- } else {
- text_prop.nitems = strlen(reinterpret_cast<char *>(text_prop.value));
- char **list;
- int num;
- if (XmbTextPropertyToTextList(display, &text_prop, &list, &num) == Success
- && num > 0 && *list) {
- ret = QString::fromLocal8Bit(*list);
- XFreeStringList(list);
- }
- }
- }
- return ret;
-}
-#endif
-
void tst_QWidget::task110173()
{
QWidget w;
@@ -3491,7 +3362,7 @@ public:
*/
bool verifyWidgetMask(QWidget *widget, QRect mask)
{
- const QImage image = QPixmap::grabWindow(widget->winId()).toImage();
+ const QImage image = widget->grab(QRect(QPoint(0, 0), widget->size())).toImage();
const QImage masked = image.copy(mask);
QImage red(masked);
@@ -3644,7 +3515,7 @@ void tst_QWidget::optimizedResizeMove()
void tst_QWidget::optimizedResize_topLevel()
{
-#if defined(Q_OS_MAC) || defined(Q_WS_QWS)
+#if defined(Q_OS_MAC)
QSKIP("We do not yet have static contents support for *top-levels* on this platform");
#endif
@@ -3659,7 +3530,7 @@ void tst_QWidget::optimizedResize_topLevel()
topLevel.partial = false;
topLevel.paintedRegion = QRegion();
-#ifndef Q_WS_WIN
+#ifndef Q_OS_WIN
topLevel.resize(topLevel.size() + QSize(10, 10));
#else
// Static contents does not work when programmatically resizing
@@ -3669,7 +3540,7 @@ void tst_QWidget::optimizedResize_topLevel()
// WM_RESIZE in QApplication). This is a corner case, though.
// See task 243708
const QRect frame = topLevel.frameGeometry();
- MoveWindow(topLevel.winId(), frame.x(), frame.y(),
+ MoveWindow(winHandleOf(&topLevel), frame.x(), frame.y(),
frame.width() + 10, frame.height() + 10,
true);
#endif
@@ -3709,28 +3580,10 @@ void tst_QWidget::childDeletesItsSibling()
}
-#ifdef Q_WS_QWS
-# define SET_SAFE_SIZE(w) \
- do { \
- QSize safeSize(qt_screen->width() - 250, qt_screen->height() - 250); \
- if (!safeSize.isValid()) \
- QSKIP("Screen size too small"); \
- if (defaultSize.width() > safeSize.width() || defaultSize.height() > safeSize.height()) { \
- defaultSize = safeSize; \
- w.resize(defaultSize); \
- w.setAttribute(Qt::WA_Resized, false); \
- } \
- } while (false)
-#else
-# define SET_SAFE_SIZE(w)
-#endif
-
-
void tst_QWidget::setMinimumSize()
{
QWidget w;
QSize defaultSize = w.size();
- SET_SAFE_SIZE(w);
w.setMinimumSize(defaultSize + QSize(100, 100));
QCOMPARE(w.size(), defaultSize + QSize(100, 100));
@@ -3760,7 +3613,6 @@ void tst_QWidget::setMaximumSize()
{
QWidget w;
QSize defaultSize = w.size();
- SET_SAFE_SIZE(w);
w.setMinimumSize(defaultSize + QSize(100, 100));
QCOMPARE(w.size(), defaultSize + QSize(100, 100));
@@ -3780,7 +3632,6 @@ void tst_QWidget::setFixedSize()
{
QWidget w;
QSize defaultSize = w.size();
- SET_SAFE_SIZE(w);
w.setFixedSize(defaultSize + QSize(100, 100));
QCOMPARE(w.size(), defaultSize + QSize(100, 100));
@@ -4432,7 +4283,7 @@ Q_DECLARE_METATYPE(QList<QRect>)
// Since X11 WindowManager operations are all async, and we have no way to know if the window
// manager has finished playing with the window geometry, this test can't be reliable on X11.
-#ifndef Q_WS_X11
+
void tst_QWidget::setWindowGeometry_data()
{
QTest::addColumn<QList<QRect> >("rects");
@@ -4481,7 +4332,7 @@ void tst_QWidget::setWindowGeometry_data()
.arg(rect.y())
.arg(rect.width())
.arg(rect.height())
- .arg(windowFlag, 0, 16).toAscii())
+ .arg(windowFlag, 0, 16).toLatin1())
<< l
<< windowFlag;
}
@@ -4490,6 +4341,9 @@ void tst_QWidget::setWindowGeometry_data()
void tst_QWidget::setWindowGeometry()
{
+ if (m_platform == QStringLiteral("xcb"))
+ QSKIP("X11: Skip this test due to Window manager positioning issues.");
+
QFETCH(QList<QRect>, rects);
QFETCH(int, windowFlags);
QRect rect = rects.takeFirst();
@@ -4610,9 +4464,8 @@ void tst_QWidget::setWindowGeometry()
QTRY_COMPARE(widget.geometry(), rect);
}
}
-#endif
-#if defined (Q_WS_WIN) && !defined(Q_OS_WINCE)
+#if defined (Q_OS_WIN) && !defined(Q_OS_WINCE)
void tst_QWidget::setGeometry_win()
{
QWidget widget;
@@ -4625,16 +4478,15 @@ void tst_QWidget::setGeometry_win()
widget.setWindowState(widget.windowState() | Qt::WindowMaximized);
widget.show();
RECT rt;
- ::GetWindowRect(widget.internalWinId(), &rt);
+ ::GetWindowRect(winHandleOf(&widget), &rt);
QVERIFY(rt.left <= 0);
QVERIFY(rt.top <= 0);
}
-#endif
+#endif // defined (Q_OS_WIN) && !defined(Q_OS_WINCE)
// Since X11 WindowManager operation are all async, and we have no way to know if the window
// manager has finished playing with the window geometry, this test can't be reliable on X11.
-// 4DWM issues on IRIX also makes this test fail.
-#if !defined(Q_WS_X11) && !defined(Q_OS_IRIX)
+
void tst_QWidget::windowMoveResize_data()
{
setWindowGeometry_data();
@@ -4642,6 +4494,9 @@ void tst_QWidget::windowMoveResize_data()
void tst_QWidget::windowMoveResize()
{
+ if (m_platform == QStringLiteral("xcb"))
+ QSKIP("X11: Skip this test due to Window manager positioning issues.");
+
QFETCH(QList<QRect>, rects);
QFETCH(int, windowFlags);
@@ -4684,9 +4539,9 @@ void tst_QWidget::windowMoveResize()
QTRY_COMPARE(widget.size(), rect.size());
// move() while shown
- foreach (QRect r, rects) {
-#ifdef Q_WS_X11
- if ((widget.width() == 0 || widget.height() == 0) && r.width() != 0 && r.height() != 0) {
+ foreach (const QRect &r, rects) {
+ if (m_platform == QStringLiteral("xcb")
+ && ((widget.width() == 0 || widget.height() == 0) && r.width() != 0 && r.height() != 0)) {
QEXPECT_FAIL("130,100 0x200, flags 0",
"First resize after show of zero-sized gets wrong win_gravity.",
Continue);
@@ -4697,7 +4552,7 @@ void tst_QWidget::windowMoveResize()
"First resize after show of zero-sized gets wrong win_gravity.",
Continue);
}
-#endif
+
widget.move(r.topLeft());
widget.resize(r.size());
QApplication::processEvents();
@@ -4819,7 +4674,6 @@ void tst_QWidget::windowMoveResize()
QTRY_COMPARE(widget.size(), rect.size());
}
}
-#endif
class ColorWidget : public QWidget
{
@@ -4847,10 +4701,12 @@ public:
#define VERIFY_COLOR(region, color) { \
const QRegion r = QRegion(region); \
+ QScreen *screen = qApp->primaryScreen(); \
+ const WId desktopWinId = QDesktopWidget().winId(); \
for (int i = 0; i < r.rects().size(); ++i) { \
const QRect rect = r.rects().at(i); \
for (int t = 0; t < 5; t++) { \
- const QPixmap pixmap = QPixmap::grabWindow(QDesktopWidget().winId(), \
+ const QPixmap pixmap = screen->grabWindow(desktopWinId, \
rect.left(), rect.top(), \
rect.width(), rect.height()); \
QCOMPARE(pixmap.size(), rect.size()); \
@@ -5008,19 +4864,6 @@ void tst_QWidget::deleteStyle()
qApp->processEvents();
}
-#ifdef Q_WS_WIN
-void tst_QWidget::getDC()
-{
- QWidget widget;
- widget.setGeometry(0, 0, 2, 4);
-
- HDC dc = widget.getDC();
- QVERIFY(dc != 0);
-
- widget.releaseDC(dc);
-}
-#endif
-
class TopLevelFocusCheck: public QWidget
{
Q_OBJECT
@@ -5077,9 +4920,6 @@ void tst_QWidget::multipleToplevelFocusCheck()
QApplication::processEvents();
QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&w2));
QTest::mouseClick(&w2, Qt::LeftButton);
-#ifdef Q_WS_QWS
- QEXPECT_FAIL("", "embedded toplevels take focus anyway", Continue);
-#endif
QTRY_COMPARE(QApplication::focusWidget(), (QWidget *)0);
QTest::mouseDClick(&w2, Qt::LeftButton);
@@ -5555,9 +5395,10 @@ void tst_QWidget::testWindowIconChangeEventPropagation()
qApp->setWindowIcon(QIcon());
}
-#ifdef Q_WS_X11
void tst_QWidget::minAndMaxSizeWithX11BypassWindowManagerHint()
{
+ if (m_platform != QStringLiteral("xcb"))
+ QSKIP("This test is for X11 only.");
// Same size as in QWidget::create_sys().
const QSize desktopSize = QApplication::desktop()->size();
const QSize originalSize(desktopSize.width() / 2, desktopSize.height() * 4 / 10);
@@ -5570,7 +5411,7 @@ void tst_QWidget::minAndMaxSizeWithX11BypassWindowManagerHint()
QCOMPARE(widget.size(), newMaximumSize);
widget.show();
- qt_x11_wait_for_window_manager(&widget);
+ QTest::qWaitForWindowShown(widget.windowHandle());
QCOMPARE(widget.size(), newMaximumSize);
}
@@ -5582,7 +5423,7 @@ void tst_QWidget::minAndMaxSizeWithX11BypassWindowManagerHint()
QCOMPARE(widget.size(), newMinimumSize);
widget.show();
- qt_x11_wait_for_window_manager(&widget);
+ QTest::qWaitForWindowShown(widget.windowHandle());
QCOMPARE(widget.size(), newMinimumSize);
}
}
@@ -5613,10 +5454,16 @@ public:
}
}
- bool x11Event(XEvent *event)
+ bool nativeEvent(const QByteArray &eventType, void *message, long *)
{
- if (state == 1 && event->type == MapNotify)
- gotExpectedMapNotify = true;
+ enum { XCB_MAP_NOTIFY = 19 };
+
+ if (state == 1 && eventType == QByteArrayLiteral("xcb_generic_event_t")) {
+ // XCB events have a uint8 response_type member at the beginning.
+ const unsigned char responseType = *(const unsigned char *)(message);
+ if ((responseType & ~0x80) == XCB_MAP_NOTIFY)
+ gotExpectedMapNotify = true;
+ }
return false;
}
@@ -5624,8 +5471,11 @@ signals:
void done();
};
-void tst_QWidget::showHideShow()
+void tst_QWidget::showHideShowX11()
{
+ if (m_platform != QStringLiteral("xcb"))
+ QSKIP("This test is for X11 only.");
+
ShowHideShowWidget w;
w.show();
w.hide();
@@ -5639,6 +5489,9 @@ void tst_QWidget::showHideShow()
void tst_QWidget::clean_qt_x11_enforce_cursor()
{
+ if (m_platform != QStringLiteral("xcb"))
+ QSKIP("This test is for X11 only.");
+
{
QWidget window;
QWidget *w = new QWidget(&window);
@@ -5665,7 +5518,6 @@ void tst_QWidget::clean_qt_x11_enforce_cursor()
// If the test didn't crash, then it passed.
}
-#endif
class EventRecorder : public QObject
{
@@ -5986,9 +5838,9 @@ void tst_QWidget::render()
qApp->sendPostedEvents();
QTest::qWait(250);
- QImage sourceImage = QPixmap::grabWidget(&source).toImage();
+ const QImage sourceImage = source.grab(QRect(QPoint(0, 0), QSize(-1, -1))).toImage();
qApp->processEvents();
- QImage targetImage = QPixmap::grabWidget(&target).toImage();
+ QImage targetImage = target.grab(QRect(QPoint(0, 0), QSize(-1, -1))).toImage();
qApp->processEvents();
QCOMPARE(sourceImage, targetImage);
@@ -5999,7 +5851,7 @@ void tst_QWidget::render()
qApp->processEvents();
qApp->sendPostedEvents();
- targetImage = QPixmap::grabWidget(&target).toImage();
+ targetImage = target.grab(QRect(QPoint(0, 0), QSize(-1, -1))).toImage();
QVERIFY(sourceImage != targetImage);
QCOMPARE(targetImage.pixel(target.width() / 2, 29), QColor(Qt::red).rgb());
@@ -6018,7 +5870,9 @@ void tst_QWidget::render()
child.show();
qApp->processEvents();
- QCOMPARE(QPixmap::grabWidget(&child), QPixmap::grabWidget(&window));
+ const QPixmap childPixmap = child.grab(QRect(QPoint(0, 0), QSize(-1, -1)));
+ const QPixmap windowPixmap = window.grab(QRect(QPoint(0, 0), QSize(-1, -1)));
+ QCOMPARE(childPixmap, windowPixmap);
}
{ // Check that the target offset is correct.
@@ -6056,7 +5910,7 @@ void tst_QWidget::render()
// in testing the geometry so just workaround the palette issue for now.
static void workaroundPaletteIssue(QWidget *widget)
{
-#ifndef Q_WS_WIN
+#ifndef Q_OS_WIN
return;
#endif
if (!widget)
@@ -6381,7 +6235,8 @@ void tst_QWidget::render_task188133()
// Make sure QWidget::render does not trigger QWidget::repaint/update
// and asserts for Qt::WA_WState_Created.
- QPixmap pixmap = QPixmap::grabWidget(&mainWindow);
+ const QPixmap pixmap = mainWindow.grab(QRect(QPoint(0, 0), QSize(-1, -1)));
+ Q_UNUSED(pixmap)
}
void tst_QWidget::render_task211796()
@@ -6444,10 +6299,10 @@ void tst_QWidget::render_windowOpacity()
child.setAutoFillBackground(true);
QPixmap expected(child.size());
-#ifdef Q_WS_X11
- if (expected.depth() < 24)
+
+ if (m_platform == QStringLiteral("xcb") && expected.depth() < 24)
QSKIP("This test won't give correct results with dithered pixmaps");
-#endif
+
expected.fill(Qt::green);
QPainter painter(&expected);
painter.setOpacity(opacity);
@@ -6908,8 +6763,6 @@ void tst_QWidget::setContentsMargins()
QCOMPARE(newSize, label3.sizeHint());
}
-// 4DWM issues on IRIX makes this test fail.
-#ifndef Q_OS_IRIX
void tst_QWidget::moveWindowInShowEvent_data()
{
QTest::addColumn<QPoint>("initial");
@@ -6947,18 +6800,15 @@ void tst_QWidget::moveWindowInShowEvent()
// show it
widget.show();
- #ifdef Q_WS_X11
- qt_x11_wait_for_window_manager(&widget);
- #endif
+ QTest::qWaitForWindowShown(widget.windowHandle());
QTest::qWait(100);
// it should have moved
QCOMPARE(widget.pos(), position);
}
-#endif
void tst_QWidget::repaintWhenChildDeleted()
{
-#ifdef Q_WS_WIN
+#ifdef Q_OS_WIN
if (QSysInfo::WindowsVersion & QSysInfo::WV_VISTA) {
QTest::qWait(1000);
}
@@ -7031,7 +6881,7 @@ void tst_QWidget::hideOpaqueChildWhileHidden()
}
// This test doesn't make sense without support for showMinimized().
-#if !defined(Q_OS_WINCE) && !defined(Q_WS_QWS)
+#if !defined(Q_OS_WINCE)
void tst_QWidget::updateWhileMinimized()
{
UpdateWidget widget;
@@ -7064,7 +6914,6 @@ void tst_QWidget::updateWhileMinimized()
}
#endif
-#if defined(Q_WS_WIN) || defined(Q_WS_X11)
class PaintOnScreenWidget: public QWidget
{
public:
@@ -7072,7 +6921,7 @@ public:
:QWidget(parent, f)
{
}
-#if defined(Q_WS_WIN)
+#if defined(Q_OS_WIN)
// This is the only way to enable PaintOnScreen on Windows.
QPaintEngine * paintEngine () const {return 0;}
#endif
@@ -7080,6 +6929,9 @@ public:
void tst_QWidget::alienWidgets()
{
+ if (m_platform != QStringLiteral("xcb") && m_platform != QStringLiteral("windows"))
+ QSKIP("This test is only for X11/Windows.");
+
qApp->setAttribute(Qt::AA_DontCreateNativeWidgetSiblings);
QWidget parent;
QWidget child(&parent);
@@ -7087,9 +6939,7 @@ void tst_QWidget::alienWidgets()
QWidget greatGrandChild(&grandChild);
parent.show();
-#ifdef Q_WS_X11
- qt_x11_wait_for_window_manager(&parent);
-#endif
+ QTest::qWaitForWindowShown(parent.windowHandle());
// Verify that the WA_WState_Created attribute is set
// and the top-level is the only native window.
@@ -7160,36 +7010,20 @@ void tst_QWidget::alienWidgets()
widget.show();
QVERIFY(widget.testAttribute(Qt::WA_WState_Created));
QVERIFY(!widget.internalWinId());
-#ifdef Q_WS_X11
- widget.handle();
-#else
- widget.getDC();
-#endif
- QVERIFY(widget.internalWinId());
- }
-#ifdef Q_WS_X11
-#ifndef QT_NO_XRENDER
- { // Enforce a native window when calling QWidget::x11PictureHandle().
- QWidget widget(&parent);
- widget.show();
- QVERIFY(widget.testAttribute(Qt::WA_WState_Created));
- QVERIFY(!widget.internalWinId());
- widget.x11PictureHandle();
+ widget.winId();
QVERIFY(widget.internalWinId());
}
-#endif
- { // Make sure we don't create native windows when setting Qt::WA_X11NetWmWindowType attributes
- // on alien widgets (see task 194231).
+ if (m_platform == QStringLiteral("xcb")) {
+ // Make sure we don't create native windows when setting Qt::WA_X11NetWmWindowType attributes
+ // on alien widgets (see task 194231).
QWidget dummy;
QVERIFY(dummy.winId());
QWidget widget(&dummy);
widget.setAttribute(Qt::WA_X11NetWmWindowTypeToolBar);
QVERIFY(!widget.internalWinId());
}
-#endif
-
{ // Make sure we create native ancestors when setting Qt::WA_PaintOnScreen before show().
QWidget topLevel;
@@ -7296,7 +7130,6 @@ void tst_QWidget::alienWidgets()
QVERIFY(toolBar->testAttribute(Qt::WA_NativeWindow));
}
}
-#endif // Q_WS_WIN / Q_WS_X11
class ASWidget : public QWidget
{
@@ -7526,14 +7359,10 @@ void tst_QWidget::sendUpdateRequestImmediately()
{
UpdateWidget updateWidget;
updateWidget.show();
-#ifdef Q_WS_X11
- qt_x11_wait_for_window_manager(&updateWidget);
-#endif
+
+ QTest::qWaitForWindowShown(updateWidget.windowHandle());
qApp->processEvents();
-#ifdef Q_WS_QWS
- QApplication::sendPostedEvents(); //glib workaround
-#endif
updateWidget.reset();
QCOMPARE(updateWidget.numUpdateRequestEvents, 0);
@@ -7541,8 +7370,6 @@ void tst_QWidget::sendUpdateRequestImmediately()
QCOMPARE(updateWidget.numUpdateRequestEvents, 1);
}
-// 4DWM issues on IRIX makes this test fail.
-#ifndef Q_OS_IRIX
void tst_QWidget::doubleRepaint()
{
#if defined(Q_OS_MAC)
@@ -7574,7 +7401,6 @@ void tst_QWidget::doubleRepaint()
QTest::qWait(10);
QCOMPARE(widget.numPaintEvents, 0);
}
-#endif
void tst_QWidget::resizeInPaintEvent()
{
@@ -7616,9 +7442,7 @@ void tst_QWidget::opaqueChildren()
greatGrandChild.setAutoFillBackground(true); // Opaque child widget.
widget.show();
-#ifdef Q_WS_X11
- qt_x11_wait_for_window_manager(&widget);
-#endif
+ QTest::qWaitForWindowShown(widget.windowHandle());
QTest::qWait(100);
// Child, grandChild and greatGrandChild are outside the ancestor clip.
@@ -7747,10 +7571,11 @@ void tst_QWidget::moveInResizeEvent()
QTRY_COMPARE(testWidget.geometry(), expectedGeometry);
}
-
-#if defined(Q_WS_WIN) || defined(Q_WS_X11)
void tst_QWidget::immediateRepaintAfterShow()
{
+ if (m_platform != QStringLiteral("xcb") && m_platform != QStringLiteral("windows"))
+ QSKIP("We don't support immediate repaint right after show on other platforms.");
+
UpdateWidget widget;
widget.show();
qApp->processEvents();
@@ -7764,11 +7589,12 @@ void tst_QWidget::immediateRepaintAfterShow()
void tst_QWidget::immediateRepaintAfterInvalidateBuffer()
{
+ if (m_platform != QStringLiteral("xcb") && m_platform != QStringLiteral("windows"))
+ QSKIP("We don't support immediate repaint right after show on other platforms.");
+
QWidget *widget = new UpdateWidget;
widget->show();
-#ifdef Q_WS_X11
- qt_x11_wait_for_window_manager(widget);
-#endif
+ QTest::qWaitForWindowShown(widget->windowHandle());
QTest::qWait(200);
static_cast<UpdateWidget *>(widget)->numPaintEvents = 0;
@@ -7786,7 +7612,6 @@ void tst_QWidget::immediateRepaintAfterInvalidateBuffer()
delete widget;
}
-#endif
void tst_QWidget::effectiveWinId()
{
@@ -7941,31 +7766,43 @@ void tst_QWidget::moveRect()
child.move(10, 10); // Don't crash.
}
-#ifdef Q_WS_WIN
+#ifdef Q_OS_WIN
class GDIWidget : public QDialog
{
+ Q_OBJECT
public:
GDIWidget() { setAttribute(Qt::WA_PaintOnScreen); }
QPaintEngine *paintEngine() const { return 0; }
void paintEvent(QPaintEvent *) {
- HDC hdc = getDC();
+ QPlatformNativeInterface *ni = QGuiApplication::platformNativeInterface();
+ const HDC hdc = (HDC)ni->nativeResourceForWindow(QByteArrayLiteral("getDC"), windowHandle());
+ if (!hdc) {
+ qWarning("%s: Unable to obtain native DC.", Q_FUNC_INFO);
+ QTimer::singleShot(0, this, SLOT(reject()));
+ return;
+ }
SelectObject(hdc, CreateSolidBrush(RGB(255, 0, 0)));
Rectangle(hdc, 0, 0, 10, 10);
- releaseDC(hdc);
-
- QImage im = QPixmap::grabWindow(winId(), 0, 0, width(), height()).toImage();
- color = im.pixel(1, 1);
+ ni->nativeResourceForWindow(QByteArrayLiteral("releaseDC"), windowHandle());
- accept();
+ QTimer::singleShot(0, this, SLOT(slotTimer()));
}
QSize sizeHint() const {
return QSize(400, 300);
}
+private slots:
+ void slotTimer() {
+ const QImage im = grab(QRect(QPoint(0, 0), size())).toImage();
+ color = im.pixel(1, 1);
+ accept();
+ }
+
+public:
QColor color;
};
@@ -7988,7 +7825,7 @@ void tst_QWidget::paintOnScreenPossible()
w2.setAttribute(Qt::WA_PaintOnScreen);
QVERIFY(w2.testAttribute(Qt::WA_PaintOnScreen));
}
-#endif
+#endif // Q_OS_WIN
void tst_QWidget::reparentStaticWidget()
{
@@ -8089,34 +7926,6 @@ void tst_QWidget::QTBUG6883_reparentStaticWidget2()
//do not crash
}
-#ifdef Q_WS_QWS
-void tst_QWidget::updateOutsideSurfaceClip()
-{
- UpdateWidget widget;
- widget.setWindowFlags(Qt::FramelessWindowHint);
- widget.resize(100, 100);
- widget.raise();
- widget.show();
- QTest::qWait(200);
- widget.reset();
-
- // Move widget partially outside buffer and change the surface clip.
- widget.move(-50, 0);
- QTest::qWait(100);
-
- // Update region is outside the surface clip and should not trigger a repaint.
- widget.update(0, 0, 20, 20);
- QTest::qWait(100);
- QCOMPARE(widget.numPaintEvents, 0);
-
- // Now, move the widget back so that the update region is inside the clip
- // and make sure we get a repaint of the dirty area.
- widget.move(0, 0);
- QTest::qWait(100);
- QCOMPARE(widget.numPaintEvents, 1);
- QCOMPARE(widget.paintedRegion, QRegion(0, 0, 20, 20));
-}
-#endif
class ColorRedWidget : public QWidget
{
public:
@@ -8138,22 +7947,21 @@ void tst_QWidget::translucentWidget()
ColorRedWidget label;
label.setFixedSize(16,16);
label.setAttribute(Qt::WA_TranslucentBackground);
- label.move(qApp->desktop()->availableGeometry().topLeft());
+ const QPoint labelPos = qApp->desktop()->availableGeometry().topLeft();
+ label.move(labelPos);
label.show();
-#ifdef Q_WS_X11
- qt_x11_wait_for_window_manager(&label);
-#endif
+ QTest::qWaitForWindowShown(label.windowHandle());
QTest::qWait(200);
QPixmap widgetSnapshot;
-#ifdef Q_WS_WIN
+#ifdef Q_OS_WIN
QWidget *desktopWidget = QApplication::desktop()->screen(0);
if (QSysInfo::windowsVersion() >= QSysInfo::WV_VISTA)
- widgetSnapshot = QPixmap::grabWindow(desktopWidget->winId(), 0,0, label.width(), label.height());
+ widgetSnapshot = qApp->primaryScreen()->grabWindow(desktopWidget->winId(), labelPos.x(), labelPos.y(), label.width(), label.height());
else
#endif
- widgetSnapshot = QPixmap::grabWindow(label.winId());
+ widgetSnapshot = label.grab(QRect(QPoint(0, 0), label.size()));
QImage actual = widgetSnapshot.toImage().convertToFormat(QImage::Format_RGB32);
QImage expected = pm.toImage().convertToFormat(QImage::Format_RGB32);
QCOMPARE(actual.size(),expected.size());
@@ -8205,10 +8013,10 @@ void tst_QWidget::setClearAndResizeMask()
const QRegion topLevelMask(0, 0, 100, 100, QRegion::Ellipse);
topLevel.setMask(topLevelMask);
QCOMPARE(topLevel.mask(), topLevelMask);
-#if defined(Q_WS_WIN) || defined(Q_WS_X11) // We don't control what's happening on other platforms.
- // and ensure that the top-level doesn't get any update.
- QCOMPARE(topLevel.numPaintEvents, 0);
-#endif
+ // Ensure that the top-level doesn't get any update.
+ // We don't control what's happening on platforms other than X11, Windows
+ if (m_platform == QStringLiteral("xcb") || m_platform == QStringLiteral("windows"))
+ QCOMPARE(topLevel.numPaintEvents, 0);
topLevel.reset();
@@ -8218,11 +8026,12 @@ void tst_QWidget::setClearAndResizeMask()
QTest::qWait(10);
QRegion outsideOldMask(topLevel.rect());
outsideOldMask -= topLevelMask;
-#if defined(Q_WS_WIN) || defined(Q_WS_X11) // We don't control what's happening on other platforms.
- // and ensure that the top-level gets an update for the area outside the old mask.
- QTRY_VERIFY(topLevel.numPaintEvents > 0);
- QTRY_COMPARE(topLevel.paintedRegion, outsideOldMask);
-#endif
+ // Ensure that the top-level gets an update for the area outside the old mask.
+ // We don't control what's happening on platforms other than X11, Windows
+ if (m_platform == QStringLiteral("xcb") || m_platform == QStringLiteral("windows")) {
+ QTRY_VERIFY(topLevel.numPaintEvents > 0);
+ QTRY_COMPARE(topLevel.paintedRegion, outsideOldMask);
+ }
UpdateWidget child(&topLevel);
child.setAutoFillBackground(true); // NB! Opaque child.
@@ -8526,9 +8335,8 @@ void tst_QWidget::syntheticEnterLeave()
window.show();
window.raise();
-#ifdef Q_WS_X11
- qt_x11_wait_for_window_manager(&window);
-#endif
+
+ QTest::qWaitForWindowShown(window.windowHandle());
QTest::qWait(300);
#define RESET_EVENT_COUNTS \
@@ -8629,9 +8437,7 @@ void tst_QWidget::taskQTBUG_4055_sendSyntheticEnterLeave()
SELChild child(&parent);
child.resize(200, 200);
parent.show();
- #ifdef Q_WS_X11
- qt_x11_wait_for_window_manager(&parent);
- #endif
+ QTest::qWaitForWindowShown(parent.windowHandle());
QTest::qWait(150);
QCursor::setPos(child.mapToGlobal(QPoint(100, 100)));
@@ -8733,9 +8539,7 @@ void tst_QWidget::updateOnDestroyedSignal()
child->setPalette(Qt::red);
widget.show();
-#ifdef Q_WS_X11
- qt_x11_wait_for_window_manager(&widget);
-#endif
+ QTest::qWaitForWindowShown(widget.windowHandle());
QTest::qWait(200);
// Please do not crash.
@@ -8788,9 +8592,7 @@ void tst_QWidget::destroyBackingStore()
w.update();
QApplication::processEvents();
-#ifdef Q_WS_QWS
- QApplication::processEvents();
-#endif
+
QCOMPARE(w.numPaintEvents, 1);
// Check one more time, because the second time around does more caching.
@@ -8798,7 +8600,7 @@ void tst_QWidget::destroyBackingStore()
QApplication::processEvents();
QCOMPARE(w.numPaintEvents, 2);
}
-#endif
+#endif // QT_BUILD_INTERNAL
// Helper function
QWidgetBackingStore* backingStore(QWidget &widget)
@@ -8844,8 +8646,9 @@ void tst_QWidget::rectOutsideCoordinatesLimit_task144779()
QPixmap correct(main.size());
correct.fill(Qt::green);
+ const QPixmap mainPixmap = main.grab(QRect(QPoint(0, 0), QSize(-1, -1)));
- QTRY_COMPARE(QPixmap::grabWindow(main.winId()).toImage().convertToFormat(QImage::Format_RGB32),
+ QTRY_COMPARE(mainPixmap.toImage().convertToFormat(QImage::Format_RGB32),
correct.toImage().convertToFormat(QImage::Format_RGB32));
QApplication::restoreOverrideCursor();
}
@@ -9059,7 +8862,7 @@ void tst_QWidget::taskQTBUG_7532_tabOrderWithFocusProxy()
void tst_QWidget::movedAndResizedAttributes()
{
-#if defined (Q_OS_MAC) || defined(Q_WS_QWS)
+#if defined (Q_OS_MAC)
QEXPECT_FAIL("", "FixMe, QTBUG-8941 and QTBUG-8977", Abort);
QVERIFY(false);
#else
diff --git a/tests/auto/widgets/styles/qmacstyle/qmacstyle.pro b/tests/auto/widgets/styles/qmacstyle/qmacstyle.pro
index 1408f87682..4cd85ab7f2 100644
--- a/tests/auto/widgets/styles/qmacstyle/qmacstyle.pro
+++ b/tests/auto/widgets/styles/qmacstyle/qmacstyle.pro
@@ -2,6 +2,3 @@ CONFIG += testcase
TARGET = tst_qmacstyle
QT += widgets testlib
SOURCES += tst_qmacstyle.cpp
-
-
-mac*:CONFIG+=insignificant_test
diff --git a/tests/auto/widgets/styles/qmacstyle/tst_qmacstyle.cpp b/tests/auto/widgets/styles/qmacstyle/tst_qmacstyle.cpp
index f732dfa18d..62e1c7c8ef 100644
--- a/tests/auto/widgets/styles/qmacstyle/tst_qmacstyle.cpp
+++ b/tests/auto/widgets/styles/qmacstyle/tst_qmacstyle.cpp
@@ -135,6 +135,7 @@ void tst_QMacStyle::sizeHints()
QCOMPARE(sh(&progress1).width(), SIZE(16, 10, 10)); // Builder
QRadioButton radio1("Radio", &w);
+ QEXPECT_FAIL("", "QTBUG-25296", Abort);
QCOMPARE(sh(&radio1).height(), SIZE(15, 12, 10)); // Builder
QCheckBox checkBox1("Switch", &w);
@@ -401,6 +402,8 @@ void tst_QMacStyle::smallMiniNormalExclusivity()
opt.initFrom(&dummyWidget);
QSize size = dummyWidget.style()->sizeFromContents(QStyle::CT_PushButton, &opt,
QSize(0, 0), &dummyWidget);
+ if (size.height() != expected[i])
+ QEXPECT_FAIL("", "QTBUG-25296", Abort);
QCOMPARE(size.height(), expected[i]);
}
}
diff --git a/tests/auto/widgets/util/qcompleter/qcompleter.pro b/tests/auto/widgets/util/qcompleter/qcompleter.pro
index 6a817a89ac..19d8d500b8 100644
--- a/tests/auto/widgets/util/qcompleter/qcompleter.pro
+++ b/tests/auto/widgets/util/qcompleter/qcompleter.pro
@@ -4,5 +4,3 @@ TARGET = tst_qcompleter
QT += widgets testlib
SOURCES += tst_qcompleter.cpp
-
-CONFIG += insignificant_test # QTBUG-21424
diff --git a/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp b/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp
index a257eb1798..61b0e04624 100644
--- a/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp
+++ b/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp
@@ -266,7 +266,7 @@ retry:
for (int i = 0; i < step.length(); i++) {
int row = completer->currentRow();
- switch (step[i].toUpper().toAscii()) {
+ switch (step[i].toUpper().toLatin1()) {
case 'P': --row; break;
case 'N': ++row; break;
case 'L': row = completer->completionCount() - 1; break;
diff --git a/tests/auto/widgets/widgets/qcombobox/qcombobox.pro b/tests/auto/widgets/widgets/qcombobox/qcombobox.pro
index e0545630c5..88b9d08557 100644
--- a/tests/auto/widgets/widgets/qcombobox/qcombobox.pro
+++ b/tests/auto/widgets/widgets/qcombobox/qcombobox.pro
@@ -2,5 +2,3 @@ CONFIG += testcase
TARGET = tst_qcombobox
QT += widgets widgets-private gui-private core-private testlib
SOURCES += tst_qcombobox.cpp
-
-linux-*:system(". /etc/lsb-release && [ $DISTRIB_CODENAME = oneiric ]"):CONFIG += insignificant_test # QTBUG-23639, (related QTBUG-1071)
diff --git a/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp b/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp
index 4730d7d556..90b5a88805 100644
--- a/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp
+++ b/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp
@@ -1271,7 +1271,7 @@ void tst_QComboBox::insertOnCurrentIndex()
testWidget->addItem("first item");
testWidget->setCurrentIndex(0);
testWidget->insertItem(0, "second item");
- QCOMPARE(testWidget->lineEdit()->text(), QString::fromAscii("first item"));
+ QCOMPARE(testWidget->lineEdit()->text(), QString::fromLatin1("first item"));
}
void tst_QComboBox::textpixmapdata_data()
@@ -1669,33 +1669,33 @@ void tst_QComboBox::flaggedItems_data()
KeyList keyMovementList;
keyMovementList << Qt::Key_Down << Qt::Key_Down << Qt::Key_Down << Qt::Key_Down;
- QTest::newRow(testCase.toAscii() + "normal") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 4;
+ QTest::newRow(testCase.toLatin1() + "normal") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 4;
deselectFlagList.clear();
disableFlagList.clear();
deselectFlagList << 1 << 3;
- QTest::newRow(testCase.toAscii() + "non-selectable") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 4;
+ QTest::newRow(testCase.toLatin1() + "non-selectable") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 4;
deselectFlagList.clear();
disableFlagList.clear();
disableFlagList << 2;
- QTest::newRow(testCase.toAscii() + "disabled") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 5;
+ QTest::newRow(testCase.toLatin1() + "disabled") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 5;
deselectFlagList.clear();
disableFlagList.clear();
deselectFlagList << 1 << 3;
disableFlagList << 2 << 3;
- QTest::newRow(testCase.toAscii() + "mixed") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 6;
+ QTest::newRow(testCase.toLatin1() + "mixed") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 6;
deselectFlagList.clear();
disableFlagList.clear();
disableFlagList << 0 << 1 << 2 << 3 << 4 << 5 << 6;
- QTest::newRow(testCase.toAscii() + "nearly-empty") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 7;
+ QTest::newRow(testCase.toLatin1() + "nearly-empty") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 7;
deselectFlagList.clear();
disableFlagList.clear();
disableFlagList << 0 << 1 << 2 << 3 << 5 << 6 << 7;
keyMovementList.clear();
- QTest::newRow(testCase.toAscii() + "only one enabled") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 4;
+ QTest::newRow(testCase.toLatin1() + "only one enabled") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 4;
if (!editable) {
deselectFlagList.clear();
@@ -1703,38 +1703,38 @@ void tst_QComboBox::flaggedItems_data()
keyMovementList.clear();
disableFlagList << 0 << 2 << 3;
keyMovementList << Qt::Key_Down << Qt::Key_Home;
- QTest::newRow(testCase.toAscii() + "home-disabled") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 1;
+ QTest::newRow(testCase.toLatin1() + "home-disabled") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 1;
keyMovementList.clear();
keyMovementList << Qt::Key_End;
- QTest::newRow(testCase.toAscii() + "end-key") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 7;
+ QTest::newRow(testCase.toLatin1() + "end-key") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 7;
disableFlagList.clear();
disableFlagList << 1 ;
keyMovementList << Qt::Key_T;
- QTest::newRow(testCase.toAscii() + "keyboard-search") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 2;
+ QTest::newRow(testCase.toLatin1() + "keyboard-search") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 2;
itemList << "nine" << "ten";
keyMovementList << Qt::Key_T;
- QTest::newRow(testCase.toAscii() + "search same start letter") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 9;
+ QTest::newRow(testCase.toLatin1() + "search same start letter") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 9;
keyMovementList.clear();
keyMovementList << Qt::Key_T << Qt::Key_H;
- QTest::newRow(testCase.toAscii() + "keyboard search item") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 2;
+ QTest::newRow(testCase.toLatin1() + "keyboard search item") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 2;
disableFlagList.clear();
disableFlagList << 1 << 3 << 5 << 7 << 9;
keyMovementList.clear();
keyMovementList << Qt::Key_End << Qt::Key_Up << Qt::Key_Up << Qt::Key_PageDown << Qt::Key_PageUp << Qt::Key_PageUp << Qt::Key_Down;
- QTest::newRow(testCase.toAscii() + "all key combinations") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 4;
+ QTest::newRow(testCase.toLatin1() + "all key combinations") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 4;
} else {
deselectFlagList.clear();
disableFlagList.clear();
disableFlagList << 1;
keyMovementList.clear();
keyMovementList << Qt::Key_T << Qt::Key_Enter;
- QTest::newRow(testCase.toAscii() + "disabled") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 2;
- QTest::newRow(testCase.toAscii() + "broken autocompletion") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 2;
+ QTest::newRow(testCase.toLatin1() + "disabled") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 2;
+ QTest::newRow(testCase.toLatin1() + "broken autocompletion") << itemList << deselectFlagList << disableFlagList << keyMovementList << bool(editable) << 2;
}
}
}
diff --git a/tests/auto/widgets/widgets/qdatetimeedit/qdatetimeedit.pro b/tests/auto/widgets/widgets/qdatetimeedit/qdatetimeedit.pro
index 41c90b499a..2362be3b73 100644
--- a/tests/auto/widgets/widgets/qdatetimeedit/qdatetimeedit.pro
+++ b/tests/auto/widgets/widgets/qdatetimeedit/qdatetimeedit.pro
@@ -4,4 +4,3 @@ QT += widgets testlib
SOURCES += tst_qdatetimeedit.cpp
wincewm50smart-msvc2005: DEFINES += WINCE_NO_MODIFIER_KEYS
-mac:CONFIG += insignificant_test # numerous failures, see QTBUG-23674
diff --git a/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp b/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp
index e66909e9eb..a6f344c4bc 100644
--- a/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp
+++ b/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp
@@ -786,6 +786,9 @@ void tst_QDateTimeEdit::selectAndScrollWithKeys()
QTest::keyClick(testWidget, Qt::Key_Home);
#endif
QTest::keyClick(testWidget, Qt::Key_Right, Qt::ShiftModifier);
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("", "QTBUG-23674", Abort);
+#endif
QCOMPARE(testWidget->lineEdit()->selectedText(), QString("1"));
QTest::keyClick(testWidget, Qt::Key_Right, Qt::ShiftModifier);
QCOMPARE(testWidget->lineEdit()->selectedText(), QString("11"));
@@ -889,6 +892,9 @@ void tst_QDateTimeEdit::backspaceKey()
#endif
QCOMPARE(testWidget->text(), QString("11/05/2004"));
QTest::keyClick(testWidget, Qt::Key_Backspace);
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("", "QTBUG-23674", Abort);
+#endif
QCOMPARE(testWidget->text(), QString("11/05/200"));
QTest::keyClick(testWidget, Qt::Key_Backspace);
QCOMPARE(testWidget->text(), QString("11/05/20"));
@@ -1025,6 +1031,9 @@ void tst_QDateTimeEdit::enterKey()
QTest::keyClick(testWidget, Qt::Key_Home);
#endif
QTest::keyClick(testWidget, Qt::Key_Enter);
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("", "QTBUG-23674", Abort);
+#endif
QVERIFY(!testWidget->lineEdit()->hasSelectedText());
#ifdef Q_OS_MAC
QTest::keyClick(testWidget, Qt::Key_Right, Qt::ControlModifier);
@@ -2040,7 +2049,7 @@ void tst_QDateTimeEdit::dateSignalChecking()
if (timesEmitted > 0) {
QList<QVariant> list = dateSpy.takeFirst();
QDate d;
- d = qVariantValue<QDate>(list.at(0));
+ d = qvariant_cast<QDate>(list.at(0));
QCOMPARE(d, newDate);
}
QCOMPARE(dateTimeSpy.count(), timesEmitted);
@@ -2076,7 +2085,7 @@ void tst_QDateTimeEdit::timeSignalChecking()
if (timesEmitted > 0) {
QList<QVariant> list = timeSpy.takeFirst();
QTime t;
- t = qVariantValue<QTime>(list.at(0));
+ t = qvariant_cast<QTime>(list.at(0));
QCOMPARE(t, newTime);
}
QCOMPARE(dateTimeSpy.count(), timesEmitted);
@@ -2126,21 +2135,21 @@ void tst_QDateTimeEdit::dateTimeSignalChecking()
QCOMPARE(timesDateEmitted, 1);
QList<QVariant> list = dateSpy.takeFirst();
QDate d;
- d = qVariantValue<QDate>(list.at(0));
+ d = qvariant_cast<QDate>(list.at(0));
QCOMPARE(d, newDateTime.date());
}
QCOMPARE(timeSpy.count(), timesTimeEmitted);
if (timesTimeEmitted > 0) {
QList<QVariant> list = timeSpy.takeFirst();
QTime t;
- t = qVariantValue<QTime>(list.at(0));
+ t = qvariant_cast<QTime>(list.at(0));
QCOMPARE(t, newDateTime.time());
}
QCOMPARE(dateTimeSpy.count(), timesDateTimeEmitted);
if (timesDateTimeEmitted > 0) {
QList<QVariant> list = dateTimeSpy.takeFirst();
QDateTime dt;
- dt = qVariantValue<QDateTime>(list.at(0));
+ dt = qvariant_cast<QDateTime>(list.at(0));
QCOMPARE(dt, newDateTime);
}
}
@@ -2551,6 +2560,9 @@ void tst_QDateTimeEdit::newCase()
#else
QTest::keyClick(testWidget, Qt::Key_Home);
#endif
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("", "QTBUG-23674", Abort);
+#endif
QCOMPARE(testWidget->lineEdit()->selectedText(), QString());
QTest::keyClick(testWidget, Qt::Key_Right);
QTest::keyClick(testWidget, Qt::Key_Right);
@@ -2627,6 +2639,9 @@ void tst_QDateTimeEdit::cursorPos()
QTest::keyClick(testWidget, Qt::Key_Return);
QTest::keyClick(testWidget, Qt::Key_3);
QTest::keyClick(testWidget, Qt::Key_1);
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("", "QTBUG-23674", Abort);
+#endif
QCOMPARE(testWidget->lineEdit()->cursorPosition(), 3);
}
@@ -2660,6 +2675,9 @@ void tst_QDateTimeEdit::newCase5()
QTest::keyClick(testWidget, Qt::Key_1);
QTest::keyClick(testWidget, Qt::Key_2);
QTest::keyClick(testWidget, Qt::Key_4);
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("", "QTBUG-23674", Abort);
+#endif
QCOMPARE(testWidget->lineEdit()->displayText(), QString("2005-10-07 17:44:13 124 ms"));
QTest::keyClick(testWidget, Qt::Key_Backspace);
@@ -2770,6 +2788,9 @@ void tst_QDateTimeEdit::setSelectedSection()
#else
QTest::keyClick(testWidget, Qt::Key_Home);
#endif
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("", "QTBUG-23674", Abort);
+#endif
QVERIFY(!testWidget->lineEdit()->hasSelectedText());
testWidget->setSelectedSection(QDateTimeEdit::MinuteSection);
QCOMPARE(testWidget->lineEdit()->selectedText(), QString("00"));
@@ -2887,6 +2908,9 @@ void tst_QDateTimeEdit::reverseTest()
#else
QTest::keyClick(testWidget, Qt::Key_End);
#endif
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("", "QTBUG-23674", Abort);
+#endif
QCOMPARE(testWidget->currentSection(), QDateTimeEdit::DaySection);
QTest::keyClick(testWidget, Qt::Key_Up);
QCOMPARE(testWidget->date(), QDate(2001, 3, 31));
@@ -3039,6 +3063,9 @@ void tst_QDateTimeEdit::ddMMMMyyyy()
QTest::keyClick(testWidget, Qt::Key_End);
#endif
QTest::keyClick(testWidget, Qt::Key_Backspace);
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("", "QTBUG-23674", Abort);
+#endif
QCOMPARE(testWidget->lineEdit()->text(), "01." + QDate::longMonthName(1) + ".200");
}
@@ -3328,6 +3355,9 @@ void tst_QDateTimeEdit::potentialYYValueBug()
QTest::keyClick(&edit, Qt::Key_End);
#endif
QTest::keyClick(&edit, Qt::Key_Backspace);
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("", "QTBUG-23674", Abort);
+#endif
QCOMPARE(edit.text(), QString("14/09/5"));
}
@@ -3343,6 +3373,9 @@ void tst_QDateTimeEdit::textSectionAtEnd()
QTest::keyClick(&edit, Qt::Key_End);
#endif
QTest::keyClick(&edit, Qt::Key_Backspace);
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("", "QTBUG-23674", Abort);
+#endif
QCOMPARE(edit.text(), QString("Januar"));
}
diff --git a/tests/auto/widgets/widgets/qdoublespinbox/qdoublespinbox.pro b/tests/auto/widgets/widgets/qdoublespinbox/qdoublespinbox.pro
index 183210b597..cc66eaae26 100644
--- a/tests/auto/widgets/widgets/qdoublespinbox/qdoublespinbox.pro
+++ b/tests/auto/widgets/widgets/qdoublespinbox/qdoublespinbox.pro
@@ -2,5 +2,3 @@ CONFIG += testcase
TARGET = tst_qdoublespinbox
QT += widgets testlib
SOURCES += tst_qdoublespinbox.cpp
-
-linux-*:system(". /etc/lsb-release && [ $DISTRIB_CODENAME = oneiric ]"):CONFIG += insignificant_test # QTBUG-23641
diff --git a/tests/auto/widgets/widgets/qmdiarea/qmdiarea.pro b/tests/auto/widgets/widgets/qmdiarea/qmdiarea.pro
index 54aa3c4ff1..d2156a1718 100644
--- a/tests/auto/widgets/widgets/qmdiarea/qmdiarea.pro
+++ b/tests/auto/widgets/widgets/qmdiarea/qmdiarea.pro
@@ -12,4 +12,4 @@ mac {
LIBS += -framework Security
}
-CONFIG+=insignificant_test
+!mac:!win32:CONFIG+=insignificant_test # QTBUG-25298
diff --git a/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp b/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp
index eeb2eea9a1..7aa9bb2ddf 100644
--- a/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp
+++ b/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp
@@ -530,6 +530,9 @@ void tst_QMdiArea::subWindowActivated2()
#ifdef Q_OS_WINCE
QSKIP("Not fixed yet. See Task 197453");
#endif
+#ifdef Q_OS_MAC
+ QSKIP("QTBUG-25298: This test is unstable on Mac.");
+#endif
QTRY_COMPARE(spy.count(), 1);
QVERIFY(!mdiArea.activeSubWindow());
QCOMPARE(mdiArea.currentSubWindow(), activeSubWindow);
@@ -1029,7 +1032,7 @@ void tst_QMdiArea::activeSubWindow()
qApp->setActiveWindow(&mainWindow);
QCOMPARE(mdiArea->activeSubWindow(), subWindow);
-#if !defined(Q_OS_MAC) && !defined(Q_WS_WIN)
+#if !defined(Q_OS_MAC) && !defined(Q_OS_WIN)
qApp->setActiveWindow(0);
QVERIFY(!mdiArea->activeSubWindow());
#endif
@@ -1114,7 +1117,7 @@ void tst_QMdiArea::currentSubWindow()
QVERIFY(mdiArea.activeSubWindow());
QVERIFY(mdiArea.currentSubWindow());
-#if !defined(Q_OS_MAC) && !defined(Q_WS_WIN)
+#if !defined(Q_OS_MAC) && !defined(Q_OS_WIN)
qApp->setActiveWindow(0);
QVERIFY(!mdiArea.activeSubWindow());
QVERIFY(mdiArea.currentSubWindow());
@@ -1756,6 +1759,9 @@ void tst_QMdiArea::tileSubWindows()
#ifdef Q_OS_WINCE
QSKIP("Not fixed yet! See task 197453");
#endif
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("", "QTBUG-25298", Abort);
+#endif
QTRY_COMPARE(workspace.viewport()->rect().size(), expectedViewportSize);
// Not enough space for all sub-windows to be visible -> provide scroll bars.
@@ -1825,6 +1831,9 @@ void tst_QMdiArea::cascadeAndTileSubWindows()
titleBarHeight -= 4;
const QFontMetrics fontMetrics = QFontMetrics(QApplication::font("QMdiSubWindowTitleBar"));
const int dy = qMax(titleBarHeight - (titleBarHeight - fontMetrics.height()) / 2, 1);
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("", "QTBUG-25298", Abort);
+#endif
QCOMPARE(windows.at(2)->geometry().top() - windows.at(1)->geometry().top(), dy);
for (int i = 0; i < windows.count(); ++i) {
@@ -2286,6 +2295,9 @@ void tst_QMdiArea::setActivationOrder()
QVERIFY(verifyArrangement(&mdiArea, Tiled, expectedTileIndices));
mdiArea.cascadeSubWindows();
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("", "QTBUG-25298", Abort);
+#endif
QVERIFY(verifyArrangement(&mdiArea, Cascaded, expectedCascadeIndices));
QTest::qWait(100);
@@ -2333,6 +2345,9 @@ void tst_QMdiArea::tabBetweenSubWindows()
QCOMPARE(spy.count(), 0);
// Walk through the entire list of sub windows.
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("", "QTBUG-25298", Abort);
+#endif
QVERIFY(tabBetweenSubWindowsIn(&mdiArea));
QCOMPARE(mdiArea.activeSubWindow(), subWindows.back());
QCOMPARE(spy.count(), 0);
diff --git a/tests/auto/widgets/widgets/qmdisubwindow/qmdisubwindow.pro b/tests/auto/widgets/widgets/qmdisubwindow/qmdisubwindow.pro
index be929d1429..4299f7711e 100644
--- a/tests/auto/widgets/widgets/qmdisubwindow/qmdisubwindow.pro
+++ b/tests/auto/widgets/widgets/qmdisubwindow/qmdisubwindow.pro
@@ -4,6 +4,3 @@ QT += widgets testlib
INCLUDEPATH += .
SOURCES += tst_qmdisubwindow.cpp
DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII
-
-
-mac*:CONFIG+=insignificant_test
diff --git a/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp b/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp
index bc5100f118..79afd14481 100644
--- a/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp
+++ b/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp
@@ -610,6 +610,9 @@ void tst_QMdiSubWindow::showShaded()
else
#endif
mouseReceiver = window;
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("", "QTBUG-25297", Abort);
+#endif
QVERIFY(mouseReceiver);
sendMouseMove(mouseReceiver, mousePosition, Qt::NoButton);
sendMousePress(mouseReceiver, mousePosition);
@@ -724,6 +727,9 @@ void tst_QMdiSubWindow::setOpaqueResizeAndMove()
mouseReceiver = qFindChild<QSizeGrip *>(window);
else
mouseReceiver = window;
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("", "QTBUG-25297", Abort);
+#endif
QVERIFY(mouseReceiver);
// ----------------------------- resize -----------------------------
@@ -1432,6 +1438,9 @@ void tst_QMdiSubWindow::defaultSizeGrip()
// QSizeGrip on windows with decoration.
QMdiSubWindow *windowWithDecoration = mdiArea.addSubWindow(new QWidget);
windowWithDecoration->show();
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("", "QTBUG-25297", Abort);
+#endif
QVERIFY(qFindChild<QSizeGrip *>(windowWithDecoration));
// ...but not on windows without decoration (Qt::FramelessWindowHint).
@@ -1699,6 +1708,9 @@ void tst_QMdiSubWindow::fixedMinMaxSize()
// to minimize the window.
subWindow->showMinimized();
QVERIFY(subWindow->isMinimized());
+#ifdef Q_OS_MAC
+ QEXPECT_FAIL("", "QTBUG-25297", Abort);
+#endif
QCOMPARE(subWindow->size(), minimizedSize);
QCOMPARE(subWindow->minimumSize(), minimizedSize);
diff --git a/tests/auto/widgets/widgets/qmenubar/qmenubar.pro b/tests/auto/widgets/widgets/qmenubar/qmenubar.pro
index c74c9e84c1..3fb6ae61a8 100644
--- a/tests/auto/widgets/widgets/qmenubar/qmenubar.pro
+++ b/tests/auto/widgets/widgets/qmenubar/qmenubar.pro
@@ -2,5 +2,3 @@ CONFIG += testcase
TARGET = tst_qmenubar
QT += widgets testlib
SOURCES += tst_qmenubar.cpp
-
-linux-*:system(". /etc/lsb-release && [ $DISTRIB_CODENAME = oneiric ]"):CONFIG += insignificant_test # QTBUG-4965, QTBUG-11823
diff --git a/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp b/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp
index 6a1f418739..6f7d7517e8 100644
--- a/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp
+++ b/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp
@@ -980,7 +980,7 @@ void tst_QMenuBar::check_altPress()
{
if ( !qApp->style()->styleHint(QStyle::SH_MenuBar_AltKeyNavigation) ) {
QSKIP( QString( "this is not supposed to work in the %1 style. Skipping." ).
- arg( qApp->style()->objectName() ).toAscii());
+ arg( qApp->style()->objectName() ).toLatin1());
}
initSimpleMenubar();
diff --git a/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp b/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp
index 4019faf428..1052bb2103 100644
--- a/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp
+++ b/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp
@@ -345,7 +345,7 @@ void tst_QPlainTextEdit::selectAllSetsNotSelection()
ed->insertPlainText("Hello World");
ed->selectAll();
- QCOMPARE(QApplication::clipboard()->text(QClipboard::Selection), QString::fromAscii("foobar"));
+ QCOMPARE(QApplication::clipboard()->text(QClipboard::Selection), QString::fromLatin1("foobar"));
}
#endif
diff --git a/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp b/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp
index 1c06197d11..7696ab2dea 100644
--- a/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp
+++ b/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp
@@ -561,37 +561,37 @@ void tst_QPushButton::sizeHint_data()
{
QTest::addColumn<QString>("stylename");
#if !defined(QT_NO_STYLE_MOTIF)
- QTest::newRow("motif") << QString::fromAscii("motif");
+ QTest::newRow("motif") << QString::fromLatin1("motif");
#endif
#if !defined(QT_NO_STYLE_CDE)
- QTest::newRow("cde") << QString::fromAscii("cde");
+ QTest::newRow("cde") << QString::fromLatin1("cde");
#endif
#if !defined(QT_NO_STYLE_WINDOWS)
- QTest::newRow("windows") << QString::fromAscii("windows");
+ QTest::newRow("windows") << QString::fromLatin1("windows");
#endif
#if !defined(QT_NO_STYLE_CLEANLOOKS)
- QTest::newRow("cleanlooks") << QString::fromAscii("cleanlooks");
+ QTest::newRow("cleanlooks") << QString::fromLatin1("cleanlooks");
#endif
#if !defined(QT_NO_STYLE_GTK)
- QTest::newRow("gtk") << QString::fromAscii("gtk");
+ QTest::newRow("gtk") << QString::fromLatin1("gtk");
#endif
#if defined(Q_OS_MAC) && !defined(QT_NO_STYLE_MAC)
- QTest::newRow("mac") << QString::fromAscii("mac");
+ QTest::newRow("mac") << QString::fromLatin1("mac");
#endif
#if !defined(QT_NO_STYLE_PLASTIQUE)
- QTest::newRow("plastique") << QString::fromAscii("plastique");
+ QTest::newRow("plastique") << QString::fromLatin1("plastique");
#endif
#if defined(Q_OS_WIN) && !defined(QT_NO_STYLE_WINDOWSXP)
- QTest::newRow("windowsxp") << QString::fromAscii("windowsxp");
+ QTest::newRow("windowsxp") << QString::fromLatin1("windowsxp");
#endif
#if defined(Q_OS_WIN) && !defined(QT_NO_STYLE_WINDOWSVISTA)
- QTest::newRow("windowsvista") << QString::fromAscii("windowsvista");
+ QTest::newRow("windowsvista") << QString::fromLatin1("windowsvista");
#endif
#if defined(Q_OS_WINCE) && !defined(QT_NO_STYLE_WINDOWSCE)
- QTest::newRow("windowsce") << QString::fromAscii("windowsce");
+ QTest::newRow("windowsce") << QString::fromLatin1("windowsce");
#endif
#if defined(Q_OS_WINCE_WM) && !defined(QT_NO_STYLE_WINDOWSCE)
- QTest::newRow("windowsmobile") << QString::fromAscii("windowsmobile");
+ QTest::newRow("windowsmobile") << QString::fromLatin1("windowsmobile");
#endif
}
diff --git a/tests/auto/widgets/widgets/qsizegrip/qsizegrip.pro b/tests/auto/widgets/widgets/qsizegrip/qsizegrip.pro
index 98cf169730..1149b50feb 100644
--- a/tests/auto/widgets/widgets/qsizegrip/qsizegrip.pro
+++ b/tests/auto/widgets/widgets/qsizegrip/qsizegrip.pro
@@ -3,5 +3,3 @@ TARGET = tst_qsizegrip
INCLUDEPATH += .
QT += widgets testlib
SOURCES += tst_qsizegrip.cpp
-
-mac: CONFIG += insignificant_test # failures on mac, QTBUG-23681
diff --git a/tests/auto/widgets/widgets/qsizegrip/tst_qsizegrip.cpp b/tests/auto/widgets/widgets/qsizegrip/tst_qsizegrip.cpp
index 4c5df04188..a0a314bd9d 100644
--- a/tests/auto/widgets/widgets/qsizegrip/tst_qsizegrip.cpp
+++ b/tests/auto/widgets/widgets/qsizegrip/tst_qsizegrip.cpp
@@ -140,6 +140,7 @@ void tst_QSizeGrip::hideAndShowOnWindowStateChange()
#ifndef Q_OS_MAC
QVERIFY(!sizeGrip->isVisible());
#else
+ QEXPECT_FAIL("", "QTBUG-23681", Abort);
QVERIFY(sizeGrip->isVisible());
#endif
diff --git a/tests/auto/widgets/widgets/qstatusbar/tst_qstatusbar.cpp b/tests/auto/widgets/widgets/qstatusbar/tst_qstatusbar.cpp
index 081e817727..d23f69ac6c 100644
--- a/tests/auto/widgets/widgets/qstatusbar/tst_qstatusbar.cpp
+++ b/tests/auto/widgets/widgets/qstatusbar/tst_qstatusbar.cpp
@@ -199,7 +199,9 @@ void tst_QStatusBar::setSizeGripEnabled()
QVERIFY(!sizeGrip);
qApp->processEvents();
+#ifndef Q_OS_MAC // Work around Lion fullscreen issues on CI system - QTQAINFRA-506
mainWindow.showFullScreen();
+#endif
#ifdef Q_WS_X11
qt_x11_wait_for_window_manager(&mainWindow);
#endif
@@ -220,7 +222,9 @@ void tst_QStatusBar::setSizeGripEnabled()
QVERIFY(!sizeGrip->isVisible());
qApp->processEvents();
+#ifndef Q_OS_MAC
mainWindow.showNormal();
+#endif
qApp->processEvents();
QTRY_VERIFY(sizeGrip->isVisible());
}
diff --git a/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp b/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp
index a3f58c4c0d..88489f4328 100644
--- a/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp
+++ b/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp
@@ -604,7 +604,7 @@ void tst_QTextEdit::selectAllSetsNotSelection()
ed->insertPlainText("Hello World");
ed->selectAll();
- QCOMPARE(QApplication::clipboard()->text(QClipboard::Selection), QString::fromAscii("foobar"));
+ QCOMPARE(QApplication::clipboard()->text(QClipboard::Selection), QString::fromLatin1("foobar"));
}
#endif
void tst_QTextEdit::asciiTab()
diff --git a/tests/baselineserver/src/baselineserver.cpp b/tests/baselineserver/src/baselineserver.cpp
index e3b6b4aa8f..b713f926ce 100644
--- a/tests/baselineserver/src/baselineserver.cpp
+++ b/tests/baselineserver/src/baselineserver.cpp
@@ -532,7 +532,6 @@ void BaselineHandler::testPathMapping()
item.itemChecksum = 0x0123;
clientInfo.insert(PI_QtVersion, QLS("5.0.0"));
- clientInfo.insert(PI_BuildKey, QLS("(nobuildkey)"));
clientInfo.insert(PI_QMakeSpec, QLS("linux-g++"));
clientInfo.insert(PI_PulseGitBranch, QLS("somebranch"));
diff --git a/tests/benchmarks/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/benchmarks/corelib/kernel/qvariant/tst_qvariant.cpp
index f6b4d88311..ca8dba4b88 100644
--- a/tests/benchmarks/corelib/kernel/qvariant/tst_qvariant.cpp
+++ b/tests/benchmarks/corelib/kernel/qvariant/tst_qvariant.cpp
@@ -188,7 +188,7 @@ static void variantSetValue(T d)
QVariant v;
QBENCHMARK {
for(int i = 0; i < ITERATION_COUNT; ++i) {
- qVariantSetValue(v, d);
+ v.setValue(d);
}
}
}
diff --git a/tests/benchmarks/dbus/qdbusperformance/server/server.cpp b/tests/benchmarks/dbus/qdbusperformance/server/server.cpp
index 765852cfca..556de71568 100644
--- a/tests/benchmarks/dbus/qdbusperformance/server/server.cpp
+++ b/tests/benchmarks/dbus/qdbusperformance/server/server.cpp
@@ -43,7 +43,7 @@
#include "../serverobject.h"
-static const char serviceName[] = "com.trolltech.autotests.performance";
+static const char serviceName[] = "org.qtproject.autotests.performance";
static const char objectPath[] = "/";
int main(int argc, char *argv[])
diff --git a/tests/benchmarks/dbus/qdbusperformance/serverobject.h b/tests/benchmarks/dbus/qdbusperformance/serverobject.h
index bc173aa762..857f31fec8 100644
--- a/tests/benchmarks/dbus/qdbusperformance/serverobject.h
+++ b/tests/benchmarks/dbus/qdbusperformance/serverobject.h
@@ -49,7 +49,7 @@
class ServerObject: public QObject
{
Q_OBJECT
- Q_CLASSINFO("D-Bus Interface", "com.trolltech.autotests.Performance")
+ Q_CLASSINFO("D-Bus Interface", "org.qtproject.autotests.Performance")
public:
ServerObject(const QString &objectPath, QDBusConnection conn, QObject *parent = 0)
: QObject(parent)
diff --git a/tests/benchmarks/dbus/qdbusperformance/tst_qdbusperformance.cpp b/tests/benchmarks/dbus/qdbusperformance/tst_qdbusperformance.cpp
index bd7f09d660..fe9e37c5d5 100644
--- a/tests/benchmarks/dbus/qdbusperformance/tst_qdbusperformance.cpp
+++ b/tests/benchmarks/dbus/qdbusperformance/tst_qdbusperformance.cpp
@@ -44,7 +44,7 @@
#include "./serverobject.h"
-static const char serviceName[] = "com.trolltech.autotests.performance";
+static const char serviceName[] = "org.qtproject.autotests.performance";
static const int runTime = 500;
class tst_QDBusPerformance: public QObject
@@ -98,11 +98,11 @@ void tst_QDBusPerformance::initTestCase()
QTestEventLoop::instance().enterLoop(5);
QVERIFY(con.interface()->isServiceRegistered(serviceName));
- remote = new QDBusInterface(serviceName, "/", "com.trolltech.autotests.Performance", con, this);
+ remote = new QDBusInterface(serviceName, "/", "org.qtproject.autotests.Performance", con, this);
QVERIFY(remote->isValid());
new ServerObject("/", con, this);
- local = new QDBusInterface(con.baseService(), "/", "com.trolltech.autotests.Performance", con, this);
+ local = new QDBusInterface(con.baseService(), "/", "org.qtproject.autotests.Performance", con, this);
QVERIFY(local->isValid());
}
@@ -168,13 +168,13 @@ void tst_QDBusPerformance::oneWay_data()
QByteArray ba(256, 'a');
while (ba.size() < 8193) {
- QTest::newRow(QString("%1-byteArray").arg(ba.size()).toAscii()) << qVariantFromValue(ba) << ba.size();
+ QTest::newRow(QString("%1-byteArray").arg(ba.size()).toAscii()) << QVariant::fromValue(ba) << ba.size();
ba += ba;
}
QString s(256, QLatin1Char('a'));
while (s.size() < 8193) {
- QTest::newRow(QString("%1-string").arg(s.size()).toAscii()) << qVariantFromValue(s) << s.size();
+ QTest::newRow(QString("%1-string").arg(s.size()).toAscii()) << QVariant::fromValue(s) << s.size();
s += s;
}
}
@@ -197,7 +197,7 @@ void tst_QDBusPerformance::oneWayVariant()
QFETCH(QVariant, data);
QFETCH(int, size);
- QVERIFY(executeTest("size", size, qVariantFromValue(QDBusVariant(data))));
+ QVERIFY(executeTest("size", size, QVariant::fromValue(QDBusVariant(data))));
}
void tst_QDBusPerformance::roundTrip_data()
@@ -223,7 +223,7 @@ void tst_QDBusPerformance::roundTripVariant()
QFETCH(QVariant, data);
QFETCH(int, size);
- QVERIFY(executeTest("echo", size, qVariantFromValue(QDBusVariant(data))));
+ QVERIFY(executeTest("echo", size, QVariant::fromValue(QDBusVariant(data))));
}
QTEST_MAIN(tst_QDBusPerformance)
diff --git a/tests/manual/bearerex/bearerex.cpp b/tests/manual/bearerex/bearerex.cpp
index 6826312880..c85fc439e9 100644
--- a/tests/manual/bearerex/bearerex.cpp
+++ b/tests/manual/bearerex/bearerex.cpp
@@ -90,7 +90,7 @@ void BearerEx::showConfigurations()
font.setUnderline(true);
listItem->setFont(font);
listItem->setText(" UserChoice");
- listItem->setData(Qt::UserRole, qVariantFromValue(defaultConfig));
+ listItem->setData(Qt::UserRole, QVariant::fromValue(defaultConfig));
listWidget->addItem(listItem);
}
@@ -121,7 +121,7 @@ void BearerEx::showConfigurations()
listItem->setFont(font);
}
listItem->setText(text);
- listItem->setData(Qt::UserRole, qVariantFromValue(configurations[i]));
+ listItem->setData(Qt::UserRole, QVariant::fromValue(configurations[i]));
listWidget->addItem(listItem);
}
}
@@ -143,7 +143,7 @@ void BearerEx::on_showDetailsButton_clicked()
return;
}
- QNetworkConfiguration networkConfiguration = qVariantValue<QNetworkConfiguration>(item->data(Qt::UserRole));
+ QNetworkConfiguration networkConfiguration = qvariant_cast<QNetworkConfiguration>(item->data(Qt::UserRole));
DetailedInfoDialog infoDialog(&networkConfiguration,this);
infoDialog.exec();
}
@@ -154,7 +154,7 @@ void BearerEx::on_createSessionButton_clicked()
if (!item) {
return;
}
- QNetworkConfiguration networkConfiguration = qVariantValue<QNetworkConfiguration>(item->data(Qt::UserRole));
+ QNetworkConfiguration networkConfiguration = qvariant_cast<QNetworkConfiguration>(item->data(Qt::UserRole));
int newTabIndex = mainTabWidget->count();
SessionTab* newTab = new SessionTab(&networkConfiguration,&m_NetworkConfigurationManager,eventListWidget,newTabIndex-1);
QString label = QString("S")+QString::number(newTabIndex-1);
diff --git a/tests/manual/keypadnavigation/main.cpp b/tests/manual/keypadnavigation/main.cpp
index 964d46faf6..ad53c9f655 100644
--- a/tests/manual/keypadnavigation/main.cpp
+++ b/tests/manual/keypadnavigation/main.cpp
@@ -142,7 +142,7 @@ protected slots:
QFontDialog::getFont(0, this);
break;
case DialogQuestion:
- QMessageBox::question(this, QLatin1String("question"), QLatin1String("¿Hola, que tal?"));
+ QMessageBox::question(this, QLatin1String("question"), QLatin1String("\xbfHola, que tal?"));
break;
case DialogAboutQt:
QMessageBox::aboutQt(this);
diff --git a/tests/manual/lance/main.cpp b/tests/manual/lance/main.cpp
index e8bb44a221..b66c0c109d 100644
--- a/tests/manual/lance/main.cpp
+++ b/tests/manual/lance/main.cpp
@@ -103,6 +103,7 @@ static void printHelp()
" -imagewidget same as image, but with interacion...\n"
#ifndef QT_NO_OPENGL
" -opengl Paints the files to an OpenGL on screen\n"
+ " -pbuffer Paints the files to an OpenGL pbuffer\n"
#endif
#ifdef USE_CUSTOM_DEVICE
" -customdevice Paints the files to the custom paint device\n"
@@ -117,8 +118,11 @@ static void printHelp()
" -grab Paints the files to an image called filename_qps.png\n"
" -i Interactive mode.\n"
" -v Verbose.\n"
- " -bg-white No checkers background\n"
- " -commands Displays all available commands\n");
+ " -commands Displays all available commands\n"
+ " -w Width of the paintdevice\n"
+ " -h Height of the paintdevice\n"
+ " -cmp Show the reference picture\n"
+ " -bg-white No checkers background\n");
}
static void displayCommands()
diff --git a/tests/manual/manual.pro b/tests/manual/manual.pro
index 9df151eee1..ef72a5eec4 100644
--- a/tests/manual/manual.pro
+++ b/tests/manual/manual.pro
@@ -27,6 +27,7 @@ socketengine \
textrendering \
widgets/itemviews/delegate \
windowflags \
+windowgeometry \
windowmodality
!contains(QT_CONFIG, openssl):!contains(QT_CONFIG, openssl-linked):SUBDIRS -= qssloptions
diff --git a/tests/manual/windowflags/controllerwindow.cpp b/tests/manual/windowflags/controllerwindow.cpp
index 586691a37d..1b547117d7 100644
--- a/tests/manual/windowflags/controllerwindow.cpp
+++ b/tests/manual/windowflags/controllerwindow.cpp
@@ -49,6 +49,7 @@
#include <QtWidgets/QHBoxLayout>
#include "controllerwindow.h"
+#include "controls.h"
//! [0]
ControllerWindow::ControllerWindow()
@@ -62,7 +63,6 @@ ControllerWindow::ControllerWindow()
previewDialog = new PreviewDialog;
createTypeGroupBox();
- createHintsGroupBox();
quitButton = new QPushButton(tr("&Quit"));
connect(quitButton, SIGNAL(clicked()), qApp, SLOT(quit()));
@@ -71,11 +71,25 @@ ControllerWindow::ControllerWindow()
bottomLayout->addStretch();
bottomLayout->addWidget(quitButton);
+ hintsControl = new HintControl;
+ hintsControl->setHints(previewWindow->windowFlags());
+ connect(hintsControl, SIGNAL(changed(Qt::WindowFlags)), this, SLOT(updatePreview()));
+
+ statesControl = new WindowStatesControl(WindowStatesControl::WantVisibleCheckBox);
+ statesControl->setStates(previewWindow->windowState());
+ statesControl->setVisibleValue(true);
+ connect(statesControl, SIGNAL(changed()), this, SLOT(updatePreview()));
+
+ typeControl = new TypeControl;
+ typeControl->setType(previewWindow->windowFlags());
+ connect(typeControl, SIGNAL(changed(Qt::WindowFlags)), this, SLOT(updatePreview()));
+
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addWidget(widgetTypeGroupBox);
mainLayout->addWidget(additionalOptionsGroupBox);
- mainLayout->addWidget(typeGroupBox);
- mainLayout->addWidget(hintsGroupBox);
+ mainLayout->addWidget(typeControl);
+ mainLayout->addWidget(hintsControl);
+ mainLayout->addWidget(statesControl);
mainLayout->addLayout(bottomLayout);
setLayout(mainLayout);
@@ -86,52 +100,7 @@ ControllerWindow::ControllerWindow()
void ControllerWindow::updatePreview()
{
- Qt::WindowFlags flags = 0;
-
- if (windowRadioButton->isChecked()) {
- flags = Qt::Window;
- } else if (dialogRadioButton->isChecked()) {
- flags = Qt::Dialog;
- } else if (sheetRadioButton->isChecked()) {
- flags = Qt::Sheet;
- } else if (drawerRadioButton->isChecked()) {
- flags = Qt::Drawer;
- } else if (popupRadioButton->isChecked()) {
- flags = Qt::Popup;
- } else if (toolRadioButton->isChecked()) {
- flags = Qt::Tool;
- } else if (toolTipRadioButton->isChecked()) {
- flags = Qt::ToolTip;
- } else if (splashScreenRadioButton->isChecked()) {
- flags = Qt::SplashScreen;
- }
-
- if (msWindowsFixedSizeDialogCheckBox->isChecked())
- flags |= Qt::MSWindowsFixedSizeDialogHint;
- if (x11BypassWindowManagerCheckBox->isChecked())
- flags |= Qt::X11BypassWindowManagerHint;
- if (framelessWindowCheckBox->isChecked())
- flags |= Qt::FramelessWindowHint;
- if (windowTitleCheckBox->isChecked())
- flags |= Qt::WindowTitleHint;
- if (windowSystemMenuCheckBox->isChecked())
- flags |= Qt::WindowSystemMenuHint;
- if (windowMinimizeButtonCheckBox->isChecked())
- flags |= Qt::WindowMinimizeButtonHint;
- if (windowMaximizeButtonCheckBox->isChecked())
- flags |= Qt::WindowMaximizeButtonHint;
- if (windowCloseButtonCheckBox->isChecked())
- flags |= Qt::WindowCloseButtonHint;
- if (windowContextHelpButtonCheckBox->isChecked())
- flags |= Qt::WindowContextHelpButtonHint;
- if (windowShadeButtonCheckBox->isChecked())
- flags |= Qt::WindowShadeButtonHint;
- if (windowStaysOnTopCheckBox->isChecked())
- flags |= Qt::WindowStaysOnTopHint;
- if (windowStaysOnBottomCheckBox->isChecked())
- flags |= Qt::WindowStaysOnBottomHint;
- if (customizeWindowHintCheckBox->isChecked())
- flags |= Qt::CustomizeWindowHint;
+ const Qt::WindowFlags flags = typeControl->type() | hintsControl->hints();
previewWindow->hide();
previewDialog->hide();
@@ -165,7 +134,9 @@ void ControllerWindow::updatePreview()
if (pos.y() < 0)
pos.setY(0);
widget->move(pos);
- widget->show();
+
+ widget->setWindowState(statesControl->states());
+ widget->setVisible(statesControl->visibleValue());
}
void ControllerWindow::createTypeGroupBox()
@@ -186,71 +157,10 @@ void ControllerWindow::createTypeGroupBox()
l->addWidget(modalWindowCheckBox);
l->addWidget(fixedSizeWindowCheckBox);
additionalOptionsGroupBox->setLayout(l);
-
- typeGroupBox = new QGroupBox(tr("Type"));
-
- windowRadioButton = createRadioButton(tr("Window"));
- dialogRadioButton = createRadioButton(tr("Dialog"));
- sheetRadioButton = createRadioButton(tr("Sheet"));
- drawerRadioButton = createRadioButton(tr("Drawer"));
- popupRadioButton = createRadioButton(tr("Popup"));
- toolRadioButton = createRadioButton(tr("Tool"));
- toolTipRadioButton = createRadioButton(tr("Tooltip"));
- splashScreenRadioButton = createRadioButton(tr("Splash screen"));
- windowRadioButton->setChecked(true);
-
- QGridLayout *layout = new QGridLayout;
- layout->addWidget(windowRadioButton, 0, 0);
- layout->addWidget(dialogRadioButton, 1, 0);
- layout->addWidget(sheetRadioButton, 2, 0);
- layout->addWidget(drawerRadioButton, 3, 0);
- layout->addWidget(popupRadioButton, 0, 1);
- layout->addWidget(toolRadioButton, 1, 1);
- layout->addWidget(toolTipRadioButton, 2, 1);
- layout->addWidget(splashScreenRadioButton, 3, 1);
- typeGroupBox->setLayout(layout);
}
//! [5]
//! [6]
-void ControllerWindow::createHintsGroupBox()
-{
- hintsGroupBox = new QGroupBox(tr("Hints"));
-
- msWindowsFixedSizeDialogCheckBox =
- createCheckBox(tr("MS Windows fixed size dialog"));
- x11BypassWindowManagerCheckBox =
- createCheckBox(tr("X11 bypass window manager"));
- framelessWindowCheckBox = createCheckBox(tr("Frameless window"));
- windowTitleCheckBox = createCheckBox(tr("Window title"));
- windowSystemMenuCheckBox = createCheckBox(tr("Window system menu"));
- windowMinimizeButtonCheckBox = createCheckBox(tr("Window minimize button"));
- windowMaximizeButtonCheckBox = createCheckBox(tr("Window maximize button"));
- windowCloseButtonCheckBox = createCheckBox(tr("Window close button"));
- windowContextHelpButtonCheckBox =
- createCheckBox(tr("Window context help button"));
- windowShadeButtonCheckBox = createCheckBox(tr("Window shade button"));
- windowStaysOnTopCheckBox = createCheckBox(tr("Window stays on top"));
- windowStaysOnBottomCheckBox = createCheckBox(tr("Window stays on bottom"));
- customizeWindowHintCheckBox= createCheckBox(tr("Customize window"));
-
- QGridLayout *layout = new QGridLayout;
- layout->addWidget(msWindowsFixedSizeDialogCheckBox, 0, 0);
- layout->addWidget(x11BypassWindowManagerCheckBox, 1, 0);
- layout->addWidget(framelessWindowCheckBox, 2, 0);
- layout->addWidget(windowTitleCheckBox, 3, 0);
- layout->addWidget(windowSystemMenuCheckBox, 4, 0);
- layout->addWidget(windowMinimizeButtonCheckBox, 0, 1);
- layout->addWidget(windowMaximizeButtonCheckBox, 1, 1);
- layout->addWidget(windowCloseButtonCheckBox, 2, 1);
- layout->addWidget(windowContextHelpButtonCheckBox, 3, 1);
- layout->addWidget(windowShadeButtonCheckBox, 4, 1);
- layout->addWidget(windowStaysOnTopCheckBox, 5, 1);
- layout->addWidget(windowStaysOnBottomCheckBox, 6, 1);
- layout->addWidget(customizeWindowHintCheckBox, 5, 0);
- hintsGroupBox->setLayout(layout);
-}
-//! [6]
//! [7]
QCheckBox *ControllerWindow::createCheckBox(const QString &text)
diff --git a/tests/manual/windowflags/controllerwindow.h b/tests/manual/windowflags/controllerwindow.h
index 02827cffd8..5f6edbb3cb 100644
--- a/tests/manual/windowflags/controllerwindow.h
+++ b/tests/manual/windowflags/controllerwindow.h
@@ -42,7 +42,7 @@
#ifndef CONTROLLERWINDOW_H
#define CONTROLLERWINDOW_H
-#include <QWidget>
+#include <QtWidgets/QWidget>
#include "previewwindow.h"
@@ -55,6 +55,10 @@ class QRadioButton;
class QMainWindow;
QT_END_NAMESPACE
+class HintControl;
+class WindowStatesControl;
+class TypeControl;
+
//! [0]
class ControllerWindow : public QWidget
{
@@ -68,47 +72,24 @@ private slots:
private:
void createTypeGroupBox();
- void createHintsGroupBox();
QCheckBox *createCheckBox(const QString &text);
QRadioButton *createRadioButton(const QString &text);
QMainWindow *parentWindow;
PreviewWindow *previewWindow;
PreviewDialog *previewDialog;
-
QGroupBox *widgetTypeGroupBox;
QGroupBox *additionalOptionsGroupBox;
- QGroupBox *typeGroupBox;
- QGroupBox *hintsGroupBox;
+ TypeControl *typeControl;
+ HintControl *hintsControl;
+ WindowStatesControl *statesControl;
+
QPushButton *quitButton;
QRadioButton *previewWidgetButton;
QRadioButton *previewDialogButton;
QCheckBox *modalWindowCheckBox;
QCheckBox *fixedSizeWindowCheckBox;
-
- QRadioButton *windowRadioButton;
- QRadioButton *dialogRadioButton;
- QRadioButton *sheetRadioButton;
- QRadioButton *drawerRadioButton;
- QRadioButton *popupRadioButton;
- QRadioButton *toolRadioButton;
- QRadioButton *toolTipRadioButton;
- QRadioButton *splashScreenRadioButton;
-
- QCheckBox *msWindowsFixedSizeDialogCheckBox;
- QCheckBox *x11BypassWindowManagerCheckBox;
- QCheckBox *framelessWindowCheckBox;
- QCheckBox *windowTitleCheckBox;
- QCheckBox *windowSystemMenuCheckBox;
- QCheckBox *windowMinimizeButtonCheckBox;
- QCheckBox *windowMaximizeButtonCheckBox;
- QCheckBox *windowCloseButtonCheckBox;
- QCheckBox *windowContextHelpButtonCheckBox;
- QCheckBox *windowShadeButtonCheckBox;
- QCheckBox *windowStaysOnTopCheckBox;
- QCheckBox *windowStaysOnBottomCheckBox;
- QCheckBox *customizeWindowHintCheckBox;
};
//! [0]
diff --git a/tests/manual/windowflags/controls.cpp b/tests/manual/windowflags/controls.cpp
new file mode 100644
index 0000000000..bdd8894c0d
--- /dev/null
+++ b/tests/manual/windowflags/controls.cpp
@@ -0,0 +1,314 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "controls.h"
+
+#include <QGridLayout>
+#include <QVBoxLayout>
+#include <QHBoxLayout>
+#include <QRadioButton>
+#include <QCheckBox>
+#include <QRadioButton>
+#include <QButtonGroup>
+#include <QDebug>
+
+HintControl::HintControl(QWidget *parent)
+ : QGroupBox(tr("Hints"), parent)
+ , msWindowsFixedSizeDialogCheckBox(new QCheckBox(tr("MS Windows fixed size dialog")))
+ , x11BypassWindowManagerCheckBox(new QCheckBox(tr("X11 bypass window manager")))
+ , framelessWindowCheckBox(new QCheckBox(tr("Frameless window")))
+ , windowTitleCheckBox(new QCheckBox(tr("Window title")))
+ , windowSystemMenuCheckBox(new QCheckBox(tr("Window system menu")))
+ , windowMinimizeButtonCheckBox(new QCheckBox(tr("Window minimize button")))
+ , windowMaximizeButtonCheckBox(new QCheckBox(tr("Window maximize button")))
+ , windowCloseButtonCheckBox(new QCheckBox(tr("Window close button")))
+ , windowContextHelpButtonCheckBox(new QCheckBox(tr("Window context help button")))
+ , windowShadeButtonCheckBox(new QCheckBox(tr("Window shade button")))
+ , windowStaysOnTopCheckBox(new QCheckBox(tr("Window stays on top")))
+ , windowStaysOnBottomCheckBox(new QCheckBox(tr("Window stays on bottom")))
+ , customizeWindowHintCheckBox(new QCheckBox(tr("Customize window")))
+{
+ connect(msWindowsFixedSizeDialogCheckBox, SIGNAL(clicked()), this, SLOT(slotCheckBoxChanged()));
+ connect(x11BypassWindowManagerCheckBox, SIGNAL(clicked()), this, SLOT(slotCheckBoxChanged()));
+ connect(framelessWindowCheckBox, SIGNAL(clicked()), this, SLOT(slotCheckBoxChanged()));
+ connect(windowTitleCheckBox, SIGNAL(clicked()), this, SLOT(slotCheckBoxChanged()));
+ connect(windowSystemMenuCheckBox, SIGNAL(clicked()), this, SLOT(slotCheckBoxChanged()));
+ connect(windowMinimizeButtonCheckBox, SIGNAL(clicked()), this, SLOT(slotCheckBoxChanged()));
+ connect(windowMaximizeButtonCheckBox, SIGNAL(clicked()), this, SLOT(slotCheckBoxChanged()));
+ connect(windowCloseButtonCheckBox, SIGNAL(clicked()), this, SLOT(slotCheckBoxChanged()));
+ connect(windowContextHelpButtonCheckBox, SIGNAL(clicked()), this, SLOT(slotCheckBoxChanged()));
+ connect(windowShadeButtonCheckBox, SIGNAL(clicked()), this, SLOT(slotCheckBoxChanged()));
+ connect(windowStaysOnTopCheckBox, SIGNAL(clicked()), this, SLOT(slotCheckBoxChanged()));
+ connect(windowStaysOnBottomCheckBox, SIGNAL(clicked()), this, SLOT(slotCheckBoxChanged()));
+ connect(customizeWindowHintCheckBox, SIGNAL(clicked()), this, SLOT(slotCheckBoxChanged()));
+ QGridLayout *layout = new QGridLayout(this);
+ layout->setSpacing(0);
+ layout->setMargin(ControlLayoutMargin);
+ layout->addWidget(msWindowsFixedSizeDialogCheckBox, 0, 0);
+ layout->addWidget(x11BypassWindowManagerCheckBox, 1, 0);
+ layout->addWidget(framelessWindowCheckBox, 2, 0);
+ layout->addWidget(windowTitleCheckBox, 3, 0);
+ layout->addWidget(windowSystemMenuCheckBox, 4, 0);
+ layout->addWidget(windowMinimizeButtonCheckBox, 0, 1);
+ layout->addWidget(windowMaximizeButtonCheckBox, 1, 1);
+ layout->addWidget(windowCloseButtonCheckBox, 2, 1);
+ layout->addWidget(windowContextHelpButtonCheckBox, 3, 1);
+ layout->addWidget(windowShadeButtonCheckBox, 4, 1);
+ layout->addWidget(windowStaysOnTopCheckBox, 5, 1);
+ layout->addWidget(windowStaysOnBottomCheckBox, 6, 1);
+ layout->addWidget(customizeWindowHintCheckBox, 5, 0);
+}
+
+Qt::WindowFlags HintControl::hints() const
+{
+ Qt::WindowFlags flags = 0;
+ if (msWindowsFixedSizeDialogCheckBox->isChecked())
+ flags |= Qt::MSWindowsFixedSizeDialogHint;
+ if (x11BypassWindowManagerCheckBox->isChecked())
+ flags |= Qt::X11BypassWindowManagerHint;
+ if (framelessWindowCheckBox->isChecked())
+ flags |= Qt::FramelessWindowHint;
+ if (windowTitleCheckBox->isChecked())
+ flags |= Qt::WindowTitleHint;
+ if (windowSystemMenuCheckBox->isChecked())
+ flags |= Qt::WindowSystemMenuHint;
+ if (windowMinimizeButtonCheckBox->isChecked())
+ flags |= Qt::WindowMinimizeButtonHint;
+ if (windowMaximizeButtonCheckBox->isChecked())
+ flags |= Qt::WindowMaximizeButtonHint;
+ if (windowCloseButtonCheckBox->isChecked())
+ flags |= Qt::WindowCloseButtonHint;
+ if (windowContextHelpButtonCheckBox->isChecked())
+ flags |= Qt::WindowContextHelpButtonHint;
+ if (windowShadeButtonCheckBox->isChecked())
+ flags |= Qt::WindowShadeButtonHint;
+ if (windowStaysOnTopCheckBox->isChecked())
+ flags |= Qt::WindowStaysOnTopHint;
+ if (windowStaysOnBottomCheckBox->isChecked())
+ flags |= Qt::WindowStaysOnBottomHint;
+ if (customizeWindowHintCheckBox->isChecked())
+ flags |= Qt::CustomizeWindowHint;
+ return flags;
+}
+
+void HintControl::setHints(Qt::WindowFlags flags)
+{
+ msWindowsFixedSizeDialogCheckBox->setChecked(flags & Qt::MSWindowsFixedSizeDialogHint);
+ x11BypassWindowManagerCheckBox->setChecked(flags & Qt::X11BypassWindowManagerHint);
+ framelessWindowCheckBox->setChecked(flags & Qt::FramelessWindowHint);
+ windowTitleCheckBox->setChecked(flags & Qt::WindowTitleHint);
+ windowSystemMenuCheckBox->setChecked(flags & Qt::WindowSystemMenuHint);
+ windowMinimizeButtonCheckBox->setChecked(flags & Qt::WindowMinimizeButtonHint);
+ windowMaximizeButtonCheckBox->setChecked(flags & Qt::WindowMaximizeButtonHint);
+ windowCloseButtonCheckBox->setChecked(flags & Qt::WindowCloseButtonHint);
+ windowContextHelpButtonCheckBox->setChecked(flags & Qt::WindowContextHelpButtonHint);
+ windowShadeButtonCheckBox->setChecked(flags & Qt::WindowShadeButtonHint);
+ windowStaysOnTopCheckBox->setChecked(flags & Qt::WindowStaysOnTopHint);
+ windowStaysOnBottomCheckBox->setChecked(flags & Qt::WindowStaysOnBottomHint);
+ customizeWindowHintCheckBox->setChecked(flags & Qt::CustomizeWindowHint);
+}
+
+void HintControl::slotCheckBoxChanged()
+{
+ emit changed(hints());
+}
+
+WindowStateControl::WindowStateControl(unsigned flags, QWidget *parent)
+ : QWidget(parent)
+ , group(new QButtonGroup)
+ , visibleCheckBox(0)
+ , restoreButton(new QRadioButton(tr("Normal")))
+ , minimizeButton(0)
+ , maximizeButton(new QRadioButton(tr("Maximized")))
+ , fullscreenButton(new QRadioButton(tr("Fullscreen")))
+{
+ QHBoxLayout *layout = new QHBoxLayout(this);
+ layout->setSpacing(0);
+ layout->setMargin(ControlLayoutMargin);
+ if (flags & WantVisibleCheckBox) {
+ visibleCheckBox = new QCheckBox(tr("Visible"));
+ connect(visibleCheckBox, SIGNAL(toggled(bool)), this, SIGNAL(changed()));
+ layout->addWidget(visibleCheckBox);
+ }
+
+ group->setExclusive(true);
+ if (flags & WantMinimizeRadioButton) {
+ minimizeButton = new QRadioButton(tr("Minimized"));
+ group->addButton(minimizeButton, Qt::WindowMinimized);
+ layout->addWidget(minimizeButton);
+ }
+ group->addButton(restoreButton, Qt::WindowNoState);
+ layout->addWidget(restoreButton);
+ group->addButton(maximizeButton, Qt::WindowMaximized);
+ layout->addWidget(maximizeButton);
+ group->addButton(fullscreenButton, Qt::WindowFullScreen);
+ layout->addWidget(fullscreenButton);
+ connect(group, SIGNAL(buttonReleased(int)), this, SIGNAL(changed()));
+}
+
+Qt::WindowState WindowStateControl::state() const
+{
+ return Qt::WindowState(group->checkedId());
+}
+
+void WindowStateControl::setState(Qt::WindowState s)
+{
+ group->blockSignals(true);
+ if (QAbstractButton *b = group->button(s))
+ b->setChecked(true);
+ group->blockSignals(false);
+}
+
+bool WindowStateControl::visibleValue() const
+{
+ return visibleCheckBox && visibleCheckBox->isChecked();
+}
+
+void WindowStateControl::setVisibleValue(bool v)
+{
+ if (visibleCheckBox) {
+ visibleCheckBox->blockSignals(true);
+ visibleCheckBox->setChecked(v);
+ visibleCheckBox->blockSignals(false);
+ }
+}
+
+WindowStatesControl::WindowStatesControl(unsigned flags, QWidget *parent)
+ : QGroupBox(tr("States"), parent)
+ , visibleCheckBox(0)
+ , minimizeCheckBox(new QCheckBox(tr("Minimized")))
+ , stateControl(new WindowStateControl(0))
+{
+ QHBoxLayout *layout = new QHBoxLayout(this);
+ layout->setSpacing(0);
+ layout->setMargin(ControlLayoutMargin);
+ if (flags & WantVisibleCheckBox) {
+ visibleCheckBox = new QCheckBox(tr("Visible"));
+ connect(visibleCheckBox, SIGNAL(toggled(bool)), this, SIGNAL(changed()));
+ layout->addWidget(visibleCheckBox);
+ }
+ layout->addWidget(minimizeCheckBox);
+ layout->addWidget(stateControl);
+ connect(stateControl, SIGNAL(changed()), this, SIGNAL(changed()));
+ connect(minimizeCheckBox, SIGNAL(clicked()), this, SIGNAL(changed()));
+}
+
+Qt::WindowStates WindowStatesControl::states() const
+{
+ Qt::WindowStates s = stateControl->state();
+ if (minimizeCheckBox->isChecked())
+ s |= Qt::WindowMinimized;
+ return s;
+}
+
+void WindowStatesControl::setStates(Qt::WindowStates s)
+{
+ minimizeCheckBox->blockSignals(true);
+ minimizeCheckBox->setChecked(s & Qt::WindowMinimized);
+ minimizeCheckBox->blockSignals(false);
+ s &= ~Qt::WindowMinimized;
+ stateControl->setState(Qt::WindowState(int(s)));
+}
+
+bool WindowStatesControl::visibleValue() const
+{
+ return visibleCheckBox && visibleCheckBox->isChecked();
+}
+
+void WindowStatesControl::setVisibleValue(bool v)
+{
+ if (visibleCheckBox) {
+ visibleCheckBox->blockSignals(true);
+ visibleCheckBox->setChecked(v);
+ visibleCheckBox->blockSignals(false);
+ }
+}
+
+TypeControl::TypeControl(QWidget *parent)
+ : QGroupBox(tr("Type"), parent)
+ , group(new QButtonGroup)
+ , windowRadioButton(new QRadioButton(tr("Window")))
+ , dialogRadioButton(new QRadioButton(tr("Dialog")))
+ , sheetRadioButton(new QRadioButton(tr("Sheet")))
+ , drawerRadioButton(new QRadioButton(tr("Drawer")))
+ , popupRadioButton(new QRadioButton(tr("Popup")))
+ , toolRadioButton(new QRadioButton(tr("Tool")))
+ , toolTipRadioButton(new QRadioButton(tr("Tooltip")))
+ , splashScreenRadioButton(new QRadioButton(tr("Splash screen")))
+{
+ group->setExclusive(true);
+ QGridLayout *layout = new QGridLayout(this);
+ layout->setSpacing(0);
+ layout->setMargin(ControlLayoutMargin);
+ group->addButton(windowRadioButton, Qt::Window);
+ layout->addWidget(windowRadioButton, 0, 0);
+ group->addButton(dialogRadioButton, Qt::Dialog);
+ layout->addWidget(dialogRadioButton, 1, 0);
+ group->addButton(sheetRadioButton, Qt::Sheet);
+ layout->addWidget(sheetRadioButton, 2, 0);
+ group->addButton(drawerRadioButton, Qt::Drawer);
+ layout->addWidget(drawerRadioButton, 3, 0);
+ group->addButton(popupRadioButton, Qt::Popup);
+ layout->addWidget(popupRadioButton, 0, 1);
+ group->addButton(toolRadioButton, Qt::Tool);
+ layout->addWidget(toolRadioButton, 1, 1);
+ group->addButton(toolTipRadioButton, Qt::ToolTip);
+ layout->addWidget(toolTipRadioButton, 2, 1);
+ group->addButton(splashScreenRadioButton, Qt::SplashScreen);
+ layout->addWidget(splashScreenRadioButton, 3, 1);
+ connect(group, SIGNAL(buttonReleased(int)), this, SLOT(slotChanged()));
+}
+
+Qt::WindowFlags TypeControl::type() const
+{
+ return Qt::WindowFlags(group->checkedId());
+}
+
+void TypeControl::setType(Qt::WindowFlags s)
+{
+ if (QAbstractButton *b = group->button(s & Qt::WindowType_Mask))
+ b->setChecked(true);
+}
+
+void TypeControl::slotChanged()
+{
+ emit changed(type());
+}
diff --git a/tests/manual/windowflags/controls.h b/tests/manual/windowflags/controls.h
new file mode 100644
index 0000000000..57d9798882
--- /dev/null
+++ b/tests/manual/windowflags/controls.h
@@ -0,0 +1,171 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef CONTROLS_H
+#define CONTROLS_H
+
+#include <QGroupBox>
+
+QT_BEGIN_NAMESPACE
+class QCheckBox;
+class QRadioButton;
+class QButtonGroup;
+QT_END_NAMESPACE
+
+enum { ControlLayoutMargin = 4 };
+
+// Control for the hint part of Qt::WindowFlags
+class HintControl : public QGroupBox
+{
+ Q_OBJECT
+public:
+ explicit HintControl(QWidget *parent= 0);
+
+ Qt::WindowFlags hints() const;
+ void setHints(Qt::WindowFlags hints);
+
+signals:
+ void changed(Qt::WindowFlags);
+
+private slots:
+ void slotCheckBoxChanged();
+
+private:
+ QCheckBox *msWindowsFixedSizeDialogCheckBox;
+ QCheckBox *x11BypassWindowManagerCheckBox;
+ QCheckBox *framelessWindowCheckBox;
+ QCheckBox *windowTitleCheckBox;
+ QCheckBox *windowSystemMenuCheckBox;
+ QCheckBox *windowMinimizeButtonCheckBox;
+ QCheckBox *windowMaximizeButtonCheckBox;
+ QCheckBox *windowCloseButtonCheckBox;
+ QCheckBox *windowContextHelpButtonCheckBox;
+ QCheckBox *windowShadeButtonCheckBox;
+ QCheckBox *windowStaysOnTopCheckBox;
+ QCheckBox *windowStaysOnBottomCheckBox;
+ QCheckBox *customizeWindowHintCheckBox;
+};
+
+// Control for the Qt::WindowState enum, optional with a "visible" QCheckbox
+class WindowStateControl : public QWidget {
+ Q_OBJECT
+public:
+ enum Flags {
+ WantVisibleCheckBox = 0x1,
+ WantMinimizeRadioButton = 0x2
+ };
+
+ explicit WindowStateControl(unsigned flags, QWidget *parent= 0);
+
+ Qt::WindowState state() const;
+ void setState(Qt::WindowState s);
+
+ bool visibleValue() const;
+ void setVisibleValue(bool);
+
+signals:
+ void changed();
+
+private:
+ QButtonGroup *group;
+ QCheckBox *visibleCheckBox;
+ QRadioButton *restoreButton;
+ QRadioButton *minimizeButton;
+ QRadioButton *maximizeButton;
+ QRadioButton *fullscreenButton;
+};
+
+// Control for the Qt::WindowStates flags (normal, maximized, fullscreen exclusively
+// combined with minimized and optionally, with a "visible" QCheckbox)
+class WindowStatesControl : public QGroupBox
+{
+ Q_OBJECT
+public:
+ enum Flags {
+ WantVisibleCheckBox = 0x1
+ };
+
+ explicit WindowStatesControl(unsigned flags, QWidget *parent= 0);
+
+ Qt::WindowStates states() const;
+ void setStates(Qt::WindowStates s);
+
+ bool visibleValue() const;
+ void setVisibleValue(bool);
+
+signals:
+ void changed();
+
+private:
+ QCheckBox *visibleCheckBox;
+ QCheckBox *minimizeCheckBox;
+ WindowStateControl *stateControl;
+};
+
+// Control for the type part of Qt::WindowFlags
+class TypeControl : public QGroupBox
+{
+ Q_OBJECT
+public:
+ explicit TypeControl(QWidget *parent= 0);
+
+ Qt::WindowFlags type() const;
+ void setType(Qt::WindowFlags);
+
+signals:
+ void changed(Qt::WindowFlags);
+
+private slots:
+ void slotChanged();
+
+private:
+ QButtonGroup *group;
+ QRadioButton *windowRadioButton;
+ QRadioButton *dialogRadioButton;
+ QRadioButton *sheetRadioButton;
+ QRadioButton *drawerRadioButton;
+ QRadioButton *popupRadioButton;
+ QRadioButton *toolRadioButton;
+ QRadioButton *toolTipRadioButton;
+ QRadioButton *splashScreenRadioButton;
+};
+
+#endif // CONTROLS_H
diff --git a/tests/manual/windowflags/previewwindow.cpp b/tests/manual/windowflags/previewwindow.cpp
index 684d1ee1fe..ba5399dd68 100644
--- a/tests/manual/windowflags/previewwindow.cpp
+++ b/tests/manual/windowflags/previewwindow.cpp
@@ -107,6 +107,8 @@ PreviewWindow::PreviewWindow(QWidget *parent)
showNormalButton = new QPushButton(tr("Show normal"));
connect(showNormalButton, SIGNAL(clicked()), this, SLOT(showNormal()));
+ showMinimizedButton = new QPushButton(tr("Show minimized"));
+ connect(showMinimizedButton, SIGNAL(clicked()), this, SLOT(showMinimized()));
showMaximizedButton = new QPushButton(tr("Show maximized"));
connect(showMaximizedButton, SIGNAL(clicked()), this, SLOT(showMaximized()));
showFullScreenButton = new QPushButton(tr("Show fullscreen"));
@@ -115,6 +117,7 @@ PreviewWindow::PreviewWindow(QWidget *parent)
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(textEdit);
layout->addWidget(showNormalButton);
+ layout->addWidget(showMinimizedButton);
layout->addWidget(showMaximizedButton);
layout->addWidget(showFullScreenButton);
layout->addWidget(closeButton);
@@ -143,6 +146,8 @@ PreviewDialog::PreviewDialog(QWidget *parent)
showNormalButton = new QPushButton(tr("Show normal"));
connect(showNormalButton, SIGNAL(clicked()), this, SLOT(showNormal()));
+ showMinimizedButton = new QPushButton(tr("Show minimized"));
+ connect(showMinimizedButton, SIGNAL(clicked()), this, SLOT(showMinimized()));
showMaximizedButton = new QPushButton(tr("Show maximized"));
connect(showMaximizedButton, SIGNAL(clicked()), this, SLOT(showMaximized()));
showFullScreenButton = new QPushButton(tr("Show fullscreen"));
@@ -151,6 +156,7 @@ PreviewDialog::PreviewDialog(QWidget *parent)
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(textEdit);
layout->addWidget(showNormalButton);
+ layout->addWidget(showMinimizedButton);
layout->addWidget(showMaximizedButton);
layout->addWidget(showFullScreenButton);
layout->addWidget(closeButton);
diff --git a/tests/manual/windowflags/previewwindow.h b/tests/manual/windowflags/previewwindow.h
index 42189016e1..9ff091f304 100644
--- a/tests/manual/windowflags/previewwindow.h
+++ b/tests/manual/windowflags/previewwindow.h
@@ -42,8 +42,8 @@
#ifndef PREVIEWWINDOW_H
#define PREVIEWWINDOW_H
-#include <QWidget>
-#include <QDialog>
+#include <QtWidgets/QWidget>
+#include <QtWidgets/QDialog>
QT_BEGIN_NAMESPACE
class QPushButton;
@@ -63,6 +63,7 @@ private:
QTextEdit *textEdit;
QPushButton *closeButton;
QPushButton *showNormalButton;
+ QPushButton *showMinimizedButton;
QPushButton *showMaximizedButton;
QPushButton *showFullScreenButton;
};
@@ -80,6 +81,7 @@ private:
QTextEdit *textEdit;
QPushButton *closeButton;
QPushButton *showNormalButton;
+ QPushButton *showMinimizedButton;
QPushButton *showMaximizedButton;
QPushButton *showFullScreenButton;
};
diff --git a/tests/manual/windowflags/windowflags.pro b/tests/manual/windowflags/windowflags.pro
index 06def212b3..46e9475800 100644
--- a/tests/manual/windowflags/windowflags.pro
+++ b/tests/manual/windowflags/windowflags.pro
@@ -1,7 +1,12 @@
QT += widgets
HEADERS = controllerwindow.h \
- previewwindow.h
+ previewwindow.h \
+ controls.h
+
SOURCES = controllerwindow.cpp \
previewwindow.cpp \
- main.cpp
+ main.cpp \
+ controls.cpp
+
+QT += widgets
diff --git a/tests/manual/windowgeometry/controllerwidget.cpp b/tests/manual/windowgeometry/controllerwidget.cpp
new file mode 100644
index 0000000000..e45b05776d
--- /dev/null
+++ b/tests/manual/windowgeometry/controllerwidget.cpp
@@ -0,0 +1,483 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "controllerwidget.h"
+#include <controls.h>
+
+#if QT_VERSION >= 0x050000
+# include <QtWidgets>
+# include <QWindow>
+# include <QBackingStore>
+# include <QPaintDevice>
+# include <QPainter>
+#else
+# include <QtGui>
+#endif
+
+#include <QResizeEvent>
+
+CoordinateControl::CoordinateControl(const QString &sep) : m_x(new QSpinBox), m_y(new QSpinBox)
+{
+ m_x->setMinimum(0);
+ m_x->setMaximum(2000);
+ connect(m_x, SIGNAL(valueChanged(int)), this, SLOT(spinBoxChanged()));
+ m_y->setMinimum(0);
+ m_y->setMaximum(2000);
+ connect(m_y, SIGNAL(valueChanged(int)), this, SLOT(spinBoxChanged()));
+ QHBoxLayout *l = new QHBoxLayout(this);
+ l->setSpacing(2);
+ l->addWidget(m_x);
+ l->addWidget(new QLabel(sep));
+ l->addWidget(m_y);
+}
+
+void CoordinateControl::setCoordinates(int x, int y)
+{
+ m_x->blockSignals(true);
+ m_y->blockSignals(true);
+ m_x->setValue(x);
+ m_y->setValue(y);
+ m_x->blockSignals(false);
+ m_y->blockSignals(false);
+}
+
+QPair<int, int> CoordinateControl::coordinates() const
+{
+ return QPair<int, int>(m_x->value(), m_y->value());
+}
+
+void CoordinateControl::spinBoxChanged()
+{
+ const int x = m_x->value();
+ const int y = m_y->value();
+ emit pointValueChanged(QPoint(x, y));
+ emit sizeValueChanged(QSize(x, y));
+}
+
+RectControl::RectControl()
+ : m_point(new CoordinateControl(QLatin1String("+")))
+ , m_size(new CoordinateControl(QLatin1String("x")))
+{
+ QHBoxLayout *l = new QHBoxLayout(this);
+ l->setSpacing(0);
+ l->setMargin(ControlLayoutMargin);
+ connect(m_point, SIGNAL(pointValueChanged(QPoint)), this, SLOT(handleChanged()));
+ connect(m_point, SIGNAL(pointValueChanged(QPoint)), this, SIGNAL(positionChanged(QPoint)));
+ l->addWidget(m_point);
+ l->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::MinimumExpanding, QSizePolicy::Ignored));
+ connect(m_size, SIGNAL(sizeValueChanged(QSize)), this, SLOT(handleChanged()));
+ connect(m_size, SIGNAL(sizeValueChanged(QSize)), this, SIGNAL(sizeChanged(QSize)));
+ l->addWidget(m_size);
+}
+
+void RectControl::setRectValue(const QRect &r)
+{
+ m_point->setPointValue(r.topLeft());
+ m_size->setSizeValue(r.size());
+}
+
+QRect RectControl::rectValue() const
+{
+ return QRect(m_point->pointValue(), m_size->sizeValue());
+}
+
+void RectControl::handleChanged()
+{
+ emit changed(rectValue());
+}
+
+BaseWindowControl::BaseWindowControl(QObject *w)
+ : m_layout(new QGridLayout(this))
+ , m_object(w)
+ , m_geometry(new RectControl)
+ , m_framePosition(new CoordinateControl(QLatin1String("x")))
+ , m_typeControl(new TypeControl)
+ , m_hintControl(new HintControl)
+ , m_moveEventLabel(new QLabel(tr("Move events")))
+ , m_resizeEventLabel(new QLabel(tr("Resize events")))
+ , m_mouseEventLabel(new QLabel(tr("Mouse events")))
+ , m_moveCount(0)
+ , m_resizeCount(0)
+{
+ m_object->installEventFilter(this);
+ m_geometry->setTitle(tr("Geometry"));
+ int row = 0;
+ m_layout->addWidget(m_geometry, row, 0, 1, 2);
+ m_layout->setMargin(ControlLayoutMargin);
+ QGroupBox *frameGB = new QGroupBox(tr("Frame"));
+ QVBoxLayout *frameL = new QVBoxLayout(frameGB);
+ frameL->setSpacing(0);
+ frameL->setMargin(ControlLayoutMargin);
+ frameL->addWidget(m_framePosition);
+ m_layout->addWidget(frameGB, row, 2);
+
+ m_layout->addWidget(m_hintControl, ++row, 0, 1, 2);
+ connect(m_hintControl, SIGNAL(changed(Qt::WindowFlags)), this, SLOT(windowFlagsChanged()));
+ m_layout->addWidget(m_typeControl, row, 2);
+ connect(m_typeControl, SIGNAL(changed(Qt::WindowFlags)), this, SLOT(windowFlagsChanged()));
+
+ QGroupBox *eventGroupBox = new QGroupBox(tr("Events"));
+ QVBoxLayout *l = new QVBoxLayout(eventGroupBox);
+ l->setSpacing(0);
+ l->setMargin(ControlLayoutMargin);
+ l->addWidget(m_moveEventLabel);
+ l->addWidget(m_resizeEventLabel);
+ l->addWidget(m_mouseEventLabel);
+ m_layout->addWidget(eventGroupBox, ++row, 2);
+
+ connect(m_geometry, SIGNAL(positionChanged(QPoint)), this, SLOT(posChanged(QPoint)));
+ connect(m_geometry, SIGNAL(sizeChanged(QSize)), this, SLOT(sizeChanged(QSize)));
+ connect(m_framePosition, SIGNAL(pointValueChanged(QPoint)), this, SLOT(framePosChanged(QPoint)));
+}
+
+bool BaseWindowControl::eventFilter(QObject *, QEvent *e)
+{
+ switch (e->type()) {
+ case QEvent::Resize: {
+ const QResizeEvent *re = static_cast<const QResizeEvent *>(e);
+ m_resizeEventLabel->setText(tr("Resize %1x%2 (#%3)")
+ .arg(re->size().width()).arg(re->size().height())
+ .arg(++m_resizeCount));
+ refresh();
+ }
+ break;
+ case QEvent::Move: {
+ const QMoveEvent *me = static_cast<const QMoveEvent *>(e);
+ m_moveEventLabel->setText(tr("Move %1,%2 (#%3)")
+ .arg(me->pos().x()).arg(me->pos().y())
+ .arg(++m_moveCount));
+ refresh();
+ }
+ break;
+ case QEvent::MouseMove: {
+ const QMouseEvent *me = static_cast<const QMouseEvent *>(e);
+ const QPoint pos = me->pos();
+ QPoint globalPos = objectMapToGlobal(m_object, pos);
+ m_mouseEventLabel->setText(tr("Mouse: %1,%2 Global: %3,%4 ").
+ arg(pos.x()).arg(pos.y()).arg(globalPos.x()).arg(globalPos.y()));
+ }
+ break;
+ case QEvent::WindowStateChange:
+ refresh();
+ default:
+ break;
+ }
+ return false;
+}
+
+void BaseWindowControl::posChanged(const QPoint &p)
+{
+ QRect geom = objectGeometry(m_object);
+ geom.moveTopLeft(p);
+ setObjectGeometry(m_object, geom);
+}
+
+void BaseWindowControl::sizeChanged(const QSize &s)
+{
+ QRect geom = objectGeometry(m_object);
+ geom.setSize(s);
+ setObjectGeometry(m_object, geom);
+}
+
+void BaseWindowControl::framePosChanged(const QPoint &p)
+{
+ setObjectFramePosition(m_object, p);
+}
+
+void BaseWindowControl::windowFlagsChanged()
+{
+ const Qt::WindowFlags f = m_typeControl->type() | m_hintControl->hints();
+ setObjectWindowFlags(m_object, f);
+}
+
+void BaseWindowControl::refresh()
+{
+ m_geometry->setRectValue(objectGeometry(m_object));
+ m_framePosition->setPointValue(objectFramePosition(m_object));
+ const Qt::WindowFlags flags = objectWindowFlags(m_object);
+ m_typeControl->setType(flags);
+ m_hintControl->setHints(flags);
+}
+
+// A control for a QWidget
+class WidgetWindowControl : public BaseWindowControl
+{
+ Q_OBJECT
+public:
+ explicit WidgetWindowControl(QWidget *w);
+
+ virtual void refresh();
+
+private slots:
+ void statesChanged();
+
+private:
+ virtual QRect objectGeometry(const QObject *o) const
+ { return static_cast<const QWidget *>(o)->geometry(); }
+ virtual void setObjectGeometry(QObject *o, const QRect &r) const
+ { static_cast<QWidget *>(o)->setGeometry(r); }
+ virtual QPoint objectFramePosition(const QObject *o) const
+ { return static_cast<const QWidget *>(o)->pos(); }
+ virtual void setObjectFramePosition(QObject *o, const QPoint &p) const
+ { static_cast<QWidget *>(o)->move(p); }
+ virtual QPoint objectMapToGlobal(const QObject *o, const QPoint &p) const
+ { return static_cast<const QWidget *>(o)->mapToGlobal(p); }
+ virtual Qt::WindowFlags objectWindowFlags(const QObject *o) const
+ { return static_cast<const QWidget *>(o)->windowFlags(); }
+ virtual void setObjectWindowFlags(QObject *o, Qt::WindowFlags f);
+
+ WindowStatesControl *m_statesControl;
+};
+
+WidgetWindowControl::WidgetWindowControl(QWidget *w )
+ : BaseWindowControl(w)
+ , m_statesControl(new WindowStatesControl(WindowStatesControl::WantVisibleCheckBox))
+{
+ setTitle(w->windowTitle());
+ m_layout->addWidget(m_statesControl, 2, 0);
+ connect(m_statesControl, SIGNAL(changed()), this, SLOT(statesChanged()));
+}
+
+void WidgetWindowControl::setObjectWindowFlags(QObject *o, Qt::WindowFlags f)
+{
+ QWidget *w = static_cast<QWidget *>(o);
+ const bool visible = w->isVisible();
+ w->setWindowFlags(f); // hides.
+ if (visible)
+ w->show();
+}
+
+void WidgetWindowControl::refresh()
+{
+ const QWidget *w = static_cast<const QWidget *>(m_object);
+ m_statesControl->setVisibleValue(w->isVisible());
+ m_statesControl->setStates(w->windowState());
+ BaseWindowControl::refresh();
+}
+
+void WidgetWindowControl::statesChanged()
+{
+ QWidget *w = static_cast<QWidget *>(m_object);
+ w->setVisible(m_statesControl->visibleValue());
+ w->setWindowState(m_statesControl->states());
+}
+
+#if QT_VERSION >= 0x050000
+
+// Test window drawing diagonal lines
+class Window : public QWindow
+{
+public:
+ explicit Window(QWindow *parent = 0)
+ : QWindow(parent)
+ , m_backingStore(new QBackingStore(this))
+ {
+ setObjectName(QStringLiteral("window"));
+ setWindowTitle(tr("TestWindow"));
+ }
+
+protected:
+ void exposeEvent(QExposeEvent *)
+ { render(); }
+
+private:
+ QBackingStore *m_backingStore;
+ void render();
+};
+
+void Window::render()
+{
+ QRect rect(QPoint(), geometry().size());
+ m_backingStore->resize(rect.size());
+ m_backingStore->beginPaint(rect);
+ if (!rect.size().isEmpty()) {
+ QPaintDevice *device = m_backingStore->paintDevice();
+ QPainter p(device);
+ p.fillRect(rect, Qt::white);
+ p.drawLine(0, 0, rect.width(), rect.height());
+ p.drawLine(0, rect.height(), rect.width(), 0);
+ }
+ m_backingStore->endPaint();
+ m_backingStore->flush(rect);
+}
+
+// A control for a QWindow
+class WindowControl : public BaseWindowControl
+{
+ Q_OBJECT
+public:
+ explicit WindowControl(QWindow *w);
+
+ virtual void refresh();
+
+private slots:
+ void stateChanged();
+
+private:
+ virtual QRect objectGeometry(const QObject *o) const
+ { return static_cast<const QWindow *>(o)->geometry(); }
+ virtual void setObjectGeometry(QObject *o, const QRect &r) const
+ { static_cast<QWindow *>(o)->setGeometry(r); }
+ virtual QPoint objectFramePosition(const QObject *o) const
+ { return static_cast<const QWindow *>(o)->framePos(); }
+ virtual void setObjectFramePosition(QObject *o, const QPoint &p) const
+ { static_cast<QWindow *>(o)->setFramePos(p); }
+ virtual QPoint objectMapToGlobal(const QObject *o, const QPoint &p) const
+ { return static_cast<const QWindow *>(o)->mapToGlobal(p); }
+ virtual Qt::WindowFlags objectWindowFlags(const QObject *o) const
+ { return static_cast<const QWindow *>(o)->windowFlags(); }
+ virtual void setObjectWindowFlags(QObject *o, Qt::WindowFlags f)
+ { static_cast<QWindow *>(o)->setWindowFlags(f); }
+
+ WindowStateControl *m_stateControl;
+};
+
+WindowControl::WindowControl(QWindow *w )
+ : BaseWindowControl(w)
+ , m_stateControl(new WindowStateControl(WindowStateControl::WantVisibleCheckBox | WindowStateControl::WantMinimizeRadioButton))
+{
+ setTitle(w->windowTitle());
+ QGroupBox *stateGroupBox = new QGroupBox(tr("State"));
+ QVBoxLayout *l = new QVBoxLayout(stateGroupBox);
+ l->addWidget(m_stateControl);
+ m_layout->addWidget(stateGroupBox, 2, 0);
+ connect(m_stateControl, SIGNAL(changed()), this, SLOT(stateChanged()));
+}
+
+void WindowControl::refresh()
+{
+ const QWindow *w = static_cast<const QWindow *>(m_object);
+ BaseWindowControl::refresh();
+ m_stateControl->setVisibleValue(w->isVisible());
+ m_stateControl->setState(w->windowState());
+}
+
+void WindowControl::stateChanged()
+{
+ QWindow *w = static_cast<QWindow *>(m_object);
+ w->setVisible(m_stateControl->visibleValue());
+ w->setWindowState(m_stateControl->state());
+}
+
+#endif
+
+ControllerWidget::ControllerWidget(QWidget *parent)
+ : QMainWindow(parent)
+ , m_testWidget(new QWidget)
+#if QT_VERSION >= 0x050000
+ , m_testWindow(new Window)
+#endif
+{
+ QMenu *fileMenu = menuBar()->addMenu(tr("File"));
+ QAction *exitAction = fileMenu->addAction(tr("Exit"));
+ exitAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Q));
+ connect(exitAction, SIGNAL(triggered()), qApp, SLOT(closeAllWindows()));
+
+ QString title = QLatin1String("Geometry test, (Qt ");
+ title += QLatin1String(QT_VERSION_STR);
+#if QT_VERSION >= 0x050000
+ title += QLatin1String(", ");
+ title += qApp->platformName();
+#endif
+ title += QLatin1Char(')');
+ setWindowTitle(title);
+
+ int x = 100;
+ int y = 100;
+ const QStringList args = QApplication::arguments();
+ const int offsetArgIndex = args.indexOf(QLatin1String("-offset"));
+ if (offsetArgIndex >=0 && offsetArgIndex < args.size() - 1) {
+ y += args.at(offsetArgIndex + 1).toInt();
+ } else {
+ if (QT_VERSION < 0x050000)
+ y += 400;
+ }
+
+ move(x, y);
+
+ x += 800;
+ m_testWidget->setWindowTitle(tr("TestWidget"));
+ m_testWidget->move(x, y);
+ m_testWidget->resize(200, 200);
+ m_testWidget->show();
+
+#if QT_VERSION >= 0x050000
+ x += 300;
+ m_testWindow->setWindowFlags(Qt::Window | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint
+ | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint
+ | Qt::WindowTitleHint);
+ m_testWindow->setFramePos(QPoint(x, y));
+ m_testWindow->resize(200, 200);
+ m_testWindow->show();
+ m_testWindow->setWindowTitle(tr("TestWindow"));
+#endif
+
+ QWidget *central = new QWidget ;
+ QVBoxLayout *l = new QVBoxLayout(central);
+
+ const QString labelText = tr(
+ "<html><head/><body><p>This example lets you control the geometry"
+ " of a QWidget and a QWindow (Qt 5) for testing out"
+ " QPA plugins.</p>"
+ "<p>It compiles with Qt 4 and Qt 5 for comparison.</p>"
+ "<p>The command line option <code>-offset &lt;value&gt;</code> specifies"
+ " a vertical offset.</p></body></html>");
+
+ l->addWidget(new QLabel(labelText));
+
+ BaseWindowControl *widgetControl = new WidgetWindowControl(m_testWidget.data());
+ widgetControl->refresh();
+ l->addWidget(widgetControl);
+
+#if QT_VERSION >= 0x050000
+ BaseWindowControl *windowControl = new WindowControl(m_testWindow.data());
+ windowControl->refresh();
+ l->addWidget(windowControl);
+#endif
+
+ setCentralWidget(central);
+}
+
+ControllerWidget::~ControllerWidget()
+{
+}
+
+#include "controllerwidget.moc"
diff --git a/tests/manual/windowgeometry/controllerwidget.h b/tests/manual/windowgeometry/controllerwidget.h
new file mode 100644
index 0000000000..9e3901be6c
--- /dev/null
+++ b/tests/manual/windowgeometry/controllerwidget.h
@@ -0,0 +1,168 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef CONTROLLERWIDGET_H
+#define CONTROLLERWIDGET_H
+
+#include <QMainWindow>
+#include <QGroupBox>
+#include <QScopedPointer>
+
+QT_BEGIN_NAMESPACE
+class QSpinBox;
+class QLabel;
+class QGridLayout;
+QT_END_NAMESPACE
+
+class TypeControl;
+class HintControl;
+
+// A control for editing points or sizes
+class CoordinateControl : public QWidget
+{
+ Q_OBJECT
+
+public:
+ CoordinateControl(const QString &sep);
+
+ void setPointValue(const QPoint &p) { setCoordinates(p.x(), p.y()); }
+ QPoint pointValue() const { const QPair<int, int> t = coordinates(); return QPoint(t.first, t.second); }
+
+ void setSizeValue(const QSize &s) { setCoordinates(s.width(), s.height()); }
+ QSize sizeValue() const { const QPair<int, int> t = coordinates(); return QSize(t.first, t.second); }
+
+signals:
+ void pointValueChanged(const QPoint &p);
+ void sizeValueChanged(const QSize &s);
+
+private slots:
+ void spinBoxChanged();
+
+private:
+ void setCoordinates(int x, int y);
+ QPair<int, int> coordinates() const;
+
+ QSpinBox *m_x;
+ QSpinBox *m_y;
+};
+
+// A control for editing QRect
+class RectControl : public QGroupBox
+{
+ Q_OBJECT
+public:
+ RectControl();
+ void setRectValue(const QRect &r);
+ QRect rectValue() const;
+
+signals:
+ void changed(const QRect &r);
+ void sizeChanged(const QSize &s);
+ void positionChanged(const QPoint &s);
+
+private slots:
+ void handleChanged();
+
+private:
+ CoordinateControl *m_point;
+ CoordinateControl *m_size;
+};
+
+// Base class for controlling the position of a Window (QWindow or QWidget)
+class BaseWindowControl : public QGroupBox
+{
+ Q_OBJECT
+
+protected:
+ explicit BaseWindowControl(QObject *w);
+
+public:
+ virtual bool eventFilter(QObject *, QEvent *);
+ virtual void refresh();
+
+private slots:
+ void posChanged(const QPoint &);
+ void sizeChanged(const QSize &);
+ void framePosChanged(const QPoint &);
+ void windowFlagsChanged();
+
+protected:
+ QGridLayout *m_layout;
+ QObject *m_object;
+
+private:
+ virtual QRect objectGeometry(const QObject *o) const = 0;
+ virtual void setObjectGeometry(QObject *o, const QRect &) const = 0;
+
+ virtual QPoint objectFramePosition(const QObject *o) const = 0;
+ virtual void setObjectFramePosition(QObject *o, const QPoint &) const = 0;
+
+ virtual Qt::WindowFlags objectWindowFlags(const QObject *o) const = 0;
+ virtual void setObjectWindowFlags(QObject *o, Qt::WindowFlags) = 0;
+
+ virtual QPoint objectMapToGlobal(const QObject *o, const QPoint &) const = 0;
+
+ RectControl *m_geometry;
+ CoordinateControl *m_framePosition;
+ TypeControl *m_typeControl;
+ HintControl *m_hintControl;
+ QLabel *m_moveEventLabel;
+ QLabel *m_resizeEventLabel;
+ QLabel *m_mouseEventLabel;
+ unsigned m_moveCount;
+ unsigned m_resizeCount;
+};
+
+class ControllerWidget : public QMainWindow
+{
+ Q_OBJECT
+public:
+ explicit ControllerWidget(QWidget *parent = 0);
+ ~ControllerWidget();
+
+private:
+ QScopedPointer<QWidget> m_testWidget;
+#if QT_VERSION >= 0x050000
+ QScopedPointer<QWindow> m_testWindow;
+#endif
+};
+
+#endif // CONTROLLERWIDGET_H
diff --git a/tests/manual/windowgeometry/main.cpp b/tests/manual/windowgeometry/main.cpp
new file mode 100644
index 0000000000..46eeee53cf
--- /dev/null
+++ b/tests/manual/windowgeometry/main.cpp
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QApplication>
+#include "controllerwidget.h"
+
+int main(int argc, char *argv[])
+{
+ QApplication a(argc, argv);
+ ControllerWidget controller;
+ controller.show();
+ return a.exec();
+}
diff --git a/tests/manual/windowgeometry/windowgeometry.pro b/tests/manual/windowgeometry/windowgeometry.pro
new file mode 100644
index 0000000000..44ea97ba62
--- /dev/null
+++ b/tests/manual/windowgeometry/windowgeometry.pro
@@ -0,0 +1,9 @@
+QT += core gui
+TARGET = windowgeometry
+TEMPLATE = app
+
+INCLUDEPATH += ../windowflags
+SOURCES += $$PWD/main.cpp controllerwidget.cpp ../windowflags/controls.cpp
+HEADERS += controllerwidget.h ../windowflags/controls.h
+
+greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp
index 23b19ecf6e..d3084e19a7 100644
--- a/tools/configure/configureapp.cpp
+++ b/tools/configure/configureapp.cpp
@@ -47,6 +47,7 @@
#include <QDate>
#include <qdir.h>
+#include <qdiriterator.h>
#include <qtemporaryfile.h>
#include <qstack.h>
#include <qdebug.h>
@@ -80,7 +81,7 @@ bool writeToFile(const char* text, const QString &filename)
QDir dir(QFileInfo(file).absoluteDir());
if (!dir.exists())
dir.mkpath(dir.absolutePath());
- if (!file.open(QFile::WriteOnly)) {
+ if (!file.open(QFile::WriteOnly | QFile::Text)) {
cout << "Couldn't write to " << qPrintable(filename) << ": " << qPrintable(file.errorString())
<< endl;
return false;
@@ -144,13 +145,14 @@ Configure::Configure(int& argc, char** argv)
{ //make a syncqt script(s) that can be used in the shadow
QFile syncqt(buildPath + "/bin/syncqt");
+ // no QFile::Text, just in case the perl interpreter can't cope with them (unlikely)
if (syncqt.open(QFile::WriteOnly)) {
QTextStream stream(&syncqt);
stream << "#!/usr/bin/perl -w" << endl
<< "require \"" << sourcePath + "/bin/syncqt\";" << endl;
}
QFile syncqt_bat(buildPath + "/bin/syncqt.bat");
- if (syncqt_bat.open(QFile::WriteOnly)) {
+ if (syncqt_bat.open(QFile::WriteOnly | QFile::Text)) {
QTextStream stream(&syncqt_bat);
stream << "@echo off" << endl
<< "call " << fixSeparators(sourcePath) << fixSeparators("/bin/syncqt.bat -qtdir \"") << fixSeparators(buildPath) << "\" %*" << endl;
@@ -159,6 +161,7 @@ Configure::Configure(int& argc, char** argv)
}
QFile configtests(buildPath + "/bin/qtmodule-configtests");
+ // no QFile::Text, just in case the perl interpreter can't cope with them (unlikely)
if (configtests.open(QFile::WriteOnly)) {
QTextStream stream(&configtests);
stream << "#!/usr/bin/perl -w" << endl
@@ -353,7 +356,6 @@ QString Configure::firstLicensePath()
return QString();
}
-
// #### somehow I get a compiler error about vc++ reaching the nesting limit without
// undefining the ansi for scoping.
#ifdef for
@@ -1081,8 +1083,16 @@ void Configure::parseCmdLine()
}
// Ensure that QMAKESPEC exists in the mkspecs folder
- QDir mkspec_dir = fixSeparators(sourcePath + "/mkspecs");
- QStringList mkspecs = mkspec_dir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot);
+ const QString mkspecPath = fixSeparators(sourcePath + "/mkspecs");
+ QDirIterator itMkspecs(mkspecPath, QDir::AllDirs | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
+ QStringList mkspecs;
+
+ while (itMkspecs.hasNext()) {
+ QString mkspec = itMkspecs.next();
+ // Remove base PATH
+ mkspec.remove(0, mkspecPath.length() + 1);
+ mkspecs << mkspec;
+ }
if (dictionary["QMAKESPEC"].toLower() == "features"
|| !mkspecs.contains(dictionary["QMAKESPEC"], Qt::CaseInsensitive)) {
@@ -2859,6 +2869,8 @@ void Configure::generateConfigfiles()
if (dictionary[ "QT_SXE" ] == "no")
tmpStream<<"#define QT_NO_SXE"<<endl;
+ tmpStream<<"#define QT_QPA_DEFAULT_PLATFORM_NAME \"windows\""<<endl;
+
tmpStream.flush();
tmpFile.flush();
@@ -3397,6 +3409,9 @@ void Configure::generateMakefiles()
for (i=0; i<3; i++) {
for (int j=0; j<makeList[i].size(); ++j) {
MakeItem *it=makeList[i][j];
+ if (it->directory == "tools/configure")
+ continue; // don't overwrite our own Makefile
+
QString dirPath = fixSeparators(it->directory + "/");
QString projectName = it->proFile;
QString makefileName = buildPath + "/" + dirPath + it->target;
@@ -3423,7 +3438,7 @@ void Configure::generateMakefiles()
QDir::setCurrent(fixSeparators(dirPath));
QFile file(makefileName);
- if (!file.open(QFile::WriteOnly)) {
+ if (!file.open(QFile::WriteOnly | QFile::Text)) {
printf("failed on dirPath=%s, makefile=%s\n",
qPrintable(dirPath), qPrintable(makefileName));
continue;
diff --git a/util/local_database/qlocalexml2cpp.py b/util/local_database/qlocalexml2cpp.py
index 3cb2b982e5..882883dfd9 100755
--- a/util/local_database/qlocalexml2cpp.py
+++ b/util/local_database/qlocalexml2cpp.py
@@ -513,7 +513,7 @@ def main():
endonyms_data = StringData()
# Locale data
- data_temp_file.write("static const QLocalePrivate locale_data[] = {\n")
+ data_temp_file.write("static const QLocaleData locale_data[] = {\n")
data_temp_file.write("// lang script terr dec group list prcnt zero minus plus exp quotStart quotEnd altQuotStart altQuotEnd lpStart lpMid lpEnd lpTwo sDtFmt lDtFmt sTmFmt lTmFmt ssMonth slMonth sMonth lMonth sDays lDays am,len pm,len\n")
locale_keys = locale_map.keys()
diff --git a/util/unicode/main.cpp b/util/unicode/main.cpp
index d769176c6f..89e4406b8f 100644
--- a/util/unicode/main.cpp
+++ b/util/unicode/main.cpp
@@ -288,7 +288,7 @@ static void initSentenceBreak()
}
-static const char *lineBreakClass =
+static const char *line_break_class_string =
" // see http://www.unicode.org/reports/tr14/tr14-19.html\n"
" // we don't use the XX, AI and CB properties and map them to AL instead.\n"
" // as we don't support any EBDIC based OS'es, NL is ignored and mapped to AL as well.\n"
@@ -383,7 +383,7 @@ static const char *property_string =
" ushort lowerCaseSpecial : 1;\n"
" ushort upperCaseSpecial : 1;\n"
" ushort titleCaseSpecial : 1;\n"
- " ushort caseFoldSpecial : 1; /* currently unused */\n"
+ " ushort caseFoldSpecial : 1;\n"
" signed short mirrorDiff : 16;\n"
" signed short lowerCaseDiff : 16;\n"
" signed short upperCaseDiff : 16;\n"
@@ -397,7 +397,7 @@ static const char *property_string =
" Q_CORE_EXPORT const Properties * QT_FASTCALL properties(ushort ucs2);\n";
static const char *methods =
- " Q_CORE_EXPORT QUnicodeTables::LineBreakClass QT_FASTCALL lineBreakClass(uint ucs4);\n"
+ " Q_CORE_EXPORT LineBreakClass QT_FASTCALL lineBreakClass(uint ucs4);\n"
" inline int lineBreakClass(QChar ch)\n"
" { return lineBreakClass(ch.unicode()); }\n"
"\n"
@@ -458,7 +458,6 @@ struct PropertyFlags {
static QList<int> specialCaseMap;
-static int specialCaseMaxLen = 0;
static int appendToSpecialCaseMap(const QList<int> &map)
{
@@ -474,7 +473,6 @@ static int appendToSpecialCaseMap(const QList<int> &map)
}
int length = utf16map.size();
utf16map.prepend(length);
- specialCaseMaxLen = qMax(specialCaseMaxLen, length);
if (specialCaseMap.isEmpty())
specialCaseMap << 0; // placeholder
@@ -734,6 +732,7 @@ static int maxTitleCaseDiff = 0;
static void readUnicodeData()
{
+ qDebug() << "Reading UnicodeData.txt";
QFile f("data/UnicodeData.txt");
if (!f.exists())
qFatal("Couldn't find UnicodeData.txt");
@@ -785,10 +784,16 @@ static void readUnicodeData()
int upperCase = properties[UD_UpperCase].toInt(&ok, 16);
Q_ASSERT(ok);
int diff = upperCase - codepoint;
- if (qAbs(diff) >= (1<<14))
- qWarning() << "upperCaseDiff exceeded (" << hex << codepoint << "->" << upperCase << ")";
- data.p.upperCaseDiff = diff;
- maxUpperCaseDiff = qMax(maxUpperCaseDiff, qAbs(diff));
+ if (qAbs(diff) >= (1<<14)) {
+ qWarning() << "upperCaseDiff exceeded (" << hex << codepoint << "->" << upperCase << "); map it for special case";
+ // if the condition below doesn't hold anymore we need to modify our special upper casing code in qchar.cpp
+ Q_ASSERT(!QChar::requiresSurrogates(codepoint) && !QChar::requiresSurrogates(upperCase));
+ data.p.upperCaseSpecial = true;
+ data.p.upperCaseDiff = appendToSpecialCaseMap(QList<int>() << upperCase);
+ } else {
+ data.p.upperCaseDiff = diff;
+ maxUpperCaseDiff = qMax(maxUpperCaseDiff, qAbs(diff));
+ }
if (QChar::requiresSurrogates(codepoint) || QChar::requiresSurrogates(upperCase)) {
// if the conditions below doesn't hold anymore we need to modify our upper casing code
Q_ASSERT(QChar::highSurrogate(codepoint) == QChar::highSurrogate(upperCase));
@@ -799,10 +804,16 @@ static void readUnicodeData()
int lowerCase = properties[UD_LowerCase].toInt(&ok, 16);
Q_ASSERT(ok);
int diff = lowerCase - codepoint;
- if (qAbs(diff) >= (1<<14))
- qWarning() << "lowerCaseDiff exceeded (" << hex << codepoint << "->" << lowerCase << ")";
- data.p.lowerCaseDiff = diff;
- maxLowerCaseDiff = qMax(maxLowerCaseDiff, qAbs(diff));
+ if (qAbs(diff) >= (1<<14)) {
+ qWarning() << "lowerCaseDiff exceeded (" << hex << codepoint << "->" << lowerCase << "); map it for special case";
+ // if the condition below doesn't hold anymore we need to modify our special lower casing code in qchar.cpp
+ Q_ASSERT(!QChar::requiresSurrogates(codepoint) && !QChar::requiresSurrogates(lowerCase));
+ data.p.lowerCaseSpecial = true;
+ data.p.lowerCaseDiff = appendToSpecialCaseMap(QList<int>() << lowerCase);
+ } else {
+ data.p.lowerCaseDiff = diff;
+ maxLowerCaseDiff = qMax(maxLowerCaseDiff, qAbs(diff));
+ }
if (QChar::requiresSurrogates(codepoint) || QChar::requiresSurrogates(lowerCase)) {
// if the conditions below doesn't hold anymore we need to modify our lower casing code
Q_ASSERT(QChar::highSurrogate(codepoint) == QChar::highSurrogate(lowerCase));
@@ -816,10 +827,16 @@ static void readUnicodeData()
int titleCase = properties[UD_TitleCase].toInt(&ok, 16);
Q_ASSERT(ok);
int diff = titleCase - codepoint;
- if (qAbs(diff) >= (1<<14))
- qWarning() << "titleCaseDiff exceeded (" << hex << codepoint << "->" << titleCase << ")";
- data.p.titleCaseDiff = diff;
- maxTitleCaseDiff = qMax(maxTitleCaseDiff, qAbs(diff));
+ if (qAbs(diff) >= (1<<14)) {
+ qWarning() << "titleCaseDiff exceeded (" << hex << codepoint << "->" << titleCase << "); map it for special case";
+ // if the condition below doesn't hold anymore we need to modify our special title casing code in qchar.cpp
+ Q_ASSERT(!QChar::requiresSurrogates(codepoint) && !QChar::requiresSurrogates(titleCase));
+ data.p.titleCaseSpecial = true;
+ data.p.titleCaseDiff = appendToSpecialCaseMap(QList<int>() << titleCase);
+ } else {
+ data.p.titleCaseDiff = diff;
+ maxTitleCaseDiff = qMax(maxTitleCaseDiff, qAbs(diff));
+ }
if (QChar::requiresSurrogates(codepoint) || QChar::requiresSurrogates(titleCase)) {
// if the conditions below doesn't hold anymore we need to modify our title casing code
Q_ASSERT(QChar::highSurrogate(codepoint) == QChar::highSurrogate(titleCase));
@@ -847,10 +864,7 @@ static void readUnicodeData()
data.decomposition.append(d[i].toInt(&ok, 16));
Q_ASSERT(ok);
}
- if (!decompositionLength.contains(data.decomposition.size()))
- decompositionLength[data.decomposition.size()] = 1;
- else
- ++decompositionLength[data.decomposition.size()];
+ ++decompositionLength[data.decomposition.size()];
}
for (int i = codepoint; i <= lastCodepoint; ++i)
@@ -863,6 +877,7 @@ static int maxMirroredDiff = 0;
static void readBidiMirroring()
{
+ qDebug() << "Reading BidiMirroring.txt";
QFile f("data/BidiMirroring.txt");
if (!f.exists())
qFatal("Couldn't find BidiMirroring.txt");
@@ -902,6 +917,7 @@ static void readBidiMirroring()
static void readArabicShaping()
{
+ qDebug() << "Reading ArabicShaping.txt";
QFile f("data/ArabicShaping.txt");
if (!f.exists())
qFatal("Couldn't find ArabicShaping.txt");
@@ -953,6 +969,7 @@ static void readArabicShaping()
static void readDerivedAge()
{
+ qDebug() << "Reading DerivedAge.txt";
QFile f("data/DerivedAge.txt");
if (!f.exists())
qFatal("Couldn't find DerivedAge.txt");
@@ -1005,6 +1022,7 @@ static void readDerivedAge()
static void readDerivedNormalizationProps()
{
+ qDebug() << "Reading DerivedNormalizationProps.txt";
QFile f("data/DerivedNormalizationProps.txt");
if (!f.exists())
qFatal("Couldn't find DerivedNormalizationProps.txt");
@@ -1083,6 +1101,7 @@ struct NormalizationCorrection {
static QByteArray createNormalizationCorrections()
{
+ qDebug() << "Reading NormalizationCorrections.txt";
QFile f("data/NormalizationCorrections.txt");
if (!f.exists())
qFatal("Couldn't find NormalizationCorrections.txt");
@@ -1299,7 +1318,7 @@ static void readSpecialCasing()
}
if (upperMap.size() > 1) {
ud.p.upperCaseSpecial = true;
- ud.p.upperCaseDiff = appendToSpecialCaseMap(upperMap);;
+ ud.p.upperCaseDiff = appendToSpecialCaseMap(upperMap);
}
unicodeData.insert(codepoint, ud);
@@ -1355,17 +1374,23 @@ static void readCaseFolding()
if (foldMap.size() == 1) {
int caseFolded = foldMap.at(0);
int diff = caseFolded - codepoint;
- if (qAbs(diff) >= (1<<14))
- qWarning() << "caseFoldDiff exceeded (" << hex << codepoint << "->" << caseFolded << ")";
- ud.p.caseFoldDiff = diff;
- maxCaseFoldDiff = qMax(maxCaseFoldDiff, qAbs(diff));
+ if (qAbs(diff) >= (1<<14)) {
+ qWarning() << "caseFoldDiff exceeded (" << hex << codepoint << "->" << caseFolded << "); map it for special case";
+ // if the condition below doesn't hold anymore we need to modify our special case folding code in qchar.cpp
+ Q_ASSERT(!QChar::requiresSurrogates(codepoint) && !QChar::requiresSurrogates(caseFolded));
+ ud.p.caseFoldSpecial = true;
+ ud.p.caseFoldDiff = appendToSpecialCaseMap(foldMap);
+ } else {
+ ud.p.caseFoldDiff = diff;
+ maxCaseFoldDiff = qMax(maxCaseFoldDiff, qAbs(diff));
+ }
if (QChar::requiresSurrogates(codepoint) || QChar::requiresSurrogates(caseFolded)) {
// if the conditions below doesn't hold anymore we need to modify our case folding code
Q_ASSERT(QChar::highSurrogate(codepoint) == QChar::highSurrogate(caseFolded));
Q_ASSERT(QChar::lowSurrogate(codepoint) + diff == QChar::lowSurrogate(caseFolded));
}
- if (caseFolded != codepoint + ud.p.lowerCaseDiff)
- qDebug() << hex << codepoint;
+// if (caseFolded != codepoint + ud.p.lowerCaseDiff)
+// qDebug() << hex << codepoint;
} else {
qFatal("we currently don't support full case foldings");
// qDebug() << "special" << hex << foldMap;
@@ -1671,6 +1696,7 @@ static QList<BlockInfo> blockInfoList;
static void readBlocks()
{
+ qDebug() << "Reading Blocks.txt";
QFile f("data/Blocks.txt");
if (!f.exists())
qFatal("Couldn't find Blocks.txt");
@@ -1899,7 +1925,7 @@ QByteArray createScriptTableDeclaration()
declaration += " }; // size of each block\n\n";
// script table
- declaration += "namespace QUnicodeTables {\n\nstatic const unsigned char uc_scripts[] = {\n";
+ declaration += "static const unsigned char uc_scripts[] = {\n";
for (int i = 0; i < unicodeBlockCount; ++i) {
int block = (((i << 7) & 0xff00) | ((i & 1) * 0x80));
int blockAssignment[unicodeBlockSize];
@@ -1976,10 +2002,10 @@ QByteArray createScriptTableDeclaration()
if (declaration.endsWith(' '))
declaration.chop(1);
}
- declaration += "\n};\n\n} // namespace QUnicodeTables\n\n";
+ declaration += "\n};\n\n";
- declaration +=
- "Q_CORE_EXPORT int QT_FASTCALL QUnicodeTables::script(uint ucs4)\n"
+ declaration +=
+ "Q_CORE_EXPORT int QT_FASTCALL script(uint ucs4)\n"
"{\n"
" if (ucs4 > 0xffff)\n"
" return Common;\n"
@@ -1991,8 +2017,8 @@ QByteArray createScriptTableDeclaration()
" return script;\n"
"}\n\n";
- qDebug("createScriptTableDeclaration: table size is %d bytes",
- unicodeBlockCount + (extraBlockList.size() * unicodeBlockSize));
+ qDebug("createScriptTableDeclaration:");
+ qDebug(" memory usage: %d bytes", unicodeBlockCount + (extraBlockList.size() * unicodeBlockSize));
return declaration;
}
@@ -2025,6 +2051,13 @@ static QByteArray createPropertyInfo()
{
qDebug("createPropertyInfo:");
+ // we reserve one bit more than in the assert below for the sign
+ Q_ASSERT(maxMirroredDiff < (1<<12));
+ Q_ASSERT(maxLowerCaseDiff < (1<<14));
+ Q_ASSERT(maxUpperCaseDiff < (1<<14));
+ Q_ASSERT(maxTitleCaseDiff < (1<<14));
+ Q_ASSERT(maxCaseFoldDiff < (1<<14));
+
const int BMP_BLOCKSIZE = 32;
const int BMP_SHIFT = 5;
const int BMP_END = 0x11000;
@@ -2109,7 +2142,7 @@ static QByteArray createPropertyInfo()
}
if (out.endsWith(' '))
out.chop(1);
- out += "\n\n // 0x" + QByteArray::number(BMP_END, 16) + " - 0x" + QByteArray::number(SMP_END, 16) + "\n";;
+ out += "\n\n // 0x" + QByteArray::number(BMP_END, 16) + " - 0x" + QByteArray::number(SMP_END, 16) + "\n";
for (int i = BMP_END/BMP_BLOCKSIZE; i < blockMap.size(); ++i) {
if (!(i % 8)) {
if (out.endsWith(' '))
@@ -2140,14 +2173,6 @@ static QByteArray createPropertyInfo()
out += ", ";
}
}
-
- // we reserve one bit more than in the assert below for the sign
- Q_ASSERT(maxMirroredDiff < (1<<12));
- Q_ASSERT(maxLowerCaseDiff < (1<<14));
- Q_ASSERT(maxUpperCaseDiff < (1<<14));
- Q_ASSERT(maxTitleCaseDiff < (1<<14));
- Q_ASSERT(maxCaseFoldDiff < (1<<14));
-
if (out.endsWith(' '))
out.chop(1);
out += "\n};\n\n"
@@ -2160,16 +2185,15 @@ static QByteArray createPropertyInfo()
")>>" + QByteArray::number(SMP_SHIFT) + ") + 0x" + QByteArray::number(BMP_END/BMP_BLOCKSIZE, 16) + "]"
" + (ucs4 & 0x" + QByteArray::number(SMP_BLOCKSIZE-1, 16) + ")]))\n\n"
"#define GET_PROP_INDEX_UCS2(ucs2) \\\n"
- "(uc_property_trie[uc_property_trie[ucs2>>" + QByteArray::number(BMP_SHIFT) +
+ " (uc_property_trie[uc_property_trie[ucs2>>" + QByteArray::number(BMP_SHIFT) +
"] + (ucs2 & 0x" + QByteArray::number(BMP_BLOCKSIZE-1, 16)+ ")])\n\n"
-
- "static const QUnicodeTables::Properties uc_properties[] = {\n";
+ "static const Properties uc_properties[] = {";
// keep in sync with the property declaration
for (int i = 0; i < uniqueProperties.size(); ++i) {
PropertyFlags p = uniqueProperties.at(i);
- out += " { ";
+ out += "\n { ";
// " ushort category : 8;\n"
out += QByteArray::number( p.category );
out += ", ";
@@ -2223,56 +2247,61 @@ static QByteArray createPropertyInfo()
out += QByteArray::number( p.wordBreak );
out += ", ";
out += QByteArray::number( p.sentenceBreak );
- out += " },\n";
+ out += " },";
}
- out += "};\n\n";
+ out.chop(1);
+ out += "\n};\n\n";
- out += "static inline const QUnicodeTables::Properties *qGetProp(uint ucs4)\n"
+
+ out += "static inline const Properties *qGetProp(uint ucs4)\n"
"{\n"
- " int index = GET_PROP_INDEX(ucs4);\n"
+ " const int index = GET_PROP_INDEX(ucs4);\n"
" return uc_properties + index;\n"
"}\n"
"\n"
- "static inline const QUnicodeTables::Properties *qGetProp(ushort ucs2)\n"
+ "static inline const Properties *qGetProp(ushort ucs2)\n"
"{\n"
- " int index = GET_PROP_INDEX_UCS2(ucs2);\n"
+ " const int index = GET_PROP_INDEX_UCS2(ucs2);\n"
" return uc_properties + index;\n"
"}\n"
"\n"
- "Q_CORE_EXPORT const QUnicodeTables::Properties * QT_FASTCALL QUnicodeTables::properties(uint ucs4)\n"
+ "Q_CORE_EXPORT const Properties * QT_FASTCALL properties(uint ucs4)\n"
"{\n"
- " int index = GET_PROP_INDEX(ucs4);\n"
- " return uc_properties + index;\n"
+ " return qGetProp(ucs4);\n"
"}\n"
"\n"
- "Q_CORE_EXPORT const QUnicodeTables::Properties * QT_FASTCALL QUnicodeTables::properties(ushort ucs2)\n"
+ "Q_CORE_EXPORT const Properties * QT_FASTCALL properties(ushort ucs2)\n"
"{\n"
- " int index = GET_PROP_INDEX_UCS2(ucs2);\n"
- " return uc_properties + index;\n"
+ " return qGetProp(ucs2);\n"
"}\n\n";
- out += "Q_CORE_EXPORT QUnicodeTables::LineBreakClass QT_FASTCALL QUnicodeTables::lineBreakClass(uint ucs4)\n"
+ out += "Q_CORE_EXPORT LineBreakClass QT_FASTCALL lineBreakClass(uint ucs4)\n"
"{\n"
- " return (QUnicodeTables::LineBreakClass)qGetProp(ucs4)->line_break_class;\n"
+ " return (LineBreakClass)qGetProp(ucs4)->line_break_class;\n"
"}\n\n";
+ return out;
+}
+
+static QByteArray createSpecialCaseMap()
+{
+ qDebug("createSpecialCaseMap:");
- out += "static const ushort specialCaseMap[] = {\n";
- out += " 0x0, // placeholder";
+ QByteArray out;
+ out += "static const ushort specialCaseMap[] = {\n"
+ " 0x0, // placeholder";
int i = 1;
while (i < specialCaseMap.size()) {
out += "\n ";
int n = specialCaseMap.at(i);
- int j;
- for (j = 0; j <= n; ++j) {
+ for (int j = 0; j <= n; ++j) {
out += QByteArray(" 0x") + QByteArray::number(specialCaseMap.at(i+j), 16);
- if (i+j < specialCaseMap.size() - 1)
- out += ",";
+ out += ",";
}
i += n + 1;
}
- out += "\n};\n";
- out += "#define SPECIAL_CASE_MAX_LEN " + QByteArray::number(specialCaseMaxLen) + "\n\n";
+ out.chop(1);
+ out += "\n};\n\n";
qDebug("Special case map uses : %d bytes", specialCaseMap.size()*2);
@@ -2290,7 +2319,7 @@ struct DecompositionBlock {
static QByteArray createCompositionInfo()
{
- qDebug("createCompositionInfo:");
+ qDebug("createCompositionInfo: highestComposedCharacter=0x%x", highestComposedCharacter);
const int BMP_BLOCKSIZE = 16;
const int BMP_SHIFT = 4;
@@ -2300,7 +2329,7 @@ static QByteArray createCompositionInfo()
const int SMP_SHIFT = 8;
if (SMP_END <= highestComposedCharacter)
- qFatal("end of table smaller than highest composed character at %x", highestComposedCharacter);
+ qFatal("end of table smaller than highest composed character 0x%x", highestComposedCharacter);
QList<DecompositionBlock> blocks;
QList<int> blockMap;
@@ -2315,24 +2344,23 @@ static QByteArray createCompositionInfo()
int uc = block*BMP_BLOCKSIZE + i;
UnicodeData d = unicodeData.value(uc, UnicodeData(uc));
if (!d.decomposition.isEmpty()) {
- int utf16Chars = 0;
- for (int j = 0; j < d.decomposition.size(); ++j)
- utf16Chars += QChar::requiresSurrogates(d.decomposition.at(j)) ? 2 : 1;
- decompositions.append(d.decompositionType + (utf16Chars<<8));
+ int utf16Length = 0;
+ decompositions.append(0);
for (int j = 0; j < d.decomposition.size(); ++j) {
int code = d.decomposition.at(j);
if (QChar::requiresSurrogates(code)) {
// save as surrogate pair
- ushort high = QChar::highSurrogate(code);
- ushort low = QChar::lowSurrogate(code);
- decompositions.append(high);
- decompositions.append(low);
+ decompositions.append(QChar::highSurrogate(code));
+ decompositions.append(QChar::lowSurrogate(code));
+ utf16Length += 2;
} else {
decompositions.append(code);
+ utf16Length++;
}
}
+ decompositions[tableIndex] = d.decompositionType + (utf16Length<<8);
b.decompositionPositions.append(tableIndex);
- tableIndex += utf16Chars + 1;
+ tableIndex += utf16Length + 1;
} else {
b.decompositionPositions.append(0xffff);
}
@@ -2356,24 +2384,23 @@ static QByteArray createCompositionInfo()
int uc = block*SMP_BLOCKSIZE + i;
UnicodeData d = unicodeData.value(uc, UnicodeData(uc));
if (!d.decomposition.isEmpty()) {
- int utf16Chars = 0;
- for (int j = 0; j < d.decomposition.size(); ++j)
- utf16Chars += QChar::requiresSurrogates(d.decomposition.at(j)) ? 2 : 1;
- decompositions.append(d.decompositionType + (utf16Chars<<8));
+ int utf16Length = 0;
+ decompositions.append(0);
for (int j = 0; j < d.decomposition.size(); ++j) {
int code = d.decomposition.at(j);
if (QChar::requiresSurrogates(code)) {
// save as surrogate pair
- ushort high = QChar::highSurrogate(code);
- ushort low = QChar::lowSurrogate(code);
- decompositions.append(high);
- decompositions.append(low);
+ decompositions.append(QChar::highSurrogate(code));
+ decompositions.append(QChar::lowSurrogate(code));
+ utf16Length += 2;
} else {
decompositions.append(code);
+ utf16Length++;
}
}
+ decompositions[tableIndex] = d.decompositionType + (utf16Length<<8);
b.decompositionPositions.append(tableIndex);
- tableIndex += utf16Chars + 1;
+ tableIndex += utf16Length + 1;
} else {
b.decompositionPositions.append(0xffff);
}
@@ -2388,6 +2415,9 @@ static QByteArray createCompositionInfo()
blockMap.append(blocks.at(index).index);
}
+ // if the condition below doesn't hold anymore we need to modify our decomposition code
+ Q_ASSERT(tableIndex < 0xffff);
+
int bmp_block_data = bmp_blocks*BMP_BLOCKSIZE*2;
int bmp_trie = BMP_END/BMP_BLOCKSIZE*2;
int bmp_mem = bmp_block_data + bmp_trie;
@@ -2403,7 +2433,7 @@ static QByteArray createCompositionInfo()
qDebug(" block data uses: %d bytes", smp_block_data);
qDebug(" trie data uses : %d bytes", smp_trie);
- qDebug("\n decomposition table use : %d bytes", decompositions.size()*2);
+ qDebug("\n decomposition table uses : %d bytes", decompositions.size()*2);
qDebug(" memory usage: %d bytes", bmp_mem+smp_mem + decompositions.size()*2);
QByteArray out;
@@ -2425,7 +2455,7 @@ static QByteArray createCompositionInfo()
}
if (out.endsWith(' '))
out.chop(1);
- out += "\n\n // 0x" + QByteArray::number(BMP_END, 16) + " - 0x" + QByteArray::number(SMP_END, 16) + "\n";;
+ out += "\n\n // 0x" + QByteArray::number(BMP_END, 16) + " - 0x" + QByteArray::number(SMP_END, 16) + "\n";
for (int i = BMP_END/BMP_BLOCKSIZE; i < blockMap.size(); ++i) {
if (!(i % 8)) {
if (out.endsWith(' '))
@@ -2456,9 +2486,8 @@ static QByteArray createCompositionInfo()
out += ", ";
}
}
-
if (out.endsWith(' '))
- out.chop(1);
+ out.chop(2);
out += "\n};\n\n"
"#define GET_DECOMPOSITION_INDEX(ucs4) \\\n"
@@ -2471,7 +2500,7 @@ static QByteArray createCompositionInfo()
" + (ucs4 & 0x" + QByteArray::number(SMP_BLOCKSIZE-1, 16) + ")]\\\n"
" : 0xffff))\n\n"
- "static const unsigned short uc_decomposition_map[] = {\n";
+ "static const unsigned short uc_decomposition_map[] = {";
for (int i = 0; i < decompositions.size(); ++i) {
if (!(i % 8)) {
@@ -2482,9 +2511,8 @@ static QByteArray createCompositionInfo()
out += "0x" + QByteArray::number(decompositions.at(i), 16);
out += ", ";
}
-
if (out.endsWith(' '))
- out.chop(1);
+ out.chop(2);
out += "\n};\n\n";
return out;
@@ -2492,7 +2520,7 @@ static QByteArray createCompositionInfo()
static QByteArray createLigatureInfo()
{
- qDebug("createLigatureInfo: numLigatures=%d", numLigatures);
+ qDebug("createLigatureInfo: numLigatures=%d, highestLigature=0x%x", numLigatures, highestLigature);
QList<DecompositionBlock> blocks;
QList<int> blockMap;
@@ -2501,7 +2529,9 @@ static QByteArray createLigatureInfo()
const int BMP_BLOCKSIZE = 32;
const int BMP_SHIFT = 5;
const int BMP_END = 0x3100;
- Q_ASSERT(highestLigature < BMP_END);
+
+ if (BMP_END <= highestLigature)
+ qFatal("end of table smaller than highest ligature character 0x%x", highestLigature);
int used = 0;
int tableIndex = 0;
@@ -2512,11 +2542,11 @@ static QByteArray createLigatureInfo()
int uc = block*BMP_BLOCKSIZE + i;
QList<Ligature> l = ligatureHashes.value(uc);
if (!l.isEmpty()) {
- qSort(l);
+ Q_ASSERT(!QChar::requiresSurrogates(uc));
+ qSort(l); // needed for bsearch in ligatureHelper code
ligatures.append(l.size());
for (int j = 0; j < l.size(); ++j) {
- Q_ASSERT(l.at(j).u2 == uc);
ligatures.append(l.at(j).u1);
ligatures.append(l.at(j).ligature);
}
@@ -2539,12 +2569,16 @@ static QByteArray createLigatureInfo()
int bmp_blocks = blocks.size();
Q_ASSERT(blockMap.size() == BMP_END/BMP_BLOCKSIZE);
+ // if the condition below doesn't hold anymore we need to modify our composition code
+ Q_ASSERT(tableIndex < 0xffff);
+
int bmp_block_data = bmp_blocks*BMP_BLOCKSIZE*2;
int bmp_trie = BMP_END/BMP_BLOCKSIZE*2;
int bmp_mem = bmp_block_data + bmp_trie;
qDebug(" %d unique blocks in BMP.", blocks.size());
qDebug(" block data uses: %d bytes", bmp_block_data);
qDebug(" trie data uses : %d bytes", bmp_trie);
+ qDebug(" memory usage: %d bytes", bmp_mem);
qDebug("\n ligature data uses : %d bytes", ligatures.size()*2);
qDebug(" memory usage: %d bytes", bmp_mem + ligatures.size() * 2);
@@ -2585,15 +2619,15 @@ static QByteArray createLigatureInfo()
}
}
if (out.endsWith(' '))
- out.chop(1);
+ out.chop(2);
out += "\n};\n\n"
- "#define GET_LIGATURE_INDEX(u2) "
- "(u2 < 0x" + QByteArray::number(BMP_END, 16) + " ? "
+ "#define GET_LIGATURE_INDEX(u2) \\\n"
+ " (u2 < 0x" + QByteArray::number(BMP_END, 16) + " ? "
"uc_ligature_trie[uc_ligature_trie[u2>>" + QByteArray::number(BMP_SHIFT) +
"] + (u2 & 0x" + QByteArray::number(BMP_BLOCKSIZE-1, 16)+ ")] : 0xffff);\n\n"
- "static const unsigned short uc_ligature_map[] = {\n";
+ "static const unsigned short uc_ligature_map[] = {";
for (int i = 0; i < ligatures.size(); ++i) {
if (!(i % 8)) {
@@ -2604,9 +2638,8 @@ static QByteArray createLigatureInfo()
out += "0x" + QByteArray::number(ligatures.at(i), 16);
out += ", ";
}
-
if (out.endsWith(' '))
- out.chop(1);
+ out.chop(2);
out += "\n};\n\n";
return out;
@@ -2654,6 +2687,7 @@ int main(int, char **)
computeUniqueProperties();
QByteArray properties = createPropertyInfo();
+ QByteArray specialCases = createSpecialCaseMap();
QByteArray compositions = createCompositionInfo();
QByteArray ligatures = createLigatureInfo();
QByteArray normalizationCorrections = createNormalizationCorrections();
@@ -2721,12 +2755,21 @@ int main(int, char **)
f.open(QFile::WriteOnly|QFile::Truncate);
f.write(header);
f.write(note);
+ f.write("#include \"qunicodetables_p.h\"\n\n");
f.write("QT_BEGIN_NAMESPACE\n\n");
+ f.write("namespace QUnicodeTables {\n\n");
f.write(properties);
+ f.write("\n");
+ f.write(specialCases);
+ f.write("\n");
f.write(compositions);
f.write(ligatures);
+ f.write("\n");
f.write(normalizationCorrections);
+ f.write("\n");
f.write(scriptTableDeclaration);
+ f.write("} // namespace QUnicodeTables\n\n");
+ f.write("using namespace QUnicodeTables;\n\n");
f.write("QT_END_NAMESPACE\n");
f.close();
@@ -2752,7 +2795,7 @@ int main(int, char **)
f.write("\n");
f.write(sentence_break_string);
f.write("\n");
- f.write(lineBreakClass);
+ f.write(line_break_class_string);
f.write("\n");
f.write(methods);
f.write("} // namespace QUnicodeTables\n\n"