From b916b030e1db278bca84189cfe5cbf450d7aa29b Mon Sep 17 00:00:00 2001 From: Alan Alpert <alan.alpert@nokia.com> Date: Fri, 11 May 2012 19:38:49 +1000 Subject: [PATCH] Flesh out the sprite documentation Task-number: QTBUG-24770 Change-Id: I40c46aa29ffdcc5899bece46c4b6227ca29695cd Reviewed-by: Martin Jones <martin.jones@nokia.com> --- src/particles/qquickimageparticle.cpp | 2 + src/quick/doc/images/spritecutting.png | Bin 0 -> 8946 bytes src/quick/doc/images/spriteenginegraph.png | Bin 0 -> 22478 bytes src/quick/doc/src/elements.qdoc | 4 +- src/quick/doc/src/sprites.qdoc | 176 +++++++++++++++++++++ src/quick/items/qquickanimatedsprite.cpp | 8 + src/quick/items/qquicksprite.cpp | 11 +- src/quick/items/qquickspritesequence.cpp | 4 + 8 files changed, 194 insertions(+), 11 deletions(-) create mode 100644 src/quick/doc/images/spritecutting.png create mode 100644 src/quick/doc/images/spriteenginegraph.png create mode 100644 src/quick/doc/src/sprites.qdoc diff --git a/src/particles/qquickimageparticle.cpp b/src/particles/qquickimageparticle.cpp index c0b0e8e739..80420ee4c2 100644 --- a/src/particles/qquickimageparticle.cpp +++ b/src/particles/qquickimageparticle.cpp @@ -625,6 +625,8 @@ void fillUniformArrayFromImage(float* array, const QImage& img, int size) Note that the sprite image will be scaled to a square based on the size of the particle being rendered. + + For full details, see the \l{Sprite Animation} overview. */ /*! \qmlproperty url QtQuick.Particles2::ImageParticle::colorTable diff --git a/src/quick/doc/images/spritecutting.png b/src/quick/doc/images/spritecutting.png new file mode 100644 index 0000000000000000000000000000000000000000..1958ee222d1ff2939313bdfedfd708183f307e2d GIT binary patch literal 8946 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 literal 0 HcmV?d00001 diff --git a/src/quick/doc/images/spriteenginegraph.png b/src/quick/doc/images/spriteenginegraph.png new file mode 100644 index 0000000000000000000000000000000000000000..ef09df43ef1b70b1ac0922f5b7b81e998f42109b GIT binary patch literal 22478 zcmd3OhdY-4-}jYD5~3v8Nu^;VJIPK~X7*NgB4mXUWhW^_LiQ-KBgqO`nNcEHA!H;} z&+F{>yN~Do2cF}2j=TH#{*vpu&g(ospZEK<-k)G~wX@WeOq3)NiTa$PoF<91Ngn@y zjDj3LITsRj4gVpxP(CY1`b+%Zld6np5{ZL!PEK0eBVp!~r;p0dwQck54*G}Va-(%* zgwJs)9-z>qQ%+?vG%QWaO#8^|mGjg<+c}jdFHKkDVM=D2GWWslH+RWc2Gc5EFkHFg zP}ufvalN*6W0$^FT-?cXujcyfO};v`M>oY;znVyx`^CmaN5>ds&PXC9O>e>fDB6B3 zgsPUm_<71(ek!fdyZGVdJq!#fPoHi{OH1QEc1%`Zf8Wt#$6^*+T3R$TG?F*;IcQ(^ z_v`&Snbdw;j`M~(_pPWXIu%vb{S2Y|cLfWsdGm*5KTqkek?>lgxHdN=ub@C)_~J!W zbaX&vrNq~-UpY>lV)pd(<UV>-=G?jMN=i!I4{kqx%vNV{f@|0Ir<zBO^YHACQ8IUQ zq|VZ-ULLs4<@H*IY+WH+Q7%lTE5=lgpmRt_IHu(|Z|r#E?qrFY}wLyC$7KUR6~ z#RukTP2!Cl92~yw;R==`E6}5|w6u(kjg>miQ2X{R1vxo+M^8`SjT<*yn8n4#`2_{F z{}>q?hrfUS-s?=?#`@}l<;9j4`1<nl@^4#OWKB#=5;+qeKHOGrlpi)SJnWxu{4&M9 zFMqN(kGbO7Tm;)`uh;eUTV?jIf4?MndyhQN1rw8qW4ieqyu38Q!NFyoi-&gY-mRgn zy@m9=u<&MRXlP-qsF>K1zfRWH+l-BkBm4pyj?h!$#&Cyv&g!a0J#4b-=<K}l=n=ET z>C>I5XLnZ4zu7T4SjvZc(^pN_C0&q`DSvsWG8hk`uD*WcOMPgW^C-EMz&?EE;n`X0 z^XJcdczC>SY1zTX#>OusG$wwrI4e7wxKmfwS7yacDVmy^?zW6wadnmZ{OWpVsgvo_ zbl=Y3Ys&!<5j1_aCs|3yLRgfPm20!KGOqmidM-iSjZ$A<|E?m}{PMDVweRl^ykzy) zubQ^Dh-vL&1w6)lqw<^8fBzW%s_^?ONkv7)e`Q!|%hs*tZ}0A(?8?}A>U>iX<*^VZ zuIQ%uK2yJu;hF$Zm#-A>ySmIREN<2WY&*csO(88UJ-@WHC8^y@saVe4z2ryB*w?0L zMP=mxInJ8r=C%CpGkRf6LfNvV+537d<TYBcEa~XzZUk)G`KA5LUpZ;%O>0Y20R@(g z7Ik;%<`)*sd6@RRyf(*{lA7wgI&aQ$%AKmGr-xC(gTEo1`L^?DLrp_N&@}x%o`#T= zc%xT7`%byfyncMzTiwVg?DcD@FxFEHmJMMys;W-+O}Q~$ym;|WNXQ#pEb(Uad-qy? zeH#@kcJ+{n@2`u!N%ykw@b}=7YFB0l3p^Ju8CCnT4h;>(3Oh0#QjM?6e_(f`xmk%t z+?4_!Bc-iP|E{%lq1Vu9q;}_-TdAoB`le18+{9bFZEtT3qGq1|{qu8bZZ4HphFX2t zzLUe#(=BdxDhC8ko-DBM<8>G)+P-h!zF2;9G8tLf&X?Dm^0h2Q8$v9Y=@}R->O=PQ z7uoJ!T3%il@}4tqOAveh{Q0oBP<k9z$;#a4NT=%G41M{=wJm(rVLCY%YP!0jr@I;R zX}c_NgNn>+$qS!9=h(4hhe7FO)|dwmToM_&$SDJFa&mIMZEU=KOJ;x7&mr&o4<9zV z8BlH0Q!WT3p8pZ8bPh4GeOJfd)nHBH!M<@b2n*q+r=008*c`f-Pr=hu>_Wa#u>Oln z&WQ}E(z)EiyXnkZ<AwB!Z0N|TnQpQBu5RMx<u%Hv&pc;qd*sjWIX}yuY#mz4K-$oH zY+9Y6ZM;#6W)2Qi_V)IA`ua8R-)nk0l}AVK{`m1@KdbO8{jrc%bpwNt?Yj>R*9Grh z{aO7tyrV<Cx27Um@0E|(tM%`vXz4DsC2YTX^(sl7#wRK!CXHp7^VqQ+_4V~6QnEV5 z;lqcQCObEO|Nb58N7~Gc1J$T}!!7obnf!tnB_$=l%U4A!YwOXUpZ(4zNnS5g3+{a0 z7|Cw=tvgHf>Nph*yJVQZzrVu6yv$4~FE4Ron;Mp09>IDmyS^@b`SYvr?Chf+-rmG| zm%U9Rk58zxC?NOSoi3)Q;UI%0OtyJ5%IuBN#>f}19NKF}7f2GPdpf#{Rup+3S`HN1 zu3}vf3lO`j*yeXg2xVPE1E;t+Q)g#qnd{UpIZnEUuzdlxUFqhl^CQhav-j)f8`XUO z^pcL1HT>&WD?AR@srOrJZ|`i(Nb;rJw(WMwpAZ#l-u&-H+wg=HBH2_?@$SdO)Vql< zlQ<mL7lrOe3y*&=z&{RM|7l!URP;0~EKJyOdSSG&==!=lZVD$`<XOC^$hw_PlbfEJ z*K|=*c<G)Zm+P+|W5Q##8`Tj7rP(zD#r948{jr*wnq_Kf(gS)9MJEpHL^oN{Gcqb- z3m=M8Nx$cKh>NQOn?AUGqU(utz$C7F`N6{CV(MJ=-^aLnsxdJ!+M1d&8ET1~XU?1< zliIXt)6u3tbNK@4pL3rNU%!5Rpwx-IFH2B~dB<Jh@uxI#adB3*w&%`l%m*lydXF{l z`S#((;kejXbrltr7rmbI!<#m7oIZUzX8e7e+s5g#J(t=atD+7i)aB>rr(>5q@VS2d z+;N6zb#5+ZW@fMD9^I+cg;BZgrDW~!7uN0X4V|jw-QC@}=qa1ty$cK4$*zWnw`|dy zYiMk&n&kIK?8CqS?gZzxYu5%!91W|+y57IHc^7-a%Em@<SMaS%?_#A79z578>2uk( z^8S5#%I(|t%gV|M2n(lAb!BKdJD<pq_ZV#m$C5jXuYUB?W$Yo<c)?&ig2}eTQ|-o* zr%pX0-ObC(Q(BySr>EhgfQ=JeZ_#ED+?8?O?{cTTnuddeWMpG1ZgFq0{z<1FUz@1& z7qRiVAGWr)ANKZM_i71aJ6%yPUm&*d<HwJ;4Grl-0{i#xPhhD3^2OqPUth*&-*wfo z!3RxNg1#FbKYspnT4J#TDyVO0c#lH9os?%#tTg87dLfrva<sp|vTk%?5`8P7uCK4} zFlnhr*HpvZUASq?#cOGjj#bhpRw0Zr+336HR&x|kdOAAkz`#H>24Ia)VTXPx5(?n6 zwnCx7Zv(~0SkL$-96frJ_%{>3-)>}50p!%0yz5PelW0jU?(XR*E1DNC9>k?+0t^@! z(LdVl^k?JO7Jnlnqx%cICY6e9ZEXqc`P;T`?VS1WqNi|nX2#)tXQu`mYq!TrOENZR zk!{zZ;;$Y01u3gxbFbDTa`W=ULQS=dZUzKQrAA7oplxcpxVTh}J=UdFOAwXDt+8@+ zRFz47-nMP(!{T|NuJ!~mE$cOGsqG}x<Rcm7FJJEV_qsiT=ETDr(i+@X<$aAzsxg8! z=Y<36{)GHOz)nf^>8&(=etv6{sgd7Qyi2&hef#$Q<=iXfJ$v@pwWPi<mtWXtdVP71 z+w4Hhi&bL1pE~u@>y+P>EBs@C3J>kGIc5e+BRwQcUeLU-cgm@#s2D1FY;2;d`;erL zW}P_pSi<vt_SKN=h>UYP7>;wWv$GdFp5fxUg=W+}Tp6F!j)s4LwDf0vE{7+wE$CCu z3YD_5vV`wO?2A>PqcZQGylP33;b;%$Z*FZz^S=`o=CJa5OUpyPZFEG_s!Kd|P2I$V zhEqmIM<;sPcI{X5>~GJu^73*!R*BV-+S}po%?zRS6jW4oH#To0k-S%CGz{4iY5H{Z z2hnZgNa~uJyZW-Yfivky0{r~yYB{#so5y~5wS>xXl1Yt?jk%?>pK{OrkXPO?p7mqC zTx`LPCMoH3X>b2r%DL0tD^CM=?9IM7XlrZBMN7dgEL_qwhJtaH^cFRr$J12->rpmY z{Vw{$_20{V33WRuD4rO<bnnDgP&^c^fnu9y{PF?m?yFa?T*R`pl}M8)>lxYE+2VuG zi;EAEimaM;5o;DZuQOTp_BW&Yyu5?*+2b<Gt$~rK;}us%WO8_m1P>2YdM;9s$}1`~ zjf_}uGc@oY{LRIHKKkChJB_2AF~@YZU(KeZa59Nr;i&r2e5~2_fI`?4T!^Nc8cmax zz|rH!pISCXL_K@Px9Q146R&gs*-ye|cu3u8$`8FJ3IvnK1BN>6dvo=h$A)~@XBFD_ z@ah*nt?_iKTu^uvdjIIluY!k7@OJu!hJB$wn~y!CCGDaNZ1vF9nM?Y+ad;~^d2gKi z+|cQ@zUn_cW~MFU&F|hlmAt-o7vSTx&#JmuRo3q}A3r7lt{SpNXNB&mC)d{2zMGSi zGf-hDcu-jQ0a30#Rk$5UR#yxP3hK@{&klfKoH*D_xnsxFr)!@No;`bZY{W(NL{yVi zk?WLZVQJ~%C`CCnH8tW^X6NQQT#e%N^0E=}TCx!k6y!R2@?^Z&)k~>~SvqulM~(z5 zgfqzlpIbRNsC1>PrgnF0lSw^z@IbZl(Kot%`_9QEt9#mbk2X-pOLz)w-$F(vmE^l- z8(ONbp&?D|71X^S^Yc%<e}3<Y^ZWi$%xitNv<Z8?+!P(RYvb4Ak&`F24p#471WpLQ z6B>Gem6dhi<u$&(EPm?#5=Z7unSBOYrMGvo-_t&t21J=)VPP>j_R#bYTV%$D#V(31 zf{p`4mz?I%$po)`HxdvLAvzAe`{-ASz+ZmAGv>HEPjhk%=V)jZUZ4-lPP8SaqDK>t z_tVR3(ZRvnH$7RN?z2B0xos!g-Ip&<d3t*vd-<mOa#~+y5Dn|Vq%e4h&D>Cx;MH*z z7gtv<Qa6gn+S>H9Vi&>mwmab&{aZL?Y;3p*EJNU`=tHVs#M9KW3Y^JtEzW;7Jj1Eh z{U+L2sh9*Qu(L8VGySDF{Ec{>uITIP>TWDFvMZ{p${QFkp%GvCz2;We*qHkKIW1=t z#h*Wa7=;}eQTIAC&L<se)U*-|8%_Dhd)%-jY}H5d`pO6E<@_aqZ`Z!QrDKxx5k1GX z3zc-gwY4=RHFX*mcX1;x4^JB49bHoUVN$c-Bd?yzrwt4YH2?njJ(YNED4CjBxTE~) zM1M4UF^l~X;VvNM6V`1k9$sD+?T=5-B<rvm`T9!s<{O9dRc{pPOgGloC*x`I3kYaB zUka-zIAsuT3kX!^GDb;Hxz)$VXMVQyv*b@2y7b>`Be&U~1NDe^8Mwsq#wh7aJ7fS+ zZ4wa?NjT%jmgMte`-9{9H^J7ponBao2R#yTvOxP;-B@g=V`RL8Pf5mII2*xI)5z{e z1#CgFg^YAQ)XH*#469TqPB>M`h`qX0_viOdsUn|!qCF(oeyy)}fekQMjz!qAW7F6I z1QI|12w5#ryl1iyjKLN3$)LjZNY(0>(5D$084?fmuC^_p%=8)k2vaIZ=~vjxXYv%? zayM=n0TL?Qjxjf6v5Emq5_JN-^ew=-@7h!bgI_sHOXsh}3EQ#e7<v{K71HGTT(z!N z1MbWYo}(_)y*#-lRZK74XK!Miq0HaH{iqond^Fu1YfVp2KRl7-*YJSHka+4_wrt@L z6r_Jv`6EQBq5+`r{{8z>oKcw^h6-JJ8rlW9xyNTdmhUDA(d=O9$n<n*>1SW&-G@}v zr}?#1x<GTBztnBtSn4`2>N-igw6ruI>9?^NkmD@qVVPQFCuc5qb|;?obGPXWw{G7~ zEh?hlOiuM0@ZiMdkD?&J&WR?sb+xr`-MK@-B6@{{UWq1Odw0L={K}w{<;LnlM_=EB zxV*v+(A`a_z@nZ%xM<iU?wt9vx>-z2Z2rfOH+Sd`(9+Z2+H2|)<@Q;9Q@K$Ddedlk zme!q!hz3)?-&-Y<BF$@q%z?KUPkRa4=bdb?4@n6E+cqk@vI);x+SOH%*SKN}TjcFm z*VirnOIA02|2DsPvED7);8|rQ%fiA!na2Vro@ik8pS2xO1+KWb$f&E+ns`ke+_G(( z>~V&xiATF4AfOZgFKsOMnG%=EdEkKa`idh-3N(vg*r3bF=aVGoS5|_`%f%W$xMbkH zOPxM9pf%9$-FqA4nYr(o>1~xm0eN{mK~(#0K6%0cjGqjt!6>7p$TFAPF8ILNh~d1_ zp_?e!lE0U<Bs}IxSUz&-Hs3#2?;M^o-US#A4lNhSc6xYZWD~Y#|G>b_cBj9;=l4)< z%{Qr{#8(|GbpoVhE_0h^xcsr~#?q4O+c6hKu3f8ZYbmDHzVnNV0ZB>hGqbbhYKc=) zdKzD2Ws+b27;9OW^ZUz8&{4cNIU_^YI_~2~qmO0IoBtzor2qJQHj-_VhnIC=K)~h- z_t|Wp4}*iUM`PX$3@~YC(c=$_%<HbJPLb?qf`IuH{Q3w*Xl!i1h{#?*mba~~^59J0 zhpKXXfP#+r9saM9F*wK!B?C|VW^}aH?Nu_fqP-9(P*dxko{OdhuPL_g`-1l4*tv$4 z0l^?gOWV$5C!2&6bf(0y*49>YTif7-1QtRTfsSNRz^I_008Ys-EKE+qH@`SCvf#mg z;)KR!f^lQ9H77x*+5eCbyl&jPw+ox&3918-IyVoGyt8vbA>##I-D7>bDFg2+r9lZY zOthdO%~dYakj%O>HS{VyPOO2Cr2Gst9{{C~FnZ}u{p{5mfb7xvL8t1hu>ey8gKUQ= zK%D(Yj%)`!Baz-Ei0#JWYL>YG0*lWiWiH;)1t&_NApzU*10MZxu(6>)%bNW5?G1!1 zFE20R5t5OSnc3U#fX1bmrm1IO@TQ?b;g_GXa*M(#B`gCbw6h>ZE*UpBAu!8@`n{$c zc&o8Fy4vp456m`<oGC<Kx^ZI@HJe0P+ve{*M}&lQe$`bCL@MbBl^dynkGruI_Gmgg zJG(U;rl$<t;=i^stBfaoFi<A>P1wG4-V5|XiplC7H@EJfAYDg;(Ka^Diz<7_Ys?9n zJ?6hP`tbP+_Lb;*(XU=f;wu+>F@yT*Fx1BDwgx0uR#r};wpeby!f#iD-3jX1Y5%NB z0oq&<gpTm~@USp0w6=@VV7STHE!jesKtA;K^g7<BDH~RWpR{fh6fZ26;@|)c#pV8c z)%9}z#LW<#0RCiuum3!Z8ZLf)t*GG(NMzy`GU=-QOMf>O&lfkE;923lil&-e(f^t) zhB`vqCx~KvLrMxg;!<RYnfA?PNA(xr&P#Kj*|DPTgooFI_XzD0Iewf9CGWNo?`@gn z%#-JLANc7rU$f2Q$Jgz^S)aZ+`rv+tOR`XU3?!aQR+r*^IQp^tYHkiqDwC1!Sj5b? zo*b)-7v%x*?7MyyKe!8m<-OwYWx<2GB){7;YD}M4QRQW2MN=P5pP5uW9yCZ0xJU`K zxaU%v>m?M}rVlTyo9gOrK`v6j;$#Zezi>eTHC-uM9^^~+Kshblr%KQ0RUh9+j~}tJ zv9(chrfT4IHE1|ZuV4F{Twm4!D(hB!x3S^#V{tL(T7AiiGB<rmR*s52M5iFAGTq;n zQ99fJNrpT%aEHNm9mTDi_^Hhgn`_U2=rNvhKYmCp;SO%I{a5K(Y~(A~uAN0qvJ%iw zZCUV;fS@8f`>T7U^DO)RLx;%s@*3IntVyu#RDN(g>tuNQ1fip0U)7^<Ka!Yx%g@u` zrt@79!m1M10C7jc-T5zY(=TD?M5U!&jK1AQ;uaS-u=MPi?0d#u^=EB5&!oDdBA$hn zb(&QG5R_QXtqEe$Zj+a^gP^Dd-?_s9rPXU9@tWwm|Ah+|-ebWj?+Sj}S!<*ENm^_0 z&+m084q9M&Ii&??SY+yREMM6DHl&FQa2k@(dD_g6+a`l{F*P;Si91u2Qtz^{>I`9< z0K=S7iu$ywDk`E)8Muyw#6;VbnGbnG3Sg!@21S`Qp+_M@0!5yM4k2s!-indaLcXAN z*REZ7Wd~|lQ3^-1mB6=8FGZ+X#qZyXj<yBkYW^;UYMwB*461cEKcDxal~v}&^_B-b z1Z)K$tnMznp1x=%Ux1zKA+@ryf)@X@Am?5CB1&NtUH~krEXD)a4xw=hjC1(-GYF7{ z#l>lnXa4B%4C>;Ze#?1wFD>mLYQTA(6R~YKs9AfJP=zQcDEt+<-ZVuYF8;EwT1Yqf z%<AywT)l#nHVIA{Ks2agV$C#qFD_BPTK%#E!n-a{<OO2gqj&D7r=;7xTg&>+$sk+a z-h&x?pgA@~vPb^-;UcG?U?(rV#UB`^_T4+GPzIiCk;ukTX9L<zX5clD`0Ce|r+W&o zLjz%v@SsHvZ9JUhlk$L3<?w4~<znObQ`dO+F*0_bn3Su@9}yRiCv||CK~OqJ+!!q_ zt>U3ELfoK*;*pujU0iP_j{0P11D$(|Kj3Dg+fgOd_pjf-tEHZe92bw7ILgh<QJ|-i zb0JUDJ|TGb;d_aRtb6F`Glgin7GPtLZQs7#%FIma>O|X^c#Qa~jUUROs!z}~^R;Xr zfM^yL6eQ!T71wj)jZU396))<XGGM{ax*J-gwuy-vI+viwyjdQT|1iiY@m8k3zYap8 zGQ4!@(A4yF7rJQ=(_sODd!!CX*WFCFr}W@&T#6TQV)NZtILpPw^}43!#<c5wLf3ox zlna1e7A$|-HGUQ<tgMw4*S&l9IOr*R7_31E2ypM?Be8|-#=sYTR*F8I^3#Mcx$w&e z`V(_sRyUy?wtct0oCC)M^w7>vuogTXO|Wyk^-&K#T~tqbK@93YAu6L`4$qI&8fBzv zU${Wd$HzyMK=Akx@x%*pAYnihA-8UADUOK$joodIyIgj4BBIwd$)afQbjB*n=j%UN z3B~$i3q!tEmL+s)5Af*=&rDj~j^>qsK7Xum+X3kF(qPo*&##Hh+}t|QG~y~a$}VTy zy(lacxTlo1^uapGIZ=rfaOn{CF(FF#WfgsR<n-zs?yg<6N3q{u-`;CcwhZp8AOESy z*t;h*wY1DFEo<Gxm1={iYw@(NOubKY_gf$|>c@{C6NK;3`Nz4vdf?CG(9&+>i^Rsq zXA3cO`2v_zlpE0ikP{}x;&?0WK#|jDNtFaqI#9ZR>gqFnQ<-%r1pn*|EG)aKUB>F_ zB-|n@W?`yR*S>2TvZN=DmLz9a{aGE2yhI)51$@4S{gw%g)x5u=8`SKMgQKJE_`A4- zu_rVrEKgHYyV8%<jf{*4+H`R23a#g22(|5aBJDc-`i55vtC-6zQU`?4p={CF-&L0$ zNB)*)rrWhk2EvoycNZHoS9`Z#P?O$*!lRapwMZL7{6GEeecBEkZS5kDPeS&+f@`aR z0871wzW7u^7=>8F6VXFAWS?$3!#Cg`7Dh!#1{KvGKst!6UEw?$WN?N{_nFB-)H%Zv zhmqsk+?wCM<+y(RH+iU@7H;ynvuAIU)b;cjv1`<!sQ}s0kw6TSi;9ZGr{R-m0SefF zw(+#RI8fQA($#NTw27eWagQFAmi46M?+lhnezIvZ`Q7U3zgN%xyxh*-4PobAT%3L= zxijGnY<hAo`cTg!5!?4%WKvN4@<rxQzz?9FTDL!TbbB@XtLhR{<DV32G@cB<-_xc% zCg+XW??Je`C&lq3NB5b_gMdTyd-g<WA9d{XX9f@9AW^#)2Zw}klENjgd7=M&ot;&M z^^w<Hdb+w#WwhUPX`j$-d7@P<RD4^#`*mU>IxtZFMX0Oy-zS#`ih^C;+>RVPn5N%i zsHaCuYHn-G7vY0ONxF-Vxbg`~F08H8o*doMqkSuXOiof;`gK|pJQ}FlaGCa~n~&m< z=L9QJJHVUUTsoe9`)2oJY3Zr1>Gfj$mOhER=a8X>Dj_nBdDb@^H?Fu3e-t9k^ZN3V zpFiVm8DF-}?ZZN0JmV_?D%zJd{3dY6D#(3-*RmZWGxOEN2nC8j8K1>g5sIBV8$ran z*_>)_Zhc-*Py-Co!xn1Gt~W7j0JULwW+n_M#&UkRhR38j{ciRbo|u*~!nH%+AXuK7 z%kX;?0a%!~cI@R96w|wfj)4^xm6%9<>{yQYBDx@U+U6|nkc5N;g;Hne1GjG78pckZ z{9Nt#;_3|doRHRD`y;(X%Y+kahBa-JaWkA*<O`tlDip|awZPrey?L^zTz}R-{}nDz zfc;4thS0J+evpf+TR;6oszNxyx|sQIZh9SJ!79Wfmp^wH;%)=HrW5GVWiMY|jo+aQ zz3v9St;NWjK=27i*Yf?cK_sbw(%BxB9aL04mn)%X?iUtjz`e^;j-3(}J)N2*4>93f zn&#T~mvaVH)R~iY>oAY9K)jZ|Htoj4A%~9gb$D0`K=!h0+(2TfZmwRZ*~DyjclV`w z@9Df!d{W*AV^{I_-mM#FR`&i*LMb8Z_|o{G*N30UySN*D)NmtHQ)l9dDk!X?1Y0DO z)lZWGs-MP7FSW*BYOL`7$)x)I?f+x}cnOpNP{(APexSPVoz~2=)iaNT9f7A88Lri9 zjNN`Zu8~Ga^kYxLWn^Ta5WJ|lEF$!#w$>J<g76j~&k4eUrQEsG$vGEY3RP6w$mrwn zMg&%4F85KuqZj&{r82d=y|uH_p-d2%iN~-+WwwCrjIYX}Lx+ki>M4sGEsA!(?D%m8 z9?}g+lhzA>fuYZz^B*@TqJWY*c6_H}cd@<ht-wHY)b=v3<!l2>xGQGgKbGrNc?pGt zhW0RpcB<tjary&#Fz(xD4xPtiwzyBU$s9yU@%;HlY?8sAR3#z#WOcL2j%339gx=Y` z#s&&V$n&x2gA6<dPfJ9@+%0(INg|g&N`cHk{1FZQi%!qM$w@{4^{oYTK9cO<wvAQZ zKc7QxEN+1DvWkNE{8B4ZuffbMJ&i4Q@8917^rS{(2y=6RXjyQK0d_h(HddbEffI-Z z-6?Oyko0%?ncs~&^H5ID<~cLY)`oEULyvTw?hTJt8^k`iWyIT<t&=0j_VP3|%tKJk zPPl#3mhk)`=je?5f#jc6%l~|6UDx4eu~Vn)CB6gp5XNw>{tNO;mo70yel~IZRIvy3 z(qpdbXE&2Id|D1phyLf%#0S0!;e1>|FJw#){q+PuFcqsfJ;c8EHZv=2Ak=4mFYR`p z9SCGS<(|nC0fXFouIe^mQEFkKrsIEJ?hoqs2J&a>36$?}Ts%zUbE(d!LNrnp_Cx$Z zE0KgjnN=dn?lZp$kNq86@IdhM6bcUT@$vC-rqG87R*bbgv|RX7pTJUbjo#ec9JXi; z=vfdtb8#I}P2koMH3t$>ah+L_at2?>`NtB{ph;B)tKCyTC;=~CoP<X$#PH(4u3)+T z7uGvnu3lZhUd!fbLy3q=NC*QR%;F(WJuQA+<6T=D`Mm3MO;zF-VYl39eIz2wwab?4 z(%JFh;U_DLp_eaTCe$1_$ypC(PY$GY?X4$t2Y&^cq#ZD5A<R}Tww+?+H}fADbz_JZ ztu8aGAtMAIRCD!~m3_0FQ%;Ma!NJl}QX~NZ0g&gMUOe~KH?Zr1v69}@)yd@*h(AI_ zrrIZf{=b#*Rgr1XW~=@DnVp7)roY;+y1BH~CQ|LQX0DjDlZ{PguP9nkJ*ruO`>eqQ z+8(Lh6MH}V{k;z9>i|S&o<Zv(S=<`57}As8jGqwl%s~+-XlNSF{8`vpTt79_ecjg? zsQ-CUk=3V6@iH~H)r7dXU?_#`pv=u@gDzQF5f#+~PDV`2X=H08B_&rOmFfJWp-{Vo zAm-ErZSC^kx`SaD!XQDxkRZ{in8kjw00w&d_N{+JM1&HqeEatxm#^fHPrA6YPIsL@ zqjRnjU;G|8!*w)_qaWB7eQ<?D0fC-wGcP705SRO*-Q4p60a+&}JI<f^-Q6p=kEdsf zCJ6%6$6TjXAm<XX2M~&Yi4a0*Wh=>-R!ua$-!c|^!jc?7w()}FU_%4>v+6(Mz0XXa zg=p_{taH=pEvl=ln<&`@Sf{hg9*l)+S1|Yf{n7^qEe*yY!E>R>V^1GW$>6C&z5tE} z#g@FwJdee$29eZ#d@3nlTr85$I2Ix&hg$*xpwCR2K3EPJh~9BV!WUu)omy-^qbuE@ zVt@Td(_sRB1JDazY^MLR2$vAD_Uu4$j?SPqH$5S=$Dg#02*F!QXH;}(jsjrTpsntY zZu-_by5OOB?%WLsP&uXN<?!I3Ad&N$zIvz7HLm_2aV07?_6~%bvEMBqx9CiO!ZfQJ z50c~!%3Tg#$TJ88x|*Dt$`W@Bl1==cz&T%JA85q;OeC>!w5G4GRCOyI$$h5(#^j`p z!-vAaJ#rBM?fw1zPs+;5+WcwcZea&QDSe_dm?-Xc6s6U$N;0)d{Gx{Ie{ww2#k5<< zHUZLpOm~FvX9-g(_M|lp7};PEPrBn*7qRs7NfDd3(L71s%n4=mV#@;|(K%1poeMu& z_$&uY9J3W;Iyn;yxyjB~PbJMh&r|2-hxI4y_!E(X+mMvsym>QF#G3ACNBIR*hMDz; zG87FEwmWz3*yx1CowWW!<aN%UcT&y{D;fE5>(E2^$%-7b+<ecWrZWjxDLyLs1>(93 z<P7<S9B$?GVwCpo+&`IQHwam2Fq;uO#0sdLH{Fdtu_VpL-24U_I5+zRdAV4Di%L1A zy6Wow5Xa4cCt+5^X1}*Gux+|`uphcP_&?$jOjWU*4_gR{eROH6izfnflqk%gMgi1P zgHczEW6F!JPN-enOATiVR5x#^7s7&SNlA&ey84qhRB<Kunyi+vXrdoIdQ^Dvj<rFk zO!8f5XNJYU!M>o*xGqg<?6GdUlBTuypF`f$bC4tm+;PF_@X@0oBy|suGRha0+E9Et z;Cp7GFf_}oIyhH)ELh}}{QeTk_Z|f_{Y%)seAjs25bSOu3a6n#2hOE&;X)7^<-5dF zd(r1!!&dBgW_pHn{^fW#+mN!Z?q0ZKa6@hu6cAxK<a;)efK3Qd8H%m%ud%&qz9Q)t zQ&Li%JA4p8Fhqu%Ugl7=G&enwh(h8@F|_31!xn;$`K*rIMx5y;vU@PFVit3<v%g6s z8F1~AKF)B=Pne(IAJqV#5f&b9?%?ol?X*j-@m_gI?CU@04)E|$!{~n7+^qQu>@Moj zqtKf-$$<1zv$K`b3fx>>iHr^;x3^XT9-f{=7e}YK5gtxGGcz;%^($2KZDXFw3NI5* zdozHy%euN2xflTZRaR9k%#X+dj*P-S2CCBeWB9_4h$EJjG2)9JZO^&%SwKiAQ2S_L zOw1m<8%K;%%wKUav6`l);N<|F0Cx>~nAlNw@A?CR0qAZ+)D8Pq+RLk=upg)ji7#?I z>gOdTL6F&Vb92q??6Nl)9w>6b;3n=Yl8Csi8v6RdMB{@r*Zc){42EuQm}yt`@gqkx zN`#>e6JQv*p96;vZ$rf7ZCjfHN@HPRp}K~~rr{}?p*%woY}?m8J$r~K(aMSfaL;rR zBV+5a<HzM>WXPayg+K?`ic5mD3wusiazg*?*=?Fx+U2Gn`uks_#iysIH$O;3#1dN% zj{yrAnW~hT?+0lq?$>s2l9HF-+T79-bLJten?un(AD-En086}WYLZ6W0@niVGXN#$ zVoNj%%+L@UO41c~_n^?w9ayZJoSdA5<&2qaj5Q$U=t%Au1=t3FI|@c1CC7jAWB|-b z<RVADd`a<vs$TQ%U2e~bBni)yA5o>~vv(gn2m;L+I|eolUakP*hhhr+-vQZR>H8;U z$bo0!`}IhYd059JCWa%exPdxS=KEVb-?W-oMw>kbcGtAFQZq0xlp&>;u9irNKm@EI z>7y|&37*&Sz=;q7e9HUldUke4!8M~EKc)$k*@RdpE+3|DZDZp$BtmY!eEHH~o7Q)3 zQN9rLYf-mv^ssJeckd2ZUG;#uQC3lLbO-SWI&*aS`UeNE#$`7X<_TIsnfojg5}iT# zMXtk#Wsz;gTcSwH0Ucn|4{FbxdI3N{*gAyn3kVnW-~oA*;ubLdiv^QCIeW2a5mq&} zHV%~O%wA6}t^rNBi&g+Qc_j2N;4P8;#AaAsUnlSbak-EWn7K<gG4X}S-BNzYyI(+H z7yPePH0}Mg6dkbDsaQm5@r!Seff6@9L11Ehu=C1{KH+6TidW~RCla9w5iG#~b2V@r zuXl;0jJF8kouZ<mJXYuTzkBzN-|RJsuz^8%r4UxTzxS>9?m(FvX!T!!Bt-rGNLW}} zMgbBR=n;9x%BA<pXl%p+>C3X)8cr{dUyhAsocZ)}FWhQGGKG<<p=DtS!)Ka<E+)EI zJ1RkoCt@P7@u2Q;9z3|Ux3`y3<TA^U&!Q^6#`8}lm$VNeVF&Z<nD6gpU7{*+?HYj* zQHM+?-i-=(a^>LrJ1~=2&iJz6Mu@u4Frsq|fBA9~ir5$SzpL8-(`(&AK5AI|5!{OK zo8jBhlE6X<mJQ{$P`uV%5u1IfRphfezAObvOjJ}IM!9jdZ{l>f;5SI#Mb4uNlvGq) zl1b-*zXdHDsKikc10vbX9-rrZ*aetm1Br;x21#%0>jTl6<X~+XWn?%X<qH8IDuT>J zNkPFu`Z_+YfajJ5nI}_RJHrij`x@%{{cE<B@Og<}1AG4>E>v88WrR#MQ9K4Eg~-04 zIjg{Soa(4PsrzMg)D|Qax!<QBtAPb&!FP-@(&>&K3qcqW2u1;Q3U;zBtWd&5)^U7n zTL&UZ{2g%@l$;1cj68be$cQ*kOeW%Lkn!$CM(*6iVQOkRP<V02zu=}p#uIgJ$mQ`S z-m^l$-&`?Dwt(~hvYU2xJ>w~QunZ7a<^mxCUm~P7A|In2#oR?kc-`%i>tQH9O>f@Z zeD!<95XSGQc;1C9d>pbD!6*>txar^DKcZ!DeFs}A6KY|R&o38*1i7H8CS70Azs(bo z#~Xt1AS~>|&^z`MKlfcb0=T9aQ+^`vZc@^DBAx`rmr$nh9b6JMLs^g#L#9&^?~QmC zw~$cG^!-=^G)P<IL7Tsn0U*&_)BBX25}S~q0`_nakCdP@h(=|K^QDJFk@%NK!H=Pi z^{stz`TOTO6O4*YPeg`1WTzKrXYgiIInQ2k;(EX+Sna4f8TQsApnx=x<nqjiXkMeT zClLvZd&IF#5YiyLE61VAxM^3WA~*yP=e~aXHjpf7lqfyR_X2X%OW7rojk`u}X66$_ z_o5*@p@EdH#g&JR6Sh4}YH1(IBtrGc6Z?3Ck1u22$xF0J?HQ1|>{LxuT3E$h@1PPl z!LNs&Tc(zw8m~i-hmz&@_m7pGT{C%?Lt_Msm<*`7Aoexf&#!_Hv1hOaz%Wi?B~xUS z^JhEbi+=lDeP$msvli@%zNw;tt8+G<kmeCijDX)NCnxvZ@Wwzn{H!n*v0cK#!UPOJ z;H%*(q0K^d2m<rL17HLi@A9At^MdsI1(myTsLI<J(1(gmB6j+|L2gqD_rsPG7IhR) z)6+Q*9ZIjIdaIr~&hUJ~hp)(!)$uAWgeYTBXn_wqCOsm-3u{98US(E>cLL*B76_#! zUw?XVUDf+@;~ffufDs??t@{Y9a%ZdoLC?h*BrO7nas@qxHJ?K`sBzS7b^RhM3(FP! z9)xg9q=%WpS(%tZV7(_ucoxbs$c;}~Pgei^%||Tw%3tG;?DpN!&0{*1uco5H1)3r5 zI(c_(=a*uNKR+uY+8~!~2HZG{@ZfvJN;n3Da9LI+8eTW5B)hI|J@Cv9TSW^-stpVZ zqm1{Q;cSxCD3tsnB8`ZO3+g5pOL?Dhwao$nN_p~xgz9S-ejvK318hR&vBW-<2_5_6 z`Nhlg<p;`<TY)beiJH1JJ4h(_8OchXC>{i;T>hpLt}_8&flLa)(627#E?(d_KMaK> zB~8SPc^^j0aqcJGfBZN<!54kNi%^|V0uaT<p6i4>cjV~NY!elU#aZLUtFq4;db3XF z!HbgoyKxo!>L9Q#fJl+!V2PKrmZl~*a)4CS)I?1JDNsYfNhmsmiYh0;c7FB~xBK^x z=Li9y+DV^zC8r_1zOL>rJ|4RXg1+&KUZ=?QemoLe1S^=rKQK_gI+dK9OvJ%dCuG1d zw>(ihVFJzr?+@Rs$gbz;*b-FOT_gmWa$kfugfRUlk1AX?v)Jo+SpyHwC1CmwSV;55 z#s8f^WwrRVw)P&zayOG@|8w&MRt4uOQz5}wq(}%R2a#)8O~b9|`f=cHIZln2<+>F$ zJ9rSZtX1Z#>h3sRoL%nYhuSJ$P9TyhujM!BC-=MTA8e<h!i7W~IEzF(89)=PSD@K9 zSo~6QdIc8p(F<9<$<(KRzfpe`KZ@L_sPBd-%=^1BF@YFgU?u&Nh05PG#~ee1eCyu5 zdyOhRh?pRe6oI7jA(!zRzt8Ht_*`B#>{?LV?sY?3%D(lU7es{R?p<2=EeT>*$)Vx3 znv|aYZi!}3MhAB^D0-ErS3ONoQ1B^oH};vlf2-kTM3K1JkN<%f`M#$o4fMVPrkD); z|K=!DVwJ<L>=?oGpobZN?z_z9kx#@k^aV$mf9tE}A&?&@-o-BIqey}TpeUAyu+tX* z2-Z^<tUqAIw;6;WQ*!{}Ipjl8X-QYyZ^%Dd$suw9h&=;nVWz`3;Fo*d^;}>YH-oPO zxi!~rBh?6go;zi9pPlX4v16Q^;$BPKo1TEZiaUSVvgrvviIWp3l#_J-!Gm-oKX^k3 zGsU|xsytmw>F>ykZ0CKJlcP-fMm@bu$gJ-D&|l(KeO?We_#vP~M(}jI&`x^CfoA}g zo*o{6)*7k*t^#t;(yxgmdx^{Tf*z|5moG<vnWi(v+KqhudJC(V1E~DmxpPEa!@B%o zegUirf01!<5rD-zJUpyEarq9abHJT>q{hC$`{Cw8ru9e?b>3xU3=cSK&m!E8kqPy| z75kFbddaOeeZD~5n4WQ*A>@K;W$#aoD7=W3G`TUgzBkjr8aWJDn?Gel>OTGV>P-I$ zlu1U|$AqVeuz)juGUl0N?X+J>O^tkhDIo*`H)2yH5~6mO-8bU%ktIpVt5yoIW7G77 zd@A0R^jkj~7IDW5>+{8qpZ}AgL6}I(Fl=JPt2(;?b`)4O5jfC82$R`2wZV2!@&S-G zf-YF@kN&NsMP~#liI4#nXS_r4uFfv=r=$*~tSCsZN7TfeAb)J}CvxkgNd(_=U*v-p zZF+K0`9TL9Gx%{~G_2y<6G}#o)T+@+X<Ph#|Nj0-p7gi#<E)^t6C?&Ct&NS3@bX3g z@o?im_?wtmQC4m)SC)46ig|sy>LZ1kni{+CPWt?xIRjk;1RV2ha(eYE-6WsYk$n(A zg~(q#nwSz?{Z5!PddJg=z<Jj%bv&%Zt3o19L)vZ1Dk`}r`QW&;RUkHCJMYuZ>{Qt~ z!#axq;N>3)8iv>U@wE#}O7cs8>za55lJ2T=JA7d7RjA(hv4dFJXZpqf5Dq1)zy0uB z(`Zh&U2U-1@65jtDZD71&^{--$HKFg04gRPBU_8F{nAWRs1_J+PdX2zGHexg%G=wU zOv<>z)z<ZKRn_$>Pl33w2fW5g@ZBL<fpi5UUMPdR+&a|xztXTkT)>WUa#)UncHP{t zjyaIj8GF7?di(x;;grbPKv1}*PoEMAg>;t_3aX$(KR>1@n1X*E=lz)zl#ViRUZ3$H zpXtz-<wx-uJnQ{1jGMZ<??Xj}rkcmZ6GGS%GczCakNS9*I1UPvNuirFg^Kz8@o{l; z>*=>?0$I1ZbV=dwuXaDdU6EPJUF-dL+oq0=yO5C6qCB$Se{Bkc2ZY?q#M5?*v%;6& zF^XUN&H~?1-Q0Zt>`>Js%u8U&m{yw{5Oerc5d)<u@wE4a0}FOw2M?h@aZ5-TL0e|d z|5-pJTZu6@CmZh{A5Z3^W*odBr9L6dneNCWerBu0_56ZEyq9P3I=qWDPYGf6VepLE z*)Y89V<Soih=2IT#)c^SNR?2$+deytk>DQNK*IdimZ3!qj#0BqCP18k7I_!ya$r!9 z@P}kw9q5YZIiv2N7<9Ac93ed5DTL~Gp4oV9%f`A#cfB7}q3OeiICuw>*x+{IX}qnk zg#Uut5pazdxbXBW7r$!J{iL!o0d!P}?8cLt%N#}&J9ZpE??d!$miGLO>6sFz&uVLH zYl5zm>do!#6Y#?AHEySY0YRELh@5?e>(spp7Yps<*biRI-{jFsscGEmVfb<rnPKpq z@TAXH+6Q155-f@6kv5&2ke!S&x)1SuuaAq5SK@oM%DFvI1}T8Y4Zu0^&z?TLHQtt} z4519+K+OqX6Gs<hxxJ>+9ufg_sICKU$5Ky5wTuxgN8rSX{RqN@+_^I>elW&Hr_Vi5 zMjGzzek3GZu3UM7y<a#XWgi8kw}w=oGDK}+fe?Mb`ub)=3lMiJdwXRt^CjG!oGMwd zE^%xP)B-uUD~Et4fY~S2!&8Mn%|*w=$OFA010#o_8KkfB#Z#G2#zQr+g;kD)sq)_# z4_wl5@jM0ql@#KULwV9SFev<zN!V|{VO=i0*}+HTHZYi{VPV19XPcFvbonMGOVcoi zcn_@zeb%7L%k5>=k8ZZpm{WjLqY6=jAW4t|4ZJfy8vXk9tNDwKot+Z$8U#JNl6WCQ zTTf4My6+j0CcJo}`)jI_plaH+pu-0bcA^Ep1q1>TA_6<E7!T43GP5IKTI=J}kMQGj z$miT<_a%s>QAV03-km@*s7u7i6V_uYboZEL{|<j-7#_jNleZ{{g;D!^G3oDD2Ne}n z&6X?s0Irq*pQCTz-nNNj=gyr5B@X(x*I&CJ`4@~dZn}>X29Ru#$YlLPtHt|JOHOV} z;H_JCk!M4tAd>FH$V_x+f_OGG3WKsM`(Y;SCjD4hNe5f8dAc*N#Ab;uBirTIkBbCT zhp^HJ&NDJGaT_=TQd@0b-(DZz09kQ?zp3inSMX~f>R%9>A#4r!(F+aCPG&&ZaCSz- z<-;-NTZ_S`Abc~3oC!A|H4+1k1XsYwf{jQ(oLvAhbyin53>ZeFf6=WrBU-K!%fIRG zYU3F~{dWst%2-L!!}P^4IwRpggMLTdyGI73K)e%foh$?v78Vx4sF2>5m>Grl6|noT z+AsoTn7R#s1_5J}A9V;x<>!3Sf14n&d3cC|0o_EQN=->2!_)@j35zWdX*!{i!drAs zOz#DdBNQDX&Vl5+_?-TgEBp-+tf6~NJZ?-2ilt%5Cl|66NYF6Qi=2uIRdaK*nUhnb zzdwnJk)H&q#Q)*Ly(nm9isvl}$Ok27aiaYIEMwdaX^8$<7Id_<{)CApD$4k8UNL(a zzj+1OdqM(%1Ox4sgz0F!5jhPD1w<`GYu`ZW!seZJ72-U3ayJ|~c?XB%#C3vgz%|?g zB1S<;X^}Tge&qtaeNKM<zhp2ZEUaWAHU~!ygOEhD4jya_A9C#wvW~GccbL%9u}S*e z!D1);@;i}{XQ8Ab=13i<LXO*wZzc6B4I{*SQe3;76Ww24fPxNN!E3AZ`SUxGFq;H) z@miVL4xk5}tfb|4b_2xuC|G~YB9}S#@89%al?-?X>eM%%6U2SONQY5IZgEixw=kEG z&>no9dgMy(LU+X?{aEeCPI{7&u?^FdgbIrBXmCkc#6Zk0UfhaCill0IDL*9VyO562 zF1Y`yo<Dz9Nr@8CH^^&*1Wxh~2nZ;Ai(e)*KJ0R)*3y$Gk%+urNKA1CLPWtL^QbU& zo9?Clud<0j9|UTMC<5j~@fBYq;uu|t5NZ^hG|YWritfPa)2#4?2uT<t5SU#gk&p%^ z?m|z_!@|j*-+Dq5Wo$O(@q|zx;pUdo)Vx>N@$~6a4tz&QwS>?AA{WXtMzPTlIsP+@ z3N;dccJJOz^3Tf3a`D`}c{3uqWF%-M(DTWMZFf8yKjI3O@n4-E)(s&azj-4A@uxeK z4-$6ZU{lj}RL?8U&cxvNhu(4~5^1kJaV`LKyzUjY6Fd)-k|M#`LAHB6(=sv+V2Zx@ z3}-__14fl}zAFo@M`Nc#sY%Ys*@1#GIX!)>?*t;vB~lQ?HH?j^hiwavLB9TONn8mp z?}b+(AtA*5hh{4-20r3CJD{UqX-`>(y$37h!>@5+J6-vLBTz30eH$wub#ET>JTa<% zttj5&!Xj`AzLRFYskil>U^xV;n>}|0Z}E{dEnn>OVI-^r2-XhC1{l?CYoh@*Vf|xd zW3ADp)Y6Qc^92UH;oYbxjfv0&v}624M<)=z@|XrB6`d#FAM!;uYB9VUFdY)&!`;QA zL71HgljDu>rSr6|?CY84mya?p+85bai|rf+4(^gjxyX{6*owmpcKq*?4gUZA3p~AH z5|QGzvf6UszyZ{|VGsrkLHqBK59%z#wz7cacL#<wMmwQeAzT@N7D<d68D;cM72x0o zCQz&(n6mUFS_Xz7!i%A&=Ri1_^c>bV<c+Iw78#8poV7L`z=!I%%g9ricc#eWaDc$9 ztRoOQZ{a7&+1ZqE0Y}AK)xwF7egeR=iIlDqr|D$UT7;@=FK}>tUoN*m7&*emn@E5* zI!-2pv2nciO2EHYAk0MaM{ujk6PSnOk0l;HUe{fZkLFk5`S(f;4UwcUVO!-1O@)kv zG?0zpVIo7mPayz`ABhBtlOw{ne}8hD0F{WIh7}_<j6({N8L-6i_`eWOx0TYnlmGrD zUh=v)O7%S4x=}<y>QJ{9aDD@Vs$^&WZk)tF@jDI(=6B6>|NC_;w>O~g)FdKQhJ9sr z=~7UA=-$nwSAW**iIJ55xlR3Wj_BCfB4FRW>FA(^&cKMdJ;ZBHAYG8(HNAAp=<sX) z#7>;Mz>jH`{4O)5*9QOV7>)lYi*5eSoieqX=HmBY1&ks(-aH|?`8DkH5Z~WxU|5?- zIJSTaL3sp7HbFWzN^2G*R**&kBwUqWZ*NSPv!9u*rAgYSP>;Cw>c@+?J@?x$niuV` zKOzvuR90TTUremL=^`eXM&ME>hsBN~Zxf^u0Q3dLUPu&4-DFVjTn@V<#N(nSu<Ki^ zLh=c)D3wHUo!WgTTI-4TR|R+n&KUFBtA%VDl5iuFlW#RHsc7jbN11n9VFH<!VvAck z>}^5@+arhb7dUG(n{I924Xyf{3as{-4*eElVcS_aI)-D$s?VMW&uE(EVx8bN?CMkn zt#lQQ$6E9hTNtr8jvqfR+7@Dq119h<SOdBx^uZMPjS<lU<DSHm7s5bw!`r9>n@E^I z!I<S3@elu=;jBKq`~O>zVOYY(JT{@Lqf>*fMe2Z$CwKNNW_*rKOixeCqGO^EVr(P` z=oLUf=#Mx5-^gVxt5|EOq?~9jM3;aA2RD!?ZeZh>q=H?Lg7FamLGHiRE8kD2XDx<r zUfs*hO&REN<fe#&1|1z&2qop4Lr-Y#XY%h&RjHg#FU<0r6do;%`~1M+^1}B7eJaBQ z-baR=P4zoOL-uw^(W&!(+Y%^{%=2)FyL~P)P+<#;-Qeam-+MtTOH0?2v?d>3^=k8s zG;sX!$I-#z^#swnkr9T6h-VuNOZ|0i?Pjz+V&D&e6_It-p}*4+ft-s5oSei#Dgtp- z&_prWOB`uI*rD<9Oryzy(5b%dQj|%iCA;yu%)N19ab#wO3T<A`&=B4k<2vSOh+{>R zltP@pCiM1R7+vJy;pv!iRnO7}D!-|eCNKoFk1PWIu$}h0H85b%-P1Dy>F30&A>461 zAM|7V0lJ(2`SUhxZE`9`v*c@wJ#S>9JjaTQi-|csfFU%Vn<|H7F(M!T=n>KLfnQcv zS6wOhMk(GROfig$a0wxU8td>vFQaP&t0)s5H$9=o6Uht%Lqntm2!sh^?f?e|iI{A{ z2!d*f#4`bgkax$<rfH5~>WMf5=JI7;!n1tvfB~6GVss9_j%g9%^bI82cLJp3D+|Z1 zthi$lq-17N;7J3B673!yEdmxJb90f{MVts-VOr%@X{kux!JlHs>EnFc&G?7G=S4xb zL44t6OUvPFHzK)!WbaJ`_wLAX<|~h>$jWYpBNq0T8<3@=yZhD&%Lb1B9QuH%?3tq7 zlWz4gQBx0#40sS}BE)e*U8JU_CX!Nw6^bD#@Y9m4RVwm;O|VFj(m0DXiuW|b4kHqM zMrE|f<HJck)pyb5W*}#m6C)M56+%bE)F7mji1hSBM4AbJ5Q3ulqnmuvS=wI^zFY-E z1bg#)QeM6f=AEL7N?nS4D9pPzZov$-xT-}vJG(0|4p>fm(eGrJltWY)HKqXRZ^X;5 z7!Msgo6|#Vox|rJ--6q1^6V@Oa;WVA`1<)RCr>eis3hSt{6=8c+{7>75`hy7K*UNE zY@{*WB?`fjIC%p@EO<C(pi+7mxkNgkjJI9lj`><Fu%FjxxCjLa(5Dj*LNTMu*|^t! z4%rnV=15F&VD*T5%yZZl8|1eLh`E11*<}qeY6Na#-MhGx(sG2diyi&krZa`@*|j%% zZHT%MZV21~OAw&`O3#y!6>t*Knv!vLOdw~iSd3C2n1)Kc;C7tOfSOPP(o0K6SL0@@ zB7zeTZonW%SZ^2Ly*%dNF)yg0srkmu_E3#X)CkrQ15TbGKsdZ;B9DjYozcVkr8nSh z&XXPcjmllNVrRvQI&)$Yu!}b}{HKV+*&VgPScF89zQ5RhFNVY&eJ}#;FyG^wTUEtM zFhlfz4p_|n{S;WVqvfATNdHpZkRpK_V`(E}*uC0?;}_al&b^k2DiAF;2uFh?Kr=%B zH5G2tWxT;BqTtAIf)6o;lVe>-qHA}&e^17FQzlso%hb-^Uc=Nh66FHMyG^kH$v-FO z*ddiz5@u?*kdt#tNU&gUGnkSygoMf43Nrn7{usCszWI0sS3?~N1OuN*7~%V1d0`yU zdwgSgd71mj5ow$>WF-){V2#fq>?{Z>i13(WtuTCuH%or27gl2?h1eT$><S{9W*APq zG}qPKOi5bn8S4C_x7g(>&I;pI14(_HELEVlVf5@UCn`Q1wB1CGqp9h}g&cXXLM$*k zcJ|L>H_cc<5U;E)*(OL{X970aOn17^y9xIu7Wz1m5JT9aM4pUpGHFv6yZ!fw3pw>j z?VyhVTJK<+tKYWPXCsJ_L|Hq#qfo4HJPXvLh-;s(_pSQ6d90n7Pnb)Sj|{OgF~qJU zj6ImJMi1ZUb)b(mwX}r7im@#e1}V2){?-Elom)`wJ}UC5({mFOXTkZN!uTSSYG=Oc zpc-}J6z3b*rL>r5#-!*KV;W0yD1V48$lKaZU3F48qYN>RIDrSR<KW@R8<Z_KvB?|M zo@(VkE#|#)oSH@S?zeB>jt_}c=xa@0HgFoph!AEU<zQSw*PViShqNt*0^y1iGc8aT z)1V_FL+oAZn5li#;FXUUnmQpcfdwMdeEFGu$Mo_NszWrmFmV(LLc~a{=C-)tWC7q6 z7R)ZiLf$`k_%PIEuVkUaS`g|}Fy$9tX&kN~3)z$iUIT6#KlY0nyO{ho_7m2GEt2dB zOODOzVWFWXhvv!>B|PsD$68!m!!S^VBN2Tw9%n^sgGyAUD}?xbQOoqHZ<Fe#rspyG zVLa|x=&QVr%fjgZQD_9JLnSq4Pl#Z__U%&(Nu7&WOR<US+)p8Pxx6nuB6~tqG#2Y1 zv$!}0aTH_=#KqlDU2ndB<WmWbJ(~g=d)i|+1v`ikdC8=JqNjDJhlYmk$Hkpv3J*f3 zlLL$1;*SFq%oDC5^0dVt)gtV=ag|pL+OKu;>SX5uGN}(AK3uY`E-86{+QohPbXAut zQTw|3`xQwQ8wCa-M`Rb!EE;TG$~WS=;DS~-j!yj?A!3pwL8L!TdJy^Pvh{LvD?X8M z3ddJHAgKecWO#OUb&2he=S1p{Fz^yT4D3XJ0>RpA@hhAyEp68?y~`eTd5qrvrR?6r zy|lDum4Cmg|Nf-vboui4lJJac<S6``Nf^u>%wd8oBYv7q+?AX3BrB^)6xy&i$sb;} zYy8it#s|pgnmw4dx^~6QO&%j6%B5%kCyt@OfRRUU6vX2&x51N1b5mv`kJBI3wy;b$ zrlDfN?uuP5BuDlSicZ~sUxZafoWKR0eOfb2JYP>&ORLMaLi?zY_h+c#-<L$;@{ss( zzoVBsPY8Iz#Lt*If2QOq4u!H2WWuCQ=kZyLAFw0ihYb0Uaw$6GiI-4Yz;*Lm_z?uz zLL%Ig%$%G6>{=q(bN{~8$}16vet(FV($D$`lnvW)v%lZx16sl1;af?$rqyf^0kNo& z$q`wp-wNUn!8eTk%+OcI(vlKRO!MMcpa$$hlULGOzMW0{pRzJDiOEz%=nFhPPmYJK zpw78_>$MbKY<X<o_-;{UF1GiR`RVqnifT>|3i9(Kpzpp<OF~|XOiF_7+3jmB5~x~; zAatPzei{=iHc*9R@)Rt5uieX6uO5Sz5QPF0;OFJKXXjR$2K~%Y3hNL~=jP|{_|msD zITdgP{?m`;<%78Y#L*2z7WQf1bSqnkQrbP#x^o<~9Uz^yI66mLN2h1H@2C5|xsT<t zPF2ec)J%eRutj-HUnQXMY$xG#n`?s+<vvTDX9eN@+u7QlP_uV%_;<cVXlToh+5N(d zRR0uDC>h}_V)x*1gtr%{Tdi$P(>#YwLF6Ywmp^>`s6w)V|IRS|;xONj8j)fEb2<_v z>*sn&7)v5*9R%__cYq#juw$&8oX$(IwXeQfTDivcuw@E-j|-ABW+{Xn2jrB}-ai$3 zp>B1297Dl)DKYSOX-+w{vjZkQ1t}a4Xy*6ty~?+V<kJxmk%xjz)Hnw~NmcbAva)1m z1)HZX3hcvI>%tTq+^aC$l;FnEsJuMKQu`}MW3rW*S+_lg^7aVs0**)uf_0Jh^l1mm zU#q4FGwscSOo*;TUa-H^DM|nAM_-rKOb{<BoS?vOXj)}HHS)TGS#k#nWok>7w%v-o zFk*Ye>;iGZ926JC?p}{BJn5VE_EAOi9~c-Q+(z(vB2)m_0t`)Hb(~K{B<a9OYH=rh z>K`4n+c&<ChDB5gqDYZtBMsW`No97-xPBcOk;Z{)=1FCj1dmsydyK!^2f>FESe<}7 zNWCDHDfBD-(luz1XCdbyQ$!&ZX&-d@)5lMrjz~x(5VsY2)+NIOGusWdtVEqLypwBK zN<-jeXbrbOBCZ(kTD%9$Nu*jfkVPl`F*clati;i5=4h3~R0F`qJN<D#i^d}Y33??C z`yiZU=j71g)CP#X#LIVqd;!dcsWqnVq9fEh$KRh%SYn_Z+rMoy9SZRktYTVhIvm(i zd+(q!zkTm<%!oT1Gc2+I`4_<OLPoy^O&-6)!8uwp^%oOF{5V!*{+AEw@8k6TF54); z&LXR+(=R3)#A}y0`1m4k-n>b~Cy4W={Qmw196!<i<U)=u9x%=$kcUo7%;}H^Bscz| zCf^JTpEy?R;GskJu%tI};3TloYY`CF7>sT{CKfhTmC5<rG^{BI6cFR1dHOHXTQa+; zO3_+up^p%637?QKX706&@pWIoAztW$?>r7^T)FZ*IOqBaK)0@mNmp?q0Ebaw1(4D& zU%ouYEWx{Yp`1opRmR1me0+^~|9MOUOXXc4f-lHC=bXECH_n?ramXV1?UKHuqvI-$ ztGR*+Pe`30t(L$HdWBZoF=JoGI~S92A%{>`iBlx73y?}}K#h0~01W5{pv{bCQ>~5! zGFI{^PB}x!kjU=CgMLn6buTX$V0GEl&S9t{#1R)*vbbl2B$8|Vk^#4)Y9RXKXX1YB zsWOQK?<LNSguNZ4nN<fuL!9&i*MP7Zp4D&byN`8%IA_GWcPc~-*shof(HTWW#n*^? z41fF94Dvuwno`t0f*D0A-i3$@VHk5>2f%#r%M{eqfxr{%Y(I{;xw#S9Re1lmke~r% zc?~_4h!nwn0FK)UwLHJ&E7cD9@ff5C%#B8gU|xKDJP|R3OQI4duoY1Z=<i;6lJmF} z;$Tri&&IKzm}<im-n@qdk><gRiA+6)eb#5wXjH<%mzC_CoX!H5VrAnG2-UwMv2JE$ z90uscS%4(M7XewM4VFXtcD!O{Z+efNGpsveZ~vbGmo)>cCum2Jhm9GS^+5eTkdtPc z@d8J6B!GuiUQhk*3G6FgcS}xI2DNN~Ek4jVg_sy<_uMgUzFj+Z0EhO0>$ZXWWPr!L zNCR6qA3l5lO=Gk;ExhSI{beWcfPxr3cVAy#VCxRJZj%{U#xDeRJ%Byo6)RUdR##ht zP7ZziIGN{9-v{wdmpNDN$^)Y@F8l4<x4;#+dCMDK?x+VY=Q1%fE1Pv6IFA8b(^XJZ z#5DgrJ8+g`^XAPT3y)jw0d`bO_B}iKxe~Z;zV~ptBo7;~NyzY@ZJXCpr{G}W5G_$4 zn&P$8kY~P3Q8uvPm$0j;SkCZ%hduB#sLy<>ze)i!yTSPd7c&B)qq~87m!z&=0ge(( z@k(9(0XWbM8bQd;cJ}t>2BwIHdgt(!AyT(rYZ}Z2j<G1d1};0{i3XnExG<mt*aQSF zdp`u+6BnQV>^r-Th-6#hyaRkMk|f$HnYdls5@)Dy2uJ~O_#G6lyBhEu{v!IHy+Bf2 Vr(?aD3h;nl22WQ%mvv4FO#l|jgZcmf literal 0 HcmV?d00001 diff --git a/src/quick/doc/src/elements.qdoc b/src/quick/doc/src/elements.qdoc index 63fcd1aa29..40533867df 100644 --- a/src/quick/doc/src/elements.qdoc +++ b/src/quick/doc/src/elements.qdoc @@ -50,11 +50,13 @@ two elements. \li \l {Rectangle} - A rectangle element \li \l {Image} - For incorporating bitmaps into a scene \li \l {BorderImage} - Allows the use of images as borders -\li \l {AnimatedImage} - For playing animations stored in a series of frames +\li \l {AnimatedSprite} - For playing animations stored as a series of frames +\li \l {AnimatedImage} - For playing animations stored as an animated GIF \li \l {Gradient} - For defining a color gradient \li \l {GradientStop} - Used to define a color within a \l {Gradient} \li \l {SystemPalette} - Provides access to the Qt palettes \li \l {Canvas} - Provides a 2D canvas element +\li \l {SpriteSequence} - For playing and transitioning between multiple animations stored as a series of frames \endlist \section1 Text Handling diff --git a/src/quick/doc/src/sprites.qdoc b/src/quick/doc/src/sprites.qdoc new file mode 100644 index 0000000000..e59b30855e --- /dev/null +++ b/src/quick/doc/src/sprites.qdoc @@ -0,0 +1,176 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** GNU Free Documentation License +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms +** and conditions contained in a signed written agreement between you +** and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! +\page qtquick-spriteengine.html +\ingroup qml-features +\title Sprite Animations +\brief Sprite-based animations with flexible transitioning + +\section1 Sprite Engine + +The QtQuick sprite engine is a stochastic state machine combined with the ability +to chop up images containing multiple frames of an animation. + +\section2 State Machine + +A primary function of the sprite engine is its internal state machine. This is not the same as +the states and transitions in Qt Quick, and is more like a conventional state machine. Sprites +can have weighted transitions to other sprites, or back to themselves. When a sprite animation +finishes, the sprite engine will choose the next sprite randomly, based on the weighted transitions +available for the sprite that just finished. + +You can affect the currently playing sprite in two ways. You can arbitrarily force it to immediately +start playing any sprite, or you can tell it to gradually transition to a given sprite. If you +instruct it to gradually transition, then it will reach the target sprite by going through valid +state transitions using the fewest number of intervening sprites (but ignoring relative weightings). +This allows you to easily insert a transitional animation between two different sprites. + +\image spriteenginegraph.png + +As an example, consider the above diagram which illustrates the sprites for a hypothetical 2D +platform game character. The character starts by displaying the standing state. From this state, +barring external input, he will transition to either the waiting animation, the walking animation, +or play the standing animation again. Because the weights for those transitions are one, zero and three +respectively, he has a one in four chance of playing the waiting animation when the standing animation +finishes, and a three in four chance of playing the standing animation again. This allows for a character +who has a slightly animated and variable behavior while waiting. + +Because there is a zero weight transition to the walking animation, the standing animation will not normally +transition there. But if you set the goal animation to be the walking animation, it would play the walking +animation when it finished the standing animation. If it was previously in the waiting animation, it would +finish playing that, then play the standing animation, then play the walking animation. It would then continue to +play the walking animation until the goal animation is unset, at which point it would switch to the standing +animation after finishing the walking animation. + +If you set the goal state then to the jumping animation, it would finish the walking animation before +playing the jumping animation. Because the jumping animation does not transition to other states, it will still +keep playing the jumping animation until the state is forced to change. In this example, you could set it back to +walking and change to goal animation to walking or to nothing (which would lead it to play the standing animation +after the walking animation). Note that by forcibly setting the animation, you can start playing the animation +immediately. + +\section2 Input Format + +The file formats accepted by the sprite engine is the same as the file formats accepted by other QML elements, +such as \l Image. In order to animate the image however, the sprite engine requires the image file to contain +all of the frames of the animation. They should be arranged in a contiguous line, which may wrap from the right +edge of the file to a lower row starting from the left edge of the file (and which is placed directly below the +previous row). + +\image spritecutting.png + +As an example, take the above image. For now just consider the black numbers, and assume the squares are 40x40 pixels. +Normally, the image is read from the top-left corner. If you specified the frame size as 40x40 pixels, and a frame count +of 8, then it would read in the frames as they are numbered. The frame in the top left would be the first frame, the frame +in the top right would be the fifth frame, and then it would wrap to the next row (at pixel location 0,40 in the file) to read +the sixth frame. It would stop reading after the frame marked 8, and if there was any image data in the square below frame four +then it would not be included in the animation. + +It is possible to load animations from an arbitrary offset, but they will still follow the same pattern. +Consider now the red numbers. If we specify that the animation begins at pixel location 120,0, with a +frame count of 5 and the same frame size as before, then it will load the frames as they are numbered in red. +The first 120x40 of the image will not be used, as it starts reading 40x40 blocks from the location of 120,0. +When it reaches the end of the file at 160,0, it then starts to read the next row from 0,40. + +The blue numbers show the frame numbers if you tried to load two frames of that size, starting from 40,40. Note +that it is possible to load multiple sprites out of the one image file. The red, blue and black numbers can all +be loaded as separate animations to the same sprite engine. The following code loads the animations as per the image. +It also specifies that animations are to played at 20 frames per second. + +\code +Sprite { + name: "black" + source: "image.png" + frameCount: 8 + frameWidth: 40 + frameHeight: 40 + frameRate: 20 +} +Sprite { + name: "red" + source: "image.png" + frameX: 120 + frameCount: 5 + frameWidth: 40 + frameHeight: 40 + frameRate: 20 +} +Sprite { + name: "blue" + source: "image.png" + frameX: 40 + frameX: 40 + frameCount: 2 + frameWidth: 40 + frameHeight: 40 + frameRate: 20 +} +\endcode + +Frames within one animation must be the same size, however multiple animations within the same file +do not. Sprites without a frameCount specified assume that they take the entire file, and you must specify +the frame size. Sprites without a frame size assume that they are square and take the entire file without wrapping, +and you must specify a frame count. + +The sprite engine internally copies and cuts up images to fit in an easier to read internal format, which leads +to some graphics memory limitations. Because it requires all the sprites for a single engine to be in the same +texture, attempting to load many different animations can run into texture memory limits on embedded devices. In +these situations, a warning will be output to the console containing the maximum texture size. + +There are several software tools to help turn images into sprite sheets, here are some examples: +Photoshop plugin: +http://www.personal.psu.edu/zez1/blogs/my_blog/2011/05/scripts-4-photoshop-file-sequence-to-layers-to-sprite-sheet.html +Gimp plugin: +http://registry.gimp.org/node/20943 +Cmd-line tool: +http://www.imagemagick.org/script/montage.php + + +\section2 Elements Using the Sprite Engine + +Sprites for the sprite engine can be defined using the \l Sprite element. This element includes the input parameters +as well as the length of the animation and weighted transitions to other animations. It is purely a data class, and +does not render anything. + +\l SpriteSequence is an element which uses a sprite engine to draw the sprites defined in it. It is a single and +self-contained sprite engine, and does not interact with other sprite engines. \l Sprite elements can be shared between +sprite engine using elements, but this is not done automatically. So if you have defined a sprite in one \l SpriteSequence +you will need to redefine it (or reference the same \l Sprite element) in the sprites property of another \l SpriteSequence +in order to transition to that animation. + +Additionally, \l ImageParticle can use \l Sprite elements to define sprites for each particle. This is again a single +sprite engine per element. This works similarly to SpriteSequence, but it also has the parametrized variability provided +by the \l ImageParticle element. + +\section1 AnimatedSprite + +For use-cases which do not need to transition between animations, consider the \l AnimatedSprite element. +This element displays sprite animations with the same input format, but only one at a time. It also provides more fine-grained +manual control, as there is no sprite engine managing the timing and transitions behind the scenes. + +*/ diff --git a/src/quick/items/qquickanimatedsprite.cpp b/src/quick/items/qquickanimatedsprite.cpp index 204900177c..a5e5d99bcd 100644 --- a/src/quick/items/qquickanimatedsprite.cpp +++ b/src/quick/items/qquickanimatedsprite.cpp @@ -215,6 +215,14 @@ struct AnimatedSpriteVertices { \inqmlmodule QtQuick 2 \inherits Item \brief The AnimatedSprite element draws a sprite animation + + AnimatedSprite provides rendering and control over animations which are provided + as multiple frames in the same image file. You can play it at a fixed speed, at the + frame rate of your display, or manually advance and control the progress. + + For details of how a sprite animation is defined see the \l{Sprite Animation} overview. + Note that the AnimatedSprite element does not use Sprite elements to define multiple animations, + but instead encapsulates a single animation itself. */ /*! diff --git a/src/quick/items/qquicksprite.cpp b/src/quick/items/qquicksprite.cpp index 724bf8fef1..8b77d23270 100644 --- a/src/quick/items/qquicksprite.cpp +++ b/src/quick/items/qquicksprite.cpp @@ -54,16 +54,7 @@ QT_BEGIN_NAMESPACE can be in the middle of an image file, or split along multiple rows, as long as they form a contiguous line wrapping to the next row of the file from the left edge of the file. - Sprites within one animation must be the same size, however sprites within the same file - do not. Sprites without a frameCount specified assume that they take the entire file. - - There are several software tools to help turn images into sprite sheets, here are some examples: - Photoshop plugin: - http://www.personal.psu.edu/zez1/blogs/my_blog/2011/05/scripts-4-photoshop-file-sequence-to-layers-to-sprite-sheet.html - Gimp plugin: - http://registry.gimp.org/node/20943 - Cmd-line tool: - http://www.imagemagick.org/script/montage.php + For full details, see the \l{Sprite Animation} overview. */ /*! \qmlproperty int QtQuick2::Sprite::duration diff --git a/src/quick/items/qquickspritesequence.cpp b/src/quick/items/qquickspritesequence.cpp index 80dad16fe3..7f7d1ccecb 100644 --- a/src/quick/items/qquickspritesequence.cpp +++ b/src/quick/items/qquickspritesequence.cpp @@ -215,6 +215,10 @@ struct SpriteVertices { \inherits Item \brief The SpriteSequence element draws a sprite animation + SpriteSequence renders and controls a list of animations defined + by \l Sprite elements. + + For full details, see the \l{Sprite Animation} overview. */ /*! \qmlproperty bool QtQuick2::SpriteSequence::running -- GitLab