From 3a668299335324477a4163316dc6d6ea868f9778 Mon Sep 17 00:00:00 2001 From: TwinAphex51224 Date: Sun, 12 Feb 2012 15:23:35 +0100 Subject: [PATCH] (360) Working debug fonts --- 360/file_browser.c | 2 +- 360/main.c | 2 +- 360/media/Arial_12.abc | Bin 0 -> 19508 bytes 360/media/Arial_12.rdf | 18 + 360/media/Arial_12.tga | Bin 0 -> 262162 bytes 360/menu.cpp | 10 +- 360/xdk360_input.cpp | 2 +- 360/xdk360_video.cpp | 172 +--- 360/xdk360_video.h | 9 +- 360/xdk360_video_console.cpp | 293 ++++++ 360/xdk360_video_console.h | 100 ++ 360/xdk360_video_debugfonts.cpp | 971 +++++++++++++++++++ 360/xdk360_video_debugfonts.h | 134 +++ 360/xdk360_video_debugfonts_.h | 935 ------------------ 360/xdk360_video_resources.cpp | 221 +++++ 360/xdk360_video_resources.h | 158 +++ msvc-360/SSNES-360/SSNES-360.vcxproj | 20 + msvc-360/SSNES-360/SSNES-360.vcxproj.filters | 12 + 18 files changed, 1962 insertions(+), 1097 deletions(-) create mode 100644 360/media/Arial_12.abc create mode 100644 360/media/Arial_12.rdf create mode 100644 360/media/Arial_12.tga create mode 100644 360/xdk360_video_console.cpp create mode 100644 360/xdk360_video_console.h create mode 100644 360/xdk360_video_debugfonts.cpp create mode 100644 360/xdk360_video_debugfonts.h delete mode 100644 360/xdk360_video_debugfonts_.h create mode 100644 360/xdk360_video_resources.cpp create mode 100644 360/xdk360_video_resources.h diff --git a/360/file_browser.c b/360/file_browser.c index 3254db7e05..716a9c4c47 100644 --- a/360/file_browser.c +++ b/360/file_browser.c @@ -32,7 +32,7 @@ static const char * filebrowser_get_extension(const char * filename) void filebrowser_parse_directory(filebrowser_t * filebrowser, const char * path, const char *extensions) { - BOOL error = FALSE; + int error = FALSE; filebrowser->file_count = 0; WIN32_FIND_DATA ffd; diff --git a/360/main.c b/360/main.c index c5c9544a94..d0e393bd62 100644 --- a/360/main.c +++ b/360/main.c @@ -235,7 +235,7 @@ static void get_environment_settings (void) Mounted[DEVICE_MEMORY_ONBOARD] = Mount(DEVICE_MEMORY_ONBOARD,"OnBoardMU:"); Mounted[DEVICE_CDROM0] = Mount(DEVICE_CDROM0,"Dvd:"); - BOOL result_filecache = XSetFileCacheSize(0x100000); + int result_filecache = XSetFileCacheSize(0x100000); if(result_filecache != TRUE) { diff --git a/360/media/Arial_12.abc b/360/media/Arial_12.abc new file mode 100644 index 0000000000000000000000000000000000000000..f24f2f135a0ba4146d364bb81eeaa594d8dbce89 GIT binary patch literal 19508 zcmeI)S!`8R6b9h`RG}^Oa%de%pb9Os${-XJkV%9J7EmUcm04&(MzLkI zOr<~s3}KR(7@3SlBnmMKjv)$)10fnsDE@oxLs{?epvfw^mwtEcv(G;N8E&5zfC|~W zfwnV&ECAVsK%JfZ<>r0@#NamEjtZ!VSi~V7l~5T8h@c9hsERv~h-$bKNvMuw)Id$7 z;4Y-%Zq!0;)WJQt7j;n&_0a%nxDV;L9}nO`JcNd5gvMxsrpQ1uG)D_OjFxDH*2u&o zcoc2WmIsoJc4&_d=!j0}j4pT#kK+k+MK^Ru4?KyU=!G2gMjt$dr_mSv&>zoW00v?Z z2H)JFhg%Q9vlzR z@iHc1GNxcEreQi};1z!QDrRC9W@8TKQu8n$uVDceBA+V2A}q%1Sc0Y0GAzdmti&5w zg*Q=%BCO`8Yp@pUupS%m7FCRm*o4j4f~`~uU;q7|Z798Ei`;(8X0nMa0ZYIVummgt zOTZGa1S|ndz!IAz&wjQ&f-!Sy2u*n7a)&!0z+6UXusukQ zFa5sq2lPpC0`~x%qR)!``TCmvS&hF$|Dznk9viXjopJs8h@-2aV|ji_bX}?Y_0^Z2 z9B#ayzbTy+*4_2pj_x7$>+eYqQXWE&68rUzp{J?(47xz<_qUiXQsY({<}PL4PUZecoTu7sP)4i}c?zJ}P+!>>?7u03LsWT<=l3I=h8{DY@$* znXV;u@7i>O(C+?8qnnC-J{fddHD4CpNnBCxw=PtU%wJiq|337P(C&U4N{ zP8{VG417ah49C0m|3d$z9K*gV5k7UUUq4YgMLCtOCytZ#H=rAf{qZ-UTVXuUkFRIa zoz(W7=^Uy1^VgdmCax;$8%~c^^>Oq}x{OtK|IDTrsr@acSIPKzc^($h>!j}UT2Gg# zdMUj(T#w6ZAN{Txf0#Zl(=e?G^sZ%l%8g7Nu8 z=p^JzKJNKlovszyU7xk-H05+ULv7!jZY}o5mr1vi@&5av1Km~XKL74?U$uRIdbrph zUoJgCw)gkjL~4%mTza|k3c6T%BfVRB4}F9#<5Mb;$8(JSO!nuWH>c_E#Qyp61O1!w zAM{n_7(Q*PaF1Y$?)*pTBos5hisAiUz)nT3UNQWBF5vy{>Tyy}9(P3Sf<-mfQ% z?xx&>9-usk&Ql&uPgR~yFI3K_i)4RMdA_Zox2gJedcX2P`k3+w`n2*H`aI_=I5XpBJ6!o??If=FkI` z2h$^!^XQ4nljvE>v*`smP=5aM>7`Ql=WiKZBz1rOR?{1mH&eT0yg&Xu^kL=q=ns`Y zqR%LQLI0q9p8j3=GJRD!1_znvNy*baFQasdaw?ssoK81WZcewy$@1q{2fCMXZ#q}T f`|rOI^ki{W?hE`bImo=+_Wt}Yq*v16-+TW8-c0fk literal 0 HcmV?d00001 diff --git a/360/media/Arial_12.rdf b/360/media/Arial_12.rdf new file mode 100644 index 0000000000..8321cbd73a --- /dev/null +++ b/360/media/Arial_12.rdf @@ -0,0 +1,18 @@ + + + + + + + + + + diff --git a/360/media/Arial_12.tga b/360/media/Arial_12.tga new file mode 100644 index 0000000000000000000000000000000000000000..e9061f54b054657deb943c962e484c18d2233985 GIT binary patch literal 262162 zcmeIb-K($1b?2#`KR|cB>%iPJ41FP(+?*yi>Cp6~FAPn3LQW5X0m0x2R)>ibB521L zj4q6E6e5B+IE^tz7-5VtPEdpq2g#N#zhHISk!6n)t7CgCXX1XDjOom{?MXcAQ)hka ze1Gd#&&zM`ea_kE>{?K}Ue;@^s#;ag^Lw6WKlIRl^H7Js_t4+_Z~wbqn}z9t>4E8i z>4E8i>4E8i>4E8i>4E8i``-gUjV>tN|Gk+#m>#%)JfL-_+$~qzQtq@WFVWIo;TNLe zl}JAY$Rm9+673cKmuL`;a@qtx69u)CKOw|Qem!unMsmI{M*XcTJfNJOa)oNkZyEt* z=ZAI#PBX$^rnZN}7`K-(ba+ctYQLd>M{1Cd-F z<)u02{Pgkp!s~d-Rc@_U`t#JQ?4|maj<)t}{W*Qb)w&S)Zp(MR^BwT-HG=oj24HWr*Eoe;AB)sz$Rj-&N&SrC zrGtO?Yrpnu&0c&M*1cXV{M5VN^{$`R@uMy1K2>PF+Qwb;BM{IF+FZkjE|;h{V6npGUwLf{yXX8f-UGcnER5i9NiFIAV~CL9=i7E?EC}zimUb7 zoqw)1$Q<|bK=v!F{SnX}^u%OAA7f-nuEhYx`KM)FZLR-KUu_^JAWzB%d1o2Wu}^f_ zITsJsKW#w92K2xq_{|^u;0J$0-!wPB|NZa(bs(44zid@5Id?OERAZ8T`mQN&abD}D zJ1zP1uY6t>oKh1ap787W%d#mJ;ON92}9#=qscj8iB^TR*UUYPxmEcSJPb7@=K z=z%us{}YIW8tre?jrT+Q!U3)5X%r7Jij?c=6WPu_ zvIKn%=3ddxhRC$Jvvdt`dT!#ZMdmFMR1sU;59?efmQF zna_OYM}fz8qccF0!=J#D?ghNS8U$=@X{`HMh_x2ReLYf-wX8|%#pouBKU!0ilTNfB zgSWIdn$~!mp1m8u9+%O|8Y>&~dJWL8L6~0xlZ9;H!-{hm(~fin4Q&?%&6E%(JuY_* z=X8|Ye7F9)jrfc>PU4!5GKYP*SbLuP~w+# zk&og4uzx&ZBuN}pRpsz8Y#~$W^&f@6T`IWY`!|x%b zDXW>f;dc7jALh}TsWz@D={lAQ!HoXB;I?{s4}ZP)FMh@s=q6ImwAK#JVToTfZ;8T- z?B9yJem@{^#F7e}*P1Pwdv;zx9?<3+^Me%imSl|T5GK69T!dD0DBAnnHu<7IZ{AEn zM<$oIhI2Z~FTD2JYd`tcx4!k0D8CWO<1qNWAlD4@5Q3e|dqE$AXlOhd3-h;VYu?62 z=Lh_b46S|Ih0{5q2FK9}gmEA4y{7HP^4- zi1b_}#^idWD!<1q%_r?G16sG`U_L{uBn4TQ{HUG_n%IyaJuYkw=X8{x`0|&({2xhC zX3xEo>mPlBuWHPqq1#)0rLhx_a?Zg$-s_xQcvW5W4+O|jQv4BP?*HEk{E{7kIs&nG zxknV^{U7?Xz)0Vk?vaizLxmvPYtP!fe{}VDs#qIs{kJ>C?iGD9Y1F6oT!H3M-fxBO zg_Oto7PR|?(B^#k^+1f)zs?I??@}T7-ADa?WXk70)VrV&B)#NE^<2=zh6MS=g{|S7 zjrxm`rpol*nAd{xxL>DLL6UpRh-u)&fA=S?cP7U zdw&0uZ0YiRsef(lYVG@(JD4TU?fj(Xn~iHf_jy|??|PRCsYkY+DqnnO&6`mJh@&j|NjotugCUQW5PN4$Lx=mun=jHT$6KT3RM+({|>d2)>}`bofG zT#@rp_Vy*vbtL%QpO$`mM^=T;$qqX=R+`_a_mzTxzMKW*1J6ftdUpf4rpx6x-4g$3 zto?pxJF97(b|F!)@k7tjxwEsR-LmP`dS2^2Pkxl7qu`?Y(5if$ zQIik)^MXuS%tL|fU(?n3lYWhM4cG6fYJDQu`d#Bny9Q((YQ2${wSQxv@KKF>p3lFU zcK-pn)*iac+Sj-ulJk7~ozL&tqF?6$*#%uBp2yt__4j}Hbx%n$KBM!I_4gvqg=^!D zOB#d`?hDzpm5aUVsO{jd6=BaY59-+Dn&X-ro;p7yVk95jtE08tiK7rSBmra4?h|g< z;pas0N>&#ih~Ab&UB31{h|!h({95vi-~`GckanQJ)n2~Hw?eDKLyDFjGq7dd824? zPchHpW3|s%E~MD{g`-27(kX()<2n3ZSGkTg*KAyG3tw}MAMz?xTI#^od~?2A9Jk^y z5#mdBi~~Uy7u<7%DPH*{CdAb zU*oynUbPNAq4Qzh5C1~o=ril$PQrWNeDlr!`}cnD_c+sNkGhlkrtIl~tLlMv#*fZx zk095X*!KkCx6UUQ;YW15Bhx>NeDC$lMd+R~rU$O72NVlN>rJshvEgp{Xr4vymZztl z>4E8i>4E8i>4E8i>4E8i>4E8i>4E8i>4E8i>4E8i>4E8i>4E(o;JK9gyaT^4^DK;m zep}kgorh;#M&C!K4O|88TR#=4>ZrCE%e`RsPLrdrzd1 z@1yw$>b#)72GX;X!>{L{mgHa???+S_e7ES)NDoJW#0@LB!#hj)nI;TkP|)0i@5j4RIv zn(s%yAG$2oVSm2`e(I6dV#nh2@OL3X#!?I*&NmzNOp|PAjF0;Jvm<8KNWS~R`M_aBe$Zz7 zNF9pP<>0gKP;xqn{56p=>?Z#!TH(&RD)>wDzNI)EB=7kc>t*c;{67(2eYEcp*}s_H;E% zM$bVE)?>Ftj44m;%7vCZwJSeb_hJYFcm!%*%!6=9e?lDSvU5!SEM@lgtot>h&6+fA7}Ue$uvB zW`6wl(eBp(5`CagyvPGGe!Us(4y(LDSY?X$6h85ML;G3!{@X5}7+`%wuaEOcpX8En z;hnb8Go~bLQG6}>v0-!u{uSmYV0+TXu_2Q7lhzk#d^|N4=t+9rQ-ZWXwu65kWkI$p zUPQHl(2}QirAZb(VweJs$! zxF{}5FS*t)^N;ZcYz$0XEB3QLx})VMvLWZ~A6JH~H@WUX}fb zIKf)y9ix8}>E%es#(#p5Ug6%Vxrz^>k>uyF5wGZKE}7(e_?*7+XdJAM_<=Q}`S_tI ztB*d;oBBi${IWZWiy-o0p7Y;*?1Em^9Lsb0mja1SUz_ja{HeI&N^B0eojqRUoNGAE zJNQ$F)}!oEyXV4@d%Mc5UGWy#j0=6TaZx;jr_skB@o(kOGoIXsZ!+nJ#=gV>Xh+a= z$bazqdEOX4uCYJ|eNulE!*uqhU9q?k#h;KvQp`qdJ5Okz%4^XsH}_C@psOIUi+Ro$ z>2?0j6OF>xGXnI)0_MQh8ip2V{gLpfBirAP5^6P1zQ{V9N)Kb_p}Zpv``Cpn6ijXu z7ol^H*4xV7z?r1aWm_*Et5Dk3zvg^b7KJjGwVwMsu1@P^^kzc-2u{Iw(VSsyZGAoj zOV0HuYYaO5Qo;D#w!a^h_DvFer87A)lHO^(+`mU<{(3!mJTCVb%X-(k&3&5R`o@4$thzoSNO9kr-??VA6R@xS`Dr1ARR4{hJi zwdc?_I0r%tpr`FK#2$dXkNL`+DRZ$gob%6tF7y!xEuL}S^u9x~3fONp!P|c0MJBQZ zW&d{_#(q1-=05(Nl+WB<+ojd%}i4?$j++`W9FC$BNI$?bxy0If4p z7bMPYI*?=dBI2Oh*Qe3rU#XFN-y0C{F^yxc>%UC?8mp@u?OnB9a~VC-*>jDZokzf3 z1ZYkj#R2wEot;flw<+4T%CI#V+K=gUS@*A+9Ox@lKcTa(eRvM&RG~f7Hx+Zi;ZM~W zN2814t+TSOIV7v*wthL=ICRozblJTug2Zd=k6Tjt6u-p4)i#xo3Nict6Pa0=nkJCbgx%-Uzv@0fz(sIU>tj zc;;98)~DuJ@#8?`;g|)%NQcDuyoJv1D-iS0KY}Wg`iQpc34GsQbe&C~bS8k1>m2H3 zFVwYLKl|JG9M~aQIbZ%&G5o+5?D3?yW3n~&i0QwLAw>4WPaog`m=DqRBn$=($De3B zNIE})Lr&s-4uNV=c?b1q>L51BB;SJGNBrn9fN_z35FCP(By&sO7G83c6I=VWV`t8S z`KtD-&nNgZjqcODME{n+`<@1UP_d`-*nWe)dLHTIX-kUh*%n@eM{ywKjntajIN=yV<a`S!OV;LB-~e&g+D|2!M~MdD?5zmCcE$v0>n zil%YZ*S0a^=PrN5nRa8#ry}{djK~k#{2o{EUg-Tl?9LR~Ds1+VI5$`u2<`o$oQZb9 z7G89o6MqkU&RQ#L-+cw|NRN+&{<6g)?lyQ{T!z_$=bz-B+9HefI8 zlsvlT^7*>R>xkr!tV2gf3-*xqKQJq-e^NX@S-&A>+cZ@SS@WtpFBbpCjWY0x@r}{wIU961yUFT>E;~;UdmB z58~XJeY*cWKx}6&|2c`$6 z2c`$62c`$62c`$62c`$62c`$62c`!eFb~xG!du;2qhG^uugUSFXGR=Pc@I<`>bjpz zKEk`)im%V4RJ`-5Oy5S&t8ov0>G`HAx7N8|xAwf#l1}Vcy02GtjOx#9=%qjJjZ}GG zk2Zc|mG7h2pweyC#YbLg9k+$|`<=)cfy;;9f!{?OuYP%(%J6|#og98a#XT2@hlPy1 z+A3X;RNiVQG;93e*PuTt5=7X&1#9$6IOb#f-5G*>ZhW}@B>?&@LlQ5Rmgh4q{KgOb zGwKe}R^@hdK9|mSX?<)ue!v?|54Cp|_)XoPSEp?6IQa9k@Bm$IEtKcLM={_!{3D(A z+x|&9u>qUyU5k<4Hjea5?;F9V=L*vIFNSSCe<9fg^eK`<=ZnUQgKiD~MLqkFyfv;< zZ~V|jxqi#wdBy?Ae*KG}X=|}H=AV>J`@hg!gD>jOM-se6ICSNElkZFKDNQ}RL@*2PBmh#>m;arXBg z2kv9g0V$7Xs{}1>2%qm<(4YSyQhx_1_0WE>{-F`Cz1zV&IG76y{6V$~>I!<5))?04 zN4UE0qeExq8UsfBYqo&vJQVV5As-&>$>5>S1TR2y2OArm+dB^0Oz;8yU2ceSo;4cH zE!y*4O1=Z=0IESWN^Z+F?{XiZ&7tdLz1e=>%CrHe>I?<_y?_P1*wEj>x4G8#Go1%` zz7RTy6IAbcGcf)Hekpa{0j+T4Lc1K{`!`XoKZ?O^-OvtX%twaD+DG+{l+CIBy?iNl z|3e4Zx$lOIiJbFP_g~WdkQ^`@Ie%h{$AAOg99yo_o{^0k{6V@1O+SBvLTQm08o_{G zD9Jfx?W6OEpT-U7JbITh=+V#ls^Qd5C2{0}BmNwl&m=*|M_v5l?cZ|o^&q+uvtJie z<|Db1UvYjG?>aNyd`J4o6?bxh}X)TkAcZB>&4R{Ky!=mX9mX8vOyz&r0dPn<0$;)qP(&4)~K+ zxTU=FXzpiB{*KP7YKJgok_$S2G_>)sF>KdnA^@MM^A7e9Xs$)--<-Db(*6U##7bt* zeU3pF$@h^y=IK-L>|0!CjlSKpODD2)O=0_;>kaX@&#D*?z3p|~e&{0MyAh1~J))y+ zi*^g&_iH;hx459b=3MzIx*~ydh^^z+`}x}EbFLrP|gDH>lH z?=d6@tIvnL=$8#U`6Z|3G6Q>+Dvj6I=sS+Juh>ST*{B%oGF9&U(XhuB_&N`B7|1c` z*Hvly9J#-8q}X_i9EMXgqJlf zz2q$(>YOV>7-!a##Ut6}yef-LG~PGSDBq&p!aov%`aGl@>HV4y7UyaAdlpe`(EkU5 z=7SUlwiP7)aut5F*)Vu7$@b&!4o+ez+nS(kPTVHQ!JpOxR!!b#3S)+Y8sMhcj(!WvN$AAKI;0j$X$khi7-9_FG$#>d_i9N4sFbN_Cs;t2u< zyi4D!Zfjq0PiMy+dR+%){9V^z*NJ>&e(!tVYyX>z@>z7c&&<}J4S5w_RjkN;?x`U7 zmyuqLRDE3SmaIxgAC{n>lWkvR{&R2fY1)8=SSOj#_W7rML9qZ_r0XIcS$4J%_ zfqaVo0X9~nv&x9y`>3+?kstB&hA4m^(ZHC{$)hfMVt3!uL}2)2J?Zy9WP6O3Sm`9+ z0|&qV;a8I8k%TT>hYIaFnK%7j5(F7D*;6XS^7%@W!T8&nY}XDTY+ZR@T~6cYPc$ky z-pjA}e9JY`c$kaYQ!HkI8^H(gheNJm{)Z?$qu(kd=a+Qu7r*Qvcd+vWbG`!ig?c7B^J!o2W)be3qW{&YIZ?_f>U*wzI^0i3P7rE`3X=gw!km*SLc zY3B!BGa$owyGZjH_`0_>8M^P_^AcH_uX%q0{<WRkXq7z&1SeFMWVL;P@l>3J zka8Jgk9AA3Fo!c%AIluG+Rx6vR6qv83_5AFHDBmlrgIwY0@1ATCyw*m=OqjN0WYMj zU+gc{Pqqh(m$fU9Ny3rug{G7FqIpS+nUZ(zQ;pTzEly7ydQg?*AgQ z&g;=Lyf3AkCp@Mutcz;dDL$;cwSLf_v`I9?fTy!`S`WbTTJ3K5Kg_bk~g* znWKA_(L97T8%7M$r@q3Eo!GE6k4AE!hnM_R5U-zmk#Qr^9+`>-*j>T>zPCT8`mpMp z^#|7j%+<5Z@dwuW39$2CkO~tESdBv+PymFq05Kg&2Lo2$odN1b9 zMe4p;-}}gKH}DPI^TJu|+~Qfoui=*Zau%K?S(m-N_jOdTca^*!N2Gx~SpRyLEZ5dQ zcV=iS6n@CtbCO!4(B~XPPmL$gp9*dNM}Eq^h`7?b6~?$fPPOeU^cSi7;N2bs=RBC} z|12YOxp}l#^<3|~m3JC_KG(U{d9$nieJOhf&%My;B`A<;6WzOc7Yg9LFTMMf@#GIg zbk3X@@Jyu7MnZp$D?C@PcQs@m`8y(wp3hcyoK|JNiM8~;#L{{D-3xl4N1kN2T*|FI ziXBEgBb%0FNmsoF7|9i_@@_;FWTtSQ^Bs}V^U6-6@_|g`mL&X|K6pMAsgC7{r^|~% z)usA-16RjoG=`#I%11sxKX&5(%C|Hh;W-7GT)o#>-t+bMKt}$NP3U_{?>gK2?{#fK zH=9 zE+JsR*X8;=R-?^-=^z(+ByS6U!0T&2*XD~M;7sek3(kV(r?)T66(>0=FO2)*w^xW` zd_y4m!F$rw>B(tuf9qYrd7QQ}64c>ny-oqu=w%`Th;s zBGq#U^3}D`_=0c0+ldJJNTd5}BB^pl*Emn59H;ejYoIR_I8QZQ_=D>hkMD`AXY<}4 zjVW}Bg&>p9?e09%H^_YqI{k(YbP4*{cIGTttlw*sWRiDrr`RGUx|h$pp;<`% z*x=B~qEUW%J7qz(AB=0k!Kb;ee!3o!OFsEX$B?HpTVbb7L3RXPN?>HqZd;6p{*Gix z;TjH_HGIcW(0J+`6udsK_UP;K(5s|I)yW0c7R3fab^d5&PK?@bag1@lJ>b#Y5#LsR z%DG>%*6b9`)^7mN?U5sScRTO*@7Vj9FN(DojqRD-uHK)F(a^kId={f=7j&LzkW9~S zh%oa$hetXVY}?X-KK4Puh+a6)JDu6mzGo*y5UVfZ6H4vmqw^x|f)S5!&FLk%g51uG%B~4Bf0ilosW&m&fk5C?=v}`@}A!S_Qih(U00BW(l{{4qyL2 zMm~?q^?&uX^eyFm{JP>nA(-pO%wrjES(e1myRiofch-^imo$bsjA8q#vv!au$r+6=^h3FW`y|f4BzvhHJ!`lv{1GpG z1}sL`Gr$oKN)kr6y=`kUz>VaHr~Mxz&A(0<1=?&r*7+j-QSM?E%h*+zJ8j}B9`ZfE z0ql`eRNu8~yYHa*ijUc2^&5cgy>3wN4|7cW40*0I{6zBW|8|Y<^ytd9FM7WQIHH$) zDNh|fCPzHzDCa%bAyLxrvJU!-F1KBKlLQQG5vs~wYDeE1j{E9s_z|wh_KeB@2qgw1 z9-&9Ly=`kUz>VaHhkm}u{L`F-m~x&^zX5-w>tfiE`xxvgOXSE-_#N8yOf6cy&)%^!2wXwR^rM&*|36Ycjx%c*R3b z45+p{4|~7QM|k#v%ULQ*Rv&j20s+qwC>H2!BDS6fqjWCGSZnWc)(WX(P0kulv4B1> z@7lhTjA5Ugl`puBvE_p`E?fz)gABj{!zd?u=`6SiJ zM|z;a4^H>RsE>X-f%Zd%_NAzg?1|a(05(DO*yueSwF zdvAwM=ktjlh_(vtTetWF;N1*+eyTn@@gZc(9%#*;D)%bXo6qBKl!hr{F#9Pi{F6E_qq7qufqrQeSv&G>`w#v zr+P*?*Xd~e51*sX=coDpw8MwA_Vw;Rehh-M&VBKYa^4HAF;2G7UcYr*Wr&u%;=Uhk z-;Tud8WpZbgTBosKI*hPG#vd00^#Y1&hWxHJ!JuXa~#iB1OB`CuH1Q-%A!?%%i-}i_c`Y~qKO9K!L{;W?$$m@ z&Z)U{DR+K!99*}sf4=?gZ)g4g&ynicynky&d#u)So;T|^tvG`>9^_IU)kk{dQ2c^V zft2yT2ff4VQEBgP`g?%1MLNqhfK(s6$4QK_cUJ4W5!8?975fmF_C(g9>w%8Gp(C(0 zzP0he&(Hwm8Bd}27|>;UA!wj;=;&y4+*12Lpzna*XH8-K-OKcium2Z3E(iTTMVHQl z*;jP`Q_cNs^Y56xrHnoFEr!S!x!&qpX|_Ux&PbXEeLg~vxX2Em@h<%dO86>t@<2$g za?y@xgnJl1LCUCWPqe4z5?k%TXD{MEUpM%S@kkpM|4&Wg8!bF`z3FoRTffZN9bleo zP2^twt(2qjfgb4lKl8=xkzIZb(9izJ6d)rL@=gJX80PtY^zLs~OGp@iJq|+kJblQ0 z4u|fGPM8IY0iv%Ytscll-38bAOFLuQ<4@v#nH;cn=41Z_?G221(0*9!TuO3WKdd>C z{rN)B3Yeq)oA|m0)O@n{>5kTa(arrS;G;!X^$RpIZgk7n}yAexSBqYd~?);?o5f}H1mHg7r=zccQ-9p4L?)Y-2b zensO>e3!l)d**sQpS2jR{YJLgSfj&vMAFX*Gz5*3+p?$J<=Oh`-;*l)pXBuzI^tQd zr|Z$YPM>@ugx-+g$U9x)+c`sx;GNd#6DL0$&=r2+)I8$(T3J(nR@Ty+sZTNB@q$12 zUKon2{r3)(Ldxe1!@BhK-*xI<9<0)5c15v6zh{7bvJpNT^8+2k3Vf#oZAeq*pBF1&ycr2TdmLPc%LBjMlRZ&;92UN$=-D=-c&} zX5&1GM+Jzc6QIPTSYa5A>r#rwxSq=`@*qnv;?eJ$#8SbBnCqI$Vp6OQBH1Z=k*M8uuF;@#jTb-n zaZqf-4%#!-wbaLwJ_xi9sjI!rJz|Fg*P&f^p{5motX@0xDcIIHs z1Ge^`N*>wQ@ch9K8IzEC!-ZwJ)20mQ9R2`)&2xwYS!vvswht(lGCyoz@NszIYhU}? zk4YiV@2woz!@ly|bI(B|y~^cZ)erazeN+#i^F-@jz7gGDYMy{Z)`6DW73L_uS6ZUG z&2e1n`W1hIWb>QV8aLy)p*3PQyFFb`$XB0y-ODoJ+WcZpYu~lCCtC86T*oib^lv9G z*bColz9yi{wee=)uoM3~Jg2j<=Bd^$IiU7D^L{6o-A9u3vd;aDDgM}8_jAAK$=~Y! zSIjY=p+|Gu`B>Zip2J}6``T(_Q{znVS3e+MrZ*nyG#YeYlxtn5L${L48I>ja)$e}y zyMIfHhChp>vr>;WoI8jgk3II-|0ADK4_c2G`1v#Pqxr>kKNd6|PkW!23PCUaC^qPO zoyRn-|FjDpKO-mWg=F1SJ8SfFp!Sl`gbjkDYbpGwIgY>}R1#0uGr)<4ywmA?DPNde z?MDan@MiL}$^nh$8ulu#m|X88eEqswM#-kY`Pm;@;BDX?@|yqXUVzD|Ym)ii=c?j~ ztz(^;nnL?SEIsHGcI3R(y(;&cSX*o{TKUj((UP;CdKW228pWhaQ+-?Uy01~`LVN>{ zL-d370PT%P-mh=RJpMaUv~vw0zW)7e=Beg7{sGcYF9yA!J(Ht-4jNyd&=VVi*vF50 zPw)WVmgUGgwDWG&L!HFj4@#xZbb*CiMlSp{{XXB{;cIflIMC%sq99m0dbFqw{lh-(oD%r(a7uhpijuQ7s;v)`v9Ii9k|tEk?(zdfL!tNP>tK%mTlDU6yqyGs+cXlC@)R0NyTejEBaY6h>&wl#CIUC z{z4yp$8VImz8S^0XzoBPX!H^mb@jg!Sz!%lWUY8T{xUA`kW*g*Vu5H!VpyN(KR~rh}?A)XOB4zE-H)(Erpzr(aZ+WKu zL7*8^=Icemud_#a3<%-qaafuQy&e9v^StwJk6viL_~Re{`2YK@-}bw?iaMBma6N z>F`_}-lj4*m1|zF*CglEyvn66z!%SD`jyD932~2eV!+b)VgE(>W~-a>-4@**{6)&z zqi@pO_JHOR``gl)_BQqTO2h)4g?+8L)TOzgcKGjvos#disEm)W{jveEfb%}KW8?Km z6Q&2I2c`$62c`$62c`$62d<6>IREJ!OTP76O!bU@N05xY=gF#f?=`4?BauGOt8KOJ zw6$DmFMGZE@04*n%a~Ptd&ldt`|+yVcb$8|z~Fh)J-%trvB01Al=rOvHkYK=euvt_ z+n;08^NQ#WLrGfzX@ekCaWC(d?7NLW&$yjBX6G5NyX}{$?=%nevCZcOPyNm63Ha>y zq&;i6&t3gCeM0Q$>sQZBDh}-E_Q9H0CHVHljveCfD#>}q?bI2U6zKDQ1GEOPK`~B~Ke{3hWo=+yH9s-B~f@gUyTF)|&=X0p6J;CFgWktjD4g(s| zUPOK)gnR)VdNwxd_}HO+AIkfd&!((Bqv!m0qRbrZHrq3O%*!oU;;r9u8_8MX#b;Zw zV~v*>um)?qb-YG$`nR@qcG${8$VhIBf6N!n2ju9v9G-m&zMGMJ-@~3Qbqx<4#0Gbp z&s3jOZ2r(YwB-0FBzS+G)wpkJ-Fq(O=U{#hbI>8<6=ylT9-q+RE@zqZQo6koP`Z$4M54CZt04K)r|(qVm| zb4XVkFOaWvd3Uv$ly8kNw3nyyW4&Jw>eMiz5 zw6m!MX|IEyeL?SV<~u|m7E|V8+oR9N|8DaYv)gYM7!jV+K{;i zDz9Y1+xN@C`QPc@Dchm*a>(GG<{DJ}Yqb6Rp7Z%9Is@c2z#p$LUo~FlOuwI$YqR=V zb7+*iE4!S$&KLbJ1QBbUdtLt~(#w&+`R_4j)+xr6DV?J{NIHmZL|5B7Qz_7|gFgH9 zd*FQitN$(=fBaG;?f)MYe>W})=!m3P`QCbu(B1>n86n7z_WveFa#JR40_jn%cI9Ff z-g(6-c++g$@;YR`kkIo1Xc6TJM$yB4YK??{a-M3nA|5dx^!eT$M%yIht$It(5 zed)Jt&YWHj{^upI4xqE~Fqz3FWO=Bvhg5byGA)W%T0Udz+3 z?#50opGQ85v(BS(=UpqLT=9^vk$2n$^11Gpd`@{ei1@7&U+(R{%cVSu1(k+aAUblz z5$I~)55^UICTM|5f2(!;xAHpGQfw2=`?NmsmzRUUf9DWA^7^-AZA}Yb^N;9Sws)u$ z@>?|K6H079IgHob&!unfu-k&6#zI5g9uYx&X25 z;qiXl;=c8_U$1k0srz=ihY}=PzuCI1i!S&6*;w?pP^NxMuj-x)cTxG){*Uf!ri``! zBG(eSe^<^{M%s!^zV0*k&Xz*ne@55eHvw0Tm#)96^H*_EuLh0Jho!RI`1Qg4KgN@_ z{t4al$$Jcb?GOK1b>3}0Y!y5bg|+Md+DGx-jlBCs&yeaK7zpgnG_qw4H=^I$wsrlF zUd}OsgYQUNT!qf>b%?&7-#J@E<55x^$(Z=B#2EQi<85=d_@nzvlV{|^(q=Av=-~Ii zJZCkTta+V}xjz(4i@*OD`Q0XKcbzhIL|5A`g3o18Uc3L#v%B{Sx?e_xFiO6;oA#~U z|9>%U^8LU6Mqq1S*HyCL<3K;ZXUzKx>t~}^49vO7cWVV#jko{ryj+j+XUj)(rnZIS zpmk{XY2@QdPn~#^_l9`}#;*ZJpifbMHIm>%I{Vx24=%Gm<7(Fc8lS7i z`vLhX@B6(GPQ;)1qx*fWko1uq!1buLxhDC@V62D>dG7iiG?Dz?_?oJYOTNfDblh4Y zsL|)JM&5D3Q2AU&Eh`q#FE3ZRyHT%wpdX`jH*6W{P%OYtUUu4kX7sb9erL=x0p|e$ z*ITuZeh-HG2^FvN#^k-d9;=VG>hiyGt}S@qsXz0lYf#!Uac*Ng1Zv-#-zz@pz3lmD z{WI6`JL4liU*>+a_n~@6tiXO^_ci?*K>g8r_BkdTxnjZS9?ezdWnNU!JXy;t5A{aR z7zwhCvEq!tIb#XdbO|@&6>crRNWPJ*%hD#dyDu(_ZF}u#&!+JVkDn#E$DHT;KMz6l zkNGs=a(ST7Kkob4vju)0yIdAOSl0NuSNVSIAu-_TNa{n)*-zH?lKZjG4}#5goIYV= z_#pJ}e(Hn9;(oGuWGk^iXLI_*vxQ6N`w{kL5$<$>V-z0rl| zpx3@%+{RzeSJ}I)v^QakzVx;G$jduBf7bc2Q~ZUHsat#IM4z|$+-3d!dF}hfef;&VaXtfc z?)6Ux!V^d9VuyFO`m-fst-ou$dwj9P-^MGDXX)=LW4)xmwzJ16Rh-xFTVHE_$$8PK zz47v_^TYjir^;>3WM8(*ZbPN@b6mwy*ZOYbKhWpjmLBnYo9ytmJ!SEE&b{3BoLA&7 zP+rQb367LmS*g$#5! zNUn0`0RH`KB(-_I#>;b-@RA;j~HV1YXHezIA`3w?4;&uQ?_L=Pau8^~ z(Ybw1&*FRDoFxPqLpf(UTs7Xu@PokLW70eam+hYmM=^i=3?NpYSMJX>{2C4!Yxp(X zo#bu%xAyLwL+zSHeguc@kvOxGdkpCNzG8&V6m%%*BRc~0N}lM*IS;ygXB_#+d23m` zBfdR2Xx4c5$~cgtZ?@#Q{WB?KP0#9go;9y?PkUWPWq#FoUmomPZC?0wlf_>@?;ea( zR5YL5rEBA~hTD>TuXwSme^bNOdSBNW6J8EF{K2|)II>&o-+WxJ0s1uqXJLW8XTrBF zM<7y-%UbUIBR=8RaL{bw&qPDN?V5}GBx`#5SlByw^!-|-x9XiQ8#})Sn7rXz#avzc zoA2?V!`e7Nw}xNCT~=P~I=Dt;Khd6I*Okn-8xR*b>a*f+#tp4eXM08RJ98E+W;ngd zm3&waVstumx@fHStl^Ncg+CJwdp}_JN!Ij?aEin29-;`cf4-*)rGArNDPGOTyx&*- zQTL{bzgu(ZUg>520_~nDdx-WX+fSYkJbv(f1s>qYZZ&|*RDJvkIso0f)|r8}c5>FepyEAFSKO82)qbDXM$Lb6 zNH~u=zgsy7-Dm?r?y!bm!y#i0zlOV$yxzBd9e^>pHg95gB;vyej_hU+2W&6*{RkP7 z*>rHm@N2Wcqp!vc_>OcXt&f$L;Q>Z`w=nCtE#AE{mgKZpt2iqogIIm&@)a)!xNEcl zl9M!7mRIvn_eSlE^~Zy2C4B9mVbB;jestDy{Qb!5eQ(zR>O>&u8*A0~6Q`#v^6oEu ztoh10KWJ)_WM+!&06J;3ie@br^N4Q`4w^OIy)u^Myrlh!7$`tzCdps= z&U0J)gLw|W;HvT7)VT_Ovaf_ANFOBEb*G;PLzwZwCiF>{S5s9$NX8wjfk;9?GB_7>#Ia?!01i8sXP) z&}`w)L&NV*{hPZ|L|Z0g1E>6k2d~HLtH%3D#Y6m=`%m+yx9gg#_zGXYqWD4VFuL~q zi_WQbra-pfe&m(y$~6r&2fcry@%(@ue{udAT+i#C6TF=VI_f?))H6kP0G)5G5FFL! zPM$c&ui;R>g+DJ%`$oT?g$6dVhphg;_;R1tpS!$Dye*#UeqSHBQedu`kFPU;2JL?< z`gj!fcDB{L4L(2H-jBT2^;YcNjhg&aX}o?wuWK(g+C2c@laBU0=;d?H0;${eP?p%$ ze8Ai36L*=`Ki8C>-x2?qr$^s;WZR;Cr-r=h7KBDU>{K?+0b0!mjxv2Zi;T+Ae z>MPFqH<^RP5$9)q(w1xg+bP3i?fu9b-8g`?wQ@k1l_Pq^09*U=wfMQW*MF0Bzaq@8 z%|x$Ua`xtHe0y-vjC6@t`FUxs?bO5mHhTZZ^)KD0y$ZZ-|F<)H`~L+CzQt$weFVhh zM_=Fqro)w3zHD2jD zFOA0n$sFa(b)J=!KFYN1fd`qF{hY*e{rCoda_xB|>$EW!*Y0Trx&w3YdL-v(-P2ar zel#7x{mAPb(A@I2wQ{9z`+P9ewO?f@7Pw!Lg^wpp51iEl^=yAuIg@XCV0vJBV0vJB zV0vJBV0vJBV0vJBV0vJBV0vJBV0vJBV0vJBV0vJBV0vJBV0vJBV0vJBV0z%rd4S(` z^}NBJX9akc!0G+D&5@PudkBR`{3CkWgdgQgJol=-`eW<2@;mA8k-yaD{@Jp5%f`xI z=YVvMa<@a}v&<2As~uauhi9vA&{U{;YJV&JS^6{bmD;NOi>#mWe@dDk^j?U)yG8pF z^zZHJ-5Q=v4r0<0K++%xRNUfOl69xsPyP1to%HvCuT;T@#R*$Bui3a~4oGzyGgSt5 z$gH!>5qP)yA^D!K_08#2-qT;vDnCnq5OvAsXlp&plWA&z81lqrUXaI_*yvdgSpP)lvVTM_$$W^U*c}=>J`$O271fgJ`d` z)R+EO(1_OCg0+LUQ)b=>Dvr8hd|Pu-uQYe!e>uG`^~f&ejD?!jEyMG>dXdJe9ZU*tGJoM#JSCTT;Y=h@l&cFkoL+_8~DsxI_@_di|5oajn zvwS!BGV^@Vzx$;*wUp<3t&bO<9DLu$d6`>5TgPCL{#5z*h`x7m(6==lZrj42Ow$Eg zVZrZ@@=XEXx5PqQe)FQP%PYl`<2l+}85iIz-wnRZJYUp&(EiT;AW$3Y49I!)#w}O$ zzkNT^-XnT=f{MgBP4Erm0J(l!PJKcCWuwQ`2GJq)Pkj?g?c@$ycxX?e!DsqjjrK7F zAjcI)IfmyeO?LXZ(P%7k>|VbrJesTSGtLC*x1}=x=bc8w+F;6eH-AS>EhSF>A`2+Mb;k01|!^W2d1`b>|m-m#`1yTVei(S zua45^NK3y(^?PFM{hVJFKjBYaa)yg#+f?*)P_`Wqt5e2X4kr^vqy^y=cM zZ^Dsp;mD?&bLHam`=b{||hxvsdo__dSmsq-!D000SS;&k=}S_qO+ZH~7Bg z(KV93Y00%gI7LbRIlBJm+6YK`pHJ{?(Vr^+uG4EkN4{9WwZ3oQ&r2im@(H=%tD5sG z*Z<;sPdzFW;>9Gkv?pXD#a9A#xO3krio^{#5z* zkiJiy?3?cuYq%i4r|X~JU|wXrHGeUdGHrqT2KGg|9!c<^@%*yZKiBWf)8d1#MaQcT zL!}#*d(x?w>Z9I?XK>Ztv7x*^no_Nm10s7JNf8rU*zby2! z(R209+f){gTy35^{=76US7n#ac(?s1a^XE^@2_+BLE?FYe(QJV6MPV)L(sa$Z^TV} zg+D!pM)d$LE02$}`h(%@?|OduMwGA7SfI@z-A5s&2A+hRy7mied!`t)3_11*xf$4$if$4$i zf$4$if$4$if$4$ify?dzUB`^_%WnI$Z+c*Q;CvqFziEV+gYx;rPVVV}>4E#e0|#qf zm9U%hz=W&qf$PzIKNs%(9T7U`L(UddT|B3;1}?vr*Z9Dl#lEV;>s$JGHfZTviY{kV z-jaPPo@ZM|de+*Oo|oZw55DVHdAG*yRGTOLz41W*wrM^~xb(howeGHbL)rH#FIQs* z^;7LbgjBS-t_tk~`QFr?Ddar?J%`Qn!@NhZ1v_NBp1tL_=sgbXNgayMs&`xSnfcNB zZ}FOEp!7U6{mFOk{&=r3lkQS`pp7x_`|SL7wK{XxzM;&V3#DWYD9ebI{8al8B^9UW zYtLc(`shM-6wtZShqI#E{!cst>|HL-MD1Ke8({A?)%DM_$^CuOMx1}>Yv4Y2R^uk$ zrSL$T<6(*NXQKRBtE=6ORhx2nNUAGe;}K2GFOr96pm{e$_OAJ;Z z!0+h%!g^P~crU`%}(_zuMbAHKT#FV`hDX8O-+rf3}0#o zzl2+AzpFet)8;zV|Ht^K_Gdc>tFOxYIrl8QCAQ#C&L8caEIB6X^7AN{9ptOusg^Fu zCC_zSzh#cBcGl+|W`MK4t_jL}%{L%6X!N5$=|kc-aq61!%;Np!fj+!pw&o-~SZZIx zT?U@V27BE+CInbw^x{f8fUkAXS@#ALl5FaXx)U-A` zLscJE8MA)5JbPR5p> z8+=1VejerU03#p&wzqczD}ax*bU&`eH<2eT>;Fci5%llK!jo~xZJuj?&P1C{0 zwSPkyWOPSKJ-f_2*!WgobK3iDf22Q4_pHv!8=>ab{{XW4;#_xpS@#`^FXhvkV?WU2 ziLJY(aj7!6@2~`;u^atv0Ds#D^qZ#rM(Fz9zoclk-xnU}^FiaweA8Smb52k;U%6NJRc{$dvbVD zY_NL&eK^YY`Z@^z_sGR`06d|H9 zk&Qo#&AJb`ao`k{ zo=0?7pR`pkG!?kcZ#vX3gkTHpkw*6ptBhH{ydG%d8|G;|mvZmHW#(!2vvzb3y{r#^ zzRmkY`8>Sv^ZX3wizOd!wIf474EXg(TRauNbUlyUN=tnYaK7PLiV^=_8GH0hntSU3 zU)Sts?VfSuYh!%bc={ekVds56dHp=RlA)Yfa3d1F!4D4Qfxho^M$YU0AB1tt)vfh$9^T8+|7pkcz*Y9Z z()oMqz8^k25ARj>`Rx1jz-9D+)-z}1wd?+o?dRbg$(wD{1JeW31JeW31JeW31JeW3 z1JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW3 z1JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW3 z1JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW3 z1JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW3 z1JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW3 z1JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW3 z1JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW31JeW3 Z1JeW31JeW31JeW31JeW316S4q|377zi*^72 literal 0 HcmV?d00001 diff --git a/360/menu.cpp b/360/menu.cpp index 73322d9268..8df3905298 100644 --- a/360/menu.cpp +++ b/360/menu.cpp @@ -55,7 +55,7 @@ static void filebrowser_fetch_directory_entries(const char *path, CXuiList * rom { filebrowser_parse_directory(&browser, path, ssnes_console_get_rom_ext()); - DWORD dwNum_rompath = MultiByteToWideChar(CP_ACP, 0, path, -1, NULL, 0); + unsigned long dwNum_rompath = MultiByteToWideChar(CP_ACP, 0, path, -1, NULL, 0); wchar_t * rompath_name = new wchar_t[dwNum_rompath]; MultiByteToWideChar(CP_ACP, 0, path, -1, rompath_name, dwNum_rompath); rompath_title->SetText(rompath_name); @@ -64,7 +64,7 @@ static void filebrowser_fetch_directory_entries(const char *path, CXuiList * rom romlist->InsertItems(0, browser.file_count); for(unsigned i = 0; i < browser.file_count; i++) { - DWORD dwNum = MultiByteToWideChar(CP_ACP, 0, browser.cur[i].d_name, -1, NULL, 0); + unsigned long dwNum = MultiByteToWideChar(CP_ACP, 0, browser.cur[i].d_name, -1, NULL, 0); wchar_t * entry_name = new wchar_t[dwNum]; MultiByteToWideChar(CP_ACP, 0, browser.cur[i].d_name, -1, entry_name, dwNum); romlist->SetText(i, entry_name); @@ -124,8 +124,8 @@ HRESULT CSSNESMain::OnInit(XUIMessageInit * pInitData, BOOL& bHandled) const char * core_text = snes_library_id(); char package_version[32]; sprintf(package_version, "SSNES %s", PACKAGE_VERSION); - DWORD dwNum = MultiByteToWideChar(CP_ACP, 0, core_text, -1, NULL, 0); - DWORD dwNum_package = MultiByteToWideChar(CP_ACP, 0, package_version, -1, NULL, 0); + unsigned long dwNum = MultiByteToWideChar(CP_ACP, 0, core_text, -1, NULL, 0); + unsigned long dwNum_package = MultiByteToWideChar(CP_ACP, 0, package_version, -1, NULL, 0); wchar_t * core_text_utf = new wchar_t[dwNum]; wchar_t * package_version_utf = new wchar_t[dwNum_package]; MultiByteToWideChar(CP_ACP, 0, core_text, -1, core_text_utf, dwNum); @@ -232,9 +232,7 @@ HRESULT CSSNESMain::OnNotifyPress( HXUIOBJ hObjPressed, BOOL& bHandled ) hr = XuiSceneCreate(L"file://game:/media/", L"ssnes_settings.xur", NULL, &app.hSSNESSettings); if (FAILED(hr)) - { SSNES_ERR("Failed to load scene.\n"); - } NavigateForward(app.hSSNESSettings); } diff --git a/360/xdk360_input.cpp b/360/xdk360_input.cpp index 3698fce409..1a9d9b3e9f 100644 --- a/360/xdk360_input.cpp +++ b/360/xdk360_input.cpp @@ -27,7 +27,7 @@ static XINPUT_STATE state[4]; -const int DEADZONE = 16000; +#define DEADZONE (16000) static void xdk360_input_poll(void *data) { diff --git a/360/xdk360_video.cpp b/360/xdk360_video.cpp index 58419e5571..0075b1fb05 100644 --- a/360/xdk360_video.cpp +++ b/360/xdk360_video.cpp @@ -27,8 +27,6 @@ #include "config.h" #endif -#include "xdk360_video_debugfonts_.h" - static const char* g_strPixelShaderProgram = " sampler2D tex : register(s0); " " struct PS_IN " @@ -70,147 +68,10 @@ typedef struct DrawVerticeFormats } DrawVerticeFormats; static bool g_quitting; +static bool g_first_msg; unsigned g_frame_count; void *g_d3d; - -static void xdk360_debugfonts_dprint( int x, int y, unsigned char str ) -{ - xdk360_video_t *vid = (xdk360_video_t*)g_d3d; - - int posw = (str - ' ')%16; - int posh = (str - ' ')/16; - primitive_t * pBuf = &vid->font_buffer[vid->font_num * 4]; - int addx = 6; - - if ( vid->font_num >= DFONT_MAX ) - return; - - if ( str == 0x9E ) - addx = 3; - - pBuf[0].x = pBuf[2].x = x; - pBuf[1].x = pBuf[3].x = x+addx; - pBuf[0].y = pBuf[1].y = y; - pBuf[2].y = pBuf[3].y = y+7; - pBuf[0].u = pBuf[2].u = ((float)(posw*16 + 1)/256.0f); - pBuf[1].u = pBuf[3].u = ((float)(posw*16 + 13)/256.0f); - pBuf[0].v = pBuf[1].v = ((float)(posh*16 + 1)/256.0f); - pBuf[2].v = pBuf[3].v = ((float)(posh*16 + 15)/256.0f); - vid->font_num++; -} - -void xdk360_debugfonts_printf(int x, int y, const char *arg, ... ) -{ - char tmp[1024]; - char *p = tmp; - int tmpx = x; - - va_list ap; - va_start( ap, arg ); - vsprintf( tmp, arg, ap ); - while ( *p != '\0' ) - { - unsigned char str = (unsigned char)*p; - xdk360_debugfonts_dprint( x, y, str ); - if ( str == 0x9E ) - x += 3; - else if ( str == '\n' ) - { - xdk360_debugfonts_dprint( x, y, 0x9F ); - x = tmpx; - y += 7; - } - else - x += 6; - - p++; - } - xdk360_debugfonts_dprint( x, y, 0x9F ); - va_end( ap ); -} - -static void xdk360_debugfonts_init (void) -{ - HRESULT hr; - D3DLOCKED_RECT lock_rect; - xdk360_video_t *vid = (xdk360_video_t*)g_d3d; - vid->font_num = 0; - - IDirect3DDevice9 * d3d = vid->xdk360_render_device; - - hr = d3d->CreateTexture(128, 128, 1, 0, D3DFMT_A8R8G8B8, - D3DPOOL_MANAGED, &vid->font_texture, NULL); - - if (FAILED(hr)) - { - SSNES_ERR("Could't create debug font texture.\n"); - return; - } - - vid->font_texture->LockRect(0, &lock_rect, NULL, D3DLOCK_NOSYSLOCK ); - - DWORD * src = FontData_5x5; - DWORD * dst = (DWORD *)lock_rect.pBits; - - for (int y = 0; y < 64; y++) - { - memcpy(dst, src, sizeof(DWORD)*128 ); - src += 128; - dst += lock_rect.Pitch/sizeof(DWORD); - } - - vid->font_texture->UnlockRect(0); - - for (int i = 0; i < DFONT_MAX; i++) - { - vid->font_buffer[i * 4].z = 0; - vid->font_buffer[i * 4].rhw = 1.0f; - - vid->font_buffer[i * 4 + 1].z = 0; - vid->font_buffer[i * 4 + 1].rhw = 1.0f; - - vid->font_buffer[i * 4 + 2].z = 0; - vid->font_buffer[i * 4 + 2].rhw = 1.0f; - - vid->font_buffer[i * 4 + 3].z = 0; - vid->font_buffer[i * 4 + 3].rhw = 1.0f; - - vid->font_index[i * 6] = i * 4; - vid->font_index[i * 6 + 1] = i * 4 + 1; - vid->font_index[i * 6 + 2] = i * 4 + 2; - vid->font_index[i * 6 + 3] = i * 4 + 3; - vid->font_index[i * 6 + 4] = i * 4 + 2; - vid->font_index[i * 6 + 5] = i * 4 + 1; - } -} - -static void xdk360_debugfonts_deinit (void) -{ - xdk360_video_t *vid = (xdk360_video_t*)g_d3d; - - IDirect3DDevice9 * d3d = vid->xdk360_render_device; - - if (vid->font_texture != NULL) - vid->font_texture->Release(); -} - -static void xdk360_debugfonts_draw (void) -{ - xdk360_video_t *vid = (xdk360_video_t*)g_d3d; - IDirect3DDevice9 * d3d = vid->xdk360_render_device; - - d3d->SetTexture(0, vid->font_texture); - d3d->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); - d3d->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); - d3d->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); - //d3d->SetFVF( PRIM_FVF); - d3d->SetVertexDeclaration(vid->pVertexDecl); - d3d->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, vid->font_num * 4, - vid->font_num * 2, vid->font_index, D3DFMT_INDEX16, - vid->font_buffer, sizeof(primitive_t)); - - vid->font_num = 0; -} +Console g_screen_console; static void xdk360_gfx_free(void * data) { @@ -401,12 +262,6 @@ static bool xdk360_gfx_frame(void *data, const void *frame, vid->lpTexture->UnlockRect(0); } - if (msg) - { - xdk360_debugfonts_printf(0, 0, msg); - xdk360_debugfonts_draw(); - } - vid->xdk360_render_device->SetTexture(0, vid->lpTexture); vid->xdk360_render_device->SetSamplerState(0, D3DSAMP_MINFILTER, g_console.filter_type); vid->xdk360_render_device->SetSamplerState(0, D3DSAMP_MAGFILTER, g_console.filter_type); @@ -420,6 +275,19 @@ static bool xdk360_gfx_frame(void *data, const void *frame, vid->xdk360_render_device->SetStreamSource(0, vid->vertex_buf, 0, sizeof(DrawVerticeFormats)); vid->xdk360_render_device->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); + if (msg) + { + if(IS_TIMER_EXPIRED() || g_first_msg) + { + g_screen_console.Clear(); + g_screen_console.Format(msg); + g_first_msg = 0; + SET_TIMER_EXPIRATION(60); + } + + g_screen_console.Render(); + } + vid->xdk360_render_device->Present(NULL, NULL, NULL, NULL); return true; @@ -458,7 +326,15 @@ void xdk360_video_init(void) video_info.input_scale = 2; g_d3d = xdk360_gfx_init(&video_info, NULL, NULL); - xdk360_debugfonts_init(); + + g_first_msg = true; + + HRESULT hr = g_screen_console.Create("game:\\media\\Arial_12.xpr", + 0xff000000, 0xffffffff ); + if(FAILED(hr)) + { + SSNES_ERR("Couldn't create debug console.\n"); + } } void xdk360_video_deinit(void) diff --git a/360/xdk360_video.h b/360/xdk360_video.h index 17c6d98c95..c1ca81304a 100644 --- a/360/xdk360_video.h +++ b/360/xdk360_video.h @@ -19,6 +19,8 @@ #ifndef _XDK360_VIDEO_H #define _XDK360_VIDEO_H +#include "xdk360_video_console.h" + typedef struct { float x; float y; @@ -33,9 +35,7 @@ typedef struct { typedef struct xdk360_video { - WORD font_index[DFONT_MAX * 6]; - primitive_t font_buffer[DFONT_MAX * 4]; - unsigned last_width, last_height, font_num; + unsigned last_width, last_height; IDirect3D9* xdk360_device; IDirect3DDevice9* xdk360_render_device; IDirect3DVertexShader9 *pVertexShader; @@ -54,8 +54,7 @@ typedef struct xdk360_video void xdk360_video_init(void); void xdk360_video_deinit(void); -void xdk360_debugfonts_printf(int x, int y, const char *arg, ... ); - +extern Console g_screen_console; extern unsigned g_frame_count; extern void *g_d3d; diff --git a/360/xdk360_video_console.cpp b/360/xdk360_video_console.cpp new file mode 100644 index 0000000000..da33be1f46 --- /dev/null +++ b/360/xdk360_video_console.cpp @@ -0,0 +1,293 @@ +/* SSNES - A Super Nintendo Entertainment System (SNES) Emulator frontend for libsnes. + * Copyright (C) 2010-2012 - Hans-Kristian Arntzen + * Copyright (C) 2011-2012 - Daniel De Matteis + * + * Some code herein may be based on code found in BSNES. + * + * SSNES is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * SSNES is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with SSNES. + * If not, see . + */ + +#include +#include +#include "xdk360_video.h" +#include "xdk360_video_console.h" +#include "xdk360_video_debugfonts.h" +#include "../general.h" + +// Ignore warning about "unused" pD3D variable +#pragma warning( disable: 4189 ) + +Console::Console() +{ + first_message = true; + m_Buffer = NULL; + m_Lines = NULL; + m_nScrollOffset = 0; +} + +Console::~Console() +{ + Destroy(); +} + +HRESULT Console::Create( LPCSTR strFontFileName, D3DCOLOR colBackColor, + D3DCOLOR colTextColor, unsigned int nLines ) +{ + xdk360_video_t *vid = (xdk360_video_t*)g_d3d; + D3DDevice *m_pd3dDevice = vid->xdk360_render_device; + + // Calculate the safe area + unsigned int uiSafeAreaPct = SAFE_AREA_PCT_HDTV; + + m_cxSafeArea = ( vid->d3dpp.BackBufferWidth * uiSafeAreaPct ) / 100; + m_cySafeArea = ( vid->d3dpp.BackBufferHeight * uiSafeAreaPct ) / 100; + + m_cxSafeAreaOffset = ( vid->d3dpp.BackBufferWidth - m_cxSafeArea ) / 2; + m_cySafeAreaOffset = ( vid->d3dpp.BackBufferHeight - m_cySafeArea ) / 2; + + // Create the font + HRESULT hr = m_Font.Create( strFontFileName ); + if( FAILED( hr ) ) + { + SSNES_ERR( "Could not create font.\n" ); + return -1; + } + + // Save the colors + m_colBackColor = colBackColor; + m_colTextColor = colTextColor; + + // Calculate the number of lines on the screen + float fCharWidth, fCharHeight; + m_Font.GetTextExtent( L"i", &fCharWidth, &fCharHeight, FALSE ); + + m_cScreenHeight = (unsigned int)( m_cySafeArea / fCharHeight ); + m_cScreenWidth = (unsigned int)( m_cxSafeArea / fCharWidth ); + + m_cScreenHeightVirtual = max( m_cScreenHeight, nLines ); + + m_fLineHeight = fCharHeight; + + // Allocate memory to hold the lines + m_Buffer = new wchar_t[ m_cScreenHeightVirtual * ( m_cScreenWidth + 1 ) ]; + m_Lines = new wchar_t *[ m_cScreenHeightVirtual ]; + + // Set the line pointers as indexes into the buffer + for( unsigned int i = 0; i < m_cScreenHeightVirtual; i++ ) + m_Lines[ i ] = m_Buffer + ( m_cScreenWidth + 1 ) * i; + + // Clear the screen + Clear(); + + return hr; +} + + +//-------------------------------------------------------------------------------------- +// Name: Clear() +// Desc: Clear the screen +//-------------------------------------------------------------------------------------- +VOID Console::Clear() +{ + m_nCurLine = 0; + m_cCurLineLength = 0; + memset( m_Buffer, 0, m_cScreenHeightVirtual * ( m_cScreenWidth + 1 ) * sizeof( wchar_t ) ); + + Render(); +} + + +//-------------------------------------------------------------------------------------- +// Name: IncrementLine() +// Desc: Skip to the next line +//-------------------------------------------------------------------------------------- +VOID Console::IncrementLine() +{ + m_nCurLine = ( m_nCurLine + 1 ) % m_cScreenHeightVirtual; + m_cCurLineLength = 0; + memset( m_Lines[m_nCurLine], 0, ( m_cScreenWidth + 1 ) * sizeof( wchar_t ) ); +} + +//-------------------------------------------------------------------------------------- +// Name: Destroy() +// Desc: Tear everything down +//-------------------------------------------------------------------------------------- +void Console::Destroy() +{ + // Delete the memory we've allocated + if( m_Lines ) + { + delete[] m_Lines; + m_Lines = NULL; + } + + if( m_Buffer ) + { + delete[] m_Buffer; + m_Buffer = NULL; + } + + // Destroy the font + m_Font.Destroy(); +} + + +//-------------------------------------------------------------------------------------- +// Name: Render() +// Desc: Render the console to the screen +//-------------------------------------------------------------------------------------- +void Console::Render() +{ + xdk360_video_t *vid = (xdk360_video_t*)g_d3d; + D3DDevice *m_pd3dDevice = vid->xdk360_render_device; + + // The top line + unsigned int nTextLine = ( m_nCurLine - m_cScreenHeight + m_cScreenHeightVirtual - m_nScrollOffset + 1 ) + % m_cScreenHeightVirtual; + + m_Font.Begin(); + + for( unsigned int nScreenLine = 0; nScreenLine < m_cScreenHeight; nScreenLine++ ) + { + m_Font.DrawText( (float)( m_cxSafeAreaOffset ), + (float)( m_cySafeAreaOffset + m_fLineHeight * nScreenLine ), + m_colTextColor, m_Lines[nTextLine] ); + + nTextLine = ( nTextLine + 1 ) % m_cScreenHeightVirtual; + } + + m_Font.End(); +} + + +//-------------------------------------------------------------------------------------- +// Name: Add( CHAR ) +// Desc: Convert ANSI to WCHAR and add to the current line +//-------------------------------------------------------------------------------------- +void Console::Add( char ch ) +{ + wchar_t wch; + + int ret = MultiByteToWideChar( CP_ACP, // ANSI code page + 0, // No flags + &ch, // Character to convert + 1, // Convert one byte + &wch, // Target wide character buffer + 1 ); // One wide character + + Add( wch ); +} + + + +//-------------------------------------------------------------------------------------- +// Name: Add( WCHAR ) +// Desc: Add a wide character to the current line +//-------------------------------------------------------------------------------------- +void Console::Add( wchar_t wch ) +{ + // If this is a newline, just increment lines and move on + if( wch == L'\n' ) + { + IncrementLine(); + return; + } + + int bIncrementLine = FALSE; // Whether to wrap to the next line + + if( m_cCurLineLength == m_cScreenWidth ) + bIncrementLine = TRUE; + else + { + // Try to append the character to the line + m_Lines[ m_nCurLine ][ m_cCurLineLength ] = wch; + + if( m_Font.GetTextWidth( m_Lines[ m_nCurLine ] ) > m_cxSafeArea ) + { + // The line is too long, we need to wrap the character to the next line + m_Lines[ m_nCurLine][ m_cCurLineLength ] = L'\0'; + bIncrementLine = TRUE; + } + } + + // If we need to skip to the next line, do so + if( bIncrementLine ) + { + IncrementLine(); + m_Lines[ m_nCurLine ][0] = wch; + } + + if(IS_TIMER_EXPIRED()) + m_cCurLineLength++; +} + + +//-------------------------------------------------------------------------------------- +// Name: Format() +// Desc: Output a variable argument list using a format string +//-------------------------------------------------------------------------------------- +void Console::Format( _In_z_ _Printf_format_string_ LPCSTR strFormat, ... ) +{ + va_list pArgList; + va_start( pArgList, strFormat ); + FormatV( strFormat, pArgList ); + va_end( pArgList ); + + // Render the output + Render(); +} + +void Console::Format( _In_z_ _Printf_format_string_ LPCWSTR wstrFormat, ... ) +{ + va_list pArgList; + va_start( pArgList, wstrFormat ); + FormatV( wstrFormat, pArgList ); + va_end( pArgList ); + + // Render the output + Render(); +} + + +//-------------------------------------------------------------------------------------- +// Name: FormatV() +// Desc: Output a va_list using a format string +//-------------------------------------------------------------------------------------- +void Console::FormatV( _In_z_ _Printf_format_string_ LPCSTR strFormat, va_list pArgList ) +{ + // Count the required length of the string + unsigned long dwStrLen = _vscprintf( strFormat, pArgList ) + 1; // +1 = null terminator + char * strMessage = ( char * )_malloca( dwStrLen ); + vsprintf_s( strMessage, dwStrLen, strFormat, pArgList ); + + // Output the string to the console + unsigned long uStringLength = strlen( strMessage ); + for( unsigned long i = 0; i < uStringLength; i++ ) + Add( strMessage[i] ); + + _freea( strMessage ); +} + +void Console::FormatV( _In_z_ _Printf_format_string_ LPCWSTR wstrFormat, va_list pArgList ) +{ + // Count the required length of the string + unsigned long dwStrLen = _vscwprintf( wstrFormat, pArgList ) + 1; // +1 = null terminator + wchar_t * strMessage = ( wchar_t * )_malloca( dwStrLen * sizeof( wchar_t ) ); + vswprintf_s( strMessage, dwStrLen, wstrFormat, pArgList ); + + // Output the string to the console + unsigned long uStringLength = wcslen( strMessage ); + for( unsigned long i = 0; i < uStringLength; i++ ) + Add( strMessage[i] ); + + _freea( strMessage ); +} diff --git a/360/xdk360_video_console.h b/360/xdk360_video_console.h new file mode 100644 index 0000000000..dcc815a1e2 --- /dev/null +++ b/360/xdk360_video_console.h @@ -0,0 +1,100 @@ +/* SSNES - A Super Nintendo Entertainment System (SNES) Emulator frontend for libsnes. + * Copyright (C) 2010-2012 - Hans-Kristian Arntzen + * Copyright (C) 2011-2012 - Daniel De Matteis + * + * Some code herein may be based on code found in BSNES. + * + * SSNES is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * SSNES is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with SSNES. + * If not, see . + */ + +#pragma once +#ifndef ATGCONSOLE_H +#define ATGCONSOLE_H + +#include +#include "xdk360_video_debugfonts.h" + +#define PAGE_UP (255) +#define PAGE_DOWN (-255) + +#define SCREEN_SIZE_X_DEFAULT 640 +#define SCREEN_SIZE_Y_DEFAULT 480 + +#define SAFE_AREA_PCT_4x3 85 +#define SAFE_AREA_PCT_HDTV 90 + +//-------------------------------------------------------------------------------------- +// Name: class Console +// Desc: Class to implement the console. +//-------------------------------------------------------------------------------------- +class Console +{ +public: + Console(); + ~Console(); + + // Initialization + HRESULT Create( LPCSTR strFontFileName, + D3DCOLOR colBackColor, + D3DCOLOR colTextColor, + unsigned int nLines = 0 ); + + void Destroy(); + + // Clear the screen + void Clear(); + + // Console output + void Format( _In_z_ _Printf_format_string_ LPCSTR strFormat, ... ); + void Format( _In_z_ _Printf_format_string_ LPCWSTR wstrFormat, ... ); + void FormatV( _In_z_ _Printf_format_string_ LPCSTR strFormat, va_list pArgList ); + void FormatV( _In_z_ _Printf_format_string_ LPCWSTR wstrFormat, va_list pArgList ); + + // method for rendering the console + void Render(); +private: + int first_message; + // Safe area dimensions + unsigned int m_cxSafeArea; + unsigned int m_cySafeArea; + + unsigned int m_cxSafeAreaOffset; + unsigned int m_cySafeAreaOffset; + + // Font for rendering text + XdkFont m_Font; + + // Colors + D3DCOLOR m_colBackColor; + D3DCOLOR m_colTextColor; + + // Text Buffers + unsigned int m_cScreenHeight; // height in lines of screen area + unsigned int m_cScreenHeightVirtual; // height in lines of text storage buffer + unsigned int m_cScreenWidth; // width in characters + float m_fLineHeight; // height of a single line in pixels + + wchar_t * m_Buffer; // buffer big enough to hold a full screen + wchar_t ** m_Lines; // pointers to individual lines + unsigned int m_nCurLine; // index of current line being written to + unsigned int m_cCurLineLength; // length of the current line + int m_nScrollOffset; // offset to display text (in lines) + + // Add a character to the current line + void Add( char ch ); + void Add( wchar_t wch ); + + // Increment to the next line + void IncrementLine(); +}; + +#endif diff --git a/360/xdk360_video_debugfonts.cpp b/360/xdk360_video_debugfonts.cpp new file mode 100644 index 0000000000..4269e8c65f --- /dev/null +++ b/360/xdk360_video_debugfonts.cpp @@ -0,0 +1,971 @@ +/* SSNES - A Super Nintendo Entertainment System (SNES) Emulator frontend for libsnes. + * Copyright (C) 2010-2012 - Hans-Kristian Arntzen + * Copyright (C) 2011-2012 - Daniel De Matteis + * + * Some code herein may be based on code found in BSNES. + * + * SSNES is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * SSNES is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with SSNES. + * If not, see . + */ + +#include +#include +#include "xdk360_video.h" +#include "xdk360_video_debugfonts.h" +#include "../general.h" + +// Font description + +#define ATGCALCFONTFILEHEADERSIZE(x) ( sizeof(DWORD) + (sizeof(FLOAT)*4) + sizeof(WORD) + (sizeof(WCHAR)*(x)) ) +#define ATGFONTFILEVERSION 5 + +typedef struct FontFileHeaderImage_t { + unsigned long m_dwFileVersion; // Version of the font file (Must match FONTFILEVERSION) + float m_fFontHeight; // Height of the font strike in pixels + float m_fFontTopPadding; // Padding above the strike zone + float m_fFontBottomPadding; // Padding below the strike zone + float m_fFontYAdvance; // Number of pixels to move the cursor for a line feed + unsigned short m_cMaxGlyph; // Number of font characters (Should be an odd number to maintain DWORD Alignment) + wchar_t m_TranslatorTable[1]; // ASCII to Glyph lookup table, NOTE: It's m_cMaxGlyph+1 in size. + // Entry 0 maps to the "Unknown" glyph. +} FontFileHeaderImage_t; + +// Font strike array. Immediately follows the FontFileHeaderImage_t +// structure image + +typedef struct FontFileStrikesImage_t { + unsigned long m_dwNumGlyphs; // Size of font strike array (First entry is the unknown glyph) + GLYPH_ATTR m_Glyphs[1]; // Array of font strike uv's etc... NOTE: It's m_dwNumGlyphs in size +} FontFileStrikesImage_t; + +//-------------------------------------------------------------------------------------- +// Vertex and pixel shaders for font rendering +// Please note the removal of comment or dead lines... +// They are commented out because the shader compiler has no use for them. +//-------------------------------------------------------------------------------------- +static const char g_strFontShader[] = + "struct VS_IN\n" + "{\n" + "float2 Pos : POSITION;\n" + "float2 Tex : TEXCOORD0;\n" + "float4 ChannelSelector : TEXCOORD1;\n" + "};\n" +// "\n" + "struct VS_OUT\n" + "{\n" + "float4 Position : POSITION;\n" + "float4 Diffuse : COLOR0_center;\n" + "float2 TexCoord0 : TEXCOORD0;\n" + "float4 ChannelSelector : TEXCOORD1;\n" + "};\n" +// "\n" + "uniform float4 Color : register(c1);\n" + "uniform float2 TexScale : register(c2);\n" +// "\n" + "sampler FontTexture : register(s0);\n" +// "\n" + "VS_OUT FontVertexShader( VS_IN In )\n" + "{\n" + "VS_OUT Out;\n" + "Out.Position.x = (In.Pos.x-0.5);\n" + "Out.Position.y = (In.Pos.y-0.5);\n" + "Out.Position.z = ( 0.0 );\n" + "Out.Position.w = ( 1.0 );\n" + "Out.Diffuse = Color;\n" + "Out.TexCoord0.x = In.Tex.x * TexScale.x;\n" + "Out.TexCoord0.y = In.Tex.y * TexScale.y;\n" + "Out.ChannelSelector = In.ChannelSelector;\n" + "return Out;\n" + "}\n" + // "\n" + "float4 FontPixelShader( VS_OUT In ) : COLOR0\n" + "{\n" +// "// Fetch a texel from the font texture\n" + "float4 FontTexel = tex2D( FontTexture, In.TexCoord0 );\n" +// "\n" + "if( dot( In.ChannelSelector, float4(1,1,1,1) ) )\n" + "{\n" +// "// Select the color from the channel\n" + "float value = dot( FontTexel, In.ChannelSelector );\n" +// "\n" +// "// For white pixels, the high bit is 1 and the low\n" +// "// bits are luminance, so r0.a will be > 0.5. For the\n" +// "// RGB channel, we want to lop off the msb and shift\n" +// "// the lower bits up one bit. This is simple to do\n" +// "// with the _bx2 modifier. Since these pixels are\n" +// "// opaque, we emit a 1 for the alpha channel (which\n" +// "// is 0.5 x2 ).\n" +// "\n" +// "// For black pixels, the high bit is 0 and the low\n" +// "// bits are alpha, so r0.a will be < 0.5. For the RGB\n" +// "// channel, we emit zero. For the alpha channel, we\n" +// "// just use the x2 modifier to scale up the low bits\n" +// "// of the alpha.\n" + "float4 Color;\n" + "Color.rgb = ( value > 0.5f ? 2*value-1 : 0.0f );\n" + "Color.a = 2 * ( value > 0.5f ? 1.0f : value );\n" +// "\n" +// "// Return the texture color modulated with the vertex\n" +// "// color\n" + "return Color * In.Diffuse;\n" + "}\n" + "else\n" + "{\n" + "return FontTexel * In.Diffuse;\n" + "}\n" + "}\n"; + +// +// These are shared assets common among all instances of AtgFont +// + +typedef struct AtgFont_Locals_t { + D3DVertexDeclaration* m_pFontVertexDecl; // Shared vertex buffer + D3DVertexShader* m_pFontVertexShader; // Created vertex shader + D3DPixelShader* m_pFontPixelShader; // Created pixel shader +} AtgFont_Locals_t; + +// All elements are defaulted to NULL +static AtgFont_Locals_t s_AtgFontLocals; // Global static instance + +//-------------------------------------------------------------------------------------- +// Name: CreateFontShaders() +// Desc: Creates the global font shaders +//-------------------------------------------------------------------------------------- + +HRESULT XdkFont::CreateFontShaders() +{ + // + // There are only two states the globals could be in, + // Initialized, in which the ref count is increased, + // Uninialized, in which the vertex/pixel shaders need to be + // started up and a vertex array created. + /// + + HRESULT Result; // Returned error code + if (!s_AtgFontLocals.m_pFontVertexDecl) + { + // Use the do {} while(0); trick for a fake goto + // It simplies tear down on error conditions. + + do { + + // Step #1, create my vertex array with 16 bytes per entry + // Floats for the position, + // shorts for the uvs + // 32 bit packed ARGB 8:8:8:8 for color + + static const D3DVERTEXELEMENT9 decl[] = + { + { 0, 0, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, + { 0, 8, D3DDECLTYPE_USHORT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, + { 0, 12, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 1 }, + D3DDECL_END() + }; + + // Cache this global into a register + xdk360_video_t *vid = (xdk360_video_t*)g_d3d; + D3DDevice *pd3dDevice = vid->xdk360_render_device; + + Result = pd3dDevice->CreateVertexDeclaration( decl, &s_AtgFontLocals.m_pFontVertexDecl ); + if ( SUCCEEDED( Result ) ) + { + + // Step #2, create my vertex shader + ID3DXBuffer* pShaderCode; + Result = D3DXCompileShader( g_strFontShader, sizeof(g_strFontShader)-1 , + NULL, NULL, "FontVertexShader", "vs.2.0", 0,&pShaderCode, NULL, NULL ); + if ( SUCCEEDED( Result ) ) + { + Result = pd3dDevice->CreateVertexShader( ( DWORD* )pShaderCode->GetBufferPointer(), + &s_AtgFontLocals.m_pFontVertexShader ); + // Release the compiled shader + pShaderCode->Release(); + + if( SUCCEEDED( Result ) ) + { + + // Step #3, create my pixel shader + + Result = D3DXCompileShader( g_strFontShader, sizeof(g_strFontShader)-1 , + NULL, NULL, "FontPixelShader", "ps.2.0", 0,&pShaderCode, NULL, NULL ); + if ( SUCCEEDED( Result ) ) + { + Result = pd3dDevice->CreatePixelShader( ( DWORD* )pShaderCode->GetBufferPointer(), + &s_AtgFontLocals.m_pFontPixelShader ); + // Release the compiled shader + pShaderCode->Release(); + + if ( SUCCEEDED( Result ) ) + { + Result = S_OK; // I'm good. + break; // Skip the teardown code + } + } + // If the code got to here, a fatal error has occured + // and a clean shutdown needs to be performed. + + s_AtgFontLocals.m_pFontVertexShader->Release(); + } + // Ensure the pointer is NULL + s_AtgFontLocals.m_pFontVertexShader = NULL; + } + s_AtgFontLocals.m_pFontVertexDecl->Release(); + } + // Ensure this pointer is NULL + s_AtgFontLocals.m_pFontVertexDecl = NULL; + } while (0); // Exit point for the break command. + return Result; + } + else + { + // + // Already initialized, so just add to the ref counts + // + + s_AtgFontLocals.m_pFontVertexDecl->AddRef(); + s_AtgFontLocals.m_pFontVertexShader->AddRef(); + s_AtgFontLocals.m_pFontPixelShader->AddRef(); + Result = S_OK; // Everything is fine + } + return Result; // Return the error code if any +} + +//-------------------------------------------------------------------------------------- +// Name: ReleaseFontShaders() +// Desc: Releases the font shaders by reference +//-------------------------------------------------------------------------------------- + +void XdkFont::ReleaseFontShaders() +{ + // Safely release shaders + // NOTE: They are released in reverse order of creation + // to make sure any interdependencies are dealt with + + if( ( s_AtgFontLocals.m_pFontPixelShader != NULL ) && ( s_AtgFontLocals.m_pFontPixelShader->Release() == 0 ) ) + s_AtgFontLocals.m_pFontPixelShader = NULL; + if( ( s_AtgFontLocals.m_pFontVertexShader != NULL ) && ( s_AtgFontLocals.m_pFontVertexShader->Release() == 0 ) ) + s_AtgFontLocals.m_pFontVertexShader = NULL; + if( ( s_AtgFontLocals.m_pFontVertexDecl != NULL ) && ( s_AtgFontLocals.m_pFontVertexDecl->Release() == 0 ) ) + s_AtgFontLocals.m_pFontVertexDecl = NULL; +} + +//-------------------------------------------------------------------------------------- +// Name: Font() +// Desc: Constructor +//-------------------------------------------------------------------------------------- +XdkFont::XdkFont() +{ + m_pFontTexture = NULL; + + m_dwNumGlyphs = 0L; + m_Glyphs = NULL; + + m_fCursorX = 0.0f; + m_fCursorY = 0.0f; + + m_fXScaleFactor = 2.0f; + m_fYScaleFactor = 2.0f; + m_fSlantFactor = 0.0f; + m_bRotate = FALSE; + m_dRotCos = cos( 0.0 ); + m_dRotSin = sin( 0.0 ); + + m_cMaxGlyph = 0; + m_TranslatorTable = NULL; + + m_dwNestedBeginCount = 0L; +} + + +//-------------------------------------------------------------------------------------- +// Name: ~Font() +// Desc: Destructor +//-------------------------------------------------------------------------------------- +XdkFont::~XdkFont() +{ + Destroy(); +} + + +//-------------------------------------------------------------------------------------- +// Name: Create() +// Desc: Create the font's internal objects (texture and array of glyph info) +// using the XPR packed resource file +//-------------------------------------------------------------------------------------- +HRESULT XdkFont::Create( const char * strFontFileName ) +{ + // Create the font + if( FAILED( m_xprResource.Create( strFontFileName ) ) ) + return E_FAIL; + + D3DTexture * pFontTexture = m_xprResource.GetTexture( "FontTexture" ); + const void * pFontData = m_xprResource.GetData( "FontData"); + + // Save a copy of the texture + m_pFontTexture = pFontTexture; + + // Check version of file (to make sure it matches up with the FontMaker tool) + const unsigned char * pData = static_cast(pFontData); + unsigned long dwFileVersion = reinterpret_cast(pData)->m_dwFileVersion; + + if( dwFileVersion == ATGFONTFILEVERSION ) + { + m_fFontHeight = reinterpret_cast(pData)->m_fFontHeight; + m_fFontTopPadding = reinterpret_cast(pData)->m_fFontTopPadding; + m_fFontBottomPadding = reinterpret_cast(pData)->m_fFontBottomPadding; + m_fFontYAdvance = reinterpret_cast(pData)->m_fFontYAdvance; + + // Point to the translator string which immediately follows the 4 floats + m_cMaxGlyph = reinterpret_cast(pData)->m_cMaxGlyph; + + m_TranslatorTable = const_cast(reinterpret_cast(pData))->m_TranslatorTable; + + pData += ATGCALCFONTFILEHEADERSIZE( m_cMaxGlyph + 1 ); + + // Read the glyph attributes from the file + m_dwNumGlyphs = reinterpret_cast(pData)->m_dwNumGlyphs; + m_Glyphs = reinterpret_cast(pData)->m_Glyphs; // Pointer + } + else + { + SSNES_ERR( "Incorrect version number on font file.\n" ); + return E_FAIL; + } + + // Create the vertex and pixel shaders for rendering the font + if( FAILED( CreateFontShaders() ) ) + { + SSNES_ERR( "Could not create font shaders.\n" ); + return E_FAIL; + } + + xdk360_video_t *vid = (xdk360_video_t*)g_d3d; + D3DDevice *pd3dDevice = vid->xdk360_render_device; + + // Initialize the window + D3DDISPLAYMODE DisplayMode; + pd3dDevice->GetDisplayMode( 0, &DisplayMode ); + m_rcWindow.x1 = 0; + m_rcWindow.y1 = 0; + m_rcWindow.x2 = DisplayMode.Width; + m_rcWindow.y2 = DisplayMode.Height; + + // Determine whether we should save/restore state + m_bSaveState = TRUE; + + return S_OK; +} + +//-------------------------------------------------------------------------------------- +// Name: Destroy() +// Desc: Destroy the font object +//-------------------------------------------------------------------------------------- +void XdkFont::Destroy() +{ + m_pFontTexture = NULL; + m_dwNumGlyphs = 0L; + m_Glyphs = NULL; + m_cMaxGlyph = 0; + m_TranslatorTable = NULL; + m_dwNestedBeginCount = 0L; + + // Safely release shaders + ReleaseFontShaders(); + + if( m_xprResource.Initialized() ) + m_xprResource.Destroy(); +} + + +//-------------------------------------------------------------------------------------- +// Name: SetWindow() +// Desc: Sets the and the bounds rect for drawing text and resets the cursor position +//-------------------------------------------------------------------------------------- +void XdkFont::SetWindow(const D3DRECT &rcWindow ) +{ + m_rcWindow.x1 = rcWindow.x1; + m_rcWindow.y1 = rcWindow.y1; + m_rcWindow.x2 = rcWindow.x2; + m_rcWindow.y2 = rcWindow.y2; + + m_fCursorX = 0.0f; + m_fCursorY = 0.0f; +} + + +//-------------------------------------------------------------------------------------- +// Name: SetWindow() +// Desc: Sets the and the bounds rect for drawing text and resets the cursor position +//-------------------------------------------------------------------------------------- +void XdkFont::SetWindow( long x1, long y1, long x2, long y2 ) +{ + m_rcWindow.x1 = x1; + m_rcWindow.y1 = y1; + m_rcWindow.x2 = x2; + m_rcWindow.y2 = y2; + + m_fCursorX = 0.0f; + m_fCursorY = 0.0f; +} + +//-------------------------------------------------------------------------------------- +// Name: GetWindow() +// Desc: Gets the current bounds rect for drawing +//-------------------------------------------------------------------------------------- +void XdkFont::GetWindow( D3DRECT &rcWindow ) const +{ + rcWindow = m_rcWindow; // NOTE: This is a structure copy +} + +//-------------------------------------------------------------------------------------- +// Name: SetCursorPosition() +// Desc: Sets the cursor position for drawing text +//-------------------------------------------------------------------------------------- +void XdkFont::SetCursorPosition( float fCursorX, float fCursorY ) +{ + m_fCursorX = floorf( fCursorX ); + m_fCursorY = floorf( fCursorY ); +} + +//-------------------------------------------------------------------------------------- +// Name: GetTextExtent() +// Desc: Get the dimensions of a text string +//-------------------------------------------------------------------------------------- + +void XdkFont::GetTextExtent( const wchar_t * strText, float * pWidth, + float * pHeight, int bFirstLineOnly ) const +{ + // Set default text extent in output parameters + int iWidth = 0; + float fHeight = 0.0f; + + if( strText ) + { + // Initialize counters that keep track of text extent + int ix = 0; + float fy = m_fFontHeight; // One character high to start + if( fy > fHeight ) + fHeight = fy; + + // Loop through each character and update text extent + DWORD letter; + while( (letter = *strText) != 0 ) + { + ++strText; + + // Handle newline character + if( letter == L'\n' ) + { + if( bFirstLineOnly ) + break; + ix = 0; + fy += m_fFontYAdvance; + // since the height has changed, test against the height extent + if( fy > fHeight ) + fHeight = fy; + } + + // Handle carriage return characters by ignoring them. This helps when + // displaying text from a file. + if( letter == L'\r' ) + continue; + + // Translate unprintable characters + const GLYPH_ATTR* pGlyph; + + if( letter > m_cMaxGlyph ) + letter = 0; // Out of bounds? + else + letter = m_TranslatorTable[letter]; // Remap ASCII to glyph + + pGlyph = &m_Glyphs[letter]; // Get the requested glyph + + // Get text extent for this character's glyph + ix += pGlyph->wOffset; + ix += pGlyph->wAdvance; + + // Since the x widened, test against the x extent + + if( ix > iWidth ) + iWidth = ix; + } + } + + // Convert the width to a float here, load/hit/store. :( + float fWidth = static_cast(iWidth); // Delay the use if fWidth to reduce LHS pain + // Apply the scale factor to the result + fHeight *= m_fYScaleFactor; + // Store the final results + *pHeight = fHeight; + + fWidth *= m_fXScaleFactor; + *pWidth = fWidth; +} + +//-------------------------------------------------------------------------------------- +// Name: GetTextWidth() +// Desc: Returns the width in pixels of a text string +//-------------------------------------------------------------------------------------- +float XdkFont::GetTextWidth( const wchar_t * strText ) const +{ + float fTextWidth, fTextHeight; + GetTextExtent( strText, &fTextWidth, &fTextHeight ); + return fTextWidth; +} + + +//-------------------------------------------------------------------------------------- +// Name: Begin() +// Desc: Prepares the font vertex buffers for rendering. +//-------------------------------------------------------------------------------------- +VOID XdkFont::Begin() +{ + PIXBeginNamedEvent( 0, "Text Rendering" ); + + // Set state on the first call + if( m_dwNestedBeginCount == 0 ) + { + // Cache the global pointer into a register + xdk360_video_t *vid = (xdk360_video_t*)g_d3d; + D3DDevice *pD3dDevice = vid->xdk360_render_device; + + // Save state + if( m_bSaveState ) + { + // Note, we are not saving the texture, vertex, or pixel shader, + // since it's not worth the performance. We're more interested + // in saving state that would cause hard to find problems. + pD3dDevice->GetRenderState( D3DRS_ALPHABLENDENABLE, + &m_dwSavedState[ SAVEDSTATE_D3DRS_ALPHABLENDENABLE ] ); + pD3dDevice->GetRenderState( D3DRS_SRCBLEND, &m_dwSavedState[ SAVEDSTATE_D3DRS_SRCBLEND ] ); + pD3dDevice->GetRenderState( D3DRS_DESTBLEND, &m_dwSavedState[ SAVEDSTATE_D3DRS_DESTBLEND ] ); + pD3dDevice->GetRenderState( D3DRS_BLENDOP, &m_dwSavedState[ SAVEDSTATE_D3DRS_BLENDOP ] ); + pD3dDevice->GetRenderState( D3DRS_ALPHATESTENABLE, &m_dwSavedState[ SAVEDSTATE_D3DRS_ALPHATESTENABLE ] ); + pD3dDevice->GetRenderState( D3DRS_ALPHAREF, &m_dwSavedState[ SAVEDSTATE_D3DRS_ALPHAREF ] ); + pD3dDevice->GetRenderState( D3DRS_ALPHAFUNC, &m_dwSavedState[ SAVEDSTATE_D3DRS_ALPHAFUNC ] ); + pD3dDevice->GetRenderState( D3DRS_FILLMODE, &m_dwSavedState[ SAVEDSTATE_D3DRS_FILLMODE ] ); + pD3dDevice->GetRenderState( D3DRS_CULLMODE, &m_dwSavedState[ SAVEDSTATE_D3DRS_CULLMODE ] ); + pD3dDevice->GetRenderState( D3DRS_ZENABLE, &m_dwSavedState[ SAVEDSTATE_D3DRS_ZENABLE ] ); + pD3dDevice->GetRenderState( D3DRS_STENCILENABLE, &m_dwSavedState[ SAVEDSTATE_D3DRS_STENCILENABLE ] ); + pD3dDevice->GetRenderState( D3DRS_VIEWPORTENABLE, &m_dwSavedState[ SAVEDSTATE_D3DRS_VIEWPORTENABLE ] ); + pD3dDevice->GetSamplerState( 0, D3DSAMP_MINFILTER, &m_dwSavedState[ SAVEDSTATE_D3DSAMP_MINFILTER ] ); + pD3dDevice->GetSamplerState( 0, D3DSAMP_MAGFILTER, &m_dwSavedState[ SAVEDSTATE_D3DSAMP_MAGFILTER ] ); + pD3dDevice->GetSamplerState( 0, D3DSAMP_ADDRESSU, &m_dwSavedState[ SAVEDSTATE_D3DSAMP_ADDRESSU ] ); + pD3dDevice->GetSamplerState( 0, D3DSAMP_ADDRESSV, &m_dwSavedState[ SAVEDSTATE_D3DSAMP_ADDRESSV ] ); + } + + // Set the texture scaling factor as a vertex shader constant + D3DSURFACE_DESC TextureDesc; + m_pFontTexture->GetLevelDesc( 0, &TextureDesc ); // Get the description + + // Set render state + pD3dDevice->SetTexture( 0, m_pFontTexture ); + + // Read the TextureDesc here to ensure no load/hit/store from GetLevelDesc() + float vTexScale[4]; + vTexScale[0] = 1.0f / TextureDesc.Width; // LHS due to int->float conversion + vTexScale[1] = 1.0f / TextureDesc.Height; + vTexScale[2] = 0.0f; + vTexScale[3] = 0.0f; + + pD3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); + pD3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); + pD3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); + pD3dDevice->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD ); + pD3dDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE ); + pD3dDevice->SetRenderState( D3DRS_ALPHAREF, 0x08 ); + pD3dDevice->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL ); + pD3dDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID ); + pD3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW ); + pD3dDevice->SetRenderState( D3DRS_ZENABLE, FALSE ); + pD3dDevice->SetRenderState( D3DRS_STENCILENABLE, FALSE ); + pD3dDevice->SetRenderState( D3DRS_VIEWPORTENABLE, FALSE ); + pD3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); + pD3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); + pD3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP ); + pD3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP ); + + pD3dDevice->SetVertexDeclaration( s_AtgFontLocals.m_pFontVertexDecl ); + pD3dDevice->SetVertexShader( s_AtgFontLocals.m_pFontVertexShader ); + pD3dDevice->SetPixelShader( s_AtgFontLocals.m_pFontPixelShader ); + + // Set the texture scaling factor as a vertex shader constant + // Call here to avoid load hit store from writing to vTexScale above + pD3dDevice->SetVertexShaderConstantF( 2, vTexScale, 1 ); + } + + // Keep track of the nested begin/end calls. + m_dwNestedBeginCount++; +} + + +//-------------------------------------------------------------------------------------- +// Name: DrawText() +// Desc: Draws text as textured polygons +//-------------------------------------------------------------------------------------- +VOID XdkFont::DrawText( DWORD dwColor, const wchar_t * strText, unsigned long dwFlags, + float fMaxPixelWidth ) +{ + DrawText( m_fCursorX, m_fCursorY, dwColor, strText, dwFlags, fMaxPixelWidth ); +} + + +//-------------------------------------------------------------------------------------- +// Name: DrawText() +// Desc: Draws text as textured polygons +// TODO: This function should use the Begin/SetVertexData/End() API when it +// becomes available. +//-------------------------------------------------------------------------------------- +VOID XdkFont::DrawText( float fOriginX, float fOriginY, unsigned long dwColor, + const wchar_t * strText, unsigned long dwFlags, float fMaxPixelWidth ) +{ + if( strText == NULL ) + return; + if( L'\0' == strText[0] ) + return; + + xdk360_video_t *vid = (xdk360_video_t*)g_d3d; + D3DDevice *pd3dDevice = vid->xdk360_render_device; + + // Create a PIX user-defined event that encapsulates all of the text draw calls. + // This makes DrawText calls easier to recognize in PIX captures, and it makes + // them take up fewer entries in the event list. + PIXBeginNamedEvent( dwColor, "DrawText: %S", strText ); + + // Set the color as a vertex shader constant + float vColor[4]; + vColor[0] = ( ( dwColor & 0x00ff0000 ) >> 16L ) / 255.0F; + vColor[1] = ( ( dwColor & 0x0000ff00 ) >> 8L ) / 255.0F; + vColor[2] = ( ( dwColor & 0x000000ff ) >> 0L ) / 255.0F; + vColor[3] = ( ( dwColor & 0xff000000 ) >> 24L ) / 255.0F; + + // Set up stuff to prepare for drawing text + Begin(); + + // Perform the actual storing of the color constant here to prevent + // a load-hit-store by inserting work between the store and the use of + // the vColor array. + pd3dDevice->SetVertexShaderConstantF( 1, vColor, 1 ); + + // Set the starting screen position + if( ( fOriginX < 0.0f ) || ( ( dwFlags & ATGFONT_RIGHT ) && ( fOriginX <= 0.0f ) ) ) + fOriginX += ( m_rcWindow.x2 - m_rcWindow.x1 ); + if( fOriginY < 0.0f ) + fOriginY += ( m_rcWindow.y2 - m_rcWindow.y1 ); + + m_fCursorX = floorf( fOriginX ); + m_fCursorY = floorf( fOriginY ); + + // Adjust for padding + fOriginY -= m_fFontTopPadding; + + float fEllipsesPixelWidth = m_fXScaleFactor * 3.0f * ( m_Glyphs[m_TranslatorTable[L'.']].wOffset + + m_Glyphs[m_TranslatorTable[L'.']].wAdvance ); + + if( dwFlags & ATGFONT_TRUNCATED ) + { + // Check if we will really need to truncate the string + if( fMaxPixelWidth <= 0.0f ) + dwFlags &= ( ~ATGFONT_TRUNCATED ); + else + { + float w, h; + GetTextExtent( strText, &w, &h, TRUE ); + + // If not, then clear the flag + if( w <= fMaxPixelWidth ) + dwFlags &= ( ~ATGFONT_TRUNCATED ); + } + } + + // If vertically centered, offset the starting m_fCursorY value + if( dwFlags & ATGFONT_CENTER_Y ) + { + float w, h; + GetTextExtent( strText, &w, &h ); + m_fCursorY = floorf( m_fCursorY - (h * 0.5f) ); + } + + // Add window offsets + float Winx = static_cast(m_rcWindow.x1); + float Winy = static_cast(m_rcWindow.y1); + fOriginX += Winx; + fOriginY += Winy; + m_fCursorX += Winx; + m_fCursorY += Winy; + + // Set a flag so we can determine initial justification effects + BOOL bStartingNewLine = TRUE; + + unsigned long dwNumEllipsesToDraw = 0; + + // Begin drawing the vertices + + // Declared as volatile to force writing in ascending + // address order. It prevents out of sequence writing in write combined + // memory. + + volatile float * pVertex; + + unsigned long dwNumChars = wcslen( strText ) + ( dwFlags & ATGFONT_TRUNCATED ? 3 : 0 ); + HRESULT hr = pd3dDevice->BeginVertices( D3DPT_QUADLIST, 4 * dwNumChars, sizeof( XMFLOAT4 ) , + ( VOID** )&pVertex ); + // The ring buffer may run out of space when tiling, doing z-prepasses, + // or using BeginCommandBuffer. If so, make the buffer larger. + if( FAILED( hr ) ) + SSNES_ERR( "Ring buffer out of memory.\n" ); + + bStartingNewLine = TRUE; + + // Draw four vertices for each glyph + while( *strText ) + { + wchar_t letter; + + if( dwNumEllipsesToDraw ) + letter = L'.'; + else + { + // If starting text on a new line, determine justification effects + if( bStartingNewLine ) + { + if( dwFlags & ( ATGFONT_RIGHT | ATGFONT_CENTER_X ) ) + { + // Get the extent of this line + float w, h; + GetTextExtent( strText, &w, &h, TRUE ); + + // Offset this line's starting m_fCursorX value + if( dwFlags & ATGFONT_RIGHT ) + m_fCursorX = floorf( fOriginX - w ); + if( dwFlags & ATGFONT_CENTER_X ) + m_fCursorX = floorf( fOriginX - w * 0.5f ); + } + bStartingNewLine = FALSE; + } + + // Get the current letter in the string + letter = *strText++; + + // Handle the newline character + if( letter == L'\n' ) + { + m_fCursorX = fOriginX; + m_fCursorY += m_fFontYAdvance * m_fYScaleFactor; + bStartingNewLine = TRUE; + continue; + } + + // Handle carriage return characters by ignoring them. This helps when + // displaying text from a file. + if( letter == L'\r' ) + continue; + } + + // Translate unprintable characters + const GLYPH_ATTR* pGlyph = &m_Glyphs[ ( letter <= m_cMaxGlyph ) ? m_TranslatorTable[letter] : 0 ]; + + float fOffset = m_fXScaleFactor * ( FLOAT )pGlyph->wOffset; + float fAdvance = m_fXScaleFactor * ( FLOAT )pGlyph->wAdvance; + float fWidth = m_fXScaleFactor * ( FLOAT )pGlyph->wWidth; + float fHeight = m_fYScaleFactor * m_fFontHeight; + + if( 0 == dwNumEllipsesToDraw ) + { + if( dwFlags & ATGFONT_TRUNCATED ) + { + // Check if we will be exceeded the max allowed width + if( m_fCursorX + fOffset + fWidth + fEllipsesPixelWidth + m_fSlantFactor > fOriginX + fMaxPixelWidth ) + { + // Yup, draw the three ellipses dots instead + dwNumEllipsesToDraw = 3; + continue; + } + } + } + + // Setup the screen coordinates + m_fCursorX += fOffset; + float X4 = m_fCursorX; + float X1 = X4 + m_fSlantFactor; + float X3 = X4 + fWidth; + float X2 = X1 + fWidth; + float Y1 = m_fCursorY; + float Y3 = Y1 + fHeight; + float Y2 = Y1; + float Y4 = Y3; + + // Rotate the points by the rotation factor + if( m_bRotate ) + { + RotatePoint( &X1, &Y1, fOriginX, fOriginY ); + RotatePoint( &X2, &Y2, fOriginX, fOriginY ); + RotatePoint( &X3, &Y3, fOriginX, fOriginY ); + RotatePoint( &X4, &Y4, fOriginX, fOriginY ); + } + + m_fCursorX += fAdvance; + + // Select the RGBA channel that the compressed glyph is stored in + // Takes a 4 bit per pixel ARGB value and expand it to an 8 bit per pixel ARGB value + + unsigned long dwChannelSelector = pGlyph->wMask; // Convert to 32 bit + // Perform the conversion without branching + + // Splat the 4 bit per pixels from 0x1234 to 0x01020304 + dwChannelSelector = ((dwChannelSelector&0xF000)<<(24-12))|((dwChannelSelector&0xF00)<<(16-8))| + ((dwChannelSelector&0xF0)<<(8-4))|(dwChannelSelector&0xF); + + // Perform a vectorized multiply to make 0x01020304 into 0x11223344 + dwChannelSelector *= 0x11; + + // Add the vertices to draw this glyph + + unsigned long tu1 = pGlyph->tu1; // Convert shorts to 32 bit longs for in register merging + unsigned long tv1 = pGlyph->tv1; + unsigned long tu2 = pGlyph->tu2; + unsigned long tv2 = pGlyph->tv2; + + // NOTE: The vertexs are 2 floats for the screen coordinates, + // followed by two USHORTS for the u/vs of the character, + // terminated with the ARGB 32 bit color. + // This makes for 16 bytes per vertex data (Easier to read) + // Second NOTE: The uvs are merged and written using a DWORD due + // to the write combining hardware being only able to handle 32, + // 64 and 128 writes. Never store to write combined memory with + // 8 or 16 bit instructions. You've been warned. + + pVertex[0] = X1; + pVertex[1] = Y1; + reinterpret_cast(pVertex)[2] = (tu1<<16)|tv1; // Merged using big endian rules + reinterpret_cast(pVertex)[3] = dwChannelSelector; + pVertex[4] = X2; + pVertex[5] = Y2; + reinterpret_cast(pVertex)[6] = (tu2<<16)|tv1; // Merged using big endian rules + reinterpret_cast(pVertex)[7] = dwChannelSelector; + pVertex[8] = X3; + pVertex[9] = Y3; + reinterpret_cast(pVertex)[10] = (tu2<<16)|tv2; // Merged using big endian rules + reinterpret_cast(pVertex)[11] = dwChannelSelector; + pVertex[12] = X4; + pVertex[13] = Y4; + reinterpret_cast(pVertex)[14] = (tu1<<16)|tv2; // Merged using big endian rules + reinterpret_cast(pVertex)[15] = dwChannelSelector; + pVertex+=16; + + // If drawing ellipses, exit when they're all drawn + if( dwNumEllipsesToDraw ) + { + if( --dwNumEllipsesToDraw == 0 ) + break; + } + + dwNumChars--; + } + + // Since we allocated vertex data space based on the string length, we now need to + // add some dummy verts for any skipped characters (like newlines, etc.) + while( dwNumChars ) + { + pVertex[0] = 0; + pVertex[1] = 0; + pVertex[2] = 0; + pVertex[3] = 0; + pVertex[4] = 0; + pVertex[5] = 0; + pVertex[6] = 0; + pVertex[7] = 0; + pVertex[8] = 0; + pVertex[9] = 0; + pVertex[10] = 0; + pVertex[11] = 0; + pVertex[12] = 0; + pVertex[13] = 0; + pVertex[14] = 0; + pVertex[15] = 0; + pVertex+=16; + dwNumChars--; + } + + // Stop drawing vertices + pd3dDevice->EndVertices(); + + // Undo window offsets + m_fCursorX -= Winx; + m_fCursorY -= Winy; + + // Call End() to complete the begin/end pair for drawing text + End(); + + // Close off the user-defined event opened with PIXBeginNamedEvent. + PIXEndNamedEvent(); +} + + +//-------------------------------------------------------------------------------------- +// Name: End() +// Desc: Paired call that restores state set in the Begin() call. +//-------------------------------------------------------------------------------------- +VOID XdkFont::End() +{ + if( --m_dwNestedBeginCount > 0 ) + { + PIXEndNamedEvent(); + return; + } + + // Restore state + if( m_bSaveState ) + { + // Cache the global pointer into a register + xdk360_video_t *vid = (xdk360_video_t*)g_d3d; + D3DDevice *pD3dDevice = vid->xdk360_render_device; + + pD3dDevice->SetTexture( 0, NULL ); + pD3dDevice->SetVertexDeclaration( NULL ); + pD3dDevice->SetVertexShader( NULL ); + pD3dDevice->SetPixelShader( NULL ); + pD3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, m_dwSavedState[ SAVEDSTATE_D3DRS_ALPHABLENDENABLE ] ); + pD3dDevice->SetRenderState( D3DRS_SRCBLEND, m_dwSavedState[ SAVEDSTATE_D3DRS_SRCBLEND ] ); + pD3dDevice->SetRenderState( D3DRS_DESTBLEND, m_dwSavedState[ SAVEDSTATE_D3DRS_DESTBLEND ] ); + pD3dDevice->SetRenderState( D3DRS_BLENDOP, m_dwSavedState[ SAVEDSTATE_D3DRS_BLENDOP ] ); + pD3dDevice->SetRenderState( D3DRS_ALPHATESTENABLE, m_dwSavedState[ SAVEDSTATE_D3DRS_ALPHATESTENABLE ] ); + pD3dDevice->SetRenderState( D3DRS_ALPHAREF, m_dwSavedState[ SAVEDSTATE_D3DRS_ALPHAREF ] ); + pD3dDevice->SetRenderState( D3DRS_ALPHAFUNC, m_dwSavedState[ SAVEDSTATE_D3DRS_ALPHAFUNC ] ); + pD3dDevice->SetRenderState( D3DRS_FILLMODE, m_dwSavedState[ SAVEDSTATE_D3DRS_FILLMODE ] ); + pD3dDevice->SetRenderState( D3DRS_CULLMODE, m_dwSavedState[ SAVEDSTATE_D3DRS_CULLMODE ] ); + pD3dDevice->SetRenderState( D3DRS_ZENABLE, m_dwSavedState[ SAVEDSTATE_D3DRS_ZENABLE ] ); + pD3dDevice->SetRenderState( D3DRS_STENCILENABLE, m_dwSavedState[ SAVEDSTATE_D3DRS_STENCILENABLE ] ); + pD3dDevice->SetRenderState( D3DRS_VIEWPORTENABLE, m_dwSavedState[ SAVEDSTATE_D3DRS_VIEWPORTENABLE ] ); + pD3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, m_dwSavedState[ SAVEDSTATE_D3DSAMP_MINFILTER ] ); + pD3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, m_dwSavedState[ SAVEDSTATE_D3DSAMP_MAGFILTER ] ); + pD3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, m_dwSavedState[ SAVEDSTATE_D3DSAMP_ADDRESSU ] ); + pD3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, m_dwSavedState[ SAVEDSTATE_D3DSAMP_ADDRESSV ] ); + } + + PIXEndNamedEvent(); +} + +//-------------------------------------------------------------------------------------- +// Name: RotatePoint() +// Desc: Rotate a 2D point around the origin +//------------------------------------------------------------------------------------- +void XdkFont::RotatePoint( float * X, float * Y, double OriginX, double OriginY ) const +{ + double dTempX = *X - OriginX; + double dTempY = *Y - OriginY; + double dXprime = OriginX + ( m_dRotCos * dTempX - m_dRotSin * dTempY ); + double dYprime = OriginY + ( m_dRotSin * dTempX + m_dRotCos * dTempY ); + + *X = static_cast( dXprime ); + *Y = static_cast( dYprime ); +} diff --git a/360/xdk360_video_debugfonts.h b/360/xdk360_video_debugfonts.h new file mode 100644 index 0000000000..bf7b710bd7 --- /dev/null +++ b/360/xdk360_video_debugfonts.h @@ -0,0 +1,134 @@ +/* SSNES - A Super Nintendo Entertainment System (SNES) Emulator frontend for libsnes. + * Copyright (C) 2010-2012 - Hans-Kristian Arntzen + * Copyright (C) 2011-2012 - Daniel De Matteis + * + * Some code herein may be based on code found in BSNES. + * + * SSNES is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * SSNES is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with SSNES. + * If not, see . + */ + +#ifndef _XDK360_DEBUG_FONTS_H +#define _XDK360_DEBUG_FONTS_H + +#include "xdk360_video_resources.h" + +typedef struct GLYPH_ATTR +{ + unsigned short tu1, tv1, tu2, tv2; // Texture coordinates for the image + short wOffset; // Pixel offset for glyph start + short wWidth; // Pixel width of the glyph + short wAdvance; // Pixels to advance after the glyph + unsigned short wMask; // Channel mask +} GLYPH_ATTR; + +#define ATGFONT_LEFT 0x00000000 +#define ATGFONT_RIGHT 0x00000001 +#define ATGFONT_CENTER_X 0x00000002 +#define ATGFONT_CENTER_Y 0x00000004 +#define ATGFONT_TRUNCATED 0x00000008 + +enum SavedStates +{ + SAVEDSTATE_D3DRS_ALPHABLENDENABLE, + SAVEDSTATE_D3DRS_SRCBLEND, + SAVEDSTATE_D3DRS_DESTBLEND, + SAVEDSTATE_D3DRS_BLENDOP, + SAVEDSTATE_D3DRS_ALPHATESTENABLE, + SAVEDSTATE_D3DRS_ALPHAREF, + SAVEDSTATE_D3DRS_ALPHAFUNC, + SAVEDSTATE_D3DRS_FILLMODE, + SAVEDSTATE_D3DRS_CULLMODE, + SAVEDSTATE_D3DRS_ZENABLE, + SAVEDSTATE_D3DRS_STENCILENABLE, + SAVEDSTATE_D3DRS_VIEWPORTENABLE, + SAVEDSTATE_D3DSAMP_MINFILTER, + SAVEDSTATE_D3DSAMP_MAGFILTER, + SAVEDSTATE_D3DSAMP_ADDRESSU, + SAVEDSTATE_D3DSAMP_ADDRESSV, + + SAVEDSTATE_COUNT +}; + +class XdkFont +{ +public: + PackedResource m_xprResource; + + // Font vertical dimensions taken from the font file + float m_fFontHeight; // Height of the font strike in pixels + float m_fFontTopPadding; // Padding above the strike zone + float m_fFontBottomPadding; // Padding below the strike zone + float m_fFontYAdvance; // Number of pixels to move the cursor for a line feed + + float m_fXScaleFactor; // Scaling constants + float m_fYScaleFactor; + float m_fSlantFactor; // For italics + double m_dRotCos; // Precalculated sine and cosine for italic like rotation + double m_dRotSin; + + D3DRECT m_rcWindow; // Bounds rect if the text window, modify via accessors only! + float m_fCursorX; // Current text cursor + float m_fCursorY; + + // Translator table for supporting unicode ranges + unsigned long m_cMaxGlyph; // Number of entries in the translator table + wchar_t * m_TranslatorTable; // ASCII to glyph lookup table + + // Glyph data for the font + unsigned long m_dwNumGlyphs; // Number of valid glyphs + const GLYPH_ATTR* m_Glyphs; // Array of glyphs + + // D3D rendering objects + D3DTexture* m_pFontTexture; + + // Saved state for rendering (if not using a pure device) + unsigned long m_dwSavedState[ SAVEDSTATE_COUNT ]; + unsigned long m_dwNestedBeginCount; + int m_bSaveState; + + int m_bRotate; +public: + XdkFont(); + ~XdkFont(); + + // Functions to create and destroy the internal objects + HRESULT Create( const char * strFontFileName ); + void Destroy(); + + // Returns the dimensions of a text string + void GetTextExtent( const wchar_t * strText, float * pWidth, + float * pHeight, int bFirstLineOnly=FALSE ) const; + float GetTextWidth( const wchar_t * strText ) const; + + void SetWindow(const D3DRECT &rcWindow ); + void SetWindow( long x1, long y1, long x2, long y2 ); + void GetWindow(D3DRECT &rcWindow) const; + void SetCursorPosition( float fCursorX, float fCursorY ); + + // Public calls to render text. Callers can simply call DrawText(), but for + // performance, they should batch multiple calls together, bracketed by calls to + // Begin() and End(). + void Begin(); + void DrawText( unsigned long dwColor, const wchar_t * strText, unsigned long dwFlags=0L, + float fMaxPixelWidth = 0.0f ); + void DrawText( float sx, float sy, unsigned long dwColor, const wchar_t * strText, + unsigned long dwFlags=0L, float fMaxPixelWidth = 0.0f ); + void End(); + +private: + // Internal helper functions + HRESULT CreateFontShaders(); + void ReleaseFontShaders(); + void RotatePoint( float * X, float * Y, double OriginX, double OriginY ) const; +}; + +#endif \ No newline at end of file diff --git a/360/xdk360_video_debugfonts_.h b/360/xdk360_video_debugfonts_.h deleted file mode 100644 index 8c67d3ad5e..0000000000 --- a/360/xdk360_video_debugfonts_.h +++ /dev/null @@ -1,935 +0,0 @@ -/* SSNES - A Super Nintendo Entertainment System (SNES) Emulator frontend for libsnes. - * Copyright (C) 2010-2012 - Hans-Kristian Arntzen - * Copyright (C) 2011-2012 - Daniel De Matteis - * - * Some code herein may be based on code found in BSNES. - * - * SSNES is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * SSNES is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with SSNES. - * If not, see . - */ - -#define X 0xFFFFFFFF -#define O 0x80000000 -#define N 0x00000000 - -#define FLINE_02222222 O,N,N,N,N,N,N,N - -#define FLINE_00000000 O,O,O,O,O,O,O,O -#define FLINE_00000001 O,O,O,O,O,O,O,X -#define FLINE_00000010 O,O,O,O,O,O,X,O -#define FLINE_00000011 O,O,O,O,O,O,X,X -#define FLINE_00000100 O,O,O,O,O,X,O,O -#define FLINE_00000101 O,O,O,O,O,X,O,X -#define FLINE_00000110 O,O,O,O,O,X,X,O -#define FLINE_00000111 O,O,O,O,O,X,X,X -#define FLINE_00001000 O,O,O,O,X,O,O,O -#define FLINE_00001001 O,O,O,O,X,O,O,X -#define FLINE_00001010 O,O,O,O,X,O,X,O -#define FLINE_00001011 O,O,O,O,X,O,X,X -#define FLINE_00001100 O,O,O,O,X,X,O,O -#define FLINE_00001101 O,O,O,O,X,X,O,X -#define FLINE_00001110 O,O,O,O,X,X,X,O -#define FLINE_00001111 O,O,O,O,X,X,X,X -#define FLINE_00010000 O,O,O,X,O,O,O,O -#define FLINE_00010001 O,O,O,X,O,O,O,X -#define FLINE_00010010 O,O,O,X,O,O,X,O -#define FLINE_00010011 O,O,O,X,O,O,X,X -#define FLINE_00010100 O,O,O,X,O,X,O,O -#define FLINE_00010101 O,O,O,X,O,X,O,X -#define FLINE_00010110 O,O,O,X,O,X,X,O -#define FLINE_00010111 O,O,O,X,O,X,X,X -#define FLINE_00011000 O,O,O,X,X,O,O,O -#define FLINE_00011001 O,O,O,X,X,O,O,X -#define FLINE_00011010 O,O,O,X,X,O,X,O -#define FLINE_00011011 O,O,O,X,X,O,X,X -#define FLINE_00011100 O,O,O,X,X,X,O,O -#define FLINE_00011101 O,O,O,X,X,X,O,X -#define FLINE_00011110 O,O,O,X,X,X,X,O -#define FLINE_00011111 O,O,O,X,X,X,X,X -#define FLINE_00100000 O,O,X,O,O,O,O,O -#define FLINE_00100001 O,O,X,O,O,O,O,X -#define FLINE_00100010 O,O,X,O,O,O,X,O -#define FLINE_00100011 O,O,X,O,O,O,X,X -#define FLINE_00100100 O,O,X,O,O,X,O,O -#define FLINE_00100101 O,O,X,O,O,X,O,X -#define FLINE_00100110 O,O,X,O,O,X,X,O -#define FLINE_00100111 O,O,X,O,O,X,X,X -#define FLINE_00101000 O,O,X,O,X,O,O,O -#define FLINE_00101001 O,O,X,O,X,O,O,X -#define FLINE_00101010 O,O,X,O,X,O,X,O -#define FLINE_00101011 O,O,X,O,X,O,X,X -#define FLINE_00101100 O,O,X,O,X,X,O,O -#define FLINE_00101101 O,O,X,O,X,X,O,X -#define FLINE_00101110 O,O,X,O,X,X,X,O -#define FLINE_00101111 O,O,X,O,X,X,X,X -#define FLINE_00110000 O,O,X,X,O,O,O,O -#define FLINE_00110001 O,O,X,X,O,O,O,X -#define FLINE_00110010 O,O,X,X,O,O,X,O -#define FLINE_00110011 O,O,X,X,O,O,X,X -#define FLINE_00110100 O,O,X,X,O,X,O,O -#define FLINE_00110101 O,O,X,X,O,X,O,X -#define FLINE_00110110 O,O,X,X,O,X,X,O -#define FLINE_00110111 O,O,X,X,O,X,X,X -#define FLINE_00111000 O,O,X,X,X,O,O,O -#define FLINE_00111001 O,O,X,X,X,O,O,X -#define FLINE_00111010 O,O,X,X,X,O,X,O -#define FLINE_00111011 O,O,X,X,X,O,X,X -#define FLINE_00111100 O,O,X,X,X,X,O,O -#define FLINE_00111101 O,O,X,X,X,X,O,X -#define FLINE_00111110 O,O,X,X,X,X,X,O -#define FLINE_00111111 O,O,X,X,X,X,X,X -#define FLINE_01000000 O,X,O,O,O,O,O,O -#define FLINE_01000001 O,X,O,O,O,O,O,X -#define FLINE_01000010 O,X,O,O,O,O,X,O -#define FLINE_01000011 O,X,O,O,O,O,X,X -#define FLINE_01000100 O,X,O,O,O,X,O,O -#define FLINE_01000101 O,X,O,O,O,X,O,X -#define FLINE_01000110 O,X,O,O,O,X,X,O -#define FLINE_01000111 O,X,O,O,O,X,X,X -#define FLINE_01001000 O,X,O,O,X,O,O,O -#define FLINE_01001001 O,X,O,O,X,O,O,X -#define FLINE_01001010 O,X,O,O,X,O,X,O -#define FLINE_01001011 O,X,O,O,X,O,X,X -#define FLINE_01001100 O,X,O,O,X,X,O,O -#define FLINE_01001101 O,X,O,O,X,X,O,X -#define FLINE_01001110 O,X,O,O,X,X,X,O -#define FLINE_01001111 O,X,O,O,X,X,X,X -#define FLINE_01010000 O,X,O,X,O,O,O,O -#define FLINE_01010001 O,X,O,X,O,O,O,X -#define FLINE_01010010 O,X,O,X,O,O,X,O -#define FLINE_01010011 O,X,O,X,O,O,X,X -#define FLINE_01010100 O,X,O,X,O,X,O,O -#define FLINE_01010101 O,X,O,X,O,X,O,X -#define FLINE_01010110 O,X,O,X,O,X,X,O -#define FLINE_01010111 O,X,O,X,O,X,X,X -#define FLINE_01011000 O,X,O,X,X,O,O,O -#define FLINE_01011001 O,X,O,X,X,O,O,X -#define FLINE_01011010 O,X,O,X,X,O,X,O -#define FLINE_01011011 O,X,O,X,X,O,X,X -#define FLINE_01011100 O,X,O,X,X,X,O,O -#define FLINE_01011101 O,X,O,X,X,X,O,X -#define FLINE_01011110 O,X,O,X,X,X,X,O -#define FLINE_01011111 O,X,O,X,X,X,X,X -#define FLINE_01100000 O,X,X,O,O,O,O,O -#define FLINE_01100001 O,X,X,O,O,O,O,X -#define FLINE_01100010 O,X,X,O,O,O,X,O -#define FLINE_01100011 O,X,X,O,O,O,X,X -#define FLINE_01100100 O,X,X,O,O,X,O,O -#define FLINE_01100101 O,X,X,O,O,X,O,X -#define FLINE_01100110 O,X,X,O,O,X,X,O -#define FLINE_01100111 O,X,X,O,O,X,X,X -#define FLINE_01101000 O,X,X,O,X,O,O,O -#define FLINE_01101001 O,X,X,O,X,O,O,X -#define FLINE_01101010 O,X,X,O,X,O,X,O -#define FLINE_01101011 O,X,X,O,X,O,X,X -#define FLINE_01101100 O,X,X,O,X,X,O,O -#define FLINE_01101101 O,X,X,O,X,X,O,X -#define FLINE_01101110 O,X,X,O,X,X,X,O -#define FLINE_01101111 O,X,X,O,X,X,X,X -#define FLINE_01110000 O,X,X,X,O,O,O,O -#define FLINE_01110001 O,X,X,X,O,O,O,X -#define FLINE_01110010 O,X,X,X,O,O,X,O -#define FLINE_01110011 O,X,X,X,O,O,X,X -#define FLINE_01110100 O,X,X,X,O,X,O,O -#define FLINE_01110101 O,X,X,X,O,X,O,X -#define FLINE_01110110 O,X,X,X,O,X,X,O -#define FLINE_01110111 O,X,X,X,O,X,X,X -#define FLINE_01111000 O,X,X,X,X,O,O,O -#define FLINE_01111001 O,X,X,X,X,O,O,X -#define FLINE_01111010 O,X,X,X,X,O,X,O -#define FLINE_01111011 O,X,X,X,X,O,X,X -#define FLINE_01111100 O,X,X,X,X,X,O,O -#define FLINE_01111101 O,X,X,X,X,X,O,X -#define FLINE_01111110 O,X,X,X,X,X,X,O -#define FLINE_01111111 O,X,X,X,X,X,X,X -#define FLINE_10000000 X,O,O,O,O,O,O,O -#define FLINE_10000001 X,O,O,O,O,O,O,X -#define FLINE_10000010 X,O,O,O,O,O,X,O -#define FLINE_10000011 X,O,O,O,O,O,X,X -#define FLINE_10000100 X,O,O,O,O,X,O,O -#define FLINE_10000101 X,O,O,O,O,X,O,X -#define FLINE_10000110 X,O,O,O,O,X,X,O -#define FLINE_10000111 X,O,O,O,O,X,X,X -#define FLINE_10001000 X,O,O,O,X,O,O,O -#define FLINE_10001001 X,O,O,O,X,O,O,X -#define FLINE_10001010 X,O,O,O,X,O,X,O -#define FLINE_10001011 X,O,O,O,X,O,X,X -#define FLINE_10001100 X,O,O,O,X,X,O,O -#define FLINE_10001101 X,O,O,O,X,X,O,X -#define FLINE_10001110 X,O,O,O,X,X,X,O -#define FLINE_10001111 X,O,O,O,X,X,X,X -#define FLINE_10010000 X,O,O,X,O,O,O,O -#define FLINE_10010001 X,O,O,X,O,O,O,X -#define FLINE_10010010 X,O,O,X,O,O,X,O -#define FLINE_10010011 X,O,O,X,O,O,X,X -#define FLINE_10010100 X,O,O,X,O,X,O,O -#define FLINE_10010101 X,O,O,X,O,X,O,X -#define FLINE_10010110 X,O,O,X,O,X,X,O -#define FLINE_10010111 X,O,O,X,O,X,X,X -#define FLINE_10011000 X,O,O,X,X,O,O,O -#define FLINE_10011001 X,O,O,X,X,O,O,X -#define FLINE_10011010 X,O,O,X,X,O,X,O -#define FLINE_10011011 X,O,O,X,X,O,X,X -#define FLINE_10011100 X,O,O,X,X,X,O,O -#define FLINE_10011101 X,O,O,X,X,X,O,X -#define FLINE_10011110 X,O,O,X,X,X,X,O -#define FLINE_10011111 X,O,O,X,X,X,X,X -#define FLINE_10100000 X,O,X,O,O,O,O,O -#define FLINE_10100001 X,O,X,O,O,O,O,X -#define FLINE_10100010 X,O,X,O,O,O,X,O -#define FLINE_10100011 X,O,X,O,O,O,X,X -#define FLINE_10100100 X,O,X,O,O,X,O,O -#define FLINE_10100101 X,O,X,O,O,X,O,X -#define FLINE_10100110 X,O,X,O,O,X,X,O -#define FLINE_10100111 X,O,X,O,O,X,X,X -#define FLINE_10101000 X,O,X,O,X,O,O,O -#define FLINE_10101001 X,O,X,O,X,O,O,X -#define FLINE_10101010 X,O,X,O,X,O,X,O -#define FLINE_10101011 X,O,X,O,X,O,X,X -#define FLINE_10101100 X,O,X,O,X,X,O,O -#define FLINE_10101101 X,O,X,O,X,X,O,X -#define FLINE_10101110 X,O,X,O,X,X,X,O -#define FLINE_10101111 X,O,X,O,X,X,X,X -#define FLINE_10110000 X,O,X,X,O,O,O,O -#define FLINE_10110001 X,O,X,X,O,O,O,X -#define FLINE_10110010 X,O,X,X,O,O,X,O -#define FLINE_10110011 X,O,X,X,O,O,X,X -#define FLINE_10110100 X,O,X,X,O,X,O,O -#define FLINE_10110101 X,O,X,X,O,X,O,X -#define FLINE_10110110 X,O,X,X,O,X,X,O -#define FLINE_10110111 X,O,X,X,O,X,X,X -#define FLINE_10111000 X,O,X,X,X,O,O,O -#define FLINE_10111001 X,O,X,X,X,O,O,X -#define FLINE_10111010 X,O,X,X,X,O,X,O -#define FLINE_10111011 X,O,X,X,X,O,X,X -#define FLINE_10111100 X,O,X,X,X,X,O,O -#define FLINE_10111101 X,O,X,X,X,X,O,X -#define FLINE_10111110 X,O,X,X,X,X,X,O -#define FLINE_10111111 X,O,X,X,X,X,X,X -#define FLINE_11000000 X,X,O,O,O,O,O,O -#define FLINE_11000001 X,X,O,O,O,O,O,X -#define FLINE_11000010 X,X,O,O,O,O,X,O -#define FLINE_11000011 X,X,O,O,O,O,X,X -#define FLINE_11000100 X,X,O,O,O,X,O,O -#define FLINE_11000101 X,X,O,O,O,X,O,X -#define FLINE_11000110 X,X,O,O,O,X,X,O -#define FLINE_11000111 X,X,O,O,O,X,X,X -#define FLINE_11001000 X,X,O,O,X,O,O,O -#define FLINE_11001001 X,X,O,O,X,O,O,X -#define FLINE_11001010 X,X,O,O,X,O,X,O -#define FLINE_11001011 X,X,O,O,X,O,X,X -#define FLINE_11001100 X,X,O,O,X,X,O,O -#define FLINE_11001101 X,X,O,O,X,X,O,X -#define FLINE_11001110 X,X,O,O,X,X,X,O -#define FLINE_11001111 X,X,O,O,X,X,X,X -#define FLINE_11010000 X,X,O,X,O,O,O,O -#define FLINE_11010001 X,X,O,X,O,O,O,X -#define FLINE_11010010 X,X,O,X,O,O,X,O -#define FLINE_11010011 X,X,O,X,O,O,X,X -#define FLINE_11010100 X,X,O,X,O,X,O,O -#define FLINE_11010101 X,X,O,X,O,X,O,X -#define FLINE_11010110 X,X,O,X,O,X,X,O -#define FLINE_11010111 X,X,O,X,O,X,X,X -#define FLINE_11011000 X,X,O,X,X,O,O,O -#define FLINE_11011001 X,X,O,X,X,O,O,X -#define FLINE_11011010 X,X,O,X,X,O,X,O -#define FLINE_11011011 X,X,O,X,X,O,X,X -#define FLINE_11011100 X,X,O,X,X,X,O,O -#define FLINE_11011101 X,X,O,X,X,X,O,X -#define FLINE_11011110 X,X,O,X,X,X,X,O -#define FLINE_11011111 X,X,O,X,X,X,X,X -#define FLINE_11100000 X,X,X,O,O,O,O,O -#define FLINE_11100001 X,X,X,O,O,O,O,X -#define FLINE_11100010 X,X,X,O,O,O,X,O -#define FLINE_11100011 X,X,X,O,O,O,X,X -#define FLINE_11100100 X,X,X,O,O,X,O,O -#define FLINE_11100101 X,X,X,O,O,X,O,X -#define FLINE_11100110 X,X,X,O,O,X,X,O -#define FLINE_11100111 X,X,X,O,O,X,X,X -#define FLINE_11101000 X,X,X,O,X,O,O,O -#define FLINE_11101001 X,X,X,O,X,O,O,X -#define FLINE_11101010 X,X,X,O,X,O,X,O -#define FLINE_11101011 X,X,X,O,X,O,X,X -#define FLINE_11101100 X,X,X,O,X,X,O,O -#define FLINE_11101101 X,X,X,O,X,X,O,X -#define FLINE_11101110 X,X,X,O,X,X,X,O -#define FLINE_11101111 X,X,X,O,X,X,X,X -#define FLINE_11110000 X,X,X,X,O,O,O,O -#define FLINE_11110001 X,X,X,X,O,O,O,X -#define FLINE_11110010 X,X,X,X,O,O,X,O -#define FLINE_11110011 X,X,X,X,O,O,X,X -#define FLINE_11110100 X,X,X,X,O,X,O,O -#define FLINE_11110101 X,X,X,X,O,X,O,X -#define FLINE_11110110 X,X,X,X,O,X,X,O -#define FLINE_11110111 X,X,X,X,O,X,X,X -#define FLINE_11111000 X,X,X,X,X,O,O,O -#define FLINE_11111001 X,X,X,X,X,O,O,X -#define FLINE_11111010 X,X,X,X,X,O,X,O -#define FLINE_11111011 X,X,X,X,X,O,X,X -#define FLINE_11111100 X,X,X,X,X,X,O,O -#define FLINE_11111101 X,X,X,X,X,X,O,X -#define FLINE_11111110 X,X,X,X,X,X,X,O -#define FLINE_11111111 X,X,X,X,X,X,X,X - -/* */ -#define F20_0 FLINE_00000000 -#define F20_1 FLINE_00000000 -#define F20_2 FLINE_00000000 -#define F20_3 FLINE_00000000 -#define F20_4 FLINE_00000000 -/* ! */ -#define F21_0 FLINE_00010000 -#define F21_1 FLINE_00010000 -#define F21_2 FLINE_00010000 -#define F21_3 FLINE_00000000 -#define F21_4 FLINE_00010000 -/* "" */ -#define F22_0 FLINE_00101000 -#define F22_1 FLINE_00101000 -#define F22_2 FLINE_00000000 -#define F22_3 FLINE_00000000 -#define F22_4 FLINE_00000000 -/* # */ -#define F23_0 FLINE_00101000 -#define F23_1 FLINE_01111100 -#define F23_2 FLINE_00101000 -#define F23_3 FLINE_01111100 -#define F23_4 FLINE_00101000 -/* $ */ -#define F24_0 FLINE_00111100 -#define F24_1 FLINE_01010000 -#define F24_2 FLINE_00111000 -#define F24_3 FLINE_00010100 -#define F24_4 FLINE_01111000 -/* % */ -#define F25_0 FLINE_01100100 -#define F25_1 FLINE_01101000 -#define F25_2 FLINE_00010000 -#define F25_3 FLINE_00101100 -#define F25_4 FLINE_01001100 -/* & */ -#define F26_0 FLINE_00111000 -#define F26_1 FLINE_01000000 -#define F26_2 FLINE_00101000 -#define F26_3 FLINE_01010000 -#define F26_4 FLINE_00101000 -/* ` */ -#define F27_0 FLINE_00100000 -#define F27_1 FLINE_00010000 -#define F27_2 FLINE_00000000 -#define F27_3 FLINE_00000000 -#define F27_4 FLINE_00000000 -/* ( */ -#define F28_0 FLINE_00010000 -#define F28_1 FLINE_00100000 -#define F28_2 FLINE_00100000 -#define F28_3 FLINE_00100000 -#define F28_4 FLINE_00010000 -/* ) */ -#define F29_0 FLINE_00100000 -#define F29_1 FLINE_00010000 -#define F29_2 FLINE_00010000 -#define F29_3 FLINE_00010000 -#define F29_4 FLINE_00100000 -/* * */ -#define F2A_0 FLINE_01001000 -#define F2A_1 FLINE_00110000 -#define F2A_2 FLINE_01111000 -#define F2A_3 FLINE_00110000 -#define F2A_4 FLINE_01001000 -/* + */ -#define F2B_0 FLINE_00010000 -#define F2B_1 FLINE_00010000 -#define F2B_2 FLINE_01111100 -#define F2B_3 FLINE_00010000 -#define F2B_4 FLINE_00010000 -/* , */ -#define F2C_0 FLINE_00000000 -#define F2C_1 FLINE_00000000 -#define F2C_2 FLINE_00010000 -#define F2C_3 FLINE_00010000 -#define F2C_4 FLINE_00100000 -/* - */ -#define F2D_0 FLINE_00000000 -#define F2D_1 FLINE_00000000 -#define F2D_2 FLINE_01111100 -#define F2D_3 FLINE_00000000 -#define F2D_4 FLINE_00000000 -/* . */ -#define F2E_0 FLINE_00000000 -#define F2E_1 FLINE_00000000 -#define F2E_2 FLINE_00000000 -#define F2E_3 FLINE_00110000 -#define F2E_4 FLINE_00110000 -/* / */ -#define F2F_0 FLINE_00000100 -#define F2F_1 FLINE_00001000 -#define F2F_2 FLINE_00010000 -#define F2F_3 FLINE_00100000 -#define F2F_4 FLINE_01000000 -/* 0 */ -#define F30_0 FLINE_00110000 -#define F30_1 FLINE_01011000 -#define F30_2 FLINE_01101000 -#define F30_3 FLINE_01101000 -#define F30_4 FLINE_00110000 -/* 1 */ -#define F31_0 FLINE_00010000 -#define F31_1 FLINE_00110000 -#define F31_2 FLINE_00010000 -#define F31_3 FLINE_00010000 -#define F31_4 FLINE_00010000 -/* 2 */ -#define F32_0 FLINE_01110000 -#define F32_1 FLINE_00001000 -#define F32_2 FLINE_00110000 -#define F32_3 FLINE_01000000 -#define F32_4 FLINE_01111000 -/* 3 */ -#define F33_0 FLINE_01110000 -#define F33_1 FLINE_00001000 -#define F33_2 FLINE_00110000 -#define F33_3 FLINE_00001000 -#define F33_4 FLINE_01110000 -/* 4 */ -#define F34_0 FLINE_00001000 -#define F34_1 FLINE_00011000 -#define F34_2 FLINE_00101000 -#define F34_3 FLINE_01111000 -#define F34_4 FLINE_00001000 -/* 5 */ -#define F35_0 FLINE_01111000 -#define F35_1 FLINE_01000000 -#define F35_2 FLINE_01110000 -#define F35_3 FLINE_00001000 -#define F35_4 FLINE_01110000 -/* 6 */ -#define F36_0 FLINE_00111000 -#define F36_1 FLINE_01000000 -#define F36_2 FLINE_01110000 -#define F36_3 FLINE_01001000 -#define F36_4 FLINE_00110000 -/* 7 */ -#define F37_0 FLINE_01111000 -#define F37_1 FLINE_00001000 -#define F37_2 FLINE_00010000 -#define F37_3 FLINE_00100000 -#define F37_4 FLINE_00100000 -/* 8 */ -#define F38_0 FLINE_00110000 -#define F38_1 FLINE_01001000 -#define F38_2 FLINE_00110000 -#define F38_3 FLINE_01001000 -#define F38_4 FLINE_00110000 -/* 9 */ -#define F39_0 FLINE_00110000 -#define F39_1 FLINE_01001000 -#define F39_2 FLINE_00111000 -#define F39_3 FLINE_00001000 -#define F39_4 FLINE_01110000 -/* : */ -#define F3A_0 FLINE_00010000 -#define F3A_1 FLINE_00010000 -#define F3A_2 FLINE_00000000 -#define F3A_3 FLINE_00010000 -#define F3A_4 FLINE_00010000 -/* ; */ -#define F3B_0 FLINE_00010000 -#define F3B_1 FLINE_00010000 -#define F3B_2 FLINE_00000000 -#define F3B_3 FLINE_00010000 -#define F3B_4 FLINE_00100000 -/* < */ -#define F3C_0 FLINE_00001000 -#define F3C_1 FLINE_00010000 -#define F3C_2 FLINE_00100000 -#define F3C_3 FLINE_00010000 -#define F3C_4 FLINE_00001000 -/* = */ -#define F3D_0 FLINE_00000000 -#define F3D_1 FLINE_01111000 -#define F3D_2 FLINE_00000000 -#define F3D_3 FLINE_01111000 -#define F3D_4 FLINE_00000000 -/* > */ -#define F3E_0 FLINE_00100000 -#define F3E_1 FLINE_00010000 -#define F3E_2 FLINE_00001000 -#define F3E_3 FLINE_00010000 -#define F3E_4 FLINE_00100000 -/* ? */ -#define F3F_0 FLINE_01110000 -#define F3F_1 FLINE_00001000 -#define F3F_2 FLINE_00110000 -#define F3F_3 FLINE_00000000 -#define F3F_4 FLINE_00100000 -/* @ */ -#define F40_0 FLINE_00111000 -#define F40_1 FLINE_01000100 -#define F40_2 FLINE_01000100 -#define F40_3 FLINE_01000100 -#define F40_4 FLINE_00111000 -/* A */ -#define F41_0 FLINE_00110000 -#define F41_1 FLINE_01001000 -#define F41_2 FLINE_01111000 -#define F41_3 FLINE_01001000 -#define F41_4 FLINE_01001000 -/* B */ -#define F42_0 FLINE_01110000 -#define F42_1 FLINE_01001000 -#define F42_2 FLINE_01110000 -#define F42_3 FLINE_01001000 -#define F42_4 FLINE_01110000 -/* C */ -#define F43_0 FLINE_00111000 -#define F43_1 FLINE_01000000 -#define F43_2 FLINE_01000000 -#define F43_3 FLINE_01000000 -#define F43_4 FLINE_00111000 -/* D */ -#define F44_0 FLINE_01110000 -#define F44_1 FLINE_01001000 -#define F44_2 FLINE_01001000 -#define F44_3 FLINE_01001000 -#define F44_4 FLINE_01110000 -/* E */ -#define F45_0 FLINE_01111000 -#define F45_1 FLINE_01000000 -#define F45_2 FLINE_01110000 -#define F45_3 FLINE_01000000 -#define F45_4 FLINE_01111000 -/* F */ -#define F46_0 FLINE_01111000 -#define F46_1 FLINE_01000000 -#define F46_2 FLINE_01110000 -#define F46_3 FLINE_01000000 -#define F46_4 FLINE_01000000 -/* G */ -#define F47_0 FLINE_00111000 -#define F47_1 FLINE_01000000 -#define F47_2 FLINE_01011000 -#define F47_3 FLINE_01001000 -#define F47_4 FLINE_00111000 -/* H */ -#define F48_0 FLINE_01001000 -#define F48_1 FLINE_01001000 -#define F48_2 FLINE_01111000 -#define F48_3 FLINE_01001000 -#define F48_4 FLINE_01001000 -/* I */ -#define F49_0 FLINE_00111000 -#define F49_1 FLINE_00010000 -#define F49_2 FLINE_00010000 -#define F49_3 FLINE_00010000 -#define F49_4 FLINE_00111000 -/* J */ -#define F4A_0 FLINE_00011100 -#define F4A_1 FLINE_00001000 -#define F4A_2 FLINE_00001000 -#define F4A_3 FLINE_01001000 -#define F4A_4 FLINE_00110000 -/* K */ -#define F4B_0 FLINE_01001000 -#define F4B_1 FLINE_01010000 -#define F4B_2 FLINE_01100000 -#define F4B_3 FLINE_01010000 -#define F4B_4 FLINE_01001000 -/* L */ -#define F4C_0 FLINE_01000000 -#define F4C_1 FLINE_01000000 -#define F4C_2 FLINE_01000000 -#define F4C_3 FLINE_01000000 -#define F4C_4 FLINE_01111000 -/* M */ -#define F4D_0 FLINE_01001000 -#define F4D_1 FLINE_01111000 -#define F4D_2 FLINE_01111000 -#define F4D_3 FLINE_01001000 -#define F4D_4 FLINE_01001000 -/* N */ -#define F4E_0 FLINE_01001000 -#define F4E_1 FLINE_01101000 -#define F4E_2 FLINE_01011000 -#define F4E_3 FLINE_01001000 -#define F4E_4 FLINE_01001000 -/* O */ -#define F4F_0 FLINE_00110000 -#define F4F_1 FLINE_01001000 -#define F4F_2 FLINE_01001000 -#define F4F_3 FLINE_01001000 -#define F4F_4 FLINE_00110000 -/* P */ -#define F50_0 FLINE_01110000 -#define F50_1 FLINE_01001000 -#define F50_2 FLINE_01110000 -#define F50_3 FLINE_01000000 -#define F50_4 FLINE_01000000 -/* Q */ -#define F51_0 FLINE_00110000 -#define F51_1 FLINE_01001000 -#define F51_2 FLINE_01001000 -#define F51_3 FLINE_00110000 -#define F51_4 FLINE_00011000 -/* R */ -#define F52_0 FLINE_01110000 -#define F52_1 FLINE_01001000 -#define F52_2 FLINE_01110000 -#define F52_3 FLINE_01001000 -#define F52_4 FLINE_01001000 -/* S */ -#define F53_0 FLINE_00111000 -#define F53_1 FLINE_01000000 -#define F53_2 FLINE_00110000 -#define F53_3 FLINE_00001000 -#define F53_4 FLINE_01110000 -/* T */ -#define F54_0 FLINE_01111100 -#define F54_1 FLINE_00010000 -#define F54_2 FLINE_00010000 -#define F54_3 FLINE_00010000 -#define F54_4 FLINE_00010000 -/* U */ -#define F55_0 FLINE_01001000 -#define F55_1 FLINE_01001000 -#define F55_2 FLINE_01001000 -#define F55_3 FLINE_01001000 -#define F55_4 FLINE_00110000 -/* V */ -#define F56_0 FLINE_01001000 -#define F56_1 FLINE_01001000 -#define F56_2 FLINE_01001000 -#define F56_3 FLINE_00110000 -#define F56_4 FLINE_00110000 -/* W */ -#define F57_0 FLINE_01001000 -#define F57_1 FLINE_01001000 -#define F57_2 FLINE_01111000 -#define F57_3 FLINE_01111000 -#define F57_4 FLINE_01001000 -/* X */ -#define F58_0 FLINE_01001000 -#define F58_1 FLINE_01001000 -#define F58_2 FLINE_00110000 -#define F58_3 FLINE_01001000 -#define F58_4 FLINE_01001000 -/* Y */ -#define F59_0 FLINE_01000100 -#define F59_1 FLINE_01000100 -#define F59_2 FLINE_00101000 -#define F59_3 FLINE_00010000 -#define F59_4 FLINE_00010000 -/* Z */ -#define F5A_0 FLINE_01111000 -#define F5A_1 FLINE_00001000 -#define F5A_2 FLINE_00110000 -#define F5A_3 FLINE_01000000 -#define F5A_4 FLINE_01111000 -/* [ */ -#define F5B_0 FLINE_00110000 -#define F5B_1 FLINE_00100000 -#define F5B_2 FLINE_00100000 -#define F5B_3 FLINE_00100000 -#define F5B_4 FLINE_00110000 -/* \ */ -#define F5C_0 FLINE_01000000 -#define F5C_1 FLINE_00100000 -#define F5C_2 FLINE_00010000 -#define F5C_3 FLINE_00001000 -#define F5C_4 FLINE_00000100 -/* ] */ -#define F5D_0 FLINE_00110000 -#define F5D_1 FLINE_00010000 -#define F5D_2 FLINE_00010000 -#define F5D_3 FLINE_00010000 -#define F5D_4 FLINE_00110000 -/* ^ */ -#define F5E_0 FLINE_00010000 -#define F5E_1 FLINE_00101000 -#define F5E_2 FLINE_00000000 -#define F5E_3 FLINE_00000000 -#define F5E_4 FLINE_00000000 -/* _ */ -#define F5F_0 FLINE_00000000 -#define F5F_1 FLINE_00000000 -#define F5F_2 FLINE_00000000 -#define F5F_3 FLINE_00000000 -#define F5F_4 FLINE_01111000 -/* ' */ -#define F60_0 FLINE_00010000 -#define F60_1 FLINE_00100000 -#define F60_2 FLINE_00000000 -#define F60_3 FLINE_00000000 -#define F60_4 FLINE_00000000 -/* a */ -#define F61_0 FLINE_00000000 -#define F61_1 FLINE_00111000 -#define F61_2 FLINE_01001000 -#define F61_3 FLINE_01011000 -#define F61_4 FLINE_00101000 -/* b */ -#define F62_0 FLINE_01000000 -#define F62_1 FLINE_01110000 -#define F62_2 FLINE_01001000 -#define F62_3 FLINE_01001000 -#define F62_4 FLINE_01110000 -/* c */ -#define F63_0 FLINE_00000000 -#define F63_1 FLINE_00111000 -#define F63_2 FLINE_01000000 -#define F63_3 FLINE_01000000 -#define F63_4 FLINE_00111000 -/* d */ -#define F64_0 FLINE_00001000 -#define F64_1 FLINE_00111000 -#define F64_2 FLINE_01001000 -#define F64_3 FLINE_01001000 -#define F64_4 FLINE_00111000 -/* e */ -#define F65_0 FLINE_00000000 -#define F65_1 FLINE_00110000 -#define F65_2 FLINE_01111000 -#define F65_3 FLINE_01000000 -#define F65_4 FLINE_00110000 -/* f */ -#define F66_0 FLINE_00011000 -#define F66_1 FLINE_00100000 -#define F66_2 FLINE_01110000 -#define F66_3 FLINE_00100000 -#define F66_4 FLINE_00100000 -/* g */ -#define F67_0 FLINE_00111000 -#define F67_1 FLINE_01001000 -#define F67_2 FLINE_00111000 -#define F67_3 FLINE_00001000 -#define F67_4 FLINE_00110000 -/* h */ -#define F68_0 FLINE_01000000 -#define F68_1 FLINE_01110000 -#define F68_2 FLINE_01001000 -#define F68_3 FLINE_01001000 -#define F68_4 FLINE_01001000 -/* i */ -#define F69_0 FLINE_00010000 -#define F69_1 FLINE_00000000 -#define F69_2 FLINE_00010000 -#define F69_3 FLINE_00010000 -#define F69_4 FLINE_00010000 -/* j */ -#define F6A_0 FLINE_00001000 -#define F6A_1 FLINE_00000000 -#define F6A_2 FLINE_00001000 -#define F6A_3 FLINE_01001000 -#define F6A_4 FLINE_00110000 -/* k */ -#define F6B_0 FLINE_01000000 -#define F6B_1 FLINE_01011000 -#define F6B_2 FLINE_01100000 -#define F6B_3 FLINE_01010000 -#define F6B_4 FLINE_01001000 -/* l */ -#define F6C_0 FLINE_00110000 -#define F6C_1 FLINE_00010000 -#define F6C_2 FLINE_00010000 -#define F6C_3 FLINE_00010000 -#define F6C_4 FLINE_00111000 -/* m */ -#define F6D_0 FLINE_00000000 -#define F6D_1 FLINE_01001000 -#define F6D_2 FLINE_01111000 -#define F6D_3 FLINE_01001000 -#define F6D_4 FLINE_01001000 -/* n */ -#define F6E_0 FLINE_00000000 -#define F6E_1 FLINE_01010000 -#define F6E_2 FLINE_01101000 -#define F6E_3 FLINE_01001000 -#define F6E_4 FLINE_01001000 -/* o */ -#define F6F_0 FLINE_00000000 -#define F6F_1 FLINE_00110000 -#define F6F_2 FLINE_01001000 -#define F6F_3 FLINE_01001000 -#define F6F_4 FLINE_00110000 -/* p */ -#define F70_0 FLINE_01110000 -#define F70_1 FLINE_01001000 -#define F70_2 FLINE_01001000 -#define F70_3 FLINE_01110000 -#define F70_4 FLINE_01000000 -/* q */ -#define F71_0 FLINE_00111000 -#define F71_1 FLINE_01001000 -#define F71_2 FLINE_01001000 -#define F71_3 FLINE_00111000 -#define F71_4 FLINE_00001000 -/* r */ -#define F72_0 FLINE_00000000 -#define F72_1 FLINE_01011000 -#define F72_2 FLINE_01100000 -#define F72_3 FLINE_01000000 -#define F72_4 FLINE_01000000 -/* s */ -#define F73_0 FLINE_00000000 -#define F73_1 FLINE_00111000 -#define F73_2 FLINE_01100000 -#define F73_3 FLINE_00011000 -#define F73_4 FLINE_01110000 -/* t */ -#define F74_0 FLINE_00100000 -#define F74_1 FLINE_01111000 -#define F74_2 FLINE_00100000 -#define F74_3 FLINE_00100000 -#define F74_4 FLINE_00011000 -/* u */ -#define F75_0 FLINE_00000000 -#define F75_1 FLINE_01001000 -#define F75_2 FLINE_01001000 -#define F75_3 FLINE_01011000 -#define F75_4 FLINE_00101000 -/* v */ -#define F76_0 FLINE_00000000 -#define F76_1 FLINE_01001000 -#define F76_2 FLINE_01001000 -#define F76_3 FLINE_00110000 -#define F76_4 FLINE_00110000 -/* w */ -#define F77_0 FLINE_00000000 -#define F77_1 FLINE_01001000 -#define F77_2 FLINE_01001000 -#define F77_3 FLINE_01111000 -#define F77_4 FLINE_01001000 -/* x */ -#define F78_0 FLINE_00000000 -#define F78_1 FLINE_01001000 -#define F78_2 FLINE_00110000 -#define F78_3 FLINE_00110000 -#define F78_4 FLINE_01001000 -/* y */ -#define F79_0 FLINE_01001000 -#define F79_1 FLINE_01001000 -#define F79_2 FLINE_00111000 -#define F79_3 FLINE_00001000 -#define F79_4 FLINE_00110000 -/* z */ -#define F7A_0 FLINE_00000000 -#define F7A_1 FLINE_01111000 -#define F7A_2 FLINE_00010000 -#define F7A_3 FLINE_00100000 -#define F7A_4 FLINE_01111000 -/* { */ -#define F7B_0 FLINE_00001000 -#define F7B_1 FLINE_00010000 -#define F7B_2 FLINE_00110000 -#define F7B_3 FLINE_00010000 -#define F7B_4 FLINE_00001000 -/* | */ -#define F7C_0 FLINE_00010000 -#define F7C_1 FLINE_00010000 -#define F7C_2 FLINE_00010000 -#define F7C_3 FLINE_00010000 -#define F7C_4 FLINE_00010000 -/* } */ -#define F7D_0 FLINE_00100000 -#define F7D_1 FLINE_00010000 -#define F7D_2 FLINE_00011000 -#define F7D_3 FLINE_00010000 -#define F7D_4 FLINE_00100000 -/* ~ */ -#define F7E_0 FLINE_00101000 -#define F7E_1 FLINE_01010000 -#define F7E_2 FLINE_00000000 -#define F7E_3 FLINE_00000000 -#define F7E_4 FLINE_00000000 -/* */ -#define F7F_0 FLINE_01111100 -#define F7F_1 FLINE_01111100 -#define F7F_2 FLINE_01111100 -#define F7F_3 FLINE_01111100 -#define F7F_4 FLINE_01111100 -/* BLANK */ -#define F00_0 FLINE_00000000 -/* EOL */ -#define F9F_0 FLINE_02222222 - -DWORD FontData_5x5[] = { - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0, - F20_0,F21_0,F22_0,F23_0,F24_0,F25_0,F26_0,F27_0,F28_0,F29_0,F2A_0,F2B_0,F2C_0,F2D_0,F2E_0,F2F_0, - F20_1,F21_1,F22_1,F23_1,F24_1,F25_1,F26_1,F27_1,F28_1,F29_1,F2A_1,F2B_1,F2C_1,F2D_1,F2E_1,F2F_1, - F20_2,F21_2,F22_2,F23_2,F24_2,F25_2,F26_2,F27_2,F28_2,F29_2,F2A_2,F2B_2,F2C_2,F2D_2,F2E_2,F2F_2, - F20_3,F21_3,F22_3,F23_3,F24_3,F25_3,F26_3,F27_3,F28_3,F29_3,F2A_3,F2B_3,F2C_3,F2D_3,F2E_3,F2F_3, - F20_4,F21_4,F22_4,F23_4,F24_4,F25_4,F26_4,F27_4,F28_4,F29_4,F2A_4,F2B_4,F2C_4,F2D_4,F2E_4,F2F_4, - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0, - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0, - - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0, - F30_0,F31_0,F32_0,F33_0,F34_0,F35_0,F36_0,F37_0,F38_0,F39_0,F3A_0,F3B_0,F3C_0,F3D_0,F3E_0,F3F_0, - F30_1,F31_1,F32_1,F33_1,F34_1,F35_1,F36_1,F37_1,F38_1,F39_1,F3A_1,F3B_1,F3C_1,F3D_1,F3E_1,F3F_1, - F30_2,F31_2,F32_2,F33_2,F34_2,F35_2,F36_2,F37_2,F38_2,F39_2,F3A_2,F3B_2,F3C_2,F3D_2,F3E_2,F3F_2, - F30_3,F31_3,F32_3,F33_3,F34_3,F35_3,F36_3,F37_3,F38_3,F39_3,F3A_3,F3B_3,F3C_3,F3D_3,F3E_3,F3F_3, - F30_4,F31_4,F32_4,F33_4,F34_4,F35_4,F36_4,F37_4,F38_4,F39_4,F3A_4,F3B_4,F3C_4,F3D_4,F3E_4,F3F_4, - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0, - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0, - - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0, - F40_0,F41_0,F42_0,F43_0,F44_0,F45_0,F46_0,F47_0,F48_0,F49_0,F4A_0,F4B_0,F4C_0,F4D_0,F4E_0,F4F_0, - F40_1,F41_1,F42_1,F43_1,F44_1,F45_1,F46_1,F47_1,F48_1,F49_1,F4A_1,F4B_1,F4C_1,F4D_1,F4E_1,F4F_1, - F40_2,F41_2,F42_2,F43_2,F44_2,F45_2,F46_2,F47_2,F48_2,F49_2,F4A_2,F4B_2,F4C_2,F4D_2,F4E_2,F4F_2, - F40_3,F41_3,F42_3,F43_3,F44_3,F45_3,F46_3,F47_3,F48_3,F49_3,F4A_3,F4B_3,F4C_3,F4D_3,F4E_3,F4F_3, - F40_4,F41_4,F42_4,F43_4,F44_4,F45_4,F46_4,F47_4,F48_4,F49_4,F4A_4,F4B_4,F4C_4,F4D_4,F4E_4,F4F_4, - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0, - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0, - - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0, - F50_0,F51_0,F52_0,F53_0,F54_0,F55_0,F56_0,F57_0,F58_0,F59_0,F5A_0,F5B_0,F5C_0,F5D_0,F5E_0,F5F_0, - F50_1,F51_1,F52_1,F53_1,F54_1,F55_1,F56_1,F57_1,F58_1,F59_1,F5A_1,F5B_1,F5C_1,F5D_1,F5E_1,F5F_1, - F50_2,F51_2,F52_2,F53_2,F54_2,F55_2,F56_2,F57_2,F58_2,F59_2,F5A_2,F5B_2,F5C_2,F5D_2,F5E_2,F5F_2, - F50_3,F51_3,F52_3,F53_3,F54_3,F55_3,F56_3,F57_3,F58_3,F59_3,F5A_3,F5B_3,F5C_3,F5D_3,F5E_3,F5F_3, - F50_4,F51_4,F52_4,F53_4,F54_4,F55_4,F56_4,F57_4,F58_4,F59_4,F5A_4,F5B_4,F5C_4,F5D_4,F5E_4,F5F_4, - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0, - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0, - - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0, - F60_0,F61_0,F62_0,F63_0,F64_0,F65_0,F66_0,F67_0,F68_0,F69_0,F6A_0,F6B_0,F6C_0,F6D_0,F6E_0,F6F_0, - F60_1,F61_1,F62_1,F63_1,F64_1,F65_1,F66_1,F67_1,F68_1,F69_1,F6A_1,F6B_1,F6C_1,F6D_1,F6E_1,F6F_1, - F60_2,F61_2,F62_2,F63_2,F64_2,F65_2,F66_2,F67_2,F68_2,F69_2,F6A_2,F6B_2,F6C_2,F6D_2,F6E_2,F6F_2, - F60_3,F61_3,F62_3,F63_3,F64_3,F65_3,F66_3,F67_3,F68_3,F69_3,F6A_3,F6B_3,F6C_3,F6D_3,F6E_3,F6F_3, - F60_4,F61_4,F62_4,F63_4,F64_4,F65_4,F66_4,F67_4,F68_4,F69_4,F6A_4,F6B_4,F6C_4,F6D_4,F6E_4,F6F_4, - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0, - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0, - - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0, - F70_0,F71_0,F72_0,F73_0,F74_0,F75_0,F76_0,F77_0,F78_0,F79_0,F7A_0,F7B_0,F7C_0,F7D_0,F7E_0,F7F_0, - F70_1,F71_1,F72_1,F73_1,F74_1,F75_1,F76_1,F77_1,F78_1,F79_1,F7A_1,F7B_1,F7C_1,F7D_1,F7E_1,F7F_1, - F70_2,F71_2,F72_2,F73_2,F74_2,F75_2,F76_2,F77_2,F78_2,F79_2,F7A_2,F7B_2,F7C_2,F7D_2,F7E_2,F7F_2, - F70_3,F71_3,F72_3,F73_3,F74_3,F75_3,F76_3,F77_3,F78_3,F79_3,F7A_3,F7B_3,F7C_3,F7D_3,F7E_3,F7F_3, - F70_4,F71_4,F72_4,F73_4,F74_4,F75_4,F76_4,F77_4,F78_4,F79_4,F7A_4,F7B_4,F7C_4,F7D_4,F7E_4,F7F_4, - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0, - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0, - - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0, - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0, - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0, - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0, - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0, - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0, - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0, - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0, - - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F9F_0, - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F9F_0, - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F9F_0, - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F9F_0, - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F9F_0, - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F9F_0, - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F9F_0, - F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F00_0,F9F_0, -}; \ No newline at end of file diff --git a/360/xdk360_video_resources.cpp b/360/xdk360_video_resources.cpp new file mode 100644 index 0000000000..f9594f8964 --- /dev/null +++ b/360/xdk360_video_resources.cpp @@ -0,0 +1,221 @@ +/* SSNES - A Super Nintendo Entertainment System (SNES) Emulator frontend for libsnes. + * Copyright (C) 2010-2012 - Hans-Kristian Arntzen + * Copyright (C) 2011-2012 - Daniel De Matteis + * + * Some code herein may be based on code found in BSNES. + * + * SSNES is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * SSNES is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with SSNES. + * If not, see . + */ + +#include +#include +#include "xdk360_video.h" +#include "xdk360_video_resources.h" +#include "../general.h" + +//-------------------------------------------------------------------------------------- +// Magic values to identify XPR files +//-------------------------------------------------------------------------------------- +struct XPR_HEADER +{ + unsigned long dwMagic; + unsigned long dwHeaderSize; + unsigned long dwDataSize; +}; + +const unsigned long XPR2_MAGIC_VALUE = 0x58505232; +const unsigned long eXALLOCAllocatorId_AtgResource = eXALLOCAllocatorId_GameMax; + + +//-------------------------------------------------------------------------------------- +// Name: PackedResource +//-------------------------------------------------------------------------------------- +PackedResource::PackedResource() +{ + m_pSysMemData = NULL; + m_dwSysMemDataSize = 0L; + m_pVidMemData = NULL; + m_dwVidMemDataSize = 0L; + m_pResourceTags = NULL; + m_dwNumResourceTags = 0L; + m_bInitialized = FALSE; +} + + +//-------------------------------------------------------------------------------------- +// Name: PackedResource +//-------------------------------------------------------------------------------------- +PackedResource::~PackedResource() +{ + Destroy(); +} + +//-------------------------------------------------------------------------------------- +// Name: GetData +// Desc: Loads all the texture resources from the given XPR. +//-------------------------------------------------------------------------------------- +void * PackedResource::GetData( const char * strName ) const +{ + if( m_pResourceTags == NULL || strName == NULL ) + return NULL; + + for( unsigned long i = 0; i < m_dwNumResourceTags; i++ ) + { + if( !_stricmp( strName, m_pResourceTags[i].strName ) ) + return &m_pSysMemData[m_pResourceTags[i].dwOffset]; + } + + return NULL; +} + +//-------------------------------------------------------------------------------------- +// Name: Create +// Desc: Loads all the texture resources from the given XPR. +//-------------------------------------------------------------------------------------- +HRESULT PackedResource::Create( const char * strFilename ) +{ + // Open the file + unsigned long dwNumBytesRead; + HANDLE hFile = CreateFile( strFilename, GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL ); + if( hFile == INVALID_HANDLE_VALUE ) + { + SSNES_ERR( "File <%s> not found.\n", strFilename ); + return E_FAIL; + } + + // Read in and verify the XPR magic header + XPR_HEADER xprh; + if( !ReadFile( hFile, &xprh, sizeof( XPR_HEADER ), &dwNumBytesRead, NULL ) ) + { + SSNES_ERR( "Error reading XPR header in file <%s>.\n", strFilename ); + CloseHandle( hFile ); + return E_FAIL; + } + + if( xprh.dwMagic != XPR2_MAGIC_VALUE ) + { + SSNES_ERR( "Invalid Xbox Packed Resource (.xpr) file: Magic = 0x%08lx\n", xprh.dwMagic ); + CloseHandle( hFile ); + return E_FAIL; + } + + // Compute memory requirements + m_dwSysMemDataSize = xprh.dwHeaderSize; + m_dwVidMemDataSize = xprh.dwDataSize; + + // Allocate memory + m_pSysMemData = new BYTE[m_dwSysMemDataSize]; + if( m_pSysMemData == NULL ) + { + SSNES_ERR( "Could not allocate system memory.\n" ); + m_dwSysMemDataSize = 0; + return E_FAIL; + } + m_pVidMemData = ( BYTE* )XMemAlloc( m_dwVidMemDataSize, MAKE_XALLOC_ATTRIBUTES( 0, 0, 0, 0, eXALLOCAllocatorId_AtgResource, + XALLOC_PHYSICAL_ALIGNMENT_4K, XALLOC_MEMPROTECT_WRITECOMBINE, 0, XALLOC_MEMTYPE_PHYSICAL ) ); + + if( m_pVidMemData == NULL ) + { + SSNES_ERR( "Could not allocate physical memory.\n" ); + m_dwSysMemDataSize = 0; + m_dwVidMemDataSize = 0; + delete[] m_pSysMemData; + m_pSysMemData = NULL; + return E_FAIL; + } + + // Read in the data from the file + if( !ReadFile( hFile, m_pSysMemData, m_dwSysMemDataSize, &dwNumBytesRead, NULL ) || + !ReadFile( hFile, m_pVidMemData, m_dwVidMemDataSize, &dwNumBytesRead, NULL ) ) + { + SSNES_ERR( "Unable to read Xbox Packed Resource (.xpr) file\n" ); + CloseHandle( hFile ); + return E_FAIL; + } + + // Done with the file + CloseHandle( hFile ); + + // Extract resource table from the header data + m_dwNumResourceTags = *( unsigned long * )( m_pSysMemData + 0 ); + m_pResourceTags = ( RESOURCE* )( m_pSysMemData + 4 ); + + // Patch up the resources + for( DWORD i = 0; i < m_dwNumResourceTags; i++ ) + { + m_pResourceTags[i].strName = ( CHAR* )( m_pSysMemData + ( DWORD )m_pResourceTags[i].strName ); + + // Fixup the texture memory + if( ( m_pResourceTags[i].dwType & 0xffff0000 ) == ( RESOURCETYPE_TEXTURE & 0xffff0000 ) ) + { + D3DTexture* pTexture = ( D3DTexture* )&m_pSysMemData[m_pResourceTags[i].dwOffset]; + // Adjust Base address according to where memory was allocated + XGOffsetBaseTextureAddress( pTexture, m_pVidMemData, m_pVidMemData ); + + // Let PIX know the name of the texture + PIXSetTextureName(pTexture, m_pResourceTags[i].strName); + } + } + + m_bInitialized = TRUE; + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Name: GetResourceTags +// Desc: Retrieves the resource tags +//-------------------------------------------------------------------------------------- +void PackedResource::GetResourceTags( unsigned long * pdwNumResourceTags, + RESOURCE** ppResourceTags ) const +{ + if( pdwNumResourceTags ) + ( *pdwNumResourceTags ) = m_dwNumResourceTags; + + if( ppResourceTags ) + ( *ppResourceTags ) = m_pResourceTags; +} + + +//-------------------------------------------------------------------------------------- +// Name: Destroy +// Desc: Cleans up the packed resource data +//-------------------------------------------------------------------------------------- +void PackedResource::Destroy() +{ + delete[] m_pSysMemData; + m_pSysMemData = NULL; + m_dwSysMemDataSize = 0L; + + if( m_pVidMemData != NULL ) + XMemFree( m_pVidMemData, MAKE_XALLOC_ATTRIBUTES( 0, 0, 0, 0, eXALLOCAllocatorId_AtgResource, + 0, 0, 0, XALLOC_MEMTYPE_PHYSICAL ) ); + + m_pVidMemData = NULL; + m_dwVidMemDataSize = 0L; + + m_pResourceTags = NULL; + m_dwNumResourceTags = 0L; + + m_bInitialized = FALSE; +} + +//-------------------------------------------------------------------------------------- +// Name: Initialized +// Desc: Indicates whether the packed resource has been successfully initialized +//-------------------------------------------------------------------------------------- +BOOL PackedResource::Initialized() const +{ + return m_bInitialized; +} diff --git a/360/xdk360_video_resources.h b/360/xdk360_video_resources.h new file mode 100644 index 0000000000..01e80e6983 --- /dev/null +++ b/360/xdk360_video_resources.h @@ -0,0 +1,158 @@ +/* SSNES - A Super Nintendo Entertainment System (SNES) Emulator frontend for libsnes. + * Copyright (C) 2010-2012 - Hans-Kristian Arntzen + * Copyright (C) 2011-2012 - Daniel De Matteis + * + * Some code herein may be based on code found in BSNES. + * + * SSNES is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * SSNES is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with SSNES. + * If not, see . + */ + +#pragma once + +#ifndef ATGRESOURCE_H +#define ATGRESOURCE_H + +//-------------------------------------------------------------------------------------- +// Name tag for resources. An app may initialize this structure, and pass +// it to the resource's Create() function. From then on, the app may call +// GetResource() to retrieve a resource using an ascii name. +//-------------------------------------------------------------------------------------- +struct RESOURCE +{ + unsigned long dwType; + unsigned long dwOffset; + unsigned long dwSize; + char * strName; +}; + + +// Resource types +enum +{ + RESOURCETYPE_USERDATA = ( ( 'U' << 24 ) | ( 'S' << 16 ) | ( 'E' << 8 ) | ( 'R' ) ), + RESOURCETYPE_TEXTURE = ( ( 'T' << 24 ) | ( 'X' << 16 ) | ( '2' << 8 ) | ( 'D' ) ), + RESOURCETYPE_CUBEMAP = ( ( 'T' << 24 ) | ( 'X' << 16 ) | ( 'C' << 8 ) | ( 'M' ) ), + RESOURCETYPE_VOLUMETEXTURE = ( ( 'T' << 24 ) | ( 'X' << 16 ) | ( '3' << 8 ) | ( 'D' ) ), + RESOURCETYPE_VERTEXBUFFER = ( ( 'V' << 24 ) | ( 'B' << 16 ) | ( 'U' << 8 ) | ( 'F' ) ), + RESOURCETYPE_INDEXBUFFER = ( ( 'I' << 24 ) | ( 'B' << 16 ) | ( 'U' << 8 ) | ( 'F' ) ), + RESOURCETYPE_EOF = 0xffffffff +}; + + +//-------------------------------------------------------------------------------------- +// Name: PackedResource +//-------------------------------------------------------------------------------------- +class PackedResource +{ +protected: + unsigned char * m_pSysMemData; // Alloc'ed memory for resource headers etc. + unsigned long m_dwSysMemDataSize; + + unsigned char * m_pVidMemData; // Alloc'ed memory for resource data, etc. + unsigned long m_dwVidMemDataSize; + + RESOURCE* m_pResourceTags; // Tags to associate names with the resources + unsigned long m_dwNumResourceTags; // Number of resource tags + int m_bInitialized; // Resource is fully initialized + +public: + // Loads the resources out of the specified bundle + HRESULT Create( const char * strFilename ); + + void Destroy(); + + BOOL Initialized() const; + + // Retrieves the resource tags + void GetResourceTags( unsigned long * pdwNumResourceTags, + RESOURCE** ppResourceTags ) const; + + // Helper function to make sure a resource is registered + D3DResource* RegisterResource( D3DResource* pResource ) const + { + return pResource; + } + + // Functions to retrieve resources by their offset + void * GetData( unsigned long dwOffset ) const + { + return &m_pSysMemData[dwOffset]; + } + + D3DResource* GetResource( unsigned long dwOffset ) const + { + return RegisterResource( ( D3DResource* )GetData( dwOffset ) ); + } + + D3DTexture* GetTexture( unsigned long dwOffset ) const + { + return ( D3DTexture* )GetResource( dwOffset ); + } + + D3DArrayTexture* GetArrayTexture( unsigned long dwOffset ) const + { + return ( D3DArrayTexture* )GetResource( dwOffset ); + } + + D3DCubeTexture* GetCubemap( unsigned long dwOffset ) const + { + return ( D3DCubeTexture* )GetResource( dwOffset ); + } + + D3DVolumeTexture* GetVolumeTexture( unsigned long dwOffset ) const + { + return ( D3DVolumeTexture* )GetResource( dwOffset ); + } + + D3DVertexBuffer* GetVertexBuffer( unsigned long dwOffset ) const + { + return ( D3DVertexBuffer* )GetResource( dwOffset ); + } + + // Functions to retrieve resources by their name + void * GetData( const char * strName ) const; + + D3DResource* GetResource( const char * strName ) const + { + return RegisterResource( ( D3DResource* )GetData( strName ) ); + } + + D3DTexture* GetTexture( const char * strName ) const + { + return ( D3DTexture* )GetResource( strName ); + } + + D3DArrayTexture* GetArrayTexture( const char * strName ) const + { + return ( D3DArrayTexture* )GetResource( strName ); + } + + D3DCubeTexture* GetCubemap( const char * strName ) const + { + return ( D3DCubeTexture* )GetResource( strName ); + } + + D3DVolumeTexture* GetVolumeTexture( const char * strName ) const + { + return ( D3DVolumeTexture* )GetResource( strName ); + } + + D3DVertexBuffer* GetVertexBuffer( const char * strName ) const + { + return ( D3DVertexBuffer* )GetResource( strName ); + } + + PackedResource(); + ~PackedResource(); +}; + +#endif // ATGRESOURCE_H diff --git a/msvc-360/SSNES-360/SSNES-360.vcxproj b/msvc-360/SSNES-360/SSNES-360.vcxproj index cdfebe96ed..8f6374db83 100644 --- a/msvc-360/SSNES-360/SSNES-360.vcxproj +++ b/msvc-360/SSNES-360/SSNES-360.vcxproj @@ -270,6 +270,9 @@ + + + @@ -460,6 +463,23 @@ $(OutDir)media\b.png;%(Outputs) + + + Document + Bundler %(FullPath) /o $(OutDir)media\Arial_12.xpr + Bundler %(FullPath) /o $(OutDir)media\Arial_12.xpr + Bundler %(FullPath) /o $(OutDir)media\Arial_12.xpr + Bundler %(FullPath) /o $(OutDir)media\Arial_12.xpr + Bundler %(FullPath) /o $(OutDir)media\Arial_12.xpr + Bundler %(FullPath) /o $(OutDir)media\Arial_12.xpr + $(OutDir)media\Arial_12.xpr;%(Outputs) + $(OutDir)media\Arial_12.xpr;%(Outputs) + $(OutDir)media\Arial_12.xpr;%(Outputs) + $(OutDir)media\Arial_12.xpr;%(Outputs) + $(OutDir)media\Arial_12.xpr;%(Outputs) + $(OutDir)media\Arial_12.xpr;%(Outputs) + + diff --git a/msvc-360/SSNES-360/SSNES-360.vcxproj.filters b/msvc-360/SSNES-360/SSNES-360.vcxproj.filters index 36ee81b2d7..015f87c201 100644 --- a/msvc-360/SSNES-360/SSNES-360.vcxproj.filters +++ b/msvc-360/SSNES-360/SSNES-360.vcxproj.filters @@ -131,6 +131,15 @@ Source Files\console + + Source Files\360 + + + Source Files\360 + + + Source Files\360 + @@ -246,5 +255,8 @@ Source Files\media + + Source Files\media + \ No newline at end of file