summaryrefslogtreecommitdiffstats
path: root/tests/auto/qsvgrenderer
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/qsvgrenderer')
-rw-r--r--tests/auto/qsvgrenderer/.gitattributes1
-rw-r--r--tests/auto/qsvgrenderer/.gitignore1
-rw-r--r--tests/auto/qsvgrenderer/heart.svgzbin0 -> 1505 bytes
-rw-r--r--tests/auto/qsvgrenderer/large.svg462
-rw-r--r--tests/auto/qsvgrenderer/large.svgzbin0 -> 5082 bytes
-rw-r--r--tests/auto/qsvgrenderer/qsvgrenderer.pro18
-rw-r--r--tests/auto/qsvgrenderer/resources.qrc5
-rw-r--r--tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp649
8 files changed, 1136 insertions, 0 deletions
diff --git a/tests/auto/qsvgrenderer/.gitattributes b/tests/auto/qsvgrenderer/.gitattributes
new file mode 100644
index 0000000..0e69c23
--- /dev/null
+++ b/tests/auto/qsvgrenderer/.gitattributes
@@ -0,0 +1 @@
+large.svg -crlf
diff --git a/tests/auto/qsvgrenderer/.gitignore b/tests/auto/qsvgrenderer/.gitignore
new file mode 100644
index 0000000..c15ceec
--- /dev/null
+++ b/tests/auto/qsvgrenderer/.gitignore
@@ -0,0 +1 @@
+tst_qsvgrenderer
diff --git a/tests/auto/qsvgrenderer/heart.svgz b/tests/auto/qsvgrenderer/heart.svgz
new file mode 100644
index 0000000..43cd555
--- /dev/null
+++ b/tests/auto/qsvgrenderer/heart.svgz
Binary files differ
diff --git a/tests/auto/qsvgrenderer/large.svg b/tests/auto/qsvgrenderer/large.svg
new file mode 100644
index 0000000..c56549a
--- /dev/null
+++ b/tests/auto/qsvgrenderer/large.svg
@@ -0,0 +1,462 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ width="128"
+ height="128"
+ viewBox="0 0 105.427 137.439"
+ id="Livello_1"
+ xml:space="preserve"
+ style="overflow:visible"><defs
+ id="defs2727"><linearGradient
+ x1="26.294399"
+ y1="11.6704"
+ x2="71.901901"
+ y2="133.0273"
+ id="linearGradient3352"
+ xlink:href="#XMLID_34_"
+ gradientUnits="userSpaceOnUse" /><linearGradient
+ x1="36.838902"
+ y1="7.7075"
+ x2="82.446297"
+ y2="129.0645"
+ id="linearGradient3354"
+ xlink:href="#XMLID_34_"
+ gradientUnits="userSpaceOnUse" /><linearGradient
+ x1="33.882301"
+ y1="23.583"
+ x2="39.972198"
+ y2="23.583"
+ id="XMLID_34_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ id="stop2672"
+ style="stop-color:#ff5d5d;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop2674"
+ style="stop-color:#e20800;stop-opacity:1"
+ offset="1" />
+ </linearGradient><linearGradient
+ x1="33.882301"
+ y1="23.583"
+ x2="39.972198"
+ y2="23.583"
+ id="linearGradient3368"
+ xlink:href="#XMLID_34_"
+ gradientUnits="userSpaceOnUse" /><linearGradient
+ x1="54.356899"
+ y1="1.124"
+ x2="99.964401"
+ y2="122.481"
+ id="linearGradient3370"
+ xlink:href="#XMLID_34_"
+ gradientUnits="userSpaceOnUse" /><linearGradient
+ x1="15.8457"
+ y1="15.5972"
+ x2="61.453098"
+ y2="136.9541"
+ id="linearGradient3376"
+ xlink:href="#XMLID_34_"
+ gradientUnits="userSpaceOnUse" /><linearGradient
+ x1="43.438"
+ y1="5.2275"
+ x2="89.045403"
+ y2="126.5845"
+ id="linearGradient3382"
+ xlink:href="#XMLID_34_"
+ gradientUnits="userSpaceOnUse" /><linearGradient
+ x1="8.1176996"
+ y1="14.9019"
+ x2="70.759598"
+ y2="117.2331"
+ id="linearGradient3792"
+ xlink:href="#XMLID_30_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9991,-4.18e-2,4.18e-2,0.9991,-2.4309,1.195)" /><linearGradient
+ x1="10.5708"
+ y1="10.1548"
+ x2="73.2117"
+ y2="112.4844"
+ id="linearGradient3794"
+ xlink:href="#XMLID_30_"
+ gradientUnits="userSpaceOnUse" /><linearGradient
+ x1="6.2178001"
+ y1="72.223602"
+ x2="79.360802"
+ y2="72.223602"
+ id="XMLID_26_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,2.1512354)">
+ <stop
+ id="stop2578"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop2580"
+ style="stop-color:#eeeeec;stop-opacity:1"
+ offset="1" />
+ </linearGradient><filter
+ id="filter5869"><feGaussianBlur
+ id="feGaussianBlur5871"
+ stdDeviation="1.2254964"
+ inkscape:collect="always" /></filter><filter
+ id="filter5873"><feGaussianBlur
+ id="feGaussianBlur5875"
+ stdDeviation="1.3615922"
+ inkscape:collect="always" /></filter><filter
+ id="filter2854"><feGaussianBlur
+ id="feGaussianBlur2856"
+ stdDeviation="0.8944793"
+ inkscape:collect="always" /></filter></defs>
+<filter
+ id="AI_Sfocatura_1">
+ <feGaussianBlur
+ id="feGaussianBlur2545"
+ stdDeviation="1" />
+</filter>
+<g
+ transform="translate(-3.2052027,3.2058836)"
+ id="g2547">
+ <g
+ transform="matrix(0.9982563,0,0,0.9982563,-1.5492234e-2,0.2232388)"
+ id="g2549">
+ <g
+ id="g2551">
+ <linearGradient
+ x1="6.2178001"
+ y1="68.029297"
+ x2="79.360802"
+ y2="68.029297"
+ id="XMLID_24_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ id="stop2554"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop2556"
+ style="stop-color:#eeeeec;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <path
+ d="M 9.542,121.224 C 7.713,121.224 6.217,119.728 6.217,117.9 L 6.217,18.16 C 6.217,16.331 7.713,14.835 9.542,14.835 L 76.036,14.835 C 77.864,14.835 79.36,16.331 79.36,18.16 L 79.36,117.9 C 79.36,119.728 77.864,121.224 76.036,121.224 L 9.542,121.224 z"
+ id="path2558"
+ style="fill:url(#XMLID_24_)" />
+ </g>
+ <g
+ id="g2560">
+ <linearGradient
+ x1="10.5718"
+ y1="15.3989"
+ x2="73.212097"
+ y2="117.7277"
+ id="XMLID_25_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ id="stop2563"
+ style="stop-color:#77b753;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop2565"
+ style="stop-color:#00892c;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <path
+ d="M 11.204,18.159 C 10.29,18.159 9.542,18.907 9.542,19.821 L 9.542,116.237 C 9.542,117.151 10.29,117.899 11.204,117.899 L 74.375,117.899 C 75.289,117.899 76.037,117.151 76.037,116.237 L 76.037,19.821 C 76.037,18.907 75.289,18.159 74.375,18.159 L 11.204,18.159 z"
+ id="path2567"
+ style="fill:url(#XMLID_25_)" />
+ </g>
+ </g>
+ <g
+ transform="matrix(0.9982563,0,0,0.9982563,1.05825,0.2232388)"
+ id="g2569">
+ <path
+ d="M 11.639,126.468 C 9.811,126.468 8.314,124.972 8.314,123.143 L 8.314,23.403 C 8.314,21.574 9.811,20.078 11.639,20.078 L 78.134,20.078 C 79.962,20.078 81.458,21.574 81.458,23.403 L 81.458,123.143 C 81.458,124.972 79.962,126.468 78.134,126.468 L 23.696022,126.468 L 11.639,126.468 z"
+ transform="matrix(1.041449,0,0,1,-4.451967,3.1512354)"
+ id="path2575"
+ style="opacity:0.6;filter:url(#filter2854)" /><path
+ d="M 9.542,127.56924 C 7.714,127.56924 6.218,126.07324 6.218,124.24624 L 6.218,24.505236 C 6.218,22.677236 7.714,21.181236 9.542,21.181236 L 76.037,21.181236 C 77.865,21.181236 79.361,22.677236 79.361,24.505236 L 79.361,124.24624 C 79.361,126.07324 77.865,127.56924 76.037,127.56924 L 9.542,127.56924 z"
+ id="path2582"
+ style="fill:url(#XMLID_26_)" />
+ <g
+ transform="translate(0,2.1512354)"
+ id="g2584">
+ <g
+ transform="matrix(1.0276326,0,0,1,-2.2508995,0)"
+ id="g2586"
+ style="opacity:0.5;filter:url(#AI_Sfocatura_1)">
+ <path
+ d="M 11.639,123.321 C 9.811,123.321 8.314,121.824 8.314,119.997 L 81.458,119.997 C 81.458,121.824 79.962,123.321 78.134,123.321 L 11.639,123.321 z"
+ id="path2588" />
+ </g>
+ <linearGradient
+ x1="6.2178001"
+ y1="69.078102"
+ x2="79.360802"
+ y2="69.078102"
+ id="XMLID_27_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ id="stop2591"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop2593"
+ style="stop-color:#eeeeec;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <path
+ d="M 9.542,122.272 C 7.714,122.272 6.218,120.776 6.218,118.947 L 6.218,19.207 C 6.218,17.378 7.714,15.882 9.542,15.882 L 76.037,15.882 C 77.865,15.882 79.361,17.378 79.361,19.207 L 79.361,118.947 C 79.361,120.776 77.865,122.272 76.037,122.272 L 9.542,122.272 z"
+ id="path2595"
+ style="fill:url(#XMLID_27_)" />
+ </g>
+ <g
+ transform="translate(0,3.2268531)"
+ id="g2597">
+ <g
+ transform="matrix(1.0368435,0,0,1,-3.0011994,-1.0756177)"
+ id="g2599"
+ style="opacity:0.5;filter:url(#AI_Sfocatura_1)">
+ <path
+ d="M 11.639,120.175 C 9.811,120.175 8.314,118.679 8.314,116.85 L 81.458,116.85 C 81.458,118.679 79.962,120.175 78.134,120.175 L 11.639,120.175 z"
+ id="path2601" />
+ </g>
+ <linearGradient
+ x1="6.2178001"
+ y1="65.931602"
+ x2="79.360802"
+ y2="65.931602"
+ id="XMLID_28_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,-1.0756177)">
+ <stop
+ id="stop2604"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop2606"
+ style="stop-color:#eeeeec;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <path
+ d="M 9.542,118.05038 C 7.714,118.05038 6.218,116.55438 6.218,114.72638 L 6.218,14.986382 C 6.218,13.157382 7.714,11.661382 9.542,11.661382 L 76.037,11.661382 C 77.865,11.661382 79.361,13.157382 79.361,14.986382 L 79.361,114.72638 C 79.361,116.55438 77.865,118.05038 76.037,118.05038 L 9.542,118.05038 z"
+ id="path2608"
+ style="fill:url(#XMLID_28_)" />
+ </g>
+ <g
+ transform="translate(0,1.8317954)"
+ id="g2610">
+ <g
+ transform="matrix(1.0184218,0,0,1.0158314,-1.4821779,-1.8527316)"
+ id="g2612"
+ style="opacity:0.5;filter:url(#AI_Sfocatura_1)">
+ <path
+ d="M 10.639,117.029 C 8.811,117.029 7.314,115.532 7.314,113.704 L 7.314,13.964 C 7.314,12.135 8.811,10.639 10.639,10.639 L 77.134,10.639 C 78.962,10.639 80.458,12.135 80.458,13.964 L 80.458,113.704 C 80.458,115.532 78.962,117.029 77.134,117.029 L 10.639,117.029 z"
+ id="path2614" />
+ </g>
+ <linearGradient
+ x1="6.2178001"
+ y1="62.785599"
+ x2="79.360802"
+ y2="62.785599"
+ id="XMLID_29_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ id="stop2617"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop2619"
+ style="stop-color:#eeeeec;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <path
+ d="M 9.542,115.98 C 7.714,115.98 6.218,114.483 6.218,112.656 L 6.218,12.916 C 6.218,11.087 7.714,9.591 9.542,9.591 L 76.037,9.591 C 77.865,9.591 79.361,11.087 79.361,12.916 L 79.361,112.657 C 79.361,114.484 77.865,115.981 76.037,115.981 L 9.542,115.981 L 9.542,115.98 z"
+ id="path2621"
+ style="fill:url(#XMLID_29_)" />
+ <linearGradient
+ x1="10.5708"
+ y1="10.1548"
+ x2="73.2117"
+ y2="112.4844"
+ id="XMLID_30_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ id="stop2624"
+ style="stop-color:#73bdf2;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop2626"
+ style="stop-color:#3592ee;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <path
+ d="M 11.204,12.916 C 10.289,12.916 9.541,13.664 9.541,14.578 L 9.541,110.994 C 9.541,111.909 10.289,112.657 11.204,112.657 L 74.373,112.657 C 75.288,112.657 76.036,111.909 76.036,110.994 L 76.036,14.578 C 76.036,13.664 75.288,12.916 74.373,12.916 L 11.204,12.916 L 11.204,12.916 z"
+ id="path2628"
+ style="fill:url(#linearGradient3794)" />
+ </g>
+ </g>
+ <g
+ transform="matrix(0.9961334,-6.5068755e-2,6.5068755e-2,0.9961334,-5.7493275,-6.3015051)"
+ id="g2630">
+ <g
+ transform="matrix(1.0311837,0,0,1.0154411,-2.8218065,-1.9088007)"
+ id="g2632"
+ style="opacity:0.6;filter:url(#filter5869)">
+ <path
+ d="M 10.744,123.615 C 8.917,123.691 7.36,122.259 7.283,120.432 L 3.118,20.779 C 3.042,18.952 4.474,17.395 6.301,17.319 L 72.737,14.542 C 74.563,14.465 76.121,15.898 76.198,17.725 L 80.363,117.377 C 80.439,119.204 79.007,120.761 77.181,120.839 L 10.744,123.615 z"
+ id="path2634" />
+ </g>
+ <g
+ id="g2636">
+
+ <linearGradient
+ x1="3.7607"
+ y1="67.532204"
+ x2="76.909698"
+ y2="67.532204"
+ id="XMLID_31_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9991,-4.18e-2,4.18e-2,0.9991,-2.4309,1.195)">
+ <stop
+ id="stop2639"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop2641"
+ style="stop-color:#eeeeec;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <path
+ d="M 9.695,121.518 C 7.868,121.595 6.311,120.163 6.234,118.335 L 2.069,18.682 C 1.993,16.855 3.425,15.298 5.252,15.222 L 71.688,12.444 C 73.514,12.368 75.072,13.8 75.149,15.627 L 79.314,115.28 C 79.391,117.106 77.959,118.663 76.131,118.741 L 9.695,121.518 z"
+ id="path2643"
+ style="fill:url(#XMLID_31_)" />
+ </g>
+ <path
+ d="M 7.051,18.474 C 6.138,18.513 5.422,19.291 5.46,20.204 L 9.486,116.535 C 9.525,117.448 10.303,118.164 11.217,118.126 L 74.331,115.489 C 75.244,115.451 75.96,114.672 75.922,113.759 L 71.897,17.427 C 71.859,16.513 71.08,15.797 70.167,15.836 L 7.051,18.474 z"
+ id="path2652"
+ style="fill:url(#linearGradient3792);fill-opacity:1" />
+ <path
+ d="M 9.5625,22.375 C 10.84375,52.927083 12.125,83.479167 13.40625,114.03125 C 32.885417,113.21875 52.364583,112.40625 71.84375,111.59375 C 70.5625,81.041667 69.28125,50.489583 68,19.9375 C 48.520833,20.75 29.041667,21.5625 9.5625,22.375 z"
+ id="path4189"
+ style="opacity:0.6;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:1.00000001, 1.00000001;stroke-dashoffset:0;stroke-opacity:1" /></g>
+ <g
+ transform="matrix(0.9982563,0,0,0.9982563,10.72193,-5.1454722)"
+ id="g2654">
+ <g
+ transform="translate(-4.2156998e-8,1.0756177)"
+ id="g2656"
+ style="opacity:0.6;filter:url(#filter5873)">
+ <path
+ d="M 10.854785,112.52047 C 9.0174891,112.09656 7.8676311,110.2731 8.2990859,108.46891 L 31.839177,9.9940152 C 32.271664,8.1888112 34.127539,7.0580233 35.964835,7.481942 L 102.78149,22.901224 C 104.61776,23.325142 105.76865,25.149615 105.33616,26.954819 L 81.79607,125.42768 C 81.364615,127.23289 79.507708,128.36368 77.671444,127.93976 L 10.854785,112.52047 z"
+ id="path2658" />
+ </g>
+ <g
+ id="g2660">
+
+ <linearGradient
+ x1="16.688499"
+ y1="-8.9546003"
+ x2="94.108398"
+ y2="105.6356"
+ id="XMLID_33_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9735,0.2287,-0.2287,0.9735,14.4454,7.996)">
+ <stop
+ id="stop2663"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop2665"
+ style="stop-color:#eeeeec;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <path
+ d="M 12.707,111.688 C 10.927,111.271 9.813,109.472 10.231,107.692 L 33.037,10.593 C 33.455,8.813 35.254,7.698 37.034,8.116 L 101.767,23.32 C 103.546,23.738 104.661,25.537 104.243,27.317 L 81.436,124.415 C 81.019,126.195 79.219,127.31 77.44,126.892 L 12.707,111.688 z"
+ id="path2667"
+ style="fill:url(#XMLID_33_)" />
+ </g>
+ <path
+ d="M 33.925,25.17 L 35.435,25.3 C 35.369,25.76 35.413,26.134 35.567,26.422 C 35.721,26.71 35.941,26.887 36.226,26.954 C 36.538,27.027 36.832,26.947 37.114,26.715 C 37.396,26.483 37.594,26.116 37.712,25.615 C 37.821,25.149 37.805,24.759 37.661,24.445 C 37.517,24.132 37.298,23.939 37.004,23.87 C 36.811,23.825 36.571,23.817 36.281,23.846 L 36.797,22.386 C 37.187,22.487 37.522,22.455 37.801,22.292 C 38.076,22.127 38.26,21.847 38.353,21.451 C 38.431,21.12 38.41,20.843 38.291,20.618 C 38.172,20.392 37.984,20.25 37.729,20.19 C 37.473,20.13 37.226,20.187 36.987,20.358 C 36.749,20.531 36.562,20.825 36.427,21.24 L 35.104,20.624 C 35.455,19.78 35.886,19.208 36.401,18.909 C 36.915,18.61 37.492,18.536 38.131,18.686 C 38.85,18.855 39.36,19.244 39.663,19.853 C 39.967,20.462 40.045,21.076 39.9,21.695 C 39.802,22.113 39.618,22.468 39.35,22.758 C 39.081,23.049 38.726,23.276 38.287,23.439 C 38.699,23.661 38.996,24.004 39.18,24.471 C 39.362,24.937 39.383,25.471 39.242,26.073 C 39.036,26.949 38.604,27.613 37.948,28.064 C 37.29,28.515 36.601,28.655 35.88,28.486 C 35.189,28.323 34.661,27.944 34.297,27.347 C 33.931,26.751 33.808,26.025 33.925,25.17 z"
+ id="path2676"
+ style="fill:url(#linearGradient3368);fill-opacity:1" />
+ <linearGradient
+ x1="26.294399"
+ y1="11.6704"
+ x2="71.901901"
+ y2="133.0273"
+ id="XMLID_35_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ id="stop2679"
+ style="stop-color:#ff8080;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop2681"
+ style="stop-color:#e20800;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <path
+ d="M 32.977,38.964 C 33.619,37.58 34.903,36.55 35.811,35.945 C 36.752,35.319 37.49,34.55 37.729,33.53 C 38.094,31.979 36.471,30.257 34.621,31.997 C 33.74,29.616 31.507,30.433 31.143,31.984 C 30.903,33.003 31.223,34.019 31.786,35 C 32.329,35.946 33.021,37.439 32.977,38.964 z"
+ id="path2683"
+ style="fill:url(#linearGradient3352);fill-opacity:1" />
+ <path
+ d="M 80.223,109.559 L 78.711,109.43 C 78.779,108.969 78.734,108.595 78.58,108.308 C 78.426,108.02 78.205,107.842 77.922,107.776 C 77.61,107.703 77.315,107.782 77.033,108.014 C 76.751,108.246 76.553,108.614 76.433,109.114 C 76.324,109.581 76.341,109.97 76.484,110.284 C 76.629,110.598 76.849,110.79 77.142,110.859 C 77.335,110.904 77.576,110.913 77.865,110.883 L 77.349,112.343 C 76.958,112.242 76.624,112.274 76.345,112.439 C 76.07,112.603 75.886,112.883 75.792,113.279 C 75.714,113.609 75.735,113.887 75.854,114.112 C 75.973,114.339 76.161,114.481 76.416,114.541 C 76.672,114.602 76.918,114.545 77.156,114.372 C 77.394,114.2 77.582,113.906 77.717,113.49 L 79.039,114.106 C 78.689,114.95 78.258,115.521 77.742,115.82 C 77.228,116.119 76.652,116.193 76.013,116.043 C 75.294,115.874 74.783,115.486 74.48,114.876 C 74.175,114.268 74.097,113.653 74.244,113.034 C 74.342,112.616 74.525,112.262 74.795,111.971 C 75.063,111.681 75.418,111.453 75.857,111.289 C 75.445,111.069 75.146,110.725 74.964,110.259 C 74.78,109.793 74.761,109.259 74.902,108.657 C 75.109,107.78 75.541,107.117 76.197,106.666 C 76.855,106.216 77.543,106.075 78.265,106.244 C 78.956,106.406 79.484,106.786 79.849,107.382 C 80.217,107.978 80.34,108.704 80.223,109.559 z"
+ id="path2694"
+ style="fill:#e20800;fill-opacity:1" /><path
+ d="M 81.063,95.83 C 80.422,97.214 79.138,98.244 78.23,98.85 C 77.29,99.477 76.55,100.246 76.311,101.264 C 75.947,102.815 77.57,104.536 79.419,102.797 C 80.301,105.178 82.533,104.361 82.898,102.811 C 83.138,101.791 82.819,100.776 82.255,99.795 C 81.711,98.849 81.021,97.355 81.063,95.83 z"
+ id="path2701"
+ style="fill:url(#linearGradient3382);fill-opacity:1" />
+ <linearGradient
+ x1="54.356899"
+ y1="1.124"
+ x2="99.964401"
+ y2="122.481"
+ id="XMLID_39_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ id="stop2704"
+ style="stop-color:#ff8080;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop2706"
+ style="stop-color:#e20800;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <path
+ d="M 63.174,42.222 C 64.361,39.656 66.742,37.748 68.427,36.625 C 70.171,35.463 71.54,34.04 71.985,32.15 C 72.66,29.274 69.651,26.081 66.22,29.307 C 64.585,24.892 60.448,26.406 59.772,29.281 C 59.329,31.172 59.921,33.055 60.965,34.873 C 61.97,36.628 63.253,39.396 63.174,42.222 z"
+ id="path2708"
+ style="fill:url(#linearGradient3370);fill-opacity:1" />
+ <linearGradient
+ x1="36.838902"
+ y1="7.7075"
+ x2="82.446297"
+ y2="129.0645"
+ id="XMLID_40_"
+ xlink:href="#XMLID_39_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ id="stop2711"
+ style="stop-color:#ff8080;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop2713"
+ style="stop-color:#e20800;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <path
+ d="M 55.486,74.959 C 56.672,72.393 59.054,70.485 60.737,69.362 C 62.481,68.2 63.851,66.777 64.296,64.886 C 64.97,62.01 61.962,58.818 58.532,62.043 C 56.897,57.628 52.759,59.142 52.082,62.018 C 51.638,63.908 52.23,65.792 53.275,67.609 C 54.281,69.364 55.565,72.132 55.486,74.959 z"
+ id="path2715"
+ style="fill:url(#linearGradient3354);fill-opacity:1" />
+ <path
+ d="M 51.37,92.488 C 50.182,95.054 47.801,96.961 46.117,98.084 C 44.373,99.246 43.004,100.67 42.559,102.561 C 41.884,105.436 44.893,108.627 48.323,105.404 C 49.958,109.82 54.096,108.304 54.772,105.428 C 55.217,103.538 54.623,101.655 53.579,99.836 C 52.573,98.082 51.291,95.314 51.37,92.488 z"
+ id="path2724"
+ style="fill:url(#linearGradient3376);fill-opacity:1" />
+ </g>
+</g>
+</svg> \ No newline at end of file
diff --git a/tests/auto/qsvgrenderer/large.svgz b/tests/auto/qsvgrenderer/large.svgz
new file mode 100644
index 0000000..c2e193b
--- /dev/null
+++ b/tests/auto/qsvgrenderer/large.svgz
Binary files differ
diff --git a/tests/auto/qsvgrenderer/qsvgrenderer.pro b/tests/auto/qsvgrenderer/qsvgrenderer.pro
new file mode 100644
index 0000000..8cfbcce
--- /dev/null
+++ b/tests/auto/qsvgrenderer/qsvgrenderer.pro
@@ -0,0 +1,18 @@
+############################################################
+# Project file for autotest for file qsvgrenderer.h
+############################################################
+
+load(qttest_p4)
+QT += svg
+
+SOURCES += tst_qsvgrenderer.cpp
+RESOURCES += resources.qrc
+
+wince*|symbian {
+ addFiles.sources = *.svg *.svgz
+ addFiles.path = .
+
+ DEPLOYMENT += addFiles
+ DEPLOYMENT_PLUGIN += qsvg
+}
+
diff --git a/tests/auto/qsvgrenderer/resources.qrc b/tests/auto/qsvgrenderer/resources.qrc
new file mode 100644
index 0000000..d666bcf
--- /dev/null
+++ b/tests/auto/qsvgrenderer/resources.qrc
@@ -0,0 +1,5 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file>heart.svgz</file>
+</qresource>
+</RCC>
diff --git a/tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp b/tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp
new file mode 100644
index 0000000..4a17031
--- /dev/null
+++ b/tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp
@@ -0,0 +1,649 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the test suite 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 <QtTest/QtTest>
+
+#include <qapplication.h>
+#include <qdebug.h>
+#include <qsvgrenderer.h>
+#include <qsvggenerator.h>
+#include <QPainter>
+#include <QPen>
+#include <QPicture>
+#include <QXmlStreamReader>
+
+//TESTED_CLASS=
+//TESTED_FILES=
+
+class tst_QSvgRenderer : public QObject
+{
+Q_OBJECT
+
+public:
+ tst_QSvgRenderer();
+ virtual ~tst_QSvgRenderer();
+
+private slots:
+ void getSetCheck();
+ void inexistentUrl();
+ void emptyUrl();
+ void testStrokeWidth();
+ void testMapViewBoxToTarget();
+ void testRenderElement();
+ void constructorQXmlStreamReader() const;
+ void loadQXmlStreamReader() const;
+ void nestedQXmlStreamReader() const;
+ void stylePropagation() const;
+ void matrixForElement() const;
+ void gradientStops() const;
+ void fillRule();
+
+#ifndef QT_NO_COMPRESS
+ void testGzLoading();
+ void testGzHelper_data();
+ void testGzHelper();
+#endif
+
+private:
+ static const char *const src;
+};
+
+const char *const tst_QSvgRenderer::src = "<svg><g><rect x='250' y='250' width='500' height='500'/>"
+ "<rect id='foo' x='400' y='400' width='100' height='100'/></g></svg>";
+
+tst_QSvgRenderer::tst_QSvgRenderer()
+{
+}
+
+tst_QSvgRenderer::~tst_QSvgRenderer()
+{
+}
+
+// Testing get/set functions
+void tst_QSvgRenderer::getSetCheck()
+{
+ QSvgRenderer obj1;
+ // int QSvgRenderer::framesPerSecond()
+ // void QSvgRenderer::setFramesPerSecond(int)
+ obj1.setFramesPerSecond(20);
+ QCOMPARE(20, obj1.framesPerSecond());
+ obj1.setFramesPerSecond(0);
+ QCOMPARE(0, obj1.framesPerSecond());
+ obj1.setFramesPerSecond(INT_MIN);
+ QCOMPARE(0, obj1.framesPerSecond()); // Can't have a negative framerate
+ obj1.setFramesPerSecond(INT_MAX);
+ QCOMPARE(INT_MAX, obj1.framesPerSecond());
+}
+
+void tst_QSvgRenderer::inexistentUrl()
+{
+ const char *src = "<svg><g><path d=\"\" style=\"stroke:url(#inexistent)\"/></g></svg>";
+
+ QByteArray data(src);
+ QSvgRenderer renderer(data);
+
+ QVERIFY(renderer.isValid());
+}
+
+void tst_QSvgRenderer::emptyUrl()
+{
+ const char *src = "<svg><text fill=\"url()\" /></svg>";
+
+ QByteArray data(src);
+ QSvgRenderer renderer(data);
+
+ QVERIFY(renderer.isValid());
+}
+
+void tst_QSvgRenderer::testStrokeWidth()
+{
+ qreal squareSize = 30.0;
+ qreal strokeWidth = 1.0;
+ qreal topLeft = 100.0;
+
+ QSvgGenerator generator;
+
+ QBuffer buffer;
+ QByteArray byteArray;
+ buffer.setBuffer(&byteArray);
+ generator.setOutputDevice(&buffer);
+
+ QPainter painter(&generator);
+ painter.setBrush(Qt::blue);
+
+ // Draw a rect with stroke
+ painter.setPen(QPen(Qt::black, strokeWidth));
+ painter.drawRect(topLeft, topLeft, squareSize, squareSize);
+
+ // Draw a rect without stroke
+ painter.setPen(Qt::NoPen);
+ painter.drawRect(topLeft, topLeft, squareSize, squareSize);
+ painter.end();
+
+ // Insert ID tags into the document
+ byteArray.insert(byteArray.indexOf("stroke=\"#000000\""), "id=\"SquareStroke\" ");
+ byteArray.insert(byteArray.indexOf("stroke=\"none\""), "id=\"SquareNoStroke\" ");
+
+ QSvgRenderer renderer(byteArray);
+
+ QRectF noStrokeRect = renderer.boundsOnElement("SquareNoStroke");
+ QCOMPARE(noStrokeRect.width(), squareSize);
+ QCOMPARE(noStrokeRect.height(), squareSize);
+ QCOMPARE(noStrokeRect.x(), topLeft);
+ QCOMPARE(noStrokeRect.y(), topLeft);
+
+ QRectF strokeRect = renderer.boundsOnElement("SquareStroke");
+ QCOMPARE(strokeRect.width(), squareSize + strokeWidth);
+ QCOMPARE(strokeRect.height(), squareSize + strokeWidth);
+ QCOMPARE(strokeRect.x(), topLeft - (strokeWidth / 2));
+ QCOMPARE(strokeRect.y(), topLeft - (strokeWidth / 2));
+}
+
+void tst_QSvgRenderer::testMapViewBoxToTarget()
+{
+ const char *src = "<svg><g><rect x=\"250\" y=\"250\" width=\"500\" height=\"500\" /></g></svg>";
+ QByteArray data(src);
+
+ { // No viewport, viewBox, targetRect, or deviceRect -> boundingRect
+ QPicture picture;
+ QPainter painter(&picture);
+ QSvgRenderer rend(data);
+ rend.render(&painter);
+ painter.end();
+ QCOMPARE(picture.boundingRect(), QRect(0, 0, 500, 500));
+ }
+
+ { // No viewport, viewBox, targetRect -> deviceRect
+ QPicture picture;
+ picture.setBoundingRect(QRect(100, 100, 200, 200));
+ QPainter painter(&picture);
+ QSvgRenderer rend(data);
+ rend.render(&painter);
+ painter.end();
+ QCOMPARE(picture.boundingRect(), QRect(100, 100, 200, 200));
+ }
+
+ { // No viewport, viewBox -> targetRect
+ QPicture picture;
+ QPainter painter(&picture);
+ QSvgRenderer rend(data);
+ rend.render(&painter, QRectF(50, 50, 250, 250));
+ painter.end();
+ QCOMPARE(picture.boundingRect(), QRect(50, 50, 250, 250));
+
+ }
+
+ data.replace("<svg>", "<svg viewBox=\"0 0 1000 1000\">");
+
+ { // No viewport, no targetRect -> viewBox
+ QPicture picture;
+ QPainter painter(&picture);
+ QSvgRenderer rend(data);
+ rend.render(&painter);
+ painter.end();
+ QCOMPARE(picture.boundingRect(), QRect(250, 250, 500, 500));
+ }
+
+ data.replace("<svg", "<svg width=\"500\" height=\"500\"");
+
+ { // Viewport
+ QPicture picture;
+ QPainter painter(&picture);
+ QSvgRenderer rend(data);
+ rend.render(&painter);
+ painter.end();
+ QCOMPARE(picture.boundingRect(), QRect(125, 125, 250, 250));
+ }
+
+}
+
+void tst_QSvgRenderer::testRenderElement()
+{
+ QByteArray data(src);
+
+ { // No viewport, viewBox, targetRect, or deviceRect -> boundingRect
+ QPicture picture;
+ QPainter painter(&picture);
+ QSvgRenderer rend(data);
+ rend.render(&painter, QLatin1String("foo"));
+ painter.end();
+ QCOMPARE(picture.boundingRect(), QRect(0, 0, 100, 100));
+ }
+
+ { // No viewport, viewBox, targetRect -> deviceRect
+ QPicture picture;
+ picture.setBoundingRect(QRect(100, 100, 200, 200));
+ QPainter painter(&picture);
+ QSvgRenderer rend(data);
+ rend.render(&painter, QLatin1String("foo"));
+ painter.end();
+ QCOMPARE(picture.boundingRect(), QRect(100, 100, 200, 200));
+ }
+
+ { // No viewport, viewBox -> targetRect
+ QPicture picture;
+ QPainter painter(&picture);
+ QSvgRenderer rend(data);
+ rend.render(&painter, QLatin1String("foo"), QRectF(50, 50, 250, 250));
+ painter.end();
+ QCOMPARE(picture.boundingRect(), QRect(50, 50, 250, 250));
+
+ }
+
+ data.replace("<svg>", "<svg viewBox=\"0 0 1000 1000\">");
+
+ { // No viewport, no targetRect -> view box size
+ QPicture picture;
+ QPainter painter(&picture);
+ QSvgRenderer rend(data);
+ rend.render(&painter, QLatin1String("foo"));
+ painter.end();
+ QCOMPARE(picture.boundingRect(), QRect(0, 0, 100, 100));
+ }
+
+ data.replace("<svg", "<svg width=\"500\" height=\"500\"");
+
+ { // Viewport
+ QPicture picture;
+ QPainter painter(&picture);
+ QSvgRenderer rend(data);
+ rend.render(&painter, QLatin1String("foo"));
+ painter.end();
+ QCOMPARE(picture.boundingRect(), QRect(0, 0, 100, 100));
+ }
+
+}
+
+void tst_QSvgRenderer::constructorQXmlStreamReader() const
+{
+ const QByteArray data(src);
+
+ QXmlStreamReader reader(data);
+
+ QPicture picture;
+ QPainter painter(&picture);
+ QSvgRenderer rend(&reader);
+ rend.render(&painter, QLatin1String("foo"));
+ painter.end();
+ QCOMPARE(picture.boundingRect(), QRect(0, 0, 100, 100));
+}
+
+void tst_QSvgRenderer::loadQXmlStreamReader() const
+{
+ const QByteArray data(src);
+
+ QXmlStreamReader reader(data);
+ QPicture picture;
+ QPainter painter(&picture);
+ QSvgRenderer rend;
+ rend.load(&reader);
+ rend.render(&painter, QLatin1String("foo"));
+ painter.end();
+ QCOMPARE(picture.boundingRect(), QRect(0, 0, 100, 100));
+}
+
+
+void tst_QSvgRenderer::nestedQXmlStreamReader() const
+{
+ const QByteArray data(QByteArray("<bar>") + QByteArray(src) + QByteArray("</bar>"));
+
+ QXmlStreamReader reader(data);
+
+ QCOMPARE(reader.readNext(), QXmlStreamReader::StartDocument);
+ QCOMPARE(reader.readNext(), QXmlStreamReader::StartElement);
+ QCOMPARE(reader.name().toString(), QLatin1String("bar"));
+
+ QPicture picture;
+ QPainter painter(&picture);
+ QSvgRenderer renderer(&reader);
+ renderer.render(&painter, QLatin1String("foo"));
+ painter.end();
+ QCOMPARE(picture.boundingRect(), QRect(0, 0, 100, 100));
+
+ QCOMPARE(reader.readNext(), QXmlStreamReader::EndElement);
+ QCOMPARE(reader.name().toString(), QLatin1String("bar"));
+ QCOMPARE(reader.readNext(), QXmlStreamReader::EndDocument);
+
+ QVERIFY(reader.atEnd());
+ QVERIFY(!reader.hasError());
+}
+
+void tst_QSvgRenderer::stylePropagation() const
+{
+ QByteArray data("<svg>"
+ "<g id='foo' style='fill:#ffff00;'>"
+ "<g id='bar' style='fill:#ff00ff;'>"
+ "<g id='baz' style='fill:#00ffff;'>"
+ "<rect id='alpha' x='0' y='0' width='100' height='100'/>"
+ "</g>"
+ "<rect id='beta' x='100' y='0' width='100' height='100'/>"
+ "</g>"
+ "<rect id='gamma' x='0' y='100' width='100' height='100'/>"
+ "</g>"
+ "<rect id='delta' x='100' y='100' width='100' height='100'/>"
+ "</svg>"); // alpha=cyan, beta=magenta, gamma=yellow, delta=black
+
+ QImage image1(200, 200, QImage::Format_RGB32);
+ QImage image2(200, 200, QImage::Format_RGB32);
+ QImage image3(200, 200, QImage::Format_RGB32);
+ QPainter painter;
+ QSvgRenderer renderer(data);
+ QLatin1String parts[4] = {QLatin1String("alpha"), QLatin1String("beta"), QLatin1String("gamma"), QLatin1String("delta")};
+
+ QVERIFY(painter.begin(&image1));
+ for (int i = 0; i < 4; ++i)
+ renderer.render(&painter, parts[i], QRectF(renderer.boundsOnElement(parts[i])));
+ painter.end();
+
+ QVERIFY(painter.begin(&image2));
+ renderer.render(&painter, renderer.viewBoxF());
+ painter.end();
+
+ QVERIFY(painter.begin(&image3));
+ painter.setPen(Qt::NoPen);
+ painter.setBrush(QBrush(Qt::cyan));
+ painter.drawRect(0, 0, 100, 100);
+ painter.setBrush(QBrush(Qt::magenta));
+ painter.drawRect(100, 0, 100, 100);
+ painter.setBrush(QBrush(Qt::yellow));
+ painter.drawRect(0, 100, 100, 100);
+ painter.setBrush(QBrush(Qt::black));
+ painter.drawRect(100, 100, 100, 100);
+ painter.end();
+
+ QCOMPARE(image1, image2);
+ QCOMPARE(image1, image3);
+}
+
+static qreal transformNorm(const QTransform &m)
+{
+ return qSqrt(m.m11() * m.m11()
+ + m.m12() * m.m12()
+ + m.m13() * m.m13()
+ + m.m21() * m.m21()
+ + m.m22() * m.m22()
+ + m.m23() * m.m23()
+ + m.m31() * m.m31()
+ + m.m32() * m.m32()
+ + m.m33() * m.m33());
+}
+
+static bool diffIsSmallEnough(double diff, double norm)
+{
+ return diff <= 1e-12 * norm;
+}
+
+static bool diffIsSmallEnough(float diff, float norm)
+{
+ return diff <= 1e-5 * norm;
+}
+
+static void compareTransforms(const QTransform &m1, const QTransform &m2)
+{
+ qreal norm1 = transformNorm(m1);
+ qreal norm2 = transformNorm(m2);
+ qreal diffNorm = transformNorm(QTransform(m1.m11() - m2.m11(),
+ m1.m12() - m2.m12(),
+ m1.m13() - m2.m13(),
+ m1.m21() - m2.m21(),
+ m1.m22() - m2.m22(),
+ m1.m23() - m2.m23(),
+ m1.m31() - m2.m31(),
+ m1.m32() - m2.m32(),
+ m1.m33() - m2.m33()));
+ QVERIFY(diffIsSmallEnough(diffNorm, qMin(norm1, norm2)));
+}
+
+void tst_QSvgRenderer::matrixForElement() const
+{
+ QByteArray data("<svg>"
+ "<g id='ichi' transform='translate(-3,1)'>"
+ "<g id='ni' transform='rotate(45)'>"
+ "<g id='san' transform='scale(4,2)'>"
+ "<g id='yon' transform='matrix(1,2,3,4,5,6)'>"
+ "<rect id='firkant' x='-1' y='-1' width='2' height='2'/>"
+ "</g>"
+ "</g>"
+ "</g>"
+ "</g>"
+ "</svg>");
+
+ QImage image(13, 37, QImage::Format_RGB32);
+ QPainter painter(&image);
+ QSvgRenderer renderer(data);
+
+ compareTransforms(QTransform(painter.worldMatrix()), QTransform(renderer.matrixForElement(QLatin1String("ichi"))));
+ painter.translate(-3, 1);
+ compareTransforms(QTransform(painter.worldMatrix()), QTransform(renderer.matrixForElement(QLatin1String("ni"))));
+ painter.rotate(45);
+ compareTransforms(QTransform(painter.worldMatrix()), QTransform(renderer.matrixForElement(QLatin1String("san"))));
+ painter.scale(4, 2);
+ compareTransforms(QTransform(painter.worldMatrix()), QTransform(renderer.matrixForElement(QLatin1String("yon"))));
+ painter.setWorldMatrix(QMatrix(1, 2, 3, 4, 5, 6), true);
+ compareTransforms(QTransform(painter.worldMatrix()), QTransform(renderer.matrixForElement(QLatin1String("firkant"))));
+}
+
+void tst_QSvgRenderer::gradientStops() const
+{
+ {
+ QByteArray data("<svg>"
+ "<defs>"
+ "<linearGradient id=\"gradient\">"
+ "</linearGradient>"
+ "</defs>"
+ "<rect fill=\"url(#gradient)\" height=\"64\" width=\"64\" x=\"0\" y=\"0\"/>"
+ "</svg>");
+ QSvgRenderer renderer(data);
+
+ QImage image(64, 64, QImage::Format_ARGB32_Premultiplied), refImage(64, 64, QImage::Format_ARGB32_Premultiplied);
+ image.fill(0x87654321);
+ refImage.fill(0x87654321);
+
+ QPainter painter(&image);
+ renderer.render(&painter);
+ QCOMPARE(image, refImage);
+ }
+
+ {
+ QByteArray data("<svg>"
+ "<defs>"
+ "<linearGradient id=\"gradient\">"
+ "<stop offset=\"1\" stop-color=\"cyan\"/>"
+ "</linearGradient>"
+ "</defs>"
+ "<rect fill=\"url(#gradient)\" height=\"64\" width=\"64\" x=\"0\" y=\"0\"/>"
+ "</svg>");
+ QSvgRenderer renderer(data);
+
+ QImage image(64, 64, QImage::Format_ARGB32_Premultiplied), refImage(64, 64, QImage::Format_ARGB32_Premultiplied);
+ refImage.fill(0xff00ffff);
+
+ QPainter painter(&image);
+ renderer.render(&painter);
+ QCOMPARE(image, refImage);
+ }
+
+ {
+ QByteArray data("<svg>"
+ "<defs>"
+ "<linearGradient id=\"gradient\">"
+ "<stop offset=\"0\" stop-color=\"red\"/>"
+ "<stop offset=\"0\" stop-color=\"cyan\"/>"
+ "<stop offset=\"0.5\" stop-color=\"cyan\"/>"
+ "<stop offset=\"0.5\" stop-color=\"magenta\"/>"
+ "<stop offset=\"0.5\" stop-color=\"yellow\"/>"
+ "<stop offset=\"1\" stop-color=\"yellow\"/>"
+ "<stop offset=\"1\" stop-color=\"blue\"/>"
+ "</linearGradient>"
+ "</defs>"
+ "<rect fill=\"url(#gradient)\" height=\"64\" width=\"64\" x=\"0\" y=\"0\"/>"
+ "</svg>");
+ QSvgRenderer renderer(data);
+
+ QImage image(64, 64, QImage::Format_ARGB32_Premultiplied), refImage(64, 64, QImage::Format_ARGB32_Premultiplied);
+
+ QPainter painter;
+ painter.begin(&refImage);
+ painter.fillRect(QRectF(0, 0, 32, 64), Qt::cyan);
+ painter.fillRect(QRectF(32, 0, 32, 64), Qt::yellow);
+ painter.end();
+
+ painter.begin(&image);
+ renderer.render(&painter);
+ painter.end();
+
+ QCOMPARE(image, refImage);
+ }
+
+ {
+ QByteArray data("<svg>"
+ "<defs>"
+ "<linearGradient id=\"gradient\">"
+ "<stop offset=\"0\" stop-color=\"red\" stop-opacity=\"0\"/>"
+ "<stop offset=\"1\" stop-color=\"blue\"/>"
+ "</linearGradient>"
+ "</defs>"
+ "<rect fill=\"url(#gradient)\" height=\"8\" width=\"256\" x=\"0\" y=\"0\"/>"
+ "</svg>");
+ QSvgRenderer renderer(data);
+
+ QImage image(256, 8, QImage::Format_ARGB32_Premultiplied);
+ image.fill(0);
+
+ QPainter painter(&image);
+ renderer.render(&painter);
+
+ const QRgb *line = reinterpret_cast<QRgb *>(image.scanLine(3));
+ QRgb left = line[0]; // transparent black
+ QRgb mid = line[127]; // semi transparent magenta
+ QRgb right = line[255]; // opaque blue
+
+ QVERIFY((qAlpha(left) < 3) && (qRed(left) < 3) && (qGreen(left) == 0) && (qBlue(left) < 3));
+ QVERIFY((qAbs(qAlpha(mid) - 127) < 3) && (qAbs(qRed(mid) - 63) < 4) && (qGreen(mid) == 0) && (qAbs(qBlue(mid) - 63) < 4));
+ QVERIFY((qAlpha(right) > 253) && (qRed(right) < 3) && (qGreen(right) == 0) && (qBlue(right) > 251));
+ }
+}
+
+#ifndef QT_NO_COMPRESS
+void tst_QSvgRenderer::testGzLoading()
+{
+ QSvgRenderer renderer(QLatin1String("heart.svgz"));
+ QVERIFY(renderer.isValid());
+
+ QSvgRenderer resourceRenderer(QLatin1String(":/heart.svgz"));
+ QVERIFY(resourceRenderer.isValid());
+
+ QFile largeFileGz("large.svgz");
+ largeFileGz.open(QIODevice::ReadOnly);
+ QByteArray data = largeFileGz.readAll();
+ QSvgRenderer autoDetectGzData(data);
+ QVERIFY(autoDetectGzData.isValid());
+}
+
+QT_BEGIN_NAMESPACE
+QByteArray qt_inflateGZipDataFrom(QIODevice *device);
+QT_END_NAMESPACE
+
+void tst_QSvgRenderer::testGzHelper_data()
+{
+ QTest::addColumn<QByteArray>("in");
+ QTest::addColumn<QByteArray>("out");
+
+ QTest::newRow("empty") << QByteArray() << QByteArray();
+ QTest::newRow("small") << QByteArray::fromHex(QByteArray("1f8b08005819934800034b"
+ "cbcfe70200a865327e04000000")) << QByteArray("foo\n");
+
+ QFile largeFileGz("large.svgz");
+ largeFileGz.open(QIODevice::ReadOnly);
+ QFile largeFile("large.svg");
+ largeFile.open(QIODevice::ReadOnly);
+ QTest::newRow("large") << largeFileGz.readAll() << largeFile.readAll();
+
+ QTest::newRow("zeroes") << QByteArray::fromHex(QByteArray("1f8b0800131f9348000333"
+ "301805a360148c54c00500d266708601040000")) << QByteArray(1024, '0').append('\n');
+
+ QTest::newRow("twoMembers") << QByteArray::fromHex(QByteArray("1f8b08001c2a934800034b"
+ "cbcfe70200a865327e040000001f8b08001c2a934800034b4a2ce20200e9b3a20404000000"))
+ << QByteArray("foo\nbar\n");
+
+ // We should still get data of the first member if subsequent members are corrupt
+ QTest::newRow("corruptedSecondMember") << QByteArray::fromHex(QByteArray("1f8b08001c2a934800034b"
+ "cbcfe70200a865327e040000001f8c08001c2a934800034b4a2ce20200e9b3a20404000000"))
+ << QByteArray("foo\n");
+
+}
+
+void tst_QSvgRenderer::testGzHelper()
+{
+ QFETCH(QByteArray, in);
+ QFETCH(QByteArray, out);
+
+ QBuffer buffer(&in);
+ buffer.open(QIODevice::ReadOnly);
+ QVERIFY(buffer.isReadable());
+ QByteArray result = qt_inflateGZipDataFrom(&buffer);
+ QCOMPARE(result, out);
+}
+#endif
+
+void tst_QSvgRenderer::fillRule()
+{
+ QByteArray data(
+ "<svg>"
+ "<rect x=\"0\" y=\"0\" height=\"300\" width=\"400\" fill=\"blue\" />"
+ "<path d=\"M100 200 L300 200 L300 100 L100 100 M100 200 L300 200 L300 100 L100 100 Z\" fill=\"red\" stroke=\"black\" />"
+ "</svg>");
+
+ QSvgRenderer renderer(data);
+
+ QImage image(128, 128, QImage::Format_ARGB32_Premultiplied);
+ image.fill(0);
+
+ QPainter painter(&image);
+ renderer.render(&painter);
+ painter.end();
+
+ QCOMPARE(image.pixel(64, 64), QColor(Qt::red).rgba());
+}
+
+QTEST_MAIN(tst_QSvgRenderer)
+#include "tst_qsvgrenderer.moc"