summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBjoern Erik Nilsen <bjorn.nilsen@nokia.com>2009-04-07 10:59:16 (GMT)
committerBjoern Erik Nilsen <bjorn.nilsen@nokia.com>2009-04-07 10:59:16 (GMT)
commit6e13559503040963c28dd8f5b6881e3a2b9d5596 (patch)
tree3e030548ffb1667d5fa8cd2020fd7b28749d0411 /src
parent939623b2bc8e441618ee1a1886cc656880bee62b (diff)
parentd8f76432c3937690c37972136c02a5a264bc941f (diff)
downloadQt-6e13559503040963c28dd8f5b6881e3a2b9d5596.zip
Qt-6e13559503040963c28dd8f5b6881e3a2b9d5596.tar.gz
Qt-6e13559503040963c28dd8f5b6881e3a2b9d5596.tar.bz2
Merge commit 'origin/4.5'
Conflicts: src/gui/graphicsview/qgraphicsitem.cpp src/gui/graphicsview/qgraphicsitem_p.h src/gui/graphicsview/qgraphicsscene.cpp src/gui/painting/qtransform.cpp
Diffstat (limited to 'src')
-rw-r--r--src/3rdparty/webkit/VERSION2
-rw-r--r--src/3rdparty/webkit/WebCore/ChangeLog38
-rw-r--r--src/3rdparty/webkit/WebCore/generated/CSSPropertyNames.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/CSSValueKeywords.c5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/ColorData.c5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/DocTypeStrings.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/HTMLEntityNames.c5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/tokenizer.cpp2315
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLCanvasElement.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/DragDataQt.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/mac/PluginViewMac.cpp9
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp2
-rw-r--r--src/gui/dialogs/qfilesystemmodel.cpp5
-rw-r--r--src/gui/graphicsview/qgraphicsitem.cpp540
-rw-r--r--src/gui/graphicsview/qgraphicsitem_p.h61
-rw-r--r--src/gui/graphicsview/qgraphicsproxywidget.cpp8
-rw-r--r--src/gui/graphicsview/qgraphicsscene.cpp361
-rw-r--r--src/gui/graphicsview/qgraphicsscene_p.h4
-rw-r--r--src/gui/graphicsview/qgraphicsview.cpp236
-rw-r--r--src/gui/graphicsview/qgraphicsview_p.h7
-rw-r--r--src/gui/graphicsview/qgraphicswidget.cpp58
-rw-r--r--src/gui/graphicsview/qgraphicswidget_p.h2
-rw-r--r--src/gui/image/qimage.cpp10
-rw-r--r--src/gui/image/qpixmap.cpp18
-rw-r--r--src/gui/kernel/qapplication_x11.cpp6
-rw-r--r--src/gui/kernel/qt_mac_p.h1
-rw-r--r--src/gui/kernel/qwidget.cpp48
-rw-r--r--src/gui/kernel/qwidget_mac.mm14
-rw-r--r--src/gui/painting/qpaintengine_raster.cpp100
-rw-r--r--src/gui/painting/qpaintengine_raster_p.h2
-rw-r--r--src/gui/painting/qpainter.cpp19
-rw-r--r--src/gui/painting/qpainterpath.cpp2
-rw-r--r--src/gui/styles/gtksymbols.cpp8
-rw-r--r--src/gui/styles/qgtkstyle.cpp2
-rw-r--r--src/gui/styles/qwindowsvistastyle.cpp20
-rw-r--r--src/gui/widgets/qdialogbuttonbox.cpp3
-rw-r--r--src/network/access/access.pri6
-rw-r--r--src/network/access/qhttpnetworkconnection.cpp1119
-rw-r--r--src/network/access/qhttpnetworkconnection_p.h243
-rw-r--r--src/network/access/qhttpnetworkheader.cpp123
-rw-r--r--src/network/access/qhttpnetworkheader_p.h111
-rw-r--r--src/network/access/qhttpnetworkreply.cpp663
-rw-r--r--src/network/access/qhttpnetworkreply_p.h226
-rw-r--r--src/network/access/qhttpnetworkrequest.cpp261
-rw-r--r--src/network/access/qhttpnetworkrequest_p.h144
-rw-r--r--src/network/socket/qlocalsocket_p.h1
-rw-r--r--src/network/socket/qlocalsocket_unix.cpp28
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.cpp1
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp35
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp89
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp53
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbscreen.h21
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbsurface.cpp36
-rw-r--r--src/qt3support/text/q3richtext.cpp3
-rw-r--r--src/sql/kernel/qsqldriver.cpp11
-rw-r--r--src/svg/qsvghandler.cpp6
-rw-r--r--src/svg/qsvgstyle.cpp2
57 files changed, 3611 insertions, 3507 deletions
diff --git a/src/3rdparty/webkit/VERSION b/src/3rdparty/webkit/VERSION
index 1ebf6ef..9decb66 100644
--- a/src/3rdparty/webkit/VERSION
+++ b/src/3rdparty/webkit/VERSION
@@ -8,4 +8,4 @@ The commit imported was from the
and has the sha1 checksum
- 9c6a4a25fe741b43dd64f5dbaeccfb647cb321fb
+ f72c14123c593dc9d649d25b7186334bba0026b5
diff --git a/src/3rdparty/webkit/WebCore/ChangeLog b/src/3rdparty/webkit/WebCore/ChangeLog
index e8850f3..d0382f2 100644
--- a/src/3rdparty/webkit/WebCore/ChangeLog
+++ b/src/3rdparty/webkit/WebCore/ChangeLog
@@ -1,3 +1,41 @@
+2009-04-06 Tor Arne Vestbø <tor.arne.vestbo@nokia.com>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Don't show and hide the platformPluginWidget, as it's our QWebView
+
+ * plugins/mac/PluginViewMac.cpp:
+ (WebCore::PluginView::show):
+ (WebCore::PluginView::hide):
+ (WebCore::PluginView::setParentVisible):
+
+2009-04-06 Mike Belshe <mike@belshe.com>
+
+ Reviewed by Eric Seidel.
+
+ HTMLCanvasElement crash when ImageBuffer creation fails.
+ https://bugs.webkit.org/show_bug.cgi?id=23212
+
+ Check for NULL before using the ImageBuffer as we might
+ be low on memory and creation may have failed.
+
+ Test case creation blocked by:
+ https://bugs.webkit.org/show_bug.cgi?id=25055
+
+ * html/HTMLCanvasElement.cpp:
+ (WebCore::HTMLCanvasElement::createImageBuffer):
+
+2009-04-05 Erik L. Bunce <elbunce@xendom.com>
+
+ Reviewed by Simon Hausmann.
+
+ https://bugs.webkit.org/show_bug.cgi?id=25050
+
+ Fix an assert failure when dropping an 'empty' text/uri-list on a QWebView.
+
+ * platform/qt/DragDataQt.cpp:
+ (WebCore::DragData::asURL):
+
2009-03-27 Zack Rusin <zack@kde.org>
Reviewed by Simon Hausmann.
diff --git a/src/3rdparty/webkit/WebCore/generated/CSSPropertyNames.cpp b/src/3rdparty/webkit/WebCore/generated/CSSPropertyNames.cpp
index 25313ac..ca4ea5a 100644
--- a/src/3rdparty/webkit/WebCore/generated/CSSPropertyNames.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/CSSPropertyNames.cpp
@@ -1,4 +1,4 @@
-/* ANSI-C code produced by gperf version 3.0.3 */
+/* ANSI-C code produced by gperf version 3.0.2 */
/* Command-line: gperf -a -L ANSI-C -E -C -c -o -t --key-positions='*' -NfindProp -Hhash_prop -Wwordlist_prop -D -s 2 CSSPropertyNames.gperf */
#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
@@ -217,9 +217,6 @@ hash_prop (register const char *str, register unsigned int len)
#ifdef __GNUC__
__inline
-#ifdef __GNUC_STDC_INLINE__
-__attribute__ ((__gnu_inline__))
-#endif
#endif
const struct props *
findProp (register const char *str, register unsigned int len)
diff --git a/src/3rdparty/webkit/WebCore/generated/CSSValueKeywords.c b/src/3rdparty/webkit/WebCore/generated/CSSValueKeywords.c
index 5ff0858..d0433e0 100644
--- a/src/3rdparty/webkit/WebCore/generated/CSSValueKeywords.c
+++ b/src/3rdparty/webkit/WebCore/generated/CSSValueKeywords.c
@@ -1,4 +1,4 @@
-/* ANSI-C code produced by gperf version 3.0.3 */
+/* ANSI-C code produced by gperf version 3.0.2 */
/* Command-line: gperf -L ANSI-C -E -C -n -o -t --key-positions='*' -NfindValue -Hhash_val -Wwordlist_value -D CSSValueKeywords.gperf */
#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
@@ -179,9 +179,6 @@ hash_val (register const char *str, register unsigned int len)
#ifdef __GNUC__
__inline
-#ifdef __GNUC_STDC_INLINE__
-__attribute__ ((__gnu_inline__))
-#endif
#endif
const struct css_value *
findValue (register const char *str, register unsigned int len)
diff --git a/src/3rdparty/webkit/WebCore/generated/ColorData.c b/src/3rdparty/webkit/WebCore/generated/ColorData.c
index 478566c..18d9926 100644
--- a/src/3rdparty/webkit/WebCore/generated/ColorData.c
+++ b/src/3rdparty/webkit/WebCore/generated/ColorData.c
@@ -1,5 +1,5 @@
#include <string.h>// bogus
-/* ANSI-C code produced by gperf version 3.0.3 */
+/* ANSI-C code produced by gperf version 3.0.2 */
/* Command-line: gperf -CDEot -L ANSI-C --key-positions='*' -N findColor -D -s 2 */
#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
@@ -141,9 +141,6 @@ hash (register const char *str, register unsigned int len)
#ifdef __GNUC__
__inline
-#ifdef __GNUC_STDC_INLINE__
-__attribute__ ((__gnu_inline__))
-#endif
#endif
const struct NamedColor *
findColor (register const char *str, register unsigned int len)
diff --git a/src/3rdparty/webkit/WebCore/generated/DocTypeStrings.cpp b/src/3rdparty/webkit/WebCore/generated/DocTypeStrings.cpp
index 686629c..ad63b9e 100644
--- a/src/3rdparty/webkit/WebCore/generated/DocTypeStrings.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/DocTypeStrings.cpp
@@ -1,5 +1,5 @@
#include <string.h>// bogus
-/* ANSI-C code produced by gperf version 3.0.3 */
+/* ANSI-C code produced by gperf version 3.0.2 */
/* Command-line: gperf -CEot -L ANSI-C --key-positions='*' -N findDoctypeEntry -F ,PubIDInfo::eAlmostStandards,PubIDInfo::eAlmostStandards */
#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
@@ -331,9 +331,6 @@ hash (register const char *str, register unsigned int len)
#ifdef __GNUC__
__inline
-#ifdef __GNUC_STDC_INLINE__
-__attribute__ ((__gnu_inline__))
-#endif
#endif
const struct PubIDInfo *
findDoctypeEntry (register const char *str, register unsigned int len)
diff --git a/src/3rdparty/webkit/WebCore/generated/HTMLEntityNames.c b/src/3rdparty/webkit/WebCore/generated/HTMLEntityNames.c
index 993e106..470c4cd 100644
--- a/src/3rdparty/webkit/WebCore/generated/HTMLEntityNames.c
+++ b/src/3rdparty/webkit/WebCore/generated/HTMLEntityNames.c
@@ -1,4 +1,4 @@
-/* ANSI-C code produced by gperf version 3.0.3 */
+/* ANSI-C code produced by gperf version 3.0.2 */
/* Command-line: gperf -a -L ANSI-C -C -G -c -o -t --key-positions='*' -N findEntity -D -s 2 */
#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
@@ -520,9 +520,6 @@ static const short lookup[] =
#ifdef __GNUC__
__inline
-#ifdef __GNUC_STDC_INLINE__
-__attribute__ ((__gnu_inline__))
-#endif
#endif
const struct Entity *
findEntity (register const char *str, register unsigned int len)
diff --git a/src/3rdparty/webkit/WebCore/generated/tokenizer.cpp b/src/3rdparty/webkit/WebCore/generated/tokenizer.cpp
index 8462f51..1da1a0b 100644
--- a/src/3rdparty/webkit/WebCore/generated/tokenizer.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/tokenizer.cpp
@@ -78,42 +78,42 @@ static yyconst flex_int16_t yy_accept[479] =
{ 0,
0, 0, 0, 0, 0, 0, 69, 67, 2, 2,
67, 67, 67, 67, 67, 67, 67, 67, 67, 56,
- 67, 67, 15, 15, 15, 67, 67, 67, 67, 66,
+ 67, 67, 67, 67, 15, 15, 15, 67, 67, 66,
15, 15, 15, 65, 15, 2, 0, 0, 0, 14,
- 0, 0, 0, 18, 18, 0, 8, 0, 0, 9,
- 0, 0, 15, 15, 15, 0, 57, 0, 55, 0,
- 0, 56, 54, 54, 54, 54, 54, 54, 54, 54,
- 54, 16, 54, 54, 51, 54, 0, 54, 0, 0,
- 35, 35, 35, 35, 35, 35, 35, 0, 62, 15,
- 0, 0, 15, 15, 0, 15, 15, 15, 7, 6,
+ 0, 0, 0, 0, 18, 18, 8, 0, 0, 9,
+ 0, 0, 0, 15, 15, 15, 57, 0, 55, 0,
+ 0, 56, 0, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 16, 54, 54, 51, 54, 0, 0,
+ 0, 35, 35, 35, 35, 35, 35, 35, 15, 15,
+ 7, 62, 15, 0, 0, 15, 15, 0, 15, 6,
5, 15, 15, 15, 15, 0, 0, 0, 14, 0,
- 0, 0, 18, 18, 0, 18, 18, 0, 0, 14,
- 0, 0, 4, 16, 15, 0, 0, 54, 0, 41,
- 54, 37, 39, 54, 52, 43, 54, 42, 50, 54,
- 45, 44, 40, 54, 54, 54, 54, 54, 0, 35,
- 35, 0, 35, 35, 35, 35, 35, 35, 35, 35,
- 15, 15, 16, 15, 15, 63, 63, 15, 15, 12,
- 10, 15, 13, 0, 0, 0, 17, 17, 18, 18,
- 18, 0, 0, 15, 0, 1, 54, 54, 46, 54,
- 53, 16, 47, 54, 54, 54, 3, 35, 35, 35,
-
- 35, 35, 35, 35, 35, 35, 35, 15, 58, 0,
- 63, 63, 63, 62, 15, 11, 0, 0, 0, 18,
- 18, 18, 0, 15, 0, 0, 54, 48, 49, 54,
- 54, 35, 35, 35, 35, 35, 35, 35, 20, 35,
- 15, 64, 63, 63, 63, 63, 0, 0, 0, 0,
- 60, 0, 15, 0, 0, 0, 18, 18, 18, 0,
- 15, 54, 54, 38, 35, 35, 35, 35, 35, 21,
- 35, 35, 15, 64, 63, 63, 63, 63, 63, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 60, 0,
- 0, 15, 0, 0, 17, 17, 18, 18, 0, 15,
-
- 54, 54, 35, 35, 35, 35, 19, 35, 35, 15,
- 64, 63, 63, 63, 63, 63, 63, 0, 59, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 15, 0, 0, 18, 18, 0, 15, 54, 54, 35,
- 35, 23, 35, 35, 35, 15, 64, 63, 63, 63,
+ 0, 0, 18, 18, 18, 0, 18, 0, 0, 14,
+ 0, 0, 4, 16, 15, 0, 0, 54, 54, 54,
+ 0, 54, 41, 54, 37, 39, 54, 52, 43, 54,
+ 42, 50, 54, 45, 44, 40, 54, 54, 0, 35,
+ 35, 35, 35, 0, 35, 35, 35, 35, 35, 35,
+ 15, 15, 15, 16, 15, 15, 63, 63, 15, 12,
+ 10, 15, 13, 0, 0, 0, 17, 18, 18, 18,
+ 17, 0, 0, 15, 0, 1, 54, 54, 54, 54,
+ 46, 54, 53, 16, 47, 54, 3, 35, 35, 35,
+
+ 35, 35, 35, 35, 35, 35, 35, 15, 15, 58,
+ 0, 63, 63, 63, 62, 11, 0, 0, 0, 18,
+ 18, 18, 0, 15, 0, 0, 54, 54, 54, 48,
+ 49, 35, 35, 35, 35, 35, 35, 35, 35, 20,
+ 15, 15, 64, 63, 63, 63, 63, 0, 0, 0,
+ 0, 60, 0, 0, 0, 0, 18, 18, 18, 0,
+ 15, 54, 54, 38, 35, 35, 35, 35, 35, 35,
+ 21, 35, 15, 15, 64, 63, 63, 63, 63, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,
+ 0, 0, 0, 0, 17, 18, 18, 17, 0, 15,
+
+ 54, 54, 35, 35, 35, 35, 35, 19, 35, 15,
+ 15, 64, 63, 63, 63, 63, 63, 63, 0, 59,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 18, 18, 0, 15, 54, 54, 35,
+ 35, 35, 23, 35, 35, 15, 64, 63, 63, 63,
63, 63, 63, 63, 0, 59, 0, 0, 0, 59,
0, 0, 0, 0, 18, 15, 54, 35, 35, 35,
35, 64, 0, 0, 0, 36, 15, 35, 35, 35,
@@ -122,7 +122,7 @@ static yyconst flex_int16_t yy_accept[479] =
35, 35, 35, 35, 35, 35, 35, 35, 0, 0,
0, 0, 0, 0, 35, 35, 35, 35, 25, 35,
- 35, 35, 0, 61, 0, 0, 0, 0, 26, 35,
+ 35, 35, 0, 0, 0, 61, 0, 0, 26, 35,
35, 35, 35, 27, 35, 0, 0, 0, 0, 31,
35, 35, 35, 35, 0, 0, 0, 35, 35, 35,
35, 0, 0, 35, 35, 29, 35, 0, 0, 35,
@@ -138,909 +138,437 @@ static yyconst flex_int32_t yy_ec[256] =
1, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 12, 18, 19, 20, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 12, 22, 23,
- 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
- 34, 35, 36, 37, 38, 39, 40, 41, 42, 43,
- 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
- 12, 54, 12, 55, 56, 12, 57, 58, 59, 60,
-
- 61, 62, 63, 64, 65, 37, 66, 67, 68, 69,
- 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
- 80, 81, 82, 83, 12, 84, 1, 85, 85, 85,
- 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
- 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
- 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
- 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
- 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
- 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
- 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-
- 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
- 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
- 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
- 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
- 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
- 85, 85, 85, 85, 85
+ 24, 25, 26, 27, 31, 32, 33, 34, 35, 36,
+ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
+ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
+ 12, 28, 12, 29, 30, 12, 31, 32, 33, 34,
+
+ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
+ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
+ 55, 56, 57, 58, 12, 59, 1, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60
} ;
-static yyconst flex_int32_t yy_meta[86] =
+static yyconst flex_int32_t yy_meta[61] =
{ 0,
- 1, 2, 3, 4, 4, 5, 6, 7, 6, 6,
- 6, 6, 7, 8, 9, 6, 6, 10, 6, 6,
- 11, 6, 6, 6, 6, 12, 6, 13, 13, 13,
- 13, 13, 13, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 6, 14, 13, 13, 13, 13,
- 13, 13, 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 6, 6, 6, 14
+ 1, 2, 3, 3, 3, 4, 5, 5, 5, 5,
+ 5, 5, 5, 6, 7, 5, 5, 8, 5, 5,
+ 9, 5, 5, 5, 5, 10, 5, 11, 5, 11,
+ 12, 12, 12, 12, 12, 12, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 5, 5, 5, 11
} ;
-static yyconst flex_int16_t yy_base[550] =
+static yyconst flex_int16_t yy_base[517] =
{ 0,
- 0, 0, 64, 66, 54, 56, 1407, 6578, 93, 98,
- 107, 83, 155, 1376, 77, 1350, 99, 1345, 1328, 207,
- 1334, 275, 100, 108, 125, 326, 1315, 1313, 1312, 6578,
- 141, 110, 151, 6578, 105, 197, 295, 89, 107, 6578,
- 387, 120, 0, 429, 1281, 471, 6578, 117, 532, 6578,
- 1283, 269, 137, 176, 281, 574, 283, 1289, 1292, 1246,
- 1257, 0, 1221, 249, 135, 282, 276, 153, 91, 169,
- 299, 308, 318, 266, 1219, 320, 616, 102, 1246, 348,
- 1209, 316, 127, 359, 346, 347, 375, 658, 6578, 208,
- 700, 1241, 400, 409, 1220, 397, 327, 761, 6578, 6578,
-
- 6578, 411, 419, 414, 424, 248, 368, 355, 356, 822,
- 883, 0, 1191, 925, 967, 1190, 1028, 381, 421, 464,
- 1089, 1150, 6578, 214, 456, 1225, 312, 1151, 1192, 1142,
- 442, 1139, 1134, 452, 1131, 1104, 458, 1082, 1060, 358,
- 1046, 1028, 1027, 462, 453, 1000, 1253, 469, 1023, 463,
- 986, 1295, 492, 486, 500, 484, 502, 513, 969, 1356,
- 425, 1417, 1001, 545, 494, 193, 993, 543, 1459, 544,
- 554, 558, 555, 508, 398, 1520, 0, 1562, 956, 1623,
- 1684, 570, 1745, 563, 993, 6578, 948, 1806, 935, 520,
- 921, 498, 914, 546, 1848, 564, 6578, 585, 913, 1909,
-
- 568, 576, 586, 606, 631, 640, 1951, 2012, 6578, 0,
- 203, 924, 907, 694, 2054, 565, 543, 2115, 0, 2157,
- 2218, 2279, 2340, 669, 912, 505, 2401, 856, 840, 2443,
- 612, 615, 2504, 608, 557, 639, 682, 668, 839, 2546,
- 2607, 0, 288, 863, 841, 819, 741, 794, 573, 418,
- 6578, 2668, 2710, 620, 2771, 0, 2813, 2874, 2935, 2996,
- 3057, 3131, 3173, 3234, 670, 3295, 718, 719, 729, 763,
- 684, 3337, 3398, 0, 456, 782, 777, 760, 742, 829,
- 649, 834, 3459, 572, 3520, 854, 894, 915, 920, 3581,
- 3642, 3684, 593, 3745, 6578, 697, 3806, 3867, 3928, 3989,
-
- 4050, 4111, 730, 4172, 731, 683, 672, 759, 4214, 4275,
- 0, 762, 682, 429, 417, 414, 411, 859, 6578, 650,
- 838, 957, 4336, 4397, 607, 926, 988, 4458, 4519, 4580,
- 1002, 672, 1010, 4622, 4664, 1042, 752, 4706, 4767, 756,
- 4828, 376, 812, 847, 1069, 1033, 0, 387, 6578, 6578,
- 6578, 6578, 6578, 6578, 1122, 924, 963, 4870, 1162, 1049,
- 1050, 4912, 4973, 678, 1063, 850, 1074, 5005, 1103, 841,
- 989, 0, 5062, 5104, 5146, 6578, 1066, 1080, 1081, 1084,
- 1108, 1137, 877, 328, 273, 6578, 5188, 5230, 5272, 641,
- 1140, 884, 916, 836, 1105, 1161, 5314, 5356, 1233, 1286,
-
- 1147, 1138, 919, 1206, 1165, 1186, 1141, 1207, 1291, 1263,
- 1316, 1345, 1327, 5398, 1086, 1029, 1225, 1133, 258, 1247,
- 1248, 1310, 1388, 6578, 1427, 5440, 1449, 5501, 242, 1311,
- 1341, 1324, 1326, 173, 1317, 1454, 5562, 1480, 5604, 170,
- 1061, 1328, 1355, 1372, 1552, 5646, 5688, 1351, 1374, 1389,
- 1409, 5730, 5772, 1419, 1456, 154, 1453, 5814, 5856, 1457,
- 112, 897, 793, 5898, 1557, 1418, 109, 1348, 1582, 1550,
- 1477, 1481, 1485, 90, 1564, 1458, 39, 6578, 5959, 5964,
- 5977, 5982, 5987, 5994, 6004, 6017, 296, 6022, 6032, 6045,
- 6059, 651, 6064, 6074, 6079, 6089, 6099, 6103, 571, 6112,
-
- 6125, 6138, 6152, 6166, 6176, 6186, 6191, 6203, 657, 6217,
- 758, 6222, 6234, 6247, 801, 6261, 859, 6266, 6278, 6291,
- 6304, 6317, 6330, 1086, 6335, 6348, 1120, 6353, 6365, 6378,
- 6391, 6404, 6417, 6430, 6435, 6448, 1216, 6453, 6465, 6478,
- 6491, 6504, 6517, 1219, 1220, 6530, 6543, 6553, 6563
+ 0, 0, 39, 41, 1573, 1566, 1594, 2399, 62, 71,
+ 76, 61, 69, 1560, 78, 1559, 89, 1561, 1565, 132,
+ 1573, 91, 123, 1555, 80, 104, 97, 1554, 1551, 2399,
+ 85, 176, 175, 2399, 177, 193, 204, 1531, 84, 2399,
+ 242, 110, 180, 196, 1545, 205, 2399, 113, 277, 2399,
+ 1547, 72, 221, 133, 206, 234, 181, 1555, 1548, 1530,
+ 1528, 0, 268, 118, 1515, 221, 60, 240, 92, 230,
+ 95, 223, 244, 267, 238, 286, 1512, 268, 1521, 279,
+ 294, 1510, 278, 190, 290, 232, 292, 293, 308, 335,
+ 2399, 2399, 317, 326, 1516, 351, 336, 356, 366, 2399,
+
+ 2399, 320, 367, 369, 370, 1478, 393, 327, 345, 420,
+ 455, 398, 1495, 490, 1481, 446, 481, 372, 365, 386,
+ 525, 560, 2399, 325, 388, 1491, 387, 1477, 595, 1476,
+ 516, 399, 1475, 34, 1472, 1461, 378, 1438, 1430, 318,
+ 1429, 1426, 323, 1424, 1423, 1422, 231, 387, 1430, 377,
+ 1411, 630, 1396, 551, 382, 108, 415, 408, 419, 412,
+ 586, 436, 665, 1400, 624, 456, 419, 1382, 457, 490,
+ 491, 625, 492, 1362, 526, 656, 672, 681, 1378, 716,
+ 707, 527, 723, 561, 1374, 2399, 732, 1346, 767, 437,
+ 1322, 410, 1312, 445, 1311, 546, 2399, 469, 758, 1303,
+
+ 802, 576, 482, 580, 470, 440, 472, 793, 809, 2399,
+ 818, 515, 1288, 1273, 853, 552, 1205, 839, 855, 861,
+ 877, 883, 899, 645, 1227, 483, 905, 921, 612, 1183,
+ 1168, 609, 927, 943, 626, 517, 628, 508, 629, 1167,
+ 949, 965, 971, 550, 1167, 1157, 1123, 1006, 1020, 666,
+ 682, 2399, 1047, 1091, 1006, 1038, 1055, 1063, 1071, 1079,
+ 632, 1087, 1095, 1105, 539, 1103, 1111, 542, 543, 681,
+ 1097, 683, 1119, 1127, 1135, 585, 1091, 1083, 1067, 1039,
+ 721, 752, 772, 1170, 717, 1205, 1184, 1217, 1244, 1258,
+ 1285, 1320, 984, 1244, 2399, 1276, 1311, 917, 1328, 767,
+
+ 1336, 1344, 733, 1352, 1360, 734, 578, 899, 582, 1395,
+ 1381, 1397, 623, 853, 822, 794, 793, 760, 807, 2399,
+ 875, 788, 1432, 1459, 1494, 818, 769, 1440, 1529, 1564,
+ 1438, 702, 1485, 919, 1520, 1555, 849, 963, 1572, 587,
+ 1299, 1580, 706, 441, 614, 1615, 1601, 715, 2399, 2399,
+ 2399, 2399, 2399, 2399, 1473, 839, 856, 1617, 1652, 804,
+ 852, 1638, 1654, 633, 1480, 871, 1508, 1650, 1542, 644,
+ 834, 1673, 1679, 1695, 1701, 2399, 1015, 872, 915, 916,
+ 877, 959, 704, 616, 586, 2399, 1717, 1723, 1739, 1002,
+ 1148, 514, 961, 989, 990, 1016, 1745, 1761, 1767, 1802,
+
+ 1137, 1008, 1018, 1017, 985, 1129, 878, 1038, 1790, 1806,
+ 1829, 1211, 1827, 1849, 944, 1057, 1152, 787, 584, 615,
+ 1196, 918, 1863, 1890, 1279, 2399, 1869, 1867, 516, 1199,
+ 1154, 943, 1242, 515, 653, 1904, 1906, 1941, 1968, 480,
+ 945, 1200, 1149, 1214, 1927, 1949, 1947, 1239, 1301, 1207,
+ 1302, 1974, 1990, 1392, 1267, 411, 1354, 1996, 2012, 1310,
+ 376, 1241, 1039, 2018, 2034, 1338, 348, 1377, 2040, 1216,
+ 1391, 1421, 1394, 324, 1226, 1376, 263, 2399, 2075, 2080,
+ 2091, 2096, 2101, 2110, 2117, 2128, 2137, 2142, 2153, 2165,
+ 2167, 2176, 2181, 2190, 2195, 2204, 2213, 2225, 2234, 2243,
+
+ 2248, 2260, 2265, 2276, 2281, 2292, 2303, 2314, 2319, 2330,
+ 2341, 2346, 2357, 2366, 2377, 2386
} ;
-static yyconst flex_int16_t yy_def[550] =
+static yyconst flex_int16_t yy_def[517] =
{ 0,
478, 1, 1, 1, 1, 1, 478, 478, 478, 478,
478, 479, 480, 478, 481, 478, 482, 478, 478, 478,
- 478, 483, 484, 484, 484, 485, 478, 478, 478, 478,
- 484, 484, 484, 478, 484, 478, 478, 478, 479, 478,
- 486, 480, 487, 488, 488, 489, 478, 481, 490, 478,
- 478, 478, 484, 484, 484, 485, 20, 491, 478, 492,
- 478, 20, 493, 493, 493, 493, 493, 493, 493, 493,
- 493, 493, 493, 493, 493, 493, 494, 493, 478, 483,
- 495, 495, 495, 495, 495, 495, 495, 496, 478, 484,
- 497, 478, 484, 484, 498, 484, 484, 484, 478, 478,
-
- 478, 484, 484, 484, 484, 478, 479, 479, 479, 479,
- 486, 499, 488, 488, 500, 488, 114, 501, 501, 501,
- 501, 502, 478, 478, 484, 503, 504, 493, 505, 493,
- 493, 493, 493, 493, 493, 493, 493, 493, 493, 493,
+ 478, 483, 484, 478, 485, 485, 485, 478, 478, 478,
+ 485, 485, 485, 478, 485, 478, 478, 478, 479, 478,
+ 486, 480, 478, 487, 488, 488, 478, 481, 489, 478,
+ 478, 478, 484, 485, 485, 485, 20, 490, 478, 491,
+ 478, 20, 492, 493, 493, 493, 493, 493, 493, 493,
+ 493, 493, 493, 493, 493, 493, 493, 493, 478, 483,
+ 494, 495, 495, 495, 495, 495, 495, 495, 485, 485,
+ 478, 478, 485, 496, 478, 485, 485, 478, 485, 478,
+
+ 478, 485, 485, 485, 485, 478, 479, 479, 479, 479,
+ 486, 478, 488, 46, 488, 497, 46, 481, 481, 481,
+ 481, 489, 478, 478, 485, 490, 498, 493, 493, 493,
+ 499, 493, 493, 493, 493, 493, 493, 493, 493, 493,
493, 493, 493, 493, 493, 493, 493, 493, 478, 495,
- 495, 506, 495, 495, 495, 495, 495, 495, 495, 495,
- 484, 98, 478, 484, 484, 507, 478, 484, 98, 484,
- 484, 484, 484, 478, 508, 508, 509, 114, 488, 114,
- 114, 501, 501, 484, 510, 478, 493, 147, 493, 493,
- 493, 493, 493, 493, 147, 493, 478, 495, 495, 160,
-
- 495, 495, 495, 495, 495, 495, 160, 98, 478, 511,
- 512, 478, 478, 513, 98, 484, 478, 514, 515, 114,
- 114, 114, 501, 484, 510, 516, 147, 493, 493, 147,
- 493, 495, 160, 495, 495, 495, 495, 495, 495, 160,
- 98, 517, 518, 478, 478, 478, 519, 519, 520, 521,
- 478, 522, 98, 478, 523, 524, 525, 525, 258, 526,
- 98, 147, 147, 147, 495, 160, 495, 495, 495, 495,
- 495, 160, 98, 527, 528, 478, 478, 478, 478, 478,
- 520, 478, 529, 530, 531, 532, 532, 532, 532, 532,
- 533, 98, 478, 534, 478, 535, 535, 297, 536, 98,
-
- 147, 301, 495, 160, 495, 495, 495, 495, 160, 98,
- 537, 538, 478, 478, 478, 478, 478, 478, 478, 539,
- 539, 539, 539, 540, 541, 541, 541, 541, 542, 543,
- 300, 478, 534, 297, 298, 536, 300, 301, 301, 495,
- 160, 495, 495, 495, 495, 300, 544, 478, 478, 478,
- 478, 478, 478, 478, 539, 539, 539, 323, 541, 541,
- 541, 328, 543, 478, 335, 300, 339, 495, 495, 495,
- 495, 545, 323, 328, 363, 478, 300, 495, 495, 495,
- 495, 495, 495, 495, 495, 478, 323, 328, 363, 300,
- 495, 495, 495, 495, 495, 495, 323, 328, 543, 546,
-
- 495, 495, 495, 495, 495, 495, 495, 495, 539, 541,
- 546, 546, 547, 548, 495, 495, 495, 495, 495, 495,
- 495, 495, 478, 478, 547, 549, 547, 547, 495, 495,
- 495, 495, 495, 495, 495, 547, 428, 547, 428, 495,
- 495, 495, 495, 495, 547, 437, 428, 495, 495, 495,
- 495, 437, 428, 495, 495, 495, 495, 437, 428, 495,
- 495, 495, 495, 437, 547, 495, 495, 495, 547, 495,
+ 495, 495, 495, 500, 495, 495, 495, 495, 495, 495,
+ 90, 485, 90, 478, 485, 485, 501, 478, 485, 485,
+ 485, 485, 485, 478, 479, 110, 478, 114, 488, 114,
+ 46, 481, 121, 485, 502, 478, 129, 493, 129, 493,
+ 493, 493, 493, 493, 493, 493, 478, 495, 152, 495,
+
+ 152, 495, 495, 495, 495, 495, 495, 90, 163, 478,
+ 478, 503, 478, 478, 504, 485, 478, 110, 478, 114,
+ 180, 46, 121, 485, 502, 498, 129, 189, 493, 493,
+ 493, 495, 152, 201, 495, 495, 495, 495, 495, 495,
+ 90, 163, 478, 505, 478, 478, 478, 504, 504, 506,
+ 507, 478, 508, 478, 110, 478, 114, 180, 46, 121,
+ 485, 129, 189, 493, 495, 152, 201, 495, 495, 495,
+ 495, 495, 90, 163, 478, 509, 478, 478, 478, 478,
+ 478, 506, 478, 510, 507, 511, 504, 504, 504, 504,
+ 504, 508, 478, 110, 478, 114, 180, 488, 121, 485,
+
+ 129, 189, 495, 152, 201, 495, 495, 495, 495, 485,
+ 163, 478, 512, 478, 478, 478, 478, 478, 478, 478,
+ 506, 506, 506, 506, 510, 507, 507, 507, 507, 511,
+ 291, 478, 110, 488, 180, 121, 485, 493, 189, 495,
+ 495, 201, 495, 495, 495, 485, 478, 478, 478, 478,
+ 478, 478, 478, 478, 506, 506, 506, 324, 507, 507,
+ 507, 329, 291, 478, 488, 485, 493, 495, 495, 495,
+ 495, 478, 324, 329, 291, 478, 485, 495, 495, 495,
+ 495, 495, 495, 495, 495, 478, 324, 329, 291, 485,
+ 495, 495, 495, 495, 495, 495, 324, 329, 291, 513,
+
+ 495, 495, 495, 495, 495, 495, 495, 495, 324, 329,
+ 513, 411, 514, 515, 495, 495, 495, 495, 495, 495,
+ 495, 495, 515, 515, 478, 478, 515, 516, 495, 495,
+ 495, 495, 495, 495, 495, 515, 424, 515, 424, 495,
+ 495, 495, 495, 495, 424, 515, 439, 495, 495, 495,
+ 495, 424, 439, 495, 495, 495, 495, 424, 439, 495,
+ 495, 495, 495, 424, 439, 495, 495, 495, 439, 495,
495, 495, 495, 495, 495, 495, 495, 0, 478, 478,
478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478
+ 478, 478, 478, 478, 478, 478
} ;
-static yyconst flex_int16_t yy_nxt[6664] =
+static yyconst flex_int16_t yy_nxt[2460] =
{ 0,
8, 9, 10, 9, 9, 9, 11, 12, 13, 14,
8, 8, 15, 8, 8, 16, 8, 17, 18, 19,
- 20, 8, 21, 8, 8, 8, 22, 23, 23, 23,
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
- 24, 23, 23, 23, 23, 23, 23, 25, 23, 23,
- 23, 23, 23, 26, 27, 23, 23, 23, 23, 23,
- 23, 23, 23, 23, 23, 23, 23, 23, 24, 23,
- 23, 23, 23, 23, 23, 25, 23, 23, 23, 23,
- 23, 8, 28, 29, 23, 30, 35, 30, 35, 40,
- 40, 31, 152, 31, 36, 36, 36, 36, 36, 36,
-
- 36, 36, 36, 36, 32, 33, 32, 33, 37, 37,
- 37, 37, 37, 89, 40, 35, 51, 35, 89, 52,
- 31, 89, 31, 89, 92, 93, 92, 93, 106, 40,
- 49, 136, 32, 33, 32, 33, 41, 478, 89, 54,
- 478, 95, 38, 152, 129, 34, 105, 34, 55, 94,
- 89, 103, 56, 91, 89, 129, 106, 148, 91, 136,
- 41, 91, 152, 91, 89, 152, 131, 54, 154, 96,
- 49, 38, 42, 46, 105, 43, 55, 94, 91, 103,
- 152, 102, 44, 44, 44, 44, 44, 44, 129, 89,
- 91, 104, 92, 93, 91, 131, 154, 96, 36, 36,
-
- 36, 36, 36, 137, 91, 135, 129, 152, 46, 102,
- 210, 44, 44, 44, 44, 44, 44, 59, 212, 104,
- 210, 89, 129, 152, 60, 61, 152, 62, 244, 91,
- 92, 92, 137, 135, 63, 63, 64, 65, 66, 63,
- 67, 68, 69, 63, 70, 63, 71, 72, 63, 73,
- 63, 74, 75, 76, 63, 63, 63, 63, 63, 63,
- 77, 91, 78, 63, 63, 64, 65, 66, 63, 67,
- 68, 69, 70, 63, 71, 72, 63, 73, 63, 74,
- 75, 76, 63, 63, 63, 63, 63, 63, 130, 52,
- 174, 63, 80, 144, 89, 152, 37, 37, 37, 37,
-
- 37, 478, 129, 57, 82, 210, 112, 83, 112, 124,
- 84, 152, 125, 276, 85, 86, 130, 87, 174, 129,
- 134, 132, 144, 63, 92, 140, 152, 127, 88, 129,
- 38, 186, 133, 82, 91, 129, 83, 124, 138, 84,
- 89, 125, 85, 86, 139, 87, 98, 141, 134, 132,
- 153, 63, 129, 98, 98, 98, 98, 98, 98, 38,
- 133, 129, 40, 40, 142, 478, 138, 145, 143, 152,
- 39, 129, 139, 129, 157, 40, 141, 156, 192, 153,
- 91, 152, 98, 98, 98, 98, 98, 98, 39, 39,
- 39, 107, 142, 40, 109, 145, 143, 150, 155, 152,
-
- 152, 88, 158, 157, 210, 40, 156, 110, 41, 41,
- 89, 129, 152, 89, 110, 110, 110, 110, 110, 110,
- 164, 41, 89, 478, 89, 150, 155, 89, 152, 152,
- 282, 158, 89, 40, 49, 168, 354, 89, 89, 353,
- 111, 170, 352, 110, 110, 110, 110, 110, 110, 114,
- 91, 41, 172, 91, 351, 165, 114, 114, 114, 114,
- 114, 114, 91, 168, 91, 171, 478, 91, 173, 89,
- 170, 285, 91, 210, 49, 189, 40, 91, 91, 190,
- 172, 313, 115, 165, 184, 114, 114, 114, 114, 114,
- 114, 117, 193, 171, 198, 129, 173, 194, 117, 117,
-
- 117, 117, 117, 117, 189, 129, 129, 209, 190, 91,
- 191, 129, 196, 184, 204, 129, 152, 49, 192, 201,
- 226, 193, 129, 198, 186, 194, 202, 117, 117, 117,
- 117, 117, 117, 48, 48, 48, 118, 152, 191, 152,
- 196, 205, 203, 204, 120, 152, 206, 91, 201, 217,
- 228, 129, 121, 152, 202, 152, 214, 89, 89, 121,
- 121, 121, 121, 121, 121, 164, 152, 209, 89, 205,
- 203, 89, 478, 129, 268, 206, 89, 217, 89, 228,
- 282, 177, 40, 177, 282, 122, 229, 254, 121, 121,
- 121, 121, 121, 121, 98, 231, 91, 91, 91, 129,
-
- 224, 98, 98, 98, 98, 98, 98, 91, 91, 216,
- 152, 91, 234, 232, 229, 254, 91, 129, 91, 282,
- 332, 152, 235, 49, 231, 285, 283, 236, 224, 152,
- 98, 98, 98, 98, 98, 98, 147, 216, 152, 152,
- 234, 237, 232, 147, 147, 147, 147, 147, 147, 332,
- 235, 264, 265, 267, 400, 236, 282, 282, 90, 152,
- 285, 152, 238, 63, 63, 129, 293, 219, 152, 219,
- 237, 239, 147, 147, 147, 147, 147, 147, 160, 264,
- 265, 267, 89, 269, 152, 160, 160, 160, 160, 160,
- 160, 238, 152, 152, 293, 247, 247, 247, 247, 247,
-
- 239, 249, 283, 283, 261, 303, 250, 350, 251, 270,
- 343, 269, 364, 271, 160, 160, 160, 160, 160, 160,
- 162, 152, 91, 152, 376, 152, 308, 162, 162, 162,
- 162, 162, 162, 261, 303, 152, 152, 152, 270, 343,
- 364, 271, 247, 247, 247, 247, 247, 252, 249, 305,
- 115, 306, 376, 250, 308, 251, 162, 162, 162, 162,
- 162, 162, 97, 97, 97, 97, 97, 317, 242, 90,
- 242, 152, 152, 368, 89, 307, 340, 342, 305, 210,
- 306, 169, 152, 152, 152, 316, 344, 349, 169, 169,
- 169, 169, 169, 169, 252, 280, 280, 280, 280, 280,
-
- 366, 478, 315, 307, 340, 342, 478, 314, 251, 152,
- 468, 256, 152, 256, 91, 344, 152, 169, 169, 169,
- 169, 169, 169, 108, 175, 175, 175, 108, 366, 40,
- 280, 280, 280, 280, 280, 318, 318, 318, 318, 318,
- 478, 370, 176, 251, 279, 282, 152, 252, 319, 176,
- 176, 176, 176, 176, 176, 280, 280, 280, 280, 280,
- 318, 318, 318, 318, 318, 152, 278, 90, 251, 274,
- 370, 274, 384, 319, 405, 41, 371, 377, 176, 176,
- 176, 176, 176, 176, 39, 39, 39, 107, 277, 152,
- 109, 283, 152, 129, 152, 280, 280, 280, 280, 280,
-
- 152, 384, 405, 110, 396, 371, 377, 252, 251, 129,
- 110, 110, 110, 110, 110, 110, 280, 280, 280, 280,
- 280, 280, 280, 280, 280, 280, 478, 226, 478, 251,
- 152, 282, 246, 396, 251, 403, 111, 152, 282, 110,
- 110, 110, 110, 110, 110, 178, 404, 252, 467, 245,
- 152, 417, 178, 178, 178, 178, 178, 178, 355, 318,
- 318, 318, 355, 403, 282, 478, 152, 129, 252, 152,
- 282, 356, 152, 252, 129, 404, 467, 283, 115, 285,
- 417, 178, 178, 178, 178, 178, 178, 180, 129, 359,
- 318, 318, 318, 359, 180, 180, 180, 180, 180, 180,
-
- 282, 129, 360, 97, 97, 97, 97, 97, 226, 115,
- 283, 108, 175, 175, 175, 108, 283, 40, 213, 90,
- 385, 163, 152, 180, 180, 180, 180, 180, 180, 116,
- 116, 116, 116, 116, 161, 161, 161, 161, 161, 152,
- 197, 285, 152, 119, 182, 182, 182, 119, 181, 385,
- 90, 478, 478, 129, 40, 181, 181, 181, 181, 181,
- 181, 282, 282, 41, 179, 179, 179, 179, 179, 430,
- 159, 159, 159, 159, 159, 187, 187, 187, 187, 187,
- 129, 129, 152, 90, 181, 181, 181, 181, 181, 181,
- 119, 182, 182, 182, 119, 49, 295, 430, 295, 129,
-
- 448, 40, 285, 285, 199, 199, 199, 199, 199, 183,
- 390, 391, 392, 129, 152, 393, 183, 183, 183, 183,
- 183, 183, 152, 355, 318, 318, 318, 355, 448, 282,
- 311, 429, 311, 152, 152, 129, 356, 152, 390, 152,
- 391, 392, 49, 406, 393, 183, 183, 183, 183, 183,
- 183, 48, 48, 48, 118, 394, 152, 129, 152, 429,
- 432, 152, 120, 359, 318, 318, 318, 359, 395, 401,
- 121, 406, 402, 416, 282, 283, 360, 121, 121, 121,
- 121, 121, 121, 394, 129, 415, 152, 129, 421, 432,
- 152, 152, 129, 152, 152, 129, 419, 395, 401, 407,
-
- 152, 402, 416, 122, 129, 408, 121, 121, 121, 121,
- 121, 121, 188, 415, 152, 285, 421, 420, 152, 188,
- 188, 188, 188, 188, 188, 419, 347, 407, 347, 372,
- 386, 372, 386, 408, 286, 286, 286, 286, 286, 152,
- 127, 418, 422, 115, 115, 167, 420, 251, 188, 188,
- 188, 188, 188, 188, 146, 146, 146, 146, 146, 152,
- 152, 163, 152, 149, 326, 361, 361, 361, 326, 431,
- 418, 422, 129, 195, 129, 282, 433, 57, 152, 434,
- 195, 195, 195, 195, 195, 195, 252, 411, 411, 411,
- 411, 411, 321, 357, 357, 357, 321, 431, 282, 77,
-
- 152, 152, 59, 412, 127, 433, 129, 123, 434, 195,
- 195, 195, 195, 195, 195, 200, 285, 411, 411, 411,
- 411, 411, 200, 200, 200, 200, 200, 200, 423, 423,
- 423, 423, 423, 412, 115, 101, 100, 435, 99, 414,
- 79, 424, 440, 58, 283, 444, 478, 478, 478, 478,
- 478, 200, 200, 200, 200, 200, 200, 159, 159, 159,
- 159, 159, 478, 152, 152, 57, 435, 442, 441, 414,
- 152, 440, 443, 50, 444, 449, 207, 152, 471, 152,
- 426, 152, 454, 207, 207, 207, 207, 207, 207, 423,
- 423, 423, 423, 423, 152, 442, 450, 441, 414, 47,
-
- 443, 152, 424, 449, 152, 455, 478, 471, 152, 152,
- 451, 454, 207, 207, 207, 207, 207, 207, 161, 161,
- 161, 161, 161, 478, 450, 152, 478, 152, 423, 423,
- 423, 423, 423, 456, 455, 478, 460, 208, 451, 478,
- 457, 424, 152, 478, 208, 208, 208, 208, 208, 208,
- 423, 423, 423, 423, 423, 423, 423, 423, 423, 423,
- 478, 456, 152, 424, 461, 470, 478, 478, 424, 457,
- 478, 152, 152, 208, 208, 208, 208, 208, 208, 215,
- 426, 423, 423, 423, 423, 423, 215, 215, 215, 215,
- 215, 215, 461, 470, 424, 478, 478, 478, 463, 478,
-
- 462, 466, 426, 477, 478, 478, 152, 426, 473, 152,
- 152, 152, 474, 478, 475, 215, 215, 215, 215, 215,
- 215, 108, 175, 175, 175, 108, 463, 40, 462, 466,
- 152, 477, 478, 426, 152, 478, 478, 473, 152, 478,
- 218, 474, 478, 475, 478, 478, 478, 218, 218, 218,
- 218, 218, 218, 423, 423, 423, 423, 423, 438, 438,
- 438, 438, 438, 478, 478, 478, 424, 478, 478, 478,
- 478, 424, 478, 41, 478, 478, 218, 218, 218, 218,
- 218, 218, 220, 445, 445, 445, 445, 445, 472, 220,
- 220, 220, 220, 220, 220, 478, 424, 478, 478, 478,
-
- 478, 478, 476, 152, 478, 426, 478, 478, 478, 478,
- 426, 478, 478, 478, 478, 478, 472, 152, 220, 220,
- 220, 220, 220, 220, 179, 179, 179, 179, 179, 478,
- 476, 478, 478, 478, 478, 426, 478, 478, 478, 478,
- 478, 478, 478, 221, 478, 478, 478, 478, 478, 478,
- 221, 221, 221, 221, 221, 221, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 221,
- 221, 221, 221, 221, 221, 116, 116, 116, 116, 116,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
-
- 478, 478, 478, 478, 222, 478, 478, 478, 478, 478,
- 478, 222, 222, 222, 222, 222, 222, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 222, 222, 222, 222, 222, 222, 119, 182, 182, 182,
- 119, 478, 478, 478, 478, 478, 478, 40, 478, 478,
- 478, 478, 478, 478, 478, 223, 478, 478, 478, 478,
- 478, 478, 223, 223, 223, 223, 223, 223, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 49, 478,
-
- 478, 223, 223, 223, 223, 223, 223, 187, 187, 187,
- 187, 187, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 227, 478, 478, 478,
- 478, 478, 478, 227, 227, 227, 227, 227, 227, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 227, 227, 227, 227, 227, 227, 230, 478,
- 478, 478, 478, 478, 478, 230, 230, 230, 230, 230,
- 230, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
-
- 478, 478, 478, 478, 230, 230, 230, 230, 230, 230,
- 199, 199, 199, 199, 199, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 233,
- 478, 478, 478, 478, 478, 478, 233, 233, 233, 233,
- 233, 233, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 233, 233, 233, 233, 233,
- 233, 240, 478, 478, 478, 478, 478, 478, 240, 240,
- 240, 240, 240, 240, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
-
- 478, 478, 478, 478, 478, 478, 478, 240, 240, 240,
- 240, 240, 240, 161, 161, 161, 161, 161, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 241, 478, 478, 478, 478, 478, 478, 241,
- 241, 241, 241, 241, 241, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 241, 241,
- 241, 241, 241, 241, 253, 478, 478, 478, 478, 478,
- 478, 253, 253, 253, 253, 253, 253, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
-
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 253, 253, 253, 253, 253, 253, 108, 175, 175, 175,
- 108, 478, 40, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 255, 478, 478, 478, 478,
- 478, 478, 255, 255, 255, 255, 255, 255, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 41, 478,
- 478, 255, 255, 255, 255, 255, 255, 257, 478, 478,
- 478, 478, 478, 478, 257, 257, 257, 257, 257, 257,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
-
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 257, 257, 257, 257, 257, 257, 179,
- 179, 179, 179, 179, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 258, 478,
- 478, 478, 478, 478, 478, 258, 258, 258, 258, 258,
- 258, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 258, 258, 258, 258, 258, 258,
- 116, 116, 116, 116, 116, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 259,
-
- 478, 478, 478, 478, 478, 478, 259, 259, 259, 259,
- 259, 259, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 259, 259, 259, 259, 259,
- 259, 119, 182, 182, 182, 119, 478, 478, 478, 478,
- 478, 478, 40, 478, 478, 478, 478, 478, 478, 478,
- 260, 478, 478, 478, 478, 478, 478, 260, 260, 260,
- 260, 260, 260, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 49, 478, 478, 260, 260, 260, 260,
-
- 260, 260, 187, 187, 187, 187, 187, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 262, 478, 478, 478, 478, 478, 478, 262, 262,
- 262, 262, 262, 262, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 262, 262, 262,
- 262, 262, 262, 263, 478, 478, 478, 478, 478, 478,
- 263, 263, 263, 263, 263, 263, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 263,
-
- 263, 263, 263, 263, 263, 199, 199, 199, 199, 199,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 266, 478, 478, 478, 478, 478,
- 478, 266, 266, 266, 266, 266, 266, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 266, 266, 266, 266, 266, 266, 272, 478, 478, 478,
- 478, 478, 478, 272, 272, 272, 272, 272, 272, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
-
- 478, 478, 272, 272, 272, 272, 272, 272, 161, 161,
- 161, 161, 161, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 273, 478, 478,
- 478, 478, 478, 478, 273, 273, 273, 273, 273, 273,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 273, 273, 273, 273, 273, 273, 280,
- 280, 280, 280, 286, 478, 288, 478, 478, 478, 478,
- 288, 288, 289, 478, 478, 478, 478, 478, 290, 478,
- 478, 478, 478, 478, 478, 290, 290, 290, 290, 290,
-
- 290, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 291, 478, 478, 290, 290, 290, 290, 290, 290,
- 292, 478, 478, 478, 478, 478, 478, 292, 292, 292,
- 292, 292, 292, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 292, 292, 292, 292,
- 292, 292, 108, 175, 175, 175, 108, 478, 40, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 294, 478, 478, 478, 478, 478, 478, 294, 294,
-
- 294, 294, 294, 294, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 41, 478, 478, 294, 294, 294,
- 294, 294, 294, 296, 478, 478, 478, 478, 478, 478,
- 296, 296, 296, 296, 296, 296, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 115, 478, 478, 296,
- 296, 296, 296, 296, 296, 179, 179, 179, 179, 179,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 297, 478, 478, 478, 478, 478,
-
- 478, 297, 297, 297, 297, 297, 297, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 115, 478, 478,
- 297, 297, 297, 297, 297, 297, 116, 116, 116, 116,
- 116, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 298, 478, 478, 478, 478,
- 478, 478, 298, 298, 298, 298, 298, 298, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 298, 298, 298, 298, 298, 298, 119, 182, 182,
-
- 182, 119, 478, 478, 478, 478, 478, 478, 40, 478,
- 478, 478, 478, 478, 478, 478, 299, 478, 478, 478,
- 478, 478, 478, 299, 299, 299, 299, 299, 299, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 49,
- 478, 478, 299, 299, 299, 299, 299, 299, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 90, 478, 478,
- 478, 478, 478, 478, 90, 90, 90, 90, 90, 90,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
-
- 478, 478, 478, 300, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 90, 90, 90, 90, 90, 90, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 300, 187, 187, 187, 187, 187, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 301, 478, 478, 478, 478, 478, 478, 301, 301,
- 301, 301, 301, 301, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 301, 301, 301,
- 301, 301, 301, 302, 478, 478, 478, 478, 478, 478,
-
- 302, 302, 302, 302, 302, 302, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 302,
- 302, 302, 302, 302, 302, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 128, 478, 478, 478, 478, 478,
- 478, 128, 128, 128, 128, 128, 128, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 128, 128, 128, 128, 128, 128, 199, 199, 199, 199,
-
- 199, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 304, 478, 478, 478, 478,
- 478, 478, 304, 304, 304, 304, 304, 304, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 304, 304, 304, 304, 304, 304, 309, 478, 478,
- 478, 478, 478, 478, 309, 309, 309, 309, 309, 309,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 309, 309, 309, 309, 309, 309, 161,
-
- 161, 161, 161, 161, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 310, 478,
- 478, 478, 478, 478, 478, 310, 310, 310, 310, 310,
- 310, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 310, 310, 310, 310, 310, 310,
- 281, 281, 281, 320, 478, 478, 322, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 323,
- 478, 478, 478, 478, 478, 478, 323, 323, 323, 323,
- 323, 323, 478, 478, 478, 478, 478, 478, 478, 478,
-
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 324, 478, 478, 323, 323, 323, 323, 323,
- 323, 284, 284, 284, 325, 478, 478, 478, 478, 478,
- 478, 478, 327, 478, 478, 478, 478, 478, 478, 478,
- 328, 478, 478, 478, 478, 478, 478, 328, 328, 328,
- 328, 328, 328, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 329, 478, 478, 328, 328, 328, 328,
- 328, 328, 286, 286, 286, 286, 286, 478, 478, 478,
- 478, 478, 478, 478, 478, 251, 478, 478, 478, 478,
-
- 478, 330, 478, 478, 478, 478, 478, 478, 330, 330,
- 330, 330, 330, 330, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 252, 478, 478, 330, 330, 330,
- 330, 330, 330, 280, 280, 280, 280, 286, 478, 288,
- 478, 478, 478, 478, 288, 288, 289, 478, 478, 478,
- 478, 478, 290, 478, 478, 478, 478, 478, 478, 290,
- 290, 290, 290, 290, 290, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 291, 478, 478, 290, 290,
-
- 290, 290, 290, 290, 331, 478, 478, 478, 478, 478,
- 478, 331, 331, 331, 331, 331, 331, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 331, 331, 331, 331, 331, 331, 108, 175, 175, 175,
- 108, 478, 40, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 333, 478, 478, 478, 478,
- 478, 478, 333, 333, 333, 333, 333, 333, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 41, 478,
-
- 478, 333, 333, 333, 333, 333, 333, 179, 179, 179,
- 179, 179, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 334, 478, 478, 478,
- 478, 478, 478, 334, 334, 334, 334, 334, 334, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 115,
- 478, 478, 334, 334, 334, 334, 334, 334, 116, 116,
- 116, 116, 116, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 335, 478, 478,
- 478, 478, 478, 478, 335, 335, 335, 335, 335, 335,
-
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 335, 335, 335, 335, 335, 335, 119,
- 182, 182, 182, 119, 478, 478, 478, 478, 478, 478,
- 40, 478, 478, 478, 478, 478, 478, 478, 336, 478,
- 478, 478, 478, 478, 478, 336, 336, 336, 336, 336,
- 336, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 49, 478, 478, 336, 336, 336, 336, 336, 336,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
-
- 478, 478, 478, 478, 478, 478, 337, 478, 478, 90,
- 478, 478, 478, 478, 478, 478, 90, 90, 90, 90,
- 90, 90, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 90, 90, 90, 90, 90,
- 90, 187, 187, 187, 187, 187, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 338, 478, 478, 478, 478, 478, 478, 338, 338, 338,
- 338, 338, 338, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
-
- 478, 478, 478, 478, 478, 478, 338, 338, 338, 338,
- 338, 338, 146, 146, 146, 146, 146, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 339, 478, 478, 478, 478, 478, 478, 339, 339,
- 339, 339, 339, 339, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 339, 339, 339,
- 339, 339, 339, 199, 199, 199, 199, 199, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 341, 478, 478, 478, 478, 478, 478, 341,
-
- 341, 341, 341, 341, 341, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 341, 341,
- 341, 341, 341, 341, 345, 478, 478, 478, 478, 478,
- 478, 345, 345, 345, 345, 345, 345, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 345, 345, 345, 345, 345, 345, 161, 161, 161, 161,
- 161, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 346, 478, 478, 478, 478,
-
- 478, 478, 346, 346, 346, 346, 346, 346, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 346, 346, 346, 346, 346, 346, 321, 357, 357,
- 357, 321, 478, 282, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 358, 478, 478, 478,
- 478, 478, 478, 358, 358, 358, 358, 358, 358, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 283,
- 478, 478, 358, 358, 358, 358, 358, 358, 281, 281,
-
- 281, 320, 478, 478, 322, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 323, 478, 478,
- 478, 478, 478, 478, 323, 323, 323, 323, 323, 323,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 324, 478, 478, 323, 323, 323, 323, 323, 323, 326,
- 361, 361, 361, 326, 478, 478, 478, 478, 478, 478,
- 282, 478, 478, 478, 478, 478, 478, 478, 362, 478,
- 478, 478, 478, 478, 478, 362, 362, 362, 362, 362,
- 362, 478, 478, 478, 478, 478, 478, 478, 478, 478,
-
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 285, 478, 478, 362, 362, 362, 362, 362, 362,
- 284, 284, 284, 325, 478, 478, 478, 478, 478, 478,
- 478, 327, 478, 478, 478, 478, 478, 478, 478, 328,
- 478, 478, 478, 478, 478, 478, 328, 328, 328, 328,
- 328, 328, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 329, 478, 478, 328, 328, 328, 328, 328,
- 328, 286, 286, 286, 286, 286, 478, 478, 478, 478,
- 478, 478, 478, 478, 251, 478, 478, 478, 478, 478,
-
- 363, 478, 478, 478, 478, 478, 478, 363, 363, 363,
- 363, 363, 363, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 252, 478, 478, 363, 363, 363, 363,
- 363, 363, 365, 478, 478, 478, 478, 478, 478, 365,
- 365, 365, 365, 365, 365, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 365, 365,
- 365, 365, 365, 365, 113, 478, 478, 478, 478, 478,
- 478, 113, 113, 113, 113, 113, 113, 478, 478, 478,
-
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 113, 113, 113, 113, 113, 113, 367, 478, 478, 478,
- 478, 478, 478, 367, 367, 367, 367, 367, 367, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 367, 367, 367, 367, 367, 367, 146, 146,
- 146, 146, 146, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 128, 478, 478,
- 478, 478, 478, 478, 128, 128, 128, 128, 128, 128,
-
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 128, 128, 128, 128, 128, 128, 199,
- 199, 199, 199, 199, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 369, 478,
- 478, 478, 478, 478, 478, 369, 369, 369, 369, 369,
- 369, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 369, 369, 369, 369, 369, 369,
- 373, 478, 478, 478, 478, 478, 478, 373, 373, 373,
-
- 373, 373, 373, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 373, 373, 373, 373,
- 373, 373, 374, 478, 478, 478, 478, 478, 478, 374,
- 374, 374, 374, 374, 374, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 374, 374,
- 374, 374, 374, 374, 286, 286, 286, 286, 286, 478,
- 478, 478, 478, 478, 478, 478, 478, 251, 478, 478,
- 478, 478, 478, 375, 478, 478, 478, 478, 478, 478,
-
- 375, 375, 375, 375, 375, 375, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 252, 478, 478, 375,
- 375, 375, 375, 375, 375, 378, 478, 478, 478, 478,
- 478, 478, 379, 478, 380, 478, 478, 478, 478, 381,
- 382, 478, 478, 383, 478, 478, 478, 478, 152, 478,
- 478, 478, 478, 478, 378, 478, 478, 478, 478, 478,
- 379, 478, 380, 478, 478, 478, 478, 381, 382, 478,
- 478, 383, 387, 478, 478, 478, 478, 478, 478, 387,
- 387, 387, 387, 387, 387, 478, 478, 478, 478, 478,
-
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 387, 387,
- 387, 387, 387, 387, 388, 478, 478, 478, 478, 478,
- 478, 388, 388, 388, 388, 388, 388, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 388, 388, 388, 388, 388, 388, 389, 478, 478, 478,
- 478, 478, 478, 389, 389, 389, 389, 389, 389, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
-
- 478, 478, 389, 389, 389, 389, 389, 389, 397, 478,
- 478, 478, 478, 478, 478, 397, 397, 397, 397, 397,
- 397, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 397, 397, 397, 397, 397, 397,
- 398, 478, 478, 478, 478, 478, 478, 398, 398, 398,
- 398, 398, 398, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 398, 398, 398, 398,
- 398, 398, 399, 478, 478, 478, 478, 478, 478, 399,
-
- 399, 399, 399, 399, 399, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 399, 399,
- 399, 399, 399, 399, 409, 478, 478, 478, 478, 478,
- 478, 409, 409, 409, 409, 409, 409, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 409, 409, 409, 409, 409, 409, 410, 478, 478, 478,
- 478, 478, 478, 410, 410, 410, 410, 410, 410, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
-
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 410, 410, 410, 410, 410, 410, 428, 478,
- 478, 478, 478, 478, 478, 428, 428, 428, 428, 428,
- 428, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 428, 428, 428, 428, 428, 428,
- 437, 478, 478, 478, 478, 478, 478, 437, 437, 437,
- 437, 437, 437, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 437, 437, 437, 437,
-
- 437, 437, 438, 438, 438, 438, 438, 478, 478, 478,
- 478, 478, 478, 478, 478, 424, 478, 478, 478, 478,
- 478, 439, 478, 478, 478, 478, 478, 478, 439, 439,
- 439, 439, 439, 439, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 426, 478, 478, 439, 439, 439,
- 439, 439, 439, 445, 445, 445, 445, 445, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 446, 478, 478, 478, 478, 478, 478, 446,
- 446, 446, 446, 446, 446, 478, 478, 478, 478, 478,
-
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 446, 446,
- 446, 446, 446, 446, 447, 478, 478, 478, 478, 478,
- 478, 447, 447, 447, 447, 447, 447, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 447, 447, 447, 447, 447, 447, 452, 478, 478, 478,
- 478, 478, 478, 452, 452, 452, 452, 452, 452, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
-
- 478, 478, 452, 452, 452, 452, 452, 452, 453, 478,
- 478, 478, 478, 478, 478, 453, 453, 453, 453, 453,
- 453, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 453, 453, 453, 453, 453, 453,
- 458, 478, 478, 478, 478, 478, 478, 458, 458, 458,
- 458, 458, 458, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 458, 458, 458, 458,
- 458, 458, 459, 478, 478, 478, 478, 478, 478, 459,
-
- 459, 459, 459, 459, 459, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 459, 459,
- 459, 459, 459, 459, 464, 478, 478, 478, 478, 478,
- 478, 464, 464, 464, 464, 464, 464, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 464, 464, 464, 464, 464, 464, 465, 478, 478, 478,
- 478, 478, 478, 465, 465, 465, 465, 465, 465, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
-
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 465, 465, 465, 465, 465, 465, 469, 478,
- 478, 478, 478, 478, 478, 469, 469, 469, 469, 469,
- 469, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 469, 469, 469, 469, 469, 469,
- 39, 478, 478, 39, 39, 39, 39, 39, 39, 39,
- 39, 39, 39, 45, 45, 478, 45, 45, 48, 478,
- 478, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 53, 53, 478, 53, 53, 81, 478, 478, 81,
-
- 81, 90, 478, 90, 90, 478, 90, 90, 97, 97,
- 97, 97, 97, 97, 97, 97, 97, 97, 108, 108,
+ 20, 8, 21, 8, 8, 8, 22, 23, 24, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 26, 25, 25, 25, 25, 25, 25,
+ 27, 25, 25, 25, 25, 25, 8, 28, 29, 25,
+ 30, 131, 30, 36, 36, 36, 36, 36, 40, 31,
+ 191, 31, 36, 36, 36, 36, 36, 37, 37, 37,
+ 37, 37, 32, 33, 32, 33, 42, 131, 41, 43,
+ 40, 40, 52, 92, 134, 34, 44, 34, 92, 46,
+
+ 46, 46, 46, 46, 46, 49, 51, 94, 80, 52,
+ 92, 41, 94, 98, 38, 124, 53, 92, 81, 131,
+ 95, 96, 131, 83, 94, 40, 84, 478, 102, 85,
+ 478, 94, 55, 86, 87, 154, 88, 44, 139, 137,
+ 49, 56, 59, 90, 99, 131, 92, 132, 97, 60,
+ 61, 203, 62, 90, 90, 90, 90, 90, 90, 63,
+ 94, 64, 65, 65, 66, 67, 68, 65, 69, 70,
+ 71, 65, 72, 65, 73, 74, 65, 75, 65, 76,
+ 77, 78, 65, 65, 65, 65, 65, 65, 92, 92,
+ 92, 65, 95, 96, 36, 36, 36, 36, 36, 478,
+
+ 112, 57, 94, 94, 94, 37, 37, 37, 37, 37,
+ 112, 112, 112, 112, 112, 112, 114, 154, 104, 92,
+ 103, 105, 95, 96, 65, 117, 114, 114, 114, 114,
+ 114, 114, 116, 94, 156, 117, 117, 117, 117, 117,
+ 117, 90, 38, 39, 39, 39, 107, 92, 131, 109,
+ 131, 90, 90, 90, 90, 90, 90, 131, 131, 154,
+ 140, 94, 110, 133, 195, 131, 158, 131, 125, 111,
+ 144, 131, 110, 110, 110, 110, 110, 110, 48, 48,
+ 48, 118, 135, 95, 143, 138, 141, 145, 129, 120,
+ 154, 146, 142, 136, 131, 131, 478, 121, 129, 129,
+
+ 129, 129, 129, 129, 122, 154, 81, 121, 121, 121,
+ 121, 121, 121, 131, 152, 155, 147, 154, 148, 154,
+ 154, 92, 159, 160, 152, 152, 152, 152, 152, 152,
+ 92, 150, 157, 92, 40, 94, 89, 89, 89, 89,
+ 89, 95, 95, 194, 94, 131, 163, 94, 92, 92,
+ 131, 154, 40, 170, 41, 161, 163, 163, 163, 163,
+ 163, 163, 94, 94, 92, 161, 161, 161, 161, 161,
+ 161, 165, 41, 193, 48, 154, 167, 40, 94, 92,
+ 92, 168, 92, 92, 40, 166, 167, 167, 167, 167,
+ 167, 167, 49, 94, 94, 39, 94, 94, 40, 49,
+
+ 40, 92, 127, 154, 154, 131, 186, 169, 192, 154,
+ 172, 198, 202, 49, 131, 94, 171, 173, 177, 184,
+ 41, 108, 175, 175, 175, 108, 131, 40, 177, 177,
+ 177, 177, 177, 177, 196, 154, 211, 131, 154, 154,
+ 176, 205, 154, 230, 213, 190, 154, 41, 207, 92,
+ 176, 176, 176, 176, 176, 176, 39, 39, 39, 107,
+ 204, 206, 109, 94, 131, 194, 180, 154, 154, 210,
+ 215, 229, 131, 370, 239, 110, 180, 180, 180, 180,
+ 180, 180, 111, 94, 94, 110, 110, 110, 110, 110,
+ 110, 113, 113, 113, 113, 113, 154, 154, 226, 154,
+
+ 232, 181, 186, 92, 210, 92, 240, 154, 238, 154,
+ 178, 181, 181, 181, 181, 181, 181, 94, 94, 94,
+ 178, 178, 178, 178, 178, 178, 119, 182, 182, 182,
+ 119, 236, 211, 40, 269, 154, 189, 40, 271, 40,
+ 245, 154, 154, 154, 154, 183, 189, 189, 189, 189,
+ 189, 189, 49, 41, 49, 183, 183, 183, 183, 183,
+ 183, 48, 48, 48, 118, 92, 154, 211, 403, 154,
+ 154, 201, 120, 131, 92, 277, 306, 303, 307, 94,
+ 121, 201, 201, 201, 201, 201, 201, 122, 94, 231,
+ 121, 121, 121, 121, 121, 121, 128, 128, 128, 128,
+
+ 128, 224, 211, 154, 368, 154, 208, 154, 344, 154,
+ 314, 154, 345, 154, 154, 187, 208, 208, 208, 208,
+ 208, 208, 131, 235, 237, 187, 187, 187, 187, 187,
+ 187, 151, 151, 151, 151, 151, 154, 92, 92, 131,
+ 211, 154, 154, 154, 165, 92, 371, 433, 349, 265,
+ 199, 94, 94, 154, 264, 154, 154, 154, 92, 94,
+ 199, 199, 199, 199, 199, 199, 162, 162, 162, 162,
+ 162, 154, 94, 283, 268, 270, 218, 272, 384, 216,
+ 154, 300, 376, 261, 444, 209, 218, 218, 218, 218,
+ 218, 218, 219, 284, 283, 209, 209, 209, 209, 209,
+
+ 209, 220, 219, 219, 219, 219, 219, 219, 154, 286,
+ 154, 220, 220, 220, 220, 220, 220, 179, 179, 179,
+ 179, 179, 281, 281, 281, 281, 281, 222, 309, 283,
+ 308, 154, 211, 154, 396, 252, 221, 222, 222, 222,
+ 222, 222, 222, 223, 286, 364, 221, 221, 221, 221,
+ 221, 221, 227, 223, 223, 223, 223, 223, 223, 283,
+ 154, 154, 227, 227, 227, 227, 227, 227, 188, 188,
+ 188, 188, 188, 319, 319, 319, 319, 319, 233, 284,
+ 92, 283, 340, 343, 337, 354, 320, 228, 233, 233,
+ 233, 233, 233, 233, 94, 283, 286, 228, 228, 228,
+
+ 228, 228, 228, 200, 200, 200, 200, 200, 319, 319,
+ 319, 319, 319, 241, 154, 284, 283, 432, 353, 352,
+ 285, 320, 234, 241, 241, 241, 241, 241, 241, 242,
+ 283, 286, 234, 234, 234, 234, 234, 234, 243, 242,
+ 242, 242, 242, 242, 242, 286, 283, 351, 243, 243,
+ 243, 243, 243, 243, 248, 248, 248, 248, 248, 255,
+ 250, 154, 92, 283, 283, 251, 284, 252, 385, 255,
+ 255, 255, 255, 255, 255, 256, 94, 282, 350, 286,
+ 253, 257, 283, 284, 92, 256, 256, 256, 256, 256,
+ 256, 257, 257, 257, 257, 257, 257, 258, 94, 154,
+
+ 366, 377, 284, 259, 154, 154, 391, 258, 258, 258,
+ 258, 258, 258, 259, 259, 259, 259, 259, 259, 260,
+ 113, 113, 113, 113, 113, 262, 154, 394, 421, 260,
+ 260, 260, 260, 260, 260, 262, 262, 262, 262, 262,
+ 262, 263, 154, 154, 116, 154, 116, 266, 435, 392,
+ 393, 263, 263, 263, 263, 263, 263, 266, 266, 266,
+ 266, 266, 266, 267, 128, 128, 128, 128, 128, 273,
+ 154, 154, 154, 267, 267, 267, 267, 267, 267, 273,
+ 273, 273, 273, 273, 273, 274, 154, 448, 154, 442,
+ 131, 275, 429, 395, 404, 274, 274, 274, 274, 274,
+
+ 274, 275, 275, 275, 275, 275, 275, 248, 248, 248,
+ 248, 248, 154, 250, 332, 400, 154, 154, 251, 419,
+ 252, 281, 281, 281, 281, 281, 294, 478, 92, 94,
+ 405, 406, 478, 253, 252, 154, 294, 294, 294, 294,
+ 294, 294, 94, 154, 154, 154, 416, 253, 281, 281,
+ 281, 281, 287, 417, 289, 418, 468, 407, 295, 289,
+ 289, 290, 390, 408, 318, 154, 154, 291, 295, 295,
+ 295, 295, 295, 295, 292, 296, 422, 291, 291, 291,
+ 291, 291, 291, 297, 154, 296, 296, 296, 296, 296,
+ 296, 298, 317, 297, 297, 297, 297, 297, 297, 299,
+
+ 430, 298, 298, 298, 298, 298, 298, 301, 316, 299,
+ 299, 299, 299, 299, 299, 302, 315, 301, 301, 301,
+ 301, 301, 301, 304, 154, 302, 302, 302, 302, 302,
+ 302, 305, 131, 304, 304, 304, 304, 304, 304, 310,
+ 293, 305, 305, 305, 305, 305, 305, 311, 280, 310,
+ 310, 310, 310, 310, 310, 312, 154, 311, 311, 311,
+ 311, 311, 311, 420, 154, 312, 312, 312, 312, 312,
+ 312, 282, 282, 282, 321, 154, 154, 323, 415, 154,
+ 401, 154, 279, 402, 441, 281, 281, 281, 281, 281,
+ 324, 478, 278, 450, 154, 131, 478, 325, 252, 431,
+
+ 324, 324, 324, 324, 324, 324, 285, 285, 285, 326,
+ 131, 253, 478, 478, 478, 478, 478, 328, 281, 281,
+ 281, 281, 281, 154, 478, 329, 154, 154, 478, 478,
+ 434, 252, 330, 440, 154, 329, 329, 329, 329, 329,
+ 329, 154, 226, 154, 253, 281, 281, 281, 281, 281,
+ 449, 478, 254, 154, 456, 451, 478, 472, 252, 281,
+ 281, 281, 281, 281, 333, 478, 154, 476, 154, 154,
+ 478, 253, 252, 454, 333, 333, 333, 333, 333, 333,
+ 425, 425, 425, 425, 425, 253, 287, 287, 287, 287,
+ 287, 443, 478, 426, 154, 467, 334, 478, 247, 252,
+
+ 151, 151, 151, 151, 151, 331, 334, 334, 334, 334,
+ 334, 334, 253, 246, 462, 331, 331, 331, 331, 331,
+ 331, 281, 281, 281, 281, 287, 154, 289, 154, 154,
+ 154, 335, 289, 289, 290, 455, 457, 154, 131, 131,
+ 291, 335, 335, 335, 335, 335, 335, 292, 336, 131,
+ 291, 291, 291, 291, 291, 291, 338, 466, 336, 336,
+ 336, 336, 336, 336, 339, 154, 338, 338, 338, 338,
+ 338, 338, 341, 131, 339, 339, 339, 339, 339, 339,
+ 342, 154, 341, 341, 341, 341, 341, 341, 470, 226,
+ 342, 342, 342, 342, 342, 342, 89, 89, 89, 89,
+
+ 89, 346, 463, 154, 154, 116, 217, 214, 92, 460,
+ 471, 346, 346, 346, 346, 346, 346, 347, 154, 154,
+ 164, 154, 94, 154, 477, 473, 475, 347, 347, 347,
+ 347, 347, 347, 355, 319, 319, 319, 355, 154, 283,
+ 461, 359, 319, 319, 319, 359, 356, 197, 154, 131,
+ 131, 131, 283, 131, 360, 474, 131, 131, 363, 284,
+ 322, 357, 357, 357, 322, 131, 283, 286, 363, 363,
+ 363, 363, 363, 363, 355, 319, 319, 319, 355, 358,
+ 283, 179, 179, 179, 179, 179, 284, 356, 131, 358,
+ 358, 358, 358, 358, 358, 282, 282, 282, 321, 131,
+
+ 284, 323, 131, 131, 131, 39, 127, 116, 116, 188,
+ 188, 188, 188, 188, 324, 39, 39, 39, 39, 39,
+ 39, 325, 116, 174, 324, 324, 324, 324, 324, 324,
+ 327, 361, 361, 361, 327, 131, 164, 154, 149, 131,
+ 365, 283, 131, 200, 200, 200, 200, 200, 57, 362,
+ 365, 365, 365, 365, 365, 365, 286, 63, 59, 362,
+ 362, 362, 362, 362, 362, 285, 285, 285, 326, 154,
+ 127, 123, 116, 106, 101, 48, 328, 100, 91, 79,
+ 58, 57, 50, 47, 329, 48, 48, 48, 48, 48,
+ 48, 330, 367, 478, 329, 329, 329, 329, 329, 329,
+
+ 369, 35, 367, 367, 367, 367, 367, 367, 35, 478,
+ 369, 369, 369, 369, 369, 369, 162, 162, 162, 162,
+ 162, 372, 478, 478, 478, 478, 478, 478, 92, 478,
+ 478, 372, 372, 372, 372, 372, 372, 373, 478, 478,
+ 478, 478, 94, 478, 478, 478, 478, 373, 373, 373,
+ 373, 373, 373, 359, 319, 319, 319, 359, 374, 478,
+ 478, 478, 478, 478, 283, 478, 360, 478, 374, 374,
+ 374, 374, 374, 374, 375, 478, 478, 154, 478, 286,
+ 478, 478, 478, 378, 375, 375, 375, 375, 375, 375,
+ 379, 478, 380, 386, 478, 478, 478, 381, 382, 387,
+
+ 478, 383, 478, 386, 386, 386, 386, 386, 386, 387,
+ 387, 387, 387, 387, 387, 388, 478, 478, 478, 478,
+ 478, 389, 478, 478, 478, 388, 388, 388, 388, 388,
+ 388, 389, 389, 389, 389, 389, 389, 397, 478, 478,
+ 478, 478, 478, 398, 478, 478, 478, 397, 397, 397,
+ 397, 397, 397, 398, 398, 398, 398, 398, 398, 399,
+ 478, 478, 478, 478, 478, 409, 478, 478, 478, 399,
+ 399, 399, 399, 399, 399, 409, 409, 409, 409, 409,
+ 409, 410, 478, 478, 478, 478, 478, 249, 478, 478,
+ 478, 410, 410, 410, 410, 410, 410, 249, 249, 249,
+
+ 249, 249, 249, 411, 411, 411, 411, 411, 478, 478,
+ 282, 478, 478, 478, 478, 478, 478, 478, 478, 412,
+ 282, 282, 282, 282, 282, 282, 285, 478, 478, 413,
+ 411, 411, 411, 411, 411, 478, 285, 285, 285, 285,
+ 285, 285, 478, 478, 478, 478, 412, 424, 478, 478,
+ 425, 425, 425, 425, 425, 478, 413, 424, 424, 424,
+ 424, 424, 424, 426, 425, 425, 425, 425, 425, 478,
+ 425, 425, 425, 425, 425, 478, 428, 426, 478, 478,
+ 478, 478, 478, 426, 478, 478, 478, 439, 478, 478,
+ 428, 436, 436, 436, 436, 436, 428, 439, 439, 439,
+
+ 439, 439, 439, 478, 426, 425, 425, 425, 425, 425,
+ 437, 478, 478, 478, 478, 478, 478, 428, 426, 478,
+ 437, 437, 437, 437, 437, 437, 445, 478, 478, 478,
+ 478, 428, 478, 478, 478, 478, 445, 445, 445, 445,
+ 445, 445, 425, 425, 425, 425, 425, 452, 478, 478,
+ 425, 425, 425, 425, 425, 426, 478, 452, 452, 452,
+ 452, 452, 452, 426, 478, 478, 478, 453, 428, 446,
+ 446, 446, 446, 446, 478, 478, 428, 453, 453, 453,
+ 453, 453, 453, 478, 478, 478, 478, 478, 447, 478,
+ 478, 478, 478, 478, 458, 478, 478, 478, 447, 447,
+
+ 447, 447, 447, 447, 458, 458, 458, 458, 458, 458,
+ 459, 478, 478, 478, 478, 478, 464, 478, 478, 478,
+ 459, 459, 459, 459, 459, 459, 464, 464, 464, 464,
+ 464, 464, 465, 478, 478, 478, 478, 478, 427, 478,
+ 478, 478, 465, 465, 465, 465, 465, 465, 427, 427,
+ 427, 427, 427, 427, 469, 478, 478, 478, 478, 478,
+ 427, 478, 478, 478, 469, 469, 469, 469, 469, 469,
+ 427, 427, 427, 427, 427, 427, 39, 478, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 45, 45, 478,
+ 45, 45, 48, 478, 48, 48, 48, 48, 48, 48,
+
+ 48, 48, 48, 54, 54, 478, 54, 54, 82, 478,
+ 478, 82, 82, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 93, 478, 93, 93, 478, 93, 93, 108,
108, 108, 108, 108, 108, 108, 108, 108, 108, 108,
- 108, 113, 113, 478, 113, 113, 116, 116, 116, 116,
- 116, 116, 116, 116, 116, 116, 119, 119, 119, 119,
- 119, 119, 119, 119, 119, 119, 119, 119, 119, 126,
- 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
- 126, 126, 126, 128, 128, 478, 128, 128, 146, 146,
- 146, 146, 146, 146, 146, 146, 146, 146, 151, 151,
- 478, 151, 151, 159, 159, 159, 159, 159, 159, 159,
-
- 159, 159, 159, 161, 161, 161, 161, 161, 161, 161,
- 161, 161, 161, 166, 166, 166, 179, 179, 179, 179,
- 179, 179, 179, 179, 179, 179, 48, 48, 478, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 119,
- 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,
- 119, 119, 126, 126, 126, 126, 126, 126, 126, 126,
- 126, 126, 126, 126, 126, 126, 185, 185, 185, 185,
- 185, 185, 185, 185, 185, 185, 185, 185, 185, 185,
- 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
- 199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
-
- 211, 211, 211, 211, 39, 478, 478, 39, 39, 39,
- 39, 39, 39, 39, 39, 39, 39, 225, 225, 225,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 115,
+ 115, 478, 115, 115, 119, 119, 119, 119, 119, 119,
+ 119, 119, 119, 119, 119, 126, 126, 126, 126, 126,
+ 126, 126, 126, 126, 126, 126, 126, 65, 65, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 130, 130,
+ 478, 130, 130, 151, 151, 151, 151, 151, 151, 151,
+
+ 151, 151, 153, 153, 478, 153, 153, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 179, 179, 179, 179,
+ 179, 179, 179, 179, 179, 185, 185, 185, 185, 185,
+ 185, 185, 185, 185, 185, 185, 185, 188, 188, 188,
+ 188, 188, 188, 188, 188, 188, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 212, 212, 212, 478, 212,
225, 225, 225, 225, 225, 225, 225, 225, 225, 225,
- 225, 243, 243, 243, 243, 248, 248, 248, 248, 248,
- 248, 478, 248, 248, 248, 248, 248, 248, 39, 39,
- 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
- 39, 185, 185, 185, 185, 185, 185, 185, 185, 185,
- 185, 185, 185, 185, 185, 275, 275, 275, 275, 248,
- 248, 248, 248, 248, 248, 478, 248, 248, 248, 248,
- 248, 248, 281, 478, 478, 281, 281, 281, 281, 281,
-
- 281, 281, 281, 281, 281, 284, 478, 478, 284, 284,
- 284, 284, 284, 284, 284, 284, 284, 284, 287, 287,
- 287, 287, 287, 287, 287, 287, 287, 287, 287, 287,
- 287, 39, 39, 39, 39, 39, 39, 39, 39, 39,
- 39, 39, 39, 39, 113, 113, 478, 113, 113, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 312, 312, 312, 312, 321, 321, 321, 321,
- 321, 321, 321, 321, 321, 321, 321, 321, 321, 284,
- 478, 478, 284, 284, 284, 284, 284, 284, 284, 284,
- 284, 284, 326, 326, 326, 326, 326, 326, 326, 326,
-
- 326, 326, 326, 326, 326, 248, 248, 248, 248, 248,
- 478, 478, 248, 248, 248, 248, 248, 248, 287, 287,
- 287, 287, 287, 287, 287, 287, 287, 287, 287, 287,
- 287, 39, 39, 39, 39, 39, 39, 39, 39, 39,
- 39, 39, 39, 39, 113, 113, 478, 113, 113, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 348, 348, 348, 348, 281, 281, 478, 281,
- 281, 281, 281, 281, 281, 281, 281, 281, 281, 321,
- 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
- 321, 321, 284, 284, 478, 284, 284, 284, 284, 284,
-
- 284, 284, 284, 284, 284, 326, 326, 326, 326, 326,
- 326, 326, 326, 326, 326, 326, 326, 326, 248, 248,
- 248, 248, 248, 478, 478, 248, 248, 248, 248, 248,
- 248, 413, 413, 413, 413, 478, 478, 478, 478, 413,
- 478, 478, 413, 413, 425, 425, 425, 425, 478, 478,
- 478, 425, 425, 425, 478, 425, 425, 427, 427, 427,
- 427, 427, 427, 427, 427, 427, 427, 436, 436, 436,
- 436, 436, 436, 436, 436, 436, 436, 7, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
+ 225, 225, 244, 244, 244, 478, 244, 249, 249, 249,
+ 249, 478, 249, 249, 249, 249, 249, 249, 276, 276,
+ 276, 478, 276, 282, 478, 282, 282, 282, 282, 282,
+
+ 282, 282, 282, 282, 285, 478, 285, 285, 285, 285,
+ 285, 285, 285, 285, 285, 288, 288, 288, 288, 288,
+ 288, 288, 288, 288, 288, 288, 313, 313, 313, 478,
+ 313, 322, 322, 322, 322, 322, 322, 322, 322, 322,
+ 322, 322, 327, 327, 327, 327, 327, 327, 327, 327,
+ 327, 327, 327, 348, 348, 348, 478, 348, 414, 414,
+ 414, 478, 478, 478, 414, 478, 478, 414, 414, 423,
+ 423, 423, 423, 423, 423, 423, 423, 423, 427, 427,
+ 427, 478, 478, 427, 427, 427, 478, 427, 427, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438, 7, 478,
478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478
+ 478, 478, 478, 478, 478, 478, 478, 478, 478
} ;
-static yyconst flex_int16_t yy_chk[6664] =
+static yyconst flex_int16_t yy_chk[2460] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -1048,733 +576,270 @@ static yyconst flex_int16_t yy_chk[6664] =
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 3, 5, 4, 6, 15,
- 12, 3, 477, 4, 9, 9, 9, 9, 9, 10,
-
- 10, 10, 10, 10, 3, 3, 4, 4, 11, 11,
- 11, 11, 11, 23, 39, 5, 17, 6, 35, 17,
- 3, 24, 4, 32, 24, 24, 32, 32, 38, 48,
- 15, 69, 3, 3, 4, 4, 12, 42, 25, 17,
- 42, 25, 11, 474, 69, 3, 35, 4, 17, 24,
- 53, 32, 17, 23, 31, 78, 38, 78, 35, 69,
- 39, 24, 467, 32, 33, 461, 65, 17, 83, 25,
- 48, 11, 13, 42, 35, 13, 17, 24, 25, 32,
- 83, 31, 13, 13, 13, 13, 13, 13, 65, 54,
- 53, 33, 54, 54, 31, 65, 83, 25, 36, 36,
-
- 36, 36, 36, 70, 33, 68, 68, 456, 13, 31,
- 166, 13, 13, 13, 13, 13, 13, 20, 166, 33,
- 211, 90, 70, 440, 20, 20, 434, 20, 211, 54,
- 124, 124, 70, 68, 20, 20, 20, 20, 20, 20,
+ 3, 134, 4, 9, 9, 9, 9, 9, 12, 3,
+ 134, 4, 10, 10, 10, 10, 10, 11, 11, 11,
+ 11, 11, 3, 3, 4, 4, 13, 67, 12, 13,
+ 15, 39, 52, 25, 67, 3, 13, 4, 31, 13,
+
+ 13, 13, 13, 13, 13, 15, 17, 25, 22, 17,
+ 27, 39, 31, 27, 11, 52, 17, 26, 22, 69,
+ 26, 26, 71, 22, 27, 48, 22, 42, 31, 22,
+ 42, 26, 17, 22, 22, 156, 22, 42, 71, 69,
+ 48, 17, 20, 23, 27, 64, 54, 64, 26, 20,
+ 20, 156, 20, 23, 23, 23, 23, 23, 23, 20,
+ 54, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 90, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 64, 52,
- 106, 20, 22, 74, 55, 429, 37, 37, 37, 37,
-
- 37, 57, 64, 57, 22, 243, 487, 22, 487, 52,
- 22, 419, 55, 243, 22, 22, 64, 22, 106, 74,
- 67, 66, 74, 57, 72, 72, 385, 127, 22, 67,
- 37, 127, 66, 22, 55, 66, 22, 52, 71, 22,
- 97, 55, 22, 22, 71, 22, 26, 73, 67, 66,
- 82, 57, 71, 26, 26, 26, 26, 26, 26, 37,
- 66, 72, 108, 109, 73, 80, 71, 76, 73, 82,
- 107, 73, 71, 76, 86, 107, 73, 85, 140, 82,
- 97, 384, 26, 26, 26, 26, 26, 26, 41, 41,
- 41, 41, 73, 118, 41, 76, 73, 80, 84, 85,
-
- 86, 80, 87, 86, 348, 175, 85, 41, 108, 109,
- 96, 140, 84, 93, 41, 41, 41, 41, 41, 41,
- 93, 107, 94, 119, 102, 80, 84, 104, 87, 342,
- 250, 87, 103, 119, 118, 96, 317, 105, 161, 316,
- 41, 102, 315, 41, 41, 41, 41, 41, 41, 44,
- 96, 175, 104, 93, 314, 94, 44, 44, 44, 44,
- 44, 44, 94, 96, 102, 103, 120, 104, 105, 125,
- 102, 250, 103, 275, 119, 131, 120, 105, 161, 134,
- 104, 275, 44, 94, 125, 44, 44, 44, 44, 44,
- 44, 46, 144, 103, 150, 131, 105, 145, 46, 46,
-
- 46, 46, 46, 46, 131, 134, 145, 165, 134, 125,
- 137, 137, 148, 125, 156, 144, 150, 120, 192, 153,
- 226, 144, 148, 150, 226, 145, 154, 46, 46, 46,
- 46, 46, 46, 49, 49, 49, 49, 156, 137, 154,
- 148, 157, 155, 156, 49, 153, 158, 165, 153, 174,
- 190, 192, 49, 155, 154, 157, 168, 170, 164, 49,
- 49, 49, 49, 49, 49, 164, 158, 171, 173, 157,
- 155, 172, 182, 190, 235, 158, 184, 174, 216, 190,
- 249, 499, 182, 499, 284, 49, 194, 217, 49, 49,
- 49, 49, 49, 49, 56, 196, 168, 170, 164, 194,
-
- 184, 56, 56, 56, 56, 56, 56, 171, 173, 172,
- 235, 172, 201, 198, 194, 217, 184, 196, 216, 325,
- 293, 201, 202, 182, 196, 284, 249, 203, 184, 202,
- 56, 56, 56, 56, 56, 56, 77, 172, 198, 203,
- 201, 204, 198, 77, 77, 77, 77, 77, 77, 293,
- 202, 231, 232, 234, 390, 203, 281, 320, 390, 204,
- 325, 234, 205, 492, 492, 231, 254, 509, 232, 509,
- 204, 206, 77, 77, 77, 77, 77, 77, 88, 231,
- 232, 234, 224, 236, 205, 88, 88, 88, 88, 88,
- 88, 205, 236, 206, 254, 214, 214, 214, 214, 214,
-
- 206, 214, 281, 320, 224, 265, 214, 313, 214, 237,
- 306, 236, 332, 238, 88, 88, 88, 88, 88, 88,
- 91, 238, 224, 265, 364, 307, 271, 91, 91, 91,
- 91, 91, 91, 224, 265, 237, 306, 271, 237, 306,
- 332, 238, 247, 247, 247, 247, 247, 214, 247, 267,
- 296, 268, 364, 247, 271, 247, 91, 91, 91, 91,
- 91, 91, 98, 98, 98, 98, 98, 279, 511, 337,
- 511, 267, 268, 340, 98, 269, 303, 305, 267, 312,
- 268, 98, 269, 303, 305, 278, 308, 312, 98, 98,
- 98, 98, 98, 98, 247, 248, 248, 248, 248, 248,
-
- 337, 248, 277, 269, 303, 305, 248, 276, 248, 340,
- 463, 515, 308, 515, 98, 308, 270, 98, 98, 98,
- 98, 98, 98, 110, 110, 110, 110, 110, 337, 110,
- 280, 280, 280, 280, 280, 282, 282, 282, 282, 282,
- 321, 343, 110, 280, 246, 321, 463, 248, 282, 110,
- 110, 110, 110, 110, 110, 286, 286, 286, 286, 286,
- 318, 318, 318, 318, 318, 343, 245, 366, 286, 517,
- 343, 517, 370, 318, 394, 110, 344, 366, 110, 110,
- 110, 110, 110, 110, 111, 111, 111, 111, 244, 394,
- 111, 321, 239, 229, 370, 287, 287, 287, 287, 287,
-
- 344, 370, 394, 111, 383, 344, 366, 286, 287, 228,
- 111, 111, 111, 111, 111, 111, 288, 288, 288, 288,
- 288, 289, 289, 289, 289, 289, 356, 225, 326, 288,
- 383, 356, 213, 383, 289, 392, 111, 392, 326, 111,
- 111, 111, 111, 111, 111, 114, 393, 287, 462, 212,
- 462, 403, 114, 114, 114, 114, 114, 114, 322, 322,
- 322, 322, 322, 392, 322, 357, 199, 193, 288, 393,
- 357, 322, 403, 289, 191, 393, 462, 356, 114, 326,
- 403, 114, 114, 114, 114, 114, 114, 115, 189, 327,
- 327, 327, 327, 327, 115, 115, 115, 115, 115, 115,
-
- 327, 187, 327, 331, 331, 331, 331, 331, 185, 179,
- 322, 333, 333, 333, 333, 333, 357, 333, 167, 331,
- 371, 163, 159, 115, 115, 115, 115, 115, 115, 117,
- 117, 117, 117, 117, 346, 346, 346, 346, 346, 151,
- 149, 327, 371, 336, 336, 336, 336, 336, 117, 371,
- 346, 360, 361, 146, 336, 117, 117, 117, 117, 117,
- 117, 360, 361, 333, 365, 365, 365, 365, 365, 416,
- 345, 345, 345, 345, 345, 367, 367, 367, 367, 367,
- 143, 142, 416, 377, 117, 117, 117, 117, 117, 117,
- 121, 121, 121, 121, 121, 336, 524, 416, 524, 141,
-
- 441, 121, 360, 361, 369, 369, 369, 369, 369, 121,
- 377, 378, 379, 139, 441, 380, 121, 121, 121, 121,
- 121, 121, 345, 355, 355, 355, 355, 355, 441, 355,
- 527, 415, 527, 378, 379, 138, 355, 380, 377, 415,
- 378, 379, 121, 395, 380, 121, 121, 121, 121, 121,
- 121, 122, 122, 122, 122, 381, 369, 136, 395, 415,
- 418, 381, 122, 359, 359, 359, 359, 359, 382, 391,
- 122, 395, 391, 402, 359, 355, 359, 122, 122, 122,
- 122, 122, 122, 381, 135, 401, 418, 133, 407, 418,
- 382, 402, 132, 391, 407, 130, 405, 382, 391, 396,
-
- 401, 391, 402, 122, 128, 396, 122, 122, 122, 122,
- 122, 122, 129, 401, 396, 359, 407, 406, 405, 129,
- 129, 129, 129, 129, 129, 405, 537, 396, 537, 544,
- 545, 544, 545, 396, 399, 399, 399, 399, 399, 406,
- 126, 404, 408, 116, 113, 95, 406, 399, 129, 129,
- 129, 129, 129, 129, 147, 147, 147, 147, 147, 404,
- 408, 92, 81, 79, 410, 410, 410, 410, 410, 417,
- 404, 408, 75, 147, 63, 410, 420, 61, 417, 421,
- 147, 147, 147, 147, 147, 147, 399, 400, 400, 400,
- 400, 400, 409, 409, 409, 409, 409, 417, 409, 60,
-
- 420, 421, 59, 400, 58, 420, 147, 51, 421, 147,
- 147, 147, 147, 147, 147, 152, 410, 411, 411, 411,
- 411, 411, 152, 152, 152, 152, 152, 152, 413, 413,
- 413, 413, 413, 411, 45, 29, 28, 422, 27, 400,
- 21, 413, 430, 19, 409, 435, 412, 412, 412, 412,
- 412, 152, 152, 152, 152, 152, 152, 160, 160, 160,
- 160, 160, 412, 422, 430, 18, 422, 432, 431, 411,
- 435, 430, 433, 16, 435, 442, 160, 432, 468, 433,
- 413, 442, 448, 160, 160, 160, 160, 160, 160, 423,
- 423, 423, 423, 423, 431, 432, 443, 431, 412, 14,
-
- 433, 468, 423, 442, 448, 449, 7, 468, 443, 160,
- 444, 448, 160, 160, 160, 160, 160, 160, 162, 162,
- 162, 162, 162, 0, 443, 444, 0, 449, 425, 425,
- 425, 425, 425, 450, 449, 0, 454, 162, 444, 0,
- 451, 425, 450, 0, 162, 162, 162, 162, 162, 162,
- 427, 427, 427, 427, 427, 436, 436, 436, 436, 436,
- 0, 450, 451, 427, 454, 466, 0, 0, 436, 451,
- 0, 466, 454, 162, 162, 162, 162, 162, 162, 169,
- 425, 438, 438, 438, 438, 438, 169, 169, 169, 169,
- 169, 169, 454, 466, 438, 0, 0, 0, 457, 0,
-
- 455, 460, 427, 476, 0, 0, 457, 436, 471, 455,
- 460, 476, 472, 0, 473, 169, 169, 169, 169, 169,
- 169, 176, 176, 176, 176, 176, 457, 176, 455, 460,
- 471, 476, 0, 438, 472, 0, 0, 471, 473, 0,
- 176, 472, 0, 473, 0, 0, 0, 176, 176, 176,
- 176, 176, 176, 445, 445, 445, 445, 445, 465, 465,
- 465, 465, 465, 0, 0, 0, 445, 0, 0, 0,
- 0, 465, 0, 176, 0, 0, 176, 176, 176, 176,
- 176, 176, 178, 469, 469, 469, 469, 469, 470, 178,
- 178, 178, 178, 178, 178, 0, 469, 0, 0, 0,
-
- 0, 0, 475, 470, 0, 445, 0, 0, 0, 0,
- 465, 0, 0, 0, 0, 0, 470, 475, 178, 178,
- 178, 178, 178, 178, 180, 180, 180, 180, 180, 0,
- 475, 0, 0, 0, 0, 469, 0, 0, 0, 0,
- 0, 0, 0, 180, 0, 0, 0, 0, 0, 0,
- 180, 180, 180, 180, 180, 180, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 180,
- 180, 180, 180, 180, 180, 181, 181, 181, 181, 181,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-
- 0, 0, 0, 0, 181, 0, 0, 0, 0, 0,
- 0, 181, 181, 181, 181, 181, 181, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 181, 181, 181, 181, 181, 181, 183, 183, 183, 183,
- 183, 0, 0, 0, 0, 0, 0, 183, 0, 0,
- 0, 0, 0, 0, 0, 183, 0, 0, 0, 0,
- 0, 0, 183, 183, 183, 183, 183, 183, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 183, 0,
-
- 0, 183, 183, 183, 183, 183, 183, 188, 188, 188,
- 188, 188, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 188, 0, 0, 0,
- 0, 0, 0, 188, 188, 188, 188, 188, 188, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 188, 188, 188, 188, 188, 188, 195, 0,
- 0, 0, 0, 0, 0, 195, 195, 195, 195, 195,
- 195, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-
- 0, 0, 0, 0, 195, 195, 195, 195, 195, 195,
- 200, 200, 200, 200, 200, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 200,
- 0, 0, 0, 0, 0, 0, 200, 200, 200, 200,
- 200, 200, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 200, 200, 200, 200, 200,
- 200, 207, 0, 0, 0, 0, 0, 0, 207, 207,
- 207, 207, 207, 207, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-
- 0, 0, 0, 0, 0, 0, 0, 207, 207, 207,
- 207, 207, 207, 208, 208, 208, 208, 208, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 208, 0, 0, 0, 0, 0, 0, 208,
- 208, 208, 208, 208, 208, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 208, 208,
- 208, 208, 208, 208, 215, 0, 0, 0, 0, 0,
- 0, 215, 215, 215, 215, 215, 215, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 215, 215, 215, 215, 215, 215, 218, 218, 218, 218,
- 218, 0, 218, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 218, 0, 0, 0, 0,
- 0, 0, 218, 218, 218, 218, 218, 218, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 218, 0,
- 0, 218, 218, 218, 218, 218, 218, 220, 0, 0,
- 0, 0, 0, 0, 220, 220, 220, 220, 220, 220,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 220, 220, 220, 220, 220, 220, 221,
- 221, 221, 221, 221, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 221, 0,
- 0, 0, 0, 0, 0, 221, 221, 221, 221, 221,
- 221, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 221, 221, 221, 221, 221, 221,
- 222, 222, 222, 222, 222, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 222,
-
- 0, 0, 0, 0, 0, 0, 222, 222, 222, 222,
- 222, 222, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 222, 222, 222, 222, 222,
- 222, 223, 223, 223, 223, 223, 0, 0, 0, 0,
- 0, 0, 223, 0, 0, 0, 0, 0, 0, 0,
- 223, 0, 0, 0, 0, 0, 0, 223, 223, 223,
- 223, 223, 223, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 223, 0, 0, 223, 223, 223, 223,
-
- 223, 223, 227, 227, 227, 227, 227, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 227, 0, 0, 0, 0, 0, 0, 227, 227,
- 227, 227, 227, 227, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 227, 227, 227,
- 227, 227, 227, 230, 0, 0, 0, 0, 0, 0,
- 230, 230, 230, 230, 230, 230, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 230,
-
- 230, 230, 230, 230, 230, 233, 233, 233, 233, 233,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 233, 0, 0, 0, 0, 0,
- 0, 233, 233, 233, 233, 233, 233, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 233, 233, 233, 233, 233, 233, 240, 0, 0, 0,
- 0, 0, 0, 240, 240, 240, 240, 240, 240, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-
- 0, 0, 240, 240, 240, 240, 240, 240, 241, 241,
- 241, 241, 241, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 241, 0, 0,
- 0, 0, 0, 0, 241, 241, 241, 241, 241, 241,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 241, 241, 241, 241, 241, 241, 252,
- 252, 252, 252, 252, 0, 252, 0, 0, 0, 0,
- 252, 252, 252, 0, 0, 0, 0, 0, 252, 0,
- 0, 0, 0, 0, 0, 252, 252, 252, 252, 252,
-
- 252, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 252, 0, 0, 252, 252, 252, 252, 252, 252,
- 253, 0, 0, 0, 0, 0, 0, 253, 253, 253,
- 253, 253, 253, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 253, 253, 253, 253,
- 253, 253, 255, 255, 255, 255, 255, 0, 255, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 255, 0, 0, 0, 0, 0, 0, 255, 255,
-
- 255, 255, 255, 255, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 255, 0, 0, 255, 255, 255,
- 255, 255, 255, 257, 0, 0, 0, 0, 0, 0,
- 257, 257, 257, 257, 257, 257, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 257, 0, 0, 257,
- 257, 257, 257, 257, 257, 258, 258, 258, 258, 258,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 258, 0, 0, 0, 0, 0,
-
- 0, 258, 258, 258, 258, 258, 258, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 258, 0, 0,
- 258, 258, 258, 258, 258, 258, 259, 259, 259, 259,
- 259, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 259, 0, 0, 0, 0,
- 0, 0, 259, 259, 259, 259, 259, 259, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 259, 259, 259, 259, 259, 259, 260, 260, 260,
-
- 260, 260, 0, 0, 0, 0, 0, 0, 260, 0,
- 0, 0, 0, 0, 0, 0, 260, 0, 0, 0,
- 0, 0, 0, 260, 260, 260, 260, 260, 260, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 260,
- 0, 0, 260, 260, 260, 260, 260, 260, 261, 261,
- 261, 261, 261, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 261, 0, 0,
- 0, 0, 0, 0, 261, 261, 261, 261, 261, 261,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-
- 0, 0, 0, 261, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 261, 261, 261, 261, 261, 261, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 261, 262, 262, 262, 262, 262, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 262, 0, 0, 0, 0, 0, 0, 262, 262,
- 262, 262, 262, 262, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 262, 262, 262,
- 262, 262, 262, 263, 0, 0, 0, 0, 0, 0,
-
- 263, 263, 263, 263, 263, 263, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 263,
- 263, 263, 263, 263, 263, 264, 264, 264, 264, 264,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 264, 0, 0, 0, 0, 0,
- 0, 264, 264, 264, 264, 264, 264, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 264, 264, 264, 264, 264, 264, 266, 266, 266, 266,
-
- 266, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 266, 0, 0, 0, 0,
- 0, 0, 266, 266, 266, 266, 266, 266, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 266, 266, 266, 266, 266, 266, 272, 0, 0,
- 0, 0, 0, 0, 272, 272, 272, 272, 272, 272,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 272, 272, 272, 272, 272, 272, 273,
-
- 273, 273, 273, 273, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 273, 0,
- 0, 0, 0, 0, 0, 273, 273, 273, 273, 273,
- 273, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 273, 273, 273, 273, 273, 273,
- 283, 283, 283, 283, 0, 0, 283, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 283,
- 0, 0, 0, 0, 0, 0, 283, 283, 283, 283,
- 283, 283, 0, 0, 0, 0, 0, 0, 0, 0,
-
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 283, 0, 0, 283, 283, 283, 283, 283,
- 283, 285, 285, 285, 285, 0, 0, 0, 0, 0,
- 0, 0, 285, 0, 0, 0, 0, 0, 0, 0,
- 285, 0, 0, 0, 0, 0, 0, 285, 285, 285,
- 285, 285, 285, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 285, 0, 0, 285, 285, 285, 285,
- 285, 285, 290, 290, 290, 290, 290, 0, 0, 0,
- 0, 0, 0, 0, 0, 290, 0, 0, 0, 0,
-
- 0, 290, 0, 0, 0, 0, 0, 0, 290, 290,
- 290, 290, 290, 290, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 290, 0, 0, 290, 290, 290,
- 290, 290, 290, 291, 291, 291, 291, 291, 0, 291,
- 0, 0, 0, 0, 291, 291, 291, 0, 0, 0,
- 0, 0, 291, 0, 0, 0, 0, 0, 0, 291,
- 291, 291, 291, 291, 291, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 291, 0, 0, 291, 291,
-
- 291, 291, 291, 291, 292, 0, 0, 0, 0, 0,
- 0, 292, 292, 292, 292, 292, 292, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 292, 292, 292, 292, 292, 292, 294, 294, 294, 294,
- 294, 0, 294, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 294, 0, 0, 0, 0,
- 0, 0, 294, 294, 294, 294, 294, 294, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 294, 0,
-
- 0, 294, 294, 294, 294, 294, 294, 297, 297, 297,
- 297, 297, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 297, 0, 0, 0,
- 0, 0, 0, 297, 297, 297, 297, 297, 297, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 297,
- 0, 0, 297, 297, 297, 297, 297, 297, 298, 298,
- 298, 298, 298, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 298, 0, 0,
- 0, 0, 0, 0, 298, 298, 298, 298, 298, 298,
-
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 298, 298, 298, 298, 298, 298, 299,
- 299, 299, 299, 299, 0, 0, 0, 0, 0, 0,
- 299, 0, 0, 0, 0, 0, 0, 0, 299, 0,
- 0, 0, 0, 0, 0, 299, 299, 299, 299, 299,
- 299, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 299, 0, 0, 299, 299, 299, 299, 299, 299,
- 300, 300, 300, 300, 300, 0, 0, 0, 0, 0,
-
- 0, 0, 0, 0, 0, 0, 300, 0, 0, 300,
- 0, 0, 0, 0, 0, 0, 300, 300, 300, 300,
- 300, 300, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 300, 300, 300, 300, 300,
- 300, 301, 301, 301, 301, 301, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 301, 0, 0, 0, 0, 0, 0, 301, 301, 301,
- 301, 301, 301, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-
- 0, 0, 0, 0, 0, 0, 301, 301, 301, 301,
- 301, 301, 302, 302, 302, 302, 302, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 302, 0, 0, 0, 0, 0, 0, 302, 302,
- 302, 302, 302, 302, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 302, 302, 302,
- 302, 302, 302, 304, 304, 304, 304, 304, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 304, 0, 0, 0, 0, 0, 0, 304,
-
- 304, 304, 304, 304, 304, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 304, 304,
- 304, 304, 304, 304, 309, 0, 0, 0, 0, 0,
- 0, 309, 309, 309, 309, 309, 309, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 309, 309, 309, 309, 309, 309, 310, 310, 310, 310,
- 310, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 310, 0, 0, 0, 0,
-
- 0, 0, 310, 310, 310, 310, 310, 310, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 310, 310, 310, 310, 310, 310, 323, 323, 323,
- 323, 323, 0, 323, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 323, 0, 0, 0,
- 0, 0, 0, 323, 323, 323, 323, 323, 323, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 323,
- 0, 0, 323, 323, 323, 323, 323, 323, 324, 324,
-
- 324, 324, 0, 0, 324, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 324, 0, 0,
- 0, 0, 0, 0, 324, 324, 324, 324, 324, 324,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 324, 0, 0, 324, 324, 324, 324, 324, 324, 328,
- 328, 328, 328, 328, 0, 0, 0, 0, 0, 0,
- 328, 0, 0, 0, 0, 0, 0, 0, 328, 0,
- 0, 0, 0, 0, 0, 328, 328, 328, 328, 328,
- 328, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 328, 0, 0, 328, 328, 328, 328, 328, 328,
- 329, 329, 329, 329, 0, 0, 0, 0, 0, 0,
- 0, 329, 0, 0, 0, 0, 0, 0, 0, 329,
- 0, 0, 0, 0, 0, 0, 329, 329, 329, 329,
- 329, 329, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 329, 0, 0, 329, 329, 329, 329, 329,
- 329, 330, 330, 330, 330, 330, 0, 0, 0, 0,
- 0, 0, 0, 0, 330, 0, 0, 0, 0, 0,
-
- 330, 0, 0, 0, 0, 0, 0, 330, 330, 330,
- 330, 330, 330, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 330, 0, 0, 330, 330, 330, 330,
- 330, 330, 334, 0, 0, 0, 0, 0, 0, 334,
- 334, 334, 334, 334, 334, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 334, 334,
- 334, 334, 334, 334, 335, 0, 0, 0, 0, 0,
- 0, 335, 335, 335, 335, 335, 335, 0, 0, 0,
-
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 335, 335, 335, 335, 335, 335, 338, 0, 0, 0,
- 0, 0, 0, 338, 338, 338, 338, 338, 338, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 338, 338, 338, 338, 338, 338, 339, 339,
- 339, 339, 339, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 339, 0, 0,
- 0, 0, 0, 0, 339, 339, 339, 339, 339, 339,
-
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 339, 339, 339, 339, 339, 339, 341,
- 341, 341, 341, 341, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 341, 0,
- 0, 0, 0, 0, 0, 341, 341, 341, 341, 341,
- 341, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 341, 341, 341, 341, 341, 341,
- 358, 0, 0, 0, 0, 0, 0, 358, 358, 358,
-
- 358, 358, 358, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 358, 358, 358, 358,
- 358, 358, 362, 0, 0, 0, 0, 0, 0, 362,
- 362, 362, 362, 362, 362, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 362, 362,
- 362, 362, 362, 362, 363, 363, 363, 363, 363, 0,
- 0, 0, 0, 0, 0, 0, 0, 363, 0, 0,
- 0, 0, 0, 363, 0, 0, 0, 0, 0, 0,
-
- 363, 363, 363, 363, 363, 363, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 363, 0, 0, 363,
- 363, 363, 363, 363, 363, 368, 0, 0, 0, 0,
- 0, 0, 368, 0, 368, 0, 0, 0, 0, 368,
- 368, 0, 0, 368, 0, 0, 0, 0, 368, 0,
- 0, 0, 0, 0, 368, 0, 0, 0, 0, 0,
- 368, 0, 368, 0, 0, 0, 0, 368, 368, 0,
- 0, 368, 373, 0, 0, 0, 0, 0, 0, 373,
- 373, 373, 373, 373, 373, 0, 0, 0, 0, 0,
-
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 373, 373,
- 373, 373, 373, 373, 374, 0, 0, 0, 0, 0,
- 0, 374, 374, 374, 374, 374, 374, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 374, 374, 374, 374, 374, 374, 375, 0, 0, 0,
- 0, 0, 0, 375, 375, 375, 375, 375, 375, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-
- 0, 0, 375, 375, 375, 375, 375, 375, 387, 0,
- 0, 0, 0, 0, 0, 387, 387, 387, 387, 387,
- 387, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 387, 387, 387, 387, 387, 387,
- 388, 0, 0, 0, 0, 0, 0, 388, 388, 388,
- 388, 388, 388, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 388, 388, 388, 388,
- 388, 388, 389, 0, 0, 0, 0, 0, 0, 389,
-
- 389, 389, 389, 389, 389, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 389, 389,
- 389, 389, 389, 389, 397, 0, 0, 0, 0, 0,
- 0, 397, 397, 397, 397, 397, 397, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 397, 397, 397, 397, 397, 397, 398, 0, 0, 0,
- 0, 0, 0, 398, 398, 398, 398, 398, 398, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 398, 398, 398, 398, 398, 398, 414, 0,
- 0, 0, 0, 0, 0, 414, 414, 414, 414, 414,
- 414, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 414, 414, 414, 414, 414, 414,
- 426, 0, 0, 0, 0, 0, 0, 426, 426, 426,
- 426, 426, 426, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 426, 426, 426, 426,
-
- 426, 426, 428, 428, 428, 428, 428, 0, 0, 0,
- 0, 0, 0, 0, 0, 428, 0, 0, 0, 0,
- 0, 428, 0, 0, 0, 0, 0, 0, 428, 428,
- 428, 428, 428, 428, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 428, 0, 0, 428, 428, 428,
- 428, 428, 428, 437, 437, 437, 437, 437, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 437, 0, 0, 0, 0, 0, 0, 437,
- 437, 437, 437, 437, 437, 0, 0, 0, 0, 0,
-
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 437, 437,
- 437, 437, 437, 437, 439, 0, 0, 0, 0, 0,
- 0, 439, 439, 439, 439, 439, 439, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 439, 439, 439, 439, 439, 439, 446, 0, 0, 0,
- 0, 0, 0, 446, 446, 446, 446, 446, 446, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-
- 0, 0, 446, 446, 446, 446, 446, 446, 447, 0,
- 0, 0, 0, 0, 0, 447, 447, 447, 447, 447,
- 447, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 447, 447, 447, 447, 447, 447,
- 452, 0, 0, 0, 0, 0, 0, 452, 452, 452,
- 452, 452, 452, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 452, 452, 452, 452,
- 452, 452, 453, 0, 0, 0, 0, 0, 0, 453,
-
- 453, 453, 453, 453, 453, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 453, 453,
- 453, 453, 453, 453, 458, 0, 0, 0, 0, 0,
- 0, 458, 458, 458, 458, 458, 458, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 458, 458, 458, 458, 458, 458, 459, 0, 0, 0,
- 0, 0, 0, 459, 459, 459, 459, 459, 459, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 459, 459, 459, 459, 459, 459, 464, 0,
- 0, 0, 0, 0, 0, 464, 464, 464, 464, 464,
- 464, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 464, 464, 464, 464, 464, 464,
- 479, 0, 0, 479, 479, 479, 479, 479, 479, 479,
- 479, 479, 479, 480, 480, 0, 480, 480, 481, 0,
- 0, 481, 481, 481, 481, 481, 481, 481, 481, 481,
- 481, 482, 482, 0, 482, 482, 483, 0, 0, 483,
-
- 483, 484, 0, 484, 484, 0, 484, 484, 485, 485,
- 485, 485, 485, 485, 485, 485, 485, 485, 486, 486,
+ 20, 20, 20, 20, 20, 20, 20, 20, 33, 32,
+ 35, 20, 32, 32, 36, 36, 36, 36, 36, 57,
+
+ 43, 57, 33, 32, 35, 37, 37, 37, 37, 37,
+ 43, 43, 43, 43, 43, 43, 44, 84, 33, 55,
+ 32, 35, 55, 55, 57, 46, 44, 44, 44, 44,
+ 44, 44, 46, 55, 84, 46, 46, 46, 46, 46,
+ 46, 53, 37, 41, 41, 41, 41, 56, 66, 41,
+ 72, 53, 53, 53, 53, 53, 53, 70, 147, 86,
+ 72, 56, 41, 66, 147, 75, 86, 68, 56, 41,
+ 75, 73, 41, 41, 41, 41, 41, 41, 49, 49,
+ 49, 49, 68, 74, 74, 70, 73, 75, 63, 49,
+ 477, 75, 73, 68, 74, 78, 80, 49, 63, 63,
+
+ 63, 63, 63, 63, 49, 83, 80, 49, 49, 49,
+ 49, 49, 49, 76, 81, 83, 76, 85, 78, 87,
+ 88, 89, 87, 88, 81, 81, 81, 81, 81, 81,
+ 93, 80, 85, 102, 108, 89, 90, 90, 90, 90,
+ 90, 124, 124, 143, 93, 140, 94, 102, 90, 97,
+ 143, 474, 109, 102, 108, 90, 94, 94, 94, 94,
+ 94, 94, 90, 97, 96, 90, 90, 90, 90, 90,
+ 90, 96, 109, 140, 118, 467, 98, 119, 96, 99,
+ 103, 98, 104, 105, 118, 97, 98, 98, 98, 98,
+ 98, 98, 119, 99, 103, 107, 104, 105, 120, 118,
+
+ 107, 125, 127, 461, 150, 137, 127, 99, 137, 155,
+ 104, 150, 155, 120, 148, 125, 103, 105, 112, 125,
+ 107, 110, 110, 110, 110, 110, 132, 110, 112, 112,
+ 112, 112, 112, 112, 148, 158, 167, 192, 456, 160,
+ 110, 158, 157, 192, 167, 132, 159, 110, 160, 162,
+ 110, 110, 110, 110, 110, 110, 111, 111, 111, 111,
+ 157, 159, 111, 162, 190, 194, 116, 206, 344, 166,
+ 169, 190, 194, 344, 206, 111, 116, 116, 116, 116,
+ 116, 116, 111, 166, 169, 111, 111, 111, 111, 111,
+ 111, 114, 114, 114, 114, 114, 198, 205, 226, 207,
+
+ 198, 117, 226, 170, 171, 173, 207, 440, 205, 203,
+ 114, 117, 117, 117, 117, 117, 117, 170, 171, 173,
+ 114, 114, 114, 114, 114, 114, 121, 121, 121, 121,
+ 121, 203, 212, 175, 236, 238, 131, 121, 238, 182,
+ 212, 392, 434, 429, 236, 121, 131, 131, 131, 131,
+ 131, 131, 121, 175, 182, 121, 121, 121, 121, 121,
+ 121, 122, 122, 122, 122, 216, 265, 244, 392, 268,
+ 269, 154, 122, 196, 184, 244, 268, 265, 269, 216,
+ 122, 154, 154, 154, 154, 154, 154, 122, 184, 196,
+ 122, 122, 122, 122, 122, 122, 129, 129, 129, 129,
+
+ 129, 184, 276, 202, 340, 307, 161, 204, 307, 309,
+ 276, 419, 309, 385, 340, 129, 161, 161, 161, 161,
+ 161, 161, 129, 202, 204, 129, 129, 129, 129, 129,
+ 129, 152, 152, 152, 152, 152, 232, 165, 172, 229,
+ 313, 345, 420, 384, 165, 261, 345, 420, 313, 232,
+ 152, 165, 172, 235, 229, 237, 239, 152, 224, 261,
+ 152, 152, 152, 152, 152, 152, 163, 163, 163, 163,
+ 163, 370, 224, 250, 235, 237, 176, 239, 370, 172,
+ 435, 261, 364, 224, 435, 163, 176, 176, 176, 176,
+ 176, 176, 177, 250, 251, 163, 163, 163, 163, 163,
+
+ 163, 178, 177, 177, 177, 177, 177, 177, 270, 251,
+ 272, 178, 178, 178, 178, 178, 178, 180, 180, 180,
+ 180, 180, 281, 281, 281, 281, 281, 181, 272, 285,
+ 270, 383, 348, 343, 383, 281, 180, 181, 181, 181,
+ 181, 181, 181, 183, 285, 332, 180, 180, 180, 180,
+ 180, 180, 187, 183, 183, 183, 183, 183, 183, 282,
+ 303, 306, 187, 187, 187, 187, 187, 187, 189, 189,
+ 189, 189, 189, 283, 283, 283, 283, 283, 199, 282,
+ 300, 327, 303, 306, 300, 318, 283, 189, 199, 199,
+ 199, 199, 199, 199, 300, 322, 327, 189, 189, 189,
+
+ 189, 189, 189, 201, 201, 201, 201, 201, 319, 319,
+ 319, 319, 319, 208, 418, 322, 360, 418, 317, 316,
+ 326, 319, 201, 208, 208, 208, 208, 208, 208, 209,
+ 326, 360, 201, 201, 201, 201, 201, 201, 211, 209,
+ 209, 209, 209, 209, 209, 326, 356, 315, 211, 211,
+ 211, 211, 211, 211, 215, 215, 215, 215, 215, 218,
+ 215, 371, 337, 357, 361, 215, 356, 215, 371, 218,
+ 218, 218, 218, 218, 218, 219, 337, 321, 314, 361,
+ 215, 220, 321, 357, 366, 219, 219, 219, 219, 219,
+ 219, 220, 220, 220, 220, 220, 220, 221, 366, 378,
+
+ 337, 366, 321, 222, 381, 407, 378, 221, 221, 221,
+ 221, 221, 221, 222, 222, 222, 222, 222, 222, 223,
+ 334, 334, 334, 334, 334, 227, 308, 381, 407, 223,
+ 223, 223, 223, 223, 223, 227, 227, 227, 227, 227,
+ 227, 228, 379, 380, 298, 422, 334, 233, 422, 379,
+ 380, 228, 228, 228, 228, 228, 228, 233, 233, 233,
+ 233, 233, 233, 234, 338, 338, 338, 338, 338, 241,
+ 432, 415, 441, 234, 234, 234, 234, 234, 234, 241,
+ 241, 241, 241, 241, 241, 242, 382, 441, 393, 432,
+ 338, 243, 415, 382, 393, 242, 242, 242, 242, 242,
+
+ 242, 243, 243, 243, 243, 243, 243, 248, 248, 248,
+ 248, 248, 405, 248, 293, 390, 394, 395, 248, 405,
+ 248, 249, 249, 249, 249, 249, 255, 249, 377, 390,
+ 394, 395, 249, 248, 249, 402, 255, 255, 255, 255,
+ 255, 255, 377, 396, 404, 403, 402, 249, 253, 253,
+ 253, 253, 253, 403, 253, 404, 463, 396, 256, 253,
+ 253, 253, 377, 396, 280, 408, 463, 253, 256, 256,
+ 256, 256, 256, 256, 253, 257, 408, 253, 253, 253,
+ 253, 253, 253, 258, 416, 257, 257, 257, 257, 257,
+ 257, 259, 279, 258, 258, 258, 258, 258, 258, 260,
+
+ 416, 259, 259, 259, 259, 259, 259, 262, 278, 260,
+ 260, 260, 260, 260, 260, 263, 277, 262, 262, 262,
+ 262, 262, 262, 266, 271, 263, 263, 263, 263, 263,
+ 263, 267, 264, 266, 266, 266, 266, 266, 266, 273,
+ 254, 267, 267, 267, 267, 267, 267, 274, 247, 273,
+ 273, 273, 273, 273, 273, 275, 406, 274, 274, 274,
+ 274, 274, 274, 406, 401, 275, 275, 275, 275, 275,
+ 275, 284, 284, 284, 284, 391, 443, 284, 401, 417,
+ 391, 431, 246, 391, 431, 287, 287, 287, 287, 287,
+ 284, 287, 245, 443, 240, 231, 287, 284, 287, 417,
+
+ 284, 284, 284, 284, 284, 284, 286, 286, 286, 286,
+ 230, 287, 412, 412, 412, 412, 412, 286, 288, 288,
+ 288, 288, 288, 421, 288, 286, 430, 442, 412, 288,
+ 421, 288, 286, 430, 450, 286, 286, 286, 286, 286,
+ 286, 444, 225, 470, 288, 289, 289, 289, 289, 289,
+ 442, 289, 217, 475, 450, 444, 289, 470, 289, 290,
+ 290, 290, 290, 290, 294, 290, 448, 475, 462, 433,
+ 290, 289, 290, 448, 294, 294, 294, 294, 294, 294,
+ 425, 425, 425, 425, 425, 290, 291, 291, 291, 291,
+ 291, 433, 291, 425, 455, 462, 296, 291, 214, 291,
+
+ 341, 341, 341, 341, 341, 291, 296, 296, 296, 296,
+ 296, 296, 291, 213, 455, 291, 291, 291, 291, 291,
+ 291, 292, 292, 292, 292, 292, 341, 292, 449, 451,
+ 200, 297, 292, 292, 292, 449, 451, 460, 195, 193,
+ 292, 297, 297, 297, 297, 297, 297, 292, 299, 191,
+ 292, 292, 292, 292, 292, 292, 301, 460, 299, 299,
+ 299, 299, 299, 299, 302, 466, 301, 301, 301, 301,
+ 301, 301, 304, 188, 302, 302, 302, 302, 302, 302,
+ 305, 457, 304, 304, 304, 304, 304, 304, 466, 185,
+ 305, 305, 305, 305, 305, 305, 310, 310, 310, 310,
+
+ 310, 311, 457, 476, 468, 179, 174, 168, 310, 454,
+ 468, 311, 311, 311, 311, 311, 311, 312, 471, 454,
+ 164, 473, 310, 153, 476, 471, 473, 312, 312, 312,
+ 312, 312, 312, 323, 323, 323, 323, 323, 151, 323,
+ 454, 328, 328, 328, 328, 328, 323, 149, 472, 146,
+ 145, 144, 328, 142, 328, 472, 141, 139, 331, 323,
+ 324, 324, 324, 324, 324, 138, 324, 328, 331, 331,
+ 331, 331, 331, 331, 355, 355, 355, 355, 355, 324,
+ 355, 365, 365, 365, 365, 365, 324, 355, 136, 324,
+ 324, 324, 324, 324, 324, 325, 325, 325, 325, 135,
+
+ 355, 325, 133, 130, 128, 333, 126, 365, 115, 367,
+ 367, 367, 367, 367, 325, 333, 333, 333, 333, 333,
+ 333, 325, 113, 106, 325, 325, 325, 325, 325, 325,
+ 329, 329, 329, 329, 329, 367, 95, 82, 79, 77,
+ 335, 329, 65, 369, 369, 369, 369, 369, 61, 329,
+ 335, 335, 335, 335, 335, 335, 329, 60, 59, 329,
+ 329, 329, 329, 329, 329, 330, 330, 330, 330, 369,
+ 58, 51, 45, 38, 29, 336, 330, 28, 24, 21,
+ 19, 18, 16, 14, 330, 336, 336, 336, 336, 336,
+ 336, 330, 339, 7, 330, 330, 330, 330, 330, 330,
+
+ 342, 6, 339, 339, 339, 339, 339, 339, 5, 0,
+ 342, 342, 342, 342, 342, 342, 346, 346, 346, 346,
+ 346, 347, 0, 0, 0, 0, 0, 0, 346, 0,
+ 0, 347, 347, 347, 347, 347, 347, 358, 0, 0,
+ 0, 0, 346, 0, 0, 0, 0, 358, 358, 358,
+ 358, 358, 358, 359, 359, 359, 359, 359, 362, 0,
+ 0, 0, 0, 0, 359, 0, 359, 0, 362, 362,
+ 362, 362, 362, 362, 363, 0, 0, 368, 0, 359,
+ 0, 0, 0, 368, 363, 363, 363, 363, 363, 363,
+ 368, 0, 368, 372, 0, 0, 0, 368, 368, 373,
+
+ 0, 368, 0, 372, 372, 372, 372, 372, 372, 373,
+ 373, 373, 373, 373, 373, 374, 0, 0, 0, 0,
+ 0, 375, 0, 0, 0, 374, 374, 374, 374, 374,
+ 374, 375, 375, 375, 375, 375, 375, 387, 0, 0,
+ 0, 0, 0, 388, 0, 0, 0, 387, 387, 387,
+ 387, 387, 387, 388, 388, 388, 388, 388, 388, 389,
+ 0, 0, 0, 0, 0, 397, 0, 0, 0, 389,
+ 389, 389, 389, 389, 389, 397, 397, 397, 397, 397,
+ 397, 398, 0, 0, 0, 0, 0, 399, 0, 0,
+ 0, 398, 398, 398, 398, 398, 398, 399, 399, 399,
+
+ 399, 399, 399, 400, 400, 400, 400, 400, 0, 0,
+ 409, 0, 0, 0, 0, 0, 0, 0, 0, 400,
+ 409, 409, 409, 409, 409, 409, 410, 0, 0, 400,
+ 411, 411, 411, 411, 411, 0, 410, 410, 410, 410,
+ 410, 410, 0, 0, 0, 0, 411, 413, 0, 0,
+ 414, 414, 414, 414, 414, 0, 411, 413, 413, 413,
+ 413, 413, 413, 414, 423, 423, 423, 423, 423, 0,
+ 427, 427, 427, 427, 427, 0, 414, 423, 0, 0,
+ 0, 0, 0, 427, 0, 0, 0, 428, 0, 0,
+ 423, 424, 424, 424, 424, 424, 427, 428, 428, 428,
+
+ 428, 428, 428, 0, 424, 436, 436, 436, 436, 436,
+ 424, 0, 0, 0, 0, 0, 0, 424, 436, 0,
+ 424, 424, 424, 424, 424, 424, 437, 0, 0, 0,
+ 0, 436, 0, 0, 0, 0, 437, 437, 437, 437,
+ 437, 437, 438, 438, 438, 438, 438, 445, 0, 0,
+ 446, 446, 446, 446, 446, 438, 0, 445, 445, 445,
+ 445, 445, 445, 446, 0, 0, 0, 447, 438, 439,
+ 439, 439, 439, 439, 0, 0, 446, 447, 447, 447,
+ 447, 447, 447, 0, 0, 0, 0, 0, 439, 0,
+ 0, 0, 0, 0, 452, 0, 0, 0, 439, 439,
+
+ 439, 439, 439, 439, 452, 452, 452, 452, 452, 452,
+ 453, 0, 0, 0, 0, 0, 458, 0, 0, 0,
+ 453, 453, 453, 453, 453, 453, 458, 458, 458, 458,
+ 458, 458, 459, 0, 0, 0, 0, 0, 464, 0,
+ 0, 0, 459, 459, 459, 459, 459, 459, 464, 464,
+ 464, 464, 464, 464, 465, 0, 0, 0, 0, 0,
+ 469, 0, 0, 0, 465, 465, 465, 465, 465, 465,
+ 469, 469, 469, 469, 469, 469, 479, 0, 479, 479,
+ 479, 479, 479, 479, 479, 479, 479, 480, 480, 0,
+ 480, 480, 481, 0, 481, 481, 481, 481, 481, 481,
+
+ 481, 481, 481, 482, 482, 0, 482, 482, 483, 0,
+ 0, 483, 483, 484, 484, 484, 484, 484, 484, 484,
+ 484, 484, 485, 0, 485, 485, 0, 485, 485, 486,
486, 486, 486, 486, 486, 486, 486, 486, 486, 486,
- 486, 488, 488, 0, 488, 488, 489, 489, 489, 489,
- 489, 489, 489, 489, 489, 489, 490, 490, 490, 490,
- 490, 490, 490, 490, 490, 490, 490, 490, 490, 491,
- 491, 491, 491, 491, 491, 491, 491, 491, 491, 491,
- 491, 491, 491, 493, 493, 0, 493, 493, 494, 494,
- 494, 494, 494, 494, 494, 494, 494, 494, 495, 495,
- 0, 495, 495, 496, 496, 496, 496, 496, 496, 496,
-
- 496, 496, 496, 497, 497, 497, 497, 497, 497, 497,
- 497, 497, 497, 498, 498, 498, 500, 500, 500, 500,
- 500, 500, 500, 500, 500, 500, 501, 501, 0, 501,
- 501, 501, 501, 501, 501, 501, 501, 501, 501, 502,
+ 487, 487, 487, 487, 487, 487, 487, 487, 487, 488,
+ 488, 0, 488, 488, 489, 489, 489, 489, 489, 489,
+ 489, 489, 489, 489, 489, 490, 490, 490, 490, 490,
+ 490, 490, 490, 490, 490, 490, 490, 491, 491, 492,
+ 492, 492, 492, 492, 492, 492, 492, 492, 493, 493,
+ 0, 493, 493, 494, 494, 494, 494, 494, 494, 494,
+
+ 494, 494, 495, 495, 0, 495, 495, 496, 496, 496,
+ 496, 496, 496, 496, 496, 496, 497, 497, 497, 497,
+ 497, 497, 497, 497, 497, 498, 498, 498, 498, 498,
+ 498, 498, 498, 498, 498, 498, 498, 499, 499, 499,
+ 499, 499, 499, 499, 499, 499, 500, 500, 500, 500,
+ 500, 500, 500, 500, 500, 501, 501, 501, 0, 501,
502, 502, 502, 502, 502, 502, 502, 502, 502, 502,
- 502, 502, 503, 503, 503, 503, 503, 503, 503, 503,
- 503, 503, 503, 503, 503, 503, 504, 504, 504, 504,
- 504, 504, 504, 504, 504, 504, 504, 504, 504, 504,
- 505, 505, 505, 505, 505, 505, 505, 505, 505, 505,
- 506, 506, 506, 506, 506, 506, 506, 506, 506, 506,
-
- 507, 507, 507, 507, 508, 0, 0, 508, 508, 508,
- 508, 508, 508, 508, 508, 508, 508, 510, 510, 510,
- 510, 510, 510, 510, 510, 510, 510, 510, 510, 510,
- 510, 512, 512, 512, 512, 513, 513, 513, 513, 513,
- 513, 0, 513, 513, 513, 513, 513, 513, 514, 514,
- 514, 514, 514, 514, 514, 514, 514, 514, 514, 514,
- 514, 516, 516, 516, 516, 516, 516, 516, 516, 516,
- 516, 516, 516, 516, 516, 518, 518, 518, 518, 519,
- 519, 519, 519, 519, 519, 0, 519, 519, 519, 519,
- 519, 519, 520, 0, 0, 520, 520, 520, 520, 520,
-
- 520, 520, 520, 520, 520, 521, 0, 0, 521, 521,
- 521, 521, 521, 521, 521, 521, 521, 521, 522, 522,
- 522, 522, 522, 522, 522, 522, 522, 522, 522, 522,
- 522, 523, 523, 523, 523, 523, 523, 523, 523, 523,
- 523, 523, 523, 523, 525, 525, 0, 525, 525, 526,
- 526, 526, 526, 526, 526, 526, 526, 526, 526, 526,
- 526, 526, 528, 528, 528, 528, 529, 529, 529, 529,
- 529, 529, 529, 529, 529, 529, 529, 529, 529, 530,
- 0, 0, 530, 530, 530, 530, 530, 530, 530, 530,
- 530, 530, 531, 531, 531, 531, 531, 531, 531, 531,
-
- 531, 531, 531, 531, 531, 532, 532, 532, 532, 532,
- 0, 0, 532, 532, 532, 532, 532, 532, 533, 533,
- 533, 533, 533, 533, 533, 533, 533, 533, 533, 533,
- 533, 534, 534, 534, 534, 534, 534, 534, 534, 534,
- 534, 534, 534, 534, 535, 535, 0, 535, 535, 536,
- 536, 536, 536, 536, 536, 536, 536, 536, 536, 536,
- 536, 536, 538, 538, 538, 538, 539, 539, 0, 539,
- 539, 539, 539, 539, 539, 539, 539, 539, 539, 540,
- 540, 540, 540, 540, 540, 540, 540, 540, 540, 540,
- 540, 540, 541, 541, 0, 541, 541, 541, 541, 541,
-
- 541, 541, 541, 541, 541, 542, 542, 542, 542, 542,
- 542, 542, 542, 542, 542, 542, 542, 542, 543, 543,
- 543, 543, 543, 0, 0, 543, 543, 543, 543, 543,
- 543, 546, 546, 546, 546, 0, 0, 0, 0, 546,
- 0, 0, 546, 546, 547, 547, 547, 547, 0, 0,
- 0, 547, 547, 547, 0, 547, 547, 548, 548, 548,
- 548, 548, 548, 548, 548, 548, 548, 549, 549, 549,
- 549, 549, 549, 549, 549, 549, 549, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
+ 502, 502, 503, 503, 503, 0, 503, 504, 504, 504,
+ 504, 0, 504, 504, 504, 504, 504, 504, 505, 505,
+ 505, 0, 505, 506, 0, 506, 506, 506, 506, 506,
+
+ 506, 506, 506, 506, 507, 0, 507, 507, 507, 507,
+ 507, 507, 507, 507, 507, 508, 508, 508, 508, 508,
+ 508, 508, 508, 508, 508, 508, 509, 509, 509, 0,
+ 509, 510, 510, 510, 510, 510, 510, 510, 510, 510,
+ 510, 510, 511, 511, 511, 511, 511, 511, 511, 511,
+ 511, 511, 511, 512, 512, 512, 0, 512, 513, 513,
+ 513, 0, 0, 0, 513, 0, 0, 513, 513, 514,
+ 514, 514, 514, 514, 514, 514, 514, 514, 515, 515,
+ 515, 0, 0, 515, 515, 515, 0, 515, 515, 516,
+ 516, 516, 516, 516, 516, 516, 516, 516, 478, 478,
478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478, 478, 478, 478, 478, 478, 478, 478,
- 478, 478, 478
+ 478, 478, 478, 478, 478, 478, 478, 478, 478
} ;
#line 1 "<stdin>"
@@ -1813,7 +878,7 @@ YY_DECL
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
++yy_cp;
}
- while ( yy_base[yy_current_state] != 6578 );
+ while ( yy_base[yy_current_state] != 2399 );
yy_find_action:
yy_act = yy_accept[yy_current_state];
@@ -2185,7 +1250,7 @@ YY_RULE_SETUP
#line 110 "<stdin>"
ECHO;
YY_BREAK
-#line 2738 "<stdout>"
+#line 1761 "<stdout>"
case YY_STATE_EOF(INITIAL):
case YY_END_OF_BUFFER:
case YY_STATE_EOF(mediaquery):
diff --git a/src/3rdparty/webkit/WebCore/html/HTMLCanvasElement.cpp b/src/3rdparty/webkit/WebCore/html/HTMLCanvasElement.cpp
index fb6d9fe..76c3202 100644
--- a/src/3rdparty/webkit/WebCore/html/HTMLCanvasElement.cpp
+++ b/src/3rdparty/webkit/WebCore/html/HTMLCanvasElement.cpp
@@ -257,6 +257,10 @@ void HTMLCanvasElement::createImageBuffer() const
return;
m_imageBuffer.set(ImageBuffer::create(size, false).release());
+ // The convertLogicalToDevice MaxCanvasArea check should prevent common cases
+ // where ImageBuffer::create() returns NULL, however we could still be low on memory.
+ if (!m_imageBuffer)
+ return;
m_imageBuffer->context()->scale(FloatSize(size.width() / unscaledSize.width(), size.height() / unscaledSize.height()));
m_imageBuffer->context()->setShadowsIgnoreTransforms(true);
}
diff --git a/src/3rdparty/webkit/WebCore/platform/qt/DragDataQt.cpp b/src/3rdparty/webkit/WebCore/platform/qt/DragDataQt.cpp
index 9d95373..218f7be 100644
--- a/src/3rdparty/webkit/WebCore/platform/qt/DragDataQt.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/qt/DragDataQt.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -126,6 +126,10 @@ String DragData::asURL(String* title) const
if (!m_platformDragData)
return String();
QList<QUrl> urls = m_platformDragData->urls();
+
+ if (urls.isEmpty())
+ return String();
+
return urls.first().toString();
}
diff --git a/src/3rdparty/webkit/WebCore/plugins/mac/PluginViewMac.cpp b/src/3rdparty/webkit/WebCore/plugins/mac/PluginViewMac.cpp
index e0e178b..1d7d570 100644
--- a/src/3rdparty/webkit/WebCore/plugins/mac/PluginViewMac.cpp
+++ b/src/3rdparty/webkit/WebCore/plugins/mac/PluginViewMac.cpp
@@ -299,9 +299,6 @@ void PluginView::show()
setSelfVisible(true);
- if (isParentVisible() && platformPluginWidget())
- platformPluginWidget()->setVisible(true);
-
Widget::show();
}
@@ -311,9 +308,6 @@ void PluginView::hide()
setSelfVisible(false);
- if (isParentVisible() && platformPluginWidget())
- platformPluginWidget()->setVisible(false);
-
Widget::hide();
}
@@ -345,9 +339,6 @@ void PluginView::setParentVisible(bool visible)
return;
Widget::setParentVisible(visible);
-
- if (isSelfVisible() && platformPluginWidget())
- platformPluginWidget()->setVisible(visible);
}
void PluginView::setNPWindowRect(const IntRect&)
diff --git a/src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp b/src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp
index 14288e2..de37383 100644
--- a/src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp
+++ b/src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp
@@ -1095,7 +1095,7 @@ QVariant QWebPage::inputMethodQuery(Qt::InputMethodQuery property) const
This enum describes the types of action which can be performed on the web page.
Actions only have an effect when they are applicable. The availability of
- actions can be be determined by checking \l{QAction::}{isEnabled()} on the
+ actions can be be determined by checking \l{QAction::}{enabled()} on the
action returned by \l{QWebPage::}{action()}.
One method of enabling the text editing, cursor movement, and text selection actions
diff --git a/src/gui/dialogs/qfilesystemmodel.cpp b/src/gui/dialogs/qfilesystemmodel.cpp
index c7b3137..012d3a1 100644
--- a/src/gui/dialogs/qfilesystemmodel.cpp
+++ b/src/gui/dialogs/qfilesystemmodel.cpp
@@ -1430,7 +1430,10 @@ void QFileSystemModel::setFilter(QDir::Filters filters)
}
/*!
- Returns the filter specification for the directory model.
+ Returns the filter specified for the directory model.
+
+ If a filter has not been set, the default filter is QDir::AllEntries |
+ QDir::NoDotAndDotDot | QDir::AllDirs.
\sa QDir::Filters
*/
diff --git a/src/gui/graphicsview/qgraphicsitem.cpp b/src/gui/graphicsview/qgraphicsitem.cpp
index c5f5889..0f39263 100644
--- a/src/gui/graphicsview/qgraphicsitem.cpp
+++ b/src/gui/graphicsview/qgraphicsitem.cpp
@@ -533,25 +533,22 @@ QT_BEGIN_NAMESPACE
// QRectF::intersects() returns false always if either the source or target
// rectangle's width or height are 0. This works around that problem.
-static QRectF _q_adjustedRect(const QRectF &rect)
-{
- static const qreal p = (qreal)0.00001;
- QRectF r = rect;
- if (!r.width())
- r.adjust(-p, 0, p, 0);
- if (!r.height())
- r.adjust(0, -p, 0, p);
- return r;
+static inline void _q_adjustRect(QRectF *rect)
+{
+ Q_ASSERT(rect);
+ if (!rect->width())
+ rect->adjust(-0.00001, 0, 0.00001, 0);
+ if (!rect->height())
+ rect->adjust(0, -0.00001, 0, 0.00001);
}
-static QRect _q_adjustedRect(const QRect &rect)
+static inline void _q_adjustRect(QRect *rect)
{
- QRect r = rect;
- if (!r.width())
- r.adjust(0, 0, 1, 0);
- if (!r.height())
- r.adjust(0, 0, 0, 1);
- return r;
+ Q_ASSERT(rect);
+ if (!rect->width())
+ rect->adjust(0, 0, 1, 0);
+ if (!rect->height())
+ rect->adjust(0, 0, 0, 1);
}
/*
@@ -613,6 +610,7 @@ void QGraphicsItemPrivate::updateAncestorFlag(QGraphicsItem::GraphicsItemFlag ch
case QGraphicsItem::ItemClipsChildrenToShape:
flag = AncestorClipsChildren;
enabled = flags & QGraphicsItem::ItemClipsChildrenToShape;
+ invalidateCachedClipPathRecursively(/*childrenOnly=*/true);
break;
case QGraphicsItem::ItemIgnoresTransformations:
flag = AncestorIgnoresTransformations;
@@ -779,9 +777,9 @@ void QGraphicsItemPrivate::setParentItemHelper(QGraphicsItem *newParent, bool de
if (newParent == parent)
return;
- QVariant variant;
- qVariantSetValue<QGraphicsItem *>(variant, newParent);
- newParent = qVariantValue<QGraphicsItem *>(q->itemChange(QGraphicsItem::ItemParentChange, variant));
+ const QVariant newParentVariant(q->itemChange(QGraphicsItem::ItemParentChange,
+ qVariantFromValue<QGraphicsItem *>(newParent)));
+ newParent = qVariantValue<QGraphicsItem *>(newParentVariant);
if (newParent == parent)
return;
@@ -799,11 +797,11 @@ void QGraphicsItemPrivate::setParentItemHelper(QGraphicsItem *newParent, bool de
if (!deleting)
q_ptr->prepareGeometryChange();
+ const QVariant thisPointerVariant(qVariantFromValue<QGraphicsItem *>(q));
if (parent) {
// Remove from current parent
parent->d_ptr->removeChild(q);
- qVariantSetValue<QGraphicsItem *>(variant, q);
- parent->itemChange(QGraphicsItem::ItemChildRemovedChange, variant);
+ parent->itemChange(QGraphicsItem::ItemChildRemovedChange, thisPointerVariant);
}
// Update toplevelitem list. If this item is being deleted, its parent
@@ -828,10 +826,9 @@ void QGraphicsItemPrivate::setParentItemHelper(QGraphicsItem *newParent, bool de
}
parent->d_ptr->addChild(q);
- qVariantSetValue<QGraphicsItem *>(variant, q);
- parent->itemChange(QGraphicsItem::ItemChildAddedChange, variant);
+ parent->itemChange(QGraphicsItem::ItemChildAddedChange, thisPointerVariant);
if (!implicitUpdate)
- updateHelper();
+ updateHelper(QRectF(), false, true);
// Inherit ancestor flags from the new parent.
updateAncestorFlag(QGraphicsItem::GraphicsItemFlag(-1));
@@ -862,7 +859,7 @@ void QGraphicsItemPrivate::setParentItemHelper(QGraphicsItem *newParent, bool de
setEnabledHelper(true, /* explicit = */ false);
// If the item is being deleted, the whole scene will be updated.
- updateHelper();
+ updateHelper(QRectF(), false, true);
}
}
@@ -873,10 +870,7 @@ void QGraphicsItemPrivate::setParentItemHelper(QGraphicsItem *newParent, bool de
}
// Resolve opacity.
- if (parent)
- resolveEffectiveOpacity(parent->effectiveOpacity());
- else
- resolveEffectiveOpacity(1.0);
+ updateEffectiveOpacity();
// Resolve depth.
resolveDepth(parent ? parent->d_ptr->depth : -1);
@@ -885,7 +879,7 @@ void QGraphicsItemPrivate::setParentItemHelper(QGraphicsItem *newParent, bool de
invalidateSceneTransformCache();
// Deliver post-change notification
- q->itemChange(QGraphicsItem::ItemParentHasChanged, qVariantFromValue<QGraphicsItem *>(parent));
+ q->itemChange(QGraphicsItem::ItemParentHasChanged, newParentVariant);
}
/*!
@@ -1240,7 +1234,7 @@ void QGraphicsItem::setFlags(GraphicsItemFlags flags)
int geomChangeFlagsMask = (ItemClipsChildrenToShape | ItemClipsToShape | ItemIgnoresTransformations);
bool fullUpdate = (flags & geomChangeFlagsMask) != (d_ptr->flags & geomChangeFlagsMask);
if (fullUpdate)
- d_ptr->fullUpdateHelper();
+ d_ptr->fullUpdateHelper(false, true);
// Keep the old flags to compare the diff.
GraphicsItemFlags oldFlags = this->flags();
@@ -1250,12 +1244,8 @@ void QGraphicsItem::setFlags(GraphicsItemFlags flags)
// Reresolve effective opacity if the opacity flags change.
static const quint32 opacityFlagsMask = ItemIgnoresParentOpacity | ItemDoesntPropagateOpacityToChildren;
- if ((flags & opacityFlagsMask) != (oldFlags & opacityFlagsMask)) {
- if (QGraphicsItem *p = d_ptr->parent)
- d_ptr->resolveEffectiveOpacity(p->effectiveOpacity());
- else
- d_ptr->resolveEffectiveOpacity(1.0);
- }
+ if ((flags & opacityFlagsMask) != (oldFlags & opacityFlagsMask))
+ d_ptr->updateEffectiveOpacity();
if (!(d_ptr->flags & ItemIsFocusable) && hasFocus()) {
// Clear focus on the item if it has focus when the focusable flag
@@ -1275,6 +1265,9 @@ void QGraphicsItem::setFlags(GraphicsItemFlags flags)
d_ptr->updateAncestorFlag(ItemClipsChildrenToShape);
}
+ if ((flags & ItemClipsToShape) != (oldFlags & ItemClipsToShape))
+ d_ptr->invalidateCachedClipPath();
+
if ((flags & ItemIgnoresTransformations) != (oldFlags & ItemIgnoresTransformations)) {
// Item children clipping changes. Propagate the ancestor flag to
// all children.
@@ -1282,7 +1275,7 @@ void QGraphicsItem::setFlags(GraphicsItemFlags flags)
}
// ### Why updateHelper?
- d_ptr->updateHelper();
+ d_ptr->updateHelper(QRectF(), false, true);
// Notify change.
itemChange(ItemFlagsHaveChanged, quint32(flags));
@@ -1380,9 +1373,9 @@ QString QGraphicsItem::toolTip() const
*/
void QGraphicsItem::setToolTip(const QString &toolTip)
{
- QString newCursor = itemChange(ItemToolTipChange, toolTip).toString();
- d_ptr->setExtra(QGraphicsItemPrivate::ExtraToolTip, toolTip);
- itemChange(ItemToolTipHasChanged, toolTip);
+ const QVariant toolTipVariant(itemChange(ItemToolTipChange, toolTip));
+ d_ptr->setExtra(QGraphicsItemPrivate::ExtraToolTip, toolTipVariant.toString());
+ itemChange(ItemToolTipHasChanged, toolTipVariant);
}
#endif // QT_NO_TOOLTIP
@@ -1424,9 +1417,8 @@ QCursor QGraphicsItem::cursor() const
*/
void QGraphicsItem::setCursor(const QCursor &cursor)
{
- QCursor newCursor = qVariantValue<QCursor>(itemChange(ItemCursorChange,
- qVariantFromValue<QCursor>(cursor)));
- d_ptr->setExtra(QGraphicsItemPrivate::ExtraCursor, newCursor);
+ const QVariant cursorVariant(itemChange(ItemCursorChange, qVariantFromValue<QCursor>(cursor)));
+ d_ptr->setExtra(QGraphicsItemPrivate::ExtraCursor, qVariantValue<QCursor>(cursorVariant));
d_ptr->hasCursor = 1;
if (d_ptr->scene) {
foreach (QGraphicsView *view, d_ptr->scene->views()) {
@@ -1443,7 +1435,7 @@ void QGraphicsItem::setCursor(const QCursor &cursor)
}
}
}
- itemChange(ItemCursorHasChanged, qVariantFromValue<QCursor>(newCursor));
+ itemChange(ItemCursorHasChanged, cursorVariant);
}
/*!
@@ -1537,7 +1529,9 @@ void QGraphicsItemPrivate::setVisibleHelper(bool newVisible, bool explicitly, bo
return;
// Modify the property.
- newVisible = q_ptr->itemChange(QGraphicsItem::ItemVisibleChange, quint32(newVisible)).toBool();
+ const QVariant newVisibleVariant(q_ptr->itemChange(QGraphicsItem::ItemVisibleChange,
+ quint32(newVisible)));
+ newVisible = newVisibleVariant.toBool();
if (visible == quint32(newVisible))
return;
visible = newVisible;
@@ -1584,9 +1578,10 @@ void QGraphicsItemPrivate::setVisibleHelper(bool newVisible, bool explicitly, bo
}
// Update children with explicitly = false.
+ const bool updateChildren = update && !(flags & QGraphicsItem::ItemClipsChildrenToShape);
foreach (QGraphicsItem *child, children) {
if (!newVisible || !child->d_ptr->explicitlyHidden)
- child->d_ptr->setVisibleHelper(newVisible, false);
+ child->d_ptr->setVisibleHelper(newVisible, false, updateChildren);
}
// Enable subfocus
@@ -1598,7 +1593,7 @@ void QGraphicsItemPrivate::setVisibleHelper(bool newVisible, bool explicitly, bo
}
// Deliver post-change notification.
- q_ptr->itemChange(QGraphicsItem::ItemVisibleHasChanged, quint32(visible));
+ q_ptr->itemChange(QGraphicsItem::ItemVisibleHasChanged, newVisibleVariant);
}
/*!
@@ -1704,7 +1699,9 @@ void QGraphicsItemPrivate::setEnabledHelper(bool newEnabled, bool explicitly, bo
}
// Modify the property.
- enabled = q_ptr->itemChange(QGraphicsItem::ItemEnabledChange, quint32(newEnabled)).toBool();
+ const QVariant newEnabledVariant(q_ptr->itemChange(QGraphicsItem::ItemEnabledChange,
+ quint32(newEnabled)));
+ enabled = newEnabledVariant.toBool();
// Schedule redraw.
if (update)
@@ -1716,7 +1713,7 @@ void QGraphicsItemPrivate::setEnabledHelper(bool newEnabled, bool explicitly, bo
}
// Deliver post-change notification.
- q_ptr->itemChange(QGraphicsItem::ItemEnabledHasChanged, quint32(enabled));
+ q_ptr->itemChange(QGraphicsItem::ItemEnabledHasChanged, newEnabledVariant);
}
/*!
@@ -1803,7 +1800,8 @@ void QGraphicsItem::setSelected(bool selected)
selected = false;
if (d_ptr->selected == selected)
return;
- bool newSelected = itemChange(ItemSelectedChange, quint32(selected)).toBool();
+ const QVariant newSelectedVariant(itemChange(ItemSelectedChange, quint32(selected)));
+ bool newSelected = newSelectedVariant.toBool();
if (d_ptr->selected == newSelected)
return;
d_ptr->selected = newSelected;
@@ -1823,7 +1821,7 @@ void QGraphicsItem::setSelected(bool selected)
}
// Deliver post-change notification.
- itemChange(QGraphicsItem::ItemSelectedHasChanged, quint32(d_ptr->selected));
+ itemChange(QGraphicsItem::ItemSelectedHasChanged, newSelectedVariant);
}
/*!
@@ -1867,6 +1865,9 @@ qreal QGraphicsItem::opacity() const
*/
qreal QGraphicsItem::effectiveOpacity() const
{
+ if (!d_ptr->hasEffectiveOpacity)
+ return qreal(1.0);
+
QVariant effectiveOpacity = d_ptr->extra(QGraphicsItemPrivate::ExtraEffectiveOpacity);
return effectiveOpacity.isNull() ? qreal(1.0) : qreal(effectiveOpacity.toDouble());
}
@@ -1896,7 +1897,8 @@ qreal QGraphicsItem::effectiveOpacity() const
void QGraphicsItem::setOpacity(qreal opacity)
{
// Notify change.
- qreal newOpacity = itemChange(ItemOpacityChange, double(opacity)).toDouble();
+ const QVariant newOpacityVariant(itemChange(ItemOpacityChange, double(opacity)));
+ qreal newOpacity = newOpacityVariant.toDouble();
// Normalize.
newOpacity = qBound<qreal>(0.0, newOpacity, 1.0);
@@ -2354,19 +2356,22 @@ QPointF QGraphicsItem::scenePos() const
the item is also updated; otherwise it is not updated before and after the
change.
*/
-void QGraphicsItemPrivate::setPosHelper(const QPointF &pos, bool update)
+void QGraphicsItemPrivate::setPosHelper(const QPointF &pos)
{
Q_Q(QGraphicsItem);
if (this->pos == pos)
return;
// Notify the item that the position is changing.
- QPointF newPos = q->itemChange(QGraphicsItem::ItemPositionChange, pos).toPointF();
+ const QVariant newPosVariant(q->itemChange(QGraphicsItem::ItemPositionChange, pos));
+ QPointF newPos = newPosVariant.toPointF();
if (newPos == this->pos)
return;
// Update and repositition.
- if (scene && update) {
+ inSetPosHelper = 1;
+ updateCachedClipPathFromSetPosHelper(newPos);
+ if (scene) {
fullUpdateHelper(true);
q->prepareGeometryChange();
}
@@ -2374,7 +2379,8 @@ void QGraphicsItemPrivate::setPosHelper(const QPointF &pos, bool update)
invalidateSceneTransformCache();
// Send post-notification.
- q->itemChange(QGraphicsItem::ItemPositionHasChanged, newPos);
+ q->itemChange(QGraphicsItem::ItemPositionHasChanged, newPosVariant);
+ inSetPosHelper = 0;
}
/*!
@@ -2389,7 +2395,7 @@ void QGraphicsItemPrivate::setPosHelper(const QPointF &pos, bool update)
*/
void QGraphicsItem::setPos(const QPointF &pos)
{
- d_ptr->setPosHelper(pos, /* update = */ true);
+ d_ptr->setPosHelper(pos);
}
/*!
@@ -2516,10 +2522,10 @@ QTransform QGraphicsItem::sceneTransform() const
QTransform m;
if (d_ptr->hasTransform) {
m = transform();
- m *= QTransform::fromTranslate(d_ptr->pos.x(), d_ptr->pos.y());
- } else {
- // ### ? QTransform::fromTranslate(d_ptr->pos.x(), d_ptr->pos.y())
- m.translate(d_ptr->pos.x(), d_ptr->pos.y());
+ if (!d_ptr->pos.isNull())
+ m *= QTransform::fromTranslate(d_ptr->pos.x(), d_ptr->pos.y());
+ } else if (!d_ptr->pos.isNull()) {
+ m = QTransform::fromTranslate(d_ptr->pos.x(), d_ptr->pos.y());
}
// Combine with parent and add to cache.
@@ -2644,6 +2650,8 @@ QTransform QGraphicsItem::itemTransform(const QGraphicsItem *other, bool *ok) co
if (ok)
*ok = true;
const QPointF &itemPos = d_ptr->pos;
+ if (itemPos.isNull())
+ return d_ptr->hasTransform ? transform() : QTransform();
if (d_ptr->hasTransform)
return transform() * QTransform::fromTranslate(itemPos.x(), itemPos.y());
return QTransform::fromTranslate(itemPos.x(), itemPos.y());
@@ -2654,7 +2662,8 @@ QTransform QGraphicsItem::itemTransform(const QGraphicsItem *other, bool *ok) co
const QPointF &otherPos = other->d_ptr->pos;
if (other->d_ptr->hasTransform) {
QTransform otherToParent = other->transform();
- otherToParent *= QTransform::fromTranslate(otherPos.x(), otherPos.y());
+ if (!otherPos.isNull())
+ otherToParent *= QTransform::fromTranslate(otherPos.x(), otherPos.y());
return otherToParent.inverted(ok);
} else {
if (ok)
@@ -2679,11 +2688,11 @@ QTransform QGraphicsItem::itemTransform(const QGraphicsItem *other, bool *ok) co
QTransform itemToParent = QTransform::fromTranslate(itemPos.x(), itemPos.y());
if (hasTr)
- itemToParent = transform() * itemToParent;
+ itemToParent = itemPos.isNull() ? transform() : transform() * itemToParent;
QTransform otherToParent = QTransform::fromTranslate(otherPos.x(), otherPos.y());
if (otherHasTr)
- otherToParent = other->transform() * otherToParent;
+ otherToParent = otherPos.isNull() ? other->transform() : other->transform() * otherToParent;
return itemToParent * otherToParent.inverted(ok);
}
@@ -2723,7 +2732,8 @@ QTransform QGraphicsItem::itemTransform(const QGraphicsItem *other, bool *ok) co
const QGraphicsItemPrivate *pd = p->d_ptr;
if (pd->hasTransform)
x *= p->transform();
- x *= QTransform::fromTranslate(pd->pos.x(), pd->pos.y());
+ if (!pd->pos.isNull())
+ x *= QTransform::fromTranslate(pd->pos.x(), pd->pos.y());
} while ((p = p->d_ptr->parent) && p != root);
if (parentOfOther)
return x.inverted(ok);
@@ -2755,21 +2765,23 @@ void QGraphicsItem::setMatrix(const QMatrix &matrix, bool combine)
return;
// Notify the item that the matrix is changing.
- QVariant variant;
- qVariantSetValue<QMatrix>(variant, newTransform.toAffine());
- newTransform = QTransform(qVariantValue<QMatrix>(itemChange(ItemMatrixChange, variant)));
+ QVariant newTransformVariant(itemChange(ItemMatrixChange,
+ qVariantFromValue<QMatrix>(newTransform.toAffine())));
+ newTransform = QTransform(qVariantValue<QMatrix>(newTransformVariant));
if (oldTransform == newTransform)
return;
// Update and set the new transformation.
- d_ptr->fullUpdateHelper(true);
+ d_ptr->fullUpdateHelper(true, true);
prepareGeometryChange();
d_ptr->hasTransform = !newTransform.isIdentity();
d_ptr->setExtra(QGraphicsItemPrivate::ExtraTransform, newTransform);
d_ptr->invalidateSceneTransformCache();
// Send post-notification.
- itemChange(ItemTransformHasChanged, newTransform);
+ // NB! We have to change the value from QMatrix to QTransform.
+ qVariantSetValue<QTransform>(newTransformVariant, newTransform);
+ itemChange(ItemTransformHasChanged, newTransformVariant);
}
/*!
@@ -2801,21 +2813,21 @@ void QGraphicsItem::setTransform(const QTransform &matrix, bool combine)
return;
// Notify the item that the transformation matrix is changing.
- QVariant variant;
- qVariantSetValue<QTransform>(variant, newTransform);
- newTransform = qVariantValue<QTransform>(itemChange(ItemTransformChange, variant));
+ const QVariant newTransformVariant(itemChange(ItemTransformChange,
+ qVariantFromValue<QTransform>(newTransform)));
+ newTransform = qVariantValue<QTransform>(newTransformVariant);
if (oldTransform == newTransform)
return;
// Update and set the new transformation.
- d_ptr->fullUpdateHelper(true);
+ d_ptr->fullUpdateHelper(true, true);
prepareGeometryChange();
d_ptr->hasTransform = !newTransform.isIdentity();
d_ptr->setExtra(QGraphicsItemPrivate::ExtraTransform, newTransform);
d_ptr->invalidateSceneTransformCache();
// Send post-notification.
- itemChange(ItemTransformHasChanged, newTransform);
+ itemChange(ItemTransformHasChanged, newTransformVariant);
}
/*!
@@ -2963,7 +2975,8 @@ qreal QGraphicsItem::zValue() const
*/
void QGraphicsItem::setZValue(qreal z)
{
- qreal newZ = qreal(itemChange(ItemZValueChange, double(z)).toDouble());
+ const QVariant newZVariant(itemChange(ItemZValueChange, double(z)));
+ qreal newZ = qreal(newZVariant.toDouble());
if (newZ == d_ptr->z)
return;
d_ptr->z = newZ;
@@ -2975,7 +2988,7 @@ void QGraphicsItem::setZValue(qreal z)
d_ptr->scene->d_func()->invalidateSortCache();
}
- itemChange(ItemZValueHasChanged, double(newZ));
+ itemChange(ItemZValueHasChanged, newZVariant);
}
/*!
@@ -3000,7 +3013,9 @@ QRectF QGraphicsItem::childrenBoundingRect() const
QRectF childRect;
foreach (QGraphicsItem *child, children()) {
QPointF childPos = child->pos();
- QTransform matrix = child->transform() * QTransform::fromTranslate(childPos.x(), childPos.y());
+ QTransform matrix = child->transform();
+ if (!childPos.isNull())
+ matrix *= QTransform::fromTranslate(childPos.x(), childPos.y());
childRect |= matrix.mapRect(child->boundingRect() | child->childrenBoundingRect());
}
return childRect;
@@ -3132,57 +3147,79 @@ bool QGraphicsItem::isClipped() const
QPainterPath QGraphicsItem::clipPath() const
{
Q_D(const QGraphicsItem);
- QPainterPath clip;
- if (!isClipped())
- return clip;
+ if (!d->dirtyClipPath)
+ return d->emptyClipPath ? QPainterPath() : d->cachedClipPath;
+ if (!isClipped()) {
+ d_ptr->setCachedClipPath(QPainterPath());
+ return d->cachedClipPath;
+ }
+
+ const QRectF thisBoundingRect(boundingRect());
+ if (thisBoundingRect.isEmpty()) {
+ if (d_ptr->flags & ItemClipsChildrenToShape)
+ d_ptr->setEmptyCachedClipPathRecursively();
+ else
+ d_ptr->setEmptyCachedClipPath();
+ return QPainterPath();
+ }
+
+ QPainterPath clip;
// Start with the item's bounding rect.
- clip.addRect(boundingRect());
+ clip.addRect(thisBoundingRect);
- bool clipAway = false;
if (d->ancestorFlags & QGraphicsItemPrivate::AncestorClipsChildren) {
- // Make list of parents up to the farthest ancestor that clips its
- // children to its shape.
- QVarLengthArray<const QGraphicsItem *, 32> clippingAncestors;
- const QGraphicsItem *parent = parentItem();
- const QGraphicsItem *clipOwner = 0;
- do {
+ const QGraphicsItem *parent = this;
+ const QGraphicsItem *lastParent = this;
+
+ // Intersect any in-between clips starting at the top and moving downwards.
+ bool foundValidClipPath = false;
+ while ((parent = parent->d_ptr->parent)) {
if (parent->d_ptr->flags & ItemClipsChildrenToShape) {
- clippingAncestors.append(parent);
- clipOwner = parent;
- }
- } while ((parent->d_ptr->ancestorFlags & QGraphicsItemPrivate::AncestorClipsChildren) && (parent = parent->parentItem()));
+ // Map clip to the current parent and intersect with its shape/clipPath
+ clip = lastParent->itemTransform(parent).map(clip);
+ if ((foundValidClipPath = !parent->d_ptr->dirtyClipPath && parent->isClipped())) {
+ if (parent->d_ptr->emptyClipPath) {
+ if (d_ptr->flags & ItemClipsChildrenToShape)
+ d_ptr->setEmptyCachedClipPathRecursively();
+ else
+ d_ptr->setEmptyCachedClipPath();
+ return QPainterPath();
+ }
+ clip = clip.intersected(parent->d_ptr->cachedClipPath);
+ if (!(parent->d_ptr->flags & ItemClipsToShape))
+ clip = clip.intersected(parent->shape());
+ } else {
+ clip = clip.intersected(parent->shape());
+ }
- // Start with the topmost clip.
- QPainterPath parentClip = clipOwner->shape();
+ if (clip.isEmpty()) {
+ if (d_ptr->flags & ItemClipsChildrenToShape)
+ d_ptr->setEmptyCachedClipPathRecursively();
+ else
+ d_ptr->setEmptyCachedClipPath();
+ return clip;
+ }
+ lastParent = parent;
+ }
- // Intersect any in-between clips starting at the bottom and moving
- // upwards.
- for (int i = clippingAncestors.size() - 2; i >= 0; --i) {
- const QGraphicsItem *item = clippingAncestors[i];
- // ### what if itemtransform fails
- if (clipOwner)
- parentClip = clipOwner->itemTransform(item).map(parentClip);
- parentClip = parentClip.intersected(item->shape());
- if (parentClip.isEmpty()) {
- clip = parentClip;
- clipAway = true;
+ if (!(parent->d_ptr->ancestorFlags & QGraphicsItemPrivate::AncestorClipsChildren)
+ || foundValidClipPath) {
break;
}
- clipOwner = item;
}
- if (!clipAway) {
+ if (lastParent != this) {
+ // Map clip back to the item's transform.
// ### what if itemtransform fails
- clip = clip.intersected(clipOwner->itemTransform(this).map(parentClip));
- if (clip.isEmpty())
- clipAway = true;
+ clip = lastParent->itemTransform(this).map(clip);
}
}
- if (!clipAway && d->flags & ItemClipsToShape)
+ if (d->flags & ItemClipsToShape)
clip = clip.intersected(shape());
+ d_ptr->setCachedClipPath(clip);
return clip;
}
@@ -3271,8 +3308,10 @@ bool QGraphicsItem::collidesWithPath(const QPainterPath &path, Qt::ItemSelection
return false;
}
- QRectF rectA = _q_adjustedRect(boundingRect());
- QRectF rectB = _q_adjustedRect(path.controlPointRect());
+ QRectF rectA(boundingRect());
+ _q_adjustRect(&rectA);
+ QRectF rectB(path.controlPointRect());
+ _q_adjustRect(&rectB);
if (!rectA.intersects(rectB)) {
// This we can determine efficiently. If the two rects neither
// intersect nor contain eachother, then the two items do not collide.
@@ -3281,12 +3320,11 @@ bool QGraphicsItem::collidesWithPath(const QPainterPath &path, Qt::ItemSelection
// For further testing, we need this item's shape or bounding rect.
QPainterPath thisShape;
- if (mode == Qt::IntersectsItemShape || mode == Qt::ContainsItemShape) {
+ if (mode == Qt::IntersectsItemShape || mode == Qt::ContainsItemShape)
thisShape = (isClipped() && !d_ptr->localCollisionHack) ? clipPath() : shape();
- } else {
- thisShape.addPolygon(_q_adjustedRect(boundingRect()));
- thisShape.closeSubpath();
- }
+ else
+ thisShape.addRect(rectA);
+
if (thisShape == QPainterPath()) {
// Empty shape? No collision.
return false;
@@ -3456,7 +3494,8 @@ QRegion QGraphicsItem::boundingRegion(const QTransform &itemToDeviceTransform) c
// into the bitmap, converts the result to a QRegion and scales the region
// back to device space with inverse granularity.
qreal granularity = boundingRegionGranularity();
- QRect deviceRect = _q_adjustedRect(itemToDeviceTransform.mapRect(boundingRect()).toRect());
+ QRect deviceRect = itemToDeviceTransform.mapRect(boundingRect()).toRect();
+ _q_adjustRect(&deviceRect);
if (granularity == 0.0)
return QRegion(deviceRect);
@@ -3586,6 +3625,24 @@ void QGraphicsItem::setBoundingRegionGranularity(qreal granularity)
/*!
\internal
+ Returns true if we can discard an update request; otherwise false.
+*/
+bool QGraphicsItemPrivate::discardUpdateRequest(bool ignoreClipping,
+ bool ignoreVisibleBit,
+ bool ignoreDirtyBit) const
+{
+ // No scene, or if the scene is updating everything, means we have nothing
+ // to do. The only exception is if the scene tracks the growing scene rect.
+ return (!visible && !ignoreVisibleBit)
+ || (dirty && !ignoreDirtyBit)
+ || !scene
+ || (scene->d_func()->updateAll && scene->d_func()->hasSceneRect)
+ || (!ignoreClipping && (childrenClippedToShape() && isClippedAway()))
+ || (childrenCombineOpacity() && isFullyTransparent());
+}
+
+/*!
+ \internal
Asks the scene to mark this item's scene rect as dirty, requesting a
redraw. This does not invalidate any cache.
@@ -3594,31 +3651,16 @@ void QGraphicsItem::setBoundingRegionGranularity(qreal granularity)
only case where the item's background should be marked as dirty even when
the item isn't visible.
*/
-void QGraphicsItemPrivate::updateHelper(const QRectF &rect, bool force, bool updateCache)
+void QGraphicsItemPrivate::updateHelper(const QRectF &rect, bool force, bool maybeDirtyClipPath)
{
// No scene, or if the scene is updating everything, means we have nothing
// to do. The only exception is if the scene tracks the growing scene rect.
- QGraphicsItemCache *cache = maybeExtraItemCache();
- if (dirty && (!updateCache || !cache || cache->allExposed))
- return;
-
- if (!scene || (scene && scene->d_func()->updateAll && scene->d_func()->hasSceneRect))
+ if (discardUpdateRequest(/*ignoreClipping=*/maybeDirtyClipPath, /*ignoreVisibleBit=*/force))
return;
- if (updateCache && QGraphicsItem::CacheMode(cacheMode) != QGraphicsItem::NoCache) {
- if (rect.isNull()) {
- cache->allExposed = true;
- cache->exposed.clear();
- } else {
- cache->exposed.append(rect);
- }
- }
-
- if (!dirty && scene && (visible || force)) {
- if (rect.isNull())
- dirty = 1;
- scene->itemUpdated(q_ptr, rect);
- }
+ if (rect.isNull())
+ dirty = 1;
+ scene->itemUpdated(q_ptr, rect);
}
/*!
@@ -3626,21 +3668,25 @@ void QGraphicsItemPrivate::updateHelper(const QRectF &rect, bool force, bool upd
Propagates updates to \a item and all its children.
*/
-void QGraphicsItemPrivate::fullUpdateHelper(bool childrenOnly)
+void QGraphicsItemPrivate::fullUpdateHelper(bool childrenOnly, bool maybeDirtyClipPath)
{
- // No scene, or if the scene is updating everything, means we have nothing
- // to do. The only exception is if the scene tracks the growing scene rect.
- if (!scene || (scene && scene->d_func()->updateAll && scene->d_func()->hasSceneRect))
- return;
- if (!childrenOnly && !dirty)
- updateHelper();
- if (children.isEmpty() || dirtyChildren)
+ if (discardUpdateRequest(/*ignoreClipping=*/maybeDirtyClipPath,
+ /*ignoreVisibleBit=*/false,
+ /*ignoreDirtyBit=*/true)) {
return;
- if (flags & QGraphicsItem::ItemClipsChildrenToShape) {
- // ### mark all children dirty?
+ }
+
+ if (!childrenOnly && !dirty) {
+ // Effectively the same as updateHelper(QRectF(), false, maybeDirtyClipPath).
+ dirty = 1;
+ scene->itemUpdated(q_ptr, QRectF());
+ }
+
+ if (dirtyChildren || childrenClippedToShape()) {
// Unnecessary to update children as well.
return;
}
+
if (ancestorFlags & AncestorClipsChildren) {
Q_Q(QGraphicsItem);
// Check if we can avoid updating all children.
@@ -3663,10 +3709,36 @@ void QGraphicsItemPrivate::fullUpdateHelper(bool childrenOnly)
}
}
foreach (QGraphicsItem *child, children)
- child->d_ptr->fullUpdateHelper();
+ child->d_ptr->fullUpdateHelper(false, maybeDirtyClipPath);
dirtyChildren = 1;
}
+static inline bool allChildrenCombineOpacity(QGraphicsItem *parent)
+{
+ Q_ASSERT(parent);
+ if (parent->flags() & QGraphicsItem::ItemDoesntPropagateOpacityToChildren)
+ return false;
+
+ const QList<QGraphicsItem *> children(parent->childItems());
+ for (int i = 0; i < children.size(); ++i) {
+ if (children.at(i)->flags() & QGraphicsItem::ItemIgnoresParentOpacity)
+ return false;
+ }
+ return true;
+}
+
+void QGraphicsItemPrivate::updateEffectiveOpacity()
+{
+ Q_Q(QGraphicsItem);
+ if (parent) {
+ resolveEffectiveOpacity(parent->effectiveOpacity());
+ parent->d_ptr->allChildrenCombineOpacity = ::allChildrenCombineOpacity(parent);
+ } else {
+ resolveEffectiveOpacity(1.0);
+ }
+ allChildrenCombineOpacity = ::allChildrenCombineOpacity(q);
+}
+
/*!
\internal
@@ -3691,7 +3763,14 @@ void QGraphicsItemPrivate::resolveEffectiveOpacity(qreal parentEffectiveOpacity)
}
// Set this item's resolved opacity.
- setExtra(ExtraEffectiveOpacity, myEffectiveOpacity);
+ if (qFuzzyCompare(myEffectiveOpacity, qreal(1.0))) {
+ // Opaque, unset effective opacity.
+ hasEffectiveOpacity = 0;
+ unsetExtra(ExtraEffectiveOpacity);
+ } else {
+ hasEffectiveOpacity = 1;
+ setExtra(ExtraEffectiveOpacity, myEffectiveOpacity);
+ }
// Resolve children always.
for (int i = 0; i < children.size(); ++i)
@@ -3782,6 +3861,109 @@ void QGraphicsItemPrivate::removeExtraItemCache()
unsetExtra(ExtraCacheData);
}
+void QGraphicsItemPrivate::setEmptyCachedClipPathRecursively(const QRectF &emptyIfOutsideThisRect)
+{
+ setEmptyCachedClipPath();
+
+ const bool checkRect = !emptyIfOutsideThisRect.isNull()
+ && !(flags & QGraphicsItem::ItemClipsChildrenToShape);
+ for (int i = 0; i < children.size(); ++i) {
+ if (!checkRect) {
+ children.at(i)->d_ptr->setEmptyCachedClipPathRecursively();
+ continue;
+ }
+
+ QGraphicsItem *child = children.at(i);
+ const QRectF rect = child->mapRectFromParent(emptyIfOutsideThisRect);
+ if (rect.intersects(child->boundingRect()))
+ child->d_ptr->invalidateCachedClipPathRecursively(false, rect);
+ else
+ child->d_ptr->setEmptyCachedClipPathRecursively(rect);
+ }
+}
+
+void QGraphicsItemPrivate::invalidateCachedClipPathRecursively(bool childrenOnly, const QRectF &emptyIfOutsideThisRect)
+{
+ if (!childrenOnly)
+ invalidateCachedClipPath();
+
+ const bool checkRect = !emptyIfOutsideThisRect.isNull();
+ for (int i = 0; i < children.size(); ++i) {
+ if (!checkRect) {
+ children.at(i)->d_ptr->invalidateCachedClipPathRecursively(false);
+ continue;
+ }
+
+ QGraphicsItem *child = children.at(i);
+ const QRectF rect = child->mapRectFromParent(emptyIfOutsideThisRect);
+ if (rect.intersects(child->boundingRect()))
+ child->d_ptr->invalidateCachedClipPathRecursively(false, rect);
+ else
+ child->d_ptr->setEmptyCachedClipPathRecursively(rect);
+ }
+}
+
+void QGraphicsItemPrivate::updateCachedClipPathFromSetPosHelper(const QPointF &newPos)
+{
+ Q_ASSERT(inSetPosHelper);
+
+ if (!(ancestorFlags & QGraphicsItemPrivate::AncestorClipsChildren))
+ return; // Not clipped by any ancestor.
+
+ // Find closest clip ancestor and transform.
+ Q_Q(QGraphicsItem);
+ QTransform thisToParentTransform = hasTransform
+ ? q->transform() * QTransform::fromTranslate(newPos.x(), newPos.y())
+ : QTransform::fromTranslate(newPos.x(), newPos.y());
+ QGraphicsItem *clipParent = parent;
+ while (clipParent && !(clipParent->d_ptr->flags & QGraphicsItem::ItemClipsChildrenToShape)) {
+ if (clipParent->d_ptr->hasTransform)
+ thisToParentTransform *= clipParent->transform();
+ if (!clipParent->d_ptr->pos.isNull()) {
+ thisToParentTransform *= QTransform::fromTranslate(clipParent->d_ptr->pos.x(),
+ clipParent->d_ptr->pos.y());
+ }
+ clipParent = clipParent->d_ptr->parent;
+ }
+
+ // thisToParentTransform is now the same as q->itemTransform(clipParent), except
+ // that the new position (which is not yet set on the item) is taken into account.
+ Q_ASSERT(clipParent);
+ Q_ASSERT(clipParent->d_ptr->flags & QGraphicsItem::ItemClipsChildrenToShape);
+
+ // From here everything is calculated in clip parent's coordinates.
+ const QRectF parentBoundingRect(clipParent->boundingRect());
+ const QRectF thisBoundingRect(thisToParentTransform.mapRect(q->boundingRect()));
+
+ if (!parentBoundingRect.intersects(thisBoundingRect)) {
+ // Item is moved outside the clip parent's bounding rect,
+ // i.e. it is fully clipped and the clip path is empty.
+ if (flags & QGraphicsItem::ItemClipsChildrenToShape)
+ setEmptyCachedClipPathRecursively();
+ else
+ setEmptyCachedClipPathRecursively(thisToParentTransform.inverted().mapRect(parentBoundingRect));
+ return;
+ }
+
+ const QPainterPath parentClip(clipParent->isClipped() ? clipParent->clipPath() : clipParent->shape());
+ if (parentClip.contains(thisBoundingRect))
+ return; // Item is inside the clip parent's shape. No update required.
+
+ const QRectF parentClipRect(parentClip.controlPointRect());
+ if (!parentClipRect.intersects(thisBoundingRect)) {
+ // Item is moved outside the clip parent's shape,
+ // i.e. it is fully clipped and the clip path is empty.
+ if (flags & QGraphicsItem::ItemClipsChildrenToShape)
+ setEmptyCachedClipPathRecursively();
+ else
+ setEmptyCachedClipPathRecursively(thisToParentTransform.inverted().mapRect(parentClipRect));
+ } else {
+ // Item is partially inside the clip parent's shape,
+ // i.e. the cached clip path must be invalidated.
+ invalidateCachedClipPathRecursively(false, thisToParentTransform.inverted().mapRect(parentClipRect));
+ }
+}
+
/*!
\internal
@@ -3812,7 +3994,25 @@ bool QGraphicsItemPrivate::isProxyWidget() const
*/
void QGraphicsItem::update(const QRectF &rect)
{
- d_ptr->updateHelper(rect, /* force = */ false, /* updateCache = */ true);
+ if ((rect.isEmpty() && !rect.isNull()) || d_ptr->discardUpdateRequest())
+ return;
+
+ if (CacheMode(d_ptr->cacheMode) != NoCache) {
+ QGraphicsItemCache *cache = d_ptr->maybeExtraItemCache();
+ if (!cache || cache->allExposed)
+ return;
+ if (rect.isNull()) {
+ cache->allExposed = true;
+ cache->exposed.clear();
+ } else {
+ cache->exposed.append(rect);
+ }
+ }
+
+ // Effectively the same as updateHelper(rect);
+ if (rect.isNull())
+ d_ptr->dirty = 1;
+ d_ptr->scene->itemUpdated(this, rect);
}
/*!
@@ -5616,12 +5816,20 @@ void QGraphicsItem::removeFromIndex()
*/
void QGraphicsItem::prepareGeometryChange()
{
- if (d_ptr->scene) {
- d_ptr->updateHelper();
+ if (!d_ptr->scene)
+ return;
- QGraphicsScenePrivate *scenePrivate = d_ptr->scene->d_func();
- scenePrivate->removeFromIndex(this);
- }
+ d_ptr->updateHelper(QRectF(), false, /*maybeDirtyClipPath=*/!d_ptr->inSetPosHelper);
+ QGraphicsScenePrivate *scenePrivate = d_ptr->scene->d_func();
+ scenePrivate->removeFromIndex(this);
+
+ if (d_ptr->inSetPosHelper)
+ return;
+
+ if (d_ptr->flags & ItemClipsChildrenToShape)
+ d_ptr->invalidateCachedClipPathRecursively();
+ else
+ d_ptr->invalidateCachedClipPath();
}
/*!
@@ -8659,13 +8867,17 @@ void QGraphicsItemGroup::addToGroup(QGraphicsItem *item)
QTransform oldSceneMatrix = item->sceneTransform();
item->setPos(mapFromItem(item, 0, 0));
item->setParentItem(this);
- item->setTransform(oldSceneMatrix
- * sceneTransform().inverted()
- * QTransform::fromTranslate(-item->x(), -item->y()));
+ QTransform newItemTransform(oldSceneMatrix);
+ newItemTransform *= sceneTransform().inverted();
+ if (!item->pos().isNull())
+ newItemTransform *= QTransform::fromTranslate(-item->x(), -item->y());
+ item->setTransform(newItemTransform);
item->d_func()->setIsMemberOfGroup(true);
prepareGeometryChange();
- d->itemsBoundingRect |= (item->transform() * QTransform::fromTranslate(item->x(), item->y()))
- .mapRect(item->boundingRect() | item->childrenBoundingRect());
+ QTransform itemTransform(item->transform());
+ if (!item->pos().isNull())
+ itemTransform *= QTransform::fromTranslate(item->x(), item->y());
+ d->itemsBoundingRect |= itemTransform.mapRect(item->boundingRect() | item->childrenBoundingRect());
update();
}
diff --git a/src/gui/graphicsview/qgraphicsitem_p.h b/src/gui/graphicsview/qgraphicsitem_p.h
index af0b077..f738cf1 100644
--- a/src/gui/graphicsview/qgraphicsitem_p.h
+++ b/src/gui/graphicsview/qgraphicsitem_p.h
@@ -134,10 +134,15 @@ public:
hasBoundingRegionGranularity(0),
flags(0),
hasOpacity(0),
+ hasEffectiveOpacity(0),
isWidget(0),
dirty(0),
dirtyChildren(0),
localCollisionHack(0),
+ dirtyClipPath(1),
+ emptyClipPath(0),
+ inSetPosHelper(0),
+ allChildrenCombineOpacity(1),
globalStackingOrder(-1),
sceneTransformIndex(-1),
q_ptr(0)
@@ -158,11 +163,15 @@ public:
virtual QVariant inputMethodQueryHelper(Qt::InputMethodQuery query) const;
static bool movableAncestorIsSelected(const QGraphicsItem *item);
- void setPosHelper(const QPointF &pos, bool update);
+ void setPosHelper(const QPointF &pos);
void setVisibleHelper(bool newVisible, bool explicitly, bool update = true);
void setEnabledHelper(bool newEnabled, bool explicitly, bool update = true);
- void updateHelper(const QRectF &rect = QRectF(), bool force = false, bool updateCache = false);
- void fullUpdateHelper(bool childrenOnly = false);
+ bool discardUpdateRequest(bool ignoreClipping = false,
+ bool ignoreVisibleBit = false,
+ bool ignoreDirtyBit = false) const;
+ void updateHelper(const QRectF &rect = QRectF(), bool force = false, bool maybeDirtyClipPath = false);
+ void fullUpdateHelper(bool childrenOnly = false, bool maybeDirtyClipPath = false);
+ void updateEffectiveOpacity();
void resolveEffectiveOpacity(qreal effectiveParentOpacity);
void resolveDepth(int parentDepth);
void invalidateSceneTransformCache();
@@ -238,6 +247,47 @@ public:
QGraphicsItemCache *extraItemCache() const;
void removeExtraItemCache();
+ inline void setCachedClipPath(const QPainterPath &path)
+ {
+ cachedClipPath = path;
+ dirtyClipPath = 0;
+ emptyClipPath = 0;
+ }
+
+ inline void setEmptyCachedClipPath()
+ {
+ emptyClipPath = 1;
+ dirtyClipPath = 0;
+ }
+
+ void setEmptyCachedClipPathRecursively(const QRectF &emptyIfOutsideThisRect = QRectF());
+
+ inline void invalidateCachedClipPath()
+ { /*static int count = 0 ;qWarning("%i", ++count);*/ dirtyClipPath = 1; emptyClipPath = 0; }
+
+ void invalidateCachedClipPathRecursively(bool childrenOnly = false, const QRectF &emptyIfOutsideThisRect = QRectF());
+ void updateCachedClipPathFromSetPosHelper(const QPointF &newPos);
+
+ inline bool isFullyTransparent() const
+ { return hasEffectiveOpacity && qFuzzyCompare(q_func()->effectiveOpacity() + 1, qreal(1.0)); }
+
+ inline bool childrenCombineOpacity() const
+ { return allChildrenCombineOpacity || children.isEmpty(); }
+
+ inline bool isClippedAway() const
+ { return !dirtyClipPath && q_func()->isClipped() && (emptyClipPath || cachedClipPath.isEmpty()); }
+
+ inline bool childrenClippedToShape() const
+ { return (flags & QGraphicsItem::ItemClipsChildrenToShape) || children.isEmpty(); }
+
+ inline bool isInvisible() const
+ {
+ return !visible
+ || (childrenClippedToShape() && isClippedAway())
+ || (childrenCombineOpacity() && isFullyTransparent());
+ }
+
+ QPainterPath cachedClipPath;
QPointF pos;
qreal z;
QGraphicsScene *scene;
@@ -268,10 +318,15 @@ public:
// New 32 bytes
quint32 hasOpacity : 1;
+ quint32 hasEffectiveOpacity : 1;
quint32 isWidget : 1;
quint32 dirty : 1;
quint32 dirtyChildren : 1;
quint32 localCollisionHack : 1;
+ quint32 dirtyClipPath : 1;
+ quint32 emptyClipPath : 1;
+ quint32 inSetPosHelper : 1;
+ quint32 allChildrenCombineOpacity : 1;
// Optional stacking order
int globalStackingOrder;
diff --git a/src/gui/graphicsview/qgraphicsproxywidget.cpp b/src/gui/graphicsview/qgraphicsproxywidget.cpp
index 1d2721b..e660879 100644
--- a/src/gui/graphicsview/qgraphicsproxywidget.cpp
+++ b/src/gui/graphicsview/qgraphicsproxywidget.cpp
@@ -177,6 +177,10 @@ QT_BEGIN_NAMESPACE
while the widget is embedded. In this state, the widget may differ slightly
in behavior from when it is not embedded.
+ \warning This class is provided for convenience when bridging
+ QWidgets and QGraphicsItems, it should not be used for
+ high-performance scenarios.
+
\sa QGraphicsScene::addWidget(), QGraphicsWidget
*/
@@ -1033,7 +1037,7 @@ void QGraphicsProxyWidget::dragMoveEvent(QGraphicsSceneDragDropEvent *event)
if (receiver != d->dragDropWidget) {
// Try to enter before we leave
QDragEnterEvent dragEnter(receiverPos, event->possibleActions(), event->mimeData(), event->buttons(), event->modifiers());
- dragEnter.setDropAction(event->proposedAction());
+ dragEnter.setDropAction(event->proposedAction());
QApplication::sendEvent(receiver, &dragEnter);
event->setAccepted(dragEnter.isAccepted());
event->setDropAction(dragEnter.dropAction());
@@ -1431,7 +1435,7 @@ int QGraphicsProxyWidget::type() const
Creates a proxy widget for the given \a child of the widget
contained in this proxy.
-
+
This function makes it possible to aquire proxies for
non top-level widgets. For instance, you can embed a dialog,
and then transform only one of its widgets.
diff --git a/src/gui/graphicsview/qgraphicsscene.cpp b/src/gui/graphicsview/qgraphicsscene.cpp
index a9578f2..7948caf 100644
--- a/src/gui/graphicsview/qgraphicsscene.cpp
+++ b/src/gui/graphicsview/qgraphicsscene.cpp
@@ -292,15 +292,21 @@ static inline bool QRectF_intersects(const QRectF &s, const QRectF &r)
// QRectF::intersects() returns false always if either the source or target
// rectangle's width or height are 0. This works around that problem.
-static QRectF _q_adjustedRect(const QRectF &rect)
+static inline void _q_adjustRect(QRectF *rect)
{
- static const qreal p = (qreal)0.00001;
- QRectF r = rect;
- if (!r.width())
- r.adjust(-p, 0, p, 0);
- if (!r.height())
- r.adjust(0, -p, 0, p);
- return r;
+ Q_ASSERT(rect);
+ if (!rect->width())
+ rect->adjust(-0.00001, 0, 0.00001, 0);
+ if (!rect->height())
+ rect->adjust(0, -0.00001, 0, 0.00001);
+}
+
+static inline QRectF adjustedItemBoundingRect(const QGraphicsItem *item)
+{
+ Q_ASSERT(item);
+ QRectF boundingRect(item->boundingRect());
+ _q_adjustRect(&boundingRect);
+ return boundingRect;
}
static void _q_hoverFromMouseEvent(QGraphicsSceneHoverEvent *hover, const QGraphicsSceneMouseEvent *mouseEvent)
@@ -656,10 +662,11 @@ void QGraphicsScenePrivate::_q_updateLater()
*/
void QGraphicsScenePrivate::_q_polishItems()
{
+ const QVariant booleanTrueVariant(true);
foreach (QGraphicsItem *item, unpolishedItems) {
if (!item->d_ptr->explicitlyHidden) {
- item->itemChange(QGraphicsItem::ItemVisibleChange, true);
- item->itemChange(QGraphicsItem::ItemVisibleHasChanged, true);
+ item->itemChange(QGraphicsItem::ItemVisibleChange, booleanTrueVariant);
+ item->itemChange(QGraphicsItem::ItemVisibleHasChanged, booleanTrueVariant);
}
if (item->isWidget()) {
QEvent event(QEvent::Polish);
@@ -1371,6 +1378,48 @@ QGraphicsWidget *QGraphicsScenePrivate::windowForItem(const QGraphicsItem *item)
return 0;
}
+
+QList<QGraphicsItem *> QGraphicsScenePrivate::items_helper(const QPointF &pos) const
+{
+ QList<QGraphicsItem *> items;
+
+ // The index returns a rough estimate of what items are inside the rect.
+ // Refine it by iterating through all returned items.
+ QRectF adjustedRect = QRectF(pos, QSize(1,1));
+ foreach (QGraphicsItem *item, estimateItemsInRect(adjustedRect)) {
+ // Find the item's scene transform in a clever way.
+ QTransform x = item->sceneTransform();
+ bool keep = false;
+
+ // ### _q_adjustedRect is only needed because QRectF::intersects,
+ // QRectF::contains and QTransform::map() and friends don't work with
+ // flat rectangles.
+ const QRectF br(adjustedItemBoundingRect(item));
+ // Rect intersects/contains item's shape
+ if (QRectF_intersects(adjustedRect, x.mapRect(br))) {
+ bool ok;
+ QTransform xinv = x.inverted(&ok);
+ if (ok) {
+ if (item->contains(xinv.map(pos))) {
+ items << item;
+ keep = true;
+ }
+ }
+ }
+
+ if (keep && (item->flags() & QGraphicsItem::ItemClipsChildrenToShape)) {
+ // Recurse into children that clip children.
+ bool ok;
+ QTransform xinv = x.inverted(&ok);
+ if (ok)
+ childItems_helper(&items, item, xinv.map(pos));
+ }
+ }
+
+ sortItems(&items, Qt::AscendingOrder, sortCacheEnabled);
+ return items;
+}
+
QList<QGraphicsItem *> QGraphicsScenePrivate::items_helper(const QRectF &rect,
Qt::ItemSelectionMode mode,
Qt::SortOrder order) const
@@ -1381,7 +1430,8 @@ QList<QGraphicsItem *> QGraphicsScenePrivate::items_helper(const QRectF &rect,
// The index returns a rough estimate of what items are inside the rect.
// Refine it by iterating through all returned items.
- QRectF adjustedRect = _q_adjustedRect(rect);
+ QRectF adjustedRect(rect);
+ _q_adjustRect(&adjustedRect);
foreach (QGraphicsItem *item, estimateItemsInRect(adjustedRect)) {
// Find the item's scene transform in a clever way.
QTransform x = item->sceneTransform();
@@ -1390,7 +1440,7 @@ QList<QGraphicsItem *> QGraphicsScenePrivate::items_helper(const QRectF &rect,
// ### _q_adjustedRect is only needed because QRectF::intersects,
// QRectF::contains and QTransform::map() and friends don't work with
// flat rectangles.
- QRectF br = _q_adjustedRect(item->boundingRect());
+ const QRectF br(adjustedItemBoundingRect(item));
if (mode >= Qt::ContainsItemBoundingRect) {
// Rect intersects/contains item's bounding rect
QRectF mbr = x.mapRect(br);
@@ -1405,7 +1455,7 @@ QList<QGraphicsItem *> QGraphicsScenePrivate::items_helper(const QRectF &rect,
bool ok;
QTransform xinv = x.inverted(&ok);
if (ok) {
- if (path == QPainterPath())
+ if (path.isEmpty())
path.addRect(rect);
if (itemCollidesWithPath(item, xinv.map(path), mode)) {
items << item;
@@ -1442,7 +1492,8 @@ QList<QGraphicsItem *> QGraphicsScenePrivate::items_helper(const QPolygonF &poly
{
QList<QGraphicsItem *> items;
- QRectF polyRect = _q_adjustedRect(polygon.boundingRect());
+ QRectF polyRect(polygon.boundingRect());
+ _q_adjustRect(&polyRect);
QPainterPath path;
// The index returns a rough estimate of what items are inside the rect.
@@ -1455,7 +1506,7 @@ QList<QGraphicsItem *> QGraphicsScenePrivate::items_helper(const QPolygonF &poly
// ### _q_adjustedRect is only needed because QRectF::intersects,
// QRectF::contains and QTransform::map() and friends don't work with
// flat rectangles.
- QRectF br = _q_adjustedRect(item->boundingRect());
+ const QRectF br(adjustedItemBoundingRect(item));
if (mode >= Qt::ContainsItemBoundingRect) {
// Polygon contains/intersects item's bounding rect
if (path == QPainterPath())
@@ -1500,21 +1551,47 @@ QList<QGraphicsItem *> QGraphicsScenePrivate::items_helper(const QPainterPath &p
Qt::SortOrder order) const
{
QList<QGraphicsItem *> items;
+ QRectF pathRect(path.controlPointRect());
+ _q_adjustRect(&pathRect);
+
// The index returns a rough estimate of what items are inside the rect.
// Refine it by iterating through all returned items.
- foreach (QGraphicsItem *item, estimateItemsInRect(_q_adjustedRect(path.controlPointRect()))) {
+ foreach (QGraphicsItem *item, estimateItemsInRect(pathRect)) {
// Find the item's scene transform in a clever way.
QTransform x = item->sceneTransform();
- bool ok;
- QTransform xinv = x.inverted(&ok);
- if (ok) {
- QPainterPath mappedPath = xinv.map(path);
- if (itemCollidesWithPath(item, mappedPath, mode)) {
+ bool keep = false;
+
+ // ### _q_adjustedRect is only needed because QRectF::intersects,
+ // QRectF::contains and QTransform::map() and friends don't work with
+ // flat rectangles.
+ const QRectF br(adjustedItemBoundingRect(item));
+ if (mode >= Qt::ContainsItemBoundingRect) {
+ // Path contains/intersects item's bounding rect
+ if ((mode == Qt::IntersectsItemBoundingRect && path.intersects(x.mapRect(br)))
+ || (mode == Qt::ContainsItemBoundingRect && path.contains(x.mapRect(br)))) {
items << item;
- if (item->flags() & QGraphicsItem::ItemClipsChildrenToShape)
- childItems_helper(&items, item, mappedPath, mode);
+ keep = true;
+ }
+ } else {
+ // Path contains/intersects item's shape
+ if (QRectF_intersects(pathRect, x.mapRect(br))) {
+ bool ok;
+ QTransform xinv = x.inverted(&ok);
+ if (ok) {
+ if (itemCollidesWithPath(item, xinv.map(path), mode)) {
+ items << item;
+ keep = true;
+ }
+ }
}
}
+
+ if (keep && (item->flags() & QGraphicsItem::ItemClipsChildrenToShape)) {
+ bool ok;
+ QTransform xinv = x.inverted(&ok);
+ if (ok)
+ childItems_helper(&items, item, xinv.map(path), mode);
+ }
}
if (order != Qt::SortOrder(-1))
@@ -1524,13 +1601,13 @@ QList<QGraphicsItem *> QGraphicsScenePrivate::items_helper(const QPainterPath &p
void QGraphicsScenePrivate::childItems_helper(QList<QGraphicsItem *> *items,
const QGraphicsItem *parent,
- const QRectF &rect,
- Qt::ItemSelectionMode mode) const
+ const QPointF &pos) const
{
- QPainterPath path;
bool parentClip = (parent->flags() & QGraphicsItem::ItemClipsChildrenToShape);
- QRectF r = !parentClip ? _q_adjustedRect(rect) : _q_adjustedRect(rect).intersected(_q_adjustedRect(parent->boundingRect()));
- if (r.isEmpty())
+ if (parentClip && parent->d_ptr->isClippedAway())
+ return;
+ // ### is this needed?
+ if (parentClip && !parent->boundingRect().contains(pos))
return;
QList<QGraphicsItem *> &children = parent->d_ptr->children;
@@ -1540,31 +1617,73 @@ void QGraphicsScenePrivate::childItems_helper(QList<QGraphicsItem *> *items,
continue;
// Skip invisible items and all their children.
- if (!item->d_ptr->visible || qFuzzyCompare(item->effectiveOpacity(), qreal(0.0)))
+ if (item->d_ptr->isInvisible())
continue;
- // ### _q_adjustedRect is only needed because QRectF::intersects,
- // QRectF::contains and QTransform::map() and friends don't work with
- // flat rectangles.
- QRectF br = _q_adjustedRect(item->boundingRect());
- QRectF mbr = item->mapRectToParent(br);
bool keep = false;
- if (mode >= Qt::ContainsItemBoundingRect) {
- // Rect intersects/contains item's bounding rect
- if ((mode == Qt::IntersectsItemBoundingRect && QRectF_intersects(rect, mbr))
- || (mode == Qt::ContainsItemBoundingRect && rect != mbr && rect.contains(br))) {
+ if (!item->d_ptr->isClippedAway()) {
+ if (item->contains(item->mapFromParent(pos))) {
items->append(item);
keep = true;
}
- } else {
- // Rect intersects/contains item's shape
- if (QRectF_intersects(rect, mbr)) {
- if (path == QPainterPath())
- path.addRect(rect);
- if (itemCollidesWithPath(item, item->mapFromParent(path), mode)) {
+ }
+
+ if ((keep || !(item->flags() & QGraphicsItem::ItemClipsChildrenToShape)) && !item->d_ptr->children.isEmpty())
+ // Recurse into children.
+ childItems_helper(items, item, item->mapFromParent(pos));
+ }
+}
+
+
+void QGraphicsScenePrivate::childItems_helper(QList<QGraphicsItem *> *items,
+ const QGraphicsItem *parent,
+ const QRectF &rect,
+ Qt::ItemSelectionMode mode) const
+{
+ bool parentClip = (parent->flags() & QGraphicsItem::ItemClipsChildrenToShape);
+ if (parentClip && parent->d_ptr->isClippedAway())
+ return;
+ QRectF adjustedRect(rect);
+ _q_adjustRect(&adjustedRect);
+ QRectF r = !parentClip ? adjustedRect : adjustedRect.intersected(adjustedItemBoundingRect(parent));
+ if (r.isEmpty())
+ return;
+
+ QPainterPath path;
+ QList<QGraphicsItem *> &children = parent->d_ptr->children;
+ for (int i = 0; i < children.size(); ++i) {
+ QGraphicsItem *item = children.at(i);
+ if (item->d_ptr->hasTransform && !item->transform().isInvertible())
+ continue;
+
+ // Skip invisible items and all their children.
+ if (item->d_ptr->isInvisible())
+ continue;
+
+ bool keep = false;
+ if (!item->d_ptr->isClippedAway()) {
+ // ### _q_adjustedRect is only needed because QRectF::intersects,
+ // QRectF::contains and QTransform::map() and friends don't work with
+ // flat rectangles.
+ const QRectF br(adjustedItemBoundingRect(item));
+ QRectF mbr = item->mapRectToParent(br);
+ if (mode >= Qt::ContainsItemBoundingRect) {
+ // Rect intersects/contains item's bounding rect
+ if ((mode == Qt::IntersectsItemBoundingRect && QRectF_intersects(rect, mbr))
+ || (mode == Qt::ContainsItemBoundingRect && rect != mbr && rect.contains(br))) {
items->append(item);
keep = true;
}
+ } else {
+ // Rect intersects/contains item's shape
+ if (QRectF_intersects(rect, mbr)) {
+ if (path == QPainterPath())
+ path.addRect(rect);
+ if (itemCollidesWithPath(item, item->mapFromParent(path), mode)) {
+ items->append(item);
+ keep = true;
+ }
+ }
}
}
@@ -1581,18 +1700,22 @@ void QGraphicsScenePrivate::childItems_helper(QList<QGraphicsItem *> *items,
}
}
+
void QGraphicsScenePrivate::childItems_helper(QList<QGraphicsItem *> *items,
const QGraphicsItem *parent,
const QPolygonF &polygon,
Qt::ItemSelectionMode mode) const
{
- QPainterPath path;
bool parentClip = (parent->flags() & QGraphicsItem::ItemClipsChildrenToShape);
- QRectF polyRect = _q_adjustedRect(polygon.boundingRect());
- QRectF r = !parentClip ? polyRect : polyRect.intersected(_q_adjustedRect(parent->boundingRect()));
+ if (parentClip && parent->d_ptr->isClippedAway())
+ return;
+ QRectF polyRect(polygon.boundingRect());
+ _q_adjustRect(&polyRect);
+ QRectF r = !parentClip ? polyRect : polyRect.intersected(adjustedItemBoundingRect(parent));
if (r.isEmpty())
return;
+ QPainterPath path;
QList<QGraphicsItem *> &children = parent->d_ptr->children;
for (int i = 0; i < children.size(); ++i) {
QGraphicsItem *item = children.at(i);
@@ -1600,32 +1723,34 @@ void QGraphicsScenePrivate::childItems_helper(QList<QGraphicsItem *> *items,
continue;
// Skip invisible items.
- if (!item->d_ptr->visible || qFuzzyCompare(item->effectiveOpacity() + 1, qreal(1.0)))
+ if (item->d_ptr->isInvisible())
continue;
- // ### _q_adjustedRect is only needed because QRectF::intersects,
- // QRectF::contains and QTransform::map() and friends don't work with
- // flat rectangles.
- QRectF br = _q_adjustedRect(item->boundingRect());
bool keep = false;
- if (mode >= Qt::ContainsItemBoundingRect) {
- // Polygon contains/intersects item's bounding rect
- if (path == QPainterPath())
- path.addPolygon(polygon);
- if ((mode == Qt::IntersectsItemBoundingRect && path.intersects(item->mapRectToParent(br)))
- || (mode == Qt::ContainsItemBoundingRect && path.contains(item->mapRectToParent(br)))) {
- items->append(item);
- keep = true;
- }
- } else {
- // Polygon contains/intersects item's shape
- if (QRectF_intersects(polyRect, item->mapRectToParent(br))) {
+ if (!item->d_ptr->isClippedAway()) {
+ // ### _q_adjustedRect is only needed because QRectF::intersects,
+ // QRectF::contains and QTransform::map() and friends don't work with
+ // flat rectangles.
+ const QRectF br(adjustedItemBoundingRect(item));
+ if (mode >= Qt::ContainsItemBoundingRect) {
+ // Polygon contains/intersects item's bounding rect
if (path == QPainterPath())
path.addPolygon(polygon);
- if (itemCollidesWithPath(item, item->mapFromParent(path), mode)) {
+ if ((mode == Qt::IntersectsItemBoundingRect && path.intersects(item->mapRectToParent(br)))
+ || (mode == Qt::ContainsItemBoundingRect && path.contains(item->mapRectToParent(br)))) {
items->append(item);
keep = true;
}
+ } else {
+ // Polygon contains/intersects item's shape
+ if (QRectF_intersects(polyRect, item->mapRectToParent(br))) {
+ if (path == QPainterPath())
+ path.addPolygon(polygon);
+ if (itemCollidesWithPath(item, item->mapFromParent(path), mode)) {
+ items->append(item);
+ keep = true;
+ }
+ }
}
}
@@ -1642,30 +1767,52 @@ void QGraphicsScenePrivate::childItems_helper(QList<QGraphicsItem *> *items,
Qt::ItemSelectionMode mode) const
{
bool parentClip = (parent->flags() & QGraphicsItem::ItemClipsChildrenToShape);
- QPainterPath intersectedPath = !parentClip ? path : path.intersected(parent->shape());
- if (intersectedPath.isEmpty())
+ if (parentClip && parent->d_ptr->isClippedAway())
+ return;
+ QRectF pathRect(path.boundingRect());
+ _q_adjustRect(&pathRect);
+ QRectF r = !parentClip ? pathRect : pathRect.intersected(adjustedItemBoundingRect(parent));
+ if (r.isEmpty())
return;
QList<QGraphicsItem *> &children = parent->d_ptr->children;
for (int i = 0; i < children.size(); ++i) {
QGraphicsItem *item = children.at(i);
+ if (item->d_ptr->hasTransform && !item->transform().isInvertible())
+ continue;
// Skip invisible items.
- if (!item->d_ptr->visible || qFuzzyCompare(item->effectiveOpacity(), qreal(0.0)))
+ if (item->d_ptr->isInvisible())
continue;
- QTransform x = item->sceneTransform();
-
- bool ok;
- QTransform xinv = x.inverted(&ok);
- if (ok) {
- QPainterPath mappedPath = xinv.map(path);
- if (itemCollidesWithPath(item, mappedPath, mode)) {
- items->append(item);
- if (!item->d_ptr->children.isEmpty())
- childItems_helper(items, item, mappedPath, mode);
+ bool keep = false;
+ if (!item->d_ptr->isClippedAway()) {
+ // ### _q_adjustedRect is only needed because QRectF::intersects,
+ // QRectF::contains and QTransform::map() and friends don't work with
+ // flat rectangles.
+ const QRectF br(adjustedItemBoundingRect(item));
+ if (mode >= Qt::ContainsItemBoundingRect) {
+ // Polygon contains/intersects item's bounding rect
+ if ((mode == Qt::IntersectsItemBoundingRect && path.intersects(item->mapRectToParent(br)))
+ || (mode == Qt::ContainsItemBoundingRect && path.contains(item->mapRectToParent(br)))) {
+ items->append(item);
+ keep = true;
+ }
+ } else {
+ // Path contains/intersects item's shape
+ if (QRectF_intersects(pathRect, item->mapRectToParent(br))) {
+ if (itemCollidesWithPath(item, item->mapFromParent(path), mode)) {
+ items->append(item);
+ keep = true;
+ }
+ }
}
}
+
+ if ((keep || !(item->flags() & QGraphicsItem::ItemClipsChildrenToShape)) && !item->d_ptr->children.isEmpty()) {
+ // Recurse into children that clip children.
+ childItems_helper(items, item, item->mapFromParent(path), mode);
+ }
}
}
@@ -2339,17 +2486,8 @@ QList<QGraphicsItem *> QGraphicsScene::items() const
*/
QList<QGraphicsItem *> QGraphicsScene::items(const QPointF &pos) const
{
- QList<QGraphicsItem *> itemsAtPoint;
-
- // Find all items within a 1x1 rect area starting at pos. This can be
- // inefficient for scenes that use small coordinates (like unity
- // coordinates), or for detailed graphs. ### The index should support
- // fetching items at a pos to avoid this limitation.
- foreach (QGraphicsItem *item, items(QRectF(pos, QSizeF(1, 1)), Qt::IntersectsItemBoundingRect)) {
- if (item->contains(item->mapFromScene(pos)))
- itemsAtPoint << item;
- }
- return itemsAtPoint;
+ Q_D(const QGraphicsScene);
+ return d->items_helper(pos);
}
@@ -2734,8 +2872,9 @@ void QGraphicsScene::addItem(QGraphicsItem *item)
// Notify the item that its scene is changing, and allow the item to
// react.
- QGraphicsScene *targetScene = qVariantValue<QGraphicsScene *>(item->itemChange(QGraphicsItem::ItemSceneChange,
- qVariantFromValue<QGraphicsScene *>(this)));
+ const QVariant newSceneVariant(item->itemChange(QGraphicsItem::ItemSceneChange,
+ qVariantFromValue<QGraphicsScene *>(this)));
+ QGraphicsScene *targetScene = qVariantValue<QGraphicsScene *>(newSceneVariant);
if (targetScene != this) {
if (targetScene && item->scene() != targetScene)
targetScene->addItem(item);
@@ -2833,7 +2972,7 @@ void QGraphicsScene::addItem(QGraphicsItem *item)
emit selectionChanged();
// Deliver post-change notification
- item->itemChange(QGraphicsItem::ItemSceneHasChanged, qVariantFromValue<QGraphicsScene *>(this));
+ item->itemChange(QGraphicsItem::ItemSceneHasChanged, newSceneVariant);
}
/*!
@@ -3097,8 +3236,9 @@ void QGraphicsScene::removeItem(QGraphicsItem *item)
// Notify the item that it's scene is changing to 0, allowing the item to
// react.
- QGraphicsScene *targetScene = qVariantValue<QGraphicsScene *>(item->itemChange(QGraphicsItem::ItemSceneChange,
- qVariantFromValue<QGraphicsScene *>(0)));
+ const QVariant newSceneVariant(item->itemChange(QGraphicsItem::ItemSceneChange,
+ qVariantFromValue<QGraphicsScene *>(0)));
+ QGraphicsScene *targetScene = qVariantValue<QGraphicsScene *>(newSceneVariant);
if (targetScene != 0 && targetScene != this) {
targetScene->addItem(item);
return;
@@ -3198,7 +3338,7 @@ void QGraphicsScene::removeItem(QGraphicsItem *item)
emit selectionChanged();
// Deliver post-change notification
- item->itemChange(QGraphicsItem::ItemSceneHasChanged, qVariantFromValue<QGraphicsScene *>(0));
+ item->itemChange(QGraphicsItem::ItemSceneHasChanged, newSceneVariant);
}
/*!
@@ -3472,7 +3612,7 @@ QVariant QGraphicsScene::inputMethodQuery(Qt::InputMethodQuery query) const
void QGraphicsScene::update(const QRectF &rect)
{
Q_D(QGraphicsScene);
- if (d->updateAll)
+ if (d->updateAll || (rect.isEmpty() && !rect.isNull()))
return;
// Check if anyone's connected; if not, we can send updates directly to
@@ -4581,7 +4721,9 @@ void QGraphicsScenePrivate::drawItemHelper(QGraphicsItem *item, QPainter *painte
// Item's (local) bounding rect
QRectF brect = item->boundingRect();
- if (_q_adjustedRect(brect).isEmpty())
+ QRectF adjustedBrect(brect);
+ _q_adjustRect(&adjustedBrect);
+ if (adjustedBrect.isEmpty())
return;
// Fetch the off-screen transparent buffer and exposed area info.
@@ -4753,11 +4895,9 @@ void QGraphicsScenePrivate::drawItemHelper(QGraphicsItem *item, QPainter *painte
if (newCacheIndent != deviceData->cacheIndent || deviceRect.size() != pix.size()) {
QPoint diff = newCacheIndent - deviceData->cacheIndent;
QPixmap newPix(deviceRect.size());
- // ### Investigate removing this fill (test with Plasma and
- // graphicssystem raster).
- newPix.fill(Qt::transparent);
if (!pix.isNull()) {
QPainter newPixPainter(&newPix);
+ newPixPainter.setCompositionMode(QPainter::CompositionMode_Source);
newPixPainter.drawPixmap(-diff, pix);
newPixPainter.end();
}
@@ -4789,8 +4929,9 @@ void QGraphicsScenePrivate::drawItemHelper(QGraphicsItem *item, QPainter *painte
if (itemCache->allExposed || !itemCache->exposed.isEmpty() || !scrollExposure.isEmpty()) {
// Construct an item-to-pixmap transform.
QPointF p = deviceRect.topLeft();
- QTransform itemToPixmap = QTransform::fromTranslate(-p.x(), -p.y());
- itemToPixmap = painter->worldTransform() * itemToPixmap;
+ QTransform itemToPixmap = painter->worldTransform();
+ if (!p.isNull())
+ itemToPixmap *= QTransform::fromTranslate(-p.x(), -p.y());
// Map the item's logical expose to pixmap coordinates.
QRegion pixmapExposed = scrollExposure;
@@ -5124,9 +5265,12 @@ void QGraphicsScene::itemUpdated(QGraphicsItem *item, const QRectF &rect)
update(item->sceneBoundingRect());
} else {
// ### Remove _q_adjustedRects().
- QRectF boundingRect = _q_adjustedRect(item->boundingRect());
- if (!rect.isNull())
- boundingRect &= _q_adjustedRect(rect);
+ QRectF boundingRect(adjustedItemBoundingRect(item));
+ if (!rect.isNull()) {
+ QRectF adjustedRect(rect);
+ _q_adjustRect(&adjustedRect);
+ boundingRect &= adjustedRect;
+ }
// Update each view directly.
for (int i = 0; i < d->views.size(); ++i)
@@ -5138,6 +5282,9 @@ void QGraphicsScene::itemUpdated(QGraphicsItem *item, const QRectF &rect)
d->resetDirtyItemsLater();
}
+ if (!item->isVisible())
+ return; // Hiding an item won't effect the largestUntransformableItem/sceneRect.
+
// Update d->largestUntransformableItem by mapping this item's bounding
// rect back to the topmost untransformable item's untransformed
// coordinate system (which sort of equals the 1:1 coordinate system of an
@@ -5153,7 +5300,9 @@ void QGraphicsScene::itemUpdated(QGraphicsItem *item, const QRectF &rect)
// defined scene rect.
if (!d->hasSceneRect) {
QRectF oldGrowingItemsBoundingRect = d->growingItemsBoundingRect;
- d->growingItemsBoundingRect |= _q_adjustedRect(item->sceneBoundingRect());
+ QRectF adjustedItemSceneBoundingRect(item->sceneBoundingRect());
+ _q_adjustRect(&adjustedItemSceneBoundingRect);
+ d->growingItemsBoundingRect |= adjustedItemSceneBoundingRect;
if (d->growingItemsBoundingRect != oldGrowingItemsBoundingRect)
emit sceneRectChanged(d->growingItemsBoundingRect);
}
diff --git a/src/gui/graphicsview/qgraphicsscene_p.h b/src/gui/graphicsview/qgraphicsscene_p.h
index 7f441da..8af8b28 100644
--- a/src/gui/graphicsview/qgraphicsscene_p.h
+++ b/src/gui/graphicsview/qgraphicsscene_p.h
@@ -200,6 +200,7 @@ public:
void mousePressEventHandler(QGraphicsSceneMouseEvent *mouseEvent);
QGraphicsWidget *windowForItem(const QGraphicsItem *item) const;
+ QList<QGraphicsItem *> items_helper(const QPointF &pos) const;
QList<QGraphicsItem *> items_helper(const QRectF &rect,
Qt::ItemSelectionMode mode,
Qt::SortOrder order) const;
@@ -211,6 +212,9 @@ public:
Qt::SortOrder order) const;
void childItems_helper(QList<QGraphicsItem *> *items,
const QGraphicsItem *parent,
+ const QPointF &pos) const;
+ void childItems_helper(QList<QGraphicsItem *> *items,
+ const QGraphicsItem *parent,
const QRectF &rect,
Qt::ItemSelectionMode mode) const;
void childItems_helper(QList<QGraphicsItem *> *items,
diff --git a/src/gui/graphicsview/qgraphicsview.cpp b/src/gui/graphicsview/qgraphicsview.cpp
index a661441..b41dc66 100644
--- a/src/gui/graphicsview/qgraphicsview.cpp
+++ b/src/gui/graphicsview/qgraphicsview.cpp
@@ -790,6 +790,19 @@ QRegion QGraphicsViewPrivate::mapToViewRegion(const QGraphicsItem *item, const Q
return item->boundingRegion(itv) & itv.mapRect(rect).toAlignedRect();
}
+// QRectF::intersects() returns false always if either the source or target
+// rectangle's width or height are 0. This works around that problem.
+static inline QRectF adjustedItemBoundingRect(const QGraphicsItem *item)
+{
+ Q_ASSERT(item);
+ QRectF boundingRect(item->boundingRect());
+ if (!boundingRect.width())
+ boundingRect.adjust(-0.00001, 0, 0.00001, 0);
+ if (!boundingRect.height())
+ boundingRect.adjust(0, -0.00001, 0, 0.00001);
+ return boundingRect;
+}
+
/*!
\internal
*/
@@ -801,38 +814,37 @@ void QGraphicsViewPrivate::itemUpdated(QGraphicsItem *item, const QRectF &rect)
updateLater();
QRectF updateRect = rect;
- if (item->isClipped()) {
+ if ((item->d_ptr->flags & QGraphicsItem::ItemClipsChildrenToShape) || item->d_ptr->children.isEmpty()) {
+ updateRect &= adjustedItemBoundingRect(item);
+ if (updateRect.isEmpty())
+ return;
+ }
+
+ QGraphicsItem *clipItem = item;
+ if (item->d_ptr->ancestorFlags & QGraphicsItemPrivate::AncestorClipsChildren) {
// Minimize unnecessary redraw.
- QGraphicsItem *p = item;
- while ((p = p->d_ptr->parent)) {
- if (p->flags() & QGraphicsItem::ItemClipsChildrenToShape) {
- updateRect &= p->itemTransform(item).mapRect(p->boundingRect());
- if (updateRect.isNull())
+ QGraphicsItem *parent = item;
+ while ((parent = parent->d_ptr->parent)) {
+ if (parent->d_ptr->flags & QGraphicsItem::ItemClipsChildrenToShape) {
+ // Map update rect to the current parent and itersect with its bounding rect.
+ updateRect = clipItem->itemTransform(parent).mapRect(updateRect)
+ & adjustedItemBoundingRect(parent);
+ if (updateRect.isEmpty())
return;
+ clipItem = parent;
}
- if (!(p->d_ptr->ancestorFlags & QGraphicsItemPrivate::AncestorClipsChildren))
+ if (!(parent->d_ptr->ancestorFlags & QGraphicsItemPrivate::AncestorClipsChildren))
break;
}
-
- if (updateRect.isNull())
- return;
}
- // Map the rect to view coordinates.
- QRect vr = viewport->rect();
-
- if (!item->d_ptr->hasBoundingRegionGranularity) {
- QRect r = mapToViewRect(item, updateRect) & vr;
- if (r.isNull())
- return;
- this->updateRect(r);
- } else {
- QRegion r = mapToViewRegion(item, updateRect) & vr;
- if (r.isEmpty())
- return;
- updateRegion(r);
- }
+ // Map update rect from clipItem coordinates to view coordinates.
+ Q_ASSERT(clipItem);
+ if (!item->d_ptr->hasBoundingRegionGranularity)
+ this->updateRect(mapToViewRect(clipItem, updateRect) & viewport->rect());
+ else
+ updateRegion(mapToViewRegion(clipItem, updateRect) & viewport->rect());
}
void QGraphicsViewPrivate::updateLater()
@@ -855,16 +867,19 @@ void QGraphicsViewPrivate::_q_updateLaterSlot()
const QList<QGraphicsItem *> &dirtyItems = scene->d_func()->dirtyItems;
for (int i = 0; i < dirtyItems.size(); ++i) {
const QGraphicsItem *item = dirtyItems.at(i);
+ if (item->d_ptr->discardUpdateRequest(/*ignoreClipping=*/false,
+ /*ignoreVisibleBit=*/false,
+ /*ignoreDirtyBit=*/true)) {
+ continue;
+ }
QTransform x = item->sceneTransform() * viewTransform;
- QRect viewRect = x.mapRect(item->boundingRect()).toAlignedRect() & vr;
- if (!viewRect.isNull())
- updateRect(viewRect);
+ updateRect(x.mapRect(item->boundingRect()).toAlignedRect() & vr);
}
dirtyRectCount += dirtyRects.size();
bool noUpdate = !fullUpdatePending && viewportUpdateMode == QGraphicsView::FullViewportUpdate;
- if ((dirtyRectCount > 0 || !dirtyBoundingRect.isNull()) && !fullUpdatePending && !noUpdate) {
+ if ((dirtyRectCount > 0 || !dirtyBoundingRect.isEmpty()) && !fullUpdatePending && !noUpdate) {
if (viewportUpdateMode == QGraphicsView::BoundingRectViewportUpdate
|| (viewportUpdateMode == QGraphicsView::SmartViewportUpdate
&& dirtyRectCount >= QGRAPHICSVIEW_REGION_RECT_THRESHOLD)) {
@@ -921,6 +936,9 @@ void QGraphicsViewPrivate::updateAll()
void QGraphicsViewPrivate::updateRegion(const QRegion &r)
{
+ if (r.isEmpty())
+ return;
+
Q_Q(QGraphicsView);
// Rect intersects viewport - update everything?
@@ -969,6 +987,9 @@ void QGraphicsViewPrivate::updateRegion(const QRegion &r)
void QGraphicsViewPrivate::updateRect(const QRect &r)
{
+ if (r.isEmpty())
+ return;
+
Q_Q(QGraphicsView);
// Rect intersects viewport - update everything?
@@ -1025,103 +1046,71 @@ void QGraphicsViewPrivate::freeStyleOptionsArray(QStyleOptionGraphicsItem *array
extern QPainterPath qt_regionToPath(const QRegion &region);
-QList<QGraphicsItem *> QGraphicsViewPrivate::findItems(const QRegion &exposedRegion,
- const QTransform &worldTransform,
- bool *allItems) const
+/*!
+ ### Adjustments in findItems: mapToScene(QRect) forces us to adjust the
+ input rectangle by (0, 0, 1, 1), because it uses QRect::bottomRight()
+ (etc) when mapping the rectangle to a polygon (which is _wrong_). In
+ addition, as QGraphicsItem::boundingRect() is defined in logical space,
+ but the default pen for QPainter is cosmetic with a width of 0, QPainter
+ is at risk of painting 1 pixel outside the bounding rect. Therefore we
+ must search for items with an adjustment of (-1, -1, 1, 1).
+*/
+QList<QGraphicsItem *> QGraphicsViewPrivate::findItems(const QRegion &exposedRegion, bool *allItems) const
{
Q_Q(const QGraphicsView);
- QList<QGraphicsItem *> itemList;
- QSet<QGraphicsItem *> tmp;
- bool simpleTransform = worldTransform.type() <= QTransform::TxScale;
-
- QPainterPath path = qt_regionToPath(exposedRegion);
- *allItems = path.contains(q->mapFromScene(scene->d_func()->growingItemsBoundingRect).boundingRect());
- QList<QRectF> exposedRects;
- QList<QPolygonF> exposedPolys;
-
- // Transform the exposed viewport rects to scene rects or polygons
- foreach (const QRect &rect, exposedRegion.rects()) {
- QPolygonF exposedPoly = q->mapToScene(rect.adjusted(-1, -1, 1, 1));
- QRectF exposedRect = exposedPoly.boundingRect();
- if (!simpleTransform)
- exposedPolys << exposedPoly;
- exposedRects << exposedRect;
- }
-
- // Find which items need to be drawn.
- if (*allItems) {
+
+ // Step 1) If all items are contained within the expose region, then
+ // return a list of all visible items.
+ const QRectF exposedRegionSceneBounds = q->mapToScene(exposedRegion.boundingRect().adjusted(-1, -1, 2, 2))
+ .boundingRect();
+ if (exposedRegionSceneBounds.contains(scene->d_func()->growingItemsBoundingRect)) {
+ Q_ASSERT(allItems);
+ *allItems = true;
+
// All items are guaranteed within the exposed region, don't bother using the index.
- foreach (QGraphicsItem *item, scene->items()) {
+ QList<QGraphicsItem *> itemList(scene->items());
+ int i = 0;
+ while (i < itemList.size()) {
// But we only want to include items that are visible
- if (item->isVisible())
- itemList << item;
- }
- } else if (simpleTransform) {
- // Simple rect lookups will do.
- if (exposedRects.size() > 1) {
- foreach (const QRectF &rect, exposedRects) {
- foreach (QGraphicsItem *item, scene->d_func()->items_helper(rect, Qt::IntersectsItemBoundingRect, Qt::SortOrder(-1) /* don't sort */)) {
- if (!tmp.contains(item)) {
- tmp << item;
- itemList << item;
- }
- }
- }
- } else {
- itemList += scene->d_func()->items_helper(exposedRects[0], Qt::IntersectsItemBoundingRect, Qt::SortOrder(-1) /* don't sort */);
- }
- } else {
- // Polygon lookup is necessary.
- if (exposedRects.size() > 1) {
- foreach (const QPolygonF &poly, exposedPolys) {
- foreach (QGraphicsItem *item, scene->d_func()->items_helper(poly, Qt::IntersectsItemBoundingRect, Qt::SortOrder(-1) /* don't sort */)) {
- if (!tmp.contains(item)) {
- tmp << item;
- itemList << item;
- }
- }
- }
- } else {
- itemList += scene->d_func()->items_helper(exposedPolys[0], Qt::IntersectsItemBoundingRect, Qt::SortOrder(-1) /* don't sort */);
+ if (!itemList.at(i)->isVisible())
+ itemList.removeAt(i);
+ else
+ ++i;
}
+
+ // Sort the items.
+ QGraphicsScenePrivate::sortItems(&itemList, Qt::DescendingOrder, scene->d_func()->sortCacheEnabled);
+ return itemList;
}
- // Check for items that ignore inherited transformations, and add them if
- // necessary.
- QRectF untr = scene->d_func()->largestUntransformableItem;
- if (!*allItems && !untr.isNull()) {
- // Map the largest untransformable item subtree boundingrect from view
- // to scene coordinates, and use this to expand all exposed rects in
- // search for untransformable items.
- QRectF ltri = matrix.inverted().mapRect(untr);
- ltri.adjust(-untr.width(), -untr.height(), untr.width(), untr.height());
-
- foreach (const QRect &rect, exposedRegion.rects()) {
- QRectF exposed = q->mapToScene(rect.adjusted(-1, -1, 1, 1)).boundingRect();
- exposed.adjust(-ltri.width(), -ltri.height(), ltri.width(), ltri.height());
-
- foreach (QGraphicsItem *item, scene->d_func()->estimateItemsInRect(exposed)) {
- if (item->d_ptr->itemIsUntransformable()) {
- if (!tmp.contains(item)) {
- QPainterPath rectPath;
- rectPath.addRect(rect);
- QPainterPath path = item->deviceTransform(q->viewportTransform()).inverted().map(rectPath);
- if (item->collidesWithPath(path, Qt::IntersectsItemBoundingRect)) {
- itemList << item;
- tmp << item;
- }
- }
- }
- }
- }
+ // Step 2) If the expose region is a simple rect and the view is only
+ // translated or scaled, search for items using
+ // QGraphicsScene::items(QRectF).
+ bool simpleRectLookup = (scene->d_func()->largestUntransformableItem.isNull()
+ && exposedRegion.numRects() == 1 && matrix.type() <= QTransform::TxScale);
+ if (simpleRectLookup) {
+ return scene->d_func()->items_helper(exposedRegionSceneBounds,
+ Qt::IntersectsItemBoundingRect,
+ Qt::DescendingOrder);
}
- tmp.clear();
- // Sort the items.
- QGraphicsScenePrivate::sortItems(&itemList, Qt::DescendingOrder,
- scene->d_func()->sortCacheEnabled);
+ // If the region is complex or the view has a complex transform, adjust
+ // the expose region, convert it to a path, and then search for items
+ // using QGraphicsScene::items(QPainterPath);
+ QRegion adjustedRegion;
+ foreach (const QRect &r, exposedRegion.rects())
+ adjustedRegion += r.adjusted(-1, -1, 1, 1);
+
+ const QPainterPath exposedPath(qt_regionToPath(adjustedRegion));
+ if (scene->d_func()->largestUntransformableItem.isNull()) {
+ const QPainterPath exposedScenePath(q->mapToScene(exposedPath));
+ return scene->d_func()->items_helper(exposedScenePath,
+ Qt::IntersectsItemBoundingRect,
+ Qt::DescendingOrder);
+ }
- return itemList;
+ // NB! Path must be in viewport coordinates.
+ return itemsInArea(exposedPath, Qt::IntersectsItemBoundingRect, Qt::DescendingOrder);
}
void QGraphicsViewPrivate::generateStyleOptions(const QList<QGraphicsItem *> &itemList,
@@ -2224,7 +2213,8 @@ QList<QGraphicsItem *> QGraphicsView::items() const
certainly room for improvement.
*/
QList<QGraphicsItem *> QGraphicsViewPrivate::itemsInArea(const QPainterPath &path,
- Qt::ItemSelectionMode mode) const
+ Qt::ItemSelectionMode mode,
+ Qt::SortOrder order) const
{
Q_Q(const QGraphicsView);
@@ -2274,8 +2264,8 @@ QList<QGraphicsItem *> QGraphicsViewPrivate::itemsInArea(const QPainterPath &pat
}
// ### Insertion sort would be faster.
- QGraphicsScenePrivate::sortItems(&result, Qt::AscendingOrder,
- scene->d_func()->sortCacheEnabled);
+ if (order != Qt::SortOrder(-1))
+ QGraphicsScenePrivate::sortItems(&result, order, scene->d_func()->sortCacheEnabled);
return result;
}
@@ -3280,7 +3270,7 @@ void QGraphicsView::mouseMoveEvent(QMouseEvent *event)
}
// Update old rubberband
- if (d->viewportUpdateMode != QGraphicsView::NoViewportUpdate && !d->rubberBandRect.isNull()) {
+ if (d->viewportUpdateMode != QGraphicsView::NoViewportUpdate && !d->rubberBandRect.isEmpty()) {
if (d->viewportUpdateMode != FullViewportUpdate)
viewport()->update(d->rubberBandRegion(viewport(), d->rubberBandRect));
else
@@ -3462,7 +3452,7 @@ void QGraphicsView::paintEvent(QPaintEvent *event)
QPainter painter(viewport());
QTransform original = painter.worldTransform();
#ifndef QT_NO_RUBBERBAND
- if (d->rubberBanding && !d->rubberBandRect.isNull())
+ if (d->rubberBanding && !d->rubberBandRect.isEmpty())
painter.save();
#endif
// Set up render hints
@@ -3481,7 +3471,7 @@ void QGraphicsView::paintEvent(QPaintEvent *event)
// Find all exposed items
bool allItems = false;
- QList<QGraphicsItem *> itemList = d->findItems(exposedRegion, viewTransform, &allItems);
+ QList<QGraphicsItem *> itemList = d->findItems(exposedRegion, &allItems);
#ifdef QGRAPHICSVIEW_DEBUG
int exposedTime = stopWatch.elapsed();
@@ -3558,7 +3548,7 @@ void QGraphicsView::paintEvent(QPaintEvent *event)
#ifndef QT_NO_RUBBERBAND
// Rubberband
- if (d->rubberBanding && !d->rubberBandRect.isNull()) {
+ if (d->rubberBanding && !d->rubberBandRect.isEmpty()) {
painter.restore();
QStyleOptionRubberBand option;
option.initFrom(viewport());
@@ -3642,7 +3632,7 @@ void QGraphicsView::scrollContentsBy(int dx, int dy)
#ifndef QT_NO_RUBBERBAND
// Update old rubberband
- if (d->viewportUpdateMode != QGraphicsView::NoViewportUpdate && !d->rubberBandRect.isNull()) {
+ if (d->viewportUpdateMode != QGraphicsView::NoViewportUpdate && !d->rubberBandRect.isEmpty()) {
if (d->viewportUpdateMode != FullViewportUpdate)
viewport()->update(d->rubberBandRegion(viewport(), d->rubberBandRect));
else
diff --git a/src/gui/graphicsview/qgraphicsview_p.h b/src/gui/graphicsview/qgraphicsview_p.h
index 2109673..a76279e 100644
--- a/src/gui/graphicsview/qgraphicsview_p.h
+++ b/src/gui/graphicsview/qgraphicsview_p.h
@@ -85,7 +85,8 @@ public:
qint64 verticalScroll() const;
QList<QGraphicsItem *> itemsInArea(const QPainterPath &path,
- Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const;
+ Qt::ItemSelectionMode mode = Qt::IntersectsItemShape,
+ Qt::SortOrder = Qt::AscendingOrder) const;
QPointF mousePressItemPoint;
QPointF mousePressScenePoint;
@@ -172,9 +173,7 @@ public:
void updateRegion(const QRegion &region);
bool updateSceneSlotReimplementedChecked;
- QList<QGraphicsItem *> findItems(const QRegion &exposedRegion,
- const QTransform &worldTransform,
- bool *allItems) const;
+ QList<QGraphicsItem *> findItems(const QRegion &exposedRegion, bool *allItems) const;
void generateStyleOptions(const QList<QGraphicsItem *> &itemList,
QGraphicsItem **itemArray,
diff --git a/src/gui/graphicsview/qgraphicswidget.cpp b/src/gui/graphicsview/qgraphicswidget.cpp
index 64ec0e7..7f02fb9 100644
--- a/src/gui/graphicsview/qgraphicswidget.cpp
+++ b/src/gui/graphicsview/qgraphicswidget.cpp
@@ -366,32 +366,33 @@ void QGraphicsWidget::resize(const QSizeF &size)
void QGraphicsWidget::setGeometry(const QRectF &rect)
{
QGraphicsWidgetPrivate *wd = QGraphicsWidget::d_func();
- const QGraphicsLayoutItemPrivate *d = QGraphicsLayoutItem::d_ptr;
- setAttribute(Qt::WA_Resized);
- QRectF newGeom = rect;
- newGeom.setSize(rect.size().expandedTo(effectiveSizeHint(Qt::MinimumSize))
- .boundedTo(effectiveSizeHint(Qt::MaximumSize)));
- if (newGeom == d->geom)
- return;
-
- // Update and prepare to change the geometry (remove from index).
- if (wd->scene) {
- if (rect.topLeft() != d->geom.topLeft())
- wd->fullUpdateHelper(true);
- else
- update();
- }
- prepareGeometryChange();
-
- // setPos triggers ItemPositionChange, which can adjust position
+ QGraphicsLayoutItemPrivate *d = QGraphicsLayoutItem::d_ptr;
+ QRectF newGeom;
QPointF oldPos = d->geom.topLeft();
- wd->inSetGeometry = 1;
- wd->setPosHelper(newGeom.topLeft(), /* update = */ false);
- wd->inSetGeometry = 0;
- newGeom.moveTopLeft(pos());
-
- if (newGeom == d->geom)
- return;
+ if (!wd->inSetPos) {
+ setAttribute(Qt::WA_Resized);
+ newGeom = rect;
+ newGeom.setSize(rect.size().expandedTo(effectiveSizeHint(Qt::MinimumSize))
+ .boundedTo(effectiveSizeHint(Qt::MaximumSize)));
+ if (newGeom == d->geom)
+ return;
+
+ // setPos triggers ItemPositionChange, which can adjust position
+ wd->inSetGeometry = 1;
+ wd->setPosHelper(newGeom.topLeft());
+ wd->inSetGeometry = 0;
+ newGeom.moveTopLeft(pos());
+
+ if (newGeom == d->geom)
+ return;
+
+ // Update and prepare to change the geometry (remove from index) if the size has changed.
+ if (wd->scene) {
+ if (rect.topLeft() == d->geom.topLeft()) {
+ prepareGeometryChange();
+ }
+ }
+ }
// Update the layout item geometry
bool moved = oldPos != pos();
@@ -401,6 +402,11 @@ void QGraphicsWidget::setGeometry(const QRectF &rect)
event.setOldPos(oldPos);
event.setNewPos(pos());
QApplication::sendEvent(this, &event);
+ if (wd->inSetPos) {
+ //set the new pos
+ d->geom.moveTopLeft(pos());
+ return;
+ }
}
QSizeF oldSize = size();
QGraphicsLayoutItem::setGeometry(newGeom);
@@ -1016,9 +1022,11 @@ QVariant QGraphicsWidget::itemChange(GraphicsItemChange change, const QVariant &
break;
case ItemPositionHasChanged:
if (!d->inSetGeometry) {
+ d->inSetPos = 1;
// Ensure setGeometry is called (avoid recursion when setPos is
// called from within setGeometry).
setGeometry(QRectF(pos(), size()));
+ d->inSetPos = 0 ;
}
break;
case ItemParentChange: {
diff --git a/src/gui/graphicsview/qgraphicswidget_p.h b/src/gui/graphicsview/qgraphicswidget_p.h
index 455a129..53eaa31 100644
--- a/src/gui/graphicsview/qgraphicswidget_p.h
+++ b/src/gui/graphicsview/qgraphicswidget_p.h
@@ -86,6 +86,7 @@ public:
inheritedFontResolveMask(0),
inSetGeometry(0),
polished(0),
+ inSetPos(0),
focusPolicy(Qt::NoFocus),
focusNext(0),
focusPrev(0),
@@ -195,6 +196,7 @@ public:
quint32 attributes : 10;
quint32 inSetGeometry : 1;
quint32 polished: 1;
+ quint32 inSetPos : 1;
// Focus
Qt::FocusPolicy focusPolicy;
diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp
index dc236e4..c7a20db 100644
--- a/src/gui/image/qimage.cpp
+++ b/src/gui/image/qimage.cpp
@@ -3607,6 +3607,9 @@ int QImage::pixelIndex(int x, int y) const
If the \a position is not valid, the results are undefined.
+ \warning This function is expensive when used for massive pixel
+ manipulations.
+
\sa setPixel(), valid(), {QImage#Pixel Manipulation}{Pixel
Manipulation}
*/
@@ -5581,6 +5584,8 @@ bool QImage::isDetached() const
Use one of the composition mods in QPainter::CompositionMode instead.
+ \warning This function is expensive.
+
\sa alphaChannel(), {QImage#Image Transformations}{Image
Transformations}, {QImage#Image Formats}{Image Formats}
*/
@@ -5663,6 +5668,11 @@ void QImage::setAlphaChannel(const QImage &alphaChannel)
\l{QPixmap::}{alphaChannel()}, which works in the same way as
this function on QPixmaps.
+ Most usecases for this function can be replaced with QPainter and
+ using composition modes.
+
+ \warning This is an expensive function.
+
\sa setAlphaChannel(), hasAlphaChannel(),
{QPixmap#Pixmap Information}{Pixmap},
{QImage#Image Transformations}{Image Transformations}
diff --git a/src/gui/image/qpixmap.cpp b/src/gui/image/qpixmap.cpp
index e563fc9..3b82da8 100644
--- a/src/gui/image/qpixmap.cpp
+++ b/src/gui/image/qpixmap.cpp
@@ -724,7 +724,7 @@ void QPixmap::resize_helper(const QSize &s)
pixels black. The effect of this function is undefined when the pixmap is
being painted on.
- This is potentially an expensive operation.
+ \warning This is potentially an expensive operation.
\sa mask(), {QPixmap#Pixmap Transformations}{Pixmap Transformations},
QBitmap
@@ -1430,6 +1430,12 @@ void QPixmap::deref()
If the given \a size is empty, this function returns a null
pixmap.
+
+ In some cases it can be more beneficial to draw the pixmap to a
+ painter with a scale set rather than scaling the pixmap. This is
+ the case when the painter is for instance based on OpenGL or when
+ the scale factor changes rapidly.
+
\sa isNull(), {QPixmap#Pixmap Transformations}{Pixmap
Transformations}
@@ -1801,6 +1807,10 @@ int QPixmap::metric(PaintDeviceMetric metric) const
The effect of this function is undefined when the pixmap is being
painted on.
+ \warning This is potentially an expensive operation. Most usecases
+ for this function are covered by QPainter and compositionModes
+ which will normally execute faster.
+
\sa alphaChannel(), {QPixmap#Pixmap Transformations}{Pixmap
Transformations}
*/
@@ -1843,6 +1853,9 @@ void QPixmap::setAlphaChannel(const QPixmap &alphaChannel)
\image alphachannelimage.png The pixmap and channelImage QPixmaps
+ \warning This is an expensive operation. The alpha channel of the
+ pixmap is extracted dynamically from the pixeldata.
+
\sa setAlphaChannel(), {QPixmap#Pixmap Information}{Pixmap
Information}
*/
@@ -1864,7 +1877,8 @@ QPaintEngine *QPixmap::paintEngine() const
Extracts a bitmap mask from the pixmap's alphachannel.
- This is potentially an expensive operation.
+ \warning This is potentially an expensive operation. The mask of
+ the pixmap is extracted dynamically from the pixeldata.
\sa setMask(), {QPixmap#Pixmap Information}{Pixmap Information}
*/
diff --git a/src/gui/kernel/qapplication_x11.cpp b/src/gui/kernel/qapplication_x11.cpp
index 10fb886..b1270bc 100644
--- a/src/gui/kernel/qapplication_x11.cpp
+++ b/src/gui/kernel/qapplication_x11.cpp
@@ -1362,8 +1362,10 @@ static void qt_set_x11_resources(const char* font = 0, const char* fg = 0,
pal.setColor(QPalette::Disabled, QPalette::Highlight, Qt::darkBlue);
}
- QApplicationPrivate::setSystemPalette(pal);
-
+ // QGtkStyle sets it's own system palette
+ if (!(QApplicationPrivate::app_style && QApplicationPrivate::app_style->inherits("QGtkStyle"))) {
+ QApplicationPrivate::setSystemPalette(pal);
+ }
QColor::setAllowX11ColorNames(allowX11ColorNames);
}
diff --git a/src/gui/kernel/qt_mac_p.h b/src/gui/kernel/qt_mac_p.h
index 3aec23f..e65492d 100644
--- a/src/gui/kernel/qt_mac_p.h
+++ b/src/gui/kernel/qt_mac_p.h
@@ -233,6 +233,7 @@ extern QPaintDevice *qt_mac_safe_pdev; //qapplication_mac.cpp
extern OSWindowRef qt_mac_window_for(const QWidget*); //qwidget_mac.mm
extern OSViewRef qt_mac_nativeview_for(const QWidget *); //qwidget_mac.mm
+extern QPoint qt_mac_nativeMapFromParent(const QWidget *child, const QPoint &pt); //qwidget_mac.mm
#ifdef check
# undef check
diff --git a/src/gui/kernel/qwidget.cpp b/src/gui/kernel/qwidget.cpp
index 8ce0231..20b79ce 100644
--- a/src/gui/kernel/qwidget.cpp
+++ b/src/gui/kernel/qwidget.cpp
@@ -66,6 +66,7 @@
#ifdef Q_WS_MAC
# include "qt_mac_p.h"
# include "qt_cocoa_helpers_mac_p.h"
+# include "qmainwindow.h"
#endif
#if defined(Q_WS_QWS)
# include "qwsdisplay_qws.h"
@@ -8979,17 +8980,36 @@ QWidget *QWidget::childAt(const QPoint &p) const
QWidget *QWidgetPrivate::childAt_helper(const QPoint &p, bool ignoreChildrenInDestructor) const
{
Q_Q(const QWidget);
- if (!q->rect().contains(p))
+#ifdef Q_WS_MAC
+ bool includeFrame = q->isWindow() && qobject_cast<const QMainWindow *>(q)
+ && static_cast<const QMainWindow *>(q)->unifiedTitleAndToolBarOnMac();
+#endif
+
+ if (
+#ifdef Q_WS_MAC
+ !includeFrame &&
+#endif
+ !q->rect().contains(p))
return 0;
+
for (int i = children.size(); i > 0 ;) {
--i;
QWidget *w = qobject_cast<QWidget *>(children.at(i));
- if (w && !w->isWindow() && !w->isHidden() && w->geometry().contains(p)) {
+ if (w && !w->isWindow() && !w->isHidden()
+ && (w->geometry().contains(p)
+#ifdef Q_WS_MAC
+ || (includeFrame && w->geometry().contains(qt_mac_nativeMapFromParent(w, p)))
+#endif
+ )) {
if (ignoreChildrenInDestructor && w->data->in_destructor)
continue;
if (w->testAttribute(Qt::WA_TransparentForMouseEvents))
continue;
QPoint childPoint = w->mapFromParent(p);
+#ifdef Q_WS_MAC
+ if (includeFrame && !w->geometry().contains(p))
+ childPoint = qt_mac_nativeMapFromParent(w, p);
+#endif
if (QWidget *t = w->d_func()->childAt_helper(childPoint, ignoreChildrenInDestructor))
return t;
// if WMouseNoMask is set the widget mask is ignored, if
@@ -9430,11 +9450,13 @@ void QWidget::repaint(const QRect &rect)
if (!isVisible() || !updatesEnabled() || rect.isEmpty())
return;
- QTLWExtra *tlwExtra = !d->paintOnScreen() ? window()->d_func()->maybeTopData() : 0;
- if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) {
- tlwExtra->inRepaint = true;
- tlwExtra->backingStore->markDirty(rect, this, true);
- tlwExtra->inRepaint = false;
+ if (hasBackingStoreSupport()) {
+ QTLWExtra *tlwExtra = window()->d_func()->maybeTopData();
+ if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) {
+ tlwExtra->inRepaint = true;
+ tlwExtra->backingStore->markDirty(rect, this, true);
+ tlwExtra->inRepaint = false;
+ }
} else {
d->repaint_sys(rect);
}
@@ -9457,11 +9479,13 @@ void QWidget::repaint(const QRegion &rgn)
if (!isVisible() || !updatesEnabled() || rgn.isEmpty())
return;
- QTLWExtra *tlwExtra = !d->paintOnScreen() ? window()->d_func()->maybeTopData() : 0;
- if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) {
- tlwExtra->inRepaint = true;
- tlwExtra->backingStore->markDirty(rgn, this, true);
- tlwExtra->inRepaint = false;
+ if (hasBackingStoreSupport()) {
+ QTLWExtra *tlwExtra = window()->d_func()->maybeTopData();
+ if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) {
+ tlwExtra->inRepaint = true;
+ tlwExtra->backingStore->markDirty(rgn, this, true);
+ tlwExtra->inRepaint = false;
+ }
} else {
d->repaint_sys(rgn);
}
diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm
index a3c026b..9eac321 100644
--- a/src/gui/kernel/qwidget_mac.mm
+++ b/src/gui/kernel/qwidget_mac.mm
@@ -3268,6 +3268,20 @@ void QWidgetPrivate::show_sys()
qt_event_request_window_change(q);
}
+
+QPoint qt_mac_nativeMapFromParent(const QWidget *child, const QPoint &pt)
+{
+#ifndef QT_MAC_USE_COCOA
+ CGPoint nativePoint = CGPointMake(pt.x(), pt.y());
+ HIViewConvertPoint(&nativePoint, qt_mac_nativeview_for(child->parentWidget()),
+ qt_mac_nativeview_for(child));
+#else
+ NSPoint nativePoint = [qt_mac_nativeview_for(child) convertPoint:NSMakePoint(pt.x(), pt.y()) fromView:qt_mac_nativeview_for(child->parentWidget())];
+#endif
+ return QPoint(nativePoint.x, nativePoint.y);
+}
+
+
void QWidgetPrivate::hide_sys()
{
Q_Q(QWidget);
diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp
index 6dd5682..addd63d 100644
--- a/src/gui/painting/qpaintengine_raster.cpp
+++ b/src/gui/painting/qpaintengine_raster.cpp
@@ -2355,11 +2355,6 @@ void QRasterPaintEngine::strokePolygonCosmetic(const QPoint *points, int pointCo
}
}
-#define IMAGE_FROM_PIXMAP(pixmap) \
- pixmap.data->classId() == QPixmapData::RasterClass \
- ? ((QRasterPixmapData *) pixmap.data)->image \
- : pixmap.toImage()
-
/*!
\internal
*/
@@ -2368,16 +2363,33 @@ void QRasterPaintEngine::drawPixmap(const QPointF &pos, const QPixmap &pixmap)
#ifdef QT_DEBUG_DRAW
qDebug() << " - QRasterPaintEngine::drawPixmap(), pos=" << pos << " pixmap=" << pixmap.size() << "depth=" << pixmap.depth();
#endif
- if (pixmap.depth() == 1) {
- Q_D(QRasterPaintEngine);
- QRasterPaintEngineState *s = state();
- if (s->matrix.type() <= QTransform::TxTranslate) {
- drawBitmap(pos + QPointF(s->matrix.dx(), s->matrix.dy()), pixmap, &s->penData);
+
+ if (pixmap.data->classId() == QPixmapData::RasterClass) {
+ const QImage &image = ((QRasterPixmapData *) pixmap.data)->image;
+ if (image.depth() == 1) {
+ Q_D(QRasterPaintEngine);
+ QRasterPaintEngineState *s = state();
+ if (s->matrix.type() <= QTransform::TxTranslate) {
+ drawBitmap(pos + QPointF(s->matrix.dx(), s->matrix.dy()), image, &s->penData);
+ } else {
+ drawImage(pos, d->rasterBuffer->colorizeBitmap(image, s->pen.color()));
+ }
} else {
- drawImage(pos, d->rasterBuffer->colorizeBitmap(IMAGE_FROM_PIXMAP(pixmap), s->pen.color()));
+ QRasterPaintEngine::drawImage(pos, image);
}
} else {
- QRasterPaintEngine::drawImage(pos, IMAGE_FROM_PIXMAP(pixmap));
+ const QImage image = pixmap.toImage();
+ if (pixmap.depth() == 1) {
+ Q_D(QRasterPaintEngine);
+ QRasterPaintEngineState *s = state();
+ if (s->matrix.type() <= QTransform::TxTranslate) {
+ drawBitmap(pos + QPointF(s->matrix.dx(), s->matrix.dy()), image, &s->penData);
+ } else {
+ drawImage(pos, d->rasterBuffer->colorizeBitmap(image, s->pen.color()));
+ }
+ } else {
+ QRasterPaintEngine::drawImage(pos, image);
+ }
}
}
@@ -2390,22 +2402,40 @@ void QRasterPaintEngine::drawPixmap(const QRectF &r, const QPixmap &pixmap, cons
qDebug() << " - QRasterPaintEngine::drawPixmap(), r=" << r << " sr=" << sr << " pixmap=" << pixmap.size() << "depth=" << pixmap.depth();
#endif
- Q_D(QRasterPaintEngine);
- QRasterPaintEngineState *s = state();
-
- if (pixmap.depth() == 1) {
- if (s->matrix.type() <= QTransform::TxTranslate
- && r.size() == sr.size()
- && r.size() == pixmap.size()) {
- ensurePen();
- drawBitmap(r.topLeft() + QPointF(s->matrix.dx(), s->matrix.dy()), pixmap, &s->penData);
- return;
+ if (pixmap.data->classId() == QPixmapData::RasterClass) {
+ const QImage &image = ((QRasterPixmapData *) pixmap.data)->image;
+ if (image.depth() == 1) {
+ Q_D(QRasterPaintEngine);
+ QRasterPaintEngineState *s = state();
+ if (s->matrix.type() <= QTransform::TxTranslate
+ && r.size() == sr.size()
+ && r.size() == pixmap.size()) {
+ ensurePen();
+ drawBitmap(r.topLeft() + QPointF(s->matrix.dx(), s->matrix.dy()), image, &s->penData);
+ return;
+ } else {
+ drawImage(r, d->rasterBuffer->colorizeBitmap(image, s->pen.color()), sr);
+ }
} else {
- drawImage(r, d->rasterBuffer->colorizeBitmap(IMAGE_FROM_PIXMAP(pixmap),
- s->pen.color()), sr);
+ drawImage(r, image, sr);
}
} else {
- drawImage(r, IMAGE_FROM_PIXMAP(pixmap), sr);
+ const QImage image = pixmap.toImage();
+ if (image.depth() == 1) {
+ Q_D(QRasterPaintEngine);
+ QRasterPaintEngineState *s = state();
+ if (s->matrix.type() <= QTransform::TxTranslate
+ && r.size() == sr.size()
+ && r.size() == pixmap.size()) {
+ ensurePen();
+ drawBitmap(r.topLeft() + QPointF(s->matrix.dx(), s->matrix.dy()), image, &s->penData);
+ return;
+ } else {
+ drawImage(r, d->rasterBuffer->colorizeBitmap(image, s->pen.color()), sr);
+ }
+ } else {
+ drawImage(r, image, sr);
+ }
}
}
@@ -2614,10 +2644,15 @@ void QRasterPaintEngine::drawTiledPixmap(const QRectF &r, const QPixmap &pixmap,
QRasterPaintEngineState *s = state();
QImage image;
- if (pixmap.depth() == 1)
- image = d->rasterBuffer->colorizeBitmap(IMAGE_FROM_PIXMAP(pixmap), s->pen.color());
- else
- image = IMAGE_FROM_PIXMAP(pixmap);
+
+ if (pixmap.data->classId() == QPixmapData::RasterClass) {
+ image = ((QRasterPixmapData *) pixmap.data)->image;
+ } else {
+ image = pixmap.toImage();
+ }
+
+ if (image.depth() == 1)
+ image = d->rasterBuffer->colorizeBitmap(image, s->pen.color());
if (s->matrix.type() > QTransform::TxTranslate) {
QTransform copy = s->matrix;
@@ -3650,14 +3685,13 @@ void QRasterPaintEngine::drawBufferSpan(const uint *buffer, int bufsize,
}
#endif // Q_WS_QWS
-void QRasterPaintEngine::drawBitmap(const QPointF &pos, const QPixmap &pm, QSpanData *fg)
+void QRasterPaintEngine::drawBitmap(const QPointF &pos, const QImage &image, QSpanData *fg)
{
Q_ASSERT(fg);
if (!fg->blend)
return;
Q_D(QRasterPaintEngine);
- const QImage image = IMAGE_FROM_PIXMAP(pm);
Q_ASSERT(image.depth() == 1);
const int spanCount = 256;
@@ -3665,8 +3699,8 @@ void QRasterPaintEngine::drawBitmap(const QPointF &pos, const QPixmap &pm, QSpan
int n = 0;
// Boundaries
- int w = pm.width();
- int h = pm.height();
+ int w = image.width();
+ int h = image.height();
int ymax = qMin(qRound(pos.y() + h), d->rasterBuffer->height());
int ymin = qMax(qRound(pos.y()), 0);
int xmax = qMin(qRound(pos.x() + w), d->rasterBuffer->width());
diff --git a/src/gui/painting/qpaintengine_raster_p.h b/src/gui/painting/qpaintengine_raster_p.h
index 0f8060a..26a2b3f 100644
--- a/src/gui/painting/qpaintengine_raster_p.h
+++ b/src/gui/painting/qpaintengine_raster_p.h
@@ -256,7 +256,7 @@ private:
void init();
void fillRect(const QRectF &rect, QSpanData *data);
- void drawBitmap(const QPointF &pos, const QPixmap &image, QSpanData *fill);
+ void drawBitmap(const QPointF &pos, const QImage &image, QSpanData *fill);
void drawCachedGlyphs(const QPointF &p, const QTextItemInt &ti);
diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp
index fe6cc69..2beb8c2 100644
--- a/src/gui/painting/qpainter.cpp
+++ b/src/gui/painting/qpainter.cpp
@@ -2371,6 +2371,11 @@ void QPainter::setClipping(bool enable)
Returns the currently set clip region. Note that the clip region
is given in logical coordinates.
+ \warning QPainter does not store the combined clip explicitly as
+ this is handled by the underlying QPaintEngine, so the path is
+ recreated on demand and transformed to the current logical
+ coordinate system. This is potentially an expensive operation.
+
\sa setClipRegion(), clipPath(), setClipping()
*/
@@ -2486,6 +2491,11 @@ extern QPainterPath qt_regionToPath(const QRegion &region);
Returns the currently clip as a path. Note that the clip path is
given in logical coordinates.
+ \warning QPainter does not store the combined clip explicitly as
+ this is handled by the underlying QPaintEngine, so the path is
+ recreated on demand and transformed to the current logical
+ coordinate system. This is potentially an expensive operation.
+
\sa setClipPath(), clipRegion(), setClipping()
*/
QPainterPath QPainter::clipPath() const
@@ -5155,9 +5165,6 @@ void QPainter::drawPixmap(const QPointF &p, const QPixmap &pm)
Q_D(QPainter);
- if (!d->engine || pm.isNull())
- return;
-
#ifndef QT_NO_DEBUG
qt_painter_thread_test(d->device->devType(), "drawPixmap()");
#endif
@@ -5167,12 +5174,18 @@ void QPainter::drawPixmap(const QPointF &p, const QPixmap &pm)
return;
}
+ if (!d->engine)
+ return;
+
qreal x = p.x();
qreal y = p.y();
int w = pm.width();
int h = pm.height();
+ if (w <= 0)
+ return;
+
// Emulate opaque background for bitmaps
if (d->state->bgMode == Qt::OpaqueMode && pm.isQBitmap()) {
fillRect(QRectF(x, y, w, h), d->state->bgBrush.color());
diff --git a/src/gui/painting/qpainterpath.cpp b/src/gui/painting/qpainterpath.cpp
index b5e092c..6ae908c 100644
--- a/src/gui/painting/qpainterpath.cpp
+++ b/src/gui/painting/qpainterpath.cpp
@@ -1725,7 +1725,7 @@ static void qt_painterpath_isect_curve(const QBezier &bezier, const QPointF &pt,
*/
bool QPainterPath::contains(const QPointF &pt) const
{
- if (isEmpty())
+ if (isEmpty() || !controlPointRect().contains(pt))
return false;
QPainterPathData *d = d_func();
diff --git a/src/gui/styles/gtksymbols.cpp b/src/gui/styles/gtksymbols.cpp
index 8123d32..f7af8f8 100644
--- a/src/gui/styles/gtksymbols.cpp
+++ b/src/gui/styles/gtksymbols.cpp
@@ -504,13 +504,6 @@ static QPalette gtkWidgetPalette(const QString &gtkWidgetName)
pal.setBrush(QPalette::Disabled, QPalette::WindowText, disabledTextColor);
pal.setBrush(QPalette::All, QPalette::ButtonText, textColor);
pal.setBrush(QPalette::Disabled, QPalette::ButtonText, disabledTextColor);
- if (gtkWidgetName == QLS("GtkMenu")) {
- // This really applies to the combo box rendering since
- // QComboBox copies the palette from a QMenu
- GdkColor gdkBg = gtkWidget->style->bg[GTK_STATE_NORMAL];
- QColor bgColor(gdkBg.red>>8, gdkBg.green>>8, gdkBg.blue>>8);
- pal.setBrush(QPalette::Base, bgColor);
- }
return pal;
}
@@ -528,6 +521,7 @@ void QGtk::applyCustomPaletteHash()
GdkColor gdkBg = QGtk::gtkWidget(QLS("GtkMenu"))->style->bg[GTK_STATE_NORMAL];
QColor bgColor(gdkBg.red>>8, gdkBg.green>>8, gdkBg.blue>>8);
menuPal.setBrush(QPalette::Base, bgColor);
+ menuPal.setBrush(QPalette::Window, bgColor);
qApp->setPalette(menuPal, "QMenu");
QPalette toolbarPal = gtkWidgetPalette(QLS("GtkToolbar"));
diff --git a/src/gui/styles/qgtkstyle.cpp b/src/gui/styles/qgtkstyle.cpp
index 6354ce7..b569b5c 100644
--- a/src/gui/styles/qgtkstyle.cpp
+++ b/src/gui/styles/qgtkstyle.cpp
@@ -2634,7 +2634,7 @@ void QGtkStyle::drawControl(ControlElement element,
QColor disabledTextColor = QColor(gdkDText.red>>8, gdkDText.green>>8, gdkDText.blue>>8);
if (resolve_mask & (1 << QPalette::ButtonText)) {
textColor = option->palette.buttonText().color();
- disabledTextColor = option->palette.brush(QPalette::Disabled, QPalette::ButtonText);;
+ disabledTextColor = option->palette.brush(QPalette::Disabled, QPalette::ButtonText).color();
}
QColor highlightedTextColor = QColor(gdkHText.red>>8, gdkHText.green>>8, gdkHText.blue>>8);
diff --git a/src/gui/styles/qwindowsvistastyle.cpp b/src/gui/styles/qwindowsvistastyle.cpp
index 4c3060d..b14b8b3 100644
--- a/src/gui/styles/qwindowsvistastyle.cpp
+++ b/src/gui/styles/qwindowsvistastyle.cpp
@@ -801,12 +801,20 @@ void QWindowsVistaStyle::drawPrimitive(PrimitiveElement element, const QStyleOpt
if (vopt->viewItemPosition == QStyleOptionViewItemV4::OnlyOne
|| vopt->viewItemPosition == QStyleOptionViewItemV4::Invalid)
painter->drawPixmap(pixmapRect.topLeft(), pixmap);
- else if (reverse ? rightSection : leftSection)
- painter->drawPixmap(pixmapRect, pixmap, srcRect.adjusted(0, 0, -frame, 0));
- else if (reverse ? leftSection : rightSection)
- painter->drawPixmap(pixmapRect, pixmap,
- srcRect.adjusted(frame, 0, 0, 0));
- else if (vopt->viewItemPosition == QStyleOptionViewItemV4::Middle)
+ else if (reverse ? rightSection : leftSection){
+ painter->drawPixmap(QRect(pixmapRect.topLeft(),
+ QSize(frame, pixmapRect.height())), pixmap,
+ QRect(QPoint(0, 0), QSize(frame, pixmapRect.height())));
+ painter->drawPixmap(pixmapRect.adjusted(frame, 0, 0, 0),
+ pixmap, srcRect.adjusted(frame, 0, -frame, 0));
+ } else if (reverse ? leftSection : rightSection) {
+ painter->drawPixmap(QRect(pixmapRect.topRight() - QPoint(frame - 1, 0),
+ QSize(frame, pixmapRect.height())), pixmap,
+ QRect(QPoint(pixmapRect.width() - frame, 0),
+ QSize(frame, pixmapRect.height())));
+ painter->drawPixmap(pixmapRect.adjusted(0, 0, -frame, 0),
+ pixmap, srcRect.adjusted(frame, 0, -frame, 0));
+ } else if (vopt->viewItemPosition == QStyleOptionViewItemV4::Middle)
painter->drawPixmap(pixmapRect, pixmap,
srcRect.adjusted(frame, 0, -frame, 0));
} else {
diff --git a/src/gui/widgets/qdialogbuttonbox.cpp b/src/gui/widgets/qdialogbuttonbox.cpp
index 246da95..4a95292 100644
--- a/src/gui/widgets/qdialogbuttonbox.cpp
+++ b/src/gui/widgets/qdialogbuttonbox.cpp
@@ -752,7 +752,8 @@ QDialogButtonBox::~QDialogButtonBox()
\value KdeLayout Use a policy appropriate for applications on KDE.
\value GnomeLayout Use a policy appropriate for applications on GNOME.
- The button layout is specified by the \l{style()}{current style}.
+ The button layout is specified by the \l{style()}{current style}. However,
+ on the X11 platform, it may be influenced by the desktop environment.
*/
/*!
diff --git a/src/network/access/access.pri b/src/network/access/access.pri
index 6bcca0c..3269b2e 100644
--- a/src/network/access/access.pri
+++ b/src/network/access/access.pri
@@ -2,6 +2,9 @@
HEADERS += access/qftp.h \
access/qhttp.h \
+ access/qhttpnetworkheader_p.h \
+ access/qhttpnetworkrequest_p.h \
+ access/qhttpnetworkreply_p.h \
access/qhttpnetworkconnection_p.h \
access/qnetworkaccessmanager.h \
access/qnetworkaccessmanager_p.h \
@@ -27,6 +30,9 @@ HEADERS += access/qftp.h \
SOURCES += access/qftp.cpp \
access/qhttp.cpp \
+ access/qhttpnetworkheader.cpp \
+ access/qhttpnetworkrequest.cpp \
+ access/qhttpnetworkreply.cpp \
access/qhttpnetworkconnection.cpp \
access/qnetworkaccessmanager.cpp \
access/qnetworkaccesscache.cpp \
diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp
index edb2988..980c0e0 100644
--- a/src/network/access/qhttpnetworkconnection.cpp
+++ b/src/network/access/qhttpnetworkconnection.cpp
@@ -45,7 +45,7 @@
#include <private/qauthenticator_p.h>
#include <qnetworkproxy.h>
#include <qauthenticator.h>
-#include <qbytearraymatcher.h>
+
#include <qbuffer.h>
#include <qpair.h>
#include <qhttp.h>
@@ -59,875 +59,9 @@
# include <QtNetwork/qsslconfiguration.h>
#endif
-#ifndef QT_NO_COMPRESS
-# include <zlib.h>
-static const unsigned char gz_magic[2] = {0x1f, 0x8b}; // gzip magic header
-// gzip flag byte
-#define HEAD_CRC 0x02 // bit 1 set: header CRC present
-#define EXTRA_FIELD 0x04 // bit 2 set: extra field present
-#define ORIG_NAME 0x08 // bit 3 set: original file name present
-#define COMMENT 0x10 // bit 4 set: file comment present
-#define RESERVED 0xE0 // bits 5..7: reserved
-#define CHUNK 16384
-#endif
-
-QT_BEGIN_NAMESPACE
-
-class QHttpNetworkHeaderPrivate : public QSharedData
-{
-public:
- QUrl url;
- QList<QPair<QByteArray, QByteArray> > fields;
-
- QHttpNetworkHeaderPrivate(const QUrl &newUrl = QUrl());
- QHttpNetworkHeaderPrivate(const QHttpNetworkHeaderPrivate &other);
- inline qint64 contentLength() const;
- inline void setContentLength(qint64 length);
-
- inline QByteArray headerField(const QByteArray &name, const QByteArray &defaultValue = QByteArray()) const;
- inline QList<QByteArray> headerFieldValues(const QByteArray &name) const;
- inline void setHeaderField(const QByteArray &name, const QByteArray &data);
- bool operator==(const QHttpNetworkHeaderPrivate &other) const;
-
-};
-
-QHttpNetworkHeaderPrivate::QHttpNetworkHeaderPrivate(const QUrl &newUrl)
- :url(newUrl)
-{
-}
-
-QHttpNetworkHeaderPrivate::QHttpNetworkHeaderPrivate(const QHttpNetworkHeaderPrivate &other)
- :QSharedData(other)
-{
- url = other.url;
- fields = other.fields;
-}
-
-qint64 QHttpNetworkHeaderPrivate::contentLength() const
-{
- bool ok = false;
- QByteArray value = headerField("content-length");
- qint64 length = value.toULongLong(&ok);
- if (ok)
- return length;
- return -1; // the header field is not set
-}
-
-void QHttpNetworkHeaderPrivate::setContentLength(qint64 length)
-{
- setHeaderField("Content-Length", QByteArray::number(length));
-}
-
-QByteArray QHttpNetworkHeaderPrivate::headerField(const QByteArray &name, const QByteArray &defaultValue) const
-{
- QList<QByteArray> allValues = headerFieldValues(name);
- if (allValues.isEmpty())
- return defaultValue;
-
- QByteArray result;
- bool first = true;
- foreach (QByteArray value, allValues) {
- if (!first)
- result += ", ";
- first = false;
- result += value;
- }
- return result;
-}
-
-QList<QByteArray> QHttpNetworkHeaderPrivate::headerFieldValues(const QByteArray &name) const
-{
- QList<QByteArray> result;
- QByteArray lowerName = name.toLower();
- QList<QPair<QByteArray, QByteArray> >::ConstIterator it = fields.constBegin(),
- end = fields.constEnd();
- for ( ; it != end; ++it)
- if (lowerName == it->first.toLower())
- result += it->second;
-
- return result;
-}
-
-void QHttpNetworkHeaderPrivate::setHeaderField(const QByteArray &name, const QByteArray &data)
-{
- QByteArray lowerName = name.toLower();
- QList<QPair<QByteArray, QByteArray> >::Iterator it = fields.begin();
- while (it != fields.end()) {
- if (lowerName == it->first.toLower())
- it = fields.erase(it);
- else
- ++it;
- }
- fields.append(qMakePair(name, data));
-}
-
-bool QHttpNetworkHeaderPrivate::operator==(const QHttpNetworkHeaderPrivate &other) const
-{
- return (url == other.url);
-}
-
-// QHttpNetworkRequestPrivate
-class QHttpNetworkRequestPrivate : public QHttpNetworkHeaderPrivate
-{
-public:
- QHttpNetworkRequestPrivate(QHttpNetworkRequest::Operation op,
- QHttpNetworkRequest::Priority pri, const QUrl &newUrl = QUrl());
- QHttpNetworkRequestPrivate(const QHttpNetworkRequestPrivate &other);
- ~QHttpNetworkRequestPrivate();
- bool operator==(const QHttpNetworkRequestPrivate &other) const;
- QByteArray methodName() const;
- QByteArray uri(bool throughProxy) const;
-
- static QByteArray header(const QHttpNetworkRequest &request, bool throughProxy);
-
- QHttpNetworkRequest::Operation operation;
- QHttpNetworkRequest::Priority priority;
- mutable QIODevice *data;
- bool autoDecompress;
-};
-
-QHttpNetworkRequestPrivate::QHttpNetworkRequestPrivate(QHttpNetworkRequest::Operation op,
- QHttpNetworkRequest::Priority pri, const QUrl &newUrl)
- : QHttpNetworkHeaderPrivate(newUrl), operation(op), priority(pri), data(0),
- autoDecompress(false)
-{
-}
-
-QHttpNetworkRequestPrivate::QHttpNetworkRequestPrivate(const QHttpNetworkRequestPrivate &other)
- : QHttpNetworkHeaderPrivate(other)
-{
- operation = other.operation;
- priority = other.priority;
- data = other.data;
- autoDecompress = other.autoDecompress;
-}
-
-QHttpNetworkRequestPrivate::~QHttpNetworkRequestPrivate()
-{
-}
-
-bool QHttpNetworkRequestPrivate::operator==(const QHttpNetworkRequestPrivate &other) const
-{
- return QHttpNetworkHeaderPrivate::operator==(other)
- && (operation == other.operation)
- && (data == other.data);
-}
-
-QByteArray QHttpNetworkRequestPrivate::methodName() const
-{
- QByteArray ba;
- switch (operation) {
- case QHttpNetworkRequest::Options:
- ba += "OPTIONS";
- break;
- case QHttpNetworkRequest::Get:
- ba += "GET";
- break;
- case QHttpNetworkRequest::Head:
- ba += "HEAD";
- break;
- case QHttpNetworkRequest::Post:
- ba += "POST";
- break;
- case QHttpNetworkRequest::Put:
- ba += "PUT";
- break;
- case QHttpNetworkRequest::Delete:
- ba += "DELETE";
- break;
- case QHttpNetworkRequest::Trace:
- ba += "TRACE";
- break;
- case QHttpNetworkRequest::Connect:
- ba += "CONNECT";
- break;
- default:
- break;
- }
- return ba;
-}
-
-QByteArray QHttpNetworkRequestPrivate::uri(bool throughProxy) const
-{
- QUrl::FormattingOptions format(QUrl::RemoveFragment);
-
- // for POST, query data is send as content
- if (operation == QHttpNetworkRequest::Post && !data)
- format |= QUrl::RemoveQuery;
- // for requests through proxy, the Request-URI contains full url
- if (throughProxy)
- format |= QUrl::RemoveUserInfo;
- else
- format |= QUrl::RemoveScheme | QUrl::RemoveAuthority;
- QByteArray uri = url.toEncoded(format);
- if (uri.isEmpty() || (throughProxy && url.path().isEmpty()))
- uri += '/';
- return uri;
-}
-
-QByteArray QHttpNetworkRequestPrivate::header(const QHttpNetworkRequest &request, bool throughProxy)
-{
- QByteArray ba = request.d->methodName();
- QByteArray uri = request.d->uri(throughProxy);
- ba += " " + uri;
-
- QString majorVersion = QString::number(request.majorVersion());
- QString minorVersion = QString::number(request.minorVersion());
- ba += " HTTP/" + majorVersion.toLatin1() + "." + minorVersion.toLatin1() + "\r\n";
-
- QList<QPair<QByteArray, QByteArray> > fields = request.header();
- QList<QPair<QByteArray, QByteArray> >::const_iterator it = fields.constBegin();
- for (; it != fields.constEnd(); ++it)
- ba += it->first + ": " + it->second + "\r\n";
- if (request.d->operation == QHttpNetworkRequest::Post) {
- // add content type, if not set in the request
- if (request.headerField("content-type").isEmpty())
- ba += "Content-Type: application/x-www-form-urlencoded\r\n";
- if (!request.d->data && request.d->url.hasQuery()) {
- QByteArray query = request.d->url.encodedQuery();
- ba += "Content-Length: "+ QByteArray::number(query.size()) + "\r\n";
- ba += "\r\n";
- ba += query;
- } else {
- ba += "\r\n";
- }
- } else {
- ba += "\r\n";
- }
- return ba;
-}
-
-class QHttpNetworkReplyPrivate : public QObjectPrivate, public QHttpNetworkHeaderPrivate
-{
-public:
- QHttpNetworkReplyPrivate(const QUrl &newUrl = QUrl());
- ~QHttpNetworkReplyPrivate();
- qint64 readStatus(QAbstractSocket *socket);
- void parseStatus(const QByteArray &status);
- qint64 readHeader(QAbstractSocket *socket);
- void parseHeader(const QByteArray &header);
- qint64 readBody(QAbstractSocket *socket, QIODevice *out);
- bool findChallenge(bool forProxy, QByteArray &challenge) const;
- QAuthenticatorPrivate::Method authenticationMethod(bool isProxy) const;
- void clear();
-
- qint64 transferRaw(QIODevice *in, QIODevice *out, qint64 size);
- qint64 transferChunked(QIODevice *in, QIODevice *out);
- qint64 getChunkSize(QIODevice *in, qint64 *chunkSize);
-
- qint64 bytesAvailable() const;
- bool isChunked();
- bool connectionCloseEnabled();
- bool isGzipped();
-#ifndef QT_NO_COMPRESS
- bool gzipCheckHeader(QByteArray &content, int &pos);
- int gunzipBodyPartially(QByteArray &compressed, QByteArray &inflated);
-#endif
- void removeAutoDecompressHeader();
-
- enum ReplyState {
- NothingDoneState,
- ReadingStatusState,
- ReadingHeaderState,
- ReadingDataState,
- AllDoneState
- } state;
-
- QHttpNetworkRequest request;
- int statusCode;
- int majorVersion;
- int minorVersion;
- QString errorString;
- QString reasonPhrase;
- qint64 bodyLength;
- qint64 contentRead;
- qint64 totalProgress;
- QByteArray fragment;
- qint64 currentChunkSize;
- qint64 currentChunkRead;
- QPointer<QHttpNetworkConnection> connection;
- bool initInflate;
- bool streamEnd;
-#ifndef QT_NO_COMPRESS
- z_stream inflateStrm;
-#endif
- bool autoDecompress;
-
- QByteArray responseData; // uncompressed body
- QByteArray compressedData; // compressed body (temporary)
- QBuffer requestDataBuffer;
- bool requestIsBuffering;
- bool requestIsPrepared;
-};
-
-QHttpNetworkReplyPrivate::QHttpNetworkReplyPrivate(const QUrl &newUrl)
- : QHttpNetworkHeaderPrivate(newUrl), state(NothingDoneState), statusCode(100),
- majorVersion(0), minorVersion(0), bodyLength(0), contentRead(0), totalProgress(0),
- currentChunkSize(0), currentChunkRead(0), connection(0), initInflate(false),
- autoDecompress(false), requestIsBuffering(false), requestIsPrepared(false)
-{
-}
-
-QHttpNetworkReplyPrivate::~QHttpNetworkReplyPrivate()
-{
-}
-
-void QHttpNetworkReplyPrivate::clear()
-{
- state = NothingDoneState;
- statusCode = 100;
- bodyLength = 0;
- contentRead = 0;
- totalProgress = 0;
- currentChunkSize = 0;
- currentChunkRead = 0;
- connection = 0;
-#ifndef QT_NO_COMPRESS
- if (initInflate)
- inflateEnd(&inflateStrm);
-#endif
- initInflate = false;
- streamEnd = false;
- autoDecompress = false;
- fields.clear();
-}
-
-// QHttpNetworkReplyPrivate
-qint64 QHttpNetworkReplyPrivate::bytesAvailable() const
-{
- return (state != ReadingDataState ? 0 : fragment.size());
-}
-
-bool QHttpNetworkReplyPrivate::isGzipped()
-{
- QByteArray encoding = headerField("content-encoding");
- return encoding.toLower() == "gzip";
-}
-
-void QHttpNetworkReplyPrivate::removeAutoDecompressHeader()
-{
- // The header "Content-Encoding = gzip" is retained.
- // Content-Length is removed since the actual one send by the server is for compressed data
- QByteArray name("content-length");
- QByteArray lowerName = name.toLower();
- QList<QPair<QByteArray, QByteArray> >::Iterator it = fields.begin(),
- end = fields.end();
- while (it != end) {
- if (name == it->first.toLower()) {
- fields.erase(it);
- break;
- }
- ++it;
- }
-
-}
-
-bool QHttpNetworkReplyPrivate::findChallenge(bool forProxy, QByteArray &challenge) const
-{
- challenge.clear();
- // find out the type of authentication protocol requested.
- QByteArray header = forProxy ? "proxy-authenticate" : "www-authenticate";
- // pick the best protocol (has to match parsing in QAuthenticatorPrivate)
- QList<QByteArray> challenges = headerFieldValues(header);
- for (int i = 0; i<challenges.size(); i++) {
- QByteArray line = challenges.at(i);
- if (!line.toLower().startsWith("negotiate"))
- challenge = line;
- }
- return !challenge.isEmpty();
-}
-
-QAuthenticatorPrivate::Method QHttpNetworkReplyPrivate::authenticationMethod(bool isProxy) const
-{
- // The logic is same as the one used in void QAuthenticatorPrivate::parseHttpResponse()
- QAuthenticatorPrivate::Method method = QAuthenticatorPrivate::None;
- QByteArray header = isProxy ? "proxy-authenticate" : "www-authenticate";
- QList<QByteArray> challenges = headerFieldValues(header);
- for (int i = 0; i<challenges.size(); i++) {
- QByteArray line = challenges.at(i).trimmed().toLower();
- if (method < QAuthenticatorPrivate::Basic
- && line.startsWith("basic")) {
- method = QAuthenticatorPrivate::Basic;
- } else if (method < QAuthenticatorPrivate::Ntlm
- && line.startsWith("ntlm")) {
- method = QAuthenticatorPrivate::Ntlm;
- } else if (method < QAuthenticatorPrivate::DigestMd5
- && line.startsWith("digest")) {
- method = QAuthenticatorPrivate::DigestMd5;
- }
- }
- return method;
-}
-
-#ifndef QT_NO_COMPRESS
-bool QHttpNetworkReplyPrivate::gzipCheckHeader(QByteArray &content, int &pos)
-{
- int method = 0; // method byte
- int flags = 0; // flags byte
- bool ret = false;
-
- // Assure two bytes in the buffer so we can peek ahead -- handle case
- // where first byte of header is at the end of the buffer after the last
- // gzip segment
- pos = -1;
- QByteArray &body = content;
- int maxPos = body.size()-1;
- if (maxPos < 1) {
- return ret;
- }
-
- // Peek ahead to check the gzip magic header
- if (body[0] != char(gz_magic[0]) ||
- body[1] != char(gz_magic[1])) {
- return ret;
- }
- pos += 2;
- // Check the rest of the gzip header
- if (++pos <= maxPos)
- method = body[pos];
- if (pos++ <= maxPos)
- flags = body[pos];
- if (method != Z_DEFLATED || (flags & RESERVED) != 0) {
- return ret;
- }
-
- // Discard time, xflags and OS code:
- pos += 6;
- if (pos > maxPos)
- return ret;
- if ((flags & EXTRA_FIELD) && ((pos+2) <= maxPos)) { // skip the extra field
- unsigned len = (unsigned)body[++pos];
- len += ((unsigned)body[++pos])<<8;
- pos += len;
- if (pos > maxPos)
- return ret;
- }
- if ((flags & ORIG_NAME) != 0) { // skip the original file name
- while(++pos <= maxPos && body[pos]) {}
- }
- if ((flags & COMMENT) != 0) { // skip the .gz file comment
- while(++pos <= maxPos && body[pos]) {}
- }
- if ((flags & HEAD_CRC) != 0) { // skip the header crc
- pos += 2;
- if (pos > maxPos)
- return ret;
- }
- ret = (pos < maxPos); // return failed, if no more bytes left
- return ret;
-}
-
-int QHttpNetworkReplyPrivate::gunzipBodyPartially(QByteArray &compressed, QByteArray &inflated)
-{
- int ret = Z_DATA_ERROR;
- unsigned have;
- unsigned char out[CHUNK];
- int pos = -1;
-
- if (!initInflate) {
- // check the header
- if (!gzipCheckHeader(compressed, pos))
- return ret;
- // allocate inflate state
- inflateStrm.zalloc = Z_NULL;
- inflateStrm.zfree = Z_NULL;
- inflateStrm.opaque = Z_NULL;
- inflateStrm.avail_in = 0;
- inflateStrm.next_in = Z_NULL;
- ret = inflateInit2(&inflateStrm, -MAX_WBITS);
- if (ret != Z_OK)
- return ret;
- initInflate = true;
- streamEnd = false;
- }
-
- //remove the header.
- compressed.remove(0, pos+1);
- // expand until deflate stream ends
- inflateStrm.next_in = (unsigned char *)compressed.data();
- inflateStrm.avail_in = compressed.size();
- do {
- inflateStrm.avail_out = sizeof(out);
- inflateStrm.next_out = out;
- ret = inflate(&inflateStrm, Z_NO_FLUSH);
- switch (ret) {
- case Z_NEED_DICT:
- ret = Z_DATA_ERROR;
- // and fall through
- case Z_DATA_ERROR:
- case Z_MEM_ERROR:
- inflateEnd(&inflateStrm);
- initInflate = false;
- return ret;
- }
- have = sizeof(out) - inflateStrm.avail_out;
- inflated.append(QByteArray((const char *)out, have));
- } while (inflateStrm.avail_out == 0);
- // clean up and return
- if (ret <= Z_ERRNO || ret == Z_STREAM_END) {
- inflateEnd(&inflateStrm);
- initInflate = false;
- }
- streamEnd = (ret == Z_STREAM_END);
- return ret;
-}
-#endif
-
-qint64 QHttpNetworkReplyPrivate::readStatus(QAbstractSocket *socket)
-{
- qint64 bytes = 0;
- char c;
-
- while (socket->bytesAvailable()) {
- // allow both CRLF & LF (only) line endings
- if (socket->peek(&c, 1) == 1 && c == '\n') {
- bytes += socket->read(&c, 1); // read the "n"
- // remove the CR at the end
- if (fragment.endsWith('\r')) {
- fragment.truncate(fragment.length()-1);
- }
- parseStatus(fragment);
- state = ReadingHeaderState;
- fragment.clear(); // next fragment
- break;
- } else {
- c = 0;
- bytes += socket->read(&c, 1);
- fragment.append(c);
- }
- }
- return bytes;
-}
-
-void QHttpNetworkReplyPrivate::parseStatus(const QByteArray &status)
-{
- const QByteArrayMatcher sp(" ");
- int i = sp.indexIn(status);
- const QByteArray version = status.mid(0, i);
- int j = sp.indexIn(status, i + 1);
- const QByteArray code = status.mid(i + 1, j - i - 1);
- const QByteArray reason = status.mid(j + 1, status.count() - j);
-
- const QByteArrayMatcher slash("/");
- int k = slash.indexIn(version);
- const QByteArrayMatcher dot(".");
- int l = dot.indexIn(version, k);
- const QByteArray major = version.mid(k + 1, l - k - 1);
- const QByteArray minor = version.mid(l + 1, version.count() - l);
-
- majorVersion = QString::fromAscii(major.constData()).toInt();
- minorVersion = QString::fromAscii(minor.constData()).toInt();
- statusCode = QString::fromAscii(code.constData()).toInt();
- reasonPhrase = QString::fromAscii(reason.constData());
-}
-
-qint64 QHttpNetworkReplyPrivate::readHeader(QAbstractSocket *socket)
-{
- qint64 bytes = 0;
- char crlfcrlf[5];
- crlfcrlf[4] = '\0';
- char c = 0;
- bool allHeaders = false;
- while (!allHeaders && socket->bytesAvailable()) {
- if (socket->peek(&c, 1) == 1 && c == '\n') {
- // check for possible header endings. As per HTTP rfc,
- // the header endings will be marked by CRLFCRLF. But
- // we will allow CRLFLF, LFLF & CRLFCRLF
- if (fragment.endsWith("\n\r") || fragment.endsWith('\n'))
- allHeaders = true;
- }
- bytes += socket->read(&c, 1);
- fragment.append(c);
- }
- // we received all headers now parse them
- if (allHeaders) {
- parseHeader(fragment);
- state = ReadingDataState;
- fragment.clear(); // next fragment
- bodyLength = contentLength(); // cache the length
- }
- return bytes;
-}
-
-void QHttpNetworkReplyPrivate::parseHeader(const QByteArray &header)
-{
- // see rfc2616, sec 4 for information about HTTP/1.1 headers.
- // allows relaxed parsing here, accepts both CRLF & LF line endings
- const QByteArrayMatcher lf("\n");
- const QByteArrayMatcher colon(":");
- int i = 0;
- while (i < header.count()) {
- int j = colon.indexIn(header, i); // field-name
- if (j == -1)
- break;
- const QByteArray field = header.mid(i, j - i).trimmed();
- j++;
- // any number of LWS is allowed before and after the value
- QByteArray value;
- do {
- i = lf.indexIn(header, j);
- if (i == -1)
- break;
- if (!value.isEmpty())
- value += ' ';
- // check if we have CRLF or only LF
- bool hasCR = (i && header[i-1] == '\r');
- int length = i -(hasCR ? 1: 0) - j;
- value += header.mid(j, length).trimmed();
- j = ++i;
- } while (i < header.count() && (header.at(i) == ' ' || header.at(i) == '\t'));
- if (i == -1)
- break; // something is wrong
-
- fields.append(qMakePair(field, value));
- }
-}
-
-bool QHttpNetworkReplyPrivate::isChunked()
-{
- return headerField("transfer-encoding").toLower().contains("chunked");
-}
-
-bool QHttpNetworkReplyPrivate::connectionCloseEnabled()
-{
- return (headerField("connection").toLower().contains("close") ||
- headerField("proxy-connection").toLower().contains("close"));
-}
-
-qint64 QHttpNetworkReplyPrivate::readBody(QAbstractSocket *socket, QIODevice *out)
-{
- qint64 bytes = 0;
- if (isChunked()) {
- bytes += transferChunked(socket, out); // chunked transfer encoding (rfc 2616, sec 3.6)
- } else if (bodyLength > 0) { // we have a Content-Length
- bytes += transferRaw(socket, out, bodyLength - contentRead);
- if (contentRead + bytes == bodyLength)
- state = AllDoneState;
- } else {
- bytes += transferRaw(socket, out, socket->bytesAvailable());
- }
- if (state == AllDoneState)
- socket->readAll(); // Read the rest to clean (CRLF)
- contentRead += bytes;
- return bytes;
-}
-
-qint64 QHttpNetworkReplyPrivate::transferRaw(QIODevice *in, QIODevice *out, qint64 size)
-{
- qint64 bytes = 0;
- Q_ASSERT(in);
- Q_ASSERT(out);
-
- int toBeRead = qMin<qint64>(128*1024, qMin<qint64>(size, in->bytesAvailable()));
- QByteArray raw(toBeRead, 0);
- while (size > 0) {
- qint64 read = in->read(raw.data(), raw.size());
- if (read == 0)
- return bytes;
- // ### error checking here
- qint64 written = out->write(raw.data(), read);
- if (written == 0)
- return bytes;
- if (read != written)
- qDebug() << "### read" << read << "written" << written;
- bytes += read;
- size -= read;
- out->waitForBytesWritten(-1); // throttle
- }
- return bytes;
-
-}
-
-qint64 QHttpNetworkReplyPrivate::transferChunked(QIODevice *in, QIODevice *out)
-{
- qint64 bytes = 0;
- while (in->bytesAvailable()) { // while we can read from input
- // if we are done with the current chunk, get the size of the new chunk
- if (currentChunkRead >= currentChunkSize) {
- currentChunkSize = 0;
- currentChunkRead = 0;
- if (bytes) {
- char crlf[2];
- bytes += in->read(crlf, 2); // read the "\r\n" after the chunk
- }
- bytes += getChunkSize(in, &currentChunkSize);
- if (currentChunkSize == -1)
- break;
- }
- // if the chunk size is 0, end of the stream
- if (currentChunkSize == 0) {
- state = AllDoneState;
- break;
- }
- // otherwise, read data
- qint64 readSize = qMin(in->bytesAvailable(), currentChunkSize - currentChunkRead);
- QByteArray buffer(readSize, 0);
- qint64 read = in->read(buffer.data(), readSize);
- bytes += read;
- currentChunkRead += read;
- qint64 written = out->write(buffer);
- Q_UNUSED(written); // Avoid compile warning when building release
- Q_ASSERT(read == written);
- // ### error checking here
- out->waitForBytesWritten(-1);
- }
- return bytes;
-}
-
-qint64 QHttpNetworkReplyPrivate::getChunkSize(QIODevice *in, qint64 *chunkSize)
-{
- qint64 bytes = 0;
- char crlf[2];
- *chunkSize = -1;
- int bytesAvailable = in->bytesAvailable();
- while (bytesAvailable > bytes) {
- qint64 sniffedBytes = in->peek(crlf, 2);
- int fragmentSize = fragment.size();
- // check the next two bytes for a "\r\n", skip blank lines
- if ((fragmentSize && sniffedBytes == 2 && crlf[0] == '\r' && crlf[1] == '\n')
- ||(fragmentSize > 1 && fragment.endsWith('\r') && crlf[0] == '\n'))
- {
- bytes += in->read(crlf, 1); // read the \r or \n
- if (crlf[0] == '\r')
- bytes += in->read(crlf, 1); // read the \n
- bool ok = false;
- // ignore the chunk-extension
- fragment = fragment.mid(0, fragment.indexOf(';')).trimmed();
- *chunkSize = fragment.toLong(&ok, 16);
- fragment.clear();
- break; // size done
- } else {
- // read the fragment to the buffer
- char c = 0;
- bytes += in->read(&c, 1);
- fragment.append(c);
- }
- }
- return bytes;
-}
-
-// QHttpNetworkConnectionPrivate
-
-typedef QPair<QHttpNetworkRequest, QHttpNetworkReply*> HttpMessagePair;
-
-class QHttpNetworkConnectionPrivate : public QObjectPrivate
-{
- Q_DECLARE_PUBLIC(QHttpNetworkConnection)
-public:
- QHttpNetworkConnectionPrivate(const QString &hostName, quint16 port, bool encrypt);
- ~QHttpNetworkConnectionPrivate();
- void init();
- void connectSignals(QAbstractSocket *socket);
-
- enum SocketState {
- IdleState = 0, // ready to send request
- ConnectingState = 1, // connecting to host
- WritingState = 2, // writing the data
- WaitingState = 4, // waiting for reply
- ReadingState = 8, // reading the reply
- Wait4AuthState = 0x10, // blocked for send till the current authentication slot is done
- BusyState = (ConnectingState|WritingState|WaitingState|ReadingState|Wait4AuthState)
- };
-
- enum { ChunkSize = 4096 };
-
- int indexOf(QAbstractSocket *socket) const;
- bool isSocketBusy(QAbstractSocket *socket) const;
- bool isSocketWriting(QAbstractSocket *socket) const;
- bool isSocketWaiting(QAbstractSocket *socket) const;
- bool isSocketReading(QAbstractSocket *socket) const;
-
- QHttpNetworkReply *queueRequest(const QHttpNetworkRequest &request);
- void unqueueRequest(QAbstractSocket *socket);
- void prepareRequest(HttpMessagePair &request);
- bool sendRequest(QAbstractSocket *socket);
- void receiveReply(QAbstractSocket *socket, QHttpNetworkReply *reply);
- void resendCurrentRequest(QAbstractSocket *socket);
- void closeChannel(int channel);
- void copyCredentials(int fromChannel, QAuthenticator *auth, bool isProxy);
-
- // private slots
- void _q_bytesWritten(qint64 bytes); // proceed sending
- void _q_readyRead(); // pending data to read
- void _q_disconnected(); // disconnected from host
- void _q_startNextRequest(); // send the next request from the queue
- void _q_restartPendingRequest(); // send the currently blocked request
- void _q_connected(); // start sending request
- void _q_error(QAbstractSocket::SocketError); // error from socket
-#ifndef QT_NO_NETWORKPROXY
- void _q_proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *auth); // from transparent proxy
-#endif
- void _q_dataReadyReadNoBuffer();
- void _q_dataReadyReadBuffer();
-
- void createAuthorization(QAbstractSocket *socket, QHttpNetworkRequest &request);
- bool ensureConnection(QAbstractSocket *socket);
- QString errorDetail(QNetworkReply::NetworkError errorCode, QAbstractSocket *socket);
- void eraseData(QHttpNetworkReply *reply);
-#ifndef QT_NO_COMPRESS
- bool expand(QAbstractSocket *socket, QHttpNetworkReply *reply, bool dataComplete);
-#endif
- void bufferData(HttpMessagePair &request);
- void removeReply(QHttpNetworkReply *reply);
-
- QString hostName;
- quint16 port;
- bool encrypt;
-
- struct Channel {
- QAbstractSocket *socket;
- SocketState state;
- QHttpNetworkRequest request; // current request
- QHttpNetworkReply *reply; // current reply for this request
- qint64 written;
- qint64 bytesTotal;
- bool resendCurrent;
- int lastStatus; // last status received on this channel
- bool pendingEncrypt; // for https (send after encrypted)
- int reconnectAttempts; // maximum 2 reconnection attempts
- QAuthenticatorPrivate::Method authMehtod;
- QAuthenticatorPrivate::Method proxyAuthMehtod;
- QAuthenticator authenticator;
- QAuthenticator proxyAuthenticator;
-#ifndef QT_NO_OPENSSL
- bool ignoreSSLErrors;
-#endif
- Channel() :state(IdleState), reply(0), written(0), bytesTotal(0), resendCurrent(false), reconnectAttempts(2),
- authMehtod(QAuthenticatorPrivate::None), proxyAuthMehtod(QAuthenticatorPrivate::None)
-#ifndef QT_NO_OPENSSL
- , ignoreSSLErrors(false)
-#endif
- {}
- };
- static const int channelCount;
- Channel channels[2]; // maximum of 2 socket connections to the server
- bool pendingAuthSignal; // there is an incomplete authentication signal
- bool pendingProxyAuthSignal; // there is an incomplete proxy authentication signal
-
- void appendData(QHttpNetworkReply &reply, const QByteArray &fragment, bool compressed);
- qint64 bytesAvailable(const QHttpNetworkReply &reply, bool compressed = false) const;
- qint64 read(QHttpNetworkReply &reply, QByteArray &data, qint64 maxSize, bool compressed);
- void emitReplyError(QAbstractSocket *socket, QHttpNetworkReply *reply, QNetworkReply::NetworkError errorCode);
- bool handleAuthenticateChallenge(QAbstractSocket *socket, QHttpNetworkReply *reply, bool isProxy, bool &resend);
- void allDone(QAbstractSocket *socket, QHttpNetworkReply *reply);
- void handleStatus(QAbstractSocket *socket, QHttpNetworkReply *reply);
- inline bool emitSignals(QHttpNetworkReply *reply);
- inline bool expectContent(QHttpNetworkReply *reply);
-
-#ifndef QT_NO_OPENSSL
- void _q_encrypted(); // start sending request (https)
- void _q_sslErrors(const QList<QSslError> &errors); // ssl errors from the socket
- QSslConfiguration sslConfiguration(const QHttpNetworkReply &reply) const;
-#endif
-#ifndef QT_NO_NETWORKPROXY
- QNetworkProxy networkProxy;
-#endif
- //The request queues
- QList<HttpMessagePair> highPriorityQueue;
- QList<HttpMessagePair> lowPriorityQueue;
-};
+QT_BEGIN_NAMESPACE
const int QHttpNetworkConnectionPrivate::channelCount = 2;
@@ -2150,235 +1284,6 @@ QNetworkProxy QHttpNetworkConnection::transparentProxy() const
}
#endif
-// QHttpNetworkRequest
-
-QHttpNetworkRequest::QHttpNetworkRequest(const QUrl &url, Operation operation, Priority priority)
- : d(new QHttpNetworkRequestPrivate(operation, priority, url))
-{
-}
-
-QHttpNetworkRequest::QHttpNetworkRequest(const QHttpNetworkRequest &other)
- : QHttpNetworkHeader(other), d(other.d)
-{
-}
-
-QHttpNetworkRequest::~QHttpNetworkRequest()
-{
-}
-
-QUrl QHttpNetworkRequest::url() const
-{
- return d->url;
-}
-void QHttpNetworkRequest::setUrl(const QUrl &url)
-{
- d->url = url;
-}
-
-qint64 QHttpNetworkRequest::contentLength() const
-{
- return d->contentLength();
-}
-
-void QHttpNetworkRequest::setContentLength(qint64 length)
-{
- d->setContentLength(length);
-}
-
-QList<QPair<QByteArray, QByteArray> > QHttpNetworkRequest::header() const
-{
- return d->fields;
-}
-
-QByteArray QHttpNetworkRequest::headerField(const QByteArray &name, const QByteArray &defaultValue) const
-{
- return d->headerField(name, defaultValue);
-}
-
-void QHttpNetworkRequest::setHeaderField(const QByteArray &name, const QByteArray &data)
-{
- d->setHeaderField(name, data);
-}
-
-QHttpNetworkRequest &QHttpNetworkRequest::operator=(const QHttpNetworkRequest &other)
-{
- d = other.d;
- return *this;
-}
-
-bool QHttpNetworkRequest::operator==(const QHttpNetworkRequest &other) const
-{
- return d->operator==(*other.d);
-}
-
-QHttpNetworkRequest::Operation QHttpNetworkRequest::operation() const
-{
- return d->operation;
-}
-
-void QHttpNetworkRequest::setOperation(Operation operation)
-{
- d->operation = operation;
-}
-
-QHttpNetworkRequest::Priority QHttpNetworkRequest::priority() const
-{
- return d->priority;
-}
-
-void QHttpNetworkRequest::setPriority(Priority priority)
-{
- d->priority = priority;
-}
-
-QIODevice *QHttpNetworkRequest::data() const
-{
- return d->data;
-}
-
-void QHttpNetworkRequest::setData(QIODevice *data)
-{
- d->data = data;
-}
-
-int QHttpNetworkRequest::majorVersion() const
-{
- return 1;
-}
-
-int QHttpNetworkRequest::minorVersion() const
-{
- return 1;
-}
-
-// QHttpNetworkReply
-
-QHttpNetworkReply::QHttpNetworkReply(const QUrl &url, QObject *parent)
- : QObject(*new QHttpNetworkReplyPrivate(url), parent)
-{
-}
-
-QHttpNetworkReply::~QHttpNetworkReply()
-{
- Q_D(QHttpNetworkReply);
- if (d->connection) {
- d->connection->d_func()->removeReply(this);
- }
-}
-
-QUrl QHttpNetworkReply::url() const
-{
- return d_func()->url;
-}
-void QHttpNetworkReply::setUrl(const QUrl &url)
-{
- Q_D(QHttpNetworkReply);
- d->url = url;
-}
-
-qint64 QHttpNetworkReply::contentLength() const
-{
- return d_func()->contentLength();
-}
-
-void QHttpNetworkReply::setContentLength(qint64 length)
-{
- Q_D(QHttpNetworkReply);
- d->setContentLength(length);
-}
-
-QList<QPair<QByteArray, QByteArray> > QHttpNetworkReply::header() const
-{
- return d_func()->fields;
-}
-
-QByteArray QHttpNetworkReply::headerField(const QByteArray &name, const QByteArray &defaultValue) const
-{
- return d_func()->headerField(name, defaultValue);
-}
-
-void QHttpNetworkReply::setHeaderField(const QByteArray &name, const QByteArray &data)
-{
- Q_D(QHttpNetworkReply);
- d->setHeaderField(name, data);
-}
-
-void QHttpNetworkReply::parseHeader(const QByteArray &header)
-{
- Q_D(QHttpNetworkReply);
- d->parseHeader(header);
-}
-
-QHttpNetworkRequest QHttpNetworkReply::request() const
-{
- return d_func()->request;
-}
-
-void QHttpNetworkReply::setRequest(const QHttpNetworkRequest &request)
-{
- Q_D(QHttpNetworkReply);
- d->request = request;
-}
-
-int QHttpNetworkReply::statusCode() const
-{
- return d_func()->statusCode;
-}
-
-void QHttpNetworkReply::setStatusCode(int code)
-{
- Q_D(QHttpNetworkReply);
- d->statusCode = code;
-}
-
-QString QHttpNetworkReply::errorString() const
-{
- return d_func()->errorString;
-}
-
-QString QHttpNetworkReply::reasonPhrase() const
-{
- return d_func()->reasonPhrase;
-}
-
-void QHttpNetworkReply::setErrorString(const QString &error)
-{
- Q_D(QHttpNetworkReply);
- d->errorString = error;
-}
-
-int QHttpNetworkReply::majorVersion() const
-{
- return d_func()->majorVersion;
-}
-
-int QHttpNetworkReply::minorVersion() const
-{
- return d_func()->minorVersion;
-}
-
-qint64 QHttpNetworkReply::bytesAvailable() const
-{
- Q_D(const QHttpNetworkReply);
- if (d->connection)
- return d->connection->d_func()->bytesAvailable(*this);
- else
- return -1;
-}
-
-QByteArray QHttpNetworkReply::read(qint64 maxSize)
-{
- Q_D(QHttpNetworkReply);
- QByteArray data;
- if (d->connection)
- d->connection->d_func()->read(*this, data, maxSize, false);
- return data;
-}
-
-bool QHttpNetworkReply::isFinished() const
-{
- return d_func()->state == QHttpNetworkReplyPrivate::AllDoneState;
-}
// SSL support below
#ifndef QT_NO_OPENSSL
@@ -2433,27 +1338,7 @@ void QHttpNetworkConnection::ignoreSslErrors(int channel)
}
}
-QSslConfiguration QHttpNetworkReply::sslConfiguration() const
-{
- Q_D(const QHttpNetworkReply);
- if (d->connection)
- return d->connection->d_func()->sslConfiguration(*this);
- return QSslConfiguration();
-}
-void QHttpNetworkReply::setSslConfiguration(const QSslConfiguration &config)
-{
- Q_D(QHttpNetworkReply);
- if (d->connection)
- d->connection->setSslConfiguration(config);
-}
-
-void QHttpNetworkReply::ignoreSslErrors()
-{
- Q_D(QHttpNetworkReply);
- if (d->connection)
- d->connection->ignoreSslErrors();
-}
#endif //QT_NO_OPENSSL
diff --git a/src/network/access/qhttpnetworkconnection_p.h b/src/network/access/qhttpnetworkconnection_p.h
index 8dbcb3d..09bd459 100644
--- a/src/network/access/qhttpnetworkconnection_p.h
+++ b/src/network/access/qhttpnetworkconnection_p.h
@@ -56,6 +56,16 @@
#include <QtNetwork/qnetworkreply.h>
#include <QtNetwork/qabstractsocket.h>
+#include <private/qobject_p.h>
+#include <qauthenticator.h>
+#include <qnetworkproxy.h>
+#include <qbuffer.h>
+
+#include <private/qhttpnetworkheader_p.h>
+#include <private/qhttpnetworkrequest_p.h>
+#include <private/qhttpnetworkreply_p.h>
+
+
#ifndef QT_NO_HTTP
#ifndef QT_NO_OPENSSL
@@ -145,144 +155,137 @@ private:
#endif
};
-class Q_AUTOTEST_EXPORT QHttpNetworkHeader
-{
-public:
- virtual ~QHttpNetworkHeader() {};
- virtual QUrl url() const = 0;
- virtual void setUrl(const QUrl &url) = 0;
- virtual int majorVersion() const = 0;
- virtual int minorVersion() const = 0;
- virtual qint64 contentLength() const = 0;
- virtual void setContentLength(qint64 length) = 0;
- virtual QList<QPair<QByteArray, QByteArray> > header() const = 0;
- virtual QByteArray headerField(const QByteArray &name, const QByteArray &defaultValue = QByteArray()) const = 0;
- virtual void setHeaderField(const QByteArray &name, const QByteArray &data) = 0;
-};
+// private classes
+typedef QPair<QHttpNetworkRequest, QHttpNetworkReply*> HttpMessagePair;
+
-class QHttpNetworkRequestPrivate;
-class Q_AUTOTEST_EXPORT QHttpNetworkRequest: public QHttpNetworkHeader
+class QHttpNetworkConnectionPrivate : public QObjectPrivate
{
+ Q_DECLARE_PUBLIC(QHttpNetworkConnection)
public:
- enum Operation {
- Options,
- Get,
- Head,
- Post,
- Put,
- Delete,
- Trace,
- Connect
+ QHttpNetworkConnectionPrivate(const QString &hostName, quint16 port, bool encrypt);
+ ~QHttpNetworkConnectionPrivate();
+ void init();
+ void connectSignals(QAbstractSocket *socket);
+
+ enum SocketState {
+ IdleState = 0, // ready to send request
+ ConnectingState = 1, // connecting to host
+ WritingState = 2, // writing the data
+ WaitingState = 4, // waiting for reply
+ ReadingState = 8, // reading the reply
+ Wait4AuthState = 0x10, // blocked for send till the current authentication slot is done
+ BusyState = (ConnectingState|WritingState|WaitingState|ReadingState|Wait4AuthState)
};
- enum Priority {
- HighPriority,
- NormalPriority,
- LowPriority
+ enum { ChunkSize = 4096 };
+
+ int indexOf(QAbstractSocket *socket) const;
+ bool isSocketBusy(QAbstractSocket *socket) const;
+ bool isSocketWriting(QAbstractSocket *socket) const;
+ bool isSocketWaiting(QAbstractSocket *socket) const;
+ bool isSocketReading(QAbstractSocket *socket) const;
+
+ QHttpNetworkReply *queueRequest(const QHttpNetworkRequest &request);
+ void unqueueRequest(QAbstractSocket *socket);
+ void prepareRequest(HttpMessagePair &request);
+ bool sendRequest(QAbstractSocket *socket);
+ void receiveReply(QAbstractSocket *socket, QHttpNetworkReply *reply);
+ void resendCurrentRequest(QAbstractSocket *socket);
+ void closeChannel(int channel);
+ void copyCredentials(int fromChannel, QAuthenticator *auth, bool isProxy);
+
+ // private slots
+ void _q_bytesWritten(qint64 bytes); // proceed sending
+ void _q_readyRead(); // pending data to read
+ void _q_disconnected(); // disconnected from host
+ void _q_startNextRequest(); // send the next request from the queue
+ void _q_restartPendingRequest(); // send the currently blocked request
+ void _q_connected(); // start sending request
+ void _q_error(QAbstractSocket::SocketError); // error from socket
+#ifndef QT_NO_NETWORKPROXY
+ void _q_proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *auth); // from transparent proxy
+#endif
+ void _q_dataReadyReadNoBuffer();
+ void _q_dataReadyReadBuffer();
+
+ void createAuthorization(QAbstractSocket *socket, QHttpNetworkRequest &request);
+ bool ensureConnection(QAbstractSocket *socket);
+ QString errorDetail(QNetworkReply::NetworkError errorCode, QAbstractSocket *socket);
+ void eraseData(QHttpNetworkReply *reply);
+#ifndef QT_NO_COMPRESS
+ bool expand(QAbstractSocket *socket, QHttpNetworkReply *reply, bool dataComplete);
+#endif
+ void bufferData(HttpMessagePair &request);
+ void removeReply(QHttpNetworkReply *reply);
+
+ QString hostName;
+ quint16 port;
+ bool encrypt;
+
+ struct Channel {
+ QAbstractSocket *socket;
+ SocketState state;
+ QHttpNetworkRequest request; // current request
+ QHttpNetworkReply *reply; // current reply for this request
+ qint64 written;
+ qint64 bytesTotal;
+ bool resendCurrent;
+ int lastStatus; // last status received on this channel
+ bool pendingEncrypt; // for https (send after encrypted)
+ int reconnectAttempts; // maximum 2 reconnection attempts
+ QAuthenticatorPrivate::Method authMehtod;
+ QAuthenticatorPrivate::Method proxyAuthMehtod;
+ QAuthenticator authenticator;
+ QAuthenticator proxyAuthenticator;
+#ifndef QT_NO_OPENSSL
+ bool ignoreSSLErrors;
+#endif
+ Channel() :state(IdleState), reply(0), written(0), bytesTotal(0), resendCurrent(false), reconnectAttempts(2),
+ authMehtod(QAuthenticatorPrivate::None), proxyAuthMehtod(QAuthenticatorPrivate::None)
+#ifndef QT_NO_OPENSSL
+ , ignoreSSLErrors(false)
+#endif
+ {}
};
-
- QHttpNetworkRequest(const QUrl &url = QUrl(), Operation operation = Get, Priority priority = NormalPriority);
- QHttpNetworkRequest(const QHttpNetworkRequest &other);
- virtual ~QHttpNetworkRequest();
- QHttpNetworkRequest &operator=(const QHttpNetworkRequest &other);
- bool operator==(const QHttpNetworkRequest &other) const;
-
- QUrl url() const;
- void setUrl(const QUrl &url);
-
- int majorVersion() const;
- int minorVersion() const;
-
- qint64 contentLength() const;
- void setContentLength(qint64 length);
-
- QList<QPair<QByteArray, QByteArray> > header() const;
- QByteArray headerField(const QByteArray &name, const QByteArray &defaultValue = QByteArray()) const;
- void setHeaderField(const QByteArray &name, const QByteArray &data);
-
- Operation operation() const;
- void setOperation(Operation operation);
-
- Priority priority() const;
- void setPriority(Priority priority);
-
- QIODevice *data() const;
- void setData(QIODevice *data);
-
-private:
- QSharedDataPointer<QHttpNetworkRequestPrivate> d;
- friend class QHttpNetworkRequestPrivate;
- friend class QHttpNetworkConnectionPrivate;
-};
-
-class QHttpNetworkReplyPrivate;
-class Q_AUTOTEST_EXPORT QHttpNetworkReply : public QObject, public QHttpNetworkHeader
-{
- Q_OBJECT
-public:
-
- explicit QHttpNetworkReply(const QUrl &url = QUrl(), QObject *parent = 0);
- virtual ~QHttpNetworkReply();
-
- QUrl url() const;
- void setUrl(const QUrl &url);
-
- int majorVersion() const;
- int minorVersion() const;
-
- qint64 contentLength() const;
- void setContentLength(qint64 length);
-
- QList<QPair<QByteArray, QByteArray> > header() const;
- QByteArray headerField(const QByteArray &name, const QByteArray &defaultValue = QByteArray()) const;
- void setHeaderField(const QByteArray &name, const QByteArray &data);
- void parseHeader(const QByteArray &header); // mainly for testing
-
- QHttpNetworkRequest request() const;
- void setRequest(const QHttpNetworkRequest &request);
-
- int statusCode() const;
- void setStatusCode(int code);
-
- QString errorString() const;
- void setErrorString(const QString &error);
-
- QString reasonPhrase() const;
-
- qint64 bytesAvailable() const;
- QByteArray read(qint64 maxSize = -1);
-
- bool isFinished() const;
+ static const int channelCount;
+ Channel channels[2]; // maximum of 2 socket connections to the server
+ bool pendingAuthSignal; // there is an incomplete authentication signal
+ bool pendingProxyAuthSignal; // there is an incomplete proxy authentication signal
+
+ void appendData(QHttpNetworkReply &reply, const QByteArray &fragment, bool compressed);
+ qint64 bytesAvailable(const QHttpNetworkReply &reply, bool compressed = false) const;
+ qint64 read(QHttpNetworkReply &reply, QByteArray &data, qint64 maxSize, bool compressed);
+ void emitReplyError(QAbstractSocket *socket, QHttpNetworkReply *reply, QNetworkReply::NetworkError errorCode);
+ bool handleAuthenticateChallenge(QAbstractSocket *socket, QHttpNetworkReply *reply, bool isProxy, bool &resend);
+ void allDone(QAbstractSocket *socket, QHttpNetworkReply *reply);
+ void handleStatus(QAbstractSocket *socket, QHttpNetworkReply *reply);
+ inline bool emitSignals(QHttpNetworkReply *reply);
+ inline bool expectContent(QHttpNetworkReply *reply);
#ifndef QT_NO_OPENSSL
- QSslConfiguration sslConfiguration() const;
- void setSslConfiguration(const QSslConfiguration &config);
- void ignoreSslErrors();
-
-Q_SIGNALS:
- void sslErrors(const QList<QSslError> &errors);
+ void _q_encrypted(); // start sending request (https)
+ void _q_sslErrors(const QList<QSslError> &errors); // ssl errors from the socket
+ QSslConfiguration sslConfiguration(const QHttpNetworkReply &reply) const;
#endif
-Q_SIGNALS:
- void readyRead();
- void finished();
- void finishedWithError(QNetworkReply::NetworkError errorCode, const QString &detail = QString());
- void headerChanged();
- void dataReadProgress(int done, int total);
- void dataSendProgress(int done, int total);
+#ifndef QT_NO_NETWORKPROXY
+ QNetworkProxy networkProxy;
+#endif
-private:
- Q_DECLARE_PRIVATE(QHttpNetworkReply)
- friend class QHttpNetworkConnection;
- friend class QHttpNetworkConnectionPrivate;
+ //The request queues
+ QList<HttpMessagePair> highPriorityQueue;
+ QList<HttpMessagePair> lowPriorityQueue;
};
+
+
QT_END_NAMESPACE
-Q_DECLARE_METATYPE(QHttpNetworkRequest)
+//Q_DECLARE_METATYPE(QHttpNetworkRequest)
//Q_DECLARE_METATYPE(QHttpNetworkReply)
#endif // QT_NO_HTTP
diff --git a/src/network/access/qhttpnetworkheader.cpp b/src/network/access/qhttpnetworkheader.cpp
new file mode 100644
index 0000000..6f7f6f7
--- /dev/null
+++ b/src/network/access/qhttpnetworkheader.cpp
@@ -0,0 +1,123 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the QtNetwork module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qhttpnetworkheader_p.h"
+
+
+QT_BEGIN_NAMESPACE
+
+QHttpNetworkHeaderPrivate::QHttpNetworkHeaderPrivate(const QUrl &newUrl)
+ :url(newUrl)
+{
+}
+
+QHttpNetworkHeaderPrivate::QHttpNetworkHeaderPrivate(const QHttpNetworkHeaderPrivate &other)
+ :QSharedData(other)
+{
+ url = other.url;
+ fields = other.fields;
+}
+
+qint64 QHttpNetworkHeaderPrivate::contentLength() const
+{
+ bool ok = false;
+ QByteArray value = headerField("content-length");
+ qint64 length = value.toULongLong(&ok);
+ if (ok)
+ return length;
+ return -1; // the header field is not set
+}
+
+void QHttpNetworkHeaderPrivate::setContentLength(qint64 length)
+{
+ setHeaderField("Content-Length", QByteArray::number(length));
+}
+
+QByteArray QHttpNetworkHeaderPrivate::headerField(const QByteArray &name, const QByteArray &defaultValue) const
+{
+ QList<QByteArray> allValues = headerFieldValues(name);
+ if (allValues.isEmpty())
+ return defaultValue;
+
+ QByteArray result;
+ bool first = true;
+ foreach (QByteArray value, allValues) {
+ if (!first)
+ result += ", ";
+ first = false;
+ result += value;
+ }
+ return result;
+}
+
+QList<QByteArray> QHttpNetworkHeaderPrivate::headerFieldValues(const QByteArray &name) const
+{
+ QList<QByteArray> result;
+ QByteArray lowerName = name.toLower();
+ QList<QPair<QByteArray, QByteArray> >::ConstIterator it = fields.constBegin(),
+ end = fields.constEnd();
+ for ( ; it != end; ++it)
+ if (lowerName == it->first.toLower())
+ result += it->second;
+
+ return result;
+}
+
+void QHttpNetworkHeaderPrivate::setHeaderField(const QByteArray &name, const QByteArray &data)
+{
+ QByteArray lowerName = name.toLower();
+ QList<QPair<QByteArray, QByteArray> >::Iterator it = fields.begin();
+ while (it != fields.end()) {
+ if (lowerName == it->first.toLower())
+ it = fields.erase(it);
+ else
+ ++it;
+ }
+ fields.append(qMakePair(name, data));
+}
+
+bool QHttpNetworkHeaderPrivate::operator==(const QHttpNetworkHeaderPrivate &other) const
+{
+ return (url == other.url);
+}
+
+
+QT_END_NAMESPACE
diff --git a/src/network/access/qhttpnetworkheader_p.h b/src/network/access/qhttpnetworkheader_p.h
new file mode 100644
index 0000000..4e62352
--- /dev/null
+++ b/src/network/access/qhttpnetworkheader_p.h
@@ -0,0 +1,111 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the QtNetwork module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QHTTPNETWORKHEADER_H
+#define QHTTPNETWORKHEADER_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of the Network Access API. This header file may change from
+// version to version without notice, or even be removed.
+//
+// We mean it.
+//
+#ifndef QT_NO_HTTP
+
+#include <qshareddata.h>
+#include <qurl.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_AUTOTEST_EXPORT QHttpNetworkHeader
+{
+public:
+ virtual ~QHttpNetworkHeader() {};
+ virtual QUrl url() const = 0;
+ virtual void setUrl(const QUrl &url) = 0;
+
+ virtual int majorVersion() const = 0;
+ virtual int minorVersion() const = 0;
+
+ virtual qint64 contentLength() const = 0;
+ virtual void setContentLength(qint64 length) = 0;
+
+ virtual QList<QPair<QByteArray, QByteArray> > header() const = 0;
+ virtual QByteArray headerField(const QByteArray &name, const QByteArray &defaultValue = QByteArray()) const = 0;
+ virtual void setHeaderField(const QByteArray &name, const QByteArray &data) = 0;
+};
+
+class QHttpNetworkHeaderPrivate : public QSharedData
+{
+public:
+ QUrl url;
+ QList<QPair<QByteArray, QByteArray> > fields;
+
+ QHttpNetworkHeaderPrivate(const QUrl &newUrl = QUrl());
+ QHttpNetworkHeaderPrivate(const QHttpNetworkHeaderPrivate &other);
+ qint64 contentLength() const;
+ void setContentLength(qint64 length);
+
+ QByteArray headerField(const QByteArray &name, const QByteArray &defaultValue = QByteArray()) const;
+ QList<QByteArray> headerFieldValues(const QByteArray &name) const;
+ void setHeaderField(const QByteArray &name, const QByteArray &data);
+ bool operator==(const QHttpNetworkHeaderPrivate &other) const;
+
+};
+
+
+QT_END_NAMESPACE
+
+
+#endif // QT_NO_HTTP
+
+
+#endif // QHTTPNETWORKHEADER_H
+
+
+
+
+
+
diff --git a/src/network/access/qhttpnetworkreply.cpp b/src/network/access/qhttpnetworkreply.cpp
new file mode 100644
index 0000000..fe3f6af
--- /dev/null
+++ b/src/network/access/qhttpnetworkreply.cpp
@@ -0,0 +1,663 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the QtNetwork module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qhttpnetworkreply_p.h"
+#include "qhttpnetworkconnection_p.h"
+
+#include <qbytearraymatcher.h>
+
+#ifndef QT_NO_HTTP
+
+#ifndef QT_NO_OPENSSL
+# include <QtNetwork/qsslkey.h>
+# include <QtNetwork/qsslcipher.h>
+# include <QtNetwork/qsslconfiguration.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+QHttpNetworkReply::QHttpNetworkReply(const QUrl &url, QObject *parent)
+ : QObject(*new QHttpNetworkReplyPrivate(url), parent)
+{
+}
+
+QHttpNetworkReply::~QHttpNetworkReply()
+{
+ Q_D(QHttpNetworkReply);
+ if (d->connection) {
+ d->connection->d_func()->removeReply(this);
+ }
+}
+
+QUrl QHttpNetworkReply::url() const
+{
+ return d_func()->url;
+}
+void QHttpNetworkReply::setUrl(const QUrl &url)
+{
+ Q_D(QHttpNetworkReply);
+ d->url = url;
+}
+
+qint64 QHttpNetworkReply::contentLength() const
+{
+ return d_func()->contentLength();
+}
+
+void QHttpNetworkReply::setContentLength(qint64 length)
+{
+ Q_D(QHttpNetworkReply);
+ d->setContentLength(length);
+}
+
+QList<QPair<QByteArray, QByteArray> > QHttpNetworkReply::header() const
+{
+ return d_func()->fields;
+}
+
+QByteArray QHttpNetworkReply::headerField(const QByteArray &name, const QByteArray &defaultValue) const
+{
+ return d_func()->headerField(name, defaultValue);
+}
+
+void QHttpNetworkReply::setHeaderField(const QByteArray &name, const QByteArray &data)
+{
+ Q_D(QHttpNetworkReply);
+ d->setHeaderField(name, data);
+}
+
+void QHttpNetworkReply::parseHeader(const QByteArray &header)
+{
+ Q_D(QHttpNetworkReply);
+ d->parseHeader(header);
+}
+
+QHttpNetworkRequest QHttpNetworkReply::request() const
+{
+ return d_func()->request;
+}
+
+void QHttpNetworkReply::setRequest(const QHttpNetworkRequest &request)
+{
+ Q_D(QHttpNetworkReply);
+ d->request = request;
+}
+
+int QHttpNetworkReply::statusCode() const
+{
+ return d_func()->statusCode;
+}
+
+void QHttpNetworkReply::setStatusCode(int code)
+{
+ Q_D(QHttpNetworkReply);
+ d->statusCode = code;
+}
+
+QString QHttpNetworkReply::errorString() const
+{
+ return d_func()->errorString;
+}
+
+QString QHttpNetworkReply::reasonPhrase() const
+{
+ return d_func()->reasonPhrase;
+}
+
+void QHttpNetworkReply::setErrorString(const QString &error)
+{
+ Q_D(QHttpNetworkReply);
+ d->errorString = error;
+}
+
+int QHttpNetworkReply::majorVersion() const
+{
+ return d_func()->majorVersion;
+}
+
+int QHttpNetworkReply::minorVersion() const
+{
+ return d_func()->minorVersion;
+}
+
+qint64 QHttpNetworkReply::bytesAvailable() const
+{
+ Q_D(const QHttpNetworkReply);
+ if (d->connection)
+ return d->connection->d_func()->bytesAvailable(*this);
+ else
+ return -1;
+}
+
+QByteArray QHttpNetworkReply::read(qint64 maxSize)
+{
+ Q_D(QHttpNetworkReply);
+ QByteArray data;
+ if (d->connection)
+ d->connection->d_func()->read(*this, data, maxSize, false);
+ return data;
+}
+
+bool QHttpNetworkReply::isFinished() const
+{
+ return d_func()->state == QHttpNetworkReplyPrivate::AllDoneState;
+}
+
+
+
+QHttpNetworkReplyPrivate::QHttpNetworkReplyPrivate(const QUrl &newUrl)
+ : QHttpNetworkHeaderPrivate(newUrl), state(NothingDoneState), statusCode(100),
+ majorVersion(0), minorVersion(0), bodyLength(0), contentRead(0), totalProgress(0),
+ currentChunkSize(0), currentChunkRead(0), connection(0), initInflate(false),
+ autoDecompress(false), requestIsBuffering(false), requestIsPrepared(false)
+{
+}
+
+QHttpNetworkReplyPrivate::~QHttpNetworkReplyPrivate()
+{
+}
+
+void QHttpNetworkReplyPrivate::clear()
+{
+ state = NothingDoneState;
+ statusCode = 100;
+ bodyLength = 0;
+ contentRead = 0;
+ totalProgress = 0;
+ currentChunkSize = 0;
+ currentChunkRead = 0;
+ connection = 0;
+#ifndef QT_NO_COMPRESS
+ if (initInflate)
+ inflateEnd(&inflateStrm);
+#endif
+ initInflate = false;
+ streamEnd = false;
+ autoDecompress = false;
+ fields.clear();
+}
+
+// QHttpNetworkReplyPrivate
+qint64 QHttpNetworkReplyPrivate::bytesAvailable() const
+{
+ return (state != ReadingDataState ? 0 : fragment.size());
+}
+
+bool QHttpNetworkReplyPrivate::isGzipped()
+{
+ QByteArray encoding = headerField("content-encoding");
+ return encoding.toLower() == "gzip";
+}
+
+void QHttpNetworkReplyPrivate::removeAutoDecompressHeader()
+{
+ // The header "Content-Encoding = gzip" is retained.
+ // Content-Length is removed since the actual one send by the server is for compressed data
+ QByteArray name("content-length");
+ QByteArray lowerName = name.toLower();
+ QList<QPair<QByteArray, QByteArray> >::Iterator it = fields.begin(),
+ end = fields.end();
+ while (it != end) {
+ if (name == it->first.toLower()) {
+ fields.erase(it);
+ break;
+ }
+ ++it;
+ }
+
+}
+
+bool QHttpNetworkReplyPrivate::findChallenge(bool forProxy, QByteArray &challenge) const
+{
+ challenge.clear();
+ // find out the type of authentication protocol requested.
+ QByteArray header = forProxy ? "proxy-authenticate" : "www-authenticate";
+ // pick the best protocol (has to match parsing in QAuthenticatorPrivate)
+ QList<QByteArray> challenges = headerFieldValues(header);
+ for (int i = 0; i<challenges.size(); i++) {
+ QByteArray line = challenges.at(i);
+ if (!line.toLower().startsWith("negotiate"))
+ challenge = line;
+ }
+ return !challenge.isEmpty();
+}
+
+QAuthenticatorPrivate::Method QHttpNetworkReplyPrivate::authenticationMethod(bool isProxy) const
+{
+ // The logic is same as the one used in void QAuthenticatorPrivate::parseHttpResponse()
+ QAuthenticatorPrivate::Method method = QAuthenticatorPrivate::None;
+ QByteArray header = isProxy ? "proxy-authenticate" : "www-authenticate";
+ QList<QByteArray> challenges = headerFieldValues(header);
+ for (int i = 0; i<challenges.size(); i++) {
+ QByteArray line = challenges.at(i).trimmed().toLower();
+ if (method < QAuthenticatorPrivate::Basic
+ && line.startsWith("basic")) {
+ method = QAuthenticatorPrivate::Basic;
+ } else if (method < QAuthenticatorPrivate::Ntlm
+ && line.startsWith("ntlm")) {
+ method = QAuthenticatorPrivate::Ntlm;
+ } else if (method < QAuthenticatorPrivate::DigestMd5
+ && line.startsWith("digest")) {
+ method = QAuthenticatorPrivate::DigestMd5;
+ }
+ }
+ return method;
+}
+
+#ifndef QT_NO_COMPRESS
+bool QHttpNetworkReplyPrivate::gzipCheckHeader(QByteArray &content, int &pos)
+{
+ int method = 0; // method byte
+ int flags = 0; // flags byte
+ bool ret = false;
+
+ // Assure two bytes in the buffer so we can peek ahead -- handle case
+ // where first byte of header is at the end of the buffer after the last
+ // gzip segment
+ pos = -1;
+ QByteArray &body = content;
+ int maxPos = body.size()-1;
+ if (maxPos < 1) {
+ return ret;
+ }
+
+ // Peek ahead to check the gzip magic header
+ if (body[0] != char(gz_magic[0]) ||
+ body[1] != char(gz_magic[1])) {
+ return ret;
+ }
+ pos += 2;
+ // Check the rest of the gzip header
+ if (++pos <= maxPos)
+ method = body[pos];
+ if (pos++ <= maxPos)
+ flags = body[pos];
+ if (method != Z_DEFLATED || (flags & RESERVED) != 0) {
+ return ret;
+ }
+
+ // Discard time, xflags and OS code:
+ pos += 6;
+ if (pos > maxPos)
+ return ret;
+ if ((flags & EXTRA_FIELD) && ((pos+2) <= maxPos)) { // skip the extra field
+ unsigned len = (unsigned)body[++pos];
+ len += ((unsigned)body[++pos])<<8;
+ pos += len;
+ if (pos > maxPos)
+ return ret;
+ }
+ if ((flags & ORIG_NAME) != 0) { // skip the original file name
+ while(++pos <= maxPos && body[pos]) {}
+ }
+ if ((flags & COMMENT) != 0) { // skip the .gz file comment
+ while(++pos <= maxPos && body[pos]) {}
+ }
+ if ((flags & HEAD_CRC) != 0) { // skip the header crc
+ pos += 2;
+ if (pos > maxPos)
+ return ret;
+ }
+ ret = (pos < maxPos); // return failed, if no more bytes left
+ return ret;
+}
+
+int QHttpNetworkReplyPrivate::gunzipBodyPartially(QByteArray &compressed, QByteArray &inflated)
+{
+ int ret = Z_DATA_ERROR;
+ unsigned have;
+ unsigned char out[CHUNK];
+ int pos = -1;
+
+ if (!initInflate) {
+ // check the header
+ if (!gzipCheckHeader(compressed, pos))
+ return ret;
+ // allocate inflate state
+ inflateStrm.zalloc = Z_NULL;
+ inflateStrm.zfree = Z_NULL;
+ inflateStrm.opaque = Z_NULL;
+ inflateStrm.avail_in = 0;
+ inflateStrm.next_in = Z_NULL;
+ ret = inflateInit2(&inflateStrm, -MAX_WBITS);
+ if (ret != Z_OK)
+ return ret;
+ initInflate = true;
+ streamEnd = false;
+ }
+
+ //remove the header.
+ compressed.remove(0, pos+1);
+ // expand until deflate stream ends
+ inflateStrm.next_in = (unsigned char *)compressed.data();
+ inflateStrm.avail_in = compressed.size();
+ do {
+ inflateStrm.avail_out = sizeof(out);
+ inflateStrm.next_out = out;
+ ret = inflate(&inflateStrm, Z_NO_FLUSH);
+ switch (ret) {
+ case Z_NEED_DICT:
+ ret = Z_DATA_ERROR;
+ // and fall through
+ case Z_DATA_ERROR:
+ case Z_MEM_ERROR:
+ inflateEnd(&inflateStrm);
+ initInflate = false;
+ return ret;
+ }
+ have = sizeof(out) - inflateStrm.avail_out;
+ inflated.append(QByteArray((const char *)out, have));
+ } while (inflateStrm.avail_out == 0);
+ // clean up and return
+ if (ret <= Z_ERRNO || ret == Z_STREAM_END) {
+ inflateEnd(&inflateStrm);
+ initInflate = false;
+ }
+ streamEnd = (ret == Z_STREAM_END);
+ return ret;
+}
+#endif
+
+qint64 QHttpNetworkReplyPrivate::readStatus(QAbstractSocket *socket)
+{
+ qint64 bytes = 0;
+ char c;
+
+ while (socket->bytesAvailable()) {
+ // allow both CRLF & LF (only) line endings
+ if (socket->peek(&c, 1) == 1 && c == '\n') {
+ bytes += socket->read(&c, 1); // read the "n"
+ // remove the CR at the end
+ if (fragment.endsWith('\r')) {
+ fragment.truncate(fragment.length()-1);
+ }
+ parseStatus(fragment);
+ state = ReadingHeaderState;
+ fragment.clear(); // next fragment
+ break;
+ } else {
+ c = 0;
+ bytes += socket->read(&c, 1);
+ fragment.append(c);
+ }
+ }
+ return bytes;
+}
+
+void QHttpNetworkReplyPrivate::parseStatus(const QByteArray &status)
+{
+ const QByteArrayMatcher sp(" ");
+ int i = sp.indexIn(status);
+ const QByteArray version = status.mid(0, i);
+ int j = sp.indexIn(status, i + 1);
+ const QByteArray code = status.mid(i + 1, j - i - 1);
+ const QByteArray reason = status.mid(j + 1, status.count() - j);
+
+ const QByteArrayMatcher slash("/");
+ int k = slash.indexIn(version);
+ const QByteArrayMatcher dot(".");
+ int l = dot.indexIn(version, k);
+ const QByteArray major = version.mid(k + 1, l - k - 1);
+ const QByteArray minor = version.mid(l + 1, version.count() - l);
+
+ majorVersion = QString::fromAscii(major.constData()).toInt();
+ minorVersion = QString::fromAscii(minor.constData()).toInt();
+ statusCode = QString::fromAscii(code.constData()).toInt();
+ reasonPhrase = QString::fromAscii(reason.constData());
+}
+
+qint64 QHttpNetworkReplyPrivate::readHeader(QAbstractSocket *socket)
+{
+ qint64 bytes = 0;
+ char crlfcrlf[5];
+ crlfcrlf[4] = '\0';
+ char c = 0;
+ bool allHeaders = false;
+ while (!allHeaders && socket->bytesAvailable()) {
+ if (socket->peek(&c, 1) == 1 && c == '\n') {
+ // check for possible header endings. As per HTTP rfc,
+ // the header endings will be marked by CRLFCRLF. But
+ // we will allow CRLFLF, LFLF & CRLFCRLF
+ if (fragment.endsWith("\n\r") || fragment.endsWith('\n'))
+ allHeaders = true;
+ }
+ bytes += socket->read(&c, 1);
+ fragment.append(c);
+ }
+ // we received all headers now parse them
+ if (allHeaders) {
+ parseHeader(fragment);
+ state = ReadingDataState;
+ fragment.clear(); // next fragment
+ bodyLength = contentLength(); // cache the length
+ }
+ return bytes;
+}
+
+void QHttpNetworkReplyPrivate::parseHeader(const QByteArray &header)
+{
+ // see rfc2616, sec 4 for information about HTTP/1.1 headers.
+ // allows relaxed parsing here, accepts both CRLF & LF line endings
+ const QByteArrayMatcher lf("\n");
+ const QByteArrayMatcher colon(":");
+ int i = 0;
+ while (i < header.count()) {
+ int j = colon.indexIn(header, i); // field-name
+ if (j == -1)
+ break;
+ const QByteArray field = header.mid(i, j - i).trimmed();
+ j++;
+ // any number of LWS is allowed before and after the value
+ QByteArray value;
+ do {
+ i = lf.indexIn(header, j);
+ if (i == -1)
+ break;
+ if (!value.isEmpty())
+ value += ' ';
+ // check if we have CRLF or only LF
+ bool hasCR = (i && header[i-1] == '\r');
+ int length = i -(hasCR ? 1: 0) - j;
+ value += header.mid(j, length).trimmed();
+ j = ++i;
+ } while (i < header.count() && (header.at(i) == ' ' || header.at(i) == '\t'));
+ if (i == -1)
+ break; // something is wrong
+
+ fields.append(qMakePair(field, value));
+ }
+}
+
+bool QHttpNetworkReplyPrivate::isChunked()
+{
+ return headerField("transfer-encoding").toLower().contains("chunked");
+}
+
+bool QHttpNetworkReplyPrivate::connectionCloseEnabled()
+{
+ return (headerField("connection").toLower().contains("close") ||
+ headerField("proxy-connection").toLower().contains("close"));
+}
+
+qint64 QHttpNetworkReplyPrivate::readBody(QAbstractSocket *socket, QIODevice *out)
+{
+ qint64 bytes = 0;
+ if (isChunked()) {
+ bytes += transferChunked(socket, out); // chunked transfer encoding (rfc 2616, sec 3.6)
+ } else if (bodyLength > 0) { // we have a Content-Length
+ bytes += transferRaw(socket, out, bodyLength - contentRead);
+ if (contentRead + bytes == bodyLength)
+ state = AllDoneState;
+ } else {
+ bytes += transferRaw(socket, out, socket->bytesAvailable());
+ }
+ if (state == AllDoneState)
+ socket->readAll(); // Read the rest to clean (CRLF)
+ contentRead += bytes;
+ return bytes;
+}
+
+qint64 QHttpNetworkReplyPrivate::transferRaw(QIODevice *in, QIODevice *out, qint64 size)
+{
+ qint64 bytes = 0;
+ Q_ASSERT(in);
+ Q_ASSERT(out);
+
+ int toBeRead = qMin<qint64>(128*1024, qMin<qint64>(size, in->bytesAvailable()));
+ QByteArray raw(toBeRead, 0);
+ while (size > 0) {
+ qint64 read = in->read(raw.data(), raw.size());
+ if (read == 0)
+ return bytes;
+ // ### error checking here
+ qint64 written = out->write(raw.data(), read);
+ if (written == 0)
+ return bytes;
+ if (read != written)
+ qDebug() << "### read" << read << "written" << written;
+ bytes += read;
+ size -= read;
+ out->waitForBytesWritten(-1); // throttle
+ }
+ return bytes;
+
+}
+
+qint64 QHttpNetworkReplyPrivate::transferChunked(QIODevice *in, QIODevice *out)
+{
+ qint64 bytes = 0;
+ while (in->bytesAvailable()) { // while we can read from input
+ // if we are done with the current chunk, get the size of the new chunk
+ if (currentChunkRead >= currentChunkSize) {
+ currentChunkSize = 0;
+ currentChunkRead = 0;
+ if (bytes) {
+ char crlf[2];
+ bytes += in->read(crlf, 2); // read the "\r\n" after the chunk
+ }
+ bytes += getChunkSize(in, &currentChunkSize);
+ if (currentChunkSize == -1)
+ break;
+ }
+ // if the chunk size is 0, end of the stream
+ if (currentChunkSize == 0) {
+ state = AllDoneState;
+ break;
+ }
+ // otherwise, read data
+ qint64 readSize = qMin(in->bytesAvailable(), currentChunkSize - currentChunkRead);
+ QByteArray buffer(readSize, 0);
+ qint64 read = in->read(buffer.data(), readSize);
+ bytes += read;
+ currentChunkRead += read;
+ qint64 written = out->write(buffer);
+ Q_UNUSED(written); // Avoid compile warning when building release
+ Q_ASSERT(read == written);
+ // ### error checking here
+ out->waitForBytesWritten(-1);
+ }
+ return bytes;
+}
+
+qint64 QHttpNetworkReplyPrivate::getChunkSize(QIODevice *in, qint64 *chunkSize)
+{
+ qint64 bytes = 0;
+ char crlf[2];
+ *chunkSize = -1;
+ int bytesAvailable = in->bytesAvailable();
+ while (bytesAvailable > bytes) {
+ qint64 sniffedBytes = in->peek(crlf, 2);
+ int fragmentSize = fragment.size();
+ // check the next two bytes for a "\r\n", skip blank lines
+ if ((fragmentSize && sniffedBytes == 2 && crlf[0] == '\r' && crlf[1] == '\n')
+ ||(fragmentSize > 1 && fragment.endsWith('\r') && crlf[0] == '\n'))
+ {
+ bytes += in->read(crlf, 1); // read the \r or \n
+ if (crlf[0] == '\r')
+ bytes += in->read(crlf, 1); // read the \n
+ bool ok = false;
+ // ignore the chunk-extension
+ fragment = fragment.mid(0, fragment.indexOf(';')).trimmed();
+ *chunkSize = fragment.toLong(&ok, 16);
+ fragment.clear();
+ break; // size done
+ } else {
+ // read the fragment to the buffer
+ char c = 0;
+ bytes += in->read(&c, 1);
+ fragment.append(c);
+ }
+ }
+ return bytes;
+}
+
+// SSL support below
+#ifndef QT_NO_OPENSSL
+
+QSslConfiguration QHttpNetworkReply::sslConfiguration() const
+{
+ Q_D(const QHttpNetworkReply);
+ if (d->connection)
+ return d->connection->d_func()->sslConfiguration(*this);
+ return QSslConfiguration();
+}
+
+void QHttpNetworkReply::setSslConfiguration(const QSslConfiguration &config)
+{
+ Q_D(QHttpNetworkReply);
+ if (d->connection)
+ d->connection->setSslConfiguration(config);
+}
+
+void QHttpNetworkReply::ignoreSslErrors()
+{
+ Q_D(QHttpNetworkReply);
+ if (d->connection)
+ d->connection->ignoreSslErrors();
+}
+
+
+#endif //QT_NO_OPENSSL
+
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_HTTP \ No newline at end of file
diff --git a/src/network/access/qhttpnetworkreply_p.h b/src/network/access/qhttpnetworkreply_p.h
new file mode 100644
index 0000000..21f4116
--- /dev/null
+++ b/src/network/access/qhttpnetworkreply_p.h
@@ -0,0 +1,226 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the QtNetwork module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QHTTPNETWORKREPLY_H
+#define QHTTPNETWORKREPLY_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of the Network Access API. This header file may change from
+// version to version without notice, or even be removed.
+//
+// We mean it.
+//
+#ifndef QT_NO_HTTP
+
+#ifndef QT_NO_COMPRESS
+# include <zlib.h>
+static const unsigned char gz_magic[2] = {0x1f, 0x8b}; // gzip magic header
+// gzip flag byte
+#define HEAD_CRC 0x02 // bit 1 set: header CRC present
+#define EXTRA_FIELD 0x04 // bit 2 set: extra field present
+#define ORIG_NAME 0x08 // bit 3 set: original file name present
+#define COMMENT 0x10 // bit 4 set: file comment present
+#define RESERVED 0xE0 // bits 5..7: reserved
+#define CHUNK 16384
+#endif
+
+#ifndef QT_NO_OPENSSL
+# include <QtNetwork/qsslsocket.h>
+# include <QtNetwork/qsslerror.h>
+#else
+# include <QtNetwork/qtcpsocket.h>
+#endif
+
+#include <QtNetwork/qnetworkrequest.h>
+#include <QtNetwork/qnetworkreply.h>
+#include <qbuffer.h>
+
+#include <private/qobject_p.h>
+#include <private/qhttpnetworkheader_p.h>
+#include <private/qhttpnetworkrequest_p.h>
+#include <private/qauthenticator_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QHttpNetworkConnection;
+class QHttpNetworkRequest;
+class QHttpNetworkConnectionPrivate;
+class QHttpNetworkReplyPrivate;
+class Q_AUTOTEST_EXPORT QHttpNetworkReply : public QObject, public QHttpNetworkHeader
+{
+ Q_OBJECT
+public:
+
+ explicit QHttpNetworkReply(const QUrl &url = QUrl(), QObject *parent = 0);
+ virtual ~QHttpNetworkReply();
+
+ QUrl url() const;
+ void setUrl(const QUrl &url);
+
+ int majorVersion() const;
+ int minorVersion() const;
+
+ qint64 contentLength() const;
+ void setContentLength(qint64 length);
+
+ QList<QPair<QByteArray, QByteArray> > header() const;
+ QByteArray headerField(const QByteArray &name, const QByteArray &defaultValue = QByteArray()) const;
+ void setHeaderField(const QByteArray &name, const QByteArray &data);
+ void parseHeader(const QByteArray &header); // mainly for testing
+
+ QHttpNetworkRequest request() const;
+ void setRequest(const QHttpNetworkRequest &request);
+
+ int statusCode() const;
+ void setStatusCode(int code);
+
+ QString errorString() const;
+ void setErrorString(const QString &error);
+
+ QString reasonPhrase() const;
+
+ qint64 bytesAvailable() const;
+ QByteArray read(qint64 maxSize = -1);
+
+ bool isFinished() const;
+
+#ifndef QT_NO_OPENSSL
+ QSslConfiguration sslConfiguration() const;
+ void setSslConfiguration(const QSslConfiguration &config);
+ void ignoreSslErrors();
+
+Q_SIGNALS:
+ void sslErrors(const QList<QSslError> &errors);
+#endif
+
+Q_SIGNALS:
+ void readyRead();
+ void finished();
+ void finishedWithError(QNetworkReply::NetworkError errorCode, const QString &detail = QString());
+ void headerChanged();
+ void dataReadProgress(int done, int total);
+ void dataSendProgress(int done, int total);
+
+private:
+ Q_DECLARE_PRIVATE(QHttpNetworkReply)
+ friend class QHttpNetworkConnection;
+ friend class QHttpNetworkConnectionPrivate;
+};
+
+
+class QHttpNetworkReplyPrivate : public QObjectPrivate, public QHttpNetworkHeaderPrivate
+{
+public:
+ QHttpNetworkReplyPrivate(const QUrl &newUrl = QUrl());
+ ~QHttpNetworkReplyPrivate();
+ qint64 readStatus(QAbstractSocket *socket);
+ void parseStatus(const QByteArray &status);
+ qint64 readHeader(QAbstractSocket *socket);
+ void parseHeader(const QByteArray &header);
+ qint64 readBody(QAbstractSocket *socket, QIODevice *out);
+ bool findChallenge(bool forProxy, QByteArray &challenge) const;
+ QAuthenticatorPrivate::Method authenticationMethod(bool isProxy) const;
+ void clear();
+
+ qint64 transferRaw(QIODevice *in, QIODevice *out, qint64 size);
+ qint64 transferChunked(QIODevice *in, QIODevice *out);
+ qint64 getChunkSize(QIODevice *in, qint64 *chunkSize);
+
+ qint64 bytesAvailable() const;
+ bool isChunked();
+ bool connectionCloseEnabled();
+ bool isGzipped();
+#ifndef QT_NO_COMPRESS
+ bool gzipCheckHeader(QByteArray &content, int &pos);
+ int gunzipBodyPartially(QByteArray &compressed, QByteArray &inflated);
+#endif
+ void removeAutoDecompressHeader();
+
+ enum ReplyState {
+ NothingDoneState,
+ ReadingStatusState,
+ ReadingHeaderState,
+ ReadingDataState,
+ AllDoneState
+ } state;
+
+ QHttpNetworkRequest request;
+ int statusCode;
+ int majorVersion;
+ int minorVersion;
+ QString errorString;
+ QString reasonPhrase;
+ qint64 bodyLength;
+ qint64 contentRead;
+ qint64 totalProgress;
+ QByteArray fragment;
+ qint64 currentChunkSize;
+ qint64 currentChunkRead;
+ QPointer<QHttpNetworkConnection> connection;
+ bool initInflate;
+ bool streamEnd;
+#ifndef QT_NO_COMPRESS
+ z_stream inflateStrm;
+#endif
+ bool autoDecompress;
+
+ QByteArray responseData; // uncompressed body
+ QByteArray compressedData; // compressed body (temporary)
+ QBuffer requestDataBuffer;
+ bool requestIsBuffering;
+ bool requestIsPrepared;
+};
+
+
+
+
+QT_END_NAMESPACE
+
+//Q_DECLARE_METATYPE(QHttpNetworkReply)
+
+#endif // QT_NO_HTTP
+
+
+#endif // QHTTPNETWORKREPLY_H
diff --git a/src/network/access/qhttpnetworkrequest.cpp b/src/network/access/qhttpnetworkrequest.cpp
new file mode 100644
index 0000000..420cb69
--- /dev/null
+++ b/src/network/access/qhttpnetworkrequest.cpp
@@ -0,0 +1,261 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the QtNetwork module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qhttpnetworkrequest_p.h"
+
+QT_BEGIN_NAMESPACE
+
+QHttpNetworkRequestPrivate::QHttpNetworkRequestPrivate(QHttpNetworkRequest::Operation op,
+ QHttpNetworkRequest::Priority pri, const QUrl &newUrl)
+ : QHttpNetworkHeaderPrivate(newUrl), operation(op), priority(pri), data(0),
+ autoDecompress(false)
+{
+}
+
+QHttpNetworkRequestPrivate::QHttpNetworkRequestPrivate(const QHttpNetworkRequestPrivate &other)
+ : QHttpNetworkHeaderPrivate(other)
+{
+ operation = other.operation;
+ priority = other.priority;
+ data = other.data;
+ autoDecompress = other.autoDecompress;
+}
+
+QHttpNetworkRequestPrivate::~QHttpNetworkRequestPrivate()
+{
+}
+
+bool QHttpNetworkRequestPrivate::operator==(const QHttpNetworkRequestPrivate &other) const
+{
+ return QHttpNetworkHeaderPrivate::operator==(other)
+ && (operation == other.operation)
+ && (data == other.data);
+}
+
+QByteArray QHttpNetworkRequestPrivate::methodName() const
+{
+ QByteArray ba;
+ switch (operation) {
+ case QHttpNetworkRequest::Options:
+ ba += "OPTIONS";
+ break;
+ case QHttpNetworkRequest::Get:
+ ba += "GET";
+ break;
+ case QHttpNetworkRequest::Head:
+ ba += "HEAD";
+ break;
+ case QHttpNetworkRequest::Post:
+ ba += "POST";
+ break;
+ case QHttpNetworkRequest::Put:
+ ba += "PUT";
+ break;
+ case QHttpNetworkRequest::Delete:
+ ba += "DELETE";
+ break;
+ case QHttpNetworkRequest::Trace:
+ ba += "TRACE";
+ break;
+ case QHttpNetworkRequest::Connect:
+ ba += "CONNECT";
+ break;
+ default:
+ break;
+ }
+ return ba;
+}
+
+QByteArray QHttpNetworkRequestPrivate::uri(bool throughProxy) const
+{
+ QUrl::FormattingOptions format(QUrl::RemoveFragment);
+
+ // for POST, query data is send as content
+ if (operation == QHttpNetworkRequest::Post && !data)
+ format |= QUrl::RemoveQuery;
+ // for requests through proxy, the Request-URI contains full url
+ if (throughProxy)
+ format |= QUrl::RemoveUserInfo;
+ else
+ format |= QUrl::RemoveScheme | QUrl::RemoveAuthority;
+ QByteArray uri = url.toEncoded(format);
+ if (uri.isEmpty() || (throughProxy && url.path().isEmpty()))
+ uri += '/';
+ return uri;
+}
+
+QByteArray QHttpNetworkRequestPrivate::header(const QHttpNetworkRequest &request, bool throughProxy)
+{
+ QByteArray ba = request.d->methodName();
+ QByteArray uri = request.d->uri(throughProxy);
+ ba += " " + uri;
+
+ QString majorVersion = QString::number(request.majorVersion());
+ QString minorVersion = QString::number(request.minorVersion());
+ ba += " HTTP/" + majorVersion.toLatin1() + "." + minorVersion.toLatin1() + "\r\n";
+
+ QList<QPair<QByteArray, QByteArray> > fields = request.header();
+ QList<QPair<QByteArray, QByteArray> >::const_iterator it = fields.constBegin();
+ for (; it != fields.constEnd(); ++it)
+ ba += it->first + ": " + it->second + "\r\n";
+ if (request.d->operation == QHttpNetworkRequest::Post) {
+ // add content type, if not set in the request
+ if (request.headerField("content-type").isEmpty())
+ ba += "Content-Type: application/x-www-form-urlencoded\r\n";
+ if (!request.d->data && request.d->url.hasQuery()) {
+ QByteArray query = request.d->url.encodedQuery();
+ ba += "Content-Length: "+ QByteArray::number(query.size()) + "\r\n";
+ ba += "\r\n";
+ ba += query;
+ } else {
+ ba += "\r\n";
+ }
+ } else {
+ ba += "\r\n";
+ }
+ return ba;
+}
+
+
+// QHttpNetworkRequest
+
+QHttpNetworkRequest::QHttpNetworkRequest(const QUrl &url, Operation operation, Priority priority)
+ : d(new QHttpNetworkRequestPrivate(operation, priority, url))
+{
+}
+
+QHttpNetworkRequest::QHttpNetworkRequest(const QHttpNetworkRequest &other)
+ : QHttpNetworkHeader(other), d(other.d)
+{
+}
+
+QHttpNetworkRequest::~QHttpNetworkRequest()
+{
+}
+
+QUrl QHttpNetworkRequest::url() const
+{
+ return d->url;
+}
+void QHttpNetworkRequest::setUrl(const QUrl &url)
+{
+ d->url = url;
+}
+
+qint64 QHttpNetworkRequest::contentLength() const
+{
+ return d->contentLength();
+}
+
+void QHttpNetworkRequest::setContentLength(qint64 length)
+{
+ d->setContentLength(length);
+}
+
+QList<QPair<QByteArray, QByteArray> > QHttpNetworkRequest::header() const
+{
+ return d->fields;
+}
+
+QByteArray QHttpNetworkRequest::headerField(const QByteArray &name, const QByteArray &defaultValue) const
+{
+ return d->headerField(name, defaultValue);
+}
+
+void QHttpNetworkRequest::setHeaderField(const QByteArray &name, const QByteArray &data)
+{
+ d->setHeaderField(name, data);
+}
+
+QHttpNetworkRequest &QHttpNetworkRequest::operator=(const QHttpNetworkRequest &other)
+{
+ d = other.d;
+ return *this;
+}
+
+bool QHttpNetworkRequest::operator==(const QHttpNetworkRequest &other) const
+{
+ return d->operator==(*other.d);
+}
+
+QHttpNetworkRequest::Operation QHttpNetworkRequest::operation() const
+{
+ return d->operation;
+}
+
+void QHttpNetworkRequest::setOperation(Operation operation)
+{
+ d->operation = operation;
+}
+
+QHttpNetworkRequest::Priority QHttpNetworkRequest::priority() const
+{
+ return d->priority;
+}
+
+void QHttpNetworkRequest::setPriority(Priority priority)
+{
+ d->priority = priority;
+}
+
+QIODevice *QHttpNetworkRequest::data() const
+{
+ return d->data;
+}
+
+void QHttpNetworkRequest::setData(QIODevice *data)
+{
+ d->data = data;
+}
+
+int QHttpNetworkRequest::majorVersion() const
+{
+ return 1;
+}
+
+int QHttpNetworkRequest::minorVersion() const
+{
+ return 1;
+}
+
+
+QT_END_NAMESPACE
+
diff --git a/src/network/access/qhttpnetworkrequest_p.h b/src/network/access/qhttpnetworkrequest_p.h
new file mode 100644
index 0000000..d18e116
--- /dev/null
+++ b/src/network/access/qhttpnetworkrequest_p.h
@@ -0,0 +1,144 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the QtNetwork module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QHTTPNETWORKREQUEST_H
+#define QHTTPNETWORKREQUEST_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of the Network Access API. This header file may change from
+// version to version without notice, or even be removed.
+//
+// We mean it.
+//
+#ifndef QT_NO_HTTP
+
+#include <private/qhttpnetworkheader_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QHttpNetworkRequestPrivate;
+class Q_AUTOTEST_EXPORT QHttpNetworkRequest: public QHttpNetworkHeader
+{
+public:
+ enum Operation {
+ Options,
+ Get,
+ Head,
+ Post,
+ Put,
+ Delete,
+ Trace,
+ Connect
+ };
+
+ enum Priority {
+ HighPriority,
+ NormalPriority,
+ LowPriority
+ };
+
+ QHttpNetworkRequest(const QUrl &url = QUrl(), Operation operation = Get, Priority priority = NormalPriority);
+ QHttpNetworkRequest(const QHttpNetworkRequest &other);
+ virtual ~QHttpNetworkRequest();
+ QHttpNetworkRequest &operator=(const QHttpNetworkRequest &other);
+ bool operator==(const QHttpNetworkRequest &other) const;
+
+ QUrl url() const;
+ void setUrl(const QUrl &url);
+
+ int majorVersion() const;
+ int minorVersion() const;
+
+ qint64 contentLength() const;
+ void setContentLength(qint64 length);
+
+ QList<QPair<QByteArray, QByteArray> > header() const;
+ QByteArray headerField(const QByteArray &name, const QByteArray &defaultValue = QByteArray()) const;
+ void setHeaderField(const QByteArray &name, const QByteArray &data);
+
+ Operation operation() const;
+ void setOperation(Operation operation);
+
+ Priority priority() const;
+ void setPriority(Priority priority);
+
+ QIODevice *data() const;
+ void setData(QIODevice *data);
+
+private:
+ QSharedDataPointer<QHttpNetworkRequestPrivate> d;
+ friend class QHttpNetworkRequestPrivate;
+ friend class QHttpNetworkConnectionPrivate;
+};
+
+
+class QHttpNetworkRequestPrivate : public QHttpNetworkHeaderPrivate
+{
+public:
+ QHttpNetworkRequestPrivate(QHttpNetworkRequest::Operation op,
+ QHttpNetworkRequest::Priority pri, const QUrl &newUrl = QUrl());
+ QHttpNetworkRequestPrivate(const QHttpNetworkRequestPrivate &other);
+ ~QHttpNetworkRequestPrivate();
+ bool operator==(const QHttpNetworkRequestPrivate &other) const;
+ QByteArray methodName() const;
+ QByteArray uri(bool throughProxy) const;
+
+ static QByteArray header(const QHttpNetworkRequest &request, bool throughProxy);
+
+ QHttpNetworkRequest::Operation operation;
+ QHttpNetworkRequest::Priority priority;
+ mutable QIODevice *data;
+ bool autoDecompress;
+};
+
+
+QT_END_NAMESPACE
+
+//Q_DECLARE_METATYPE(QHttpNetworkRequest)
+
+#endif // QT_NO_HTTP
+
+
+#endif // QHTTPNETWORKREQUEST_H
diff --git a/src/network/socket/qlocalsocket_p.h b/src/network/socket/qlocalsocket_p.h
index dd48d0a..781d3da 100644
--- a/src/network/socket/qlocalsocket_p.h
+++ b/src/network/socket/qlocalsocket_p.h
@@ -192,6 +192,7 @@ public:
void _q_error(QAbstractSocket::SocketError newError);
void _q_connectToSocket();
void _q_abortConnectionAttempt();
+ void cancelDelayedConnect();
QSocketNotifier *delayConnect;
QTimer *connectTimer;
int connectingSocket;
diff --git a/src/network/socket/qlocalsocket_unix.cpp b/src/network/socket/qlocalsocket_unix.cpp
index a375e9b..38643f1 100644
--- a/src/network/socket/qlocalsocket_unix.cpp
+++ b/src/network/socket/qlocalsocket_unix.cpp
@@ -322,11 +322,8 @@ void QLocalSocketPrivate::_q_connectToSocket()
}
// connected!
- if (delayConnect) {
- delayConnect->setEnabled(false);
- delete delayConnect;
- delayConnect = 0;
- }
+ cancelDelayedConnect();
+
serverName = connectingName;
fullServerName = connectingPathName;
if (unixSocket.setSocketDescriptor(connectingSocket,
@@ -373,6 +370,18 @@ void QLocalSocketPrivate::_q_abortConnectionAttempt()
q->close();
}
+void QLocalSocketPrivate::cancelDelayedConnect()
+{
+ if (delayConnect) {
+ delayConnect->setEnabled(false);
+ delete delayConnect;
+ delayConnect = 0;
+ connectTimer->stop();
+ delete connectTimer;
+ connectTimer = 0;
+ }
+}
+
quintptr QLocalSocket::socketDescriptor() const
{
Q_D(const QLocalSocket);
@@ -419,14 +428,7 @@ void QLocalSocket::close()
{
Q_D(QLocalSocket);
d->unixSocket.close();
- if (d->delayConnect) {
- d->delayConnect->setEnabled(false);
- delete d->delayConnect;
- d->delayConnect = 0;
- d->connectTimer->stop();
- delete d->connectTimer;
- d->connectTimer = 0;
- }
+ d->cancelDelayedConnect();
if (d->connectingSocket != -1)
::close(d->connectingSocket);
d->connectingSocket = -1;
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.cpp
index edbfa7d..2a2ef5c 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.cpp
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.cpp
@@ -110,7 +110,6 @@ int QDirectFBPaintDevice::bytesPerLine() const
QDirectFBPaintDevice* that = const_cast<QDirectFBPaintDevice*>(this);
that->lockDirectFB();
Q_ASSERT(bpl != -1);
- that->unlockDirectFB();
}
return bpl;
}
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
index 3b6ea80..a93bbf7 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
@@ -367,7 +367,9 @@ void QDirectFBPaintEnginePrivate::setPen(const QPen &p)
{
pen = p;
simplePen = (pen.style() == Qt::NoPen) ||
- (pen.style() == Qt::SolidLine && !antialiased
+ (pen.style() == Qt::SolidLine
+ && !antialiased
+ && (pen.brush().style() == Qt::SolidPattern)
&& (pen.widthF() <= 1 && !matrixScale));
}
@@ -556,43 +558,25 @@ void QDirectFBPaintEnginePrivate::fillRegion(const QRegion &region) const
{
const QVector<QRect> rects = region.rects();
const int n = rects.size();
- QVarLengthArray<DFBRectangle> dfbRects(n);
-
- for (int i = 0; i < n; ++i) {
- const QRect r = rects.at(i);
- dfbRects[i].x = r.x();
- dfbRects[i].y = r.y();
- dfbRects[i].w = r.width();
- dfbRects[i].h = r.height();
-
- }
- surface->FillRectangles(surface, dfbRects.data(), n);
+ fillRects(rects.constData(), n);
}
void QDirectFBPaintEnginePrivate::fillRects(const QRect *rects, int n) const
{
- QVarLengthArray<DFBRectangle> dfbRects(n);
for (int i = 0; i < n; ++i) {
const QRect r = transform.mapRect(rects[i]);
- dfbRects[i].x = r.x();
- dfbRects[i].y = r.y();
- dfbRects[i].w = r.width();
- dfbRects[i].h = r.height();
+ surface->FillRectangle(surface, r.x(), r.y(),
+ r.width(), r.height());
}
- surface->FillRectangles(surface, dfbRects.data(), n);
}
void QDirectFBPaintEnginePrivate::fillRects(const QRectF *rects, int n) const
{
- QVarLengthArray<DFBRectangle> dfbRects(n);
for (int i = 0; i < n; ++i) {
const QRect r = transform.mapRect(rects[i]).toRect();
- dfbRects[i].x = r.x();
- dfbRects[i].y = r.y();
- dfbRects[i].w = r.width();
- dfbRects[i].h = r.height();
+ surface->FillRectangle(surface, r.x(), r.y(),
+ r.width(), r.height());
}
- surface->FillRectangles(surface, dfbRects.data(), n);
}
void QDirectFBPaintEnginePrivate::drawRects(const QRect *rects, int n) const
@@ -907,8 +891,7 @@ void QDirectFBPaintEngine::setState(QPainterState *s)
{
Q_D(QDirectFBPaintEngine);
QRasterPaintEngine::setState(s);
- if (d->surface)
- d->updateClip();
+ d->setClipDirty();
d->setPen(state()->pen);
d->setBrush(state()->brush);
d->setOpacity(state()->opacity);
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp
index 9f5c055..35ab859 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp
@@ -71,9 +71,9 @@ void QDirectFBPixmapData::resize(int width, int height)
return;
}
- dfbSurface = QDirectFBScreen::instance()->createDFBSurface(QSize(width, height),
- screen->pixelFormat(),
- QDirectFBScreen::TrackSurface);
+ dfbSurface = screen->createDFBSurface(QSize(width, height),
+ screen->pixelFormat(),
+ QDirectFBScreen::TrackSurface);
forceRaster = (screen->pixelFormat() == QImage::Format_RGB32);
if (!dfbSurface) {
setSerialNumber(0);
@@ -109,9 +109,10 @@ void QDirectFBPixmapData::copy(const QPixmapData *data, const QRect &rect)
}
IDirectFBSurface *src = static_cast<const QDirectFBPixmapData*>(data)->directFBSurface();
- const QImage::Format format = (data->hasAlphaChannel()
- ? QDirectFBScreen::instance()->alphaPixmapFormat()
- : QDirectFBScreen::instance()->pixelFormat());
+ const bool hasAlpha = data->hasAlphaChannel();
+ const QImage::Format format = (hasAlpha
+ ? screen->alphaPixmapFormat()
+ : screen->pixelFormat());
dfbSurface = screen->createDFBSurface(rect.size(), format,
QDirectFBScreen::TrackSurface);
@@ -122,10 +123,16 @@ void QDirectFBPixmapData::copy(const QPixmapData *data, const QRect &rect)
}
forceRaster = (format == QImage::Format_RGB32);
- dfbSurface->SetBlittingFlags(dfbSurface, DSBLIT_NOFX);
+ if (hasAlpha) {
+ dfbSurface->Clear(dfbSurface, 0, 0, 0, 0);
+ dfbSurface->SetBlittingFlags(dfbSurface, DSBLIT_BLEND_ALPHACHANNEL);
+ } else {
+ dfbSurface->SetBlittingFlags(dfbSurface, DSBLIT_NOFX);
+ }
const DFBRectangle blitRect = { rect.x(), rect.y(),
rect.width(), rect.height() };
DFBResult result = dfbSurface->Blit(dfbSurface, src, &blitRect, 0, 0);
+ dfbSurface->ReleaseSource(dfbSurface);
if (result != DFB_OK) {
DirectFBError("QDirectFBPixmapData::copy()", result);
setSerialNumber(0);
@@ -144,15 +151,11 @@ void QDirectFBPixmapData::fill(const QColor &color)
Q_ASSERT(dfbSurface);
if (color.alpha() < 255 && !hasAlphaChannel()) {
- DFBSurfaceDescription description;
- description.flags = DFBSurfaceDescriptionFlags(DSDESC_WIDTH |
- DSDESC_HEIGHT |
- DSDESC_PIXELFORMAT);
- dfbSurface->GetSize(dfbSurface, &description.width, &description.height);
- QDirectFBScreen::initSurfaceDescriptionPixelFormat(&description, screen->alphaPixmapFormat());
- screen->releaseDFBSurface(dfbSurface); // release old surface
-
- dfbSurface = screen->createDFBSurface(&description, QDirectFBScreen::TrackSurface);
+
+ QSize size;
+ dfbSurface->GetSize(dfbSurface, &size.rwidth(), &size.rheight());
+ screen->releaseDFBSurface(dfbSurface);
+ dfbSurface = screen->createDFBSurface(size, screen->alphaPixmapFormat(), QDirectFBScreen::TrackSurface);
forceRaster = false;
setSerialNumber(++global_ser_no);
if (!dfbSurface) {
@@ -185,30 +188,13 @@ bool QDirectFBPixmapData::hasAlphaChannel() const
{
if (!serialNumber())
return false;
+ DFBSurfacePixelFormat format;
+ dfbSurface->GetPixelFormat(dfbSurface, &format);
+ return QDirectFBScreen::hasAlpha(format);
// We don't need to ask DFB for this really. Can just keep track
// of what image format this has. It should always have either
// QDirectFBScreen::alphaPixmapFormat() or QScreen::pixelFormat()
-
- DFBSurfacePixelFormat format;
- dfbSurface->GetPixelFormat(dfbSurface, &format);
- switch (format) {
- case DSPF_ARGB1555:
- case DSPF_ARGB:
- case DSPF_LUT8:
- case DSPF_AiRGB:
- case DSPF_A1:
- case DSPF_ARGB2554:
- case DSPF_ARGB4444:
- case DSPF_AYUV:
- case DSPF_A4:
- case DSPF_ARGB1666:
- case DSPF_ARGB6666:
- case DSPF_LUT2:
- return true;
- default:
- return false;
- }
}
QPixmap QDirectFBPixmapData::transformed(const QTransform &transform,
@@ -235,13 +221,23 @@ QPixmap QDirectFBPixmapData::transformed(const QTransform &transform,
return QPixmap();
QDirectFBPixmapData *data = new QDirectFBPixmapData(QPixmapData::PixmapType);
- data->resize(size.width(), size.height());
-
- IDirectFBSurface *dest = data->dfbSurface;
- dest->SetBlittingFlags(dest, DSBLIT_NOFX);
+ QImage::Format format = screen->pixelFormat();
+ DFBSurfaceBlittingFlags flags = DSBLIT_NOFX;
+ if (hasAlphaChannel()) {
+ flags = DSBLIT_BLEND_ALPHACHANNEL;
+ format = screen->alphaPixmapFormat();
+ }
+ data->dfbSurface = screen->createDFBSurface(size,
+ format,
+ QDirectFBScreen::TrackSurface);
+ if (flags & DSBLIT_BLEND_ALPHACHANNEL) {
+ data->dfbSurface->Clear(data->dfbSurface, 0, 0, 0, 0);
+ }
+ data->dfbSurface->SetBlittingFlags(data->dfbSurface, flags);
const DFBRectangle destRect = { 0, 0, size.width(), size.height() };
- dest->StretchBlit(dest, dfbSurface, 0, &destRect);
+ data->dfbSurface->StretchBlit(data->dfbSurface, dfbSurface, 0, &destRect);
+ data->dfbSurface->ReleaseSource(data->dfbSurface);
return QPixmap(data);
}
@@ -251,6 +247,17 @@ QImage QDirectFBPixmapData::toImage() const
if (!dfbSurface)
return QImage();
+#ifndef QT_NO_DIRECTFB_PREALLOCATED
+ QImage ret(size(), QDirectFBScreen::getImageFormat(dfbSurface));
+ if (IDirectFBSurface *imgSurface = screen->createDFBSurface(ret, QDirectFBScreen::DontTrackSurface)) {
+ imgSurface->SetBlittingFlags(imgSurface, hasAlphaChannel() ? DSBLIT_BLEND_ALPHACHANNEL : DSBLIT_NOFX);
+ imgSurface->Blit(imgSurface, dfbSurface, 0, 0, 0);
+ imgSurface->ReleaseSource(imgSurface);
+ imgSurface->Release(imgSurface);
+ return ret;
+ }
+#endif
+
QDirectFBPixmapData *that = const_cast<QDirectFBPixmapData*>(this);
const QImage *img = that->buffer();
return img->copy();
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp
index fd6f48a..4ae64f7 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp
@@ -171,7 +171,7 @@ IDirectFBSurface* QDirectFBScreen::createDFBSurface(const QImage &img, SurfaceCr
}
#endif
#ifndef QT_NO_DIRECTFB_PALETTE
- if (img.numColors() != 0)
+ if (img.numColors() != 0 && surface)
QDirectFBScreen::setSurfaceColorTable(surface, img);
#endif
return surface;
@@ -185,9 +185,17 @@ IDirectFBSurface *QDirectFBScreen::copyDFBSurface(IDirectFBSurface *src,
QSize size;
src->GetSize(src, &size.rwidth(), &size.rheight());
IDirectFBSurface *surface = createDFBSurface(size, format, options);
- surface->SetBlittingFlags(surface, DSBLIT_NOFX);
+ DFBSurfacePixelFormat dspf;
+ src->GetPixelFormat(src, &dspf);
+ DFBSurfaceBlittingFlags flags = QDirectFBScreen::hasAlpha(dspf)
+ ? DSBLIT_BLEND_ALPHACHANNEL
+ : DSBLIT_NOFX;
+ if (flags & DSBLIT_BLEND_ALPHACHANNEL)
+ surface->Clear(surface, 0, 0, 0, 0);
+
+ surface->SetBlittingFlags(surface, flags);
surface->Blit(surface, src, 0, 0, 0);
- surface->ReleaseSource(surface); // ??? Is this always right?
+ surface->ReleaseSource(surface);
return surface;
}
@@ -218,8 +226,12 @@ IDirectFBSurface* QDirectFBScreen::createDFBSurface(const DFBSurfaceDescription
if (d_ptr->videoonly && !(desc->flags & DSDESC_PREALLOCATED)) {
// Add the video only capability. This means the surface will be created in video ram
DFBSurfaceDescription voDesc = *desc;
- voDesc.caps = DFBSurfaceCapabilities(voDesc.caps | DSCAPS_VIDEOONLY);
- voDesc.flags = DFBSurfaceDescriptionFlags(voDesc.flags | DSDESC_CAPS);
+ if (!(voDesc.flags & DSDESC_CAPS)) {
+ voDesc.caps = DSCAPS_VIDEOONLY;
+ voDesc.flags = DFBSurfaceDescriptionFlags(voDesc.flags | DSDESC_CAPS);
+ } else {
+ voDesc.caps = DFBSurfaceCapabilities(voDesc.caps | DSCAPS_VIDEOONLY);
+ }
result = d_ptr->dfb->CreateSurface(d_ptr->dfb, &voDesc, &newSurface);
}
@@ -257,28 +269,36 @@ IDirectFBSurface *QDirectFBScreen::copyToDFBSurface(const QImage &img,
#ifdef QT_NO_DIRECTFB_PREALLOCATED
|| image.format() != pixmapFormat
#endif
+#ifdef QT_NO_DIRECTFB_PALETTE
+ || image.numColors() != 0
+#endif
) {
image = image.convertToFormat(pixmapFormat);
}
-
- IDirectFBSurface *dfbSurface = createDFBSurface(img.size(), pixmapFormat, options);
+ IDirectFBSurface *dfbSurface = createDFBSurface(image.size(), pixmapFormat, options);
if (!dfbSurface) {
qWarning("QDirectFBPixmapData::fromImage() Couldn't create surface");
return 0;
}
#ifndef QT_NO_DIRECTFB_PREALLOCATED
- IDirectFBSurface *imgSurface = createDFBSurface(img, DontTrackSurface);
+ IDirectFBSurface *imgSurface = createDFBSurface(image, DontTrackSurface);
if (!imgSurface) {
qWarning("QDirectFBPixmapData::fromImage()");
QDirectFBScreen::releaseDFBSurface(dfbSurface);
return 0;
}
+
Q_ASSERT(imgSurface);
- DFBResult result;
- dfbSurface->SetBlittingFlags(dfbSurface, DSBLIT_NOFX);
- result = dfbSurface->Blit(dfbSurface, imgSurface, 0, 0, 0);
+ DFBSurfaceBlittingFlags flags = img.hasAlphaChannel()
+ ? DSBLIT_BLEND_ALPHACHANNEL
+ : DSBLIT_NOFX;
+ if (flags & DSBLIT_BLEND_ALPHACHANNEL)
+ dfbSurface->Clear(dfbSurface, 0, 0, 0, 0);
+
+ dfbSurface->SetBlittingFlags(dfbSurface, flags);
+ DFBResult result = dfbSurface->Blit(dfbSurface, imgSurface, 0, 0, 0);
if (result != DFB_OK)
DirectFBError("QDirectFBPixmapData::fromImage()", result);
dfbSurface->ReleaseSource(dfbSurface);
@@ -364,16 +384,6 @@ DFBSurfacePixelFormat QDirectFBScreen::getSurfacePixelFormat(QImage::Format form
};
}
-static inline bool isPremultiplied(IDirectFBSurface *surface)
-{
- Q_ASSERT(surface);
- DFBSurfaceCapabilities caps;
- const DFBResult result = surface->GetCapabilities(surface, &caps);
- Q_ASSERT(result == DFB_OK);
- Q_UNUSED(result);
- return caps & DSCAPS_PREMULTIPLIED;
-}
-
QImage::Format QDirectFBScreen::getImageFormat(IDirectFBSurface *surface)
{
DFBSurfacePixelFormat format;
@@ -1083,6 +1093,7 @@ void QDirectFBScreen::compose(const QRegion &region)
blit(surface->image(), offset, r);
}
}
+ d_ptr->dfbSurface->ReleaseSource(d_ptr->dfbSurface);
}
// Normally, when using DirectFB to compose the windows (I.e. when
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.h b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.h
index a1e93c6..f394ac1 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.h
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.h
@@ -119,6 +119,7 @@ public:
static QImage::Format getImageFormat(IDirectFBSurface *surface);
static bool initSurfaceDescriptionPixelFormat(DFBSurfaceDescription *description, QImage::Format format);
static inline bool isPremultiplied(QImage::Format format);
+ static inline bool hasAlpha(DFBSurfacePixelFormat format);
QImage::Format alphaPixmapFormat() const;
#ifndef QT_NO_DIRECTFB_PALETTE
@@ -151,6 +152,26 @@ inline bool QDirectFBScreen::isPremultiplied(QImage::Format format)
return false;
}
+inline bool QDirectFBScreen::hasAlpha(DFBSurfacePixelFormat format)
+{
+ switch (format) {
+ case DSPF_ARGB1555:
+ case DSPF_ARGB:
+ case DSPF_LUT8:
+ case DSPF_AiRGB:
+ case DSPF_A1:
+ case DSPF_ARGB2554:
+ case DSPF_ARGB4444:
+ case DSPF_AYUV:
+ case DSPF_A4:
+ case DSPF_ARGB1666:
+ case DSPF_ARGB6666:
+ case DSPF_LUT2:
+ return true;
+ default:
+ return false;
+ }
+}
QT_END_HEADER
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbsurface.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbsurface.cpp
index ef208af..4b8fe0a 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbsurface.cpp
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbsurface.cpp
@@ -94,14 +94,26 @@ bool QDirectFBSurface::isValid() const
#ifndef QT_NO_DIRECTFB_WM
void QDirectFBSurface::createWindow()
{
+#ifdef QT_NO_DIRECTFB_LAYER
+#warning QT_NO_DIRECTFB_LAYER requires QT_NO_DIRECTFB_WM
+#else
IDirectFBDisplayLayer *layer = screen->dfbDisplayLayer();
if (!layer)
qFatal("QDirectFBWindowSurface: Unable to get primary display layer!");
- DFBWindowDescription description;
- description.caps = DFBWindowCapabilities(DWCAPS_NODECORATION |
- DWCAPS_ALPHACHANNEL);
- description.flags = DWDESC_CAPS;
+ DFBWindowDescription description;
+ description.caps = DFBWindowCapabilities(DWCAPS_NODECORATION);
+ description.flags = DFBWindowDescriptionFlags(DWDESC_CAPS
+ |DWDESC_SURFACE_CAPS
+ |DWDESC_PIXELFORMAT);
+
+ description.surface_caps = DSCAPS_NONE;
+ if (screen->preferVideoOnly())
+ description.surface_caps = DFBSurfaceCapabilities(description.surface_caps|DSCAPS_VIDEOONLY);
+ const QImage::Format format = screen->pixelFormat();
+ description.pixelformat = QDirectFBScreen::getSurfacePixelFormat(format);
+ if (QDirectFBScreen::isPremultiplied(format))
+ description.surface_caps = DFBSurfaceCapabilities(DSCAPS_PREMULTIPLIED|description.caps);
DFBResult result = layer->CreateWindow(layer, &description, &dfbWindow);
if (result != DFB_OK)
@@ -111,6 +123,8 @@ void QDirectFBSurface::createWindow()
dfbSurface->Release(dfbSurface);
dfbWindow->GetSurface(dfbWindow, &dfbSurface);
+ forceRaster = (format == QImage::Format_RGB32);
+#endif
}
#endif // QT_NO_DIRECTFB_WM
@@ -143,6 +157,7 @@ void QDirectFBSurface::setGeometry(const QRect &rect, const QRegion &mask)
IDirectFBSurface *primarySurface = screen->dfbSurface();
Q_ASSERT(primarySurface);
result = primarySurface->GetSubSurface(primarySurface, &r, &dfbSurface);
+ forceRaster = (dfbSurface && QDirectFBScreen::getImageFormat(dfbSurface) == QImage::Format_RGB32);
} else {
#ifdef QT_NO_DIRECTFB_WM
if (isResize) {
@@ -162,8 +177,9 @@ void QDirectFBSurface::setGeometry(const QRect &rect, const QRegion &mask)
description.width = rect.width();
description.height = rect.height();
QDirectFBScreen::initSurfaceDescriptionPixelFormat(&description,
- QDirectFBScreen::instance()->pixelFormat());
- dfbSurface = QDirectFBScreen::instance()->createDFBSurface(&description, false);
+ screen->pixelFormat());
+ dfbSurface = screen->createDFBSurface(&description, false);
+ forceRaster = (dfbSurface && QDirectFBScreen::getImageFormat(dfbSurface) == QImage::Format_RGB32);
} else {
Q_ASSERT(dfbSurface);
}
@@ -250,7 +266,7 @@ bool QDirectFBSurface::scroll(const QRegion &region, int dx, int dy)
dfbSurface->SetBlittingFlags(dfbSurface, DSBLIT_NOFX);
dfbSurface->BatchBlit(dfbSurface, dfbSurface,
dfbRects.data(), dfbPoints.data(), n);
-
+ dfbSurface->ReleaseSource(dfbSurface);
return true;
}
@@ -318,6 +334,12 @@ inline bool isWidgetOpaque(const QWidget *w)
void QDirectFBSurface::flush(QWidget *widget, const QRegion &region,
const QPoint &offset)
{
+ Q_UNUSED(widget);
+#ifdef QT_NO_DIRECTFB_WM
+ Q_UNUSED(region);
+ Q_UNUSED(offset);
+#endif
+
QWidget *win = window();
// hw: make sure opacity information is updated before compositing
diff --git a/src/qt3support/text/q3richtext.cpp b/src/qt3support/text/q3richtext.cpp
index c058e37..e508001 100644
--- a/src/qt3support/text/q3richtext.cpp
+++ b/src/qt3support/text/q3richtext.cpp
@@ -4895,7 +4895,8 @@ void Q3TextParagraph::drawString(QPainter &painter, const QString &str, int star
bool extendRight = false;
bool extendLeft = false;
bool selWrap = (real_selEnd == length()-1 && n && n->hasSelection(it.key()));
- if (selWrap || this->str->at(real_selEnd).lineStart) {
+ if (selWrap
+ || ((real_selEnd < this->str->length()) && this->str->at(real_selEnd).lineStart)) {
extendRight = (fullSelectionWidth != 0);
if (!extendRight && !rightToLeft)
tmpw += painter.fontMetrics().width(QLatin1Char(' '));
diff --git a/src/sql/kernel/qsqldriver.cpp b/src/sql/kernel/qsqldriver.cpp
index ddebe45..a995005 100644
--- a/src/sql/kernel/qsqldriver.cpp
+++ b/src/sql/kernel/qsqldriver.cpp
@@ -406,9 +406,14 @@ QString QSqlDriver::sqlStatement(StatementType type, const QString &tableName,
break;
case WhereStatement:
if (preparedStatement) {
- for (int i = 0; i < rec.count(); ++i)
- s.append(escapeIdentifier(rec.fieldName(i), FieldName)).append(
- QLatin1String(" = ? AND "));
+ for (int i = 0; i < rec.count(); ++i) {
+ s.append(escapeIdentifier(rec.fieldName(i), FieldName));
+ if (rec.isNull(i))
+ s.append(QLatin1String(" IS NULL"));
+ else
+ s.append(QLatin1String(" = ?"));
+ s.append(QLatin1String(" AND "));
+ }
} else {
for (i = 0; i < rec.count(); ++i) {
s.append(escapeIdentifier(rec.fieldName(i), FieldName));
diff --git a/src/svg/qsvghandler.cpp b/src/svg/qsvghandler.cpp
index 18ba71c..433a3ad 100644
--- a/src/svg/qsvghandler.cpp
+++ b/src/svg/qsvghandler.cpp
@@ -2587,10 +2587,12 @@ static void parseBaseGradient(QSvgNode *node,
if (prop && prop->type() == QSvgStyleProperty::GRADIENT) {
QSvgGradientStyle *inherited =
static_cast<QSvgGradientStyle*>(prop);
- if (!inherited->stopLink().isEmpty())
+ if (!inherited->stopLink().isEmpty()) {
gradProp->setStopLink(inherited->stopLink(), handler->document());
- else
+ } else {
grad->setStops(inherited->qgradient()->stops());
+ gradProp->setGradientStopsSet(inherited->gradientStopsSet());
+ }
matrix = inherited->qmatrix();
} else {
diff --git a/src/svg/qsvgstyle.cpp b/src/svg/qsvgstyle.cpp
index 4a40bed..b065395 100644
--- a/src/svg/qsvgstyle.cpp
+++ b/src/svg/qsvgstyle.cpp
@@ -257,7 +257,7 @@ void QSvgGradientStyle::apply(QPainter *p, const QRectF &/*rect*/, QSvgNode *, Q
// If the gradient is marked as empty, insert transparent black
if (!m_gradientStopsSet) {
- m_gradient->setColorAt(0.0, QColor(0, 0, 0, 0));
+ m_gradient->setStops(QGradientStops() << QGradientStop(0.0, QColor(0, 0, 0, 0)));
m_gradientStopsSet = true;
}