From 58b318418dac66f6cda73857aba48e1f42c1acb6 Mon Sep 17 00:00:00 2001 From: hgn Date: Tue, 18 Mar 2025 15:31:23 +0000 Subject: [PATCH] filebrowser --- src/fonts/vg_font_thin_3.png | Bin 22000 -> 22749 bytes src/fonts/vg_font_thin_3.xcf | Bin 632552 -> 638437 bytes vg_build_font.h | 7 +- vg_console.c | 11 +- vg_engine.c | 4 +- vg_input.c | 96 +-- vg_io.c | 81 ++- vg_io.h | 14 +- vg_pxfont_thin.h | 1122 ++++++++++++++++++++++++++++------ vg_render.c | 76 ++- vg_render.h | 2 +- vg_ui/filebrowser.c | 397 ++++++++++++ vg_ui/filebrowser.h | 51 ++ vg_ui/imgui.c | 74 ++- vg_ui/imgui.h | 26 +- 15 files changed, 1647 insertions(+), 314 deletions(-) create mode 100644 vg_ui/filebrowser.c create mode 100644 vg_ui/filebrowser.h diff --git a/src/fonts/vg_font_thin_3.png b/src/fonts/vg_font_thin_3.png index d3239dd08582a998fbd1560b02452d581befbec0..e729ffaf6b90678273d282998c12b556c08c436d 100644 GIT binary patch delta 18728 zcmagF2Q-`S|L}jKw3Oq_)BKnd~ofhIPv~ln?81%fHb?=|C$*-f^F%oPl$0ROZ?)jLU&lA>((_;>6 ze!rza_Xp$kHM~_NB+hoGgU;hWg@0bosQV5>YX2~*HVQM*bsk`SCyp);rgos0s#`Bh zKE0%8DsrChy=du675Q|bEp^{V!!Nt}tHnw(QQ96ULLO7e7?n(%RVv!VpT|()G5gt@ zGGB6IIbQsHHf&gxSa|d{0sOgZJa6{Pf=#lM`Ri|qM))RVf2z#l<0o(@=?8nxVY{z> zM?|(mj!jS|(WTQp8~E-vW8{5U!sWD=yc1&gUX1BzqP0E1&U`PTN7QM*EAjqV%4_w= z>rBCrJnwF%Hz)(*C!C#!coDZjRD;nJa6Gy-_(L@=d|Gs6Z5@BPj0OjUw*20tTzK3L z0H@EpKeB#legEDS7w>Nw%&(XwbzHQapSY+fsy%)BSW#WwSzGb3y6O`}mB(5dE}EK` zU0gKPlOe2yGU{rVRkXEL7$Mq((U33)HA3s%BRCm>KRn&Q+@>Eev zN9&1-&QsSX8c(#7PqW`Tr=h5FSy5H{f3Ez^n8V`)-{&+5DaH-P_SpE&O+b+Gx~z>r zxhD6X6$6)9&YqGvcKX%zGysqQ3~ye06gMGuyc}N5ro#R_*t^^#9vQN=v4da5hpsk3j15bP&ATU6@{Lx=cda(b3D>O{hiS z^xwXsc?V3HG|XdzWL$L42=Ziek}GqPR2w0$Jh#6^PSC`b*OxaaIz*!;+>)q6!J$7| zPCe)c?h6CXky?D_+U0cRl)DN|wSIB3puFVFml#(YRB?cS2hvsC=tJ{jU9)@;lu`Zj?O6oG=v+b*0Dv-si1>RiwO;lbhv|V^Oe6)x&Rd4rrmNC*@(WK&HZCB zS*Aq^q^V(2cdtx(;X$O{%GROjp@S8sIdrf)T&x5Vbk#v}SM63uABjA6&WmzL!egSG z_jziGe(}~=cCwqt8*!kTD}qFo`PDO+b3~zQbGBhjol|{B)UtU;XCA%)J-2M1UQ#-= zC^V%M)r~oPh&QcvS^h~n9pYsXRawPXa_2n_t$s{leDCb9Rpl!XgH<+zhH5HrR!%Br zitb?dr+iTH11;pjy${Ib3X%3|{*3^MhkGMzy?PGsRIAjTUU0>A-K&Z|(2Pf{dHcQ=cC0kjB=vsC`b3^sKU_975)32Q3YC)~ zA=rr31o$q7HkHQTaW>)|lLTtgoX6wYYnuicBF8?>O{Wz{hra+%gvFz1ed8x&)*bGa zK@IIo!o(@O247#JRGd1tj+RYhm|UDCJY6QkbE!-mn~S^#zfOGQXCX@N>+<16_iSjZ z(uUt$t_Q=#XubE6Ay$HlJw$MW&ST7nrwdvs(8h`-#7O<0_bZTYS+}-ajAUuBao8}} z(o6|TTh^gNK<9oFO41Ir4QaI=8oxkC_qyFW3}@RWn&1oRg>}%Ta5rad;I2CG+2B>Q_=Q1m9Kw zsPn-C2GvX|ob+RMH@>an67MBUHsJh1BD zm($Z{a&lpD(s}omCmyU$UEkY{9G1CT#vIphjR%%IX=EMx`lRfGcRvz`kcAM1L9BZk zc**_=bL9G0Ou$j6QUiM}G+s4bt;HUt6~)PXl7$ag*|xm;T?iMqr;eVKZd>emyMsGV z{;aKdVEk+8*E^((&#(%Ihit!yiwMv_0`4hm{habfg|?LS2YF-@HLFIqWiPh`9K6}2 z(@2=<8tE=*snUoish|{sFAKBETPz3NZp@5Xe8ikrJ;M3)Fi)kGISdv{U8ce&1}4#aJHGk9@q#?jFVpd7_sfd-EL$r4p9!w%@n{ zrsJ&-f38Rn^xp=At@{ICuoGtJd?*_;nxmm0g*0uA-zc&$7+4K4mI3cKQoK}Z%5MOp z=}Zs2)i%iGL_U(EWO$if6Ua{>%0XB9LiA*DWfTAKLJTr4t~2>e_18L54yL~!@>nah zJSCJ_B=yvnhZ*gOmu{b(cr%lfa(E!oOq;$%jL_(~Ue1Xeh(8hw;Y$1j(mg(G8Aer{ z!fn8;D3dUOEUek&cJ5xEJ6(vxl=G44H0HiCbkvww8R(GH)^OCae8%b8tSE$=?_#^G5zk&x3T?T^rR>sOOWk+ zurffKYjE%uL^4(s07?wEX+?-L66wL|ndgTfwKy7sq-!yRM{_QeFwwvxVrsKSa1!uB zXUhA-ws`*KW=?&wKmMBf#^S2o+T&$q??y1R#TTnduQje4-1g*q_exsQqq012-S!r3L`o^Gv zc>c+W`a!325+c*UFHD~@AO0^If1e^mcYA=HrmlJoW=LZCKHR_MKVy?M0T4lD?^Zhq zScVDEo$`D=!nlQWA!$>VOQ4cGrowUVNV1L@2SG}L;lJp*)A%PCyY5PO`Ph7?k@zVh z6Yws2#yYx2WLH#1nBf?+#*D?|UM$Ce%~sEdN)K)T z^=d0~Q5Qew51iP#&CAd{kpULK@~*xWhaO(;=(n47u20YX*Hz&H8hh>rc$cVV0U(77 z0Q-U}bGcwG--Y!v=Yn?7#!)-1+;M;VEFQEZcc^1gccEr&VcFp}F7K_lv%PQXtP8dPRYoD9S_FFoCXlO} z+0n0KM8B#XDMqj2lNKimA=-n%^NZk>{exdeXyT06^7bNaZ{PFCn|$rIRl)^M`~q3U zXAUJ8<;~KhPgvDRARzJEMEzsSXquy`AvNqnbNO87HS_W+nN_538^I$5Sy8mLm67el!t=ASkb=q|J7*%%?7wE60{aHxJzWbHrVNsVD%qM+!)7M+LzV`gc@g3s3S zchaiudp3nLa_cB2r5wykOYvCQ;8En3_ARqUH+(e8FI{+#7$ z)mv-kUxfs9IP}+E2{?kW8Hr}`kyRaTFY3pCpk4=wrj!;NTOkKxrMm)V(Q`b2<|gn= z`qghaouJ)~41*2%lj~W>mEJ6lom2hPNfy-KIH->E)}VCo%pbtsy?<*@=K9IWj6Cin zidtyDbC&zn&o?vM4@!Hsh4y;TMhR15E2L3$$C6p9u_l0+<3WNERHb@fD#1QInkIg- z!eROF$Mkm5uGw37P+30tES{{8&v~O;>j_Yw9sTziZ@F^VU6cK4@vOybjX(Nj-I2D)Ljr9HiZ-V!~YEeDawuv27 z4ByBY>wmS=-?fa|oD4Gm>ra=bQ;WheNE)V}-gZJe6zthoSs0nag2F}Zp1BEAN8(?% zxPWvqpwfA@f9m5ni)u5)qF~dc42ac2Yb3 zOpm0TgP(m%w@`(=l@5dNZ~kdq?~&G>O*q$bgT>(UP}*WgV=PPDLmzH$uy8*!rQ+=T z{52sE73sIZif&6INzVTJMVwybn9)lR!3>SF2XHE6U|TT=&0ADF7#hx zo2j<=Bw;=Wcf^ai#{!pw?wA)D zs%GCHe_9T;{1Rpq5g~!bn2k1I$?3Z1{V_tmqUhuu%Y{_e#o?1LRQrwg(0q=9cbj>t zaPCPsOm9M)PttleRE-@>*7c7DTXdy&gk}bP-#(+lNyt3IG;+Kt_{1@rCZ4L5o&s8B z(0O3kJ5?sH@@zcPP$t1a6Q|l#>?P^qP1x|o#nt(;Hv1GpGhaD&_46qV>zzx`Zy+~r zb=TW5brv}hB1jer=EIsA9Y)Q~*LpW$9a22!KZ&Pyt7u~SUsJ%qpIPS)K9_J_nUYjh znIue0-xoVJ-*|p)m%JsFy%Xz$1LK~CdhNJQtu>ccl81N6gMD#ms~dJvX@Z7m7s}Mm zm6gpDLcxZ;wJ;0CHId4uEEaJj*U-rU@dWm-3{IyMJyEe4dgUEqi}N;ob7z5d2|8OS zb3cUIQ_o&Y~ICX(fhNQqo3;&4*+L6#gQq2ctD^&yu znE&;2xHddo#2EsN)`oA$N5BupAHB@HtmU=DB(r5QNsLuE9xM*8I`S>;a*)#1q$(dkGUEjoH zWJ$KdU+flLdk$Jp{%*OhJf^8Jj<=3!p7JgzL73g_`hu5Q6MUaC@-dM(r(=C zm!lNR>%v42Ru{n{Z}{=~EXm#3RCmY_*TO z?r1x66uI~_`05@|<566Id^a7+;^D=zrig9E!Hh`(YMvWf_!g0Maw1qf(1C!Pps^DOC<+8- zY>ZDEz$+YprOF-?9!Clzb$V~pBm}jR^p&!>6%X8u4sH9Q$0>c+TLPOl*`GMGIDun- z%q}ety_Mj=`bP7t(!erl6-)spFzdev(c1hzt^4B_2_DHd_5)J9eqLNKw zE|@GsR%tKBAc_ljdngaCnwZDBcpeqi@Grr(Ey`==aAumRl&W5cs9)m&ZjT)rjK5g4 z?kz;I+s%EzutI}E=jtE%{zNoJs(~Xrxr!+n!_-2Jz1lffW6{b`7U02`S}Q-!1^q)4 zqY1A9s&R?vDAx z!#uMbrvpZ1H#1f#2nl5#TEoFayTuvW3I&rwwGJ7mF-p;TbR16UG4}lnrs3>)1N?Sn zB%neSgmA7<-uZTVDD|-zCJZ)ZpW<1t?yYllIa3@e?vr-(>Eo%3LO?MezTH{Ff6=dz z@1Ov!`8AyIWuC7#Gh-yoHzDLkPX1)B%E0@0+p-Dk7NdoU@Z#Y{xp>0x&+?KawCXn( zmR1dSZx~m}h=ierQ~nlMk8;EXjvQTbWge38C=0_oY~6c3+we}1$yUm?$2w7l9snUl z;)D`ge9jA!cpDtTpK(21?@P;30Tg&F*LfY{$>%i^R)ar<7NFEQHYl=V`m*cd4H;Lh zimm1IKZbQZM@0^oc)T7CzGF16bIY+po{nglSxF|-JviSa4%`P-b^V&2S5fPA*#wv( zIRSirpHZN9Nm<2xJ&mJzL&#XZOs5`3OvYU$|5xcltd9H76(f(z_3xLDxz5T*un03b zc^_*nd0k!JnQcW2^>k?kfYGdnKaRQO354B_7*V-vait)|!npf%9t#xzq&Siy^!iR%=* zRI5R8vjfvEDq@3sGiTf_LN)SSvUtYQ4UV4MhGE6q2-~zCy4}$I(tEafWjmLCjPDXZ zkN=*7@Bu%(1-{%%$3@gVQ4Vm8c^+;){gI{OM-Ald&E_>|_gqs|ubX!tp-=}|N zYc16+d}*1zuYUXqy3K=-cFH>iBoil6alx(3+XVlot;Z_=Z_f3{K9N~IbQtUOW+itLg$T(UR1}HR>}zh zpv-o=fhBM}{h8SuAQI4P7q1MaRq4iygKaMNSlA4XkA%q^sY`LofB@wqE;hj3+UjHI zWL;bYowIF|z9b<4bXw5JOua@zfC3+DYIair)A4*WIZXuh~@BM9bK@#UK;&qw%St2F#&RP8hMPHbgd0Pd4xIVVho_4XtFhB$>(Y+zHmza4y*?pVsmr?HO9Eh&&^qB?l)#xLbl|HkvK`DJ(w7g4LM1XLqi7mE7wN0iMg!2RefLgS$jMjN8HH z{n}S8+Yk22Q-aEmOYH7Ogn73%1rz?H4nRqD;Wxg?wVwl;WnaemrFJY^P!i^>b`nf| zy^E>P#o66vAC$8I?J|{&p*NZ4=WZMk;=*HNk_|{C>}WBd8)?D(pIYQ;ivJw zxbomnrYtTn|1OU9KO-Q6-iy?Fo_b}Z|3d=(+XQ_MivzH?Tj^9RUC^Y6?qS{eZIS5a z+NjC=*htHjyOmUPn_|DS^#t*j^J6GwgGeV|f|0A6uG%2w(kNlk)l5os zg4g?uqsK98E*?*~pWcN6hutI`Q)&j%Xc%)_)+og}=B&xX->OoDvTy2|R)ba1`jK9Q zaoh;_#bFZm=?zDvQf^;>n$!~{efidR8e>ORAJGnUye)U$B(xii9+5+K%PA(9uze)V zsQNh$$+B7UmPzG!8JLd4FMeU2_XvBxSx(LGLJntXHO+0;!k_RhmsZ=hQL?izDg6mQ z2U4T3-uP`ihLNdfnT<=jY1dXm0` z=%Rm8bu~BScoVDmS87FDXHbdq-2HcyM0rZ)qGvSnK1Lsu;X*NO0P)If5tV7q-6}EH ztEK#EXLI?yAHBNwz3xkJny^_8{IIR16Q>^=QTrn+(z)mw%>Y zCM|vG&I(L<7c{EHOEt+mzH3mH z5(YF?fcz3kTm-aZczTE@Ce3d(S<@4QHVm-;PAj|_rJTJ$79qgAP2ZUfO?C`>&@}vB z`oiVohH5tLg0E=jy9s{@8vVuMbF__Gup8L@I_t5!R=qTokde5NCcFOw?`_!4E-u%j zMm-|B*}T!Z54A~C8;SPURU)Kk`ehIPfkUpsx;26ahN6jA>COH}gQyl3ml2RYp_YAk zHp}CtU^C`zntjgBKS2Qt?V^^KAUrf$FLdKzw#{?X9uG(;YXf7?|JBITNPH`vu@-eE{5ny?zdfyOfA1w@f@h>*fzRao>@C< zj_5MW{<&oMu<4V@T1oU|jo*AU+ec&C6>2KU;r0z}WjrW7a)@yO&sAH($_Fb~Zyb08 z=1SipuSr!lj5kEK|Ng-9GMOzR^7@bflbLHdd&Sn>{E-hg-&xDKosXlq1Zex9g@B#&hEgvx1TmUUG9oRfB# zcLvnGn2a3SK5d?T1AfP$Yu#;ZD$f!MM0J1R0}BctT9Kj~ep zV1Jbq-nb*>{_}~)k0LqV)#0W~qQ&IvhhKl%wrJ8C{l?A73b(Hh}af#8nSTSF6Aua89w@Y7=UoJVPIZqV~oSn?^A`}@<|+`q3>`-4C?tmOK1?Z?^DtT*Pd5j^33 zFHK111^u9$c__zlX^b>GiZhQ3#3rb>&?u#)c{UcQ0kqoLIq9W>XrczaVeg9k;g*e! z;}5$ix_k6D?cNdQ!kDH1?j@MTVR6170=zp-X@7PCmj!`t=$DFP6#Jq>!e1Q+0;9mX zHz-Ys5G=$XuEi7+EilP;g5iGt>yt9dD~wTT+~F+X^@vf*Y5fESIy4NfFO1N~xh}Re z{_63%NpYxuRhQ@;;IQ5_cyLXh^dW(2OL7fSzK`{ULYf#{10Gb{?;P;8_JsnamMg3K z0~|Kd-*yBPT=9ekxW{{R4%m*ye79;8D;+G*%MBo;s?mvhbS28{_U-Xw+<-x@VFB+L z@Zf1_{9I@90MS!~k^UH39#JYn^am!S2_dg}H;ymEND(ay@rs8y#|2@$?(bFYg^R8I zR@p+RLB~nU(1$eRbh7$0?k^fa`2xj!l;S@aDfefqmo&L|wBzyMh!STHn?R@U;E%}e z6uYN!7FjN@j0uZEXQV8JLpRlj#xK8?25cY1Gz&uT zDQ@?bzShSn$4Y7Ihg!E=>oV8+v&pI&eEN!X)I|Hwr0`RRvM)cFj#0!rmAwVwB$YA} z>|NBD`C)1~-EV7ZeQ&&?@Yi;D0zU5-G~SN>(ZP@RZZr6Fp1$(Ydpep?y>~Ye=?uC| zsq-t3oIurt=>nVT=YN9!@*n_|pqH|Yp0%+6W&Vv0y$GLsr@BG$+tUrAyYk?YZ}yV= zq>>&JYC`Ka6Pp2~#I4V1JNih2(dsZ97ctNc*=aZi04jjQW1oFX-*JoZ`vl|)ECOzs zrZWrLE+4m*tlgzeOst428wgh(&ylRSQOp}uPI7DKjv!%GnZ;Zwh1a$KgJ0)nGLD(C zf$Rig2)Dx=FI!W~YQhn|TVUNYfhoL-pdTweqr%o|_FYwGH`yXSNpW@$+HEbYEWiYm z(!w19OZx6CZ)<$q8xaE7=#WjzUuZ|cKr>1Hmq+J^q_wjJZ8e!w9sjkoKT4t!lj4t3 zpXcZ7Gg%+8umLY~sKx?JdN> z2dv>-!6#W8YDsRU3`N^h-{Q!L#sVJVtO}I3z0cm1; zibrapR??F?XVJ>U3ACI`la+Y)BO#pTx(vJ9HFt$O^BfQw3Fp$=tXs?1A!hl{-N^o1 z?rY~{BGgh}W*XZ=OlV=cZ|pi1+>{85ZPt)R2v481=w<3Uio+9 z%#PBm`*NvdE9KBnxQj8U{7`)Y!XTD4mq{gF{C3=Y(srmo6nJ*dDE*|>pBI_YI2_`|FpvI7 z!sss$aWv^lL#aJ_93E8x0KIXa>zM@LE_l0u2+sk+SLZ4f}ywIN$ z3)cOYQ^$|}r`r4rm#Fb-zkn{jBp!602D z2~Z$jQ=VlXP5!H}e4eRN#A?SJINi)#Z_1~E2v|Kgcm*t_=4ufVsyKkQoG{i0AwQOU zuY-@zMouFj9r87!-o|^K1EipJCWBd~og!+uOMu`hQ=n$Z+j!^BL1Qixu+@M2_#4X< z`jKGr->q@IJ6^?+Ir3Qpp}h+8#?9l1E6TvUWcteo`-kQZSEQ* zVyd%osq}H8Yq*OD=E9uwd;O7*$0b10_#MHpZpdEmg=R6rqC9=?z@#gr+FmLO(L+j) z^c#zE2Tts+C;0|?0yVl|m#4*T!+pu2i9ZNX`F6x33fcSEJuw1=dz?I3F!B9Dsp~}k z`uX~gi_Wsjml%cA#!P!y%f3DZz1%#!T8{_mB8EBz2$%>SNkgbHr&b%wU^qn%FpB9gM}F@?jJT2e)x zj|y|EBgIbk&(KQ^igN8@;kXV^Zm0-G2RFtP-$bWg?U1_7+>I|+tY!P;YKQm2cae;D z`EmKXqw8RpY~_}_tqk4fnSw~@E+%$@bh}0|g|6l`Mw@s_)7k<=u02eV%QIE#2JzuC z?dKk}S?{1Fds_R$0Ap?T${TNHPjq{G5b#E#b};6>LGRL7z)@<=WxB=&ZCCa)v&IlYs9?$>XZxFVWZ62dv^BT2Y<5QEsNPG_oIv{*Z1wWP7S^9-3(xK}cO zbY`}e#|%{%Ucb6{gM_lAp>G>_(K09;Ig5r_!;sqs9^IfIH-WpEv4``|xXV|n#LVWZ zj{^;tnMj(ZYA zLxgujR9_HKHe0@OvO*6Rea8~IN_{G;EU zK8@j*Iujst!yD%u<>@+Eek9{z&{4ntRODW|jr75R&0e0kt>z3|zV6>%^`(7ZKVd6^yrG+*bkyH8UBY>U21m+?|+b0 z^zZ-J-mmzPkK^V41KzFzKB|3D%oEtb&K z@G)v)ec&iKWYu*BsA<2)yEZ!58gnilr~p8~IyW#k)0fUN>enrpW1R_ zAs4%zv}+&YWhB4qK6+xgb-~VKlbm}pWhSzM$4U9#qiZ_c2H9to4;3lCDd0V{v%ssV z6|`u_mi#E$1-s2zSX@GJ);o?U;SasF)(!UQASnJW+y?SlZ+Uk@oWh&}h&&x;FI2aO zkM*!I`BJ`g+{?17{nS&$Tt~MDwtm zuty>hGE_;~g2@((gZhCM-pM-wMOA*jB*x|#9juUr54RtN2CG{5oqMpSb zpST@id~kvfg0S$Z*UROWoNdH!V^1@Xm_G}>=`e-uA=TvJs&)c7uKZNXsXHlUs1WcBumlQtX-1qAg zM@X`8*SD`w+c`h~B9Xe!f>12p2c?Hj4d#;YSPWc^y!DH=2x3t~-53(2wKIwsF)jYm)tsiV7pe;RDuBDO7w!ODZl%?tZ zPd|=HWR2xBQX2uC$c5dBMI2CY@Q;O^%}Co?X%Hx$eKHP@es-9O1fLV|bz)-D6NL+) zTDP(L(OFOf7q?PPvrSEX8sel{=Zd}|4~r+uc<(kv%r5>U_u%VT+YiSsbRG@g7UQpP0P5B0 zN2e}&if7G#p%BrW0!+Jz<$}R5ki#+?79L}j)tN5eu{F2M?f<98Eh0JS2cxf_`CM22 z5|Err9W&TdK?J-pv0%GpQ}_dh40L*g2rR%(mC+_VSXL>W*8}BAb{mK01d9Jk`Qm$B zfN&`mJ@edEZt{Vh*50G~%P2>Xekc%8kOC6r?fZ&am)-5Jti4bEDlTG5NxKI^wtHoR zd|CzMU>$oI!GOrh-S~>z`z90GXCk1qH5hIO1|4a7X;r!hI*+;9zGUl%@B`HIP> zDeBYlX_oJQE?HWlWyB(!Pd70qawh6Sa<473%qQgfIY!Mj1!i*8_W6DZDl~jw!9TFQ zQ|Hk6sh!Jx_&n9!w2w>0Mz3b|yHg6E;JjFk=K*G+x@>t9oWm9B9!}W#goys` zc{i8m^d^k2BADWQu3#I&(@XE{Kki^hiHCAen(7fkHXgeeG`>Ilc-z3_sP`6u>~-wd zw)gNIH*+-M&~(o;qI7>e!l6QMcTTbY#*72`%xX03)fFRk;JUo=rE^zQoHl`N=71rs zq8f70x4+~j@*7`%kWAIG|6~X64^!$poOGfoPERc?KnhIVx1rUi)(#UkYU7)xsh%~i zN7h9;{9llkokS;1&6NZ^Z1CWnD5I|sB3Sz>1#YPMf5({FZqfzRlT6FQ{*fa;PZ7jN zx}7-6qun!o!7>y*&G3^zKwIQLlsP_slhL$kaKbCH{XaqM{|9<1rRG#PwZ1ZF=j2U2 z7Zwu3`fH9H!3bRci(;rm@hAo*7@U|V8b*xwh}mo1q5OUJqfTJ@GyI~od%<*v#r44c zE@*CzpDD8SI?z6h5m>zXI&{psM*OG+Q{4I^q$zSY=Y+@12=e(wCKdq;E z%cDQlD=sh|art8heo5hvdt9E@;mXLE{5v>-_ruB9*QNo@MuU}s>x_^X(Hbf|v%dH4 z?|5rsG2!{JzLS5}%od-n<^YZHl6IoLiMT#SLtC*$pd1ZjOa45aNwOs4D94!!p4)`W^j&Jv=A|_fH zj4%SHY74?@k4J<98(j^1T5|#_zz!wRFR;(lQa<1$MIZL5K556OAXyT{O1Z#o@cc(v zMaT2{1)Ji^>&Kpbm#EJ4E+gPZ?^vjrELY>oCk9pS-Pl+EYAEs4Ou7jkBnBqvzk@SU za(|eFAw@p!+j_2?1+q4UCAtY6*|7s))_Vd(xgVi&dc*T-$+q&d-Vo z+l!`TN}H|HmE1(}(s=%9C}_S=Z`X+_|IsWwytKQ__~R@5jC!y;0Ak~3uERmWCHJG5 z;DEH~OL?Soyk1&a*Dee0;ocYfR+U{--$WGxG zE(v1^n+|iDkdM{3qSM%mz)TX>?poS9qzZnfyuxzjOZMlfHp7prfqm)1VSbNEX`$s_ zsQ233W~Miuk9ncI7rTRxLRY#eN}c@5dy`*9&?M8cpv}7Jc0KQXUqNH+24y5=wWa(* z__}3Dt=`=)L zpWRs5|EVgd0goF7D_Gh>ir^+qsl4`Rwfck41tkBTPjYdy_P2D8ckhm^S$C&H8L=*9 z`gQ%l%d+?~tKS+3uuHdPS#3AHG|>#ZqMR!+4nj4&6Fai^c<KyBdtj>tD%Z*Bfr#j;Lx~IC6 zE47R&=KTqnS~t%$ha++hb+wVbD67UBYV`WuS=-fU*=^}=Xho^r2l@ymB}?;9otsRr zOibx8q=azP>X_#k3n0K!NBsMSEyg129uM}e`1ZbMY6n-K7{+r26ueg&1gy8Z;8t;F zR0(0!xqd{An8s*pue(2J@a{c4I3zcG>zan8z@-}t{`~lgc9r@f>@p7TmOETBvb%t# zJ*b^^)!+E@UL~FgrhrR&Veh@@H@OXtOiCx-{~mu^s3mfpjdLg+Fs>tN!aTm8UYq)z z$+H{p3=Y#qYcDgaV-=vR)?E-dQ+wEb0 zf9on=HKYlsh+mp!%jj~C?}i6b2;nXKT8U3c;2`fy;k5Rlez2J45>VWyNkM)U{#wo& z8-S6M6|WJuoCZX@(}+#c>U z+JMOzyHg&r7?=r4$&D)Mc}CYLSd~;i@1AbJuU&(e^OukhWRd+%8CN)Dm(5%%^244D zF&G`OH&)`y!Z0oOW&oh0=^-n_{``MAx&P(wmZ|-BGt&Q0sQ#a9>;IW@{U3?g9DWlr z$mmouKXRIyOjm#J4G6Lr>{}2Zn7LUEEiNe#hnKYxef9K7cVZS^jod_c@I~p6KZ6j&qK_J4~!afWx&-M=^3U6T&ER!UCKF( zf|+d{!s})}JoC+TN6@eIX2*r-GDYtJ_pnP*n%md-x#BDW zalArEC^)D+SpS=T_b+Lit^HAPkA2>9!^Go%MzRWftLn>j8Hm^wHJqMYr;aDoB_hYg zC+D2ZP-S&-{@{d$CZu#Ovh#4J3>pM0{5rQDcxWP0hKs~>i>=x`D0s9d!N z=O;ijvN0l>lr&WIZK z8y1To-8=P00)JwYO9kUG-QSa_C42t^gjB7QhwE_66+ClJc?BBMWJDyEt@QvKF(Q{@t*BLcEB*EN#` zSwmqk-e-ewViC0(-9<0CZ;9w*8xTpiDc-JOHX#Z|J<1N;#fN%Eh@KE>I-flGqcr&a zab)PR_G~j#*>3!}(?4DB^-R}=y}bwp=5Jwd$lJ?A_{SKz5??IfFSN2us{4Z_M^gKvOJ#qcOCJTYYw$p44}u1t@Lj3@t94o82QD_zDT7{TfQom z#@V1U3j9tH?2;H6MJeamtoT5;dKxr2YiBA^IgS}@CuG^LARjt^nyWHGIuZ5!9)b+7%_I2ktQR< zV@rrw(~#{-x92UZeR`oF=s}SvF)ibNR~MmY=6r4@U+AN(T7Eg*(UCQxOidw|YNsv` z|9sN@Nm*P(rSJc<-cRk#QViRczr1_?rN3qJ0@qgQ-3#-j3`A}Ph^bDkU-jr9#|Hg) zO=q5`{MFB#dryOula30e3 zN<5`4Qo);GjhOcOq5k8G2=|2J?-@a39`&Cl*1PnKs41{%3N&?xf% z*Y~J4hyPoilrk`|?gAZ5@b(Ks)*&?qhKyN-e{Q%i{_YWA0L{I%ioOr}*#G$W{dC|o zS>WOW)7zttvC6RnOKOJpxS#n8CA@(%$RLHi6IcCNx}N);(e+K0cNr>xB1~TO8<#A) zll8R!6FW#n^Z(d-Pu5)BXszVAddI*+$RSaR+c$hlU(cAp&`>@pp{ZeUC1cE~{a>fr zpOQCVI8ZZ5fDXZ1rtY1d*f7%|)xK~}{=@+B-JM|Q|+UmEao?+WLXZNb$ z{f;aF7nvtmMe0wz6npILH`$oN-N0Q_-6gK`SM8|zlQ>4Zb@=$)PD1}tWaa$&COoDnkC^kcK)2Y&i~{6*BW^e8z!+Q z^EVvTx~jx;W!9CuURKu~7VrJ;eXc81%-nsWFI(~>CuQJdwM_8O=>|*+YYI%f+@^0VMo zHnqFYe=c8oJ^0@>;J(ZC{Z}tvG+WvG`1<8I*3OL=*lwNef1?PD(lvjk9_vqYjeobg z)%&{k)~HkQuX7WwR{JbwXW(xLsC@RWYx}*U>!;42<<_Tu;F3pyrsnr`Mc7hjW^yE*NZI3mAxSy8vN{YCBp&cf*YN0YbWneReNzyBy`;*-T$(7r{o#<85(9@ z;-1e^G37i<@~Qa6cT~Nq-oA|3f7|UMGlLw%ie-Nk`|FFTLaB-mULfXeaD@4NTJ)Bvs=$x9&T*c8R(}@V86r z6&V&7^D}H&sqlSUwcXbx4)rT9UHZ2!e&x2;oCPOO#qI?8=f(wr8@Jc}T6|xmV-stG znhgW+yp8AcpP%tOtNZ-Lr{s^$FYo2e@7r+e&s^7eY`He^7MZoShmKy-{+n0+?aA@5 zx;=lkeR|t7wco4gnbX(6<^R8E%YR^SSgd`tpNR{YDS>ktv676oCxFu{HlX$&@^T-f z0Zt626|@XFAo#Og%fdk23aItK#|OYs3mnrt48ZXX25=_EtpH?y0!SG?#YC6`G#~+F v3O-}7DFE6}L(>TxUQdzrBskqc`A@y{)n@a3(>Ss~;pFM+=d#Wzfw2hyN+6g7 delta 17972 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 diff --git a/src/fonts/vg_font_thin_3.xcf b/src/fonts/vg_font_thin_3.xcf index 66e8368ea080f9e3456c328de02683f3bfdca77d..a68c8ed7dc9dd58457e53f9b5c4d7d312533613c 100644 GIT binary patch delta 8801 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 C$P5Mm delta 3556 zcmZ|Rdvp}l9S88)+1xv`@j)a_Hra(_Nj5-%Hb))>BLrB8AcnW*RG=Ild1z`818#)^ zBUFedB2BV|X)MU26gVl+lLTB|%A*Htp_~E|q?Ck5MGz~3726XqICH;WJ^bUIv-_Fv z@7|d^vwP>xUb)lt+VQT{Lv>GU!?5=ghfdbiEAs#>-3qt;PN}zUP>QrcO6lJP!+Vrw z$+JxpADElq`D<);&p@EVT~*aGSJN$YN36OcH7}_UG4NZK2U6BEr!c=j7trNRg-O{# z&unLqVERTBOJAovSm`=7M$a!%?(=t;$L>QrA&)GEF5X?hRjhMn{<#c{NTE6lfHqo64?hxUV3V*v}#&=UGGT}oHd zKhmA_Fm0w+=xx{}XbR1t{gjs0RKUVBw1mD)m(rDR*JXIjf-Nt?8%LBL&rFy+5r*qw z{}C{PZ`2dndGH21= zG(sn+@io0=1`C{oElZed=?2a-)xqP=N^PS6Z@OK+WFfBvYf`}LT{ z$}x?e_?Slhm0otA&Z4Gr>;>Il`=5YAs$c<@IPt^=&;^1a99KHqr_CI*s2Tu-z%`d^T zxGlu_^~jgp>FXTt<9hfhZX@yeW#rqK_M%NiO|++Cwn-g}t`zU77U{zP@}VT;4pEp~ z4O6Glto9OJZ(}syG+doQ7wb%6*<@SLxDdW9{i#fXe z{trc_JAi42o)n>YuP4PUU1VyOce8zKv=|W&jS;zeqI1=j`+nGKuYXR&;?u_qqnkuE zK4YFpNwD`-iXrYtk~b~tv8OB(nO*!*J$6q^h~0}iZ%vPRqu$upS}ZDJccZbG=8xJh zEE1va_na-aqu1#u?(g94aVLhZP6xYvnMfamzD|tF`}-Q-9@9P2_qN*4Rf;Tif;E-m z=fWTDrUl$9degr7s@VAL1y#Q$W_d-fW{Ju6r2_FQd+i&djE(l8H^pE*ald`CMkL!8 zYeYi4TeVoSR!@7!y}bj0G~5F+j3r!#adXP>cK7a1wE~!HGMI>8JQ$!oXdWF!C(&{` zpH|VgXg%FSkJ5AWy3&%tHWWG~(g5v2^XMo#iI&s(w3gP>L-ZWQ%`H18B6rSmwKSQ* z0Wvs11_#LC02v%0qY67_yhZC_sF8BOF0II2zJghJ7Rs!y%=xs)(OF$&_5>8NIbilX z%y>G>>@&wdhtkoQ zE#1A?HNOo$y%s({04~H5E?0bsylOgpo9oaecy>Iz)*b#I3#K9Q9UCe8 zRoyZ=)u;_4M~At1h8T~{LXM1tBeC)t<32^6v=UBpzHsMdls^LJ+<^=G!=+bYEfz#$ zjhZEzu|@r8mS*h0v%`2-qT>-fbBupDe>9z!app64VJ5u#A-r)Ceg#b(j{@^ST(OxN zQ0->sao7X@jLg2ys^+}Rf$lTRIeD{S6AFcSaH4ujYUZTA$Ww>FnTsi|$SmehTD%kW zVxB;8GxHUC8DzRIo>!`m z@A^8IQVP$D`8sET*9E a#hYkf$od=8kn7SalNXushandle = SDL_GameControllerOpen( index ); controller->instance_id = instance_id; - if( controller->handle ){ + if( controller->handle ) + { vg_success( " . opened SDL_JoystickID[%d] as controller '%s' at index #%d\n", instance_id, name, vg_id ); @@ -66,11 +68,11 @@ static int vg_open_gamecontroller( Sint32 index ) for( u32 i=0; i< SDL_CONTROLLER_AXIS_MAX; i++ ) controller->axises[i] = 0.0f; - if( vg_input.active_controller_index == -2 ){ + if( vg_input.active_controller_index == -2 ) + { vg_input.active_controller_index = vg_id; vg_input.display_input_method = k_input_method_controller; - vg_input.display_input_type = - SDL_GameControllerGetType( controller->handle ); + vg_input.display_input_type = SDL_GameControllerGetType( controller->handle ); } return vg_id; @@ -103,8 +105,7 @@ void vg_input_device_event( SDL_Event *ev ) } } else if( ev->type == SDL_CONTROLLERDEVICEREMOVED ){ - vg_info( "SDL_CONTROLLERDEVICEREMOVED | instance_id: %d\n", - ev->cdevice.which ); + vg_info( "SDL_CONTROLLERDEVICEREMOVED | instance_id: %d\n", ev->cdevice.which ); for( int i=0; i 64.0f ) + { + moved_mouse = 1; + vg_input.hidden_mouse_travel = 0.0f; + } + + if( vg_input.display_input_method != k_input_method_kbm ) + { + if( pressed_key ) { vg_input.display_input_method = k_input_method_kbm; - vg_info( "display_input: k_input_method_kbm (mouse click)\n" ); + vg_info( "display_input: k_input_method_kbm (keyboard %d)\n", pressed_id ); } - vg_input.hidden_mouse_travel += v2_length( vg.mouse_delta ); - if( vg_input.hidden_mouse_travel > 64.0f ) + if( moved_mouse ) { vg_input.display_input_method = k_input_method_kbm; - vg_input.hidden_mouse_travel = 0.0f; vg_info( "display_input: k_input_method_kbm (mouse move)\n" ); } + + if( clicked_mouse ) + { + vg_input.display_input_method = k_input_method_kbm; + vg_info( "display_input: k_input_method_kbm (mouse click)\n" ); + } } else vg_input.hidden_mouse_travel = 0.0f; @@ -254,9 +269,8 @@ void async_vg_input_init( void *payload, u32 size ) vg_info( "%d: %s [controller: %d]\n", i, name, is_controller ); - if( is_controller ){ + if( is_controller ) vg_open_gamecontroller( i ); - } } } @@ -268,10 +282,12 @@ void vg_input_init(void) void vg_input_free(void) { - for( int i=0; ihandle ){ + if( controller->handle ) + { SDL_GameControllerClose( controller->handle ); controller->handle = NULL; } @@ -540,8 +556,10 @@ void vg_input_string( vg_str *str, vg_input_op *ops, int glyphs ) next_code:; vg_input_op op = ops[ pc ++ ]; - if( (op == vg_keyboard) || (op == vg_mouse) ){ - if( (vg_input.display_input_method == k_input_method_kbm) && visible ){ + if( (op == vg_keyboard) || (op == vg_mouse) ) + { + if( (vg_input.display_input_method == k_input_method_kbm) && visible ) + { applicable = 1; if( op == vg_keyboard ) @@ -552,9 +570,10 @@ next_code:; else applicable = 0; pc ++; } - else if( (op == vg_joy_button) || (op == vg_joy_axis) ){ - if( (vg_input.display_input_method == k_input_method_controller) - && visible ){ + else if( (op == vg_joy_button) || (op == vg_joy_axis) ) + { + if( (vg_input.display_input_method == k_input_method_controller) && visible ) + { applicable = 1; if( op == vg_joy_button ) @@ -565,9 +584,10 @@ next_code:; else applicable = 0; pc ++; } - else if( (op == vg_joy_ls) || (op == vg_joy_rs) ){ - if( (vg_input.display_input_method == k_input_method_controller) - && visible ){ + else if( (op == vg_joy_ls) || (op == vg_joy_rs) ) + { + if( (vg_input.display_input_method == k_input_method_controller) && visible ) + { applicable = 1; vg_joy_string( str, op, glyphs ); } diff --git a/vg_io.c b/vg_io.c index b100992..da4dd39 100644 --- a/vg_io.c +++ b/vg_io.c @@ -7,7 +7,15 @@ #include #include -int vg_dir_open( vg_dir *dir, const char *name ) +const char *dir_open_result_str[] = +{ + [k_dir_open_none] = "None", + [k_dir_open_ok] = "OK", + [k_dir_open_path_too_long] = "Path too long", + [k_dir_open_invalid_path] = "Invalid path" +}; + +enum dir_open_result vg_dir_open( vg_dir *dir, const char *name ) { #ifdef _WIN32 char q_buf[4096]; @@ -15,23 +23,28 @@ int vg_dir_open( vg_dir *dir, const char *name ) vg_strnull( &q, q_buf, 4096 ); vg_strcat( &q, name ); vg_strcat( &q, "/*" ); - if( !vg_strgood(&q) ) return 0; + if( !vg_strgood(&q) ) + return k_dir_open_path_too_long; vg_info( "FindFirstFile( '%s' )\n", q.buffer ); dir->h = FindFirstFile( q.buffer, &dir->data ); - if( dir->h == INVALID_HANDLE_VALUE ){ - if( GetLastError() == ERROR_FILE_NOT_FOUND ){ + if( dir->h == INVALID_HANDLE_VALUE ) + { + if( GetLastError() == ERROR_FILE_NOT_FOUND ) + { dir->index = 0; - return 1; + return k_dir_open_ok; } - else return 0; + else + return k_dir_open_invalid_path; } #else dir->h = opendir( name ); - if( !dir->h ) return 0; + if( !dir->h ) + return k_dir_open_invalid_path; #endif dir->index = 1; - return 1; + return k_dir_open_ok; } const char *vg_dir_entry_name( vg_dir *dir ) @@ -43,41 +56,56 @@ const char *vg_dir_entry_name( vg_dir *dir ) #endif } -int vg_dirskip( vg_dir *dir ) +static int vg_dirskip( vg_dir *dir ) { const char *s = vg_dir_entry_name(dir); #ifdef _WIN32 - if( dir->data.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN ) return 1; + if( dir->data.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN ) + return 1; #endif - if( s[0] == '.' ){ - if( s[1] == '\0' ) return 1; - else if( s[1] == '.' ){ - if( s[2] == '\0' ) return 1; + if( s[0] == '.' ) + { + if( s[1] == '\0' ) + return 1; + else if( s[1] == '.' ) + { + if( s[2] == '\0' ) + return 1; } } return 0; } -int vg_dir_next_entry( vg_dir *dir ) +bool vg_dir_next_entry( vg_dir *dir ) { #ifdef _WIN32 - if( dir->index == 0 ) return 0; - if( dir->index > 1 ) { + if( dir->index == 0 ) + return 0; + + if( dir->index > 1 ) + { dir->index ++; - if( !FindNextFile( dir->h, &dir->data ) ) return 0; + if( !FindNextFile( dir->h, &dir->data ) ) + return 0; } - while( vg_dirskip(dir) ){ + while( vg_dirskip(dir) ) + { dir->index ++; - if( !FindNextFile( dir->h, &dir->data ) ) return 0; + if( !FindNextFile( dir->h, &dir->data ) ) + return 0; } - if( dir->index == 1 ) dir->index ++; + if( dir->index == 1 ) + dir->index ++; return 1; #else - while( (dir->data = readdir(dir->h)) ){ + while( (dir->data = readdir(dir->h)) ) + { dir->index ++; - if( !vg_dirskip(dir) ) break; + if( !vg_dirskip(dir) ) + break; } - if( dir->data ) return 1; + if( dir->data ) + return 1; else return 0; #endif } @@ -87,12 +115,13 @@ enum vg_entry_type vg_dir_entry_type( vg_dir *dir ) #ifdef _WIN32 if( dir->data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) return k_vg_entry_type_dir; - return k_vg_entry_type_file; /* sketchy? */ + else + return k_vg_entry_type_file; /* sketchy? */ #else if( dir->data->d_type == DT_DIR ) return k_vg_entry_type_dir; if( dir->data->d_type == DT_REG ) return k_vg_entry_type_file; #endif - return 0; + return k_vg_entry_type_unknown; } void vg_dir_close( vg_dir *dir ) diff --git a/vg_io.h b/vg_io.h index 0991f0e..8f81365 100644 --- a/vg_io.h +++ b/vg_io.h @@ -29,10 +29,18 @@ enum vg_entry_type{ k_vg_entry_type_dir }; -int vg_dir_open( vg_dir *dir, const char *name ); +enum dir_open_result +{ + k_dir_open_none, + k_dir_open_ok, + k_dir_open_path_too_long, + k_dir_open_invalid_path +}; +extern const char *dir_open_result_str[]; +enum dir_open_result vg_dir_open( vg_dir *dir, const char *name ); + const char *vg_dir_entry_name( vg_dir *dir ); -int vg_dirskip( vg_dir *dir ); -int vg_dir_next_entry( vg_dir *dir ); +bool vg_dir_next_entry( vg_dir *dir ); enum vg_entry_type vg_dir_entry_type( vg_dir *dir ); void vg_dir_close( vg_dir *dir ); diff --git a/vg_pxfont_thin.h b/vg_pxfont_thin.h index 96a6bc1..e796af6 100644 --- a/vg_pxfont_thin.h +++ b/vg_pxfont_thin.h @@ -1,71 +1,961 @@ -/* Font buffer generated from source file: 'src/fonts/vg_font_thin.png' */ -0xc3002800,0x8000020,0x8100000,0,0,0,0,0, -0x81102800,0x1c000020,0x10080010,0x2,0x3c103c7c,0x407c387c,0x38380000,0, -0x102822,0x22202020,0x20040010,0x2,0x46304208,0x48404404,0x44440000,0x38, -0x100022,0x20525000,0x20045410,0x4,0x46504210,0x48404008,0x44440000,0x8001044, -0x10007f,0x20245000,0x200438fe,0x8,0x4a100420,0x48404008,0x44441010,0x10000804, -0x100022,0x1c086000,0x20043810,0x8,0x5a100878,0x48787810,0x7c3c0000,0x20000404, -0x100022,0x2109400,0x20045410,0x3c0010,0x52101004,0x3c044410,0x44040000,0x403c0208, -0x22,0x2248800,0x20040010,0x20,0x62102004,0x8044420,0x44040000,0x40000210, -0x7f,0x224a9400,0x10080000,0x20,0x62104004,0x8444420,0x44440010,0x203c0400, -0x100022,0x1c046200,0x8100000,0x10002000,0x3c7c7e78,0x8383820,0x38381010,0x10000810, -0x22,0x8000000,0,0x20000000,0,0,0x20,0x8001000, +/* Font buffer generated from source file: 'vg/src/fonts/vg_font_thin_3.png' */ +0xc3002800,0x8000020,0x8100000,0,0x3c003c18,0x100018,0,0, +0,0,0,0,0,0,0,0, +0x81102800,0x1c000020,0x10080010,0x2,0x20800424,0x180c18,0x30000000,0, +0x18000000,0,0,0,0,0,0,0, +0x102822,0x22202020,0x20040010,0x2,0x20800442,0x81018,0x8000000,0x38, +0x24000000,0,0,0,0,0,0,0, +0x100022,0x20525000,0x20045410,0x4,0x20400400,0x1018,0x8000000,0x8001044, +0x440000fe,0x10380000,0,0,0,0,0,0, +0x10007f,0x20245000,0x200438fe,0x8,0x20200400,0x2018,0x4621010,0x10000804, +0x440000fe,0x387c0000,0,0,0,0,0,0, +0x100022,0x1c086000,0x20043810,0x8,0x20200400,0x4018,0x2920000,0x20000404, +0x540000fe,0x38fe0000,0,0,0,0,0,0, +0x100022,0x2109400,0x20045410,0x3c0010,0x20100400,0x4018,0x28c0000,0x403c0208, +0x540000fe,0x7cfe0000,0,0,0,0,0,0, +0x22,0x2248800,0x20040010,0x20,0x20080400,0x2018,0x4000000,0x40000210, +0x5c0000fe,0x7cfe0000,0,0,0,0,0,0, +0x7f,0x224a9400,0x10080000,0x20,0x20080400,0x1018,0x8000010,0x203c0400, +0xfe,0xfe7c0000,0,0,0,0,0,0, +0x100022,0x1c046200,0x8100000,0x10002000,0x20000400,0x1018,0x8001010,0x10000810, +0xfe,0xfe380000,0,0,0,0,0,0, +0x22,0x8000000,0,0x20000000,0x3c003c00,0xff000c00,0x30000020,0x8001000, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0x81000000,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, 0xc3000000,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x3c,0x3c1800, -0x1818303c,0x707c3838,0x447c7844,0x4044443c,0x7838387c,0xfe428282,0x8282fe20,0x80042400, -0x24244840,0x48404044,0x44100848,0x40444442,0x44444482,0x10428282,0x82820220,0x80044200, -0x44244840,0x44404040,0x44100848,0x40aa6442,0x44444480,0x10424492,0x44820420,0x40040000, -0x44424840,0x44404040,0x44100850,0x40aa5442,0x44444480,0x10424492,0x28820820,0x20040000, -0x54427840,0x4478705c,0x7c100860,0x40aa5442,0x7854787c,0x10424492,0x107e1020,0x20040000, -0x547e4440,0x44404044,0x44100850,0x40924c42,0x404c4402,0x104228aa,0x28022020,0x10040000, -0x5c424440,0x44404044,0x44100848,0x40924c42,0x40444402,0x104228aa,0x44024020,0x8040000, -0x424440,0x48404044,0x44101048,0x40924442,0x40424482,0x104228aa,0x82828020,0x8040000, -0x42783c,0x707c4038,0x447c6044,0x7c82443c,0x403a447c,0x103c1044,0x827cfe20,0x40000, -0,0,0,0,0,0,0x3c,0x3c00ff, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, -0x10000000,0,0,0,0,0,0,0x18000000, -0x18004000,0x4000000,0x40000040,0x60000000,0,0x40000000,0xc,0x18300000, -0x8004000,0x4003800,0x40100840,0x20000000,0,0x40000000,0x10,0x18080000, -0x4000,0x4004400,0x40000040,0x20000000,0,0x40000000,0x10,0x180800fe, -0x38783c,0x3c384038,0x78303848,0x206c3838,0x3838383c,0x78444282,0x44447c20,0x18046282, -0x44440,0x44444044,0x44100850,0x20924444,0x44444440,0x40444292,0x28440840,0x18029282, -0x3c4440,0x44447844,0x44100860,0x20924444,0x44444038,0x40442492,0x10441040,0x18028c82, -0x444440,0x44784044,0x44100860,0x20824444,0x44444004,0x40442492,0x28442020,0x18040082, -0x444440,0x44404044,0x44100850,0x20824444,0x64444044,0x404424aa,0x44444010,0x18080082, -0x3c783c,0x3c3c403c,0x44380848,0x1c824438,0x583c4038,0x38381844,0x443c7c10,0x180800fe, -0,0x4004,0x800,0,0x40040000,0,0x4000c,0x300000, -0,0x4004,0x3000,0,0x40060000,0,0x80000,0, -0,0x8078,0,0,0x40040000,0,0x700000,0, +0x18303c70,0x7c383844,0x7c784440,0x44443c78,0x38787cfe,0x42828282,0x82fe3c10,0x3c7c407c, +0x387c3838,0,0,0,0,0,0,0, +0x24484048,0x40404444,0x10084840,0x44444244,0x44448210,0x42828282,0x82024630,0x42084840, +0x44044444,0,0,0,0,0,0,0, +0x24484044,0x40404044,0x10084840,0xaa644244,0x44448010,0x42449244,0x82044650,0x42104840, +0x40084444,0,0,0,0,0,0,0, +0x42484044,0x40404044,0x10085040,0xaa544244,0x44448010,0x42449228,0x82084a10,0x4204840, +0x40084444,0,0,0,0,0,0,0, +0x42784044,0x78705c7c,0x10086040,0xaa544278,0x54787c10,0x42449210,0x7e105a10,0x8784878, +0x78107c3c,0,0,0,0,0,0,0, +0x7e444044,0x40404444,0x10085040,0x924c4240,0x4c440210,0x4228aa28,0x2205210,0x10043c04, +0x44104404,0,0,0,0,0,0,0, +0x42444044,0x40404444,0x10084840,0x924c4240,0x44440210,0x4228aa44,0x2406210,0x20040804, +0x44204404,0,0,0,0,0,0,0, +0x42444048,0x40404444,0x10104840,0x92444240,0x42448210,0x4228aa82,0x82806210,0x40040844, +0x44204444,0,0,0,0,0,0,0, +0x42783c70,0x7c403844,0x7c60447c,0x82443c40,0x3a447c10,0x3c104482,0x7cfe3c7c,0x7e780838, +0x38203838,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0x400004,0x40,0x4060,0,0x40,0,0x4,0x7000000, +0,0,0,0,0,0,0,0, +0x400004,0x380040,0x10084020,0,0x40,0,0x3008,0x73000000, +0,0,0,0,0,0,0,0, +0x400004,0x440040,0x4020,0,0x40,0,0x4810,0x4500606c, +0x98000000,0,0,0,0,0,0,0, +0x38783c3c,0x38403878,0x30384820,0x6c383838,0x38383c78,0x44428244,0x447c4810,0x4806706c, +0xe4e00000,0,0,0,0,0,0,0, +0x4444044,0x44404444,0x10085020,0x92444444,0x44444040,0x44429228,0x44083010,0x420c786c, +0xe2900000,0,0,0,0,0,0,0, +0x3c444044,0x44784444,0x10086020,0x92444444,0x44403840,0x44249210,0x4410000e,0x42d87c6c, +0xf28e0000,0,0,0,0,0,0,0, +0x44444044,0x78404444,0x10086020,0x82444444,0x44400440,0x44249228,0x44200000,0x7e70786c, +0x2820000,0,0,0,0,0,0,0, +0x44444044,0x40404444,0x10085020,0x82444464,0x44404440,0x4424aa44,0x44400000,0x20706c, +0x44820000,0,0,0,0,0,0,0, +0x3c783c3c,0x3c403c44,0x3808481c,0x82443858,0x3c403838,0x38184444,0x3c7c0000,0x606c, +0x38fe0000,0,0,0,0,0,0,0, +0,0x400400,0x80000,0x40,0x4000000,0,0x4000000,0, +0,0,0,0,0,0,0,0, +0,0x400400,0x300000,0x40,0x6000000,0,0x8000000,0, +0,0,0,0,0,0,0,0, +0,0x807800,0,0x40,0x4000000,0,0x70000000,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0x1818,0x1818,0x7c1e3c3c,0,0,0, +0,0xdc000000,0,0,0,0,0,0, +0xfe103882,0x82441060,0x3c002424,0x3c002424,0x82214242,0x18001800,0,0x1000, +0xe80000,0x90000000,0,0,0,0,0,0, +0x82284444,0x44442890,0x42000000,0x42000000,0x80010000,0x38181c7e,0x3c7c6c6c,0x6c6c2810, +0xdca80000,0xdc6c0000,0,0,0,0,0,0, +0x82288228,0x28284490,0x52521052,0x5a5a185a,0xaedd8868,0x783c1e7e,0x40eaae,0xee828228, +0x88e80022,0x84aa0000,0,0,0,0,0,0, +0x82448210,0x101044f0,0x52911091,0x52911091,0xa4898888,0x787e1e3c,0x3c5eeaae,0xee101044, +0xc8ae0042,0xdcaa0000,0,0,0,0,0,0, +0x82448228,0x28107c88,0x5a5a185a,0x52521052,0xb4898e8e,0x387e1c18,0x12eaae,0xee929282, +0x429e,0xaa0000,0,0,0,0,0,0, +0x82824444,0x44108288,0x42000000,0x42000000,0x80018a8a,0x18001800,0x3c1eeeee,0xee1000ee, +0xd0e04240,0x70ee0000,0,0,0,0,0,0, +0xfefe3882,0x821082f0,0x3c002424,0x3c002424,0x80016e8e,0,0x8282,0x8282aa28, +0x90407e20,0x40820000,0,0,0,0,0,0, +0,0,0x1818,0x1818,0,0,0,0x1038, +0x9c400000,0x70000000,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0xe0700000,0,0,0,0,0,0,0x800000, +0x80000000,0,0,0,0,0,0,0, +0x8010800a,0x200,0x100,0x2008000,0,0,0x1f80001f,0x81400000, +0xc0070040,0x38000000,0,0,0,0,0,0, +0x8010800a,0x703,0x100,0x4004000,0,0x4,0x10040000,0x82200000, +0x60080040,0x4000000,0,0x1e0,0,0,0,0, +0x800a,0x1040884,0x80380100,0x8002000,0,0x8,0x10020000,0x84100000, +0x20080040,0x4000000,0,0x210,0,0,0,0, +0x8000,0x1041044,0x84440000,0x8002000,0x400000,0x8,0x10020000,0x80000000, +0x80040,0x4000000,0,0x408,0,0xc03,0xf0000000,0, +0x8000,0x1041004,0x88440000,0x10001008,0x400000,0x10,0x10010000,0x80000000, +0x80040,0x4000000,0x200,0x80408,0x1e000000,0xffc1e07,0xf8000000,0, +0x8000,0x7ff1003,0x10440000,0x1000102a,0x400000,0x20,0x10008000,0x80000000, +0x100040,0x2038408,0x800400,0x40008,0x21000000,0xffc1e0f,0xfc000000,0, +0x8000,0x1040800,0x20440000,0x1000101c,0x400000,0x20,0x10008000,0x80000000, +0x100040,0x2044400,0x800,0x20008,0x40800000,0xffc3f0f,0xfc000000,0, +0x8000,0x1040700,0x40780000,0x1000101c,0x7fc0001,0xf8000040,0x10004000,0x80000000, +0x600040,0x1842400,0x1000,0x10010,0x4c800000,0xffc3f0f,0xfc000000,0, +0x8000,0x1040080,0x80880000,0x1000102a,0x400000,0x80,0x10002000,0x80000000, +0x100040,0x2041800,0x2001,0xf8008060,0x52800000,0xffc7f8f,0xfc000000,0, +0x8000,0x1040041,0x18850000,0x10001008,0x400000,0x80,0x10002000,0x80000000, +0x100040,0x2000000,0x4000,0x4080,0x52800000,0xffc7f8f,0xfc000000,0, +0,0x1040042,0x24820000,0x10001000,0x400000,0x100,0x10001000,0x80000000, +0x80040,0x4000000,0x2000,0x8000,0x52800000,0xffc7f8f,0xfc000000,0, +0x80100000,0x7ff1044,0x24850000,0x8002000,0x400000,0x200,0x10000800,0x80000000, +0x80040,0x4000000,0x1001,0xf8010000,0x52800000,0xffcffcf,0xfc000000,0, +0x80108000,0x1040880,0x24888000,0x8002000,0xc00,0x180200,0x10000800,0x80000000, +0x80040,0x4000000,0x800800,0x20080,0x4d000000,0xffcffc7,0xf8000000,0, +0xe0708000,0x1040700,0x18704000,0x4004000,0x800,0x180400,0x10000400,0x80000000, +0x80040,0x4000008,0x800400,0x40080,0,0xffcffc3,0xf0000000,0, +0,0x1040200,0,0x2008000,0x1000,0,0x1f80001f,0x8000fff0, +0x70000,0x38000000,0x1000200,0x80000,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0xc03e01f,0x87c07f83,0xf01f0410,0x7f07e041,0x84006304,0x81e07e0,0x1c07e01f,0x8ff84088, +0x8808808,0x808ffc1e,0xc01e07,0xf84007f8,0x1f07f81e,0x1e00000,0,0, +0x12041020,0x4204004,0x208410,0x8002042,0x4009486,0x8210410,0x22041020,0x40804088, +0x8808808,0x80800421,0x1402100,0x10420400,0x20800821,0x2100000,0,0, +0x21041040,0x4104004,0x400410,0x8002042,0x4009486,0x8408408,0x41040840,0x804084, +0x10808410,0x80800842,0x82404080,0x20420400,0x40001040,0x84080000,0,0, +0x21041040,0x4104004,0x400410,0x8002044,0x4009485,0x8408408,0x41040840,0x804084, +0x10888220,0x80801042,0x80404080,0x40420400,0x40002040,0x84080000,0,0, +0x40841040,0x4104004,0x400410,0x8002048,0x4009485,0x8408408,0x41040840,0x804084, +0x10888140,0x80802044,0x80400080,0x80420400,0x40002021,0x4080000,0,0, +0x4087e040,0x4104004,0x400410,0x8002070,0x4009484,0x88408410,0x49041020,0x804084, +0x10888080,0x41804044,0x80400101,0x4207e0,0x5e00401e,0x4080000,0,0, +0x40841040,0x4107e07,0xe04f87f0,0x8002070,0x4009484,0xc84087e0,0x4507e01f,0x804084, +0x10888080,0x3e808048,0x80400203,0xe0220010,0x61004021,0x2180000,0,0, +0x7f840840,0x4104004,0x408410,0x8002048,0x4008884,0x48408400,0x43041000,0x80804082, +0x20948080,0x810048,0x80400400,0x101f8008,0x40808040,0x81e80000,0,0, +0x40840840,0x4104004,0x408410,0x8002044,0x4008884,0x28408400,0x41040800,0x40804082, +0x20948140,0x820050,0x80400800,0x8020008,0x40808040,0x80080000,0,0, +0x40840840,0x4104004,0x408410,0x8002042,0x4008884,0x28408400,0x40840800,0x40804082, +0x20948220,0x840050,0x80401000,0x8020008,0x40810040,0x80080000,0,0, +0x40840840,0x4104004,0x408410,0x8002042,0x4008884,0x18408400,0x40040800,0x40804082, +0x20948410,0x80880060,0x80402000,0x8020408,0x40810040,0x80080000,0,0, +0x40841020,0x4204004,0x210410,0x8004041,0x2008084,0x18210400,0x22040840,0x80802101, +0x40948808,0x41080021,0x404000,0x10020210,0x21010021,0x4100000,0,0, +0x4087e01f,0x87c07f84,0x1e0410,0x7f078040,0x81f88084,0x81e0400,0x1c04083f,0x801e00, +0x80630808,0x3e0ffc1e,0x3f87f87,0xe00201e0,0x1e01001e,0x3e00000,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0x40000,0x80000,0x400,0x40,0x6000000,0,0,0x2000000, +0,0,0x80000,0,0,0,0,0, +0x40000,0x80000,0x400,0x40,0x2000000,0,0,0x2000000, +0,0,0x1001e0,0,0,0,0,0, +0x40000,0x80001,0xe0000400,0x4002040,0x2000000,0,0,0x2000000, +0,0xc,0x207c60,0,0,0,0,0, +0x40000,0x80002,0x10000400,0x40,0x2000000,0,0,0x2000000, +0,0x12,0x4060a0,0,0,0,0,0, +0x40000,0x80004,0x8000400,0x40,0x2000000,0,0,0x2000000, +0,0x12,0x806120,0x83803b8,0xf000000,0,0,0, +0x3e05e01e,0x1e81e04,0x1e85c0,0xc00e042,0x2003b85,0xe01e05e0,0x1e85f03f,0x3f04084, +0x4808410,0x4087f80c,0x806200,0x1c3c03b8,0x90877000,0,0,0, +0x1061021,0x2182104,0x218620,0x4002044,0x2004446,0x10210610,0x21860840,0x82004084, +0x4808410,0x40801000,0x806040,0x383e03b8,0xe0488800,0,0,0, +0x1040840,0x84084084,0x408410,0x4002048,0x2004444,0x8408408,0x40840040,0x2004082, +0x8888220,0x40802000,0x406044,0x703f03b8,0xe0484800,0,0,0, +0x3d040840,0x4084087,0xe0408410,0x4002070,0x2004444,0x8408408,0x4084003e,0x2004082, +0x8888140,0x40804000,0x3c604e,0xe03f83b8,0xf0483c00,0,0,0, +0x43040840,0x4087f04,0x408410,0x4002050,0x2004444,0x8408408,0x40840001,0x2004081, +0x10888080,0x40808000,0x7fc7,0xc03f83b8,0xf8480400,0,0,0, +0x41040840,0x4084004,0x408410,0x4002048,0x2004044,0x8408408,0x40840000,0x82004081, +0x10888140,0x40810000,0x7fc3,0x803f03b8,0x480400,0,0,0, +0x41040840,0x84084004,0x408410,0x4002044,0x2004044,0x8408408,0x40840000,0x82004081, +0x10948220,0x40820000,0x1,0x3e03b8,0x20480400,0,0,0, +0x43061021,0x2182084,0x218410,0x4002042,0x1004044,0x8210610,0x21840041,0x1002100, +0xa0a28410,0x21840000,0,0x3c03b8,0x10880400,0,0,0, +0x3c85e01e,0x1e81f04,0x1e8410,0xe002041,0xf04044,0x81e05e0,0x1e84003e,0xf01e00, +0x40410410,0x1e87f800,0,0x3803b8,0xf0ffc00,0,0,0, +0,0x4,0x8000,0x2000,0,0x400,0x800000,0, +0,0x800000,0,0,0,0,0,0, +0,0x4,0x8000,0x4000,0,0x400,0x800000,0, +0,0x800000,0,0,0,0,0,0, +0,0x4,0x410000,0x18000,0,0x400,0xc00000,0, +0,0x41000000,0,0,0,0,0,0, +0,0x8,0x3e0000,0,0,0x400,0x800000,0, +0,0x3e000000,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0x4,0x400000,0x40040,0,0, +0,0,0,0,0,0,0,0, +0xc03f,0x804804c,0xc0c07f0,0x1f00000a,0xa01f00,0xa00a0,0x3f81fc3f,0xc3fc0e00, +0x1c0000,0,0,0,0,0,0,0, +0xffc1e07f,0x8c0cc0ce,0x1c1e0ff8,0x20800011,0x1102080,0x110110,0x40420240,0x24021e00, +0x1e0000,0,0,0x80000,0,0,0,0, +0xffc1e0e1,0xc6186186,0x18330c18,0x40400000,0x4040,0,0x40420240,0x24023e00, +0xe01f07fc,0x1f87f873,0x87387387,0x701400c0,0x1b800000,0x7,0x38000000,0, +0xc0c330c0,0xc3303303,0x30330c18,0x48428808,0x2884642,0x68060268,0x40000200,0x7e01, +0xf01f87fc,0x400f2,0x493cf3c8,0x8808120,0x21000000,0x9,0x24000000,0, +0xc0c330c0,0xc1e01e03,0xf0618c38,0x48448408,0x4844844,0x84080484,0x5381ba11,0xd07e03, +0xf81f87fc,0x400f2,0x493cf3c8,0x8808210,0x21000000,0x1040009,0x24000000,0, +0xc0c618c0,0xc0c00c01,0xe0618ff8,0x48488208,0x8824848,0x82080882,0x51021211,0x1107e07, +0xfc1f83f8,0x1f84fcf2,0x493cf3c0,0x80080408,0x19024e00,0x2042669,0x24000000,0, +0xc0c618c0,0xc1e01e00,0xc0ffcffc,0x48448408,0x4844844,0x84080484,0x51021211,0xc11c3e07, +0xfc1f01f0,0x84f2,0x493cf3c8,0x88888804,0x54400,0x4044889,0x24000000,0, +0xc0c618c0,0xc3303300,0xc0ffcc0c,0x4e426806,0x2684842,0x88080288,0x51021211,0x41141e07, +0xfc1e00e0,0x84f2,0x493cf3c8,0x88888804,0x1a054400,0x8f86489,0x24000000,0, +0xc0cc0ce1,0xc6186180,0xc0c0cc0c,0x40400000,0x4040,0,0x4d02120d,0xc11c0e00, +0x1c0000,0x1f80fcf3,0xcf3cf3c0,0x80000f3c,0x22074440,0x4400428f,0x3c000000,0, +0xffcffc7f,0x8c0cc0c0,0xc0c0cffc,0x20800011,0x1102080,0x110110,0x40000200,0, +0,0x80,0x48048048,0x8808120,0x22053440,0x42002c68,0x4000000,0, +0xffcffc3f,0x8048040,0xc0c0c7f8,0x1f00000a,0xa01f00,0xa00a0,0x40000200,0, +0,0x80,0x48048048,0x8948120,0x2180007f,0xc1000008,0x4000000,0, +0,0,0,0x4,0x400000,0x40040,0,0, +0,0,0,0x801e0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0xfc003f00,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xc000,0, +0xfc003f00,0,0,0,0,0,0,0, +0,0,0,0,0,0,0x1e000,0, +0xc0000300,0xf00001ce,0,0xc0000,0,0x30000,0xc0000,0xc0000000, +0,0,0,0,0x3ffc000,0x3ff,0xc003f000,0, +0xc0000300,0xf00001ce,0,0xc0000,0,0x30000,0x1c0000,0xe0000000, +0,0,0,0,0x3ffc000,0x3ff,0xc0073800,0, +0xc0000300,0xf00001ce,0,0x3f000f,0,0x30000,0x380000,0x70000000, +0,0,0,0x70,0x3ffc030,0x3ff,0xc00e1c00,0, +0xc0000300,0xf00001ce,0,0x7f801f,0x80000000,0x30000,0x700000,0x38000000, +0,0,0,0xf0,0x3800038,0x1,0xc01c0e00,0, +0,0xf00000cc,0x38070,0xffc03f,0xc0000fc0,0x30000,0xe00000,0x1c000000, +0,0,0,0xe0,0x380003c,0x1,0xc0380700,0, +0,0xf00000cc,0x38070,0x1e1e039,0xc0001fc0,0x30000,0xe00000,0x1c000000, +0,0,0,0x1c0,0x380001c,0x1,0xc0300300,0, +0,0xf0000000,0x38070,0x3c0f039,0xc0303ff0,0,0x1c00000,0xe000000, +0x3000,0,0,0x1c0,0x380001e,0x1,0xc0000000,0, +0,0xf0000000,0x38070,0x3807039,0xc0703870,0,0x1c00000,0xe000000, +0x3000,0,0,0x380,0x380000e,0x1,0xc0000000,0, +0,0xf0000000,0x38070,0x3800039,0xc0f03870,0,0x3c00000,0xf0000c0, +0x3000,0,0,0x380,0x380000f,0x1,0xc0000000,0, +0,0xf0000000,0x38070,0x380003f,0xc1e03870,0,0x3800000,0x70000c0, +0x3000,0,0,0x700,0x3800007,0x80000001,0xc0000000,0, +0,0xf0000000,0x3fffff,0x380001f,0x83c03870,0,0x3800000,0x7000ccc, +0x3000,0,0,0xe00,0x3800003,0xc0000001,0xc0000000,0, +0,0xf0000000,0x3fffff,0x380000f,0x7803870,0,0x3800000,0x7000ccc, +0x3000,0,0,0xe00,0x3800001,0xc0000001,0xc0000000,0, +0,0xf0000000,0x3fffff,0x3c00000,0xf003870,0,0x3800000,0x70003f0, +0x3000,0,0,0x1c00,0x3800000,0xe0000001,0xc0000000,0, +0,0xf0000000,0x38070,0x3e00000,0x1e003ff0,0,0x3800000,0x70003f0, +0x3000,0,0,0x1c00,0x3800000,0xe0000001,0xc0000000,0, +0,0xf0000000,0x38070,0x1ff8000,0x3c003fc0,0,0x3800000,0x70003f0, +0x3ffff0,0x3,0xffc00000,0x3800,0x3800000,0x70000001,0xc0000000,0, +0,0xf0000000,0x38070,0xffc000,0x78007fc0,0,0x3800000,0x70003f0, +0x3ffff0,0x3,0xffc00000,0x7000,0x3800000,0x38000001,0xc0000000,0, +0,0xf0000000,0x38070,0x7fe000,0xf000f9e0,0,0x3800000,0x7000ccc, +0x3000,0,0,0x7000,0x3800000,0x3c000001,0xc0000000,0, +0,0x60000000,0x38070,0xf001,0xe000f0f0,0,0x3800000,0x7000ccc, +0x3000,0,0,0xe000,0x3800000,0x1c000001,0xc0000000,0, +0,0x60000000,0x38070,0x7003,0xc3c0e07b,0,0x3800000,0x70000c0, +0x3000,0,0,0xe000,0x3800000,0xe000001,0xc0000000,0, +0,0x60000000,0x38070,0x7007,0x87e0e03f,0,0x3800000,0x70000c0, +0x3000,0,0,0x1c000,0x3800000,0xe000001,0xc0000000,0, +0,0x60000000,0x38070,0x700f,0xff0e01f,0,0x3c00000,0xf000000, +0x3000,0,0,0x3c000,0x3800000,0x7000001,0xc0000000,0, +0,0,0x3fffff,0x701e,0xe70e01f,0,0x3c00000,0xf000000, +0x3000,0,0,0x38000,0x3800000,0x3800001,0xc0000000,0, +0xc0000300,0,0x3fffff,0x380703c,0xe70e03f,0x80000000,0x1c00000,0xe000000, +0x3000,0,0,0x70000,0x3800000,0x1c00001,0xc0000000,0, +0xc0000300,0,0x3fffff,0x3c0f038,0xe70e07b,0xc0000000,0x1c00000,0xe000000, +0x3000,0,0,0x70000,0x3800000,0x1c00001,0xc0000000,0, +0xc0000300,0x60000000,0x38070,0x1e1f030,0xe70f0f1,0xe0000000,0xe00000,0x1c000000, +0,0xf00000,0x180,0xe0000,0x3800000,0xe00001,0xc0000000,0, +0xc0000300,0xf0000000,0x38070,0xffe000,0xff07fe0,0xf0000000,0xe00000,0x1c000000, +0,0xf00000,0x3c0,0xe0000,0x3800000,0xe00001,0xc0000000,0, +0xfc003f00,0xf0000000,0x38070,0x7fc000,0x7e07fc0,0x70000000,0x700000,0x38000000, +0,0xe00000,0x3c0,0x1c0000,0x3800000,0x700001,0xc0000000,0, +0xfc003f00,0x60000000,0x38070,0x3f8000,0x3c01f00,0x30000000,0x380000,0x70000000, +0,0x1c00000,0x180,0x1c0000,0x3ffc000,0x3003ff,0xc0000000,0, +0,0,0x38070,0xc0000,0,0,0x1c0000,0xe0000000, +0,0x3800000,0,0,0x3ffc000,0x3ff,0xc0000000,0xffffff00, +0,0,0x38070,0xc0000,0,0,0xc0000,0xc0000000, +0,0x3000000,0,0,0x3ffc000,0x3ff,0xc0000000,0xffffff00, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0xc00000,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0xe00000,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0xf00000,0x3f000070,0xfc000,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0xf80000,0x7f000070,0xfe000,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0x7c0000,0xff000070,0xff000,0,0,0,0,0x3fc, +0,0,0,0,0,0,0,0, +0x1c0000,0xf0000070,0xf000,0,0,0,0,0x7fe, +0,0,0,0,0,0,0,0, +0xc0000,0xe0000070,0x7000,0,0,0,0,0xfff, +0,0,0,0,0,0x30000030,0,0, +0,0xe0000070,0x7000,0,0,0,0,0x1e07, +0x80000000,0,0,0,0,0x78000078,0,0, +0,0xe0000070,0x7800,0,0,0,0,0x3c03, +0xc0000000,0,0,0xf000,0x3fc0000,0xfc0000fc,0x3ff00,0, +0x1,0xe0000070,0x7800,0,0,0,0,0x3801, +0xc0000000,0,0,0x1f800,0xfff0001,0xce0001ce,0x7ff80,0, +0x1,0xe0000070,0x7800,0,0,0xc00,0,0xc0003801, +0xc003fc00,0,0xffff,0xf003fc00,0x1fff8003,0x87000387,0xe01c0,0, +0x1,0xc0000070,0x3800,0,0,0x1c00,0,0xe0003801, +0xc007fe00,0,0xffff,0xf003fc00,0x3fffc003,0x3000303,0x1c00e0,0, +0x3,0xc0000070,0x3c00,0xfc07000,0xc00000c0,0x3800,0,0x70000001, +0xc00e0700,0,0xffff,0xf007fe00,0x7fffe000,0,0x380070,0, +0x3,0x80000070,0x1c00,0x1fe07001,0xe00001e0,0x7000,0,0x38000001, +0xc01c0380,0,0xffff,0xf007fe00,0x7fffe000,0,0x300030,0, +0x7,0x80000070,0x1e00,0x3ff07001,0xe00001e0,0xe000,0,0x1c000001, +0xc03801c0,0,0xffff,0xf00fff00,0xfffff000,0xc0000cc0,0xc0303c30,0xc3cc000, +0x3f,0x80000070,0x1fc0,0x38787000,0xc00000c0,0x1c000,0,0xe000003, +0xc03000c0,0,0xffff,0xf00fff00,0xfffff000,0xc0001cc0,0xe0307c30,0x1c7ce000, +0x3e,0x70,0x7c0,0x383c7000,0,0x38000,0,0x7000007, +0x8030f0c0,0,0xffff,0xf01fff80,0xfffff000,0xc00038c0,0x7030e030,0x38e07000, +0x3e,0x70,0x7c0,0x381ff000,0,0x70000,0,0x380007f, +0x31f8c0,0,0xffff,0xf01fff80,0xfffff000,0xc00070c0,0x3830c030,0x70c03800, +0x7,0x80000070,0x1e00,0x380fe000,0,0xe0000,0x3ffc000,0x1c000fe, +0x339cc0,0,0xffff,0xf03fffc0,0xfffff000,0xc000e0c0,0x1c30c030,0xe0c01c00, +0x3,0x80000070,0x1c00,0x3807c000,0,0x1c0000,0x3ffc000,0xe001fc, +0x330cc0,0,0xffff,0xf03fffc0,0xfffff000,0xc000e0c0,0x1c30c030,0xe0c01c00, +0x3,0x80000070,0x1c00,0,0,0x380000,0,0x7001e0, +0x330cc0,0,0xffff,0xf03fffc0,0xfffff000,0xc00070c0,0x3830c030,0x70c03800, +0x3,0xc0000070,0x3c00,0,0,0x380000,0,0x7001e0, +0x330cc0,0,0xffff,0xf07fffe0,0xfffff000,0xe00038e0,0x7030c030,0x38c07000, +0x1,0xc0000070,0x3800,0,0,0x1c0000,0,0xe000c0, +0x330cc0,0,0xffff,0xf07fffe0,0xfffff000,0x7c001c7c,0xe030c030,0x1cc0e000, +0x1,0xe0000070,0x7800,0,0,0xe0000,0,0x1c00000, +0x330cc0,0,0xffff,0xf07fffe0,0xfffff000,0x3c000c3c,0xc030c030,0xcc0c000, +0x1,0xe0000070,0x7800,0,0,0x70000,0x3ffc000,0x3800000, +0x330cc0,0,0xffff,0xf0fffff0,0x7fffe000,0,0x300030,0, +0,0xe0000070,0x7800,0,0,0x38000,0x3ffc000,0x7000000, +0x339cc0,0,0xffff,0xf0fffff0,0x7fffe000,0,0x380070,0, +0,0xe0000070,0x7000,0,0xc00001e0,0x1c000,0,0xe0000c0, +0x31ff80,0,0xffff,0xf0fffff0,0x3fffc003,0x3000303,0x1c00e0,0, +0,0xe0000070,0x7000,0x1,0xe00001e0,0xe000,0,0x1c0001e0, +0x30f300,0,0xffff,0xf0fffff0,0x1fff8003,0x87000387,0xe01c0,0, +0,0xf0000070,0xf000,0x1,0xe00001c0,0x7000,0,0x380001e0, +0,0,0xffff,0xf0fffff0,0xfff0001,0xce0001ce,0x7ff80,0, +0,0xff000070,0xff000,0,0xc0000380,0x3800,0,0x700000c0, +0,0,0xffff,0xf0fffff0,0x3fc0000,0xfc0000fc,0x3ff00,0, +0,0x7f000000,0xfe000,0,0x700,0x1c00,0,0xe0000000, +0,0,0,0,0,0x78000078,0,0, +0,0x3f000000,0xfc000,0,0x600,0xc00,0,0xc0000000, +0,0,0,0,0,0x30000030,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0x1f0003f,0xfe001fff,0x3ffe00,0x1fff001f,0xff001ffe,0x3c0780,0xfff0000,0x38003c0f, +0x801c0000,0xf003c038,0x3803ffe,0x3ffe00,0x3ffe003f,0xfc001ffe,0x7fff00,0x3c1f0000, +0x1f8003f,0xff803fff,0x3fff00,0x3fff003f,0xff003ffe,0x3e0780,0xfff0000,0x3c003c0f, +0x803c0000,0xf807c03c,0x7803fff,0x3fff00,0x3fff003f,0xfe003ffe,0x7fff00,0x3e1f0000, +0x1fc003f,0xff803fff,0x3fff00,0x3fff003f,0xff003ffe,0x3e0780,0xfff0000,0x3c003c1f, +0x3c0000,0xf807c03e,0x7803fff,0x3fff00,0x3fff003f,0xff003ffe,0x7fff00,0x3e1f0000, +0x1fc003f,0xff803fff,0x3fff00,0x3fff003f,0xff003ffe,0x3e0780,0xffe0000,0x3c003c1f, +0x3c0000,0xfc0fc03e,0x7803fff,0x3fff00,0x3fff003f,0xff003ffe,0x7ffe00,0x3e1f0000, +0x3fc003c,0xf803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003c3e, +0x3c0000,0xfc0fc03e,0x7803c0f,0x3c1f00,0x3c0f003c,0x1f003e1e,0x1e000,0x3e1f0000, +0x3fc003c,0x7803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003c3e, +0x3c0000,0xfc0fc03f,0x7803c0f,0x3c0f00,0x3c0f003c,0x1f003e1e,0x1e000,0x3e1f0000, +0x3fc003c,0x7803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003c3c, +0x3c0000,0xfe1fc03f,0x7803c0f,0x3c0f00,0x3c0f003c,0x1f003e1e,0x1e000,0x3e1f0000, +0x3fe003c,0x7803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003c7c, +0x3c0000,0xfe1fc03f,0x87803c0f,0x3c0f00,0x3c0f003c,0x1f003e00,0x1e000,0x3e1f0000, +0x3fe003c,0x7803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003c78, +0x3c0000,0xff3fc03f,0x87803c0f,0x3c0f00,0x3c0f003c,0x1f003e00,0x1e000,0x3e1f0000, +0x7de003c,0xf803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003cf8, +0x3c0000,0xff3fc03f,0x87803c0f,0x3c0f00,0x3c0f003c,0x1f003e00,0x1e000,0x3e1f0000, +0x79e003c,0x1f803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003cf0, +0x3c0000,0xffffc03f,0xc7803c0f,0x3c0f00,0x3c0f003c,0x1f003e00,0x1e000,0x3e1f0000, +0x79e003f,0xff003c00,0x3c0f00,0x3c00003e,0x3c00,0x3fff80,0xf00000,0x3c003cf0, +0x3c0000,0xffffc03f,0xc7803c0f,0x3c0f00,0x3c0f003c,0x1f003e00,0x1e000,0x3e1f0000, +0x79f003f,0xfe003c00,0x3c0f00,0x3ffc003e,0x3c00,0x3fff80,0xf00000,0x3c003df0, +0x3c0000,0xf7f7c03f,0xc7803c0f,0x3e1f00,0x3c0f003e,0x1f003ffc,0x1e000,0x3e1f0000, +0x79f003f,0xff003c00,0x3c0f00,0x3ffc003f,0xf0003c00,0x3fff80,0xf00000,0x3c003de0, +0x3c0000,0xf7f7c03f,0xe7803c0f,0x3fff00,0x3c0f003f,0xfe003ffe,0x1e000,0x3e1f0000, +0xf8f003f,0xff803c00,0x3c0f00,0x3ffc003f,0xf0003c00,0x3fff80,0xf00000,0x3c003fe0, +0x3c0000,0xf7f7c03d,0xe7803c0f,0x3fff00,0x3c0f003f,0xfe003ffe,0x1e000,0x3e1f0000, +0xf0f003c,0xf803c00,0x3c0f00,0x3ffc003f,0xf0003c1e,0x3e0780,0xf00000,0x3c003de0, +0x3c0000,0xf3e7c03d,0xf7803c0f,0x3fff00,0x3c0f003f,0xfc001ffe,0x1e000,0x3e1f0000, +0xfef003c,0x7803c00,0x3c0f00,0x3ffc003f,0xf0003c1e,0x3e0780,0xf00000,0x3c003df0, +0x3c0000,0xf3e7c03d,0xf7803c0f,0x3fff00,0x3c0f003f,0xfe00001e,0x1e000,0x3e1f0000, +0xfef003c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003cf0, +0x3c0000,0xf3e7c03c,0xf7803c0f,0x3c0000,0x3c0f003c,0x3f00001e,0x1e000,0x3e1f0000, +0xfcf803c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003cf8, +0x3c0000,0xf1c7c03c,0xff803c0f,0x3c0000,0x3c0f003c,0x1f00001e,0x1e000,0x3e1f0000, +0x1f8f803c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003cf8, +0x3c0000,0xf1c7c03c,0xff803c0f,0x3c0000,0x3c0f003c,0x1f00001e,0x1e000,0x3e1f0000, +0x1f87803c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003c78, +0x3c0000,0xf1c7c03c,0x7f803c0f,0x3c0000,0x3c0f003c,0x1f00001e,0x1e000,0x3e1f0000, +0x1f87803c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003c7c, +0x3c0000,0xf087c03c,0x7f803c0f,0x3c0000,0x3c0f003c,0x1f00001e,0x1e000,0x3e1f0000, +0x1f07803c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003c3c, +0x3c0000,0xf007c03c,0x3f803c0f,0x3c0000,0x3c0f003c,0x1f003e1e,0x1e000,0x3e1f0000, +0x1f07c03c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003c3e, +0x3c0000,0xf007c03c,0x3f803c0f,0x3c0000,0x3c0f003c,0x1f003e1e,0x1e000,0x3e1f0000, +0x3e07c03c,0xf803e00,0x3c0f00,0x3e00003e,0x3e1e,0x3e0780,0xf00000,0x7c003c3e, +0x3e0000,0xf007c03c,0x3f803e0f,0x3c0000,0x3e0f003c,0x1f003e3e,0x1e000,0x3e1f0000, +0x3e07c03f,0xff803fff,0x3fff00,0x3fff003e,0x3ffe,0x3e0780,0x7ff0007,0xfc003c1f, +0x3ffe00,0xf007c03c,0x1f803fff,0x3c0000,0x3fff003c,0x1f003ffe,0x1e000,0x3fff0000, +0x3e03c03f,0xff803fff,0x3fff00,0x3fff003e,0x3ffe,0x3e0780,0xfff0007,0xfc003c1f, +0x3ffe00,0xf007c03c,0x1f803fff,0x3c0000,0x3fff003c,0x1f003ffe,0x1e000,0x3fff0000, +0x3c03c03f,0xff803fff,0x3fff00,0x3fff003e,0x3ffe,0x3e0780,0xfff0007,0xfc003c0f, +0x3ffe00,0xf007c03c,0x1f803fff,0x3c0000,0x3fff003c,0x1f003ffe,0x1e000,0x3fff0000, +0x3c03e03f,0xff001fff,0x3ffe00,0x1fff003e,0x1ffe,0x3e0780,0xfff0007,0xf8003c0f, +0x803ffe00,0xf007c03c,0xf801fff,0x3c0000,0x1fff003c,0x1f003ffc,0x1e000,0x3ffe0000, +0,0,0,0,0,0,0,0, +0,0,0,0,0x3c0000,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0x3c0000,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0x3c0000,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0x1f8003f,0xfe001fff,0x3ffe00,0x1fff001f,0xff001ffe,0x3c0780,0xfff0000,0x38003c0f, +0x801c0000,0xf003c038,0x3803ffe,0x3ffe00,0x3ffe003f,0xfc001ffe,0x7fff00,0x3c1f0000, +0x1fc003f,0xff803fff,0x3fff00,0x3fff003f,0xff003ffe,0x3e0780,0xfff0000,0x3c003c0f, +0x803c0000,0xf807c03c,0x7803fff,0x3fff00,0x3fff003f,0xfe003ffe,0x7fff00,0x3e1f0000, +0x1fc003f,0xff803fff,0x3fff00,0x3fff003f,0xff003ffe,0x3e0780,0xfff0000,0x3c003c1f, +0x3c0000,0xfc0fc03e,0x7803fff,0x3fff00,0x3fff003f,0xff003ffe,0x7fff00,0x3e1f0000, +0x3fc003f,0xff803fff,0x3fff00,0x3fff003f,0xff003ffe,0x3e0780,0xffe0000,0x3c003c1f, +0x3c0000,0xfc0fc03e,0x7803fff,0x3fff00,0x3fff003f,0xff003ffe,0x7ffe00,0x3e1f0000, +0x3fc003c,0xf803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003c3e, +0x3c0000,0xfc0fc03f,0x7803c0f,0x3c1f00,0x3c0f003c,0x1f003e1e,0x1e000,0x3e1f0000, +0x3fe003c,0x7803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003c3c, +0x3c0000,0xfe1fc03f,0x7803c0f,0x3c0f00,0x3c0f003c,0x1f003e1e,0x1e000,0x3e1f0000, +0x3fe003c,0x7803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003c7c, +0x3c0000,0xff3fc03f,0x87803c0f,0x3c0f00,0x3c0f003c,0x1f003e00,0x1e000,0x3e1f0000, +0x7de003c,0x7803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003c78, +0x3c0000,0xff3fc03f,0x87803c0f,0x3c0f00,0x3c0f003c,0x1f003e00,0x1e000,0x3e1f0000, +0x79e003c,0xf803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003cf8, +0x3c0000,0xffffc03f,0xc7803c0f,0x3c0f00,0x3c0f003c,0x1f003e00,0x1e000,0x3e1f0000, +0x79f003f,0xff003c00,0x3c0f00,0x3ffc003f,0xf0003c00,0x3fff80,0xf00000,0x3c003cf0, +0x3c0000,0xffffc03f,0xc7803c0f,0x3fff00,0x3c0f003c,0x1f003ffe,0x1e000,0x3e1f0000, +0x79f003f,0xff003c00,0x3c0f00,0x3ffc003f,0xf0003c00,0x3fff80,0xf00000,0x3c003df0, +0x3c0000,0xf7f7c03f,0xe7803c0f,0x3fff00,0x3c0f003f,0xfe003ffe,0x1e000,0x3e1f0000, +0xf8f003f,0xff803c00,0x3c0f00,0x3ffc003f,0xf0003c00,0x3fff80,0xf00000,0x3c003fe0, +0x3c0000,0xf7f7c03d,0xe7803c0f,0x3fff00,0x3c0f003f,0xfe003ffe,0x1e000,0x3e1f0000, +0xf0f003f,0xff803c00,0x3c0f00,0x3ffc003f,0xf0003c1e,0x3fff80,0xf00000,0x3c003ff0, +0x3c0000,0xf3e7c03d,0xf7803c0f,0x3fff00,0x3c0f003f,0xfc001ffe,0x1e000,0x3e1f0000, +0xfef803c,0xf803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003df0, +0x3c0000,0xf3e7c03c,0xf7803c0f,0x3c0000,0x3c0f003f,0xfe00001e,0x1e000,0x3e1f0000, +0xfcf803c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003cf8, +0x3c0000,0xf1c7c03c,0xff803c0f,0x3c0000,0x3c0f003c,0x3f00001e,0x1e000,0x3e1f0000, +0x1f8f803c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003cf8, +0x3c0000,0xf1c7c03c,0xff803c0f,0x3c0000,0x3c0f003c,0x1f00001e,0x1e000,0x3e1f0000, +0x1f87803c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003c7c, +0x3c0000,0xf1c7c03c,0x7f803c0f,0x3c0000,0x3c0f003c,0x1f00001e,0x1e000,0x3e1f0000, +0x1f07c03c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003c7c, +0x3c0000,0xf007c03c,0x3f803c0f,0x3c0000,0x3c0f003c,0x1f003e1e,0x1e000,0x3e1f0000, +0x1f07c03c,0xf803e00,0x3c0f00,0x3e00003e,0x3e1e,0x3e0780,0xf00000,0x3c003c3e, +0x3e0000,0xf007c03c,0x3f803e0f,0x3c0000,0x3e0f003c,0x1f003e3e,0x1e000,0x3e1f0000, +0x3e07c03f,0xff803fff,0x3fff00,0x3fff003e,0x3ffe,0x3e0780,0x7ff0000,0x7c003c3f, +0x3ffe00,0xf007c03c,0x3f803fff,0x3c0000,0x3fff003c,0x1f003ffe,0x1e000,0x3fff0000, +0x3e07e03f,0xff803fff,0x3fff00,0x3fff003e,0x3ffe,0x3e0780,0xfff0007,0xfc003c1f, +0x3ffe00,0xf007c03c,0x1f803fff,0x3c0000,0x3fff003c,0x1f003ffe,0x1e000,0x3fff0000, +0x3c03e03f,0xff803fff,0x3fff00,0x3fff003e,0x3ffe,0x3e0780,0xfff0007,0xfc003c1f, +0x803ffe00,0xf007c03c,0x1f803fff,0x3c0000,0x3fff003c,0x1f003ffe,0x1e000,0x3fff0000, +0x3c03e03f,0xff001fff,0x3ffe00,0x1fff003e,0x1ffe,0x3e0780,0xfff0007,0xf8003c0f, +0x803ffe00,0xf007c03c,0xf801fff,0x3c0000,0x1fff003c,0x1f003ffc,0x1e000,0x3ffe0000, +0,0,0,0,0,0,0,0, +0,0,0,0,0x3c0000,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0x3c0000,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0x3c0000,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0x3c03e07c,0x7c07c07,0xc03c03c0,0x1fff803f,0xfc0007f0,0xffc00,0x3ff00003,0xe0003ffc, +0x1ffe00,0x3ff8001f,0xfc000ffe,0,0,0,0,0, +0x3c03e07c,0x7c07c07,0xc03e07c0,0x1fff803f,0xfe0007f8,0x1ffe00,0x3ff80003,0xc0003ffc, +0x3ffe00,0x3ffc003f,0xfe001fff,0,0,0,0,0, +0x3c03e07c,0x7c07c07,0xc03e07c0,0x1fff803f,0xfe0007f8,0x1ffe00,0x3ff80003,0xc0003ffc, +0x3ffe00,0x3ffc003f,0xfe001fff,0,0,0,0,0, +0x3c03e07c,0x7c03e0f,0x801f0f80,0x1fff803f,0xfe0007f8,0x1ffe00,0x3ff80003,0xc0003ffc, +0x3ffe00,0x3ffc003f,0xfe001fff,0,0,0,0,0, +0x3e03e07c,0x7c03e0f,0x801f0f80,0xfff803c,0x1e0007f8,0x1e3e00,0xf80003,0xc0003c00, +0x3c0000,0x78003c,0x1e001e0f,0x3000,0x300000,0,0,0, +0x1e03c07c,0x7c01f1f,0xf0f00,0xf003c,0x1e0000f8,0x1e3e00,0x780007,0xc0003c00, +0x3c0000,0x78003c,0x1e001e0f,0x7800,0x780000,0,0,0, +0x1e07c07c,0x7c01f1f,0xf9f00,0x1f003c,0x1e0000f8,0x1e7e00,0x780007,0xc0003c00, +0x3c0000,0x78003c,0x1e001e0f,0xfc00,0xfc000f,0xffc003ff,0xf00ffff0,0xffff000, +0x1e07c07c,0x7800fbe,0xf9f00,0x1f003c,0x1e0000f8,0x7c00,0x780007,0x80003c00, +0x3c0000,0xf8003c,0x1e001e0f,0x1ce00,0x1ce001f,0xffe007ff,0xf81ffff8,0x1ffff800, +0x1f07c07c,0x7800fbe,0x79e00,0x3e003c,0x1e0000f8,0x7c00,0x780007,0x80003c00, +0x3c0000,0xf0003c,0x1e001e0f,0x38700,0x3870038,0x700e00,0x1c38001c,0x38001c00, +0xf07803c,0x7800ffe,0x7fe00,0x3e003c,0x1e0000f8,0xfc00,0x780007,0x80003c00, +0x3c0000,0xf0003c,0x1e001e0f,0x30300,0x3030030,0x300c00,0xc30000c,0x30000c00, +0xf07803e,0x4f8007fc,0x7fe00,0x7c003c,0x1e0000f8,0xf800,0xff80007,0x80003ff8, +0x3c0000,0xf0003f,0xfe001e0f,0,0x30,0x300c00,0xc30000c,0x30000c00, +0xf0f803e,0x4f8007fc,0x3fc00,0x7c003c,0x1e0000f8,0x1f800,0xff8000f,0x80003ffc, +0x3c0000,0xf0001f,0xfc001e0f,0,0x30,0x300c00,0xc30000c,0x30000c00, +0xf0f003e,0x4f8007fc,0x3fc00,0xf8003c,0x1e0000f8,0x1f000,0xff0000f,0x80003ffc, +0x3ffc00,0x1e0001f,0xfc001fff,0x3c00,0xc3cc030,0,0xc000000,0, +0xf8f003e,0xef8003f8,0x1f800,0xf8003c,0x1e0000f8,0x1f000,0xff8000f,0x3ffc, +0x3ffe00,0x1e0003f,0xfe001fff,0x7c00,0x1c7ce030,0,0xc000000,0, +0x78f003e,0xef8003f8,0x1f800,0x1f0003c,0x1e0000f8,0x3f000,0xff8000f,0x3c, +0x3ffe00,0x1e0003c,0x1e001fff,0xe000,0x38e07033,0xfc003cf,0xcc030300,0xf30000, +0x78f003e,0xef0003f8,0xf000,0x1f0003c,0x1e0000f8,0x3e000,0x78000f,0x3c, +0x3ffe00,0x1e0003c,0x1e000fff,0xc000,0x70c03833,0xfc007cf,0xcc030300,0x1f30000, +0x78f003e,0xef0003f8,0xf000,0x3e0003c,0x1e0000f8,0x7e000,0x78000f,0x3c, +0x3c1e00,0x3e0003c,0x1e00000f,0xc000,0xe0c01c33,0x3000e03,0xc030300,0x3830000, +0x79e001f,0xff0007fc,0xf000,0x3e0003c,0x1e0000f8,0x7e000,0x78001f,0x3c, +0x3c1e00,0x3c0003c,0x1e00000f,0xc000,0xe0c01c33,0x3000c03,0xc030300,0x3030000, +0x7de001f,0xff0007fc,0xf000,0x3c0003c,0x1e0000f8,0x7c000,0x78001f,0x3c, +0x3c1e00,0x3c0003c,0x1e00000f,0xc000,0x70c03833,0x3000c03,0xc0303e0,0x303e000, +0x3de001f,0xff000ffc,0xf000,0x7c0003c,0x1e0000f8,0xfc000,0x78001e,0x3c, +0x3c1e00,0x3c0003c,0x1e00000f,0xc000,0x38c07033,0x3000c03,0xc0303f0,0x303f000, +0x3de001f,0xff000fbe,0xf000,0x780003c,0x1e0000f8,0xf8000,0x78001e,0x3c, +0x3c1e00,0x3c0003c,0x1e00000f,0xc000,0x1cc0e033,0x3000c03,0xc030330,0x3033000, +0x3de001f,0xff000fbe,0xf000,0xf80003c,0x1e0000f8,0x1f8000,0x78001e,0x3c00003c, +0x3c1e00,0x780003c,0x1e00000f,0xc000,0xcc0c033,0x83000c03,0xc038330,0x3033000, +0x3fc001f,0xff001f1f,0xf000,0xf80003c,0x1e0000f8,0x1f8000,0x78001e,0x3e00003c, +0x3c1e00,0x780003c,0x1e00000f,0,0x31,0xf3000c03,0xc01f3f0,0x303f000, +0x3fc001f,0xbe001f1f,0xf000,0x1f00003c,0x1e0000f8,0x1f0000,0x78001e,0x3e00003c, +0x3c1e00,0x780003c,0x1e00000f,0,0x30,0xf3000c03,0xc00f1e0,0x301e000, +0x1fc001f,0xbe003e0f,0x8000f000,0x1fff003c,0x1e0000f8,0x3f0000,0xf8003e,0x3e00003c, +0x3c1e00,0x780003c,0x1e00000f,0x30300,0x3030030,0,0xc000000,0, +0x1fc000f,0xbe003e0f,0x8000f000,0x1fff803f,0xfe0007ff,0x3fff00,0x3ff8003f,0xfe003ffc, +0x3ffe00,0xf00003f,0xfe000fff,0x38700,0x3870030,0,0xc000000,0, +0x1fc000f,0x1e003c07,0x8000f000,0x1fff803f,0xfe0007ff,0x3fff00,0x3ff8003f,0xfe003ffc, +0x3ffe00,0xf00003f,0xfe001fff,0x1ce00,0x1ce0030,0,0xc000000,0, +0x1f8000f,0x1e007c07,0xc000f000,0x1fff803f,0xfe0007ff,0x3fff00,0x3ff8003f,0xfe003ffc, +0x3ffe00,0xf00003f,0xfe001fff,0xfc00,0xfc0030,0,0xc000000,0, +0x1f8000e,0x1e007c07,0xc000f000,0x1fff803f,0xfe0007ff,0x3fff00,0x3ff0003f,0xfe003ffc, +0x3ffe00,0xf00001f,0xfc001ffe,0x7800,0x780000,0,0,0, +0,0,0,0,0,0,0,0x3e000000, +0,0,0,0x3000,0x300000,0,0,0, +0,0,0,0,0,0,0,0x3e000000, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0x3c01e07c,0x7c07c07,0xc03c03c0,0x3fff0000,0xf0,0xfff00,0xc00030c0,0x30f000, +0xf000f000,0x3fff0003,0xff000000,0xfc00,0x3,0xf0000000,0,0, +0x3c01e07c,0x7c07c07,0xc03c03c0,0x3fff0000,0x1f8,0x1fff80,0xe00070e0,0x70f801, +0xf001f800,0x7fff8007,0xff800000,0x1fc00,0x3,0xf8000000,0,0, +0x3c01e07c,0x7c07c07,0xc03e07c0,0x3fff00ff,0xfff003fc,0x3fffc0,0xf000f0f0,0xf0f801, +0xf003fc00,0xffffc00e,0x1c00000,0x3fc00,0x3,0xfc000000,0,0, +0x3c01e07c,0x7c07e0f,0xc03e07c0,0x3fff00ff,0xfff003fc,0x7fffe0,0xf801f0f8,0x1f0fc03, +0xf007fe00,0xffffc01c,0xe00000,0x7fc00,0x3,0xfe000000,0,0, +0x3c01e07c,0x7c03e0f,0x801f0f80,0x1f00ff,0xfff007fe,0xfc03f0,0x7c03e07c,0x3e07c03, +0xe00fff00,0xf00fc038,0x700000,0xffc00,0xfc0003,0xff003fff,0xf003ffc0,0x3fffc000, +0x3e03e07c,0x7c03f1f,0x801f0f80,0x1f00ff,0xfff007fe,0xf801f0,0x3e07c03e,0x7c03e07, +0xc00f9f00,0xf007c030,0x300000,0x1ffc00,0x1fe0003,0xff803fff,0xf003ffc0,0x3fffc000, +0x1e03c07c,0x7c01f1f,0xf0f00,0x3e00f0,0xf00f9f,0xf000f0,0x1f0f801f,0xf801f0f, +0x801f0f80,0xf003c030,0xc0300cc0,0xc03ffc00,0x3ff0003,0xffc03fff,0xf0000000,0x30000000, +0x1e03c07c,0x7c00fbe,0xf9f00,0x3e00f0,0xf00f0f,0xf000f0,0xf9f000f,0x9f000f9f, +0x1f0f80,0xf003c030,0xc0301cc0,0xe03ffc00,0x7ff8003,0xffc03fff,0xf0000000,0x30000000, +0x1f07c07c,0x7c00fbe,0x79e00,0x7c00f0,0xf01f0f,0x80f000f0,0x7fe0007,0xfe0007fe, +0x3e07c0,0xf007c030,0xc03038c0,0x703ffc00,0xfffc003,0xffc03fff,0xf0000000,0x30000000, +0xf07803c,0x78007fc,0x7fe00,0x7c00f0,0xf01f0f,0x80f000f0,0x3fc0003,0xfc0003fc, +0x3e07c0,0xf00fc030,0xc03070c0,0x383ffc00,0x1fffe003,0xffc03fff,0xf0000000,0x30000000, +0xf07803e,0x4f8007fc,0x3fc00,0xf800f0,0xf03e07,0xc0f000f0,0x1f80001,0xf80001f8, +0x7c03e0,0xffff8030,0xc030e0c0,0x1c3ffc00,0x3ffff003,0xffc01fff,0xe003ffc0,0x30fff000, +0xf07803e,0x4f8003f8,0x3fc00,0x1f000f0,0xf03e07,0xc0f000f0,0x1f80001,0xf80000f0, +0x7c03e0,0xffff8030,0xc030e0c0,0x1c3ffc00,0x3ffff003,0xffc00fff,0xc003ffc0,0x30fff000, +0xf8f803e,0x4f8003f8,0x1f800,0x1f000f0,0xf03e07,0xc0f000f0,0x3fc0003,0xfc0000f0, +0xfffff0,0xffffe030,0xc03070c0,0x381ffc00,0x3ffff003,0xff8007ff,0x80000000,0xc03000, +0x78f003e,0xef8003f8,0x1f800,0x3e000f0,0xf07c03,0xe0f000f0,0x7fe0007,0xfe0000f0, +0xfffff0,0xfffff030,0xc03038e0,0x700ffc00,0x3ffff003,0xff0003ff,0,0xc03000, +0x78f003e,0xef0007fc,0xf000,0x7c000f0,0xf07c03,0xe0f000f0,0xf9f000f,0x9f0000f0, +0xfffff0,0xf001f030,0xfc301c7c,0xe007fc00,0x3ffff003,0xfe0001fe,0,0xc03000, +0x78f001f,0xff0007fc,0xf000,0x7c000f0,0xf0fc03,0xf0f000f0,0x1f0f801f,0xf8000f0, +0xfffff0,0xf000f030,0x7c300c3c,0xc003fc00,0x3ffff003,0xfc0000fc,0,0xc03000, +0x7df001f,0xff000ffe,0xf000,0xf8000f0,0xf0f801,0xf0f801f0,0x3e07c03e,0x7c000f0, +0xf000f0,0xf000f030,0x300000,0x1fc00,0x3,0xf8000000,0x3ffc0,0xfff000, +0x3de001f,0xff001fbf,0xf000,0x1f8000f0,0xf0f801,0xf0fc03f0,0x7c03e07c,0x3e000f0, +0xf000f0,0xf001f038,0x700000,0xfc00,0x3,0xf0000000,0x3ffc0,0xfff000, +0x3de001f,0xff001f1f,0xf000,0x1f0000ff,0xfff0ffff,0xf07fffe0,0xf801f0f8,0x1f000f0, +0xf000f0,0xfffff01c,0xe00000,0,0,0,0,0, +0x3fe001f,0xff003f1f,0x8000f000,0x3fff00ff,0xfff0ffff,0xf03fffc0,0xf000f0f0,0xf000f0, +0xf000f0,0xfffff00e,0x1c00000,0,0,0,0,0, +0x3fe001f,0xbf007e0f,0xc000f000,0x3fff00ff,0xfff0ffff,0xf01fff80,0xe00070e0,0x7000f0, +0xf000f0,0x7fffe007,0xff800000,0,0,0,0,0, +0x1fc000f,0xbe007e0f,0xc000f000,0x3fff00ff,0xfff0ffff,0xf00fff00,0xc00030c0,0x3000f0, +0xf000f0,0x3fffc003,0xff000000,0,0,0,0,0, +0x1fc000f,0x1e007c07,0xc000f000,0x3fff0000,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0xf00000,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0x3fc0000,0xc00000,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0x39c0000,0x1c00000,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0x70e0000,0x3800003,0xfc000000,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0x6060000,0x7000003,0xfc000000,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0x6060000,0xe003ff0,0x3c000000,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0x70e0000,0x1c003ff0,0x7c000000,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0x39c0000,0x38003c00,0xec000000,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0x3fc0000,0x70003c01,0xcc000000,0,0,0,0, +0,0,0,0xc00000,0,0,0,0, +0,0xf00000,0xe0003c03,0x8c000000,0,0,0,0, +0,0,0,0x1e00000,0,0,0,0, +0,0,0xc0003c07,0xc000000,0,0,0,0, +0x3f0fc03f,0xfc03f0f,0xc03f3f00,0x3f00000,0xf00003cf,0xc0000000,0,0, +0x3f0fc0,0,0xc0003c0e,0,0,0,0,0, +0x7f0fe07f,0xfe07f0f,0xe03f3f00,0x3300001,0xf80007cf,0xc0000000,0,0, +0x7f0fe0,0,0xc0003c0c,0,0,0,0,0, +0xff0c70e3,0xff0ff0f,0xf0c000c0,0xc000c003,0x9c000e03,0,0,0, +0xe30c70,0,0xc0003c00,0x30000000,0,0,0,0, +0xff0c30c3,0xff0ff0f,0xf0c000c0,0xc000c007,0xe000c03,0,0,0, +0xc30c30,0,0xe0003c00,0x30000000,0,0,0,0, +0xff0c30c3,0xff0ff0f,0xf0c000c0,0xc000c00e,0x7000c03,0,0x3,0x300000, +0xc30c30,0,0x70003c00,0x30000000,0,0,0,0, +0xff0c30c3,0xff0ff0f,0xf0c000c0,0xc000c01c,0x3800e03,0,0x7,0x300000, +0xc30c30,0,0x38003c00,0x30000000,0,0,0,0, +0xff0c30c3,0xff0ff0f,0xf000c000,0xc00038,0x1c007c3,0xc30fc,0xe,0x301c7c, +0x3cc30c30,0,0x1ff03c00,0x30000000,0,0,0,0, +0xff0c30c3,0xff0ff0f,0xf000c000,0xc00070,0xe003c3,0x1e30fc,0x1c,0x303cfc, +0x7cc30c30,0,0xff03c00,0x30000000,0,0,0,0, +0xff0c30c3,0xff0ff0f,0xf0c0c0c0,0xc0c0c0e0,0x700000,0x3f3030,0x38,0x3030c0, +0xe0c30c30,0,0x3fff,0xf0000000,0,0,0,0, +0xff0c30c3,0xff0ff0f,0xf0c0c0c0,0xc0c0c0c0,0x300000,0x333030,0x70,0x7030e0, +0xc0c30c30,0,0x3fff,0xf0000000,0,0,0,0, +0xff0c30c3,0xff0ff0f,0xf0c0c0c0,0xc0c0c0c0,0x3003cc,0x333030,0xe0,0xffe03c70, +0xc0c30c30,0,0x3fff,0xf0000000,0,0,0,0, +0xff0c30c3,0xff0ff0f,0xf0c0c0c0,0xc0c0c0c0,0x3007cc,0x333030,0xe0,0xffc03c38, +0xc0c30c30,0,0x3fff,0xf0000000,0,0,0,0, +0xff0ff0ff,0xff0ff0f,0xf000c000,0xff,0xff00e0c,0x3f3030,0x30003070,0x301c, +0xc0ff0ff0,0,0,0,0,0,0,0, +0xff0ff0ff,0xff0ff0f,0xf000c000,0xff,0xff00c0c,0x3f3830,0x30003038,0x300c, +0xe0ff0ff0,0,0,0,0,0,0,0, +0xc00030c0,0x30c000,0x30c000c0,0xc000c003,0xc000c0c,0x331f30,0x3000301c,0x3cfc, +0x7cc00030,0,0,0,0,0,0,0, +0xc00030c0,0x30c000,0x30c000c0,0xc000c003,0xc000c0e,0x330f30,0x3000300e,0x1cf8, +0x3cc00030,0,0,0,0,0,0,0, +0xc00030c0,0x30c000,0x30c000c0,0xc330c003,0xc000c07,0xc0000000,0x3ffff007,0, +0xc00030,0,0,0,0,0,0,0, +0xc00030c0,0x30c000,0x30c000c0,0xc3f0c003,0xc000c03,0xc0000000,0x3ffff003,0, +0xc00030,0,0,0,0,0,0,0, +0,0,0,0x1e00003,0xfc000000,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0xc00003,0xfc000000,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, -0,0,0x181800,0x18187c,0x1e3c3c00,0,0,0, -0x10388282,0x4410603c,0x24243c,0x242482,0x21424218,0x180000,0,0x100000, -0x28444444,0x44289042,0x42,0x80,0x1000038,0x181c7e3c,0x7c6c6c6c,0x6c2810dc, -0x28822828,0x28449052,0x5210525a,0x5a185aae,0xdd886878,0x3c1e7e00,0x40eaaeee,0x82822888, -0x44821010,0x1044f052,0x91109152,0x911091a4,0x89888878,0x7e1e3c3c,0x5eeaaeee,0x101044c8, -0x44822828,0x107c885a,0x5a185a52,0x521052b4,0x898e8e38,0x7e1c1800,0x12eaaeee,0x92928200, -0x82444444,0x10828842,0x42,0x80,0x18a8a18,0x18003c,0x1eeeeeee,0x1000eed0, -0xfe388282,0x1082f03c,0x24243c,0x242480,0x16e8e00,0,0x828282,0x82aa2890, -0,0,0x181800,0x181800,0,0,0,0x10389c, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, -0,0x40700,0,0,0,0,0,0, -0xdc,0x87300,0,0,0,0,0,0, -0xe8000090,0x1045fe,0x10380000,0,0,0,0,0, -0xa80000dc,0x6c1048fe,0x387c0000,0,0,0,0,0, -0xe8002284,0xaa1042fe,0x38fe0000,0,0,0,0,0, -0xae0042dc,0xaa0e42fe,0x7cfe0000,0,0,0,0,0, -0x429e00,0xaa007efe,0x7cfe0000,0,0,0,0,0, -0xe0424070,0xee0000fe,0xfe7c0000,0,0,0,0,0, -0x407e2040,0x820000fe,0xfe380000,0,0,0,0,0, -0x40000070,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, @@ -83,22 +973,6 @@ 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, -0xe0700000,0,0,0,0,0,0,0, -0x8010800a,0x200,0x100,0x2008000,0,0,0,0, -0x8010800a,0x703,0x100,0x4004000,0,0x4,0x1e00c01e,0x7f84000, -0x800a,0x1040884,0x80380100,0x8002000,0,0x8,0x21014021,0x104200, -0x8000,0x1041044,0x84440000,0x8002000,0x400000,0x8,0x42824040,0x80204200, -0x8000,0x1041004,0x88440000,0x10001008,0x400000,0x10,0x42804040,0x80404200, -0x8000,0x7ff1003,0x10440000,0x1000102a,0x400000,0x20,0x44804000,0x80804200, -0x8000,0x1040800,0x20440000,0x1000101c,0x400000,0x20,0x44804001,0x1004200, -0x8000,0x1040700,0x40780000,0x1000101c,0x7fc0001,0xf8000040,0x48804002,0x3e02200, -0x8000,0x1040080,0x80880000,0x1000102a,0x400000,0x80,0x48804004,0x101f80, -0x8000,0x1040041,0x18850000,0x10001008,0x400000,0x80,0x50804008,0x80200, -0,0x1040042,0x24820000,0x10001000,0x400000,0x100,0x50804010,0x80200, -0x80100000,0x7ff1044,0x24850000,0x8002000,0x400000,0x200,0x60804020,0x80200, -0x80108000,0x1040880,0x24888000,0x8002000,0xc00,0x180200,0x21004040,0x100200, -0xe0708000,0x1040700,0x18704000,0x4004000,0x800,0x180400,0x1e03f87f,0x87e00200, -0,0x1040200,0,0x2008000,0x1000,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, @@ -106,125 +980,19 @@ 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, -0x7f81f07f,0x81e01e00,0,0x1e,0xc03,0xe01f87c0,0x7f83f01f,0x4107f00, -0x40020800,0x82102100,0,0x21,0x1204,0x10200420,0x40040020,0x84100800, -0x40040001,0x4084080,0,0x40,0x80002104,0x10400410,0x40040040,0x4100800, -0x40040002,0x4084080,0x20,0x8040,0x81e02104,0x10400410,0x40040040,0x4100800, -0x40040002,0x2104080,0x80080040,0x4000,0x82104084,0x10400410,0x40040040,0x4100800, -0x7e05e004,0x1e04080,0x80,0x2000,0x84084087,0xe0400410,0x40040040,0x4100800, -0x1061004,0x2102180,0x100,0x1001,0x4c84084,0x10400410,0x7e07e04f,0x87f00800, -0x840808,0x4081e80,0x200,0x1f800806,0x5287f84,0x8400410,0x40040040,0x84100800, -0x840808,0x4080080,0x400,0x408,0x5284084,0x8400410,0x40040040,0x84100800, -0x840810,0x4080080,0x200,0x800,0x5284084,0x8400410,0x40040040,0x84100800, -0x40840810,0x4080080,0x100,0x1f801000,0x5284084,0x8400410,0x40040040,0x84100800, -0x21021010,0x2104100,0x80080,0x2008,0x4d04084,0x10200420,0x40040021,0x4100800, -0x1e01e010,0x1e03e00,0x80080040,0x4008,0x4087,0xe01f87c0,0x7f84001e,0x4107f00, -0,0,0x100020,0x8000,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x800, -0,0,0,0,0,0,0x1f800,0x1f81400, -0x7e041840,0x6304081,0xe07e01c0,0x3e01f8ff,0x84088088,0x8808808,0xffc10040,0x82200, -0x2042040,0x9486082,0x10410220,0x41020408,0x4088088,0x8808808,0x410020,0x84100, -0x2042040,0x9486084,0x8408410,0x40840008,0x4084108,0x8410808,0x810020,0x80000, -0x2044040,0x9485084,0x8408410,0x40840008,0x4084108,0x88220808,0x1010010,0x80000, -0x2048040,0x9485084,0x8408410,0x40840008,0x4084108,0x88140808,0x2010008,0x80000, -0x2070040,0x9484884,0x8410490,0x41020008,0x4084108,0x88080418,0x4010008,0x80000, -0x2070040,0x9484c84,0x87e0450,0x7e01f008,0x4084108,0x880803e8,0x8010004,0x80000, -0x2048040,0x8884484,0x8400430,0x41000808,0x4082209,0x48080008,0x10010002,0x80000, -0x2044040,0x8884284,0x8400410,0x40800408,0x4082209,0x48140008,0x20010002,0x80000, -0x2042040,0x8884284,0x8400408,0x40800408,0x4082209,0x48220008,0x40010001,0x80000, -0x2042040,0x8884184,0x8400400,0x40800408,0x4082209,0x48410808,0x80010000,0x80080000, -0x4041020,0x8084182,0x10400220,0x40840808,0x2101409,0x48808410,0x80010000,0x80080000, -0x7804081f,0x88084081,0xe04001c0,0x4083f008,0x1e00806,0x308083e0,0xffc10000,0x40080000, -0,0,0,0,0,0,0x1f800,0x1f80000, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, -0x8000,0,0,0,0,0,0,0, -0xc000,0x4000000,0x8000000,0x40000,0x4006,0,0,0, -0x6000,0x4000000,0x8000000,0x40000,0x4002,0,0,0, -0x2000,0x4000000,0x80001e0,0x40004,0x204002,0,0,0, -0,0x4000000,0x8000210,0x40000,0x4002,0,0,0, -0,0x4000000,0x8000408,0x40000,0x4002,0,0,0, -0x3e,0x5e01e01,0xe81e0400,0x1e85c00c,0xe04202,0x3b85e0,0x1e05e01e,0x85f03f00, -0x1,0x6102102,0x18210400,0x21862004,0x204402,0x444610,0x21061021,0x86084080, -0x1,0x4084084,0x8408400,0x40841004,0x204802,0x444408,0x40840840,0x84004000, -0x3d,0x4084004,0x84087e0,0x40841004,0x207002,0x444408,0x40840840,0x84003e00, -0x43,0x4084004,0x87f0400,0x40841004,0x205002,0x444408,0x40840840,0x84000100, -0x41,0x4084004,0x8400400,0x40841004,0x204802,0x404408,0x40840840,0x84000080, -0x41,0x4084084,0x8400400,0x40841004,0x204402,0x404408,0x40840840,0x84000080, -0x43,0x6102102,0x18208400,0x21841004,0x204201,0x404408,0x21061021,0x84004100, -0x3c,0x85e01e01,0xe81f0400,0x1e84100e,0x204100,0xf0404408,0x1e05e01e,0x84003e00, -0xfff00000,0,0x400,0x800000,0x200000,0,0x40000,0x80000000, -0,0,0x400,0x800000,0x400000,0,0x40000,0x80000000, -0,0,0x400,0x41000000,0x1800000,0,0x40000,0xc0000000, -0,0,0x800,0x3e000000,0,0,0x40000,0x80000000, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, -0x40000000,0,0x70,0x4038000,0,0,0,0, -0x40000000,0,0x80,0x4004000,0,0,0,0, -0x40000000,0,0x80,0x4004000,0,0,0,0, -0x40000000,0,0x80,0x4004000,0xc03,0xf0804804,0xc0c0c07f,0x1f00000, -0x40000000,0,0x80,0x4004000,0xffc1e07,0xf8c0cc0c,0xe1c1e0ff,0x82080000, -0x7e040840,0x48084104,0x87f8100,0x4002038,0x4ffc1e0e,0x1c618618,0x618330c1,0x84040000, -0x40040840,0x48084104,0x8010100,0x4002044,0x4c0c330c,0xc330330,0x330330c1,0x84842880, -0x40040820,0x88882204,0x8020600,0x4001842,0x4c0c330c,0xc1e01e0,0x3f0618c3,0x84844840, -0x40040820,0x88881404,0x8040100,0x4002041,0x8c0c618c,0xc0c00c0,0x1e0618ff,0x84848820, -0x40040811,0x8880804,0x8080100,0x4002000,0xc0c618c,0xc1e01e0,0xc0ffcff,0xc4844840, -0x40040811,0x8881404,0x8100080,0x4004000,0xc0c618c,0xc330330,0xc0ffcc0,0xc4e42680, -0x40040811,0x9482204,0x8200080,0x4004000,0xc0cc0ce,0x1c618618,0xc0c0cc0,0xc4040000, -0x2002100a,0xa284102,0x18400080,0x4004000,0xffcffc7,0xf8c0cc0c,0xc0c0cff,0xc2080000, -0x1e01e004,0x4104101,0xe87f8080,0x4004000,0xffcffc3,0xf0804804,0xc0c0c7f,0x81f00000, -0,0,0x8000070,0x38000,0,0,0,0, -0,0,0x8000000,0,0,0,0,0, -0,0x4,0x10000000,0,0,0,0,0, -0,0x3,0xe0000000,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0x4004000,0x400,0x40000000,0,0,0,0,0, -0xa00a01f,0xa00,0xa03f81fc,0x3fc3fc0e,0x1c00,0,0,0, -0x11011020,0x80001101,0x10404202,0x4024021e,0x1e00,0,0,0x800, -0x40,0x40000000,0x404202,0x4024023e,0xe01f07,0xfc1f87f8,0x73873873,0x87701400, -0x8028846,0x42680602,0x68400002,0x7e,0x1f01f87,0xfc000400,0xf2493cf3,0xc8088080, -0x8048448,0x44840804,0x845381ba,0x1100d07e,0x3f81f87,0xfc000400,0xf2493cf3,0xc8088080, -0x8088248,0x48820808,0x82510212,0x1101107e,0x7fc1f83,0xf81f84fc,0xf2493cf3,0xc0800800, -0x8048448,0x44840804,0x84510212,0x11c11c3e,0x7fc1f01,0xf0000084,0xf2493cf3,0xc8888880, -0x6026848,0x42880802,0x88510212,0x1141141e,0x7fc1e00,0xe0000084,0xf2493cf3,0xc8888880, -0x40,0x40000000,0x4d0212,0xdc11c0e,0x1c00,0x1f80fc,0xf3cf3cf3,0xc0800000, -0x11011020,0x80001101,0x10400002,0,0,0,0x80480480,0x48088080, -0xa00a01f,0xa00,0xa0400002,0,0,0,0x80480480,0x48089480, -0x4004000,0x400,0x40000000,0,0,0,0,0x800, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0x8,0,0,0,0,0, -0,0,0x10,0x1e00000,0,0,0,0, -0,0,0x20,0x7c600000,0,0,0,0, -0,0,0x40,0x60a0000c,0x3f00000,0,0,0, -0,0,0x80,0x612ffc1e,0x7f80000,0,0,0, -0xc01b800,0,0x738080,0x620ffc1e,0xffc0000,0,0,0, -0x12021000,0,0x924080,0x604ffc3f,0xffc0000,0,0,0, -0x21021000,0x1040,0x924040,0x604ffc3f,0xffc0000,0,0,0, -0x40819024,0xe0002042,0x6692403c,0x604ffc7f,0x8ffc0000,0,0,0, -0x80400054,0x40004044,0x88924000,0x7fcffc7f,0x8ffc0000,0,0,0, -0x8041a054,0x40008f86,0x48924000,0x7fcffc7f,0x8ffc0000,0,0,0, -0xf3c22074,0x44044004,0x28f3c000,0xffcff,0xcffc0000,0,0,0, -0x12022053,0x44042002,0xc6804000,0xffcff,0xc7f80000,0,0,0, -0x12021800,0x7fc1000,0x804000,0xffcff,0xc3f00000,0,0,0, -0x1e000000,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, diff --git a/vg_render.c b/vg_render.c index a1fc499..477d470 100644 --- a/vg_render.c +++ b/vg_render.c @@ -1,11 +1,45 @@ #include "vg_render.h" -#include "shaders/blit.h" + +#ifdef VG_3D #include "shaders/blitblur.h" +#endif -struct vg_postprocess vg_postprocess = +static struct vg_shader _shader_blit = { + .name = "[vg] blit texture", + .vs = { + .orig_file = NULL, + .static_src = + "layout (location=0) in vec2 a_co;" + "" + "uniform vec2 uInverseRatio;" + "out vec2 aUv;" + "" + "void main(){" + "gl_Position = vec4(a_co*2.0-1.0,0.0,1.0);" + "aUv = a_co * uInverseRatio;" + "}", + }, + .fs = { + .orig_file = NULL, + .static_src = + "uniform sampler2D uTexMain;" + "out vec4 FragColor;" + "" + "in vec2 aUv;" + "" + "void main(){" + "FragColor = texture( uTexMain, aUv );" + "}" + } +}; + +struct vg_postprocess _vg_postprocess = +{ +#ifdef VG_3D .blur_effect = 1, .blur_strength = 0.3f, +#endif }; struct vg_render _vg_render = @@ -21,28 +55,26 @@ static void vg_async_postprocess_init( void *payload, u32 size ) 0.00f,0.00f, 1.00f,0.00f, 1.00f,1.00f, }; - glGenVertexArrays( 1, &vg_postprocess.quad_vao ); - glGenBuffers( 1, &vg_postprocess.quad_vbo ); - glBindVertexArray( vg_postprocess.quad_vao ); - glBindBuffer( GL_ARRAY_BUFFER, vg_postprocess.quad_vbo ); + glGenVertexArrays( 1, &_vg_postprocess.quad_vao ); + glGenBuffers( 1, &_vg_postprocess.quad_vbo ); + glBindVertexArray( _vg_postprocess.quad_vao ); + glBindBuffer( GL_ARRAY_BUFFER, _vg_postprocess.quad_vbo ); glBufferData( GL_ARRAY_BUFFER, sizeof(quad), quad, GL_STATIC_DRAW ); - glBindVertexArray( vg_postprocess.quad_vao ); + glBindVertexArray( _vg_postprocess.quad_vao ); glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, sizeof(f32)*2, (void*)0 ); glEnableVertexAttribArray( 0 ); + vg_compile_shader( &_shader_blit ); } void vg_render_init(void) { vg_async_call( vg_async_postprocess_init, NULL, 0 ); - vg_console_reg_var( "render_scale", &_vg_render.scale, - k_var_dtype_f32, VG_VAR_PERSISTENT ); + vg_console_reg_var( "render_scale", &_vg_render.scale, k_var_dtype_f32, VG_VAR_PERSISTENT ); #ifdef VG_3D - vg_console_reg_var( "blur_strength", &vg_postprocess.blur_strength, - k_var_dtype_f32, 0 ); - vg_console_reg_var( "blur_effect", &vg_postprocess.blur_effect, - k_var_dtype_i32, VG_VAR_PERSISTENT ); + vg_console_reg_var( "blur_strength", &_vg_postprocess.blur_strength, k_var_dtype_f32, 0 ); + vg_console_reg_var( "blur_effect", &_vg_postprocess.blur_effect, k_var_dtype_i32, VG_VAR_PERSISTENT ); void *alloc = vg_mem.rtmemory; @@ -130,7 +162,7 @@ void vg_render_init(void) void vg_render_fullscreen_quad(void) { - glBindVertexArray( vg_postprocess.quad_vao ); + glBindVertexArray( _vg_postprocess.quad_vao ); glDrawArrays( GL_TRIANGLES, 0, 6 ); } @@ -143,27 +175,29 @@ void vg_postprocess_to_screen( vg_framebuffer *fb ) glBindFramebuffer( GL_FRAMEBUFFER, 0 ); glViewport( 0,0, vg.window_x, vg.window_y ); - glDisable(GL_BLEND); + glEnable(GL_BLEND); glDisable(GL_DEPTH_TEST); + glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA); + glBlendEquation(GL_FUNC_ADD); v2f inverse; vg_framebuffer_inverse_ratio( fb, inverse ); #ifdef VG_3D - if( vg_postprocess.blur_effect ) + if( _vg_postprocess.blur_effect ) { shader_blitblur_use(); shader_blitblur_uTexMain( 0 ); shader_blitblur_uTexMotion( 1 ); f32 s = vg.time_frame_delta*60.0; - shader_blitblur_uBlurStrength( vg_postprocess.blur_strength / s ); + shader_blitblur_uBlurStrength( _vg_postprocess.blur_strength / s ); shader_blitblur_uInverseRatio( inverse ); inverse[0] -= 0.0001f; inverse[1] -= 0.0001f; shader_blitblur_uClampUv( inverse ); - shader_blitblur_uOverrideDir( vg_postprocess.motion_blur_override ); + shader_blitblur_uOverrideDir( _vg_postprocess.motion_blur_override ); vg_framebuffer_bind_texture( fb, 0, 0 ); vg_framebuffer_bind_texture( fb, 1, 1 ); @@ -171,9 +205,9 @@ void vg_postprocess_to_screen( vg_framebuffer *fb ) else #endif { - shader_blit_use(); - shader_blit_uTexMain( 0 ); - shader_blit_uInverseRatio( inverse ); + glUseProgram( _shader_blit.id ); + glUniform1i( glGetUniformLocation( _shader_blit.id, "uTexMain" ), 0 ); + glUniform2fv( glGetUniformLocation( _shader_blit.id, "uInverseRatio" ), 1, vg_ui.bg_inverse_ratio ); vg_framebuffer_bind_texture( fb, 0, 0 ); } diff --git a/vg_render.h b/vg_render.h index 9e9db99..8f401ea 100644 --- a/vg_render.h +++ b/vg_render.h @@ -13,7 +13,7 @@ struct vg_postprocess v2f motion_blur_override; #endif } -extern vg_postprocess; +extern _vg_postprocess; struct vg_render { diff --git a/vg_ui/filebrowser.c b/vg_ui/filebrowser.c new file mode 100644 index 0000000..399a522 --- /dev/null +++ b/vg_ui/filebrowser.c @@ -0,0 +1,397 @@ +#include "vg/vg_ui/filebrowser.h" + +void vg_filebrowser_init( struct vg_filebrowser *browser ) +{ + browser->open_result = k_dir_open_none; + browser->view_top_entry = NULL; + browser->whole_list = NULL; + browser->selected_entry = NULL; + browser->current_path[0] = '\0'; + browser->entry_count = 0; + browser->view_top_index = 0; + browser->slider_value = 0.0f; + browser->mode = k_filebrowser_mode_pick_file; + browser->filter = 0; +} + +void filebrowser_textbox_callback( ui_context *ctx, char *buffer, u32 len, void *userdata ) +{ + struct vg_filebrowser *browser = userdata; + vg_filebrowser_free_entries( browser ); + vg_filebrowser_populate( browser ); +} + +enum filebrowser_action vg_filebrowser_ui( ui_context *ctx, ui_rect root_rect, struct vg_filebrowser *browser ) +{ + enum filebrowser_action result_action = k_filebrowser_action_none; + + ui_rect panel; + rect_copy( root_rect, panel ); + ui_rect_pad( panel, (ui_px[2]){8,8} ); + + ui_rect top_bar, box_refresh, box_up, bottom_bar; + ui_standard_widget( ctx, panel, top_bar, 1 ); + + ui_px height = ui_standard_widget_height( ctx, 1 ); + ui_split( panel, k_ui_axis_h, -height, ctx->padding, panel, bottom_bar ); + + ui_split( top_bar, k_ui_axis_v, 24, 1, box_refresh, top_bar ); + ui_split( top_bar, k_ui_axis_v, 24, 1, box_up, top_bar ); + + struct ui_textbox_callbacks callbacks = + { + .enter = filebrowser_textbox_callback, + .up = NULL, + .down = NULL, + .change = NULL, + .escape = NULL, + .userdata = browser + }; + + ctx->text_encoding = k_ui_text_encoding_utf8; + ui_textbox( ctx, top_bar, NULL, browser->current_path, sizeof(browser->current_path)-1, 1, 0, &callbacks ); + ctx->text_encoding = k_ui_text_encoding_ascii_vg_extended; + + ctx->font = &vgf_default_large; + if( ui_button_text( ctx, box_refresh, "\xb6", 1 ) == k_ui_button_click ) + { + vg_filebrowser_free_entries( browser ); + vg_filebrowser_populate( browser ); + } + + if( ui_button_text( ctx, box_up, "\xb8", 1 ) == k_ui_button_click ) + { + vg_str str = + { + .buffer = browser->current_path, + .i = strlen( browser->current_path ), + .len = sizeof(browser->current_path)-1 + }; + + char *sep = vg_strch( &str, '/' ); + if( sep ) + { + sep[0] = '\0'; + vg_filebrowser_free_entries( browser ); + vg_filebrowser_populate( browser ); + } + } + ctx->font = &vgf_default_small; + + if( browser->open_result == k_dir_open_none ) + { + ui_text( ctx, panel, "...", 1, k_ui_align_middle_center, 0 ); + } + else if( browser->open_result == k_dir_open_ok ) + { + ui_rect list_panel, scrollbar; + ui_split( panel, k_ui_axis_v, -16, 8, list_panel, scrollbar ); + u32 max_view = (list_panel[3]-2) / 24; + + /* scrollbar */ + f32 t; + enum ui_button_state state = ui_slider_base( ctx, scrollbar, k_ui_axis_v, 0, + browser->entry_count+1, &browser->slider_value, &t ); + enum ui_button_state mask_using = k_ui_button_holding_inside | + k_ui_button_holding_outside | + k_ui_button_click; + if( state & mask_using ) + { + u32 target = browser->slider_value, + index = browser->view_top_index; + + while( index != target ) + { + struct vg_filebrowser_entry *new_top; + if( index < target ) + { + new_top = browser->view_top_entry->prev; + index ++; + } + else + { + new_top = browser->view_top_entry->next; + index --; + } + + if( new_top ) + { + browser->view_top_entry = new_top; + browser->view_top_index = index; + } + else break; + } + } + + ui_fill( ctx, scrollbar, ui_colour( ctx, k_ui_bg ) ); + ui_outline( ctx, scrollbar, -1, ui_colour(ctx, k_ui_bg+2), 0 ); + + ui_rect bar; + rect_copy( scrollbar, bar ); + bar[3] = (f32)scrollbar[3] * vg_minf(((f32)max_view / (f32)(browser->entry_count+1)), 1.0f); + bar[1] = scrollbar[1] + (f32)scrollbar[3] * ((f32)browser->view_top_index / (f32)(browser->entry_count+1)); + + ui_rect bar_top; + rect_copy( bar, bar_top ); + bar_top[3] = 1; + + ui_clip( scrollbar, bar, bar ); + ui_fill( ctx, bar, ui_colour( ctx, k_ui_bg+1 ) ); + ui_fill( ctx, bar_top, ui_colour( ctx, k_ui_fg ) ); + + /* entries */ + ui_fill( ctx, list_panel, ui_colour( ctx, k_ui_bg+3 ) ); + ui_rect entry_box = { list_panel[0]+1, list_panel[1]+1, list_panel[2]-2, 24 }; + struct vg_filebrowser_entry *entry = browser->view_top_entry; + + bool reload_next_time = 0; + + for( u32 i=0; iselected_entry ) + { + ui_fill( ctx, entry_box, ui_colour( ctx, k_ui_bg ) ); + ui_outline( ctx, entry_box, -1, ui_colour( ctx, k_ui_orange ), 0 ); + } + else + { + enum ui_button_state click_state = k_ui_button_none; + click_state = ui_colourbutton( ctx, entry_box, k_ui_bg+2+(i&0x1), 0, 0 ); + + if( click_state == k_ui_button_click ) + { + if( entry->type == k_vg_entry_type_dir ) + { + u32 cur_len = strlen( browser->current_path ); + if( (cur_len + strlen( entry->name ) + 2) > sizeof(browser->current_path) ) + vg_fatal_error( "Max path size exceeded." ); + else + { + strcat( browser->current_path, "/" ); + strcat( browser->current_path, entry->name ); + reload_next_time = 1; + } + } + else + { + browser->selected_entry = entry; + } + } + else if( click_state != k_ui_button_none ) + { + text_colour = ui_colour( ctx, k_ui_bg ); + } + } + + ui_rect icon_box, label_box; + ui_split( entry_box, k_ui_axis_v, 24, 0, icon_box, label_box ); + + ctx->font = &vgf_default_large; + if( entry->type == k_vg_entry_type_dir ) + { + ui_text( ctx, icon_box, "\xb7", 1, k_ui_align_middle_center, 0 ); + } + else + { + if( entry->media_type != 0 ) + { + const struct + { + const char *icon_str; + enum ui_scheme_colour colour; + } + scheme[] = + { + [k_media_type_image] = { "\xb9", k_ui_green }, + [k_media_type_video] = { "\xba", k_ui_blue }, + [k_media_type_audio] = { "\xbb", k_ui_purple }, + [k_media_type_text ] = { "\xbc", k_ui_yellow } + }; + + ui_text( ctx, icon_box, scheme[entry->media_type].icon_str, 1, + k_ui_align_middle_center, ui_colour(ctx,scheme[entry->media_type].colour) ); + } + } + ctx->font = &vgf_default_small; + + ctx->text_encoding = k_ui_text_encoding_utf8; + ui_text( ctx, label_box, entry->name, 1, k_ui_align_middle_left, 0 ); + ctx->text_encoding = k_ui_text_encoding_ascii_vg_extended; + + entry_box[1] += entry_box[3]; + entry = entry->prev; + } + else + break; + } + + if( reload_next_time ) + { + vg_filebrowser_free_entries( browser ); + vg_filebrowser_populate( browser ); + } + + ui_rect ok_box, cancel_box; + ui_split( bottom_bar, k_ui_axis_v, -120, ctx->padding, bottom_bar, ok_box ); + ui_split( bottom_bar, k_ui_axis_v, -80, ctx->padding, bottom_bar, cancel_box ); + + if( ui_button_text( ctx, cancel_box, "Cancel", 1 ) == k_ui_button_click ) + { + result_action = k_filebrowser_action_escape; + } + + if( browser->selected_entry ) + { + if( ui_button_text( ctx, ok_box, "OK", 1 ) == k_ui_button_click ) + { + result_action = k_filebrowser_action_accept; + } + } + else + { + ui_fill( ctx, ok_box, ui_colour( ctx, k_ui_bg ) ); + ui_text( ctx, ok_box, "OK", 1, k_ui_align_middle_center, ui_colour( ctx, k_ui_bg+4 ) ); + } + } + else + { + ui_text( ctx, panel, dir_open_result_str[browser->open_result], 1, k_ui_align_middle_center, + ui_colour(ctx,k_ui_yellow) ); + } + + return result_action; +} + +void vg_filebrowser_free_entries( struct vg_filebrowser *browser ) +{ + struct vg_filebrowser_entry *entry = browser->whole_list; + + while( entry ) + { + struct vg_filebrowser_entry *prev = entry->prev; + + free( entry ); + entry = prev; + } + + browser->whole_list = NULL; + browser->view_top_entry = NULL; + browser->selected_entry = NULL; + browser->entry_count = 0; + browser->view_top_index = 0; + browser->slider_value = 0.0f; +} + +void vg_filebrowser_populate( struct vg_filebrowser *browser ) +{ + VG_ASSERT( browser->whole_list == NULL ); + + vg_dir dir; + browser->open_result = vg_dir_open( &dir, browser->current_path ); + browser->entry_count = 0; + browser->view_top_index = 0; + browser->slider_value = 0.0f; + + struct vg_filebrowser_entry *folder_list_head = NULL, + *folder_list_tail = NULL, + *file_list_head = NULL; + + if( browser->open_result != k_dir_open_ok ) + return; + + while( vg_dir_next_entry( &dir ) ) + { + enum vg_entry_type type = vg_dir_entry_type( &dir ); + if( type == k_vg_entry_type_unknown ) + continue; + + const char *entry_name = vg_dir_entry_name( &dir ); + + enum vg_media_type media_type = k_media_type_none; + if( type == k_vg_entry_type_file ) + { + const char *ch = entry_name, *ext = NULL; + while( *ch ) + { + if( *ch == '.' ) + ext = (ch+1); + + ch ++; + } + + if( ext ) + { + if( !strcmp( ext, "jpg" ) || !strcmp( ext, "jpeg" ) || !strcmp( ext, "png" ) || !strcmp( ext, "tga" ) || + !strcmp( ext, "bmp" ) ) + { + media_type = k_media_type_image; + } + else if( !strcmp( ext, "mp4" ) || !strcmp( ext, "mkv" ) || !strcmp( ext, "mov" ) ) + { + media_type = k_media_type_video; + } + else if( !strcmp( ext, "opus" ) || !strcmp( ext, "ogg" ) || !strcmp( ext, "mp3" ) || !strcmp( ext, "wav" ) ) + { + media_type = k_media_type_audio; + } + else if( !strcmp( ext, "txt" ) || !strcmp( ext, "conf" ) || !strcmp( ext, "cfg" ) || !strcmp( ext, "c" ) || + !strcmp( ext, "h" ) || !strcmp( ext, "py" ) || !strcmp( ext, "sh" ) || !strcmp( ext, "gitignore" )) + { + media_type = k_media_type_text; + } + } + + if( browser->filter ) + { + if( !((0x1 << media_type) & browser->filter) ) + continue; + } + } + + u32 len = strlen( entry_name ); + struct vg_filebrowser_entry *entry = malloc( sizeof(struct vg_filebrowser_entry) + len + 1 ); + entry->next = NULL; + entry->type = type; + entry->media_type = media_type; + strcpy( entry->name, entry_name ); + + if( type == k_vg_entry_type_dir ) + { + entry->prev = folder_list_head; + if( folder_list_head ) + folder_list_head->next = entry; + else + folder_list_tail = entry; + folder_list_head = entry; + } + else if( type == k_vg_entry_type_file ) + { + entry->prev = file_list_head; + if( file_list_head ) + file_list_head->next = entry; + file_list_head = entry; + } + + browser->entry_count ++; + } + vg_dir_close( &dir ); + + if( folder_list_head ) + { + browser->whole_list = folder_list_head; + folder_list_tail->prev = file_list_head; + + if( file_list_head ) + file_list_head->next = folder_list_tail; + } + else + { + browser->whole_list = file_list_head; + } + + browser->view_top_entry = browser->whole_list; +} diff --git a/vg_ui/filebrowser.h b/vg_ui/filebrowser.h new file mode 100644 index 0000000..ef552d5 --- /dev/null +++ b/vg_ui/filebrowser.h @@ -0,0 +1,51 @@ +#pragma once +#include "vg/vg_ui/imgui.h" + +struct vg_filebrowser_entry +{ + struct vg_filebrowser_entry *prev, *next; + + enum vg_entry_type type; + enum vg_media_type + { + k_media_type_none = 0, + k_media_type_image = 1, + k_media_type_video = 2, + k_media_type_audio = 3, + k_media_type_text = 4 + } + media_type; + + char name[]; +}; + +enum filebrowser_action +{ + k_filebrowser_action_none, + k_filebrowser_action_escape, + k_filebrowser_action_accept +}; + +struct vg_filebrowser +{ + char current_path[ 4096 ]; + enum dir_open_result open_result; + + struct vg_filebrowser_entry *whole_list, *view_top_entry, *selected_entry; + u32 entry_count, view_top_index; + f32 slider_value; + + enum filebrowser_mode + { + k_filebrowser_mode_pick_folder, + k_filebrowser_mode_pick_file, + } + mode; + + u32 filter; +}; + +void vg_filebrowser_init( struct vg_filebrowser *browser ); +enum filebrowser_action vg_filebrowser_ui( ui_context *ctx, ui_rect root_rect, struct vg_filebrowser *browser ); +void vg_filebrowser_populate( struct vg_filebrowser *browser ); +void vg_filebrowser_free_entries( struct vg_filebrowser *browser ); diff --git a/vg_ui/imgui.c b/vg_ui/imgui.c index dbcbe5e..ab0915b 100644 --- a/vg_ui/imgui.c +++ b/vg_ui/imgui.c @@ -19,6 +19,7 @@ void ui_init( ui_context *ctx, ctx->max_indices = indices_max; ctx->cur_indice = 0; ctx->indice_start = 0; + ctx->text_encoding = k_ui_text_encoding_ascii_vg_extended; if( !verts_buf || !indices_buf ) exit(0); @@ -345,7 +346,7 @@ ui_px ui_text_line_width( ui_context *ctx, const char *str ) if( c == 'm' ) break; } - + if( c == 0 ) break; else continue; } @@ -447,7 +448,8 @@ u32 ui_ntext( ui_context *ctx, ui_px glow_text = 0; ui_rect text_cursor; - if( colour == 0 ) colour = ui_colour(ctx, k_ui_fg ); + if( colour == 0 ) + colour = ui_colour( ctx, k_ui_fg ); colour &= 0x00ffffff; @@ -471,8 +473,28 @@ u32 ui_ntext( ui_context *ctx, text_cursor[1] += (rect[3]-height)/2; } + u32 utf8_counter = 0; + while( (c = *(_c ++)) ) { + if( ctx->text_encoding == k_ui_text_encoding_utf8 ) + { + if( utf8_counter ) + { + c = 0xbe; + utf8_counter --; + } + else + { + if ( (c & 0xe0) == 0xc0 ) utf8_counter = 1; + else if( (c & 0xf0) == 0xe0 ) utf8_counter = 2; + else if( (c & 0xf8) == 0xf0 ) utf8_counter = 3; + + if( utf8_counter ) + c = 0xbd; + } + } + if( printed_chars >= len ) { printed_chars = 0; @@ -557,6 +579,12 @@ u32 ui_ntext( ui_context *ctx, _c ++; continue; } + else if( c == '\x07' ) + { + glow_text = 0; + colour = ui_colour( ctx, k_ui_fg ) & 0x00ffffff; + continue; + } else if( c == '\t' ) { text_cursor[0] += ctx->font->sx*scale*4; @@ -606,12 +634,10 @@ ui_px ui_standard_widget_height( ui_context *ctx, ui_px count ) return (count * ctx->font->sy + 18) * ctx->scale; } -void ui_standard_widget( ui_context *ctx, - ui_rect inout_panel, ui_rect out_rect, ui_px count ) +void ui_standard_widget( ui_context *ctx, ui_rect inout_panel, ui_rect out_rect, ui_px count ) { ui_px height = ui_standard_widget_height( ctx, count ); - ui_split( inout_panel, k_ui_axis_h, height, ctx->padding, - out_rect, inout_panel ); + ui_split( inout_panel, k_ui_axis_h, height, ctx->padding, out_rect, inout_panel ); } void ui_info( ui_context *ctx, ui_rect inout_panel, const char *text ) @@ -636,7 +662,7 @@ void ui_defocus_all( ui_context *ctx ) { ctx->stop_text_input(); if( ctx->textbox.callbacks.escape ) - ctx->textbox.callbacks.escape( ctx ); + ctx->textbox.callbacks.escape( ctx, ctx->textbox.callbacks.userdata ); } ctx->focused_control_id = NULL; @@ -697,8 +723,7 @@ enum ui_button_state ui_colourbutton( ui_context *ctx, ui_rect rect, u32 col_base = ctx->scheme[ colour ], col_highlight = ctx->scheme[ hi_colour? hi_colour: k_ui_fg ], - col_hover = ctx->scheme[ hover_colour? hover_colour: - colour + k_ui_brighter ]; + col_hover = ctx->scheme[ hover_colour? hover_colour: colour + k_ui_brighter ]; if( state == k_ui_button_click ) { @@ -975,19 +1000,18 @@ static void ui_enum_post( ui_context *ctx ) * ----------------------------------------------------------------------------- */ -enum ui_button_state ui_slider_base( ui_context *ctx, - ui_rect box, f32 min, f32 max, f32 *value, f32 *out_t ) +enum ui_button_state ui_slider_base( ui_context *ctx, ui_rect box, enum ui_axis axis, + f32 min, f32 max, f32 *value, f32 *out_t ) { - enum ui_button_state mask_using = - k_ui_button_holding_inside | - k_ui_button_holding_outside | - k_ui_button_click, + enum ui_button_state mask_using = k_ui_button_holding_inside | + k_ui_button_holding_outside | + k_ui_button_click, state = ui_button_base( ctx, box ); f32 t; if( state & mask_using ) { - t = vg_clampf( (f32)(ctx->mouse[0] - box[0]) / (f32)( box[2] ), 0,1 ); + t = vg_clampf( (f32)(ctx->mouse[axis] - box[axis]) / (f32)( box[2+axis] ), 0,1 ); *value = vg_lerpf( min, max, t ); } else @@ -1018,14 +1042,11 @@ bool ui_slider_standard( ui_context *ctx, k_ui_button_holding_outside | k_ui_button_click, mask_brighter = mask_using | k_ui_button_hover, - state = ui_slider_base( ctx, box, min, max, value, &t ); + state = ui_slider_base( ctx, box, k_ui_axis_h, min, max, value, &t ); ui_rect line = { box[0], box[1], t * (f32)box[2], box[3] }; - ui_fill( ctx, line, - ui_colour(ctx,state&mask_brighter? k_ui_bg+4: k_ui_bg+2) ); - - ui_fill( ctx, (ui_rect){ box[0]+line[2], box[1], box[2]-line[2], box[3] }, - ui_colour(ctx, k_ui_bg ) ); + ui_fill( ctx, line, ui_colour(ctx,state&mask_brighter? k_ui_bg+4: k_ui_bg+2) ); + ui_fill( ctx, (ui_rect){ box[0]+line[2], box[1], box[2]-line[2], box[3] }, ui_colour(ctx, k_ui_bg ) ); ui_outline( ctx, box, 1, ui_colour(ctx,state? k_ui_fg+3: k_ui_bg+3), 0 ); ui_slider_text( ctx, box, NULL, *value ); @@ -1216,7 +1237,7 @@ static void _ui_textbox_change_callback( ui_context *ctx ) { if( ctx->textbox.callbacks.change ) { - ctx->textbox.callbacks.change( ctx, ctx->textbuf, ctx->textbox.len ); + ctx->textbox.callbacks.change( ctx, ctx->textbuf, ctx->textbox.len, ctx->textbox.callbacks.userdata ); /* we gave permission to modify the buffer in this callback so.. */ int len = strlen( ctx->textbuf ); @@ -1333,7 +1354,7 @@ void _ui_textbox_up( ui_context *ctx ) { if( ctx->textbox.callbacks.up ) { - ctx->textbox.callbacks.up( ctx, ctx->textbuf, ctx->textbox.len ); + ctx->textbox.callbacks.up( ctx, ctx->textbuf, ctx->textbox.len, ctx->textbox.callbacks.userdata ); } } } @@ -1397,7 +1418,7 @@ void _ui_textbox_down( ui_context *ctx ) { if( ctx->textbox.callbacks.down ) { - ctx->textbox.callbacks.down( ctx, ctx->textbuf, ctx->textbox.len ); + ctx->textbox.callbacks.down( ctx, ctx->textbuf, ctx->textbox.len, ctx->textbox.callbacks.userdata ); } } } @@ -1509,7 +1530,7 @@ void _ui_textbox_enter( ui_context *ctx ) ui_ignore_input_frames( ctx, 2 ); if( ctx->textbox.callbacks.enter ) - ctx->textbox.callbacks.enter( ctx, ctx->textbuf, ctx->textbox.len ); + ctx->textbox.callbacks.enter( ctx, ctx->textbuf, ctx->textbox.len, ctx->textbox.callbacks.userdata ); if( ctx->focused_control_type != k_ui_control_textbox ) return; @@ -1823,6 +1844,7 @@ int ui_textbox( ui_context *ctx, ui_rect inout_panel, const char *label, ctx->textbox.callbacks.down = NULL; ctx->textbox.callbacks.up = NULL; ctx->textbox.callbacks.enter = NULL; + ctx->textbox.callbacks.userdata = NULL; } ctx->start_text_input(); diff --git a/vg_ui/imgui.h b/vg_ui/imgui.h index a5504e8..8279b9b 100644 --- a/vg_ui/imgui.h +++ b/vg_ui/imgui.h @@ -142,11 +142,12 @@ struct ui_context struct ui_textbox_callbacks { - void (*enter)( ui_context *ctx, char *, u32 ), - (*up)( ui_context *ctx, char *, u32 ), - (*down)( ui_context *ctx, char *, u32 ), - (*change)( ui_context *ctx, char *, u32 ), - (*escape)( ui_context *ctx ); + void (*enter)( ui_context *ctx, char *, u32, void * ), + (*up)( ui_context *ctx, char *, u32, void * ), + (*down)( ui_context *ctx, char *, u32, void * ), + (*change)( ui_context *ctx, char *, u32, void * ), + (*escape)( ui_context *ctx, void * ); + void *userdata; } callbacks; } @@ -201,6 +202,13 @@ struct ui_context } cursor; + enum ui_text_encoding + { + k_ui_text_encoding_ascii_vg_extended, + k_ui_text_encoding_utf8 + } + text_encoding; + ui_px widget_height, scale, padding; void (*render_batch)(ui_context *ctx, ui_batch *batch, @@ -247,10 +255,8 @@ void ui_outline( ui_context *ctx, ui_rect rect, ui_px thickness, u32 colour, u32 /* rect controls */ void rect_copy( ui_rect a, ui_rect b ); -void ui_split( ui_rect rect, enum ui_axis other, ui_px width, ui_px gap, - ui_rect l, ui_rect r ); -void ui_split_ratio( ui_rect rect, enum ui_axis dir, float ratio, - ui_px gap, ui_rect l, ui_rect r ); +void ui_split( ui_rect rect, enum ui_axis other, ui_px width, ui_px gap, ui_rect l, ui_rect r ); +void ui_split_ratio( ui_rect rect, enum ui_axis dir, float ratio, ui_px gap, ui_rect l, ui_rect r ); void ui_rect_pad( ui_rect rect, ui_px pad[2] ); int ui_clip( ui_rect parent, ui_rect child, ui_rect clipped ); int ui_inside_rect( ui_rect rect, ui_px co[2] ); @@ -327,7 +333,7 @@ void ui_enum( ui_context *ctx, ui_rect inout_panel, const char *str_label, enum ui_button_state ui_slider_base( ui_context *ctx, - ui_rect box, f32 min, f32 max, f32 *value, f32 *out_t ); + ui_rect box, enum ui_axis axis, f32 min, f32 max, f32 *value, f32 *out_t ); void ui_slider_text( ui_context *ctx, ui_rect box, const char *format, f32 value ); bool ui_slider_standard( ui_context *ctx, -- 2.25.1