From 86181b0a14d89cf45daf97199c3556c4dd1ee7b7 Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Mon, 3 Oct 2005 15:29:22 +0000 Subject: [PATCH] - Reworked Surface class and drawing stuff: - colors and alpha values are floats now - No complicated SurfaceData/SurfaceImpl stuff anymore - Loaded images are cached and reused SVN-Revision: 2806 --- data/images/engine/fonts/numbers.png | Bin 6644 -> 0 bytes data/images/engine/fonts/shadow-big.png | Bin 0 -> 119219 bytes data/images/engine/fonts/shadow-small.png | Bin 0 -> 26936 bytes data/images/engine/fonts/shadow.png | Bin 0 -> 86129 bytes data/levels/world2/dfk-level3.stl | 8 +- data/levels/world2/level2.stl | 6 +- src/badguy/badguy.cpp | 4 +- src/flip_level_transformer.cpp | 2 +- src/game_session.cpp | 9 +- src/gui/button.cpp | 2 +- src/gui/menu.cpp | 19 +- src/gui/mousecursor.cpp | 6 +- src/gui/mousecursor.hpp | 2 + src/lisp/writer.cpp | 11 + src/lisp/writer.hpp | 1 + src/main.cpp | 16 +- src/object/ambient_sound.cpp | 1 + src/object/background.cpp | 27 +- src/object/display_effect.cpp | 15 +- src/object/fireworks.cpp | 4 +- src/object/gameobjs.hpp | 1 + src/object/level_time.cpp | 1 + src/object/particlesystem.cpp | 12 +- src/object/particlesystem_interactive.cpp | 8 +- src/object/platform.cpp | 3 +- src/object/text_object.cpp | 9 +- src/object/tilemap.cpp | 10 +- src/object/tilemap.hpp | 7 +- src/player_status.cpp | 5 +- src/resources.cpp | 37 +- src/resources.hpp | 1 - src/sector.cpp | 12 +- src/sprite/sprite.cpp | 6 +- src/sprite/sprite.hpp | 109 ++-- src/sprite/sprite_data.cpp | 7 +- src/textscroller.cpp | 11 +- src/tile.cpp | 6 +- src/tile.hpp | 7 +- src/tile_manager.cpp | 1 + src/tile_manager.hpp | 1 + src/title.cpp | 8 +- src/video/color.hpp | 28 ++ src/video/drawing_context.cpp | 88 ++-- src/video/drawing_context.hpp | 37 +- src/video/font.cpp | 47 +- src/video/font.hpp | 19 +- src/video/image_texture.cpp | 19 + src/video/image_texture.hpp | 59 +++ src/video/screen.cpp | 142 +----- src/video/screen.hpp | 46 -- src/video/surface.cpp | 794 ++++-------------------------- src/video/surface.hpp | 169 ++----- src/video/texture.cpp | 7 - src/video/texture.hpp | 30 +- src/video/texture_manager.cpp | 218 ++++++++ src/video/texture_manager.hpp | 60 +++ src/worldmap.cpp | 4 +- 57 files changed, 837 insertions(+), 1325 deletions(-) delete mode 100644 data/images/engine/fonts/numbers.png create mode 100644 data/images/engine/fonts/shadow-big.png create mode 100644 data/images/engine/fonts/shadow-small.png create mode 100644 data/images/engine/fonts/shadow.png create mode 100644 src/video/color.hpp create mode 100644 src/video/image_texture.cpp create mode 100644 src/video/image_texture.hpp create mode 100644 src/video/texture_manager.cpp create mode 100644 src/video/texture_manager.hpp diff --git a/data/images/engine/fonts/numbers.png b/data/images/engine/fonts/numbers.png deleted file mode 100644 index 8ac308387a1a5ecb8439a33e011a090de49046a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6644 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

_D!_if3NIAW_pQbHz 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 P00000NkvXXu0mjfGrj|V literal 0 HcmV?d00001 diff --git a/data/images/engine/fonts/shadow.png b/data/images/engine/fonts/shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..b7e054480d7d85ec9d5cf5027b461702d75e5453 GIT binary patch literal 86129 zcmV)AK*Ya^P)WFU8GbZ8({Xk{QrNlj4iWF>9@03ZNKL_t(|+T^|Wb6iK3 zES&A&y`=}e6Gh5Wc4jngU&QwpKeszOGx8ECilVn5L4p7X!rQjr56GO#F5KJQps0-( z?;!#~1N1djr;g2&Cxh^n1(4&PZ2-Ce^aAMSzjFX;0JZ=u0C>f}S5g0!2hay#KY#&# zZVSL1zc+auMECCG=kfqn0jvWk*)@9s3&LfZwWxT$!9Wr{}BNF z0JZ_V3 zN{egO!OtH7Fvc}_2w;lOlC%cxT(dE*_cDNa?p3SL?)UHJXEst~tz$^FP{nScfSvecZ$`3V{x0m51*(fbRi3i4L?5&N%?T2XK@j{<0X*UwthJ~_I;gnL@miD7djG%pmE$>+5n2PVo~N+v2k;(% zxA}J|fgWn%cC$$90QT|E1se!a4=&D!(6d0jpFt z`}n>W_#F2Ed`D%|0pJV|<0bz7k5pdEe7|B^(!|yK;1m} zpYsqrqY`+=>s1;Y{$B3iXME-p6r2}SLS1G>;?MR|fqlSrKhJd=p~0AHq6B1&4)ED8 z^IgB;=ZgHUH4*dy0Pg_!6TL?5_wxUv3PAgMg8S1(rFtvR4L!xf^)45zje?qu+y+n> z4pB&BVaV`v9zNtKaJ{^4CdFMH;~^O3Mh)>=Wgd_L0ONeVSt^=rwDAW3{Fy>8Po;;4 z>J;7JMIOEq4{^l~{}>PcC-gQZ`1!KkU;lnYp)ByeA5&nn{P(&k*WdAH`+3g?e5Z_g z2&d_BT;M&lHdP*`HNMYGlg-Zaz@4TA9ii*5y=WFToS-85Jr!X)KR;_;P0|5Wc(uZ3 z9pyUo+WQo#6iX>W+RZ(9i|cifzgwj8&hY)$Qx0;LYd%7yd!F}RG`X%>cvkxj4qDFE z6Vcym_Fef6?%yb!J;Af_0cGS0fLA)K2kD~jGr>f{i|C*gxR}}K=X$YHv_VA*MVj`` z+BG{(dE_m2tl96i^Jf{0zq_cI-r@Hug(=5_Jiy<*WC!=Ic^OiKU(lM5@jePG^n9Ci zZD;vD%9(Ui*xLBn6TIhnD%O2mn_0S~OI#zxtBRewdCjujx0lwnBgOirY5HOQ|2prt z-9YH%!e62?JHdB(3E&r6@T)1Flky((^loxo*E6;TtCmMujO0T?dYl6KE7mp8ZlB7no( z@Lq0+atL_})CC^00uP0(Nsq~W zh+Kk)yvApn;rI4$paA5NjPvk+K?N*>aF<@)D=l&^(o{(Yy_WDYNU+S?mT)QZGn*9f ztp-YC*%Zf?DTEp~e4GEjVI>{K&!_12pWsGkDU4-HUe@?Laz$sj8I9ft_PG@b?rmCB zKftRz)FmFk6I29)X8FGX@GTG3y1AZG09v!MC0%u(?o$C|d7xIgPL+gbUE}lJ<{`Su zO#DI%?rwqBEYIsq@xBWUswPO;&zG#4Jf`LCqg5Z|`^iA$D5&pKSO*ghPR6{1%Y4pF zu1%3v?i|COJ`0^B(`}a2uJUK2W*{0JZnTguDDY4Z+x^RY# z@g4i4Jd*@=oNLyW5Ekk8gl*Vo2Tg|I6=kH8*BG+A&mvvkHSX;~l>bQzrP?hYv&rvL z%Gr?oUZdjkebc&kQhti27&n@DWHQVuX;)h~{5>>4pYhv6!C&Zwe$Vq+&hJsPpaqSn zSWp>vZNO5B3tHpiKH%>Taf2S2m0PA2+v3Jd(t?-xGaZN_3RwrAqi6!1HTU=s%Ts+6 zP;KIK3en-nh0F7EM`&ek+5MG3JjMlopTaE5e}}*GF=N~tbU*ceIZIrPTlueM`HKro zYISfUzmD=3zLx8}?+gClhAGm$xR7}}Oxf2^0P@@%GvEnamzOoJ{R;#DP%b6JSmge{ z;QDP_2=;)_J4jFA0`K(%!2dKaZHxOim!RAnlW~mKQwek~K?zjtaLplrmsGuQ51@^| zuS!&!`>%4eLYGxO?=sTCOgZz0KWF9XB-eY9%IR+ae&G9Tfk2=nw>K00eWX-3j7=-NFG(}XkjC$4*cKuO)BX3oPq_Sk$LXplW zF`DD`j#4o0a$~aQ!YbQeqL%-fi?744!@fXE;YqAnH()MDGAwhcs1+0UC zJsf=HRwR_&RFsD)FpDi(p*W}D>s(Fn94maMA1%S!8F`y-C?+Yy4@^d0QNZu=UWb`S zIL`G`+opei!)OwFc*^Ss75(7`g8wRB-(X?8g?)wSNZRM8RGmNECN!p@JTNqw`q!+Ym%0znafy?7AZ}r_46DB z<`^~KsKtJTDEU{Upv=%+yTN}~Em`#z4_haHzb%SKg%a#Dp%#kqA`eWN7Fe#9;Lsgb zlIpQ4f)tbDepf=OMs(U?so4fLvdnu;Y)Ns?QUML}y*}oBAMv2Bp)sU3YcBX{e)n5G zVQk!kEtxbe6{W@HV@ri^;bTR}puVT^}!iSO_xFz!_f*=;JpE(+r3 z^lENn2Rw2E>5$q26~{py{EwM^?&N14a^2SxyZ}L-?{U9IEhnJx>^`kv(mT6VUFMqK z=Q}-0vD`>FNCyxQjNMciMJkXtall(m;*Ij~cQvR^>G$ROzen!{T@ zA@5P7g_^baTV*9-%^&daKQOQ7?-byIRT5V1z;95fSIiCWu?otjDTF>&Jjz_hD|j;) z_bRV*od>>~iu@4Qa6g}6wt*Wu$S~*=9-;{=gWjhL`XnLt)jrUw5&Vu!HqhE&U@Nl4lg?6a3vp z#y|5>8BP{xme<*DF06O=ZSnKBC=BYX+oZs5@_^2B1J=#5U8j=D@c&m$8!NGOhX<~M z!Uz7|6JAe>b-&ejpHtJn35>hSk&_gjHa?pYqCIAX(p=YJDu7R^INGdg@eS8uF(nsN zq|h%@NiJC^HqCXv!GqAOA7IO_;oX4MCSh*Dly8Oiy2ACC#BU4Qaao+9^4-Q-PT!ISp7&qZ4>>;LdK(x62I zK!vP$uUYwJx}=llfm9O|$s!ei(1#aH8OY1HM)&@)34;H*YK0YabQsrlV zp#U!OzO~5uw9}*dfbX-4=D?iSQK+lDrxep^9{g8)##b%up>j5h-23ksdOb%vo}gxi zNNbxxz#-g5z$4UJRAxoXA+++DBE5?TT!$%ob2@zg6(N9(+BL3SJ7snO$v`^E&uvRw z3+31pF_SX&u-0dnM? zr^U<}i?82e?E5h_@M9kQD^z3)c(c9b87p6@;YcMtS1$XxR}&Q08wk+bH>p^2(H^P? zVy;2?D$C!0ml^CKKG!`OjHx{s03q3ixc&;W)_&tdC@jZuzW+-q{#W>~=Mu!8j;bwa@~p-0 zUiQl)09%SFLYT2ytr}P^Q>olV;6KUq7v@nb1fpk!1t0VcaoL=s_r?hvC5F!{4V4F{4ZA+ zE^EN-#Kd1IW$H-Wh{%l4}rL#gwR2@)FhTu z?Rn6Wf68;L^Er}SshB~hOhwU4CAMtku~HK&u12F6m*AyIm95rOgiC!1{Rn&v8H7fb zwdgSB`Fq0%jZc|`P_ArwoYfQyp)y(zcGu%|5I2zA-RTWeB9h749xfnsC01KB1ZYwD zCn@uS-M@srF$#I&I~!GjYQM1(%A{1iT2TU>lz%lO$p8z(;L5nJ449|;^A6+ReO88A zrz`ZG#er#Bv4bw^N7!lZ$YKY@_Yc%Jfg~x7gS`KH^hol2*jc*o*DXG)CAdL-bl=`) zI5WmWSz?~x7UTRU*bT*X2Az2(QD%4u2Q5L9mQ+y%;tZ9KI{n(rIty7RV9M=;41R$J z`3&DduvajK{+=$iJQgt`AN_(I;@Mu2Pk z8jSH-E-`_qMBXeDo!3#{OOaNN8|1U(5Rh}NG76~?<^caLDDYy7u6!+0Xnp3 zR2Zw0pYmy~-YaMFuL|5S-$8l4M|Or*095mKc*d|(yZCVYm_wz@_kJi}+3#17o_A$EgF#D?=W*KfkCMlSLIvJ}K2i|<_#jqv&Zz-JM> zxx!~&MriF-8F7sHiZ2k@ggp7>9>4~bkIH4Tj3O`jfXZ8Vh}Z+zVq9M}k4T>vGm@Tt z7@+}Xg)-Dbp?;Pk3nFHDk4mIK#qk3Iqfn!-JOX~cRcIX+F#tj0Cn$fKSH>SG?FKC>3$ z3pl_9RW;yFM)8!M5imp@>x ze;J|sO9yFzn>mNjQhbyLR}4C%Q~)3Gdj0euo+h}y+PqWro(^L--rWyl#zF-o9R9y> ztrbG4vn-pESLoxjAEM&)_Ub(9AYA zS5|h7F5*)Jl+lER2$S5v?MR@{V5bSe+d6BO{HZm_zK`cA#L_#=mlHvx zgzpTM&q3a6iWXM=;N!gZ1UL3){v7=OgS?Kj@r?8T2N6g{x=pc^O$iClKS)KREex^pjJ&5`yl_k_O1W5@WK%iwS zSZTG*%EOxoz?4nY^CAj9JHY37L4`5KpZD zK(GYRdJ_$nvEQGI4(K=nc}Fe5gJ`ojZJW>kBZd5sm6RmN4ro#AG{%L>S~gqc5-KsC z=Dh_f5<^bbV#W5Td{g9seMC)uj|$+qDFC_8?^D5!avg-HxMN<+Y*gP>yRf0@tFZU-UB8wBd1 z(G@f%KS}yh_KTcUY7#&){%hT`x75j6U#^R9~HzjoyivCLhbeij;CZ4Kl4gL0C(PV{}Ls=yBw@*kaV}GixOLfyZBpOXs;bvs50xAkdnRA@J#yqtcF0 zZeoxTspfeEEOw5I_}?hZbBsy#wt2eo@>13^(Y_XYbbz8-P^blt}Y=*wpAdzrHHC7*XcpZOcgMy0{w@8sc^HRj5%)C|MK7NltD00S1s+|_vO+|UAn#K4}Da%rJ!w8gWnW&sw%Uf*HW~HV% zD;H#V;VEi2mCE#BOZEUF?a+bg;9@N|NZ#nP59xIrKxoi8!-J8dyL2zX4H9zdIs!@O zL%Q6ex9W*19^TB8k1SHoaux*>ToGCvw&dM4JMhlxla0zznhO9^b{aC`bmsDOiU{q% zs>nQ}@J(Yklz4$kZ-qIOOBVJxd$Vf#aY!b?oZsT6r)H7hZS{Nkip zoddj%%B$;0=Z4roXb5^jxqMC+xRv<5V)F3PLfUCG223gB`-q4CEZ={YhyOo#%@`4= z%E&CAd&3gXaaEzjXZneMR#VPF$#OLcr_b>{ULtftRwKoEkBV=dvOmW67^94BqkgE* zzZ5{hvc0~^y7;!$ePQlQ)-v@g6hgr%|45IEujbQnMI+)nc~1DTOkBCMvFZgnoXv!dI;#Q8Qe_IF;sc^RSdd zkqfy$O011r(q_xbXg^y1AZ~|MynV?Io!8QZbd)>3Ztts>?rl)RuUL*|KEWGNIQImB?oP7P$B;((oLHHOa{V7%uTL1dA3~VTF~#?|FK;Su z!k#skxHHoHPFdv#X3MhMTeMP}{H%m9RxoG~25j;^r>XhIxJXa<;40l^5|W4`JYedr ze@3@aoPA&Lx}64+P>pnouGglOzWQkG`w=?TZX1~Bp1G7YZm7BdJFPTxh_Su0`iFQ( zezqiKuYsSk=7sdz`X1(I1&zIidP*xD#Ec!}tSJYl!>%M`sE24}#H%QptwpZqI0F0a zd9KHjDTz5g(Sk~VUSnVIxMGDH9%7Z>C9TQRzmMZ=r8$&#^Wlzj7@m} zHB0u09{V`LNUSmiPnt&>FCG%%P5X%V6rGWpK$N6Z7JJJQke670 z?xu$Oo(kiY#n49)h&c)t*G^%F@#Sax`56HJABBFE2mWsev+>q!&Ey3wA~5&r-JkIp zk6K7FVs3dB^)%=ii)Dp;6bZ>8{`&y}xoFvhYlZh)qC!za(Jy>%W$+(HKpf%t&soSd zP1pAkul2FL!(pqKzywras|rF#T{{iIffnlHvc#uY3VoYv_>dTk?@}yhoRL3hcmyS8 z?_l>-DnC5c$ouus?U;eziYXwp5mup&S>8(dlUx+%|70FTB_W%Ch+L+Eu!0xG%olooQBfBu1+SVBF|{3ahfZP0|;i%Yg4-Pk>FBrdy% z&gfIKLNNEeo$;_Jv3}+=m(8_3jzG!14}rGp2*S`4_3)Q%!Pd+Z$XUYha}$h3vj*Ne zt>n=-zuV1iuUKg&whB4aH+r~LDDyD=%nduj>cEiInqxY%n#I>8vk1zq+~U7C_%3lB zyOY;f{dk_q%9oT0?@@5Z-JDfO1Pg&p|lEzPEw(tMLmt$gC=D_|GZ{I zRLlTn8YqA@uGMubMfUKWlv}!%kc0AxN`K^8>9KrEywA$~Pht0vmAon2FKC3?ED!OY zR055<{Jiw6(ET>Opr+s97>Dtu54PysJD+14y50lcU=x z4zyDU)ZSG~yzRHp z=)|-t)m=syQ1Suq-^2QSe2_#Hr>aY5LP;}bmP&i}b6m%_cpX)E^Dj3M!a@siYsM_#dsH+vOLRHc{wl4^EmNQ(0Tt`(pdIFM zuFDCFskJU;Bsb#pL<&HFs791l3Ll;hYx2=&gM<| zRvVPb=ICvS`g@9>TSjwg^FD!|`nu@bo}hIu0?D1|ztl1Lp;bSI62h-7%d32Y`e8KAK3p@;bul6S*DQj($*Y)@ zT0Q)kgq+fldDV#uK#d(Y`GAjU0Xog1YtqX@q|-WiUHZDkt2Y{KdWA11Xk@p!&?-F& ztB|)kug|HI5_w>5?;*?RSF8;3sDbwq*LGL$xwT@({aZD4QOwu^c7pV(p$bDJ5g&lP=3Uc%@?#%?Uk} zl>C&jyS$_ONN!_Q3^<6;!(Xt?7B!hGwOYbGkJIhEOa)vp!I+_7e@6j{V_JnGZ?gv6 zO~w07gK#IwatvFYKW7$B#2)JjWvq;qdpixe)?psNDi85$3&QN6CFeD0Hr88J1R+4> z+05bfX7Cj(DZZc2u4=*--t3oTV1ktd0ihmaZ&Z5n7|&Q4^)UjRyxK?s_(dF_?~Ed? zE}|1Ml+m1!L7VPb(^_=@y|BV0jV^D6{yY-_UQ`BD;;RvqG-mV3BqS2k-b1zML#W4r zmn}YjhI(R>T7tkjEt+%<~=G0mNXc*nf!KJ+`pEV1k5y9 zh$I)Q6(t~=u@SzI;`z-6akq2gbwvuNXu{koL4wa#^IC7Ci7e`8a2&iWxCWP2nkX>u z3CNje<3hZGWHunN(u(=F+rqPD)Xz#>Oj(PpDc`(V z&(dd~Q!?p^30_hg>o7t)X3ny)115X|6~!)@I_gfa9DB&J@S2D$A$-C3a1y&4Q*@Ze z_#PUCu6)7@-{S@XORvUZ{hmp@DJFaG^Ig^L_B(`u6_W@9Nd53nu!esI0Sc@G`H&&Z zV>D*>De(ROM0prAOLiN;|6;yENJ!Ps#l|G0ra~Vv1PP=w&-hrNB7u)SKo~xI)$#zf zCfEg)oF@OpOl@dEl8QNz#yiLB#L(2!$ zQGzLUI>3!S&CP4G9KgDPaPD&Rizy{N^-}+ihhhqWZFn-$jv6R&5j!o%7r7Abrf%8h z))1O5YAN?WL?OIj0F*TZc<>`WlLTmxvGa!r9ax=FHvIt;N}5aWz4XG7f5<=8Sy_l; z;S3e%w}xS;MtO%n^I5!}tg@({=e}k5z-KUr^I)= z%mY41`Pnuvs0V?|LVXPL2d_p zj{!CEJe%P49HHX+{|@D^#Ol^*6g4fE$4=E-zMd77jUsGIB2Z{AncEOj$D zu;T$odhaiF(R5k*(gRA{67%M=W0#DZ^r+?zXTh!!vR{s;UWWCHV7EJN(+4g9xlxpzNr}Ym2P{K+ zlHtTm0{Gzw-$T9JT~>#cB2tE1_gLU_A4BM%TeT#Yl3&7lDA%+e__Hy35&tG3rMKZL@< z5yLhlb$2Q^F-ZZ5|#T0253aSzvGh==*A;5n zF&?b5T*T8qXxc^aXkRLmK!!%qysrcuwSpf0<3KU=B0dv-o&CEYetTIz2p zC6qT^`D!fPTl~8ey*gC~tvaQ%*U57{Y6k2YL)HpC%MZ8?hj~7(0+`NIa6Uq4_R+z2 zCYXGbt(Uts&V^JLq1>Pm1IVoK#u_mB4nmh+F(m<{&a^TDq%o6FBX$Ka#uwFOTVbfb z=5vf8AOsh9h}KZwW~oqTnl9KwK8uJ=#fx}~!aN&gnX?wYyt0h#3<3qzMnWAuYZfDB zRMO$pTn1&)rJO}ycAke{?aShw^R7YX1bk&x1T~KoP2un39&B>mluOZkg`{Mz5TjLE zV8!TKkC$j+T$No*<>QxzKdD9@h$598 zE_GW}({`}XP?VhMrqC$vR5wz^G^-%4=Pe8Fz#fmOdJqUR^LEht%#GhR?_&(1f4^iI z({Jbjbo2lABQUQlo3L#q91YJRpqvYFu-Xlxp(gN_g%g_&9#qtK#=y23gTA2snWxb9lf&Gle;NKBOWtUqh83V1&6m$ik!7F71HYzXi zNg zP8wC_3S+~n4=V}DW1&ZL2_Zo%U#_S$IAxmevmf=y$k^C;QdL|VFU$+;F}cVjD633l zlxk)GHnF=Q$pJ-GCoHHM;H52kxl95YY0F&5PQK_NgppqA6R+536k82j98-#7P+|RV zTbw;ifj-QGew6<=X$i;<%i3;GNLQl!Z(7(YXkM;*pogxh|oC)E9)T=8qtJrSdJn-FrHb@M*ydiVJRAo_i_d)L<+u^ zl0|=qUKSX?s{5^m=CpE2w07HeP=*Pb4X zw&@ZoG5GYGm$Ym^mOSbyxWr$0n*uDd)Q6TdOoD&*S^{txf&E3zNVl<@)i!>1VI~$0 zLaKOFV5B|-n(%DG;TLl374NNyxt(T78_kEznAhM3awA0n~;yJ1QuuCG@y^zbi7a^gc) zGuYk!su=hN-~WPH-%m|3iWoEL9fp}TAG68=OgXBQI~5s$JnETvX1HG67Ba;yd<;() zPvv9o`zY6Bph5VtN`<#d*&S!;Q#9@;5PC~WmN2d6`7(|JIce@1AT7!YCfWX`$%dfR7Ej;*WNR! z2cu?C<(0?+h)*z!`o8>iQ~FiZPc?405Ne7Fyf?w~TTM|SJ#<->0PRBH7C34U;I&BM zi@`?W-ccgsGQ8g*L#Ae;5}nuKGgjxm$LC++9vx$%R31}>zf(kg(~$TPKc>9K7Q2W5 zkzO!EkgOS$p-HA3)%w7eAa&>IFBh&tf78pl0T26j_mf3WfE8mffv~lb-sd-ow~Ez(Z)r zTiBs^x^6j%n0tTI+`2}|r#0^19fRxcGes_>r)v7seEtQivUFK^7)&8Prl-ctP#8=c)v}q!B%8Sd2IyqGqxC z%$;cb-8kQ+WO*#*7w)NCE4rnhxH#vzP($Xj6{0NV7V0UfG8TiV9y@EUV#$(c+xBly z+EpzXST*DzqS$uU01h4x%QAn@&D*rBcpK{H#4EnOW0_|4IV_r`8AtsfKw#I&MoP>r zlENV|F^SWln3BvCAKx)knpMkaABZp=FpGVMMx)yhgncGs1ygv7W=s?^K0;_Tx{pBo zvT5GUyHqB%$O5l2+!^3!h9Yb0B}p~=Oj?y{me0P#_4x&Xb25v1(${R{%?aLq8)0<( zBm!*yG52i0fy`o3*CG?t|3e| zQOxy-8z!XN8g@@EnYOse>4^oAeQYjl&fNV4YW2Ik_bt>DV#u|9V0GU^7E?-FYkmlnkaIsGFxm*)Ab0Z$!W=zEs41zaL{TM5aLI+cX$eXl&{q29_4#WE z%uVX4=r9GQz553B#3st2Eb_CxR)*V%su43y>i?=(OxgZ87vA#}7_cVyer50D!Z z&=kT@xgvUXtda}kw%&9qA)^`Xnsq!T>?Nz9$i%eGO!MDw&lFK%S z^mb$)(&@Z(1v|`Qrg2NA@!_Ws=)-fC^LR<6GGkQ>cYOy@KeZ)mUQxv|+j6mIxklQE zc5~gq`^=(o%PbOHa7`%QZ(ym6RR*Rk{_}TGJM3rNhgo`4YxF2CQU<=||0i+ttE*E? z!krc-`m~>^lq8}Oh~xacSa@_`G+p^Q0h_=6(#D6<S@BZP(KHL+Y&o@%e2Gp>q(+gliGTlX>>(RsgEo-BzKsn$SgmG|%*l~z%VQUL9A{XU?( zr}=2^KHj7IcN@v9z=EY7rW<$;p}ki1NX77zsE5Srvqu>wXiT;?WPx$(PyBNU>6~y~ zeEzri45M}(Wn0yndLLnwSGR#D3aDrF89|swFv9!XC0OYJ*QlNMeVZQRV&Y(VQHwBg6L$S>ajS+HBe1z?YmIK#^kH zjH)2L2*X6gN<59$>F1 zp7Q_$fsd~jVMxe|ZEvDk3ZlAt1`_!AG| z0;>w&BMb_;%=?R)s%VF3lt1UyV(VnZSUlD zSECp_o+;R8*Ql9i(q&<+60~F7oA-Ihex!nYg68~%Zp20i!1=_0JF?#DKa~0AVKIhE)!p^PMy$r-SR>Woy$%W&0iiG(5{{Mkf!~pZOk75vbXOkktC9 zr#)xu+GgvYPbnqJh#lkpP4F6yqsUugI1YU!|ECSuRiL7pMC&cguss>JT$B=lMS34k zk=#q6Wb_A27@ncg5y0mwv_`11X9W;ba;uj49D%M&Tk-~V63T?PYT_wUtk&C=-8TI`%06hpKze+j}os<;k=9nyM_=>{$!TzT|b*(0nM#JiRX^{nSUI z%F>`2!sUdsI7IpVBhS*90jWC7lX-&OjbX2?0DLrZ)iy*i{}?xN&=OHT>9)rX^*(<7 z5kLD2Uvz@5@g;;Y*P|A*#$^;Kpda{*AJY9Cw@N{0f)x;1LbqkVRrXU;lKK?xB24HJ zlIj~C@@`&7Q+_mJ`JX&kulTJFy$%Z*vIuluvzECQf^N`43AG|CajL3I;TJ>+u(@=f=8UmbL zuCVwCPV#+pk4JW(Y6w$_w)hzVih3fj%nie!#4)r(vUN!Qht<}zR?>AgCgC!EF#O8| z!en9xTQ!Qog9sZhy=$ibrj@^8mze)iVQBSDg zErUI1JdRo2N}2#W$4$CwF{a2Jk6U@C&)|ub$R+X)t9VF7T0;pUw4v(%L;U+F>S?m( ztfs$V$wiH`QYbQD03xC2Hlk8m+)T4&RfaNlcf(~ObY%s*8DDz%nZpR9swIfGErIA` z)YO+DEI`SUjO(cHV02oovK``srbJFz2v{(K9)f9p_9l|2A{9)jRxNRS-K?b#d95XY$T|!=q847!n+dGe=+G5S!Q?EV z{4N5aN+CghI}!RHKIGafabB|0_&Lhxf>qV3Z$bfVSzQ_i4B9~8$}jMDJR9kA7M(O?HA`!jBO%QM4uptVQ;Hct}yG!kP0D(tPxrcoS6OX+VR~d5Fo}+>k;7RoE>KmEmVRRxFSQX$D~GpHZw)@)8+#qOVr&Wl%jGEx5GlzGu5 zt9orQ_i_P&efl{NCO>`Kok`OB8GK-cEnJDVp=_bFzWn?UB{D!S*s;yP|rD+R;SM- zD1%IdPHeXWvuPGu9eNuU&np9bgwL)R^HGGv6Fyy5LF~zGR*Rmb5cgP^70=nLSm^SC z*HR^>$n|=F^kJjkFEMDSyMnp+KOuRVkV2P3eBX{pvA0sw_BG!tqmR4r*UeIY%y+qD zc$l9f1=dWl#5@(b2%MI+@TD7pwdwDaW#Jb@EGquLZnVZ%*isTuFYG+&%E;Za?un(Ed|(-H$he@WNb2*SjY?BBJGiUd zvmry#skv&=V)AOj0a5mP41obSV{6;T>vpGD9(hX7S+Y{=H~7rLT_kZDI89d0)?9=t z>z2?R&33~S^G+(l~xI~{ch>?Uu4c{geS*ZO_Q_0rjB zj&ofl?{t9 z!Aj2p0%K4)LEyJ6L8|UZ9p=>(_dRduKY3hFnUhch(iFdwI_ey?nYElt@ih)f$+G!F zl;`sZ91+UvJZwP;#8Zu((%j{Jh3~q^pQ&k1hx`H8%E3+__{+HxVy&R7X?$-o@@m_&Jx8-I_B zC=}Z<{!W35=?5SdNQFIJQQjfR`qZq9CJ#Zg^h8Z{5`orfl^T2r^)S&{d*5-Z)wkP$ zxSIfgQb_gE4qZFynVjO5=uOlQu++SV_Za$(TU@_kWNr+5OJmQzyb(-|ox z_qfC;HDvXB^@@mGBWD^Orii}K%2jw3E10HXUzh%bL0DY?b8S_-fCoZ4^iL`SRK6E zYSN1TAEj6^XXq(deq^hG##M6YDFtPefA({IG?7S2(kVmwAqoRTN}=YVD*x{uf1c!i z%ZpIAqF8*C0Bf`SnJu+Tv#?3n|;7l7;IrSJ+!1g$Y>Uvy39NC=c?peW>SEQzC5*fg*em^~4Jr zuly5*dp6}zd%4IHc8zMlFL=#99+*)IwQJ{PD$C~)utZ+heR^F7E%RSSXvLmG@-UUE zy=QF92^Mdzz!F`eYFYf;~-tQ`QCKHJgU9?&%jdnCRJYG7hMTz1}N;%od zNaPjtMeis|wQ<9DY@@!*Qwska-**auSXD$Gt1W~E^86lHB}r4P4Tm z5Y2$whX56=TI{UJI$2v#Sefk=0?b!soJDhg4w*%X<0zG(1Wf9%`>TYcEcy*5Gt-h; zF)dfKMhsc-s}_@MLXsfSQj|X+G||Mocu)Ckr_6O0YVlcvvX7M8B-dX}H&+p8qBN-W zDfeo|syTa{ZG(NP( zOW7M%Q4pWx2IZ&U%Dt_0*Ew5}P>kpKvsb9+YfwYm836xAL)c}wj(m&8WUnFo2zHQ` zpIV3u)VHyF2@*U9Ujx|4oA5p2hx)mYPtY16g+8xR(@g{UIM7J7;kWqvGj{!LTBK`{ z#Z%bvf=L-El~@2(!ugScCpxf#ZQ?wCrtkF>A&|@Xhyt{UFxjWpBzZJzb@H3E0ve0H z!oznDq1PTMIEFj)VETCY?;#Mdq#Zid@xMYC+#xmQQ3HTKC4Ob7W z1eWFdy=ve+sbX=LGBASx9j+xP&l&7AAHA^fB_34TWuTzPsK>+$dVL3>r$wy9!*&24 zAds@WPI*wH)pLA?*n=!s68wOLzZnEVj@dVr!RMENcdr*kL@t6) z%Gt|T4)s%mTtj!z9TMB`Bl9xk$_R4mNs+Qy^^?5EBW|W+0X&=BX|a~`peK=GASEU} z!Fz7gWqz6>z)5SMn70@8T=A<0*hwp8jbR53_7MVo)t3#DZgKTtjLM@JB}(H2S)4o* z7o=RoCG%2ZWM&b~2X!c6dw~0Nmr7te#gcU)bnqd?1IQX)!MPZeTRKi7BSvPQwYY#C z&cMG>wq8fJI}J;*hTWVDn#lA=%4$axVn1Si|CaXETrMWqQKB+k_Db+et}sD#!T zSv;L+>Xv6k@iWBm6#0;_7Z#SIs|^nlg=%a*-$qKax%cOOGQ4XS=$N;ud+ zIwjVd{EEw#1Eyge$kgl_S)_xV8m*<0Z3A{NeIiq-g+raRX4RCk=LEf;jJepWuer{S zepJ85>TATllFJdwrYw0ZmpXVNky$jnf;X9oqp;fK+2swX^?9Mi>Vb?$J}P-SAgF>j z*w2s9GTm-ve1X~8qW4!)TM7T|yj^4np{2Kg9W>H+2>sBNCRS^ViI4ME(-oV^3j`|e zCz1OjxA*rfHLWl~aSip&4z<@1o>sG~X}Jx7HwF>dlE7H_3X;3hoR_c5l7J!~X_i#g z<{d<613tuSK4GkUy+J}y^j5NhImsEAtMSO&tnI_-^2C!I!bhAQQt3+=8cIR>oOI}b1ONv5&~AN z^0n7>%SH*%B#%5+AYLML`1uxg4L^xTf}8FK%fa%`Oy zglDgzIGvc~_mquC2y+z|_ptU^uH|Ja0TE_sYL42Q`>1R_rtB6dvvVdB>c!V|oL31U zi9C)Y-0zdzvr-g-H46DM35PBlc>}eC9Efl(dGpFtPOsV8y+k0>jSZHrqr|6hFQSQC zij8^RKJ4SMR7Vxf^gmfUPwIry0ltVGkjQ=nMqdqu7`F`&9$rZ;m3De8+k1q+|2%S` zYAslvee^&^ETOq+iNI9~#sZo{MV-%Xf`_DxfD(-3)eioi=%thiF7lo?=vCcDazlv@ z&qvtlAwO-OU*S(lv6!7o2?@6z?vsSCx`+IQdlcuW^pyy` zjotGcT2biYpwMs+!E@W9L#qx>H6nFd>1&*_`40bmjr%ayU@ZqtmX9OMB1mIHR?kVl zl{N*o>aewp%aCe*J7*q~&Xjl|RLOeGXV+ZLQnUu+l$i_IX@=|P?}*m^76P9|$rXU$ zx7QK4?e|jy_L}yV3z;Mc>RMW`+I|TES1-a)5q`WhD^#)AO!)w{BMTv=Nh!sYI97as zAJbjmXBqgCDS~M#vmX)o{E{@e>dm7FTHT&QLW@XQ!en`ks1j39e!Vrg; zn*0F0A#v+3B8+oN!!O8#yI>jNQL{*LBL}&r-cwMEsy?!)#}G(VHmt_pjF#QwUC)7( zUn7ju*sv#jo*ugO^HE9E$9w1O?*$8Q{z@Yy_T{??2U-}Abqg;v8m=Ryd?;&uo*~px zKKC>3*Af+z#&kX4UW!jaO8+u;_%MgeE9Ln+_8GJKpfkqD1Jw6 zCeK93#HoZVs^YfKXgSXyP;l2QgR6RRHv-4K$K*ahVhmw0qdN1lwwUV)hj%}%jL?wk zN>iEZm|2IHQH-rk_t}0$zPAqkJ%$il3Cc(1!}k!7fKtZdYv@NHZ|Ssbc+n~yPLe4l ztl=zA5zvOE1`1#q0f8r%d!~i#dy)cJ;l4kkF?zt~NW;w75nf}Q_`~u@xM3JsEYG~O16`(cxOUs5+-OXmN-&p zTIEPpC1l7p5xICj2jSrR737JFvWw*aHx!+c8sqH4|O| zSp*VtfQp2up9l4#Z;$xkO{De<}5Eff*Qyl1pE#AG`vtLc!5Nmw)H zH!Yu1ONog)tUNVvJZP@dU@ijDR{Nk}mb4Rby2(tzCALxMR@?j@Be zNA0;_hq)*EeUaZD=bFse`mb4qM7<^dpd5G8yZt@F_;1e-3{&>CXZHd8I~B+vKl>R1 zE3`hlnlu?mt*75`BM$E z4;o!Z{d8MbASbw%J$4NZHA!ovfyLOu?RRjK1?}xKgMfL zXvxwz9ZHchQQ~x|3GO1!6F9j_2Li-9lTxnrhj|49$#MU(PoJoc?4W&MR2 z*hl%()Fy>qQV4E@dQ4VxsPA-)q4B@aT6bHbeb~-Zo8bTim0pj+M(y2s%Vo&3&*W2H zew8<0L}+PEYX6k$J3*Iu$Pyh_m>baHI7$n*-x4(W=)NBJ{mgpw2E&TWJRoCqV{RCx zpxs_duJ;VTH_R$In#|ic3#LWo>dzuz(WW>$40gA?R#D%QDaG-GYva6nir2QR zWU0_f*yl=H`z>!UbFV zwgv|mmLusjC0UG;igB_J(b_4AEQQ@=N=40J8ZO&x!jA8;%W5VC1EW@4#r{_*m%XN3 z4BCKHru-gK3Fy%EAxvKGvKqf=@wZS< zIp^<#$iQVHg7_n`xalt?|!=?ms7KaL_UrBHq zOMIR?Jeb>-(Jdpe6>piPQ3v8(x@!Uuz2yHrX^_2^(ww32jhf(!kkv^>dZPneiJs4U z?>EeHWKhp1SZk2D>y89A4Fu!kv)`t2{)WnDl}db{RhHspqL(q9U`4}Na#sEL*uuBT z2A+V=$xwsUX)49Zs0!nRx-j{kM&JtA&jj7Jc@4d&@7-Td0VZ`Kki-sHn7(S|=mi>x zw|MT3Fqd_P?{LJz+PcZqdHlLBrvy`Ju9pHlj?np*wHPu-p?-pZ_s>L$DFGw)TV}f7 z;yKZj>A)`2>v)MU&iXQ+qhj%6hsCtdEE6jpxJO(pWm^YP--VX3EUXXrtVNrmcy9uM z+8mZwxR1~kwrWaLUe6-)2_2R^t29BOX*8CSt1#?FhY3&G*mNHqUb7_T2*bA_zQ2G} zX(c^nz=zBYuQX6z@=6397Nyz<1zV`b4nqKLq~r-QRyDfEidGj(WCyu#lGnu)V2}1l zTm~9s^FHOpiAlYJvWEIWuT?wHF~yfdlU?DIP~WX7N_;Ug4H{-gZN;kI-R6Psw|vqe zQ(`#_6V+;8{j~}}edy0fzn zd7yf&9MhfPqOBRg$mzgeU50(gr1Sw~kz(;CV?>5h`C&~qA z&t`ZA_8V}j5_!|xRy|om{d@^kZ5Ax{pF^0c^dS{{j`zCH`)!){c!yO3@H3i{q&$N- zD!$^oZN3Q)K>32_j8zqXC<)>71{EJoGP!gE0Tx=}=KjcQ4qFMyn^{Dg^^Lj2+Jr~g z>Gj^=0`x~nz@i;6fogm_)iRT8t9&0pX$4ZsP$h#vK-Vga4orVIeSO`$DaAhsQ zjrM_@nyENqC8qTzUO)l$^zI!I8gGNoxfC5nk)S;0{WcMpXoX_S^VuFE@HnK!!V+fX zP^KxkNu8x)l)7%9Gxeg>Yz;*Ub1PB+@C{mjT2Dp1_Yp5K~j~35gx zSX)FQI%Y9e#VniZ-98nl79Bp#k^d2)nPQvou@9jU=tUI&uTZIV@Lh(@3NKsiDSE0q z33YU3^Y3vJGZr^yn}lMon0Re7fsqmw$%dZsZX}>OgkK|Y1wOR(T16Pj@-rHb$nsHJ z-*7MPBYmo^5}-fYbDT1~N7)jjUvb@B`N;da$=~aYlDwd|xy&%5h%g4O(m;X9JG+9w z=KKP?sp0j^U-7yngc%La>U$4?Hh-Ge-?H#;4x!U?o9iv5D?0Qk{?0Ga^ZQH&QJASE z-;>&Nh90Z|Z(y=W0uZI$EKxr4095YSNI-?fcy0->vz!(!?ysg;LH}ING^7tdZPeV7 zNyu2&tW=dVSFV(huu%@8%fc3U0D6v1L*CUAz#>NxMwKs6xUM$<-gw{qm~Fi3#lj*8 zqWc89n~`D?6pdy-!-VQ6m4dh8qCp5CCS=9#^GF|St>+)62YC$j6yYy1ybx)JuZsV(zgp4QzxDlJhuW*rUSt|1 z0pIjNeiO3OjLE2#=kBl=y35L{b7)NNk%?;ms_-;pH1d+8y82XgXvVIUiM*Jk@_Gj8 zypFH+m2Y6d;tgoECqHj>`@F^AHA~2>HmJd78d#+29)&3BJz5c9b@rX1>m^2`glqWAOA*0aM#LYX_i~a-9fsZ$ysq*GH>lJb?f)t4a0nbmm_oJCKmo{WP)F%I2#r%? z2&L}rgxJ3a0q%Ytfym=I6Ml~<&mU4ApJNBemXsIrVYKa5QcPU0m=a7AbWbshC~NTw zVWQ0al!a)g>vNe4uPHJWvo<*%d`;hMfjlFtOlKUH=;848tgF7`>dPir1jA? z9w5-B%R21i^=4=xwh-E@Kfw;uPz^gxQktK*jnL3_k?$(FvaYX|*He7QO)F)I!(jqD zfE`d^pYZv0|1(@8VK&5Tkg>$)TL?`|Fs1ACWea?^Ml|gj4fhW3+lw&DYZ;Au0c4F2 z^H3hQ!{5z>4w#L1Eh0wivlJ9mMp##v*p!Vm_2t#dZ+~*1IbuZs%glFIdcJp-# z>u`~K-9rWPCFQZ4rT{v)d4I+ZTv8On?g6}Fspanot+*AlUITQu{(?YC5GMoGsdf_q zm?9+DS$_7oxiA9Ws1B@N=gkx^L^I{SVCH(iC6h|LcE;SQYQpBLvr45*@#THY#eKj< zoiYLLrJMN&{>}{m|C~c@xI^ze8~U1$^+NOJ^g~h{ED)(L?IRO@>2@#*XAMU z+5gJ>Pb1785U1Y&um2bRPMf)}Ucsqx{j$7o61q?d+++VO8m{m7J=-M25|p_MyN7u; z3bkZp{*wmo11gaoDsXvN#pn!2T;z4SQBQ~5Z@G!2xWA7|LqkDCWHLnMc9fe`M18xn2A5pore%0|rcjS1Kh3py zM1fSDTATbn0v+{3v*H8%>^rn`@|Dzc%p%2MHLS7{8ONcuq4ZFC`!w8(09Z?wTxtC1~HPq7Gi~7#SRRk=| zx}CosdON?TAvizbvJO%Wj1mzs8$OU?j*BsBenU1B~+!RrvEOe1VVX zVkRYce4=WP)vyKeRa@yCtw*C;va-HIQ5nf;#hxaF5K@8{5jfS3APneKXaNLjrCg*u zdh8vfIAHO-PYmiuJxPaqAN{=d2`Ygl1QLl+%W0I&`nB18<*thyL|hn|{c_9G0~P$)T% z-5@UC|6#7xG2XL=Kr1$d<}($X*1eFD3~%HGXrAQ^LnwKPgEX#F^di^H!;yC_1mzR1 zp|~MEjGdx~_Xwfgx|8qwDbLzL{=Wck?NkU()3*v>GjA{4VF|bwbYmWHQ{Sa~yDxIB zoZ{J=OoWVkjsU0iI4K?!8E5SU$Gm~S#;Vx)Rf7axHA5K(b= zn+4EpgC~sRCQT6~)tX%(oa`Z9Cq1)DMN8bMQEKy>{9X4*RLYt+OQJPZyhB-a4#w3zRBBOJ5jV}{D$GYdP^Q*jf(WIhtgY!rK~*}*BAweCvL zj^2_fe!Fw#`eYJ*uZCp6&NdI*R}@NhV68XE{>qYwe_u251cXtCl!keu2+ndQmiCI6!L`bau1*NEZ^ZRZe)%de;@TjHk?vQjYt;|#*;52 zbT%RZpCLH+b#pl{Sy@VhCLYs`{tAInNtS7ezoV|tcM-;pA4lko*s_CBwdWV7q-Ok` z|ueiVQa1&+H|A?Ko;t|xN5a-d_uv?(M9k`Z)Woh<#_4vz8??LEAcw|Xs zHS;_)&$nWEjt2+~QCnuj^!^>@p`Ea>M@jj9`(4TNlyW#;1t^#z*iWr7!3Pw>OtyjR zqk)Yp)JTUB@c07=nB*jKk(l6Mk=Fkz0w%i|4nWrB6)lAZCk~kVdDP-4C-xKu{}&UQ z3lyRvt^XA&fJG!D$=nKR9rKoyDquI6gDbpg9_$MU^WHwR4SV&9Edmu;60d+$pm_+mk$`(>f zY=x#!wcGvj2#CsRw9Z@H+kD>Kwl2#W4k56@%B}21Xi|t#O>)`qAy9I6BQVtFTUc}l z8!aNVJhn2VQi~vK(`GU6C_;~aCx!Dwq|l^=Zy<~hAF}Xe(X!4-^ZuMcCTsEQD1Sa~ zTHJpZkp;fb=T_|d9@lx00zPYXVXtC{s8nphG3)UmuH%4VBE*AGi*O)=*v&rU^<@#e zteWy%qJ_R|A>uKvyN5j9l^LVz@|Mi}nDKHa!kF<}l)b9uHe88rSculfJsvRpLSYXF zIHrB`cW4EOB~FA9^L$o$KCUu^Y-P+?tx3q@{F#rr<}x-#8bgO}>-VP=#^w{;dQWWm zzgPLe9}{9QZ=uwoIbaH<+l1JyW7^`cqrPRf6;0d6c=eCG_nIa9Dk<^0f0YmjO7_{k zP5IUz+&ztySAbc>Sl?X&qJ@a@BGo(*Tw|3D{MGsPjYxpi zb6n(~2hA-JB-5#?auH4-6S>IS*csjti>uO^g`e&*pHKwz2`>B`SAGKWZcEg-a^c3?N} zV%|cv7YJN`J^=Ls_vtV{Gi|`F!-hsvef%H1R?d{Y4|!3CsI1^7b`K|Y9LZUP*^=t4 z)7;5pJpAGe{3q&Ls#P^o+pT~}gNAbKLF>&xt^hisumVj$L_)(Jw#tYo;vT19P+s>- zp~B6m0w(lj**r_<4=4ku4>nFS=nVV#)arIo^ZDKtkB8YJ>a=5?>W zM#9A{=o|%mziEBXQOwYCeUHFKl$OEOdk!GbK5GinDi34E>g zIgNBQsSoO?MP`W>?>A3KWedjIdTDY|5bC_S5Z&d)k@5!!}CuH#c1??%2E8p zKhwYITRa4p?7({4vGC`k1|(B{NlNk= z6=l5kRg*c<$vX;9%)reou03kV~H<5&wEUxelVyk z!z2&qGXxxZ=`|MM@BDnPc^OK2sT{P?Wb@}4Q>~dM&GFyU7Kc}&1NgI9#v=x-a-hot z!y+VoZS%ly^7jSIQukNd=TxTqUwpotl{^dP{=VY>dl;d_>kqtl)fAm73s-raMLyHd z=8Y&hJY}WBeB|~Ez;Y+y{S}v9w@N~{eRmk9po9DT5XrP;G6qxp7C7xNpZmFmB#jh^ zh&Q`=h+ef2w`VOQpGO#`dynt-vc;U%>wHOxi|P6n-}f2Pry&0eVfBidU$oIbTgLU* zd^uIocl`4OA9Bq!>Ka0WP8Xl&Iri3iEBEj@H_qL)Dt6BvXmp(ohCi>Yl#(?p!cv0p zl`L#{hJcLAnMbtPLRCZI%yR@Re=GgpZbhG(QY=TnmLxAu_k4x`ANGzyfy2I}FlWuG zRZQ^OC^zmkX}HNFDzv9arkWQs^AbX5W4k4c+Y!)>GFVC8kPO;GDx7xaWeN!Byv-I4 zl1h)N**`@3ECE+Mk7>wWn#XvT3Sa@hEf+?`Fa^&|W>dqCjJavUbm4Lo{JA%fsr05E zp}~~lj}MU8YqHqgPW!rF8SJJ;YBj8gshfSHt1Vc9Y(o7u1|7BX6%$0%T72%Lc(oeU zk@x!LXvd^DxsTT0=KxCiEm6U@QjgD|@kHKQ6NRX%!Vy*!4p9-j^ef67IF%f)Y&KeG}M$W)2~+tlmX^{{Wf@zbXlv*xPt% z^_U-IZCMsTWukki@07x?P)3>_w9n%8IRpwRSSd+BrB1qNkC4uHRx zCkGV-`y$JEqG*>Te!*D&2fDSz2EsVRxVgs;o+zeg65@Cfu_zI!ih>ltrmf9liULwH z@dN^YfE4!v!YqaP7IITr?B=N4D;?T@)t87w&T;RKTMnygd4yjW;=M#YyjO!?1`zN( zPKhsttpO#1j<4l^gO`!ue!^_1veG~B0Isy407QUsj)FML*m1r^MIboy=loU-C`u?W z9$mFEUABRcIIFDUEcHf+3*dKD1XDa@H!bPYNq6*P>;Qzi_#7Jz+)6c&e8kT!aQ&XA zSTKz<`v5y2m`ezJ{?hzQw1{%Y%PF2pH`o3PuH!QA+06s|C37}fKM_%!!A{No3_=&5 ztmh_`&d&(^{T^bbO0A0s;IXpBw*Ry;ZX;$YwS7z2E4HplN+4Dih?ITpR~p6G zh*VAKjd0)o#P=VyiibRav)I8Fd`&~}j4~)$f1d_dVT&63Hq85y7bSZBJHLej5W&L< zKJXB4`pjIqMxPbE^*actz8QKC4-tlBrX^%ldVGtA@?8ppl6#sHuXf5T7j2w>_f9(p z$(-ULUSlR(Ny<(tn73K(RLiZBsayQ{W$biRp0$KmcY|!S-s2#>3ynuhg0!jxb)NV5 zfC?0*EHoZn5aqOfdNtM@=h_{$GFYC~j5&m{YT)`^qQZC|0d^fXi!Jkg+7Vc4eB$jW zKmRcTd5JfXiECjVVH{W765Pf0)|jjrgdr#G2qoc-NGWt$!q=0f8Y)t<+*BhnQ3us! zqP&bsn#zk5QQyb^0pGD;>!vf&jlhtl!~7C~&FNF_LBEA=HB<6FeoXTr%D;sIP)SOO zL}kaPnj~Iic@9(ie@tN*p=LWz;rkvt_4dgGH&Ai^K3?M#0v(jvL0=%Wg-ThyM~|hQ zmir2yw`f-B3vQG~Hu;1ZSya`W+w8!u)0%!rrPxkyX1akZ?=fh5WW^hKT^IQ+QVmT4 z+BTPR+42a@hI@+Rz^5}UAs`Lq0lkeKHlL3W2uqS;QE@(2%&Snf$(ekF-pfVd!3cKX z$l^-yL#)F;!M*&H*LjQ`+(V6@Ut=QhK0@zAH$n&EkmYj3Bcb6aa|l##)s(Pv9~Dqv z6qCz~RGIxYuQf(R`!)iG0;q4ZR&Hg4vbe}+*+{77Y@?p1BX2n>fth-^?!CW-0uUY(jB{C~g>9{dzS9bMXQlne8Sn%$92>VDGUKhMwC_&irB43k`ZZGImW z%!d@13Et-}7kH2x^brCNf<~7KVJHAnjTU~8zki5AB)&e)cKdS6u`R7pu_Us5~|kJf|T9YP5Z(z%sTU zIU1oZuJag`+PLkThbq2)uIN=#pQb_inzGeyF~3IMw?}_3Qf8-r3kBfW<`uq}Aew1b zN80^ey6qPb_|s&0istHeM;TggBfU&*dJ>@pRWZJ5vNH(1?2dv|=rBePq=Z1}HH>;T z93d6A5atxVqCm@)8??|##jhuMnCB2?t0#5%$@+^#QRAs31dBXmVy;&G@ z1p26qfgM%}l_j4a1%Q=&o96iQkHu%*FmG!5B`lET7Fh_UPFae)WKPV|NIA6?-r5kw znUk!_VF+iBc{N>luT3a`Rm|%+EUF#|8Qr4}@tr%wbk2z4F3PE%5#`-&N$$s3)m`ZJ zRLv>sD{?9hBWCo6VDpnPnQ7o9tf9K2Q$ z^4|O^Te71L{m^WR!Xt*iBpXrxuK95FbH~m3D+bM*(a@?O2H+7~Q*DmgfaP`>pHUvj zVVtz*%)3N&rdUsGa>~xV1M^T7k6)rW(~aA-Omz~?g(G@QbHNN(^LKi4DLS6OMM#LT&i%`;;T#|%L&D-xL7 z#`xE;NF?{*3B;xr^_2PSvEB9Oe8&!Jzrzvdty^4(Vu~9@WkLMGxJ08(HfTMF47YOS zw6*$b@cWp;$^<4X({VLRHVLUl#t^bfjRYI5A&P{Q-7A6o^vPV+L^)+dsVxMS59jU< z=C4yuf0Apmv^{LI7QR0%!FfwIx>XCHEZKxZDOiP^C{xXXCD~S)B9&*U(owkN-ar4IdViDANv$gZ>LPn zP4fR5*{=k#F@>#H#ER(>P{X{>I%BeTvj_vh}<;!;@=vs)RGDAOp5f;~q?WP6m6rVRX zHo|55#m$?8X+L1zo1rsMUU|sKyRht*gDgxV^1Sd+*y~p_5D}HOS|oW{M^d?y*|#57 zQHLB@MQh!#^nY9d#3IspaRa(6&L*@hz>b6Fz2@k5G2rwlIAz#c>0M+14olE(2vPk$ z0jvx{0KS61UdF_pz)9O9fysOjksUz}`o4KzgwTp%nx$;J`?8O~pCoJ2y0uqSq%|6i z6bot???BMd3KSm$O{}KtGjBMtUnn?PjINlsVLM>)rn8D8xQkfGQp6Nz+4Nj+ALWf8 z5UVJG+^@~cZ-0liEQp1`E>9<6P5vaYjAoWkHIm7A6;NU&v6+`x4PBU3%oCA(rv%GU zk(j`??W1V!mr?))G3hg69>?4Oma#s-3zN=UYsz&(elYI~M{DC0^6sbcfAYvpVbV5a z342&3Or8RO9s~ zIDj5;mxvbYlZ;FuNYQ0pkr0!J<#RmuHFFB`u(R{J?LdhCWxFf#YFLwhK{*cC?vB6= zYA%`g7G&^{skw^0-+*}+olzVPHHpq=+A!xyQnMuiP-wL7RCu7^XzHP;?~@1v%vH zAP3Crna5thf-nunzJ;_TXvP-;A5RNt#)4dSPF#mNHfmR!n^5BsX$pXINPy0eCBZVv z*SBcRDY0Hwh`%;3IGUEVtBEW;hpGN`N+yNGDbFIotx%>y7m8V!t9aLStm`A(a})g|^T0(Xd3Vl1g~yhgRmmL9{K;96-70~>RHCSklwkTB1p7|gZh8XW z!T)E?(TH{PW|#|-;%s&TDH@ODqF15V>P?jH5BUE>T$hn}#D)ay?z}=FHVN7>3vpM1 zaMi$yDO>wx-DZ2YQmBYmMd|afcq(IQr!1H(&cuq4m!R^B_scTYjzx2?N#L(T6k8SR#m2qK0^}GUJ{?L9=V?LFobvR5do`; z|Gd^B_VB9WK$&2TIs+eeFU&w;8SSr8)1OI6=e?>gB?LJL1 z>)0i8Y2~1qz`xxKBZ}T97c5+Dk4l8_OV*YX3HHKvS3-r0!}8KM%oIy z7JHW-32tr3W{%zS%$#7NzgVo5~+aBeeH5=pRoDwMoevg@#Tea|EFvh15VvdogymYxch6az9}^SO%t1 zxef%kC(V1W_rqU%76~MU_3u@&gmNjT z0#kUWY=;2lZJY$1mPE$o%z-cCc>V)>_56mf^5h?Y()<((;Fu`kuMrroMCOD2?*C+7 zhE4bGjCmnbEGQbQ9#oiZ+By&6-ftraJ&&x^4gCEa}fx1qGM2-01` zI9c#RPJxXe)yL}7Px0AJynoKTHiCpNu`z5!6ac#svt{@bd{$#=KP!MPZ2rICv>XjA zfHiF75>CEWrYu=b{)+oP5VLu!4XsV#VN*|{*gDOD9M@VzvKbh=i~IDN=fnB$W~n%B zR{048cp3tGH&Y=8heM zSYelsxGDYuQg z4&vY;DT?wC`~mV=hkTJp2biBzwnMrSjv?D(AJKA* z7BS^z0#4!OFPOI!*8Dc9wC*)Ibyz+*Z99OOcg*veQ(_ivwy+}T^N_k}K!RgzG}??_ zEGrhwGNSI2=D-*&J5945dZ5Jqf=QpmxMpB_Ed~DJ0HU|YvA8#3Egi@8L$IK}fBRB<- zCm}mbOHN{58<1TRv1--b0i50+V7)pZpHukk39R8!tigrU-6z;P16bSRa9`@! zSBH=VyJcQZt&MS>LZ%q`AI6@%VBQ}wHinfHHXBOk&QbAE(YQDClJ zmw9<^`F}tWu)v1w#}nd)HEXx6+y=}P6eOibz*8|Wqv6|lXm+r!KpJ6YgjUg?N z8msz@wg!uRv6*3BQa8;~AL_^c#dZ)(hcGdDOwz|VQLmZ9Lf4uIBGYje1W~m8Qb!~m z$Efph_>bqr3?y)9-5fR7XptgicbDhb_+Oaw$%TxzM{rt{%{$kSgp&%iBgnAiF}|)A zn_sc;OKrMRf*krbv8 zxDC^IP65{~LAf3l*OUc5cSH#gd%{|f1LkC#)8^E2ckn)!%#n;+80QU)7a zdLEwvvkBS!)ZAU>v`34Q)@jyjT~lDS;6+JlQD|}xYW5y+7x*4mt$C{^3gIm|86F~# z`6MNJ%>W+>G`Q(=7Ox*S+YN6GPlinJKFSo+>I5hK*BiFe81txktM4%T(XL5vd$@-2 z3ieSfLMabOnl_g*CqzLm1@gx9*lG|1X~^1c!`h@Epp@TvOEL#Plc4V; z#&=K-sG7K?Z{z=WgY_m6tI2%p`d3rN5Jvvlo%kJC;=?O{TwOht1{epjFgw_0Qp!cMtaxpps&N9)#pl)Yd{0M$YGZ{$L#i-iypWITmm_r#n6 z{X_G1*lIDfi^wGR{ta_j_G4_owKkO*Q=x47F^D<+JFKgfHZce+(z#+zuCmc&{aEq# zBLucvHuIB+`^EtDSxNbF4)o;A1#6|{>dFi}6ewB#{iGnlm}avLnsLZ~(3ZQ>V*N*5oMs6m!&%Sk_!Va^h_S5q9k;+fHxv z0SKJ7WTF{9YTh2KRUI==j&elXx5KNaz0iK?FJj%9T4WZX%be4})B z7lL4*M#tMZ!FgZ$;Dj(QwUIs0T8=~JOv#h5O3D(5Y`23nJJPJTNJpwQxn(=VEjiiH zghA7Nqu+bRoD-tUoCu^Yn2&}87#~Owx(l241Dw($B17uJ5v_SVlA1ncJGA6)L20tW zw1Q1LA@e$5Ng8mHp^lkzVRQy*=4NA18DvA=lBA5c5P)SSfju%8@-KPf#Wn!pvaew> zr)A(1l9GEI1Toq%A%BZVw;14pK}%%;Vzt*#u&`c4=9uQ^76jvn#i^lL)YEP?oho%* z-&Ts8rY4C^*s+FzF#@q3+ujH%+QlK%B8O2Uav*66deD+A%p?dQ`%wdPf6JVcfUHA@ zp*%h@CzO35Db#|jN0;R4x$f-y_&)9cWI&t0Re}P$fz$k05XkM6dz8$(Sw{tH6aWAq z07*naR1u3n;*xg8kZIzIGB7`2PHMwuw%ulyc~#}WG(UcaTr7F#dqqQ^gpl8m$ZN%Z z+i14EDgg4~ZNP*j=;;|Y|Mx8dkBuM#9J1ClUShuXs?>>T_yjQ=o>U~H=!oRKe<>V6 zy-lT3!e+T^UNCeQV}B1DZWC+p54aFygCYp%GnmJDn9X+~!^b46m4T9`>8)LbKE|Qf z5Lasxhu&Zi$Q;BT8IY{S%Z@=6BRd$8L}UujFpQH7Lv+I%uSx-Es&CS~EfO_%ucSr# zEuCBa|IZ2_BPrEqwgWi%!MrHwg#@VDol`yeR6+cbN|VskaS38tkaDFZ@>{UXw2?^- zC*7*VvKTa8#K})9tR%s?*RfH%p%}gv*W)~t$a%={QygM1@O;+19Kl%Fzw(NCk4Cd3 zF-lHc#QlyznT;1<7%@|7l6>95M1c*q_rKYe(S#O(j`ZfM9Q2>rNgy+ng_p;1OVD$&vVMbc8pfgZd$=2AT&@5rl56ttYN@U5P9ElBz{}(9$p8Djv zdt%Q2Uw(-V$Z}9(-dWW0+#JhZ{{mRH4+ zH4h9#XM(tl1*hf}QR0_ziZaVUU>q&kYgk_fV&`lJ9{xmp|3~KJE34RWil`-Mh#jK# zGltL-BHPndC;$c=x1j)LAV-^K*2n}=U-qltFz++h?qVs6Z8q{djm%f~Ai#S?p#2(O zgrbszaLaa6Hn%JI48pOng2yWQ?4T!g3`A*oGzh8IqWUrSa;@5k1&rNwz4B<*-UIBkq%S`3cAH z!aRkTm8=rmmMt}LCzX}E%N#VMf##pVY>Y|{OVpR#X-~|FEcXH%<)&w@mBLiOy`EXT zDP?T&yUlaD?IO@Z>ZX^?YM8}q%A3_gXdm_-37`=Xx6!5m=S8Ua><;r9jcwb_SDzM_ z$g~+$%Sf=64K`OG2c)1X1q!^`JP-{ziY(A1WMCF2ShFk;;k&~)#d^iceBMHSD0eJ= zq7r5dBgBCy#G0fa>}o|wGHJOh7AIVZaSmv6(NXLJn)9Ir9KyV*JlMy9G-^c&oYz{& zPQL^U>*5NqMEU0+pb`>%h=kG+GRkF7m6AZkO>Y)>GNL`Ihxm`m5KIW2X;ywSxp z?o0IFLX&Z5O+Mj{)X249bH_F!Q#9me=j2flF}Gf{cnK!`w4>NWgo6^kd=m<=+3Cmh z4K0cg5=u=zXK`NmoTQ1k=zN!EmK__Pylp$6pK)_w*KMrb6A18Tlg;00j%GWFHDpP! z!L=zi$pR4ud<;RabGVi~3}2a}39AvgAs^#G^C~+tClw(n#)c>{x&|G1?jJFJ1`t_B z{4BW6B8P%@f||fs2+k?O9SBRp8=_bkP-h#nDg5q?V#npwcT{cDtIR`Y2D`i^5!87hJ~S-wPwjaZmcLHWb!_Qom5>7jN`7wYw@W} ze~&a8i%AHz{uzPQM1vCt@RrOWH!@EL275w5D#+$JX-+6grrgIE$DGBh37JoyfD+4? z*R}KH{u&YJSR5jYwfh)zaKgN4XWpEbt}7)AR50)I^r7v5p$?n3i$5;uNM=~-K_=>i z?G!(qgq86<=I;Vz;+mQL2R3y*GWU~^-;3rQmY!hKd~aULzMXP_bYl)q*-jzWn^=z_ z$V^H0Qkn~P)OIihB%#UT0J((N40{vA_#jyp{XTw2GTPHnjwB;lHM2GP28(z>7L1IT zm$4p(Kz@bIH)FdA8CmlCzU`0}T(D$2a6&;>Y&W%cY!km}JGBJw;=URD%$no-6^q`1 zF@6N$JBr0*)Or>hr2&E5z`I!u za4(I?h$*2DY=`~jta*>ZFi5v0fd&8XQ z<}#x8p(Uy1)+IcDNEG5R+u@`90`pXkq)%Cf{=Qfu%%U`lf3S*_U9LXCI}q(RY0etN z19>TO5cXovPMc!``tiF_yx-5AqErEVD-lU{q#eeE+TOd0lTrOQRyzG2t^|o6O6HY- zw=wZIEM5fCiD$iUJDBCSAbbo$9mL=0A6+r$)+dnSe_^5fE!k!DHFMY}`Q!@X+cMZg zq}vJeT7rfwzCnn4Ee?R8={{^u>S>bq9kg^BC!S!_Pynx+bNj2{RD&Q;1J5Pt%AcV? zM}z0E$t1fHZQ&Fw2ic5yYz{W}U|+@@lHwVf5 zj8-#;Q+HugP6lfnx?xo4Ls+{(@ule^cGzxGS;>p$TT zByfkY;O}sNgccw-?rV_!k72!>CB&rtxLVgl=;m8)XC%r=Q%gk`~INhX`s6c>uhW6T^7GAvPZ zauE=~vTR<_Md5hMcF0)XF$cgb;F%rfY`4>xCz_HJVz$pdi|3DvvZ7y0H}4?UT5Iwd zsUEi^4+3R_kXWAR#HyDA^O?O3^O4}ILR`aAX_dhav8D*N=@d)s1P-z7KmoGb@m0v* zG=6IRep*jKW!BOnE~bdTfMU5Dai6HbNep_zl5N1*P$dtAbP9XnZXk)5IWcHzWh5e>6*ICXX&61hLQ7~Gi!zA?C62sVTdfK<-3-h(4Z>*#BrT123d(O% ztOv#`uA3vcm|xy9uMqnP*N)&B*PwKt$mzoBOznB!kkj%F2;duX`qafjB4+(KOnIfF z>Xg_8H+o&-E_5L%+|Th|s(=nl@HC$?$2mz^E2#{xXWXDm)}M1+!`xng0-dwng;gqZ zMDdZHjunbeBEi?XC~KCnvoewJQn_v5+AZ1SvHNI8Daythn9o&= z?Y71b@`3*{1v8Qtbp$}4yAa~=H69n>nK_fPnzt&r zm5A?u0e)k@C@dCloWMQjFc#LxlhE}w$s^x3v;Tvj(F@GsEhvgUN%K}j09i_U8gp0{ zw}~!5Rk8@N;MFwlF(xuYGLC$Zg^68H@{$qrl3~4`4LL&L*Xz$=F1Z$ZeWuNnHkC{_ z-v5c2{W~`HGssXmvi7SuWf!3c{~z<77Co}2F}Wd7=Z5UB3s6`qICySj-RET^#|q0> zE>CNBP_kGhox6Nse!dI8hbIvIZ4OX7+=MT{^2<(3wgD%(#d-6#TqLMa7~?WdtwXq; zd35c-&Zr=2u2tSE9=&YPxM16gOKn_VGtC2L)SqSo!C_(bNF^XP_%mex5 z$0bg{=M(S!5brt{MDGt`Bag|+L&bbdl*fu>V;DFcG^bgkze(=DEit(XNoB*#T3~_D zd?&2*fhhF6dD-$+OBOZJKOYgy#|A8+C3Aw0I+V|4xF7Vvv%&TGHm-lzGBG0e)58{=#9mUbI0(()N`g>q@n&Wn(p z#HlwW!M=)l;m(kG1=F*X0M=2_S{-ta4p9P+v3TpEMU{ADMK%qKC$ut-L8UDT_^@$F zH%`hfiA7XpLotGW*LK$^rJ|j8f ziNN<$-Xi8(6$P^pAksprDSdWBlm}_nVqJMC!v1YUvC zuKb3sPy6B;l3SwHH8o4ZlCy0-gXAqr`&N;^mqhuuQ&$p#i=wW4UQYk>5Rd_R5k82_ zFvras9H=ar{OC;3GPvltONb~vVb0lE<1?p`@{z&Fk?Vs4~%M;f*d#d z16ZKNnT2>=PTYz-pC`;Ym|u?rWTIX_E%As}*Bj<*(!3#r##hKNd`nKQZ9zG*$mJPM z4D!M)VndLG^&A3(2k~qQT{!@-P~nWpJD4EhxGuGbuxa3r{1As^tP2=_El7p^+Sj+* zNP8`LZUpX5JJ<8D%SN7C6N_^%)u17b{w_*7Qc_Q0^D2>HN8mekLP$?S7#T>&yn=fW z!F0;JemZBn2@nf{G8>h23UlDE;r^XL5Rhh2FO}VEm(E z#_#9)8iaLR6q9bQEm$lpFV^@88E(kg$Yv79B{jQ(`8)~*#j3OZz$^?K!m<#F3cOQX zflM2MM;L6k1Yb+y8vd5Aw^kdcO(pO$wHl4cGa1<4Yd?p&WKZ%E82!1-oQxsI%{kHQ zfr(L-i6G2!LL%YWS8xvkNX|h>yJaFe0$-X$2Z!O~k#20-oCQ^T2xt`=t&o%0Ow6V4 z=lT1+p1tMRbfqf3X_p8yV=EZ}t87R*?O!7B#4U`A3(|!(Si~tfD_|z28{;XnX-+Od zOG9H1AyG*s@Q<0Q)pBSCFqwI%{6?;~6l+E;ikBfi*)Lhje)tzc1(dZ2nJN_k%}>Hi z$s*bibC9iz4`cK41kLXA9!2^46#VFlpzRbN&Bg}Ig_3n;KvItd@%I!cLvYFvl+|Il zA=Q08e{G-FmjVn05qouUbxz?k?_%S#uKT(bd|X$7Lb01 zb@W9%Yh9E?2j1}+-fb&#eNo~Pd}dj)IHOoAA~|cnf$J>-N((C?e~oHXC4s5EgjEqX zs@+wEn-}m!Cj{x5?O^WdCk{dIJ`r$;_GZiM^B(j$N5uDEMl|#Rgp?TPHwD?nfFxOW z*@&Zzlayj!vkBv4aKJL~&pP$?3_48t)F?B_Hbuzk)n0G1Of`TvvvNj}T_S77w zZh|5t1ot)+z-`IFYXo~8*A5DXV?@lz!;(c{lbD(%sj;^ua5`eiK9h!f<}mi<-^lgh zreSZwPMMdNF~6&_dH1q`>k@e7_g*akwS3ERpF{>DZ@V$dHvonq!^r?XbHJQcWFY{O z?Drmd34XD`$d?Fut>N#-B@kE-&~}U!G_a^Q%V9UClOJIMe};|8Kg+Rl(bk_R;{%HPsAeWm4K>=S>0#58=RD3UO$Ag z8^M}%1}7S`B^{PTVg8!eTO{zhVorsB*V4O4rEOsLpjd=Vu2_2<4h;c+-7qgCdtvSO zb7%;zhSi&QF_ubb0W89tBw^qcIa#R1$Sr>h!hKKt$IL6Z2N#b%{cV`H>SmBUkzZs? zVU0YIh9#W7w_&Q*BzQG~4ffESwPnB0ukG`CM)|+OJrTZ~GIsAn902^_nbyHf#x)pGb5pxu!g0*Hae<28kV6e~e+(`jFnVd#zn49qQ<@Nu> z^%J6K{wJ>2xtIfpiUb1Am0! z*FrOaY$Rjy@>*%9CQ-Klf;5M|-+OeJ(@l@aDL5zjRF-N^;hvApNhN6FpMrqjG%q=3 zHeeXO-=It=DVg;7!ZJ-Woy*54B; z*ASnnQ@}I4hS-2ouzA?Um86mtiB<60lDvQDMlf*HEk1eKk_O;;cm-KMwya;5 zm`B?69P6NY>uv_7Ur3Cg*_`N{Yu>$`z6!d5*<6L}M9Xa`;bpH~~liLLa0onH%{oGlAtn1JWS|VU@RG!(nsue_H?PKIEdfhwL$1fz7zp~(@o&N^ zY}Q~m6C9F_m)QJ667W8Oxu_zJa0O%dnN=&S1^Cds2D)J0-|Q}Yh&!^OLmDdfkoz4r zonf+nz~*CVd621WVIATmCK0Ah@gG83fZ&f88=6QRwE5MbudYmtQ? zgrJ|mwXb3EXhQu2AM>gu$rxBe@D_rN)8_T&vzR}Y?)FLAj)hfx_xCY>!{+tlW;+PJ z6A+@WZ8sB8s}xYP--UuZE;t3I16fTtf(^YH2r;ic1R&H&jO{em;cMH05IL2Nq`pq8l`YvA=EJ zyt_P^lS?21%_LLA3uFJnIIssJX<8Ffa)^eABw&mh3_ zmF=$P>w@X`neC8*OyJrx`27|Zbtj{WfYb>dbvGTAU zIl1E<}>aH`S%Pq#Z$p94C7rdVr&D*UTA>V#ELqA&whk=Q2s_{Z3uE&45H%Xv7iM)8g;sL zWc7K?yq>?9qCgo>>X+C|H)Mp>sw)x?AfE+K{y$(d)8(a{OqtpL#v1*Hc{ii1CA%=2 zxSiY9K85-yWRTQ;WO5#qxWGYk$a$hYa;KzySpHZvC&d`V#+ox{#n}!{fJ$H%=0q9f z^Ll{A^}n-g(#NMK_GFWDaisWh8$SQHF>;w5t;%)Fe=p$6@fpi@rr>Lp9IKch91 zvn1rVQ(`BqQOJuA$^3B9lCV`$HeHh#$coGpEsdKnLFZEdEUY;EH&{cfxaW*H*J3|h z7@F}lF`eJU2I`ZTj7HKsa6KdREVSyz=DG-FH*3zSa{_aA66<+Ttc5jE;EcPxjmOpR-okj^gpyhbQhTIrBah)TWNMz_{g2?ehj7rb z=OZnoBRG6M!r$}e4PrvP?l5h<+q zNEE5`*lre@$I!g5nUhSCa`=e^V>Zn>-;SBr!n2ig0~6P4-gu%b7z_h6POYfxtEviZnq_y*SK29yZdZ7$&c9QPx^LGXIIepPI+|Absl z;2qha`YD3Ji{c*kV9vy7<1D zzN8QN5GUV@NG4(%>+k^YGGWdO$F*L-x)cNRl@#uI^E!qeOL7k|jxZ1?@J@5a+5_fr z;p-U7CdNVdb$2AqIAYFq$Nu&I#P!2a48!<76vQF)`a_UQuG3R|hStJ>IblmShyk60 zoQ^|2p5ys+G4q1sP$j0E0ZLFpj>IDvSH_&p=Xpw2MA^9p&HD;m!S_SkO{$v-_7xTT zpvbV&;nmdarSMVc$ZR`>3)yLP(Hsj-y01)-2CD}?BBQ5zVu!R+^nczG4clu@^Hmg# z0Mk)#2X4qPwC_a-0s$+_!S!tAyp6vz9XO3Z+XcKAPxLj3+;eUQ0vCi_bmz>u?26`H zfeoJ@62Q-hXla%*e`Gs^sITF9L?}`qNbo_vxXYG=r_vI6gj463Y(`onglwplswicx(#xjg-SuE#zF)fm z#V{|Kh!Pu?cP9WVFEXu4j7>d%#D+gBnUh22M4{`jY_6naaTJ%+CGvJi;$Q!TV0bZ- ziOb8o7bVciPQ*QuQqCJ1gT(T%EUZ|8kS$;{l`P5A7n&erVs0>^dR78LG~nC z8!*p$@vQ3t*&GQr_<6V+GZ^c*oSYpPZ`$=^_%}&8s<@6^286p_g|=WO!H-%wRX$w;rf`8Xm)+5#5w}&ClmQLu@>iS z2Xf8*bKa5#VrBCx&U;N#nT%WUaO2@~9`~Jv710b+L4w&CWSMZU1jw`uGrYD8SK@E*D_TvRoo&Sx~G$Vf9hy)|MB{(@IDW~UcUf&~u$D`&9vTINdUqX=>7LYv;#>7_- zYua-X38&f5)LagyNuQXNcLW)xzF|QErQ4!dh{jVeOg6H?87%CP^qdmRrh#14CCCM+ zM5O_5w7@>R?Da7vmWjl3GLcQYh4re+$^N>S;fpvFt~LR3nZ(rY<8#N%8LCFjYcyhG zXaw%y4CIlVlx+BVfG%8Kz&>;4c;{7|p6nxj1`Ens`*M)S%}J`RSCm9f%%yCQA<)TG z29&Z`AH=(7Y&U&XHdvgOy*?WVM_DYNRs4Nba@XOrbNjr$ASPM{*ItJYIxFeFljhAL zx>E2A8L`BA@$PqEE#(CpQ3_lK_8KI@u^<~;H_tMJ>aivH=ox^m38vwKU=U72VbKjK zMu0eqrX-+i0{0je!Ph=|uloA^C^0I5hmsjNAc4OJDF8T2*~prmV0WzzNdw2OQ~3CR z#4EZj+20|jSpW-CbLtbauir(SC>`dFLn;yfZ9sxZ^O9cbu_Qxpj7^3mstgFeE6?K? z*eoRENZarA+mg~6hUO+>EMwlJv|D`hnh5^ZOJ3gy%;bz)K5vNH_H zQoez2nu8^B62DhwUlN$Ci+Rrtl@kEaU2|T-k|hg#sPHB+-aq1Jg z3}C%BA$Mev>Jtn|*wtr0*S|_7#&U3$-%djYAK+A9we(s5?SOPtQsJz)y@h+kI%}y? zVqEPVxR+Fi4tJFo>l6C%vo!VIQ6*%ta;yz?5~Z#bP;Z2$lu07*naR1nuQzVO7H zo1S&_FLOPs+t@d8(!4+60YUpQ$k;0Z#uy%+O(Xu>ycGF9-qrBj@61bzSHX*Hq zL9|;4;Pgl!u0IH<5v=ngPSrV4055wzHS!&t$fRCB4guH}6OJ8b*k*hoq~GCyW!pwSTD<2Zv>~mn!fkU?C<#98v?`TyOXHpdkA9Km1!M99j*$~mTx2++7@Niq(am)G&RZ3H8= zK?d*t9Ao&xyr!VO&+8jdY+uPqax4(un)uUS1Pf8$$MxKx_b{(Hm~E31JK@(RwEvgp z4I-*35nvKoguZQ>?^`x!pt)~e#kVR!t!+zk?pXxJ{e$?yC&lVvqml2Se3yc8P;p(u z|JNWd2PNQD#(lp)1}E%nyr1h|g%XPe5X)jMEH{bV*F-sy1*l+7E%%jq6<=)436LXd zlJYZy1Lqm$f5yC;wWiU`0!*Bb%=^a?%Gzm8OLPT7yb>VhSjg}R+=r_W)E5F~IEI1V z4NhN;BMb^;azfk&Dydma(&LC9w4duU63su3Z!L%-z0!S&&Q=1CQ9rZ$WYPJD+15Kg_y!~|B3ZmPkDDm!XC!nV-uShi}wNy=l&ql$sd}t zZ(TMg=-mhcz==pa(+osB)x~sX>#jwMa{}ZfmDeHIfl?44YzSnwnxZ*7#2+ol2Cm9W zr1f{(&-ED*;QjzmQWyL}+SprN&qAKG>j~pM0HNy<01DG_%FFPoS!(kVWUN{HBqFhS z$VR^F)|!YzA+g<<#|{D8Y-j-M7rK7GN=&n2Y}B%0-WaylWZvjH5P?~2Vs)h{auzI6 zfy@Uf{Ak|P0$;vcOv$1kscJ1IJ{Lr(xgq<^`vt5t*#s6rd?^!7wT)9xgP9rI4acop zI?b~ZglgI{FQAxW3nA8f;U!PHs*tiV2uDWCXqiA8gf{6GQX}z{bR?*h+aRZIsEJEw%QxD7UJ- zPc^ungc#$JLM)j#oh0ezToWNCl8*0Oz&)5fS!)pqu3Gyf5U=`+#3rou;EA_j5lZP6 zo3{`0G!1jS09m?b&gGaUlPqXr+IGdf<8nJa@iM`tX{WIV<%fKPHA$J3_oxIF&P(XG znbVRrvmSKJgzuW9n%i~zRCy5VQV?ZY4RHYdh+zL4G5`%MJiDTj&3B`P8N*3DhI}~5 zHTp1_Ut(f6Qp|8-vdjtNe;JrfgVqDl3lt&se`L ziHtwMd^B5sx-pYT{jxfag)pS^TDIMAVp+Lf?O32J8$Thjgc|(u&#{lHEfnYwroc%nN5=0( z{QfZZz!na%MGI;H2&o;FDB^Jp{tNxBha{Gh{Au2F~7i=*+^tf(ta_T zXd3vWp2V2V97%Zwb8#C% zyx7_)o!HwL;{xRD8s7V{D6dA7!|NC}{+pPOF~PoEH>Zb7Q(y-%=kMb%Hc2(#OtB(( zh`)jP@5Mg(4l?-%-0KB09hc2)H6Nrw9^ysGenXZZR?_9nIrU;S$+RN=jF)G5=_Ve0 z8G zLavn=$?C5@@dH`P+L2<879`(KKvl_-#4Fh#rqGCN;2~_BsUVG2hCtuOsUEiXCW?)m z1jhxFFpfFTVeQh^pLGVTtQ;^egPw;K_bd=zEe8*|{HVN+KrUGE_X9RjIe7jMHo&L& z>>WJkBG!8l5&6ZGlUz9!NM15!4#WON(rTdM3veZs8HsbtHg)~xP;a&a>$LPPzqAU!!~IW~m-6;wF4?zX&60igh@O4N%>HUl zNk>%WW8C+v6xWf5=j%uvzHMF{#<`v}C)445!;)gw`)^C^fQJdmd7h~ilaHkFCLn;F zw!8X?CtSgH_h;|Gbz13`34(JYa_?fWc;t*55_8XjbYxh3lL>$n^X8)cEUz(^rmgJ1Q0HwVs zQGMd>&p`nWOKhqk^GnvEj9@DCBqy4WU7t>x^DcCmQ-EzXQ2=v@(>%dg-

OV9uG@ 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, get_pos(), LAYER_OBJECTS); context.set_drawing_effect(old_effect); } else { diff --git a/src/flip_level_transformer.cpp b/src/flip_level_transformer.cpp index 73fe33bef..1b8839996 100644 --- a/src/flip_level_transformer.cpp +++ b/src/flip_level_transformer.cpp @@ -80,7 +80,7 @@ FlipLevelTransformer::transform_tilemap(TileMap* tilemap) } } if(tilemap->get_drawing_effect() != 0) { - tilemap->set_drawing_effect(0); + tilemap->set_drawing_effect(NO_EFFECT); } else { tilemap->set_drawing_effect(VERTICAL_FLIP); } diff --git a/src/game_session.cpp b/src/game_session.cpp index 2aa30368a..a18a77448 100644 --- a/src/game_session.cpp +++ b/src/game_session.cpp @@ -457,12 +457,17 @@ GameSession::draw_pause() -((pause_menu_frame * i)%SCREEN_WIDTH) ,(i*20+pause_menu_frame)%SCREEN_HEIGHT), Vector(SCREEN_WIDTH,10), - Color(20,20,20, rand() % 20 + 1), LAYER_FOREGROUND1+1); + Color(0.1, 0.1, 0.1, static_cast(rand() % 20 + 1) / 255.0), + LAYER_FOREGROUND1+1); } context->draw_filled_rect( Vector(0,0), Vector(SCREEN_WIDTH, SCREEN_HEIGHT), - Color(rand() % 50, rand() % 50, rand() % 50, 128), LAYER_FOREGROUND1); + Color( + static_cast(rand() % 50) / 255.0, + static_cast(rand() % 50) / 255.0, + static_cast(rand() % 50) / 255.0, + 0.5), LAYER_FOREGROUND1); #if 0 context->draw_text(blue_text, _("PAUSE - Press 'P' To Play"), Vector(SCREEN_WIDTH/2, 230), CENTER_ALLIGN, LAYER_FOREGROUND1+2); diff --git a/src/gui/button.cpp b/src/gui/button.cpp index 16d901db5..2e4a3360e 100644 --- a/src/gui/button.cpp +++ b/src/gui/button.cpp @@ -37,7 +37,7 @@ Button::Button(Surface* image_, std::string info_, SDLKey binding_) : binding(binding_) { image = image_; - size = Vector(image->w, image->h); + size = Vector(image->get_width(), image->get_height()); id = 0; info = info_; } diff --git a/src/gui/menu.cpp b/src/gui/menu.cpp index 37d74c668..5993bf4dd 100644 --- a/src/gui/menu.cpp +++ b/src/gui/menu.cpp @@ -84,7 +84,8 @@ bool confirm_dialog(Surface *background, std::string text) } if(background == NULL) - context.draw_gradient(Color(200,240,220), Color(200,200,220), LAYER_BACKGROUND0); + context.draw_gradient(Color(0.8, 0.95, 0.85), Color(0.8, 0.8, 0.8), + LAYER_BACKGROUND0); else context.draw_surface(background, Vector(0,0), LAYER_BACKGROUND0); @@ -537,9 +538,11 @@ Menu::draw_item(DrawingContext& context, int index) int y = y_pos - 12 - effect_offset; /* Draw a horizontal line with a little 3d effect */ context.draw_filled_rect(Vector(x, y + 6), - Vector(menu_width, 4), Color(150,200,255,225), LAYER_GUI); + Vector(menu_width, 4), + Color(0.6f, 0.7f, 1.0f, 1.0f), LAYER_GUI); context.draw_filled_rect(Vector(x, y + 6), - Vector(menu_width, 2), Color(255,255,255,255), LAYER_GUI); + Vector(menu_width, 2), + Color(1.0f, 1.0f, 1.0f, 1.0f), LAYER_GUI); break; } case MN_LABEL: @@ -560,11 +563,11 @@ Menu::draw_item(DrawingContext& context, int index) context.draw_filled_rect( Vector(input_pos - 5, y_pos - 10), Vector(input_width + 10, 20), - Color(255,255,255,255), LAYER_GUI-5); + Color(1.0f, 1.0f, 1.0f, 1.0f), LAYER_GUI-5); context.draw_filled_rect( Vector(input_pos - 4, y_pos - 9), Vector(input_width + 8, 18), - Color(0,0,0,128), LAYER_GUI-4); + Color(0, 0, 0, 0.5f), LAYER_GUI-4); if(pitem.kind == MN_TEXTFIELD || pitem.kind == MN_NUMFIELD) { @@ -607,11 +610,11 @@ Menu::draw_item(DrawingContext& context, int index) context.draw_filled_rect( Vector(x_pos - list_pos + text_pos - 1, y_pos - 10), Vector(list_pos_2 + 2, 20), - Color(255,255,255,255), LAYER_GUI - 4); + Color(1.0f, 1.0f, 1.0f, 1.0f), LAYER_GUI - 4); context.draw_filled_rect( Vector(x_pos - list_pos + text_pos, y_pos - 9), Vector(list_pos_2, 18), - Color(0,0,0,128), LAYER_GUI - 5); + Color(0, 0, 0, 0.5f), LAYER_GUI - 5); context.draw_text(text_font, pitem.list[pitem.selected], Vector(SCREEN_WIDTH/2 + text_pos, y_pos - int(text_font->get_height()/2)), @@ -701,7 +704,7 @@ Menu::draw(DrawingContext& context) context.draw_filled_rect( Vector(pos_x - menu_width/2, pos_y - 24*items.size()/2 - 10), Vector(menu_width,menu_height + 20), - Color(150,180,200,125), LAYER_GUI-10); + Color(0.6f, 0.7f, 0.8f, 0.5f), LAYER_GUI-10); for(unsigned int i = 0; i < items.size(); ++i) { diff --git a/src/gui/mousecursor.cpp b/src/gui/mousecursor.cpp index d2a082e20..51bf98482 100644 --- a/src/gui/mousecursor.cpp +++ b/src/gui/mousecursor.cpp @@ -27,7 +27,7 @@ extern SDL_Surface* screen; MouseCursor::MouseCursor(std::string cursor_file) : mid_x(0), mid_y(0) { - cursor = new Surface(cursor_file, true); + cursor = new Surface(cursor_file); cur_state = MC_NORMAL; @@ -68,8 +68,8 @@ void MouseCursor::draw(DrawingContext& context) x = int(x * float(SCREEN_WIDTH)/screen->w); y = int(y * float(SCREEN_HEIGHT)/screen->h); - w = cursor->w; - h = cursor->h / MC_STATES_NB; + w = (int) cursor->get_width(); + h = (int) (cursor->get_height() / MC_STATES_NB); if(ispressed &SDL_BUTTON(1) || ispressed &SDL_BUTTON(2)) { if(cur_state != MC_CLICK) { state_before_click = cur_state; diff --git a/src/gui/mousecursor.hpp b/src/gui/mousecursor.hpp index 98f03c2a7..8ccfda8b5 100644 --- a/src/gui/mousecursor.hpp +++ b/src/gui/mousecursor.hpp @@ -32,6 +32,8 @@ enum { MC_HIDE }; +class DrawingContext; + /// Mouse cursor. /** Used to create mouse cursors. The mouse cursors can be animated diff --git a/src/lisp/writer.cpp b/src/lisp/writer.cpp index 9312ea280..396978966 100644 --- a/src/lisp/writer.cpp +++ b/src/lisp/writer.cpp @@ -143,6 +143,17 @@ Writer::write_int_vector(const std::string& name, } void +Writer::write_float_vector(const std::string& name, + const std::vector& value) +{ + indent(); + *out << '(' << name; + for(std::vector::const_iterator i = value.begin(); i != value.end(); ++i) + *out << " " << *i; + *out << ")\n"; +} + +void Writer::indent() { for(int i = 0; i& value); void write_int_vector(const std::string& name, const std::vector& value); + void write_float_vector(const std::string& name, const std::vector& value); // add more write-functions when needed... void end_list(const std::string& listname); diff --git a/src/main.cpp b/src/main.cpp index 84b0e9688..caf7812f7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -43,6 +43,7 @@ #include "gettext.hpp" #include "audio/sound_manager.hpp" #include "video/surface.hpp" +#include "video/texture_manager.hpp" #include "control/joystickkeyboardcontroller.hpp" #include "misc.hpp" #include "title.hpp" @@ -301,6 +302,9 @@ static void check_gl_error() void init_video() { + if(texture_manager != NULL) + texture_manager->save_textures(); + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5); @@ -339,6 +343,9 @@ void init_video() // setup opengl state and transform glDisable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); + glEnable(GL_TEXTURE_2D); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glViewport(0, 0, screen->w, screen->h); glMatrixMode(GL_PROJECTION); @@ -351,7 +358,10 @@ void init_video() check_gl_error(); - Surface::reload_all(); + if(texture_manager != NULL) + texture_manager->reload_textures(); + else + texture_manager = new TextureManager(); } static void init_audio() @@ -450,15 +460,13 @@ int main(int argc, char** argv) free_menu(); unload_shared(); -#ifdef DEBUG - Surface::debug_check(); -#endif quit_audio(); if(config) config->save(); delete config; delete main_controller; + delete texture_manager; SDL_Quit(); PHYSFS_deinit(); diff --git a/src/object/ambient_sound.cpp b/src/object/ambient_sound.cpp index 68253b093..21ad67f3b 100644 --- a/src/object/ambient_sound.cpp +++ b/src/object/ambient_sound.cpp @@ -20,6 +20,7 @@ #include #include +#include #include "ambient_sound.hpp" #include "object_factory.hpp" diff --git a/src/object/background.cpp b/src/object/background.cpp index 4b8adc4f4..7c43cfad9 100644 --- a/src/object/background.cpp +++ b/src/object/background.cpp @@ -40,10 +40,11 @@ Background::Background(const lisp::Lisp& reader) && reader.get("speed", speed)) { set_image(imagefile, speed); } else { - std::vector bkgd_top_color, bkgd_bottom_color; + std::vector bkgd_top_color, bkgd_bottom_color; if(reader.get_vector("top_color", bkgd_top_color) && reader.get_vector("bottom_color", bkgd_bottom_color)) - set_gradient(Color(bkgd_top_color), Color(bkgd_bottom_color)); + set_gradient(Color(bkgd_top_color), + Color(bkgd_bottom_color)); } } @@ -64,15 +65,15 @@ Background::write(lisp::Writer& writer) writer.write_string("image", imagefile); writer.write_float("speed", speed); } else if(type == GRADIENT) { - std::vector bkgd_top_color, bkgd_bottom_color; + std::vector bkgd_top_color, bkgd_bottom_color; bkgd_top_color.push_back(gradient_top.red); bkgd_top_color.push_back(gradient_top.green); bkgd_top_color.push_back(gradient_top.blue); bkgd_bottom_color.push_back(gradient_top.red); bkgd_bottom_color.push_back(gradient_top.green); bkgd_bottom_color.push_back(gradient_top.blue); - writer.write_int_vector("top_color", bkgd_top_color); - writer.write_int_vector("bottom_color", bkgd_bottom_color); + writer.write_float_vector("top_color", bkgd_top_color); + writer.write_float_vector("bottom_color", bkgd_bottom_color); } writer.write_int("layer", layer); @@ -92,7 +93,7 @@ Background::set_image(const std::string& name, float speed) this->speed = speed; delete image; - image = new Surface("images/background/" + name, false); + image = new Surface("images/background/" + name); } void @@ -103,7 +104,7 @@ Background::set_gradient(Color top, Color bottom) gradient_bottom = bottom; delete image; - image = new Surface(top, bottom, SCREEN_WIDTH, SCREEN_HEIGHT); + image = NULL; } void @@ -112,18 +113,20 @@ Background::draw(DrawingContext& context) if(type == GRADIENT) { context.push_transform(); context.set_translation(Vector(0, 0)); - context.draw_surface(image, Vector(0, 0), layer); + context.draw_gradient(gradient_top, gradient_bottom, layer); context.pop_transform(); } else if(type == IMAGE) { if(!image) return; - int sx = int(-context.get_translation().x * speed) % image->w - image->w; - int sy = int(-context.get_translation().y * speed) % image->h - image->h; + int w = (int) image->get_width(); + int h = (int) image->get_height(); + int sx = int(-context.get_translation().x * speed) % w - w; + int sy = int(-context.get_translation().y * speed) % h - h; context.push_transform(); context.set_translation(Vector(0, 0)); - for(int x = sx; x < SCREEN_WIDTH; x += image->w) - for(int y = sy; y < SCREEN_HEIGHT; y += image->h) + for(int x = sx; x < SCREEN_WIDTH; x += w) + for(int y = sy; y < SCREEN_HEIGHT; y += h) context.draw_surface(image, Vector(x, y), layer); context.pop_transform(); } diff --git a/src/object/display_effect.cpp b/src/object/display_effect.cpp index 7bf875b4f..1f67b43e8 100644 --- a/src/object/display_effect.cpp +++ b/src/object/display_effect.cpp @@ -56,18 +56,16 @@ DisplayEffect::draw(DrawingContext& context) context.set_translation(Vector(0, 0)); if(black || type != NO_FADE) { - uint8_t alpha; + float alpha; if(black) { - alpha = 255; + alpha = 1.0f; } else { switch(type) { case FADE_IN: - alpha = static_cast - (fading * 255.0 / fadetime); + alpha = fading / fadetime; break; case FADE_OUT: - alpha = static_cast - ((fadetime-fading) * 255.0 / fadetime); + alpha = (fadetime-fading) / fadetime; break; default: alpha = 0; @@ -80,9 +78,9 @@ DisplayEffect::draw(DrawingContext& context) if (borders_fading || borders_active) { context.draw_filled_rect(Vector(0, 0), Vector(SCREEN_WIDTH, border_size), - Color(0, 0, 0, 255), LAYER_GUI-10); + Color(0, 0, 0, 1.0f), LAYER_GUI-10); context.draw_filled_rect(Vector(0, SCREEN_HEIGHT - border_size), Vector(SCREEN_WIDTH, border_size), - Color(0, 0, 0, 255), LAYER_GUI-10); + Color(0, 0, 0, 1.0f), LAYER_GUI-10); } context.pop_transform(); @@ -129,3 +127,4 @@ DisplayEffect::four_to_three() { borders_fading = false; } + diff --git a/src/object/fireworks.cpp b/src/object/fireworks.cpp index 62904c5b4..7047bf94b 100644 --- a/src/object/fireworks.cpp +++ b/src/object/fireworks.cpp @@ -46,8 +46,8 @@ Fireworks::update(float ) pos += Vector(SCREEN_WIDTH * ((float) rand() / RAND_MAX), SCREEN_HEIGHT/2 * ((float) rand() / RAND_MAX)); - int red = rand() % 255; - int green = rand() % red; + float red = static_cast(rand() % 255) / 255.0; + float green = static_cast(rand() % ((int) red*255)) / 255.0; sector->add_object(new Particles(pos, 0, 360, Vector(140, 140), Vector(0, 0), 45, Color(red, green, 0), 3, 1.3, LAYER_FOREGROUND1+1)); diff --git a/src/object/gameobjs.hpp b/src/object/gameobjs.hpp index 4aa1fa91e..53e8b4827 100644 --- a/src/object/gameobjs.hpp +++ b/src/object/gameobjs.hpp @@ -27,6 +27,7 @@ #include "game_object.hpp" #include "moving_object.hpp" #include "serializable.hpp" +#include "video/color.hpp" /* Bounciness of distros: */ #define NO_BOUNCE 0 diff --git a/src/object/level_time.cpp b/src/object/level_time.cpp index 591df8023..532afc58d 100644 --- a/src/object/level_time.cpp +++ b/src/object/level_time.cpp @@ -3,6 +3,7 @@ #include "level_time.hpp" #include +#include #include "main.hpp" #include "resources.hpp" #include "sector.hpp" diff --git a/src/object/particlesystem.cpp b/src/object/particlesystem.cpp index 5edb5a4f8..c9b484b28 100644 --- a/src/object/particlesystem.cpp +++ b/src/object/particlesystem.cpp @@ -73,9 +73,9 @@ void ParticleSystem::draw(DrawingContext& context) SnowParticleSystem::SnowParticleSystem() { - snowimages[0] = new Surface("images/objects/particles/snow0.png", true); - snowimages[1] = new Surface("images/objects/particles/snow1.png", true); - snowimages[2] = new Surface("images/objects/particles/snow2.png", true); + snowimages[0] = new Surface("images/objects/particles/snow0.png"); + snowimages[1] = new Surface("images/objects/particles/snow1.png"); + snowimages[2] = new Surface("images/objects/particles/snow2.png"); virtual_width = SCREEN_WIDTH * 2; @@ -133,8 +133,8 @@ void SnowParticleSystem::update(float elapsed_time) // Ghosts don't change their movement pattern - not random GhostParticleSystem::GhostParticleSystem() { - ghosts[0] = new Surface("images/objects/particles/ghost0.png", true); - ghosts[1] = new Surface("images/objects/particles/ghost1.png", true); + ghosts[0] = new Surface("images/objects/particles/ghost0.png"); + ghosts[1] = new Surface("images/objects/particles/ghost1.png"); virtual_width = SCREEN_WIDTH * 2; @@ -190,7 +190,7 @@ void GhostParticleSystem::update(float elapsed_time) CloudParticleSystem::CloudParticleSystem() { - cloudimage = new Surface("images/objects/particles/cloud.png", true); + cloudimage = new Surface("images/objects/particles/cloud.png"); virtual_width = 2000.0; diff --git a/src/object/particlesystem_interactive.cpp b/src/object/particlesystem_interactive.cpp index 5bdf862b9..edb2cbc05 100644 --- a/src/object/particlesystem_interactive.cpp +++ b/src/object/particlesystem_interactive.cpp @@ -142,8 +142,8 @@ ParticleSystem_Interactive::collision(Particle* object, Vector movement) RainParticleSystem::RainParticleSystem() { - rainimages[0] = new Surface("images/objects/particles/rain0.png", true); - rainimages[1] = new Surface("images/objects/particles/rain1.png", true); + rainimages[0] = new Surface("images/objects/particles/rain0.png"); + rainimages[1] = new Surface("images/objects/particles/rain1.png"); virtual_width = SCREEN_WIDTH * 2; @@ -224,8 +224,8 @@ void RainParticleSystem::update(float elapsed_time) CometParticleSystem::CometParticleSystem() { - cometimages[0] = new Surface("images/creatures/mr_bomb/exploding-left-0.png", true); - cometimages[1] = new Surface("images/creatures/mr_bomb/exploding-left-0.png", true); + cometimages[0] = new Surface("images/creatures/mr_bomb/exploding-left-0.png"); + cometimages[1] = new Surface("images/creatures/mr_bomb/exploding-left-0.png"); virtual_width = SCREEN_WIDTH * 2; diff --git a/src/object/platform.cpp b/src/object/platform.cpp index 9bbc5fe17..c0a59a74a 100644 --- a/src/object/platform.cpp +++ b/src/object/platform.cpp @@ -17,10 +17,11 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA // 02111-1307, USA. - #include #include "platform.hpp" + +#include #include "video/drawing_context.hpp" #include "resources.hpp" #include "player.hpp" diff --git a/src/object/text_object.cpp b/src/object/text_object.cpp index 9d2dd3313..348d9341b 100644 --- a/src/object/text_object.cpp +++ b/src/object/text_object.cpp @@ -1,6 +1,8 @@ #include #include "text_object.hpp" + +#include #include "resources.hpp" #include "video/drawing_context.hpp" @@ -74,17 +76,16 @@ TextObject::draw(DrawingContext& context) context.push_transform(); context.set_translation(Vector(0, 0)); if(fading > 0) { - context.set_alpha(static_cast - ((fadetime-fading) * 255.0 / fadetime)); + context.set_alpha((fadetime-fading) / fadetime); } else if(fading < 0) { - context.set_alpha(static_cast (-fading * 255.0 / fadetime)); + context.set_alpha(-fading / fadetime); } else if(!visible) { context.pop_transform(); return; } context.draw_filled_rect(Vector(125, 50), Vector(550, 120), - Color(150, 180, 200, 125), LAYER_GUI-50); + Color(0.6, 0.7, 0.8, 0.5), LAYER_GUI-50); if (centered) { context.draw_center_text(font, text, Vector(0, 50+35), LAYER_GUI-40); } diff --git a/src/object/tilemap.cpp b/src/object/tilemap.cpp index 8775418a6..a6765ee67 100644 --- a/src/object/tilemap.cpp +++ b/src/object/tilemap.cpp @@ -37,7 +37,7 @@ TileMap::TileMap() : solid(false), speed(1), width(0), height(0), layer(LAYER_TILES), - drawing_effect(0) + drawing_effect(NO_EFFECT) { tilemanager = tile_manager; @@ -47,7 +47,7 @@ TileMap::TileMap() TileMap::TileMap(const lisp::Lisp& reader, TileManager* new_tile_manager) : solid(false), speed(1), width(-1), height(-1), layer(LAYER_TILES), - drawing_effect(0) + drawing_effect(NO_EFFECT) { tilemanager = new_tile_manager; if(tilemanager == 0) @@ -94,7 +94,7 @@ TileMap::TileMap(const lisp::Lisp& reader, TileManager* new_tile_manager) TileMap::TileMap(int layer_, bool solid_, size_t width_, size_t height_) : solid(solid_), speed(1), width(0), height(0), layer(layer_), - drawing_effect(0) + drawing_effect(NO_EFFECT) { tilemanager = tile_manager; @@ -180,13 +180,13 @@ TileMap::draw(DrawingContext& context) for (pos.x = start_x; pos.x < end_x; pos.x += 32) { context.draw_filled_rect(Vector (pos.x, start_y), Vector(1, fabsf(start_y - end_y)), - Color(225, 225, 225), LAYER_GUI-50); + Color(0.8f, 0.8f, 0.8f), LAYER_GUI-50); } for (pos.y = start_y; pos.y < end_y; pos.y += 32) { context.draw_filled_rect(Vector (start_x, pos.y), Vector(fabsf(start_x - end_x), 1), - Color(225, 225, 225), LAYER_GUI-50); + Color(1.0f, 1.0f, 1.0f), LAYER_GUI-50); } } #endif diff --git a/src/object/tilemap.hpp b/src/object/tilemap.hpp index e344fa097..82196234a 100644 --- a/src/object/tilemap.hpp +++ b/src/object/tilemap.hpp @@ -25,6 +25,7 @@ #include "game_object.hpp" #include "serializable.hpp" #include "math/vector.hpp" +#include "video/drawing_context.hpp" namespace lisp { class Lisp; @@ -87,12 +88,12 @@ public: return tilemanager; } - void set_drawing_effect(int effect) + void set_drawing_effect(DrawingEffect effect) { drawing_effect = effect; } - int get_drawing_effect() + DrawingEffect get_drawing_effect() { return drawing_effect; } @@ -108,7 +109,7 @@ private: int width, height; int layer; - int drawing_effect; + DrawingEffect drawing_effect; }; #endif /*SUPERTUX_TILEMAP_H*/ diff --git a/src/player_status.cpp b/src/player_status.cpp index 29ed5bb10..1367c9894 100644 --- a/src/player_status.cpp +++ b/src/player_status.cpp @@ -209,7 +209,7 @@ PlayerStatus::draw(DrawingContext& context) if (player_status->lives >= 5) { sprintf(str, "%dx", player_status->lives); - float x = SCREEN_WIDTH - gold_text->get_text_width(str) - tux_life->w; + float x = SCREEN_WIDTH - gold_text->get_text_width(str) - tux_life->get_width(); context.draw_text(gold_text, str, Vector(x - BORDER_X, BORDER_Y + 20), LEFT_ALLIGN, LAYER_FOREGROUND1); context.draw_surface(tux_life, Vector(SCREEN_WIDTH - 16 - BORDER_X, BORDER_Y + 20), @@ -217,7 +217,8 @@ PlayerStatus::draw(DrawingContext& context) } else { for(int i= 0; i < player_status->lives; ++i) context.draw_surface(tux_life, - Vector(SCREEN_WIDTH - tux_life->w*4 +(tux_life->w*i) - BORDER_X, BORDER_Y + 20), + Vector(SCREEN_WIDTH - tux_life->get_width()*4 +(tux_life->get_width()*i) - BORDER_X, + BORDER_Y + 20), LAYER_FOREGROUND1); } diff --git a/src/resources.cpp b/src/resources.cpp index 92f2f41ef..e1ac72fba 100644 --- a/src/resources.cpp +++ b/src/resources.cpp @@ -35,7 +35,6 @@ MouseCursor* mouse_cursor = 0; Font* gold_text; Font* blue_text; Font* gray_text; -Font* yellow_nums; Font* white_text; Font* white_small_text; Font* white_big_text; @@ -44,26 +43,29 @@ Font* white_big_text; void load_shared() { /* Load GUI/menu images: */ - checkbox = new Surface("images/engine/menu/checkbox-unchecked.png", true); - checkbox_checked = new Surface("images/engine/menu/checkbox-checked.png", true); - back = new Surface("images/engine/menu/arrow-back.png", true); - arrow_left = new Surface("images/engine/menu/arrow-left.png", true); - arrow_right = new Surface("images/engine/menu/arrow-right.png", true); + checkbox = new Surface("images/engine/menu/checkbox-unchecked.png"); + checkbox_checked = new Surface("images/engine/menu/checkbox-checked.png"); + back = new Surface("images/engine/menu/arrow-back.png"); + arrow_left = new Surface("images/engine/menu/arrow-left.png"); + arrow_right = new Surface("images/engine/menu/arrow-right.png"); /* Load the mouse-cursor */ mouse_cursor = new MouseCursor("images/engine/menu/mousecursor.png"); MouseCursor::set_current(mouse_cursor); /* Load global images: */ - gold_text = new Font("images/engine/fonts/gold.png", Font::TEXT, 16,18); - blue_text = new Font("images/engine/fonts/blue.png", Font::TEXT, 16,18,3); - white_text = new Font("images/engine/fonts/white.png", Font::TEXT, 16,18); - gray_text = new Font("images/engine/fonts/gray.png", Font::TEXT, 16,18); + gold_text = new Font("images/engine/fonts/gold.png", + "images/engine/fonts/shadow.png", 16, 18); + blue_text = new Font("images/engine/fonts/blue.png", + "images/engine/fonts/shadow.png", 16, 18, 3); + white_text = new Font("images/engine/fonts/white.png", + "images/engine/fonts/shadow.png", 16, 18); + gray_text = new Font("images/engine/fonts/gray.png", + "images/engine/fonts/shadow.png", 16, 18); white_small_text = new Font("images/engine/fonts/white-small.png", - Font::TEXT, 8,9, 1); - white_big_text = new Font("images/engine/fonts/white-big.png", - Font::TEXT, 20,22, 3); - yellow_nums = new Font("images/engine/fonts/numbers.png", Font::NUM, 32,32); + "images/engine/fonts/shadow-small.png", 8, 9, 1); + white_big_text = new Font("images/engine/fonts/white-big.png", + "images/engine/fonts/shadow-big.png", 20, 22, 3); Menu::default_font = white_text; Menu::active_font = blue_text; @@ -81,10 +83,10 @@ void load_shared() for (int i = 0; i < GROWING_FRAMES; i++) { sprintf(img_name, "images/creatures/tux_grow/left-%i.png", i+1); - growingtux_left[i] = new Surface(img_name, true); + growingtux_left[i] = new Surface(img_name); sprintf(img_name, "images/creatures/tux_grow/right-%i.png", i+1); - growingtux_right[i] = new Surface(img_name, true); + growingtux_right[i] = new Surface(img_name); } small_tux = new TuxBodyParts(); @@ -115,7 +117,7 @@ void load_shared() load_object_gfx(); /* Tux life: */ - tux_life = new Surface("images/creatures/tux_small/tux-life.png", true); + tux_life = new Surface("images/creatures/tux_small/tux-life.png"); player_status = new PlayerStatus(); } @@ -130,7 +132,6 @@ void unload_shared() delete gray_text; delete white_small_text; delete white_big_text; - delete yellow_nums; free_object_gfx(); diff --git a/src/resources.hpp b/src/resources.hpp index 30a6eb518..02639590a 100644 --- a/src/resources.hpp +++ b/src/resources.hpp @@ -50,7 +50,6 @@ extern Font* blue_text; extern Font* gray_text; extern Font* white_small_text; extern Font* white_big_text; -extern Font* yellow_nums; void load_shared(); void unload_shared(); diff --git a/src/sector.cpp b/src/sector.cpp index 79d80c6f5..9e3ae22d5 100644 --- a/src/sector.cpp +++ b/src/sector.cpp @@ -201,16 +201,16 @@ Sector::parse_old_format(const lisp::Lisp& reader) reader.get("bkgd_red_top", r); reader.get("bkgd_green_top", g); reader.get("bkgd_blue_top", b); - bkgd_top.red = r; - bkgd_top.green = g; - bkgd_top.blue = b; + bkgd_top.red = static_cast (r) / 255.0f; + bkgd_top.green = static_cast (g) / 255.0f; + bkgd_top.blue = static_cast (b) / 255.0f; reader.get("bkgd_red_bottom", r); reader.get("bkgd_green_bottom", g); reader.get("bkgd_blue_bottom", b); - bkgd_bottom.red = r; - bkgd_bottom.green = g; - bkgd_bottom.blue = b; + bkgd_bottom.red = static_cast (r) / 255.0f; + bkgd_bottom.green = static_cast (g) / 255.0f; + bkgd_bottom.blue = static_cast (b) / 255.0f; if(backgroundimage != "") { Background* background = new Background; diff --git a/src/sprite/sprite.cpp b/src/sprite/sprite.cpp index 3dc91f2d2..50475461e 100644 --- a/src/sprite/sprite.cpp +++ b/src/sprite/sprite.cpp @@ -48,7 +48,7 @@ Sprite::~Sprite() } void -Sprite::set_action(std::string name, int loops) +Sprite::set_action(const std::string& name, int loops) { if(action && action->name == name) return; @@ -129,13 +129,13 @@ Sprite::draw_part(DrawingContext& context, const Vector& source, int Sprite::get_width() const { - return action->surfaces[get_frame()]->w; + return (int) action->surfaces[get_frame()]->get_width(); } int Sprite::get_height() const { - return action->surfaces[get_frame()]->h; + return (int) action->surfaces[get_frame()]->get_height(); } diff --git a/src/sprite/sprite.hpp b/src/sprite/sprite.hpp index 9b1dee850..1c166326f 100644 --- a/src/sprite/sprite.hpp +++ b/src/sprite/sprite.hpp @@ -21,73 +21,74 @@ #define SUPERTUX_SPRITE_H #include -#include -#include -#include +#include +#include #include "video/surface.hpp" #include "math/vector.hpp" #include "sprite_data.hpp" +class DrawingContext; + class Sprite { public: - Sprite(SpriteData& data); - Sprite(const Sprite& other); - ~Sprite(); - - /** Draw sprite, automatically calculates next frame */ - void draw(DrawingContext& context, const Vector& pos, int layer); - - void draw_part(DrawingContext& context, const Vector& source, - const Vector& size, const Vector& pos, int layer); - - /** Set action (or state) */ - void set_action(std::string act, int loops = -1); - - /* Stop animation */ - void stop_animation() - { animation_loops = 0; } - /** Check if animation is stopped or not */ - bool check_animation(); - - float get_fps() const - { return action->fps; } - /** Get current action total frames */ - int get_frames() const - { return action->surfaces.size(); } - /** Get sprite's name */ - const std::string& get_name() const - { return data.name; } - /** Get current action name */ - const std::string& get_action_name() const - { return action->name; } - - int get_width() const; - int get_height() const; - - /** Get current frame */ - int get_frame() const - { return (int)frame; } - /** Set current frame */ - void set_frame(int frame_) - { if(frame_ > get_frames()) frame = 0; else frame = frame_; } - Surface* get_frame(unsigned int frame) - { - assert(frame < action->surfaces.size()); - return action->surfaces[frame]; - } + Sprite(SpriteData& data); + Sprite(const Sprite& other); + ~Sprite(); + + /** Draw sprite, automatically calculates next frame */ + void draw(DrawingContext& context, const Vector& pos, int layer); + + void draw_part(DrawingContext& context, const Vector& source, + const Vector& size, const Vector& pos, int layer); + + /** Set action (or state) */ + void set_action(const std::string& act, int loops = -1); + + /* Stop animation */ + void stop_animation() + { animation_loops = 0; } + /** Check if animation is stopped or not */ + bool check_animation(); + + float get_fps() const + { return action->fps; } + /** Get current action total frames */ + int get_frames() const + { return action->surfaces.size(); } + /** Get sprite's name */ + const std::string& get_name() const + { return data.name; } + /** Get current action name */ + const std::string& get_action_name() const + { return action->name; } + + int get_width() const; + int get_height() const; + + /** Get current frame */ + int get_frame() const + { return (int)frame; } + /** Set current frame */ + void set_frame(int frame_) + { if(frame_ > get_frames()) frame = 0; else frame = frame_; } + Surface* get_frame(unsigned int frame) + { + assert(frame < action->surfaces.size()); + return action->surfaces[frame]; + } private: - void update(); + void update(); - SpriteData& data; + SpriteData& data; - float frame; - int animation_loops; - Uint32 last_ticks; + float frame; + int animation_loops; + Uint32 last_ticks; - SpriteData::Action* action; + SpriteData::Action* action; }; #endif diff --git a/src/sprite/sprite_data.cpp b/src/sprite/sprite_data.cpp index 58d22cf1b..ca971246f 100644 --- a/src/sprite/sprite_data.cpp +++ b/src/sprite/sprite_data.cpp @@ -90,9 +90,8 @@ SpriteData::parse_action(const lisp::Lisp* lisp, const std::string& basedir) } else { for(int i = 0; static_cast(i) < act_tmp->surfaces.size(); i++) { - Surface* surface = new Surface(sdl_surface_from_sdl_surface( - act_tmp->surfaces[i]->impl->get_sdl_surface()), true); - surface->apply_filter(HORIZONTAL_FLIP_FILTER); + Surface* surface = new Surface(*(act_tmp->surfaces[i])); + surface->hflip(); action->surfaces.push_back(surface); } } @@ -106,7 +105,7 @@ SpriteData::parse_action(const lisp::Lisp* lisp, const std::string& basedir) } for(std::vector::size_type i = 0; i < images.size(); i++) { - action->surfaces.push_back(new Surface(basedir + images[i], true)); + action->surfaces.push_back(new Surface(basedir + images[i])); } } actions[action->name] = action; diff --git a/src/textscroller.cpp b/src/textscroller.cpp index d76342a06..0c4406218 100644 --- a/src/textscroller.cpp +++ b/src/textscroller.cpp @@ -98,13 +98,12 @@ void display_text_file(const std::string& filename) if(line[0] == '!') { std::string imagename = line.substr(1, line.size()-1); std::cout << "Imagename: " << imagename << "\n"; - images.insert(std::make_pair(imagename, new Surface(imagename, true))); + images.insert(std::make_pair(imagename, new Surface(imagename))); } } // load background image - Surface* background - = new Surface("images/background/" + background_file, false); + Surface* background = new Surface("images/background/" + background_file); bool done = false; float scroll = 0; @@ -187,9 +186,9 @@ void display_text_file(const std::string& filename) } if(image != 0) { context.draw_surface(image, - Vector( (SCREEN_WIDTH - image->w) / 2, + Vector( (SCREEN_WIDTH - image->get_width()) / 2, SCREEN_HEIGHT + y - scroll), 255); - y += image->h + ITEMS_SPACE; + y += image->get_height() + ITEMS_SPACE; } } @@ -240,7 +239,7 @@ InfoBox::draw(DrawingContext& context) float height = 200; context.draw_filled_rect(Vector(x1, y1), Vector(width, height), - Color(150, 180, 200, 125), LAYER_GUI-1); + Color(0.6f, 0.7f, 0.8f, 0.5f), LAYER_GUI-1); float y = y1; for(size_t i = firstline; i < lines.size(); ++i) { diff --git a/src/tile.cpp b/src/tile.cpp index 6c75fb1e3..f2ec18a23 100644 --- a/src/tile.cpp +++ b/src/tile.cpp @@ -137,18 +137,18 @@ Tile::load_images(const std::string& tilesetpath) Surface* surface; std::string file = tilesetpath + spec.file; if(spec.rect.get_width() <= 0) { - surface = new Surface(file, true); + surface = new Surface(file); } else { surface = new Surface(file, (int) spec.rect.p1.x, (int) spec.rect.p1.y, (int) spec.rect.get_width(), - (int) spec.rect.get_height(), true); + (int) spec.rect.get_height()); } images.push_back(surface); } if(editor_imagefile != "") { - editor_image = new Surface(tilesetpath + editor_imagefile, true); + editor_image = new Surface(tilesetpath + editor_imagefile); } } diff --git a/src/tile.hpp b/src/tile.hpp index ed1196e30..a551d309b 100644 --- a/src/tile.hpp +++ b/src/tile.hpp @@ -21,10 +21,13 @@ #define TILE_H #include +#include #include "video/surface.hpp" #include "math/rect.hpp" #include "lisp/lisp.hpp" +class DrawingContext; + /** Tile Class */ @@ -115,7 +118,7 @@ public: { if(!images.size()) return 0; - return images[0]->w; + return (int) images[0]->get_width(); } /// returns the height of the tiles in pixels @@ -123,7 +126,7 @@ public: { if(!images.size()) return 0; - return images[0]->h; + return (int) images[0]->get_height(); } protected: diff --git a/src/tile_manager.cpp b/src/tile_manager.cpp index 5e941d0b3..6ade3d9bd 100644 --- a/src/tile_manager.cpp +++ b/src/tile_manager.cpp @@ -21,6 +21,7 @@ #include #include +#include #include #include "video/drawing_context.hpp" #include "lisp/lisp.hpp" diff --git a/src/tile_manager.hpp b/src/tile_manager.hpp index e5ab10982..b8ef087f5 100644 --- a/src/tile_manager.hpp +++ b/src/tile_manager.hpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include "tile.hpp" diff --git a/src/title.cpp b/src/title.cpp index 266b28b92..97efc08bd 100644 --- a/src/title.cpp +++ b/src/title.cpp @@ -285,9 +285,9 @@ void title() titlesession = new GameSession("levels/misc/menu.stl", ST_GL_DEMO_GAME); /* Load images: */ - bkg_title = new Surface("images/background/arctis.jpg", false); - logo = new Surface("images/engine/menu/logo.png", true); - //img_choose_subset = new Surface("images/status/choose-level-subset.png", true); + bkg_title = new Surface("images/background/arctis.jpg"); + logo = new Surface("images/engine/menu/logo.png"); + //img_choose_subset = new Surface("images/status/choose-level-subset.png"); titlesession->get_current_sector()->activate("main"); titlesession->set_current(); @@ -335,7 +335,7 @@ void title() draw_demo(elapsed_time); if (Menu::current() == main_menu) - context.draw_surface(logo, Vector(SCREEN_WIDTH/2 - logo->w/2, 30), + context.draw_surface(logo, Vector(SCREEN_WIDTH/2 - logo->get_width()/2, 30), LAYER_FOREGROUND1+1); context.draw_text(white_small_text, " SuperTux " PACKAGE_VERSION "\n", diff --git a/src/video/color.hpp b/src/video/color.hpp new file mode 100644 index 000000000..18f8849db --- /dev/null +++ b/src/video/color.hpp @@ -0,0 +1,28 @@ +#ifndef __COLOR_HPP__ +#define __COLOR_HPP__ + +#include + +class Color +{ +public: + Color() + : red(0), green(0), blue(0), alpha(1.0) + { } + Color(float red, float green, float blue, float alpha = 1.0) + : red(red), green(green), blue(blue), alpha(alpha) + { } + Color(const std::vector& vals) + { + red = vals[0]; + green = vals[1]; + blue = vals[2]; + if(vals.size() > 3) + alpha = vals[3]; + } + + float red, green, blue, alpha; +}; + +#endif + diff --git a/src/video/drawing_context.cpp b/src/video/drawing_context.cpp index 48b9c9776..6f1aee1fd 100644 --- a/src/video/drawing_context.cpp +++ b/src/video/drawing_context.cpp @@ -32,6 +32,7 @@ #include "gameconfig.hpp" #include "glutil.hpp" #include "texture.hpp" +#include "texture_manager.hpp" #define LIGHTMAP_DIV 4 @@ -50,19 +51,22 @@ DrawingContext::DrawingContext() lightmap_width = screen->w / LIGHTMAP_DIV; lightmap_height = screen->h / LIGHTMAP_DIV; - int width = next_po2(lightmap_width); - int height = next_po2(lightmap_height); + unsigned int width = next_po2(lightmap_width); + unsigned int height = next_po2(lightmap_height); - lightmap.reset(new Texture(width, height, GL_RGB)); + lightmap = new Texture(width, height, GL_RGB); lightmap_uv_right = static_cast(lightmap_width) / static_cast(width); lightmap_uv_bottom = static_cast(lightmap_height) / static_cast(height); + texture_manager->register_texture(lightmap); requests = &drawing_requests; } DrawingContext::~DrawingContext() { + texture_manager->remove_texture(lightmap); + delete lightmap; } void @@ -77,12 +81,12 @@ DrawingContext::draw_surface(const Surface* surface, const Vector& position, request.pos = transform.apply(position); if(request.pos.x >= SCREEN_WIDTH || request.pos.y >= SCREEN_HEIGHT - || request.pos.x + surface->w < 0 || request.pos.y + surface->h < 0) + || request.pos.x + surface->get_width() < 0 + || request.pos.y + surface->get_height() < 0) return; request.layer = layer; request.drawing_effect = transform.drawing_effect; - request.zoom = transform.zoom; request.alpha = transform.alpha; request.request_data = const_cast (surface); @@ -138,7 +142,6 @@ DrawingContext::draw_text(const Font* font, const std::string& text, request.pos = transform.apply(position); request.layer = layer; request.drawing_effect = transform.drawing_effect; - request.zoom = transform.zoom; request.alpha = transform.alpha; TextRequest* textrequest = new TextRequest; @@ -159,7 +162,7 @@ DrawingContext::draw_center_text(const Font* font, const std::string& text, } void -DrawingContext::draw_gradient(Color top, Color bottom, int layer) +DrawingContext::draw_gradient(const Color& top, const Color& bottom, int layer) { DrawingRequest request; @@ -168,7 +171,6 @@ DrawingContext::draw_gradient(Color top, Color bottom, int layer) request.layer = layer; request.drawing_effect = transform.drawing_effect; - request.zoom = transform.zoom; request.alpha = transform.alpha; GradientRequest* gradientrequest = new GradientRequest; @@ -181,7 +183,7 @@ DrawingContext::draw_gradient(Color top, Color bottom, int layer) void DrawingContext::draw_filled_rect(const Vector& topleft, const Vector& size, - Color color, int layer) + const Color& color, int layer) { DrawingRequest request; @@ -190,15 +192,12 @@ DrawingContext::draw_filled_rect(const Vector& topleft, const Vector& size, request.layer = layer; request.drawing_effect = transform.drawing_effect; - request.zoom = transform.zoom; request.alpha = transform.alpha; FillRectRequest* fillrectrequest = new FillRectRequest; fillrectrequest->size = size; fillrectrequest->color = color; - fillrectrequest->color.alpha - = (int) ((float) fillrectrequest->color.alpha - * ((float) transform.alpha / 255.0)); + fillrectrequest->color.alpha = color.alpha * transform.alpha; request.request_data = fillrectrequest; requests->push_back(request); @@ -210,11 +209,11 @@ DrawingContext::draw_surface_part(DrawingRequest& request) SurfacePartRequest* surfacepartrequest = (SurfacePartRequest*) request.request_data; - surfacepartrequest->surface->impl->draw_part( + surfacepartrequest->surface->draw_part( surfacepartrequest->source.x, surfacepartrequest->source.y, request.pos.x, request.pos.y, - surfacepartrequest->size.x, surfacepartrequest->size.y, request.alpha, - request.drawing_effect); + surfacepartrequest->size.x, surfacepartrequest->size.y, + request.alpha, request.drawing_effect); delete surfacepartrequest; } @@ -227,10 +226,10 @@ DrawingContext::draw_gradient(DrawingRequest& request) const Color& bottom = gradientrequest->bottom; glBegin(GL_QUADS); - glColor3ub(top.red, top.green, top.blue); + glColor4f(top.red, top.green, top.blue, top.alpha); glVertex2f(0, 0); glVertex2f(SCREEN_WIDTH, 0); - glColor3ub(bottom.red, bottom.green, bottom.blue); + glColor4f(bottom.red, bottom.green, bottom.blue, bottom.alpha); glVertex2f(SCREEN_WIDTH, SCREEN_HEIGHT); glVertex2f(0, SCREEN_HEIGHT); glEnd(); @@ -259,18 +258,17 @@ DrawingContext::draw_filled_rect(DrawingRequest& request) float w = fillrectrequest->size.x; float h = fillrectrequest->size.y; - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glColor4ub(fillrectrequest->color.red, fillrectrequest->color.green, - fillrectrequest->color.blue, fillrectrequest->color.alpha); - - glBegin(GL_POLYGON); + glDisable(GL_TEXTURE_2D); + glColor4f(fillrectrequest->color.red, fillrectrequest->color.green, + fillrectrequest->color.blue, fillrectrequest->color.alpha); + + glBegin(GL_QUADS); glVertex2f(x, y); glVertex2f(x+w, y); glVertex2f(x+w, y+h); glVertex2f(x, y+h); glEnd(); - glDisable(GL_BLEND); + glEnable(GL_TEXTURE_2D); delete fillrectrequest; } @@ -296,14 +294,13 @@ DrawingContext::do_drawing() glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - glClearColor(1, 1, 1, 1); + glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); handle_drawing_requests(lightmap_requests); lightmap_requests.clear(); glDisable(GL_BLEND); - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, lightmap->handle); + glBindTexture(GL_TEXTURE_2D, lightmap->get_handle()); glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, screen->h - lightmap_height, lightmap_width, lightmap_height); glViewport(0, 0, screen->w, screen->h); @@ -312,6 +309,7 @@ DrawingContext::do_drawing() glOrtho(0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); + glEnable(GL_BLEND); } //glClear(GL_COLOR_BUFFER_BIT); @@ -319,17 +317,9 @@ DrawingContext::do_drawing() drawing_requests.clear(); if(use_lightmap) { - glEnable(GL_BLEND); glBlendFunc(GL_DST_COLOR, GL_ZERO); - //glDisable(GL_BLEND); - //glColor4f((float) rand() / (float) RAND_MAX, .22, .88, 1.0f); - - glEnable(GL_TEXTURE_2D); - glDisable(GL_DEPTH_TEST); - glDisable(GL_CULL_FACE); - glDisable(GL_ALPHA_TEST); - glBindTexture(GL_TEXTURE_2D, lightmap->handle); + glBindTexture(GL_TEXTURE_2D, lightmap->get_handle()); glBegin(GL_QUADS); glTexCoord2f(0, lightmap_uv_bottom); @@ -345,6 +335,8 @@ DrawingContext::do_drawing() glVertex2f(0, SCREEN_HEIGHT); glEnd(); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } assert_gl("drawing"); @@ -363,13 +355,7 @@ DrawingContext::handle_drawing_requests(DrawingRequests& requests) case SURFACE: { const Surface* surface = (const Surface*) i->request_data; - - if(i->zoom != 1.0) - surface->impl->draw_stretched(i->pos.x * i->zoom, i->pos.y * i->zoom, - (int)(surface->w * i->zoom), (int)(surface->h * i->zoom), - i->alpha, i->drawing_effect); - else - surface->impl->draw(i->pos.x, i->pos.y, i->alpha, i->drawing_effect); + surface->draw(i->pos.x, i->pos.y, i->alpha, i->drawing_effect); break; } case SURFACE_PART: @@ -404,30 +390,24 @@ DrawingContext::pop_transform() } void -DrawingContext::set_drawing_effect(uint32_t effect) +DrawingContext::set_drawing_effect(DrawingEffect effect) { transform.drawing_effect = effect; } -uint32_t +DrawingEffect DrawingContext::get_drawing_effect() const { return transform.drawing_effect; } void -DrawingContext::set_zooming(float zoom) -{ - transform.zoom = zoom; -} - -void -DrawingContext::set_alpha(uint8_t alpha) +DrawingContext::set_alpha(float alpha) { transform.alpha = alpha; } -uint8_t +float DrawingContext::get_alpha() const { return transform.alpha; diff --git a/src/video/drawing_context.hpp b/src/video/drawing_context.hpp index b3b6d284f..dccd31bfc 100644 --- a/src/video/drawing_context.hpp +++ b/src/video/drawing_context.hpp @@ -23,14 +23,15 @@ #include #include +#include #include #include #include #include "math/vector.hpp" -#include "video/screen.hpp" -#include "video/surface.hpp" -#include "video/font.hpp" +#include "surface.hpp" +#include "font.hpp" +#include "color.hpp" class Surface; class Texture; @@ -74,10 +75,10 @@ public: void draw_center_text(const Font* font, const std::string& text, const Vector& position, int layer); /// Draws a color gradient onto the whole screen */ - void draw_gradient(Color from, Color to, int layer); + void draw_gradient(const Color& from, const Color& to, int layer); /// Fills a rectangle. void draw_filled_rect(const Vector& topleft, const Vector& size, - Color color, int layer); + const Color& color, int layer); /// Processes all pending drawing requests and flushes the list. void do_drawing(); @@ -92,15 +93,13 @@ public: void pop_transform(); /// Apply that effect in the next draws (effects are listed on surface.h). - void set_drawing_effect(uint32_t effect); + void set_drawing_effect(DrawingEffect effect); /// return currently applied drawing effect - uint32_t get_drawing_effect() const; - /// apply that zoom in the next draws */ - void set_zooming(float zoom); - /// apply that alpha in the next draws */ - void set_alpha(uint8_t alpha); + DrawingEffect get_drawing_effect() const; + /// apply that alpha in the next draws (1.0 means fully opaque) */ + void set_alpha(float alpha); /// return currently set alpha - uint8_t get_alpha() const; + float get_alpha() const; enum Target { NORMAL, LIGHTMAP @@ -114,12 +113,11 @@ private: { public: Vector translation; - uint32_t drawing_effect; - float zoom; - uint8_t alpha; + DrawingEffect drawing_effect; + float alpha; Transform() - : drawing_effect(NONE_EFFECT), zoom(1), alpha(255) + : drawing_effect(NO_EFFECT), alpha(1.0f) { } Vector apply(const Vector& v) const @@ -182,9 +180,8 @@ private: Vector pos; int layer; - uint32_t drawing_effect; - float zoom; - int alpha; + DrawingEffect drawing_effect; + float alpha; Blend blend; void* request_data; @@ -212,7 +209,7 @@ private: SDL_Surface* screen; Target target; std::vector target_stack; - std::auto_ptr lightmap; + Texture* lightmap; int lightmap_width, lightmap_height; float lightmap_uv_right, lightmap_uv_bottom; }; diff --git a/src/video/font.cpp b/src/video/font.cpp index 72c2ff431..c38557689 100644 --- a/src/video/font.cpp +++ b/src/video/font.cpp @@ -29,37 +29,15 @@ #include "font.hpp" #include "drawing_context.hpp" -Font::Font(const std::string& file, FontType ntype, int nw, int nh, - int nshadowsize) - : chars(0), shadow_chars(0), type(ntype), w(nw), h(nh), - shadowsize(nshadowsize) +Font::Font(const std::string& file, const std::string& shadowfile, + int w, int h, int shadowsize) + : chars(0), shadow_chars(0), w(w), h(h), shadowsize(shadowsize) { - chars = new Surface(file, true); + chars = new Surface(file); + shadow_chars = new Surface(shadowfile); - switch(type) { - case TEXT: - first_char = 32; - break; - case NUM: - first_char = 48; - break; - } - char_count = (chars->h / h) * 16; - - // Load shadow font. - if(shadowsize > 0) { - SDL_Surface* conv = SDL_DisplayFormatAlpha(chars->impl->get_sdl_surface()); - int pixels = conv->w * conv->h; - SDL_LockSurface(conv); - for(int i = 0; i < pixels; ++i) { - Uint32 *p = (Uint32 *)conv->pixels + i; - *p = *p & conv->format->Amask; - } - SDL_UnlockSurface(conv); - SDL_SetAlpha(conv, SDL_SRCALPHA, 128); - shadow_chars = new Surface(conv, true); - SDL_FreeSurface(conv); - } + first_char = 32; + char_count = ((int) chars->get_height() / h) * 16; } Font::~Font() @@ -118,7 +96,7 @@ Font::get_height() const void Font::draw(const std::string& text, const Vector& pos_, FontAlignment alignment, - uint32_t drawing_effect, uint8_t alpha) const + DrawingEffect drawing_effect, float alpha) const { /* Cut lines changes into seperate strings, needed to support center/right text alignments with break lines. @@ -154,7 +132,7 @@ Font::draw(const std::string& text, const Vector& pos_, FontAlignment alignment, void Font::draw_text(const std::string& text, const Vector& pos, - uint32_t drawing_effect, uint8_t alpha) const + DrawingEffect drawing_effect, float alpha) const { if(shadowsize > 0) draw_chars(shadow_chars, text, pos + Vector(shadowsize, shadowsize), @@ -208,10 +186,8 @@ uint32_t decode_utf8(const std::string& text, size_t& p) void Font::draw_chars(Surface* pchars, const std::string& text, const Vector& pos, - uint32_t drawing_effect, uint8_t alpha) const + DrawingEffect drawing_effect, float alpha) const { - SurfaceImpl* impl = pchars->impl; - Vector p = pos; size_t i = 0; while(i < text.size()) { @@ -250,7 +226,8 @@ Font::draw_chars(Surface* pchars, const std::string& text, const Vector& pos, int source_x = (font_index % 16) * w; int source_y = (font_index / 16) * h; - impl->draw_part(source_x, source_y, p.x, p.y, w, h, alpha, drawing_effect); + pchars->draw_part(source_x, source_y, p.x, p.y, w, h, alpha, + drawing_effect); p.x += w; } } diff --git a/src/video/font.hpp b/src/video/font.hpp index af6cd0b3c..6cace57c0 100644 --- a/src/video/font.hpp +++ b/src/video/font.hpp @@ -35,13 +35,8 @@ enum FontAlignment { class Font { public: - enum FontType { - TEXT, // images for all characters - NUM // only images for numbers - }; - - Font(const std::string& file, FontType type, int w, int h, - int shadowsize=2); + Font(const std::string& file, const std::string& shadowfile, + int w, int h, int shadowsize = 2); ~Font(); /** returns the width of a given text. (Note that I won't add a normal @@ -63,20 +58,22 @@ public: * Type of alignment, drawing effect and alpha are optional. */ void draw(const std::string& text, const Vector& pos, FontAlignment allignment = LEFT_ALLIGN, - uint32_t drawing_effect = NONE_EFFECT, uint8_t alpha = 255) const; + DrawingEffect drawing_effect = NO_EFFECT, + float alpha = 1.0f) const; private: friend class DrawingContext; void draw_text(const std::string& text, const Vector& pos, - uint32_t drawing_effect = NONE_EFFECT, uint8_t alpha = 255) const; + DrawingEffect drawing_effect = NO_EFFECT, + float alpha = 1.0f) const; void draw_chars(Surface* pchars, const std::string& text, - const Vector& position, uint32_t drawing_effect, uint8_t alpha) const; + const Vector& position, DrawingEffect drawing_effect, + float alpha) const; Surface* chars; Surface* shadow_chars; - FontType type; int w; int h; int shadowsize; diff --git a/src/video/image_texture.cpp b/src/video/image_texture.cpp new file mode 100644 index 000000000..2bd9af4bb --- /dev/null +++ b/src/video/image_texture.cpp @@ -0,0 +1,19 @@ +#include + +#include "image_texture.hpp" +#include "texture_manager.hpp" + +ImageTexture::ImageTexture(SDL_Surface* surface) + : Texture(surface, GL_RGBA), refcount(0) +{ +} + +ImageTexture::~ImageTexture() +{ +} + +void +ImageTexture::release() +{ + texture_manager->release(this); +} diff --git a/src/video/image_texture.hpp b/src/video/image_texture.hpp new file mode 100644 index 000000000..9fe08af9e --- /dev/null +++ b/src/video/image_texture.hpp @@ -0,0 +1,59 @@ +#ifndef __SURFACE_TEXTURE_HPP__ +#define __SURFACE_TEXTURE_HPP__ + +#include +#include "texture.hpp" + +class ImageTexture : public Texture +{ +private: + std::string filename; + float image_width; + float image_height; + int refcount; + +public: + float get_image_width() const + { + return image_width; + } + + float get_image_height() const + { + return image_height; + } + + float get_uv_right() const + { + return image_width / static_cast (get_width()); + } + + float get_uv_bottom() const + { + return image_height / static_cast (get_height()); + } + + void ref() + { + refcount++; + } + + void unref() + { + assert(refcount > 0); + refcount--; + if(refcount == 0) + release(); + } + +private: + friend class TextureManager; + + ImageTexture(SDL_Surface* surface); + virtual ~ImageTexture(); + + void release(); +}; + +#endif + diff --git a/src/video/screen.cpp b/src/video/screen.cpp index f7463f0cc..2227ccfe0 100644 --- a/src/video/screen.cpp +++ b/src/video/screen.cpp @@ -28,12 +28,6 @@ #include #include -#include - -#ifndef WIN32 -#include -#include -#endif #include "gameconfig.hpp" #include "screen.hpp" @@ -43,107 +37,6 @@ #include "math/vector.hpp" static const float LOOP_DELAY = 20.0; -extern SDL_Surface* screen; - -/* 'Stolen' from the SDL documentation. - * Return the pixel value at (x, y) - * NOTE: The surface must be locked before calling this! - */ -Uint32 getpixel(SDL_Surface *surface, int x, int y) -{ - int bpp = surface->format->BytesPerPixel; - /* Here p is the address to the pixel we want to retrieve */ - Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp; - - switch(bpp) { - case 1: - return *p; - - case 2: - return *(Uint16 *)p; - - case 3: - if(SDL_BYTEORDER == SDL_BIG_ENDIAN) - return p[0] << 16 | p[1] << 8 | p[2]; - else - return p[0] | p[1] << 8 | p[2] << 16; - - case 4: - return *(Uint32 *)p; - - default: - return 0; /* shouldn't happen, but avoids warnings */ - } -} - -/* 'Stolen' from the SDL documentation. - * Set the pixel at (x, y) to the given value - * NOTE: The surface must be locked before calling this! - */ -void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel) -{ - int bpp = surface->format->BytesPerPixel; - /* Here p is the address to the pixel we want to set */ - Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp; - - switch(bpp) { - case 1: - *p = pixel; - break; - - case 2: - *(Uint16 *)p = pixel; - break; - - case 3: - if(SDL_BYTEORDER == SDL_BIG_ENDIAN) - { - p[0] = (pixel >> 16) & 0xff; - p[1] = (pixel >> 8) & 0xff; - p[2] = pixel & 0xff; - } - else - { - p[0] = pixel & 0xff; - p[1] = (pixel >> 8) & 0xff; - p[2] = (pixel >> 16) & 0xff; - } - break; - - case 4: - *(Uint32 *)p = pixel; - break; - - default: - assert(false); - } -} - -/* Draw a single pixel on the screen. */ -void drawpixel(int x, int y, Uint32 pixel) -{ - /* Lock the screen for direct access to the pixels */ - if ( SDL_MUSTLOCK(screen) ) - { - if ( SDL_LockSurface(screen) < 0 ) - { - fprintf(stderr, "Can't lock screen: %s\n", SDL_GetError()); - return; - } - } - - if(!(x < 0 || y < 0 || x > SCREEN_WIDTH || y > SCREEN_HEIGHT)) - putpixel(screen, x, y, pixel); - - if ( SDL_MUSTLOCK(screen) ) - { - SDL_UnlockSurface(screen); - } - /* Update just the part of the display that we've changed */ - SDL_UpdateRect(screen, x, y, 1, 1); -} - -/* --- FILL A RECT --- */ void fillrect(float x, float y, float w, float h, int r, int g, int b, int a) { @@ -156,38 +49,18 @@ void fillrect(float x, float y, float w, float h, int r, int g, int b, int a) h = -h; } - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4ub(r, g, b,a); - + + glDisable(GL_TEXTURE_2D); glBegin(GL_POLYGON); glVertex2f(x, y); glVertex2f(x+w, y); glVertex2f(x+w, y+h); glVertex2f(x, y+h); glEnd(); - glDisable(GL_BLEND); -} - -/* Needed for line calculations */ -#define SGN(x) ((x)>0 ? 1 : ((x)==0 ? 0:(-1))) -#define ABS(x) ((x)>0 ? (x) : (-x)) - -void draw_line(float x1, float y1, float x2, float y2, - int r, int g, int b, int a) -{ - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glColor4ub(r, g, b,a); - - glBegin(GL_LINES); - glVertex2f(x1, y1); - glVertex2f(x2, y2); - glEnd(); - glDisable(GL_BLEND); + glEnable(GL_TEXTURE_2D); } - void fadeout(int fade_time) { float alpha_inc = 256 / (fade_time / LOOP_DELAY); @@ -196,9 +69,8 @@ void fadeout(int fade_time) while(alpha > 0) { alpha -= alpha_inc; fillrect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0,0,0, (int)alpha_inc); // left side - - DrawingContext context; // ugly... - context.do_drawing(); + + SDL_GL_SwapBuffers(); sound_manager->update(); SDL_Delay(int(LOOP_DELAY)); @@ -227,8 +99,8 @@ void shrink_fade(const Vector& point, int fade_time) fillrect(SCREEN_WIDTH - right_cor, 0, right_cor, SCREEN_HEIGHT, 0,0,0); // right side fillrect(0, 0, SCREEN_WIDTH, up_cor, 0,0,0); // up side fillrect(0, SCREEN_HEIGHT - down_cor, SCREEN_WIDTH, down_cor+1, 0,0,0); // down side - DrawingContext context; // ugly... - context.do_drawing(); + + SDL_GL_SwapBuffers(); sound_manager->update(); SDL_Delay(int(LOOP_DELAY)); diff --git a/src/video/screen.hpp b/src/video/screen.hpp index 8f634982b..a26d5e9cb 100644 --- a/src/video/screen.hpp +++ b/src/video/screen.hpp @@ -26,53 +26,7 @@ #include #include "math/vector.hpp" -/** Stores 8bit RGBA values. */ -class Color -{ -public: - Color() - : red(0), green(0), blue(0), alpha(255) - {} - - Color(Uint8 red_, Uint8 green_, Uint8 blue_, Uint8 alpha_ = 255) - : red(red_), green(green_), blue(blue_), alpha(alpha_) - {} - - Color(std::vector color) - : red(0), green(0), blue(0), alpha(255) - { if(color.size() >= 3) { red = color[0]; green = color[1]; blue = color[2]; } - if(color.size() == 4) alpha = color[3]; } - - Color(std::vector color) - : red(0), green(0), blue(0), alpha(255) - { if(color.size() >= 3) { red = color[0]; green = color[1]; blue = color[2]; } - if(color.size() == 4) alpha = color[3]; } - - Color(const Color& o) - : red(o.red), green(o.green), blue(o.blue), alpha(o.alpha) - { } - - bool operator==(const Color& o) - { - if(red == o.red && green == o.green && - blue == o.blue && alpha == o.alpha) - return true; - return false; - } - - Uint32 map_rgb(SDL_Surface* surface) - { return SDL_MapRGB(surface->format, red, green, blue); } - Uint32 map_rgba(SDL_Surface* surface) - { return SDL_MapRGBA(surface->format, red, green, blue, alpha); } - - Uint8 red, green, blue, alpha; -}; - -Uint32 getpixel(SDL_Surface* surface, int x, int y); -void putpixel(SDL_Surface* surface, int x, int y, Uint32 pixel); -void drawpixel(int x, int y, Uint32 pixel); void fillrect(float x, float y, float w, float h, int r, int g, int b, int a = 255); -void draw_line(float x1, float y1, float x2, float y2, int r, int g, int b, int a = 255); void fadeout(int fade_time); void shrink_fade(const Vector& point, int fade_time); diff --git a/src/video/surface.cpp b/src/video/surface.cpp index 312129119..daca15c34 100644 --- a/src/video/surface.cpp +++ b/src/video/surface.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -32,752 +33,133 @@ #include "physfs/physfs_sdl.hpp" #include "video/surface.hpp" #include "video/screen.hpp" +#include "image_texture.hpp" +#include "texture_manager.hpp" -Surface::Surfaces Surface::surfaces; - -extern SDL_Surface* screen; - -SurfaceData::SurfaceData(SDL_Surface* temp, bool use_alpha_) - : type(SURFACE), surface(0), use_alpha(use_alpha_), - x(0), y(0), w(0), h(0) +Surface::Surface(const std::string& file) { - // Copy the given surface and make sure that it is not stored in - // video memory - surface = SDL_CreateRGBSurface(temp->flags & (~SDL_HWSURFACE), - temp->w, temp->h, - temp->format->BitsPerPixel, - temp->format->Rmask, - temp->format->Gmask, - temp->format->Bmask, - temp->format->Amask); - if(!surface) - throw std::runtime_error("No memory left for surface"); - - SDL_SetAlpha(temp,0,0); - SDL_BlitSurface(temp, NULL, surface, NULL); -} + texture = texture_manager->get(file); + texture->ref(); + uv_left = 0; + uv_top = 0; + uv_right = texture->get_uv_right(); + uv_bottom = texture->get_uv_bottom(); -SurfaceData::SurfaceData(const std::string& file_, bool use_alpha_) - : type(LOAD), surface(0), file(file_), use_alpha(use_alpha_) -{} - -SurfaceData::SurfaceData(const std::string& file_, int x_, int y_, - int w_, int h_, bool use_alpha_) - : type(LOAD_PART), surface(0), file(file_), use_alpha(use_alpha_), - x(x_), y(y_), w(w_), h(h_) -{} - -SurfaceData::SurfaceData(Color top_gradient_, Color bottom_gradient_, - int w_, int h_) - : type(GRADIENT), surface(0), use_alpha(false), w(w_), h(h_) -{ - top_gradient = top_gradient_; - bottom_gradient = bottom_gradient_; + width = texture->get_image_width(); + height = texture->get_image_height(); } - -SurfaceData::~SurfaceData() +Surface::Surface(const std::string& file, int x, int y, int w, int h) { - SDL_FreeSurface(surface); -} + texture = texture_manager->get(file); + texture->ref(); -SurfaceImpl* -SurfaceData::create() -{ - return create_SurfaceOpenGL(); -} + float tex_w = static_cast (texture->get_width()); + float tex_h = static_cast (texture->get_height()); + uv_left = static_cast(x) / tex_w; + uv_top = static_cast(y) / tex_h; + uv_right = static_cast(x+w) / tex_w; + uv_bottom = static_cast(y+h) / tex_h; -SurfaceOpenGL* -SurfaceData::create_SurfaceOpenGL() -{ - switch(type) - { - case LOAD: - return new SurfaceOpenGL(file); - case LOAD_PART: - return new SurfaceOpenGL(file, x, y, w, h); - case SURFACE: - return new SurfaceOpenGL(surface); - case GRADIENT: - return new SurfaceOpenGL(top_gradient, bottom_gradient, w, h); - default: - assert(false); - } -} - -/* Quick utility function for texture creation */ -static int power_of_two(int input) -{ - int value = 1; - - while ( value < input ) - { - value <<= 1; - } - return value; -} - -Surface::Surface(SDL_Surface* surf, bool use_alpha) - : impl(0), data(surf, use_alpha), w(0), h(0) -{ - impl = data.create(); - if (impl) - { - w = impl->w; - h = impl->h; - } - surfaces.push_back(this); -} - -Surface::Surface(const std::string& file, bool use_alpha) - : impl(0), data(file, use_alpha), w(0), h(0) -{ - impl = data.create(); - if (impl) - { - w = impl->w; - h = impl->h; - } - surfaces.push_back(this); + width = w; + height = h; } -Surface::Surface(const std::string& file, int x, int y, int w_, int h_, bool use_alpha) - : impl(0), data(file, x, y, w_, h_, use_alpha), w(0), h(0) +Surface::Surface(const Surface& other) { - impl = data.create(); - if (impl) - { - w = impl->w; - h = impl->h; - } - surfaces.push_back(this); -} + texture = other.texture; + texture->ref(); -Surface::Surface(Color top_background, Color bottom_background, int w_, int h_) - : impl(0), data(top_background, bottom_background, w_, h_), w(0), h(0) -{ - impl = data.create(); - if (impl) - { - w = impl->w; - h = impl->h; - } - surfaces.push_back(this); + uv_left = other.uv_left; + uv_top = other.uv_top; + uv_right = other.uv_right; + uv_bottom = other.uv_bottom; + width = other.width; + height = other.height; } -void -Surface::reload() +const Surface& +Surface::operator= (const Surface& other) { - delete impl; - impl = data.create(); - if (impl) - { - w = impl->w; - h = impl->h; - for(std::vector::iterator i = - data.applied_filters.begin(); i != data.applied_filters.end(); - i++) - impl->apply_filter(i->type, i->color); - } -} + other.texture->ref(); + texture->unref(); + texture = other.texture; -void Surface::apply_filter(int filter, Color color) -{ - impl->apply_filter(filter, color); + uv_left = other.uv_left; + uv_top = other.uv_top; + uv_right = other.uv_right; + uv_bottom = other.uv_bottom; + width = other.width; + height = other.height; - SurfaceData::Filter apply_filter; - apply_filter.type = filter; - apply_filter.color = color; - data.applied_filters.push_back(apply_filter); + return *this; } Surface::~Surface() { -#ifdef DEBUG - bool found = false; - for(std::list::iterator i = surfaces.begin(); i != surfaces.end(); - ++i) - { - if(*i == this) - { - found = true; break; - } - } - if(!found) - printf("Error: Surface freed twice!!!\n"); -#endif - surfaces.remove(this); - delete impl; + texture->unref(); } void -Surface::reload_all() -{ - for(Surfaces::iterator i = surfaces.begin(); i != surfaces.end(); ++i) - { - (*i)->reload(); - } -} - -void -Surface::debug_check() -{ - for(Surfaces::iterator i = surfaces.begin(); i != surfaces.end(); ++i) - { - printf("Surface not freed: T:%d F:%s.\n", (*i)->data.type, - (*i)->data.file.c_str()); - } -} - -void -apply_filter_to_surface(SDL_Surface* surface, int filter, Color color) -{ - if(filter == HORIZONTAL_FLIP_FILTER) { - SDL_Surface* sur_copy = sdl_surface_from_sdl_surface(surface); - SDL_BlitSurface(surface, NULL, sur_copy, NULL); - SDL_SetAlpha(sur_copy,0,0); - - SDL_Rect src, dst; - src.y = dst.y = 0; - src.w = dst.w = 1; - src.h = dst.h = sur_copy->h; - for(int x = 0; x < sur_copy->w; x++) - { - src.x = x; dst.x = sur_copy->w-1 - x; - SDL_BlitSurface(sur_copy, &src, surface, &dst); - } - - SDL_FreeSurface(sur_copy); - } else if(filter == MASK_FILTER) { - SDL_Surface* sur_copy = sdl_surface_from_sdl_surface(surface); - - Uint8 r,g,b,a; - - SDL_LockSurface(sur_copy); - for(int x = 0; x < sur_copy->w; x++) - for(int y = 0; y < sur_copy->h; y++) { - SDL_GetRGBA(getpixel(sur_copy,x,y), sur_copy->format, &r,&g,&b,&a); - if(a != 0) { - putpixel(sur_copy, x,y, color.map_rgba(sur_copy)); - } - } - SDL_UnlockSurface(sur_copy); - - SDL_BlitSurface(sur_copy, NULL, surface, NULL); - SDL_FreeSurface(sur_copy); - } -} - -SDL_Surface* -sdl_surface_part_from_file(const std::string& file, int x, int y, int w, int h) -{ - SDL_Rect src; - SDL_Surface * sdl_surface; - SDL_Surface * temp; - SDL_Surface * conv; - - temp = IMG_Load_RW(get_physfs_SDLRWops(file), true); - if (temp == 0) { - std::stringstream msg; - msg << "Couldn't load '" << file << "': " << SDL_GetError(); - throw std::runtime_error(msg.str()); - } - - /* Set source rectangle for conv: */ - - src.x = x; - src.y = y; - src.w = w; - src.h = h; - - conv = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, temp->format->BitsPerPixel, - temp->format->Rmask, - temp->format->Gmask, - temp->format->Bmask, - temp->format->Amask); - - SDL_SetAlpha(temp,0,0); - - SDL_BlitSurface(temp, &src, conv, NULL); - sdl_surface = SDL_DisplayFormatAlpha(conv); - - if (sdl_surface == NULL) { - std::stringstream msg; - msg << "Can't convert file '" << file << "' to display format."; - throw std::runtime_error(msg.str()); - } - - SDL_FreeSurface(temp); - SDL_FreeSurface(conv); - - return sdl_surface; -} - -SDL_Surface* -sdl_surface_from_file(const std::string& file) -{ - SDL_Surface* sdl_surface; - SDL_Surface* temp; - - temp = IMG_Load_RW(get_physfs_SDLRWops(file), true); - if (temp == 0) { - std::stringstream msg; - msg << "Couldn't load file '" << file << "': " << SDL_GetError(); - throw std::runtime_error(msg.str()); - } - - sdl_surface = SDL_DisplayFormatAlpha(temp); - - if (sdl_surface == NULL) { - std::stringstream msg; - msg << "Couldn't convert file '" << file << "' to display format"; - throw std::runtime_error(msg.str()); - } - - SDL_FreeSurface(temp); - - return sdl_surface; -} - -SDL_Surface* -sdl_surface_from_sdl_surface(SDL_Surface* sdl_surf) +Surface::hflip() { - SDL_Surface* sdl_surface = SDL_DisplayFormatAlpha(sdl_surf); - if (sdl_surface == 0) { - std::stringstream msg; - msg << "Can't convert surface to display format."; - throw std::runtime_error(msg.str()); - } - - return sdl_surface; + std::swap(uv_left, uv_right); } -SDL_Surface* -sdl_surface_from_gradient(Color top, Color bottom, int w, int h) +static inline void intern_draw(float left, float top, float right, float bottom, float uv_left, float uv_top, + float uv_right, float uv_bottom, + DrawingEffect effect) { - SDL_Surface* sdl_surface - = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, - screen->format->BitsPerPixel, screen->format->Rmask, - screen->format->Gmask, screen->format->Bmask, 0); - - if(sdl_surface == 0) - throw std::runtime_error("Can't create gradient surface"); - - if(top == bottom) { - SDL_FillRect(sdl_surface, NULL, SDL_MapRGB(sdl_surface->format, - top.red, top.green, top.blue)); - } else { - float redstep = (float(bottom.red)-float(top.red)) / float(h); - float greenstep = (float(bottom.green)-float(top.green)) / float(h); - float bluestep = (float(bottom.blue) - float(top.blue)) / float(h); - - SDL_Rect rect; - rect.x = 0; - rect.w = w; - rect.h = 1; - for(float y = 0; y < h; y++) { - rect.y = (int)y; - SDL_FillRect(sdl_surface, &rect, SDL_MapRGB(sdl_surface->format, - int(float(top.red) + redstep * y), - int(float(top.green) + greenstep * y), - int(float(top.blue) + bluestep * y))); - } + if(effect & HORIZONTAL_FLIP) + std::swap(uv_left, uv_right); + if(effect & VERTICAL_FLIP) { + std::swap(uv_top, uv_bottom); } - - return sdl_surface; -} - -//--------------------------------------------------------------------------- - -SurfaceImpl::SurfaceImpl() - : sdl_surface(0) -{} - -SurfaceImpl::~SurfaceImpl() -{ - if(sdl_surface != 0) - SDL_FreeSurface(sdl_surface); -} - -SDL_Surface* SurfaceImpl::get_sdl_surface() const -{ - return sdl_surface; -} - -SurfaceOpenGL::SurfaceOpenGL(SDL_Surface* surf) -{ - sdl_surface = sdl_surface_from_sdl_surface(surf); - create_gl(sdl_surface,&gl_texture); - - w = sdl_surface->w; - h = sdl_surface->h; -} - -SurfaceOpenGL::SurfaceOpenGL(const std::string& file) -{ - sdl_surface = sdl_surface_from_file(file); - create_gl(sdl_surface,&gl_texture); - - w = sdl_surface->w; - h = sdl_surface->h; -} - -SurfaceOpenGL::SurfaceOpenGL(const std::string& file_, int x_, int y_, - int w_, int h_) -{ - sdl_surface = sdl_surface_part_from_file(file_, x_, y_, w_, h_); - create_gl(sdl_surface, &gl_texture); - w = sdl_surface->w; - h = sdl_surface->h; -} - -SurfaceOpenGL::SurfaceOpenGL(Color top_gradient, Color bottom_gradient, - int _w, int _h) -{ - sdl_surface = sdl_surface_from_gradient(top_gradient, bottom_gradient,_w,_h); - create_gl(sdl_surface, &gl_texture); - w = sdl_surface->w; - h = sdl_surface->h; -} - -SurfaceOpenGL::~SurfaceOpenGL() -{ - glDeleteTextures(1, &gl_texture); -} - -void -SurfaceOpenGL::create_gl(SDL_Surface * surf, GLuint * tex) -{ - Uint32 saved_flags; - Uint8 saved_alpha; - int w, h; - SDL_Surface *conv; - - w = power_of_two(surf->w); - h = power_of_two(surf->h), - -#if SDL_BYTEORDER == SDL_BIG_ENDIAN - conv = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, surf->format->BitsPerPixel, - 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff); -#else - conv = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, surf->format->BitsPerPixel, - 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000); -#endif - - /* Save the alpha blending attributes */ - saved_flags = surf->flags&(SDL_SRCALPHA|SDL_RLEACCELOK); - saved_alpha = surf->format->alpha; - if ( (saved_flags & SDL_SRCALPHA) - == SDL_SRCALPHA ) - { - SDL_SetAlpha(surf, 0, 0); - } - - SDL_BlitSurface(surf, 0, conv, 0); - - /* Restore the alpha blending attributes */ - if ( (saved_flags & SDL_SRCALPHA) - == SDL_SRCALPHA ) - { - SDL_SetAlpha(surf, saved_flags, saved_alpha); - } - - // We check all the pixels of the surface to figure out which - // internal format OpenGL should use for storing it, ie. if no alpha - // is present store in RGB instead of RGBA, this saves a few bytes - // of memory, but much more importantly it makes the game look - // *much* better in 16bit color mode - int internal_format = GL_RGBA; - bool has_alpha = false; - - unsigned char* buf = static_cast(conv->pixels); - for (int y = 0; y < surf->h; ++y) - for (int x = 0; x < surf->w; ++x) - { - if (buf[(conv->pitch*y + x*4) + 3] != 255) - { - has_alpha = true; - break; - } - } - - if (!has_alpha) - { - internal_format = GL_RGB; - } - - glGenTextures(1, &*tex); - glBindTexture(GL_TEXTURE_2D , *tex); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glPixelStorei(GL_UNPACK_ROW_LENGTH, conv->pitch / conv->format->BytesPerPixel); - glTexImage2D(GL_TEXTURE_2D, 0, internal_format, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, conv->pixels); - glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); - - SDL_FreeSurface(conv); -} - -int -SurfaceOpenGL::draw(float x, float y, Uint8 alpha, Uint32 effect) -{ - float pw = power_of_two(w); - float ph = power_of_two(h); - - if(effect & SEMI_TRANSPARENT) - alpha = 128; - - glEnable(GL_TEXTURE_2D); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - glColor4ub(alpha, alpha, alpha, alpha); - - glBindTexture(GL_TEXTURE_2D, gl_texture); - - glBegin(GL_QUADS); - - if(effect & VERTICAL_FLIP & HORIZONTAL_FLIP) - { - glTexCoord2f(0, 0); - glVertex2f((float)w+x, (float)h+y); - - glTexCoord2f((float)w / pw, 0); - glVertex2f(x, (float)h+y); - - glTexCoord2f((float)w / pw, (float)h / ph); - glVertex2f(x, y); - - glTexCoord2f(0, (float)h / ph); - glVertex2f((float)w+x, y); - } - else if(effect & VERTICAL_FLIP) - { - glTexCoord2f(0, 0); - glVertex2f(x, (float)h+y); - - glTexCoord2f((float)w / pw, 0); - glVertex2f((float)w+x, (float)h+y); - - glTexCoord2f((float)w / pw, (float)h / ph); - glVertex2f((float)w+x, y); - - glTexCoord2f(0, (float)h / ph); - glVertex2f(x, y); - } - else if(effect & HORIZONTAL_FLIP) - { - glTexCoord2f(0, 0); - glVertex2f((float)w+x, y); - - glTexCoord2f((float)w / pw, 0); - glVertex2f(x, y); - - glTexCoord2f((float)w / pw, (float)h / ph); - glVertex2f(x, (float)h+y); - - glTexCoord2f(0, (float)h / ph); - glVertex2f((float)w+x, (float)h+y); - } - else - { - glTexCoord2f(0, 0); - glVertex2f(x, y); - - glTexCoord2f((float)w / pw, 0); - glVertex2f((float)w+x, y); - - glTexCoord2f((float)w / pw, (float)h / ph); - glVertex2f((float)w+x, (float)h+y); - - glTexCoord2f(0, (float)h / ph); - glVertex2f(x, (float)h+y); - } - glEnd(); - - glDisable(GL_TEXTURE_2D); - glDisable(GL_BLEND); - - return 0; -} - -int -SurfaceOpenGL::draw_part(float sx, float sy, float x, float y, float w, float h, Uint8 alpha, Uint32 effect) -{ - float pw = power_of_two(int(this->w)); - float ph = power_of_two(int(this->h)); - - if(effect & SEMI_TRANSPARENT) - alpha = 128; - - glBindTexture(GL_TEXTURE_2D, gl_texture); - - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - glColor4ub(alpha, alpha, alpha, alpha); - - glEnable(GL_TEXTURE_2D); - - glBegin(GL_QUADS); + glTexCoord2f(uv_left, uv_top); + glVertex2f(left, top); + + glTexCoord2f(uv_right, uv_top); + glVertex2f(right, top); - if(effect & VERTICAL_FLIP & HORIZONTAL_FLIP) - { - glTexCoord2f(sx / pw, (float)(sy+h) / ph); - glVertex2f((float)w+x, (float)h+y); - - glTexCoord2f((sx+w) / pw, (sy+h) / ph); - glVertex2f(x, (float)h+y); - - glTexCoord2f((float)(sx + w) / pw, sy / ph); - glVertex2f(x, y); - - glTexCoord2f(sx / pw, sy / ph); - glVertex2f((float)w+x, y); - } - else if(effect & VERTICAL_FLIP) - { - glTexCoord2f(sx / pw, sy / ph); - glVertex2f(x, y); - - glTexCoord2f((float)(sx + w) / pw, sy / ph); - glVertex2f(w+x, y); - - glTexCoord2f((sx+w) / pw, (sy+h) / ph); - glVertex2f(w +x, h+y); - - glTexCoord2f(sx / pw, (float)(sy+h) / ph); - glVertex2f(x, h+y); - } - else if(effect & HORIZONTAL_FLIP) - { - glTexCoord2f(sx / pw, sy / ph); - glVertex2f((float)w+x, y); - - glTexCoord2f((float)(sx + w) / pw, sy / ph); - glVertex2f(x, y); - - glTexCoord2f((sx+w) / pw, (sy+h) / ph); - glVertex2f(x, (float)h+y); - - glTexCoord2f(sx / pw, (float)(sy+h) / ph); - glVertex2f((float)w+x, (float)h+y); - } - else - { - glTexCoord2f(sx / pw, (float)(sy+h) / ph); - glVertex2f(x, h+y); - - glTexCoord2f((sx+w) / pw, (sy+h) / ph); - glVertex2f(w +x, h+y); - - glTexCoord2f((float)(sx + w) / pw, sy / ph); - glVertex2f(w+x, y); - - glTexCoord2f(sx / pw, sy / ph); - glVertex2f(x, y); - } + glTexCoord2f(uv_right, uv_bottom); + glVertex2f(right, bottom); + glTexCoord2f(uv_left, uv_bottom); + glVertex2f(left, bottom); glEnd(); - - glDisable(GL_TEXTURE_2D); - glDisable(GL_BLEND); - - return 0; } -int -SurfaceOpenGL::draw_stretched(float x, float y, int sw, int sh, Uint8 alpha, Uint32 effect) +void +Surface::draw(float x, float y, float alpha, DrawingEffect effect) const { - float pw = power_of_two(sw); - float ph = power_of_two(sh); + glColor4f(1.0f, 1.0f, 1.0f, alpha); + glBindTexture(GL_TEXTURE_2D, texture->get_handle()); - if(effect & SEMI_TRANSPARENT) - alpha = 128; - - glEnable(GL_TEXTURE_2D); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - glColor4ub(alpha, alpha, alpha, alpha); - - glBindTexture(GL_TEXTURE_2D, gl_texture); - - glBegin(GL_QUADS); - - if(effect & VERTICAL_FLIP & HORIZONTAL_FLIP) - { - glTexCoord2f(0, 0); - glVertex2f((float)sw+x, (float)sh+y); - - glTexCoord2f((float)w / pw, 0); - glVertex2f(x, (float)sh+y); - - glTexCoord2f((float)w / pw, (float)h / ph); - glVertex2f(x, y); - - glTexCoord2f(0, (float)h / ph); - glVertex2f((float)sw+x, y); - } - else if(effect & VERTICAL_FLIP) - { - glTexCoord2f(0, 0); - glVertex2f(x, (float)sh+y); - - glTexCoord2f((float)w / pw, 0); - glVertex2f((float)sw+x, (float)sh+y); - - glTexCoord2f((float)w / pw, (float)h / ph); - glVertex2f((float)sw+x, y); - - glTexCoord2f(0, (float)h / ph); - glVertex2f(x, y); - } - else if(effect & HORIZONTAL_FLIP) - { - glTexCoord2f(0, 0); - glVertex2f((float)sw+x, y); - - glTexCoord2f((float)w / pw, 0); - glVertex2f(x, y); - - glTexCoord2f((float)w / pw, (float)h / ph); - glVertex2f(x, (float)sh+y); - - glTexCoord2f(0, (float)h / ph); - glVertex2f((float)sw+x, (float)sh+y); - } - else - { - glTexCoord2f(0, 0); - glVertex2f(x, y); - - glTexCoord2f((float)w / pw, 0); - glVertex2f((float)sw+x, y); - - glTexCoord2f((float)w / pw, (float)h / ph); - glVertex2f((float)sw+x, (float)sh+y); - - glTexCoord2f(0, (float)h / ph); - glVertex2f(x, (float)sh+y); - } - glEnd(); - - glDisable(GL_TEXTURE_2D); - glDisable(GL_BLEND); - - return 0; + intern_draw(x, y, + x + width, y + height, + uv_left, uv_top, uv_right, uv_bottom, effect); } void -SurfaceOpenGL::apply_filter(int filter, Color color) +Surface::draw_part(float src_x, float src_y, float dst_x, float dst_y, + float width, float height, float alpha, + DrawingEffect effect) const { - ::apply_filter_to_surface(sdl_surface, filter, color); - create_gl(sdl_surface,&gl_texture); - - w = sdl_surface->w; - h = sdl_surface->h; + float uv_width = uv_right - uv_left; + float uv_height = uv_bottom - uv_top; + + float uv_left = this->uv_left + (uv_width * src_x) / this->width; + float uv_top = this->uv_top + (uv_height * src_y) / this->height; + float uv_right = this->uv_left + (uv_width * (src_x + width)) / this->width; + float uv_bottom = this->uv_top + (uv_height * (src_y + height)) / this->height; + + glColor4f(1.0f, 1.0f, 1.0f, alpha); + glBindTexture(GL_TEXTURE_2D, texture->get_handle()); + + intern_draw(dst_x, dst_y, + dst_x + width, dst_y + height, + uv_left, uv_top, uv_right, uv_bottom, effect); } + diff --git a/src/video/surface.hpp b/src/video/surface.hpp index bd0da7c0e..a5ba95558 100644 --- a/src/video/surface.hpp +++ b/src/video/surface.hpp @@ -1,7 +1,7 @@ -// $Id: surface.h 2175 2004-11-24 19:02:49Z sik0fewl $ +// $Id$ // // SuperTux -// Copyright (C) 2004 Tobias Glaesser +// Copyright (C) 2005 Matthias Braun // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -17,152 +17,69 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA // 02111-1307, USA. -#ifndef SUPERTUX_TEXTURE_H -#define SUPERTUX_TEXTURE_H +#ifndef __SURFACE_HPP__ +#define __SURFACE_HPP__ #include -#include -#include -#include +class ImageTexture; -#include "math/vector.hpp" -#include "video/screen.hpp" - -void apply_filter_to_surface(SDL_Surface *surface, int filter, int value); -SDL_Surface* sdl_surface_from_sdl_surface(SDL_Surface* sdl_surf); -SDL_Surface* sdl_surface_from_nothing(); - -class SurfaceImpl; -class SurfaceOpenGL; -class DrawingContext; - /// bitset for drawing effects -enum { +enum DrawingEffect { /** Don't apply anything */ - NONE_EFFECT = 0x0000, + NO_EFFECT = 0x0000, /** Draw the Surface upside down */ VERTICAL_FLIP = 0x0001, /** Draw the Surface from left to down */ HORIZONTAL_FLIP = 0x0002, - /** Draw the Surface with alpha equal to 128 */ - SEMI_TRANSPARENT = 0x0004 -}; - -/// types of filters -enum { - HORIZONTAL_FLIP_FILTER, - MASK_FILTER, - NONE_FILTER -}; - -/** This class holds all the data necessary to construct a surface */ -class SurfaceData -{ -public: - enum ConstructorType { LOAD, LOAD_PART, SURFACE, GRADIENT }; - ConstructorType type; - SDL_Surface* surface; - std::string file; - - struct Filter { int type; Color color; }; - std::vector applied_filters; - - bool use_alpha; - int x; - int y; - int w; - int h; - Color top_gradient; - Color bottom_gradient; - - SurfaceData(SDL_Surface* surf, bool use_alpha_); - SurfaceData(const std::string& file_, bool use_alpha_); - SurfaceData(const std::string& file_, int x_, int y_, int w_, int h_, bool use_alpha_); - SurfaceData(Color top_gradient_, Color bottom_gradient_, int w_, int h_); - ~SurfaceData(); - - SurfaceOpenGL* create_SurfaceOpenGL(); - SurfaceImpl* create(); }; - -/** Container class that holds a surface, necessary so that we can - * switch Surface implementations (OpenGL, SDL) on the fly +/** + * Container class that holds a surface, necessary so that we can + * reload Surface implementations on the fly */ class Surface { +private: + friend class DrawingContext; + friend class Font; + ImageTexture* texture; + + float uv_left; + float uv_top; + float uv_right; + float uv_bottom; + + void draw(float x, float y, float alpha, DrawingEffect effect) const; + void draw_part(float src_x, float src_y, float dst_x, float dst_y, + float width, float height, + float alpha, DrawingEffect effect) const; + + float width; + float height; public: - SurfaceImpl* impl; - SurfaceData data; - int w; - int h; - - typedef std::list Surfaces; - static Surfaces surfaces; -public: - static void reload_all(); - static void debug_check(); - - Surface(SDL_Surface* surf, bool use_alpha); - Surface(const std::string& file, bool use_alpha); - Surface(const std::string& file, int x, int y, int w, int h, bool use_alpha); - Surface(Color top_gradient, Color bottom_gradient, int w_, int h_); + Surface(const std::string& file); + Surface(const std::string& file, int x, int y, int w, int h); + Surface(const Surface& other); ~Surface(); + + /** flip the surface horizontally */ + void hflip(); /** Reload the surface, which is necesarry in case of a mode swich */ void reload(); - - void apply_filter(int filter, Color color = Color(0,0,0)); -}; -/** Surface implementation, all implementation have to inherit from - this class */ -class SurfaceImpl -{ -protected: - SDL_Surface* sdl_surface; - -public: - int w; - int h; - -public: - SurfaceImpl(); - virtual ~SurfaceImpl(); - - /** Return 0 on success, -2 if surface needs to be reloaded */ - virtual int draw(float x, float y, Uint8 alpha, Uint32 effect = NONE_EFFECT) = 0; - virtual int draw_part(float sx, float sy, float x, float y, float w, float h, Uint8 alpha, Uint32 effect = NONE_EFFECT) = 0; - virtual int draw_stretched(float x, float y, int w, int h, Uint8 alpha, Uint32 effect = NONE_EFFECT) = 0; - - - SDL_Surface* get_sdl_surface() const; // @evil@ try to avoid this function - - virtual void apply_filter(int filter, Color color = Color(0,0,0)) = 0; -}; + const Surface& operator= (const Surface& other); -class SurfaceOpenGL : public SurfaceImpl -{ -public: - GLuint gl_texture; - -public: - SurfaceOpenGL(SDL_Surface* surf); - SurfaceOpenGL(const std::string& file); - SurfaceOpenGL(const std::string& file, int x, int y, int w, int h); - SurfaceOpenGL(Color top_gradient, Color bottom_gradient, int w, int h); - - virtual ~SurfaceOpenGL(); - - int draw(float x, float y, Uint8 alpha, Uint32 effect = NONE_EFFECT); - int draw_part(float sx, float sy, float x, float y, float w, float h, Uint8 alpha, Uint32 effect = NONE_EFFECT); - int draw_stretched(float x, float y, int w, int h, Uint8 alpha, Uint32 effect = NONE_EFFECT); - - void apply_filter(int filter, Color color); - -private: - void create_gl(SDL_Surface * surf, GLuint * tex); + float get_width() const + { + return width; + } + + float get_height() const + { + return height; + } }; #endif diff --git a/src/video/texture.cpp b/src/video/texture.cpp index 98bfc91d3..a49a5cc68 100644 --- a/src/video/texture.cpp +++ b/src/video/texture.cpp @@ -96,12 +96,6 @@ Texture::~Texture() glDeleteTextures(1, &handle); } -void upload_texture(SDL_Surface* , int , int , int , int , int , int ) -{ - // TODO - assert(false); -} - void Texture::set_texture_params() { @@ -109,7 +103,6 @@ Texture::set_texture_params() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP); assert_gl("set texture params"); } diff --git a/src/video/texture.hpp b/src/video/texture.hpp index 8322e3c7a..3c8b4f708 100644 --- a/src/video/texture.hpp +++ b/src/video/texture.hpp @@ -23,25 +23,41 @@ #include /** - * This class is a very simple wrapper around a texture handle + * This class is a wrapper around a texture handle. It stores the texture width + * and height and provides convenience functions for uploading SDL_Surfaces + * into the texture */ class Texture { -public: +protected: + friend class TextureManager; GLuint handle; unsigned int width; unsigned int height; - + +public: Texture(unsigned int width, unsigned int height, GLenum glformat); Texture(SDL_Surface* surface, GLenum glformat); - ~Texture(); + virtual ~Texture(); + + GLuint get_handle() const + { + return handle; + } + + unsigned int get_width() const + { + return width; + } + + unsigned int get_height() const + { + return height; + } - void upload_texture(SDL_Surface* image, int src_x, int src_y, int dst_x, int dst_y, - int width, int height); private: void set_texture_params(); }; - #endif diff --git a/src/video/texture_manager.cpp b/src/video/texture_manager.cpp new file mode 100644 index 000000000..ab5788eaa --- /dev/null +++ b/src/video/texture_manager.cpp @@ -0,0 +1,218 @@ +#include + +#include "texture_manager.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include "physfs/physfs_sdl.hpp" +#include "image_texture.hpp" +#include "glutil.hpp" + +TextureManager* texture_manager = NULL; + +TextureManager::TextureManager() +{ +} + +TextureManager::~TextureManager() +{ + for(ImageTextures::iterator i = image_textures.begin(); + i != image_textures.end(); ++i) { + if(i->second == NULL) + continue; +#ifdef DEBUG + std::cerr << "Warning: Texture '" << i->first << "' not freed\n"; +#endif + delete i->second; + } +} + +ImageTexture* +TextureManager::get(const std::string& filename) +{ + ImageTextures::iterator i = image_textures.find(filename); + + ImageTexture* texture = NULL; + if(i != image_textures.end()) + texture = i->second; + + if(texture == NULL) { + texture = create_image_texture(filename); + image_textures[filename] = texture; + } + + return texture; +} + +void +TextureManager::release(ImageTexture* texture) +{ + image_textures[texture->filename] = NULL; + delete texture; +} + +void +TextureManager::register_texture(Texture* texture) +{ + textures.insert(texture); +} + +void +TextureManager::remove_texture(Texture* texture) +{ + textures.erase(texture); +} + +static inline int next_power_of_two(int val) +{ + int result = 1; + while(result < val) + result *= 2; + return result; +} + +ImageTexture* +TextureManager::create_image_texture(const std::string& filename) +{ + SDL_Surface* image = IMG_Load_RW(get_physfs_SDLRWops(filename), 1); + if(image == NULL) { + std::ostringstream msg; + msg << "Couldn't load image '" << filename << "' :" << SDL_GetError(); + throw std::runtime_error(msg.str()); + } + + int texture_w = next_power_of_two(image->w); + int texture_h = next_power_of_two(image->h); + +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + SDL_Surface* convert = SDL_CreateRGBSurface(SDL_SWSURFACE, + texture_w, texture_h, 32, + 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff); +#else + SDL_Surface* convert = SDL_CreateRGBSurface(SDL_SWSURFACE, + texture_w, texture_h, 32, + 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000); +#endif + + if(convert == 0) + throw std::runtime_error("Couldn't create texture: out of memory"); + + SDL_SetAlpha(image, 0, 0); + SDL_BlitSurface(image, 0, convert, 0); + + ImageTexture* result = NULL; + try { + result = new ImageTexture(convert); + result->filename = filename; + result->image_width = image->w; + result->image_height = image->h; + } catch(...) { + delete result; + SDL_FreeSurface(convert); + throw; + } + + SDL_FreeSurface(convert); + return result; +} + +void +TextureManager::save_textures() +{ + glPixelStorei(GL_PACK_ROW_LENGTH, 0); + glPixelStorei(GL_PACK_IMAGE_HEIGHT, 0); + glPixelStorei(GL_PACK_SKIP_PIXELS, 0); + glPixelStorei(GL_PACK_SKIP_ROWS, 0); + glPixelStorei(GL_PACK_SKIP_IMAGES, 0); + glPixelStorei(GL_PACK_ALIGNMENT, 1); + for(Textures::iterator i = textures.begin(); i != textures.end(); ++i) { + save_texture(*i); + } + for(ImageTextures::iterator i = image_textures.begin(); + i != image_textures.end(); ++i) { + save_texture(i->second); + } +} + +void +TextureManager::save_texture(Texture* texture) +{ + SavedTexture saved_texture; + saved_texture.texture = texture; + glBindTexture(GL_TEXTURE_2D, texture->get_handle()); + glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, + &saved_texture.width); + glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, + &saved_texture.height); + glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_BORDER, + &saved_texture.border); + glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, + &saved_texture.min_filter); + glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, + &saved_texture.mag_filter); + glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, + &saved_texture.wrap_s); + glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, + &saved_texture.wrap_t); + + size_t pixelssize = saved_texture.width * saved_texture.height * 4; + saved_texture.pixels = new char[pixelssize]; + + glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, + saved_texture.pixels); + + saved_textures.push_back(saved_texture); + + glDeleteTextures(1, &(texture->handle)); + texture->handle = 0; + + assert_gl("retrieving texture"); +} + +void +TextureManager::reload_textures() +{ + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, 0); + glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); + glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); + glPixelStorei(GL_UNPACK_SKIP_IMAGES, 0); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + for(std::vector::iterator i = saved_textures.begin(); + i != saved_textures.end(); ++i) { + SavedTexture& saved_texture = *i; + + GLuint handle; + glGenTextures(1, &handle); + assert_gl("creating texture handle"); + + glBindTexture(GL_TEXTURE_2D, handle); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, + saved_texture.width, saved_texture.height, + saved_texture.border, GL_RGBA, + GL_UNSIGNED_BYTE, saved_texture.pixels); + delete[] saved_texture.pixels; + assert_gl("uploading texture pixel data"); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, + saved_texture.min_filter); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, + saved_texture.mag_filter); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, + saved_texture.wrap_s); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, + saved_texture.wrap_t); + + assert_gl("setting texture_params"); + saved_texture.texture->handle = handle; + } + + saved_textures.clear(); +} + diff --git a/src/video/texture_manager.hpp b/src/video/texture_manager.hpp new file mode 100644 index 000000000..0b0854faa --- /dev/null +++ b/src/video/texture_manager.hpp @@ -0,0 +1,60 @@ +#ifndef __IMAGE_TEXTURE_MANAGER_HPP__ +#define __IMAGE_TEXTURE_MANAGER_HPP__ + +#include +#include +#include +#include +#include + +class Texture; +class ImageTexture; + +class TextureManager +{ +public: + TextureManager(); + ~TextureManager(); + + ImageTexture* get(const std::string& filename); + + void register_texture(Texture* texture); + void remove_texture(Texture* texture); + + void save_textures(); + void reload_textures(); + +private: + friend class ImageTexture; + void release(ImageTexture* texture); + + typedef std::map ImageTextures; + ImageTextures image_textures; + + ImageTexture* create_image_texture(const std::string& filename); + + typedef std::set Textures; + Textures textures; + + struct SavedTexture + { + Texture* texture; + int width; + int height; + char* pixels; + int border; + + int min_filter; + int mag_filter; + int wrap_s; + int wrap_t; + }; + std::vector saved_textures; + + void save_texture(Texture* texture); +}; + +extern TextureManager* texture_manager; + +#endif + diff --git a/src/worldmap.cpp b/src/worldmap.cpp index 45cc1bdb0..d731b4ea9 100644 --- a/src/worldmap.cpp +++ b/src/worldmap.cpp @@ -352,8 +352,8 @@ WorldMap::WorldMap() tux = new Tux(this); add_object(tux); - messagedot = new Surface("images/worldmap/common/messagedot.png", true); - teleporterdot = new Surface("images/worldmap/common/teleporterdot.png", true); + messagedot = new Surface("images/worldmap/common/messagedot.png"); + teleporterdot = new Surface("images/worldmap/common/teleporterdot.png"); name = ""; music = "salcon.ogg"; -- 2.11.0