From 2f4dc166eed4da5c9e8f3174a2c745f5a4a72d89 Mon Sep 17 00:00:00 2001 From: huaqo-games Date: Mon, 17 Mar 2025 19:28:12 +0100 Subject: [PATCH] big refactor --- Makefile | 7 +- bin/game | Bin 142424 -> 927144 bytes bin/game.dSYM/Contents/Resources/DWARF/game | Bin 38996 -> 261368 bytes scripts/camera.h | 15 - scripts/main.c | 230 - scripts/physics.h | 20 - scripts/tilesprite.h | 30 - shaders/vignette.fs | 19 + {scripts => src/engine}/animation.h | 6 +- src/engine/camera.h | 29 + src/engine/gui.h | 29 + {scripts => src/engine}/input.h | 24 +- src/engine/musicmanager.h | 23 + {scripts => src/engine}/object.h | 15 +- src/engine/physics.h | 33 + src/engine/screen.h | 10 + src/engine/settings.h | 10 + src/engine/shader.h | 40 + {scripts => src/engine}/sprite.h | 2 - {scripts => src/engine}/vector.h | 3 - src/game/IDEAS.md | 8 + src/game/bee.h | 72 + src/game/floor.h | 44 + src/game/flowers.h | 29 + src/game/game.h | 94 + src/game/hive.h | 19 + src/game/logo.h | 110 + src/game/menu.h | 27 + src/game/player.h | 48 + src/include/raygui.h | 5928 +++++++++++++++++++ src/main.c | 55 + 31 files changed, 6657 insertions(+), 322 deletions(-) delete mode 100644 scripts/camera.h delete mode 100644 scripts/main.c delete mode 100644 scripts/physics.h delete mode 100644 scripts/tilesprite.h create mode 100644 shaders/vignette.fs rename {scripts => src/engine}/animation.h (89%) create mode 100644 src/engine/camera.h create mode 100644 src/engine/gui.h rename {scripts => src/engine}/input.h (57%) create mode 100644 src/engine/musicmanager.h rename {scripts => src/engine}/object.h (89%) create mode 100644 src/engine/physics.h create mode 100644 src/engine/screen.h create mode 100644 src/engine/settings.h create mode 100644 src/engine/shader.h rename {scripts => src/engine}/sprite.h (96%) rename {scripts => src/engine}/vector.h (88%) create mode 100644 src/game/IDEAS.md create mode 100644 src/game/bee.h create mode 100644 src/game/floor.h create mode 100644 src/game/flowers.h create mode 100644 src/game/game.h create mode 100644 src/game/hive.h create mode 100644 src/game/logo.h create mode 100644 src/game/menu.h create mode 100644 src/game/player.h create mode 100644 src/include/raygui.h create mode 100644 src/main.c diff --git a/Makefile b/Makefile index 491de50..b2a0f90 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,13 @@ COMPILER = clang -C_FLAGS = -std=c99 -g -Wall -Werror -Wpedantic -Wconversion -Wshadow -Wstrict-prototypes -fsanitize=address,undefined -O0 +C_FLAGS = -std=c99 -g -Wall -Werror -Wpedantic -Wconversion -Wshadow -Wstrict-prototypes -fsanitize=address,undefined -O0 -Iinclude +SUPPRESSED_FLAGS = -Wno-conversion -Wno-sign-conversion -Wno-unused-variable -Wno-unused-but-set-variable RAYLIB_FLAGS = $(shell pkg-config --libs --cflags raylib) -SRC = scripts/main.c +SRC = src/main.c TARGET = bin/game build: $(TARGET) $(TARGET): $(SRC) - $(COMPILER) $(FLAGS) $(RAYLIB_FLAGS) $(SRC) -o $(TARGET) + $(COMPILER) $(C_FLAGS) $(RAYLIB_FLAGS) $(SRC) -o $(TARGET) $(SUPPRESSED_FLAGS) clean: rm -f $(TARGET) diff --git a/bin/game b/bin/game index 7d8148c970e57670bb9506416067a1d662e1a2ec..f7edb638613e2478763103d43e507919acf6de53 100755 GIT binary patch literal 927144 zcmeFae|%KcnLmDKCcl9oQG*5z5H&!sL9vY`wqa%h0Rl#iZLnyQnILf{fkcCiE3Pp> z8!dFPm)h9kHb7ish%H*W8yUJu5w?-iZMIFjbU*Ai1=`XC+t_AzF+(eS-p~0lb8_d* zjQ!Z}>-GI3yc}=tdCq-5KhATW^YfnjZHw(XgX@>CyV-Ef@jO+1R ziC4pFRn_{>TP`^2BKr5beHs`763)`x|(;(7LPJR_MS z(0y#Y&(%NSuYVY3tZBd_5qSGKo>LgmgL|uvs;pI28+=tYjowWgc&Zg|-zyw%WfrH? zy+Z+jHGRr0s}CQCgH=^6bA8HHReVp`{oI@3ugs5~BDeHsaZi}?cNPAws(Pd$Tnf?g zzAPODc&c3Fj?d#K|5a6OYIqoRqj6JJ&FAXZN67c(f8p|pVm0Vq#pAU_qLDmSKbffS zK7lt!JVN)e%9ZN>e}wE7=3^LBx!sO3>wzF@QVYMAHj~&@RS$a~_lBS6MQ9fsfO{!L(`aiN2l{Nx|c-~&K3Sk;BE9bZK&U{d9x^o zF#XYu9Pbap_;jz919HkDVh>eSRRbmb&#JHIQI6-lF`P%$S6V?*sa!X0YN!w2PtT z-a{S_grPcq9e%#HX~xSafH}XJX8hqM!=Pw)FMjmz8xWL!RIg?r&u*5g|KHcnOf%-H z0*GwsxX!_kyl~OyHa9NX=&xS%@RJ)K#y$O`_L1b+`?ZX<#`jjAK6I)%<7an$>dnPS zn}Z*RgtOSEv%kr9j^qau@^EGP;Y$DJLqEcK^iLCO9`Pl8h{obtB9&&YeNn@sk1z5y zY}!!WxZw$Q)98JYWD`Grm;bSk-Ifn&{ndDg{Uf{w@C)HFscgog`=8wW_=Zi3*7&O% zy^T*UDxnbhL_=fU=0*2Bx}ko>ntT>CDP>W`hQ`f)v>J%m_kJ0t?u9uv2?p>acn|KSY{dh8H6gg?Q~Ne%Jj zzI(&t-i>-}MhfAsROM!=hT&{{)cd%PN`L)EZ~Y@xjgRNEhPYw#-&8&PWW9HjfBghU zpz`|o1e_IcEa)$N97xw32sYmOhu8S)H+-t0VdLfyJ0|s_+Y5O8@;0K)CpaS)KdL95uTC>k zV8I3Ap6WgQqcBJGt5VaAuYvjGzex*BT42%wlNOk?z@!BxEih?;NefI`VA2AU7MQfa zqy;7|Flm8F3rt#I(gKqfn6$v81tu*pX@N-#Oj=;l0+SY)w7{eVCM_^&fk_KYT42%w zlNOk?z@!BxEih?;NefI`VA2AU7MQfaqy;7|Flm8F3rt#I(gKqfn6$v81tu*pX@N-# zOj=;l0+SZ_|EC51+|YO6{ikdP-Y+)HE5#{4Igx05ImPA-(yz;Li{l@VTM@shrNA@`0H~-`C%)ME|hH)oeJ-?>QQ8}KH=p0ki_9N{KFrmG9 z7cf}9?Vsfs+i!@(*#1x?2GSTti(%$T499234*=)D_F3a8(^l<-yi2-@Z#WE@9wYuI zY(l2uhYlau{^0n6ROjvm(+o4^M&s&~tqbagf4(=XOUS(s^qIh&W6b$k7cghrj6f#t z_c>-APBGpnPcc&JMw0ht%{N-g7ubx&2a0DM#v-1T;V1TH0fXahUpEn>#b(;CY8f1VQ`(No z;CfL8S&{a0tc$cC(zrZ!^K=O3Gvg^U46|$dbpq>p4Hoi5l;>weS=i0DB^E1-2T&F> zm9n@F`dQ230hGnsIAyVR{2zhK%HsGs(Acm-lt+Tu6vFxRc*qWC&ToCn6TyuaWhBp?9MBaVhKe^6`}0N$(i~D?@{YJP~@A3%wJ~TO=0K`#$J> zm7@0yjo$Y`k9*_jeeZaN)EhF+p2l?^e%=W3_y-;lI^V02^IoBIlKH0|UWbRDM|^b| z=J2x|YhRp9=Ug*76U_Ge8dQgLfG=|lZVs2FRUJJeN0fyB3RgK=SLhpOx=neX3 zq~0VW>3zM>dxem7wMN#}8d;IX^-eWiQtuVW_ZakEDzJ(*Sj8GFq;b7d&3skwrO^9M zU`V~6(CGaH^u9BW-k{HtdXtQ#_l-jDMMBm)G_u~IkrioN?=;gP^qACC9QVzndt&}S=_@}PfAdd^3mn)ez0 z^8O~b-86GyNY)3&seW~#zscL;>mtj+fjpM>b3f9!uT3+r3t^!g&?h~x9euZu-sopW z=)D$whKe|ShKliPq~6=Xf3B0aM;JRiH&cv9{vZ2`+y?39g@2UefKLnEKX^Zp>z;1@ zpAZJ={%QE(HDTS4Yx;@D(NA=IDz@&R|2uG5KM|PZgDGcij}5;H-KQ(MJFXUWN7H9S zUo@i3kj8bNZoVevb|4>>zeDstw`=;0)UULbKhn4jrkh`rSganF!v-@H8)*8B$I)kW z+!x0N_l5o5a?R|&l}{YLafBW1l;=zW#BNy_TDmtl-l*@N)U31jc! zDtBam5ouiCtIUTa2GbWfYk?tS>zfIY{iZjU1xD7oWA_(9UnTVIf^0NyrZI6&66ONn z=fn5dSzmeNevQ2MYve^5FY6iRZ9?ARdytRX(iH-0wFYao1`BCi_ZjAmitZyT+`*Bh zz>vB>tI_>g=)N?L?x0^UbZ0VBT~9=;L|tEbTiD-+?-X+1rIGtCjoe7%HpnpF{f-zf z+=+ZH*kF;sxf*g*kB$oqz%?;Y_JwKm>0(ep#KMOS$~3L zoZ$=%&j#)cfHZEqYt4m1*5ThGAJvCn3anpg zuzsb%LK-jAYt8Fay?^Nnj{F=LvOc`&h}8Q{=<)M7dV_wA)SF~PeMqq-M6`j!|0d-A zDR^3K@KZcz^+lv{8)TXn4vCoXZ^%b+@ojl}Z~p{HBogyBb-)tC1CHT<@9YH>KWhLQc%Dj(kUh z@f{5Y(zw1e&6iYt3FkFnNPVjuk@{9a-`C>k3;J_H-(g_NHqetG+Q65E&aZ0ZeN`hb z(jf1Taq_O&Aa#Bj`KYX45?FgRSbH^CNMl$n*O?Egy1xY7zXA-Y`yxlA?u(%NSK{an z`U6sTl9AfLR81SWQ^@^1cv}7ac|2$JccgI}TyN$}8|*|rFKn<~U_GnBdRBvlG;V|I z%~`4qw!;Qb0Ylp0iapW>SKNV-r{dTE^qJBIB;)mny_XpS}?^LTi zb&5Q{)X4Ko$Ws?b9?*aNZP6ybi~Nu&G^ev(*zOVVv6jOlklk7iNaME4GXE8r)VCX6 zk9;(z^Ps@0(qL6-u#m>fbe0(qSS;>5h;q0e7_uB**XaE^^teBc-k|@J)SG0y5#_KN zxKs{%E#NSg%L$_6)Vnv?kHS#z!@B^M?oW|S0u1_lCz+Vcvf2EQ8R~osI#%(ai+$3%AOUO*+{+}9*|I}b0 zjq5(gd`Q)uaDEC5sr&01-Cu|9KaHb1=nqKUfk|^d!#^~FskCNpOP#Q0KC;&qkZb0{ zdtHbL+%{)_DD|9cZnL!v-X(QK`VL!5dFr&2Sqq*{n?-ndhK;YEOH=H6T-fz(jZNOx z*aT_ZCUec1s!fhV*V_$q*&jn-`XZ2joUHD{6275-(WBD!G^;x3apnjSTAX?kj8!eCi9TMV)5xk=>9w~q@T{y z=spj+JRe7Q&<{%8Nk)`K$^!Tj<|ch}6kmE)$o&_r$8sCoWPV=S;920Cu)#9|Ydhq( z+H*VdSnY{4ZiAc6$5b0U0~1+JwQ;U(UbgY^xolm8`9gz`eX~aP%^KN}#_e#k>6UhAKt8g=BLb^VgH@-&LK?Tj zE#@NC4v)YNRltyTcw1wKw_%5>ICcPip|k^JBs-+cnUg*IBK9#U^VI*3YqdW%T5d6I z(gtgV4ek*(xL;#~`!zN|8n;2NIeL)SEmj}yfeltDHh58EgBM|g6>)3;`hNnKwbzi* z__eW!*2GxZFBP&DYh*3f$ci*x_POS9A?xr`j7Sg!h^UOC?z3+tH zi+~}^{t=Ddk3jE5ar6fL8$$09$oQP-mr?AZ-(&bO8_W}O|7Gj8Zx}7}%x%&J^Mnm% z3#^+oHn>S+1Ej$QZ{UkZW`k;j*|5P(#Rhk3Y;Y%RFf)z~K(7-v7$zC1zcPcjt0_r5 z7UB~%<#!_w?dL>khIU<@L((%n56}|8q}xuOs;UWP#20lcgh1?f!3vVWwhE+DCgIH>8=q(d1x? zfxrKlWctREgDWfB2UoW58(Z0abZlkznK9o*k(Q0L$|0m9?Gn=3TLxFkG|G25IoO4= zOj!Us*_=UNb_&18-|XI=67-~tw2!c~P;B=nr36oi{fWlkwhSgfXAjayH-FN~p#OYw za6YvwSa0xOfV`qVH4I%+wodql1v zH(tPRadL2DT1xPF)Y*p9$-(E}!nFWbm(6S_#C0pKMY!7RW`mp3aV^31EnG_}-C;JA z;kp&qa!SXw0#{dp*|3h%ajnGFmS{FqQ#!6SxW0vJEu|-!4fVKg#kG;rac!dXWV2xl zrQ_O6_bFz>He6k}wo*E-J19NXY}iHjxbDXFEnM3uJq$zVZZ-@g2mj!h+WqKY zaxyY=-%}pC%mol5=Qms`K*L zH$j_*yldcVUvl;#ZD?#wrAWuKUvjn&PDT0}_}iCc{tZ0;8u;d#?4#lQUqCv1aSeQt z@~?q^GW=JNo{jWM;J}yHz(*;4>h}$ECtZJIm^T z-@AnW`ugt)_=i@o^$y)$T@Pq0fJbc?!vk(N_~e1lf<(jg=PCG=>5=%AWdVO)41CZQ z>F^VQp9=gO1;0##Uk3b~82F&g)ZwQBAN!O2SqgrU2EPdSSuyZIyYfwLA5X!GpcnQT zo{e&tYAm63w?BdAM>?}zW|$Y^2kTQ}jK=nIdoou9|6Abrkl#Se8pFLWePz&>p3K?= ze+HhX7&J4y2i%vjBBF2WMH+9@7MMqX!QxRm@@++YN)lLU8mu%87See8vcP;*Vo_{M zT7meM6!xv8uYEGko)Sn{tMYY?%O0b=%whh=;jJmW-DcON|f1YjlEB6?2R;DX1AJC zC9hM+Hv@h-`aPK+4*Od}yD1hXhuS2CGMdg*2}BN6ha^EYkZB z^zH_R)VorncO~@hj-xl|Z%Vxhw-9|C$Xc4}4Ad4)3-~(}9%W%3UDCJ8z@vln(6%?A zy=K8*D%+Yp3U;9eyAarWVqk;zf)!h~GrJY+d<}L!uy@D62JLApwrpc|DA?H=>}+7~ zh=C1SjllL4p^bsf)i$OYG(XZ=8`B!*g%~lhjcF|jt`j)kqPqj0rn>_^JePpB#(_P# z=Nyji2SBIxA}|AeSZaHkh5u~>t~Ks%D~XJ|NaMboZ_W}}zGmd3wx>y8ZP8$D(O@Bs z`*OaSBC*Kln&8Xzz>vOterja=J-;U4uje+6_8yW4^aNoKCL^^yVoy=mY9)@<2)S!D za@T6)MjE%lBJ*^&h&?sPM{%rDU{!0dsx??h<2G1izAdrH29>Zu1u&!ydNelZfek9+ z*Z}n7z-4iaWTZIOHkHS*G9hcZM%HqTtVrW}-)8>3l(h``D2}-WR*43yM1zGiuJ>)` z7bOs=3YxHi0-i2}W2K@_CZ;}!5%U3D%UMyrS(8yY#krio>74O{LZdOWJ z7bBkwdgltPJPlT!1`BBntL1icwZtO5bD?)OFr?lk8of)PcXk}TL0=*DX7)t)wcoc+rgyMGrcw}-O+V~CHT^9UM{7zS}b2QjFz)p{W4cg6CY#G0k6zoh5 zb|$csVqk+d&5AAK_vOT}-IFxfNx;6mJo*?4w2KGC7@-95+dVOUkAdb#I*Z?z!n`8l z_od~*3j(J)cTK=sxhCLgTNCi%SsBBJL1%G$ERpwhF9OdRw=XV_jN3@#KD^lc7BJYD zVGQ{wW?c|iqZ+JH4HnY44=*3JTN6PZV#*u_|I`$MvdE`w+TD= zNJffT2dD6uby~*(3s-#cLPJ}U8&K#5_)&X(HrzEsW;)4QlE2qu=HB$b522jQsGe+ z<`IfnW#G{fqke*xZov=5tUU^Lp$5AU*n47NgZ5sRXkUfwOJ&U3tzhSCu=9bvI|epr zXRO#VX6;b0vo+Y+z}^u98?+w?Y)=_t7HqEeIlm8@AL+c$8Riucvs#x2dj-z=qSXO! z)9Qfd;Oc-6&r-~?qu=>m&~KP7`hj9W8Q`$E)r@?szbUY` zXt1_uu#m?6_+#cqiA81B1V63^hVvHqsOs@7mtYp{^UZBSq?lvregO4y(R7}5qk8XNS$ z1{HB^0Qx*>1Co*TH`7FaQ^;Dbk+obSE7G{$cbbNjwG8=Ke^X$UXs}8&SV-e~-)a8- zRpCdZw;OsF0z>NEtkJs}dKbpg8}t$2vVJzn$oiW?@5Msa0*$N%8d;IX_5QedOv<_# z`B;BbVC8AB@-$dT<9dJGd|hIZ-nq~_8yHgW5{=#^&^tSh-k`rG^(NeM>Te=;v;Jlp z`jQHdf-sLz>@EP0OwL2!-&`KtYrzl2?sNq^M}wUM?DQDepgm{Bma#iY!OqlRX97DZ z1~zDqS+Qm8zMK%Ydy)n_3D}pH#prJ?3$7E`o(jZn*j$a>6`=W%&ik8TUJe=|Y!H-Tr3+ZUHb#%-i=A6{b400!@GA|LB-3an8L z)~E&xY21gGn3p@1x_e<6`kTOzK0J^b8Mg;kp})y(88vQ$ehIj&?v643=x?Tq{-%(1 zNF(czMpmS8y$j8sN?A`MAM0-ltU(Rdpau(RT<=2jsKlZ=HUPc*fg$y7)9Bp>z5C!`oEO!PNX(U(+sl!bYOVpbV=bi}Bipfy_X zLosWQf?cS=E(G?T7}%gaXvLN>Yqx@(uffg-_U;(ipe?gv%b2x8!OqrTX9Igj3~bOo zBCtJ`h*_|?8nYIF=0`g3Z-#kA#H`k3!MOrwebFlPH&>y*xe9YT;r`}q(D~e^@Vjlm zv&O7#%OYbI(wN^FpD=&@itKA5AH}RDfwe`0wMB!4H15NnFn=Pk$k&?S!}Y+BK72kU zGG?7$iM}ScWz?7j`j3FiVpcQbAMn)x_btcmzEdd^_CtDWq+Xvi?O3lqCgq{|-%6oZ zHJ-KFsG8wUIDg8EG_Kbt&6gxjCGt^xs}NZ0G+662SV-gcE;65!SY)FL*r*H`(ng&c z8+F1)WpQi-`sbyMNJffpttmXNmk3!)HL{j!WJMa+yU6^kl(hu;9)sS60;@=aRiwc} z8rOTNSt_we??ULk7#LFTdX3)o(0g$ly+JRLdJ}Fn;u~Zw#XB6eWhq#%S9ny0d4%Fy zC3xh;sLP-gTJS^hEl0sF)nJzbJ0}J@y_0dy<_y(J+@$HYG`H{}zTY8vRM0`tM790^c>&sRKysaw(o>MDP zx5M%6x1h85mL&Wx4S3eNo3<=6z9EhK@KW=ez+io{B;=#`cGJ;41BD5j}=Gi zjWi}J&bzCZvW_Aj#jJAz>%0c*yao$tTyLBCpu{4*&q43gz>syfPosAq^gbO&Z_w9D zy-7xjS%bi(xPCBsVq71Tdf`kv+J_|Np}2lh=rw?6tu`6}u4TWp7inBCyLpSmIf;B; z*yxzR>epcPYp{^U?QJ(RBo^7|7;JO|7}7?~8XGmkMn~e<2=sJmBf_mke1oi|csHuH zGCANsr0}Q@^XQUm)b-$Ti1W~nIYF~q@I&#fTfttZ!CnXK?ikphz4NkYw}tGX`N9qb zyG(;!2JDU)*r5H)iY?>Y9tFEdgIxsdJu$FB>lN6Zdc-%_T#au5(ELbe@vSY)3%)mT zjk>Kk_-%nxUAZFQJ-7n#ZAHL`XXTjlbcZaZ=cxC!~)h!Jf_Bo>BX7pg$yR z;UgJozEHgDbYh8(?f+qMzDdZvMI-kXjoe7%Hb^iROSzknkK%m2z-rWBHEOVs#%+*b z&X!nYgL>GY1{l%?r;;M${Hc(EtR)&*k;e5-GJB+~Zsc=8?*f5UsKF}KU?Gj`on*c&u}JR%=$#J?sdtS= z?;7ZxA4hM{_e#A9w+XQuva}wYjBV)_O<>*7kKEK8TdV%%j&hc}s?Z{*K=`V#|r*mGQa-j22KFqZGMM*h=~{{oj^^<(*t zf(Nv%kZ)|i(pNa|4%_6I2J;v&k%!Kb(_(@~n7C7(3y{&5`J+Scvc@f4V|ogQKWGnOEI?r zgZbDg*|$MG@H>x3PABqOz7 zO^Lky>Jzda)5v;EBP-Il-l^s?DQh3{QTugBVD)IQdNf!_<9er>w@WP2`w;Z*28PtT zQlobz^zM$MH|QUcdXtRQesuuXW!&y7OPn}P>5zJ*nOF}V%#rfYIAxE}s~yi;eWM+? zR^LDx*DKBZ(>~!Fdywxw*l4%FYSUn~X|RyS?LEaDmRMw?-LTOPU`QKfYiyJa8|{c= zBhY^hT-L^ujM&fM+XmdN#$i;cEPy{4GQ1u@?1^`#ltSy-@Lpm z;NKEi_e1X=fc7IP3+V{VP`lWuV2^6BM}gfK0~@p+E4FMGYZdGv4fYVQYhz%8w%3X+ z+r?@Hdq9Id0PN}**q}Wpu*n`1+QoIkmny-->X()7NWVlH_ob=kr-8|0);i>)cClPw zRcNp(G+0REK0eiSODrn0a`mvWt>jypgv5_)@fpbdcTKFCV% z?s{4iSi86!bU$dU9ViL&ge@kvizV*hCnZ+vvR)sap?1+l&u`<;d+HN-yI5!s`isI? zzHJ)$w?Y1*$TADHi=a^(cB|mY?rA=xzn6ahzpA=&Gfh1x|M z>4S8}Z*f?M2zxAc2ZMWgonN26Jm4)`j(yn613o+}_rtsgI%^m6gkR(X&+23O(8(J6 zkj8y%n)%PbU_O?IeAF)H2&`NUR;~sMY23%AnFk~m`B)BoEDIRYo<$ma7QvobaeNH) zSA-pWBqOzp8Nj7^to(^*8G19MUg>NeYmbzN+J`iuS2~`x+9;jjPF$Zr8rLh`+$?d@ zkdN9>yTD4)U?pj=kjCvj-SkK-vXLD&x`eZ0q>U~+Lh<;7tcRD21O7{~&$aP@{*bg0 z$w+PJ7;vc#9i4d2pm)qA^qS7v(EFr3WTOlG3>^O`p0(O&)D`JRNaK24W#&no3&{5v zY;;awo!4NU*I*%y+xseWrowp#2$`tUVW)p*HlG zg1t+Fy$jgKVqk;z8!NVKLysuf%^K`xU>}Kr4cdSeTehKx6zqBpc0I5U#lQybO@U1| zp3sJN3tu`29#+3R=!*19q`{YP=EDs0^T1^BtsD8M4ebzEof@o84HnWEmXTpTCb6i@ zI$S~j9$-knEOJEpWf64V!*!0@hJwCH=3-g36 zCbpq%uHZ(Am0R5F!!y)|K1$E;=FfZ59lQx3QG55G z;K}6M;R@R%O@o;ROyr5$hJr?zB~p)e*o0(HFAlY#w~;b%?OXHk|DyaMm9z z4tPh41D^b40Uw@~ZD=m&tPR~F{Gu6nRv&AIPS!RQY23#$%y+&ad~6HyQ5)JQu$nYj zO&TnuaUZ+d{11smKGx{MnglSUj}6%)eQd~$es3Hf1N~>fW$}h&q&BqA&c~M3Le?6M ztTh^0k;e7D+WeN3wHo=TU91pT>oi#FG+0REdS7Gikyxa61@tZhhSa-Lqjx9tE{mf# z=xtJOl9AfQ65vwbp>5*XgWeLU*EOu~uv5xI?P8J8%Z+EPzTpP0)i;pF^}5!4SmG2R zpBFYN5Lks8tU?VI(zv~^HSd#HWTOJuC?6QoMl~86)xbviacl(o-O@&c+lhHp$ja8h zO6-^;Rd`f{d34FPt^z!ABkOahtpm+v!4I`{*$TE>gY5=(b_{IL@~qght;|9`{$G`^d&wtPBBiVaGTbCsKBMm&PzLw^S^fjb$U&}Oq z08G}_B_SWRb(i@WF@C!S%dWvf8uztKvqxf)Ph56l9@Pl@+C^Jr9J=VjJZkJSVmzQ9 z5_)^O5!a!+53;hhZpg;kx&Y{Y&{%9A3-g36Cbo5B&fvEt){v{$hi9m*`zLz7gFo-- zw~2XF1M{e1EZ=F3{HG!R1unnZXA8A;pi#TDPw-^&op*+9a!iAH44B9hwXFk=<@q{zHVT@Wka8upQX1_eBT6pnu!=K zGfjJX%iw&0v4G_2h$2^~B3Gv(SBC`?XEVED&#Rdh_$ZWIo!7d=wMg1y+X!t3!i@G#(SLHy@K&x4A>p!8S+7SHq35kaHGV^cJ=!34D0{X z^N0BJo+J?yTM-j?gt2^C8u_yz|BlEq3&ljxSpQ$}Wb(DbhSDZ>4W=EK$P+atg2wv) zQjb2^gk(<&$Hd!6AEYyW&0!rP?9q&K$OMkJ-G%+VF7$gvJiLLQV~`6v>;E?izt{pi ztB-AgPS!pi(zuUhneXfoKGuYMx5LNk1y-X5t5Ji6H11{- zxD)cRQ%>xSh~s0R{|vaS{|_1MIA_zt#>Wdx8_s7L14;Cxf^&0GYU@wk=4cZ+7n`}IxJ;)RFD<3?pbv54^Syzz;--Hj` zXd1v|?Li*$QG1XhuyQq6xf(2_F|3vw&EJ1rV38l>psr>CL)O)zu+E{nS_GZ5xXw}A z1JFl+OTOSaiP#6-eUO#U2N|r7{0Gqept1Ou8Ri-CJJ}v&I)lR!E7#fU!!y(#{EnVK z#-I138@!L4hV~#mj0L-d{5T|k4&+adEVEF102;;ap9`K$zBJfS+9XYbnFdVciP|23 zMwrK>9s{rm$)4^E^^w0x`XHV0vxjwvu!r3l{0D(k-RTT?dk_aJasDHorTL)Zq?Yo7 zpp$>7Kf}!}dd>6U{&rtr9v(rsF zQ*t)WCc1^rdqkd8)$;+kmV&)p)f%f)qrxPC!g zUlG^ui|cRL^~n^R0Z8(Yj{fYG!RP3FO>q_`&hvhU=_Gt;GxYdgvGEi7CgcCy!@tS6 zG6~;c^g07_kD-iXls?w31iLX_n&(oilLqyw-_!oLEY&P+FY z&rBER46g`(cbv}MCE66&hv+u?HszeT*~4!ud5}hVq@Pf}E{ZYxlkpA92|NPB)6v!l zeIupFN&(8+}_3S4&@HzoTlL z>pa^$@ip$h!*m8L`XcOHdYlz2eRWurD`bj@lV_2}W7}-AN8r%8yCc9_Kv;jJb7H>@ zY>ID8MmqDG`~zjU(!t+tXJxz6m-MIcGerz#d51k9LOUx{$`|R*5~p%2=L1i}^*h%zc=1 zWB1mxXY*{~vuAH>8QcwhJV;~pI1lrImyPh*vwY5n?fr!v5rdM#XU~F0&-gGmSBv?h zI?TcNG56!g7>?!?Z-ovU4;jHZZ`n*w4_)o1=ZF!!)s|px?86o3#%?@@bX%h7={JJE zccgZ2I%xzq;(XO_;(XO_BDUQ+m!Dm_&;@(op4tH40L~({!H<5Luo&?(khZ`uSK(aM zRXF!Fb@ngEQmZbrxSF<#@+2MtZH#CXYt#HP4fi-Zm8E@AK0k!#ukf@3I5YT}_Huu7 zUnB8I4Z!v|`*c3eJ`Kf~t#-t|mU3^uEpWzR>pu6)m&>akeWP)U!+62d?+VN%+9_M$ z+|sX?=PU^{J}%N-lztKEv;VH#KJ8nL^&;I%>6q_0xAdiQchhT)K9Rna(lOU^?w5PZ z&wVn`SS`}`Q+f~5_r6$O{grPuJ|xoLqIAq7oxAe2a`*0ijTIvOETtboy8T-j_lYzc z&TRBvpuAr#ul`AA<7$yUm(n|tUiG!|oWnhh%SF12()*CU^c&?lzxe0Ir6S#n^mDUc zEI)VZpBf8ATJ%$led2KkW z!#iXP6v464}Ii)AKf3}H0%{C zKO*n(Ea}^Wd%`B&2>%f73777PevtC_iRT?H<=ygLJl{#rlf6zN56YoKy+`9Y7x7@1T2JN!M+Vr&ZnydA8x6@=_kM zK{M{@IWKsTe{T`_nSH>oiSh%B%EN>5YNUI@LK@xI(>%+qaRETN-2ZRVh)A94mMjxDe`%mrvW{Ux@*)i0v2iF7vi z&?&|<-H5r?u~9ejSo#iLq;VN+CJfHUMx7Xg;CnXyb`1vRy&^D>#xR_AvrA&2ZSe!= zuQf;Z55T29gRcbhN6?jYr*F?td-`0VI1^{U8T9lxgQ-hcKl#a2v_0%w0_f|a-TrY3 zY-U5dy$yRu_X3adzKyFN&-n`6frWT3ZT8-Bv{z5&;n`H2&x|%?NvOQACImg-Fpk>I zdZDMpHD+M`5^25?rF^kI#qv8HX09f$^8(0gN5AMH+=py{ zycd3&xEMAFEJS{3j|E%#vmyQ=TO^nZ1%GJ^d|xw|`qoU-zs(4~13#*3Mf;8W+8su4 zm2Jv9BX{o2D#i7}yuDcq(YDp0Z;oH%f*Cuq{Ml^Ikd3RluKazbY*%PL zioP`<)2or!+sgd$4a1peep<-p=|lQ9c8=8G9MTu})c^6*e4iYjUe=6HFQbla;p5Y& zV|LL0{8izfgn7(~b0E<7w2869{JGhlA*0t%^MR7rsD{@lcs0i11^S@m1s=r9Gvw@@ zV>5ae%)mM2)!>1vuf_=aYVo(VzSj!dv?Q9nz>)nxnnU!jQ{?N@$kzw?*2R$z^njF) zY*8(2k*L_B9kwV}cpcR6ItX6nad?6LyyPWq(GFWA!WMI33paS+>MMaQN;S496}B*v z%q^-dN??mZMLuP2?1c0`Wo|60UlclnO;SFxgm_FTyt(X&fG9Zt7pb*E%=#{!`z>Jc?nSLA&EZJ2+R2{a;4j_n&&Ji_f{j8_dQ>s@9P~XzTt4n(_gG(-#HNLCHuEO$oUv^O*`_xB6$@*bojvb zO8m0M(KlMy<(PGtzV(i>E+D=g+t-bEA&;_N16k*q_loBaI35HowVULi`GR4z&+rM> z-gYrsO5Rz>%5*ex%pKyn?(Gka%V($JS!vJIA1v5;VEc9BJ26M%e|pVJbx%)yX~FwD z-x*2Xn{}Z0`ok%(aIT zGtiOGzjoP$jK%8?ue1w#@n;S%;QfM(1?XSMz9MYF^kFnB9dZGa(K~>@AA0ff%rT3l zjkiC*%4?(;u|V*beWKxF)B#I-dlqR7<7kd~_AA0C9G@LOKsfaMEzuvqcj?fd<$GLC z2pNW-aRx^4?JcVN(c=CY&8W9ejKd&0j|vpohg@&)y+y;Jk_XYf#u> zxWO49e;rv!woF|({NTj(w{r`fLCQ11Uyt5o{)2dat4Y=IBsujhat z^4Fs`n=eWm&*Eb__Kh;Dzv7!?5&nuaUcYZKKPE7`;IAWuL-WYeU*~E3bsqc`bI39M z74#h7lD`gDAwO`*U#0&I(;PE>ixb}=qu2$TvDkH%&+8*z-NL@bd6U!+-zFpfz3j(y+p*@*MA!!e%b*)?;|Vy+!$ zxaXRSLiVW&#rTbvM2tUPb+`-dN6grM{Km-G4qNk>lgsK#zT|QIv#8ruhezOlEVduN zVM1)D^6x^P33bJoXa1kvJmwrYPH|sfSGpKYsVgn>%&P_8Zb#*~d^V!4V68%1R~Cu7 zg1Yp9>k8^usII^#BI*k2N2snW`jB-6`1_$(3w!^3zWJ}hMzkLBm#&vE4Cj1|wPkzH z*Gv9dYb7l5AhHQR!< z1GeBQ^iloWY{9#2Hgi)eu3K^4LHBlZ(=J^sYz<^P)Wx z^P)TSK8bdGf#(VHJyXm@5au@6uMPI>aRog!#l7C@;@;}Y;@ZyPY@)aI68Xh&^kspT#=&34?R`@{$Y#`=BJco*VjsKWi=_vufT!mk`hF>}O<;LL$ z`tQFi>KttDDRK9b?@^s%b1qr1b+*RV+0x$@n5Xf4$ltPHmkdR&e2rZBkSimOT%ey) z}=4RXOy_wIk9dz`T zV(yE@vP(ud#$ML!PrZ!wg-fyfupZD`q+R==;|?X3;XMZbn8E|=r4eld)`a|Had?3K zfaC%Fh=&L7In0ssyyw7!V%d4j=Uu?x)>w7{GE)EMXr5WDmdSZ1-ltXM!~chruUR8sGvqrGM?TPlz@p3)pHp!pZsqdY~QM}eXI1p zTg}g^w%-QZZ&75r6gj^3UBX=OmN+&5{WC%)&t+$?4|3VydsG)ar?KA+`zL5`N8z8Z zyy!XY?4|d6$xm$t+5#$*dvn>P`i8QFsD*A82hE4)6$y4BfTN{k>|sOwgx3XeS+KiC65D2?L> zpr5etFi^Ik7~xiU?9%Yq1s?7=JV1Y4*y*}4{FU_RcHVFa77AIgdO zUr(mN_j_d+fsbO1Vi@~PJ(+k{y4w+8`@68#m5+392FAeVJBFU1k)9r@C(4EP)`!N= z=^D&*U?NXc+kr-ytEDew!WYP&Eo*5nBw=3<#>v&)#Q|nNtlLpcttC5Py{@{mnAxoc z_jTx(*6xPibV9zKVyq7ufsJT`Qn3d2MU1UCqMfE|9oh^(uDbo@^TqlG!#Kv$lIUVfPx30HM*gv~HH9QA(!Pbktg1yyaw%+v@ZPYHZy|S2t`f|#KIXFWH;|R8| zb{gAb8=8ZnF@_?C592|0FXx~z{$TgkIVg;mKdS7F9fR)b z9F#2~JO>3D8&{RP+qz@s-4dE!JW>&u_?}>&^*99!m+5^4-(q`!`ad4*nWOp|MEyKV@eF&)yrnkK-2p$X z2|k@V%VslX{1NoE;K}w1K@U%vcz3cJb~>oosam5`HFP={LnqL-A`VZLI+2~a6+5{# zm~LPqPgFaBMwst?N!Y#&`TO|#$^_jKjTvNz0Q8$p`W-`@BmHuPer?cikD_0kae%g6 z-NR-1nUsa}Yg6>g(dd^0d66foexQ+l-%~N+1GTxXKpk{|9|xEpqu)K@-PUXkuWazz z5rY?K z$+_ib*h2C+2_96wcrFDol-^CH^I5A13p9q+7z3-( z8C)x{y!EJerLMsGi%!IKjPpk!+XajZhO)=2jIGde@dY19i|L6!$VAKl;|8IuU2Do>u-W zUMF^_yfPK}b2T=}g-wtrs{Ei)J^P%%^qfLWBHL5h(VR(|h#eu zOD%o!dP|?YEJ~leT~irJyqBv+l~tOWiDSE z(biSas9rs_Bh=r+zFJqf{^MOWSw~LDHWBabP@brD6*R)EQ8DeXHQMvKBE-rjcdxh6 z-CJGn?pO!+`RBjrP#@FTu38?bd`*kC~6(W&9l z2_6G+cz}Lb@{l%YgAL?5OCNY(9>IsPFRisi*q~q7;Ao-wvTB24utAR^Uz0|@Cdk(l zM?TQ^O8LkJeZmH89T_$_sPL%K@TdWggK>C({)Ebd{Gb9hkn1d+3XgIPk8<$njKc%; zO34HG##QsOsXybZL_Mb1I1}%jr-`*$lmlDWX@|`_G&b*$es`ByqT0M2Hg8j8EzrnX z09o7O$O^h!$_iO%Y?89FtK4RT%=CUd){$4rbz~{)F37rDBkOMIA9tCvR9SaH)>cK< zOpUCWkhL|Ate~eTvZg}LIV2}+%j%$aV^{)x?nv^y8{*D0?Ow)`)aAou4dxmg*+OXxO{9LW~F38QA-x$keZqsUI>` za+$PkA86E0oslvTpLNb~+t;bV>;xwAL~Z*(Bg`KPOizU~$j&FU%>N!2dpv!I+yOcR zgWmmLg?EtWW2{(;z2^8e+Gcz)%b>aS|Gn~JKk%sU=!1+NthKOjyOhEPWr_{x3?l2; z5$6y2%VNk28jTB{Qf*MG*kFeSa|bYyC#nrVBg`6!N$Wt6eLniAs=j{cyHca?&CquT z>69G@LpIPzwxv=wD)T}`-&zf3EijQMs=lBRW}b?Px>s9| zz6*2+jjjGlV?*+7pq0LFM9WDO}>V0tju?ImBM_(6T5#bRt#AjVdO zVr*5!$5y|17G;HJ$T$5t;qsAkgvM4m&fvczFU2NLCU{W!;yE^_l)>keP7)Sq3@bAR zR;Dv}OkmME(fT5c(+V+8DrUwR_PeT3KISq3!*(e9>iSp&sK1O$-4r@*e(f6P= z6o0%m6FlQD#q+@UOU7-}XxxTpqKw-Dsp#9Y@f!N|q48QhWQ=i^&OYdjchF*w*Bn#B znGcB1iG3cVBcqnp`z%WS;%$Hk^^ooxbdU$eNE>n7-zGuf=` zCe_Lq?dF!jr%6Vnu`yaTZ0A)3U1i+_G}*4!t-~0t0yZzf596`g z8ZkzrF&V9!(3os1t~4g2F&f5XY>b9685^Tv+{M;SFh;t2E7nbNaeWKdJTZ2|xH0b7 z4P(ZrW49`-ljz58Z2e?4&KFsoE!I!)o*J#Iu=N(t&{$nFAM35gduz2=M?rjelFd06 z*bs|gA2}b{Y>%wV&2Ge^7-KKcC_W^Mx(1@#XC*D#jp=z z0oB2GL1*m_?B+R*^~b;BUcApq`%#%7_IXY#gC}U@(_WS5fTG7P4dyOj zB2QF3KqJgG0@I7Ju4gySP=zjNi+UZzY_kKl!MHrCZ9tiAiIA^e3SEMBT7fNp{!;{r(4eS^t9ci?$XUXRNOsOC02~9FVe* ze%*?GSQ}2U_RX;l_CeNSUr;frUSLhOE)!R|R=Ee|)2@_HiH27Rc(uo{C1~Wk-%xq& zQRL6pVCDl8d7_pNXoUHk!1SR1#mo%*2)ET(WSbwMy*er1ixWc+QV! zSR1xGte>=Fs9(7o`-mlvZ18|>e0YxaD=`Kqtd9~FXbel48;HPa#r(g(qO(3cjaaM1 z-p}eRS1)jT(Kqg;J{|Qf|Cjb9K^MZTMZc}KQH)KSP##;t@}gafEc?solW&P(JJ85> zON1;;Zj9|ib#O?7IRs4PiCP|@5$4SjQgqr!_L1h77e_hN$fn=!ZV9!~yW~98=aR*C{;uG(7siV_h5`pnu)UqaQrv++(@I zU^B>v`z5vHe#*PG6wcEV(tkz6szXX!MS0B?f}Mp{2bLJF}DVPpcuyb zRq61D48!ax1-4)|H zx=+D44r7NWsSoCFb_G|)IB(<)@bO>|taZKh%JxK@CvpwW6S?-l`^AYS#zZ)4EEi|B z-Z0Ma#2B2;7ui=#=ZV}nPUnK4zOwoK;YGYW=ioVduY4cQ1hFBO+gosEsbkjo_rZ6+ z1808V+>Zlv76abn9>Mr~KIC^}zQNtH$owAibm5t<;v4x{4#l56oMOA`v0|n4xATqt?^jb@htXEIpkvR-0yd+8$U|tof*ky2kP`E!Gr8X zXK!>LUw3!}@7pfKc^~x7^a7lXaKJHhJP-L+J-zy+)i}c>bk@i5nTLOeJl}L&$KHp} zL*8zj3$n^Kb;7wHrMRbaKkAh8!1y^K+)gXS`LJC$<3if5D|Gh9XAaBv!@G{J{g7vW zJTSiB@c`G|lWZ=NdOOx~zRBV9hW8_l*$Cs?k!{jGbRNoD{4&R78`5<=6Xn6*5$+N` z+;zO-@Bv4~xV7%c^4bU58t|q$w=Txpxn%fNoWoK4jl;uh;k&l0*cmOr<#RG?QP-Y! z?q>2}yqqKC?shyh{yWg5U-I&rx^rZO5nPD!vYyQ{@*>r9oON*z>dgl|>*8hQ{r!6o zGvwNpD4*e%mG}2w{E+YO1Ajks;&x9l|4Z0?c!l7rl+RhDAs^0bNHw=AxQ2V$2M6$!_PVcBTFM=n=GF*pzQ!AmCx|2$P3K*7`sv3rgKuLZVlfF9;jQxPZ$%= zv$#{p)so8UR*lpFXQfxuHpE#b(dyP2&^{;2j`2RagkivUWckW?nIXpLtURZqJn4KAoPRRm zd=i{%!el*~#?B}C(^eh}hH)ke#pJ)g%+Du59ejhe4LEaz_6AwwIobfk+d}iq6oa*! zct8IS6yH}s*5N7qJaCG^`?gn(zyH*yan{MFaHe@;O z^_++zaWChZv&Fr2t~tjM-lPACmcetdkq2q4?ae91w{Y!LfA~2Om+j<-%3O1Dcs~$m z^o%dNI9Qie9Nd^$9Nd&q9IQ_-#-1Q|u(sWfJ;9D3+ZWVf58i`0=Y~#PG3VUSjVtDy z8xB&s-E25S>A3dLy~AucLif1#;rbS?$0$9)Z0M(STu;({qS-J&_qYz?`WCLIC_Tw+ zI8Eue4$*zG*>KJt`~&Lpqv!3x2AoUrI?kn-Za0GWpg%H-_Pfkwm_Ndmol9}S9xOwD zso&+^3%KB&X1V?3LIG%{M&%lq{w$s^Udvx_~v#~9Qi;$A?2fTZWcD6 zdE8S8IIBb9abCmYJb2W{;Q{(Sl?U12)UxmxzeeFPsNpdP9yM`zfc~uHA?$46yA7fJ zJL|v$?_c>UVdrZ6ZMAc?u=CN6n2oBPD`DqyMZSX?`3^$9@;LH=UN7Y%JFgRVrg^ko zuyd)xqg}(J9Xv|o@BqC;<j-OOV*G_v~rL5?^^qAl_b)fB)T;7w^Jz{)6ry#aB;30-x*2M*PlEWGV~G zbV9U|zB0&^6DdbUFsARkBh+6G`Oo=cwAFkaIcnPox?AvOavl-!isr@o9lieZ3XfA79;d+L zd>kI2XGtEA-47m~{^D@kcnUnIZ9HuY`iAhgHD(WCj+C{H`DP+;LT%$|%qtBj@^xzD z>x6s*apVKtrpU+M*J^d}y?OnR>7+)clR~DW`R18sMW%kp)ThX_O(WAb$kZ1{CeZ&2 zxS@X8De!A8?xlW<3vJ1Sb69X59KQ1!@-JVLhG!Fa_Qc@{`Wup`EGL{VHb>6UcY+7{ zxcDAy5Z{80ET@CAoEDicsW$0`P1+UtN;LA7K)&`k@`3)Ml#klhPRuPrPAAplT-cyZ z;ZdOBQ2-uoad?2vXR{}_+Co<2KozpHIQe~ls& z*8OE%55-@a^R9`MDb#+0Ms2MjZO0N2E;T(*ua1Wp3Vfq0A<|JkuM$c+2hCu`Y>=q?RlDLyJ-B4 zGd28|jIb|U*6i)L?D{}w*d0}Qklk^PLa6;7Q+Qm^@VEdTV|;!!s=tB$s^lT;JYoDz z`{ro;eZdI&M)9|`FE@%k9PIl@x0$myK%=!Bh5 zDK_ZQ*q{eCI2FeRpx3B824Uw;S8pxs&D!q)g-1u2N2nd_0FQy_^Vrx|5cFH{L+y9J zg59RUZUc6I3~bQKt=O{t?o+T^HQ24d?u&s9+Fe#`*?#vZ*x1JwipR1~Lwm(~Vqk-I zv&4qIKWO{?zr$Bvd=SrJ{h7t_|1b8KT_xorf9rOJ>+y%!WA>+~lvn}3VtdS>L#X}U zW1vs1*z`l}F-uV8-=oO?A@-QPE9Cc_M%#+=@<9jIHpSUvb`a0`@eFHocZc;0`HLKX z?{)?|C66KSpz_6Yto;^y%w8fa&=^*nJ!W4KShUA1Vt*MhWc&S)O=-WkgyoC3rz~o` z+TsjW3*Jo5b0}lPRVVdz{)*@H6-piyv%$kNr0nmih91;5)*xor;%{rrt`#xcdAoTF za6vf;=1MLl)tH{U3-#CYZ<~z_AEKfik{xIK)=k3ky>|61d zwrX+O+z+4z}>o;J**mMOY*Xmsm@{}Vh}yDx3u zrtEtw0uSn|xncVfjqOXM?H8NsM@3xvV< zTh&2cdQRPMbv3QWB2Q?))dI2KYL&S9#r2EgdO%!%z^^GI%08^3Vp?C0`c3jO@Yn6b zns^pnW_bNOH?h~7m)KjKpV+&8abm9rYn9%1d$790&ep+)6Y!49fqa~oYZvR_DVVpi zvvu&5?fb@7W*^16H`c)qB2AIYHz4liy7wV*Z(aB9v4_{aSK@rGCm}!5C^piZuYZTK z?!5~#h-HdgN zGMCM)&&L&O-t|~BDZ`p~eF3gm^RCDGOxatw7UAl0nDuVD$F&4kta;a$;)*rz`ZBst zH0#T8b>UipE7rX0v3^$ON;2y!amAWu zn(V=Ptc4%MS~yz+M@(bu+%CS3&DO%V*zpdSVcv?h@LRDKz6SPZYu?EFC7gdZ6?+lZ zU@yX#us?y)>HNE$v?jj6FxO<`Jr2CzwWj^(*c!aY#h&{D(y^~$4bI1-=honSJeK~7 zk{{(9;`4o^w*yD!7dUHv!}+X9v`su$?^;{-dmlw zymx)>^4?;ceSy7(y)MLJHg3rZ>l4x6%5n$y3rsKJJSK7@)S*pB~2a<%aFjCHon<`gNhud`~*o zWd&cHn+F>^moOdQ#`lQw#NJ!*^TS5|B!ySBHK-(B22tC6(0}(gqFjNAerdpGw+9!X zpOJbd&^VXQEs$p{K!%l454$^fW`ljY&53VGO8VOH-b63aX)WaF$4#<1iyb60(&;RO zRO92>{!vGO_2;nW$vRV7|tc;w;`j9KmJRY>ljn!IxYZ5tb3i1@?9v#96_A9 z4$!})>YfPQM{V(SAB9}8bSFB~eTivPbw_$g_kPHXc;Y(`-7jc#zaVulG#gdj&qMbi zMfYPG-H$={p*XsOUa#u@e_4C~xVWzKz!$mA>>d-UPqj=iGDd9ELkwc9lQ)T;@FYKEKa%p7T47?96M0+Wkt1 z>;hM^H@g=N-(q*lec8w1S;k)Gk$oXR_5~yR2i*4<9OCoy$bQ+9{d9orr;+_~i0r`M zWy{We&T_v{sO+;LvI|_v{sH%sn(t%_v4eUnXE#edDaY@fqa_(f);7PiFPj`LQRBfi zyr1S>i6!Zac^Qpg`|;soYpzQ3o*ZV*m2b$ea_9dv`gvK;Am1l@O1!cEbJ5)Y&U{;7 zo;dA|(?^ZIguipG`PhFbzy^n~0q+!z{lH}G|NFn>#T{A4krLi}_GF0D85z@F048fc zls?XGppUbyxjBvJ@X4%;#=Ka10@+6bWFIlIKj7YJaERExftbs9U6gWi68CM zp$=pzj2|5uN8&-Z)8LRg)J`30v1C6HAo~eqZwZkdc!w>!#E<4p$le?xyTFy~54z)q zZ_50-(-WhgB6&PAa1X3A5L0XG_v?K~y}Mg!m)iV$V7>YnaqA2&iAC~#J90}-Q;+@{ z0`%9Q_#hvSxU0Wt<+AnYuh!CETY&!B&|htc{(!#*Ue!N?C;AN;r)CrSs|nGcz*P*2 z=Iu_IufJL^_PokIkRw&m-1U-eXAjVKVE@AW5xL9Rx=%XYh-?M-^Y&I5y+qwszPZil zwHBEh+o(tJBTkKHljpTf9LiZ6$Uc=gcS6U{%Dtmkq3`h-bI)o0a_^cKD`gLkm4exfU?N=^8l>p%dYKrPYs#pAdaeuJo}I@#(G8 z$4VmiF^%VN4KcBum^eU89BIoqd@nKaqk_xC#N|9L`Z?=k;u3Rd%OPW;!1rpJeoSP} zHneSJo_51Nn!v@cFT~vc8~lDuq}-2*Gw>{Zw5yS#XKi{uSK`JE4zbzQ1pOUL_VWR< zpGWp9A+iJCV#_Xh#lj|JUkH(1;7axq_rr$o8Tg^xmtD;V6Ave&DjxcEPv(SqH@NPV zy8rF}(z=}FJ&B8#(Sy|CaSzXa6IU-MSnJxlHm+VMb^p+OFELEoql@T%7954`(X5ss zvBf=Wz7gGDMEB<{-46%oei+`)hv**oBzXOJD(%tqCUid?qI-cW-EVPUGkjC#$J6ep zr?)Akw|lrNbZvVyh2FXg^p+@dhYc>%9Kj7WA{-iw`+l2ncLi8ta)gEol+nq9Bf7P5%gWsw4Xf(2MdsL5Xh3(O( z(aToV9zAVzQ;p2^tzLUn<=Moq6O?l{Op!WK?pA6X$=-tYsLVUBo$f`J!kE}=>PFms(%_If-9w%3wq!pSAp1FF z?+%e2c*>StVq(`OWbX=*UEoUgxcj??Z)_&#sQ9vv!n4G)4rK2PkiFB$Ug6do93p!M zvbR~XpA3-wB(k@K$PT>DmR;gm%O+%R36WjkO7;qO$nZT1Ka~5j4+_t;#Y5h{Uq9{) z@*eL7x5eAs+@SWOA>LDc9P}V<@qmYCziEqi)28r_^m_ixPi*h1w&4d}ix zK=+MC_qVuzWWEvIH=z4EOZS}ty6=Ryx)9w1|3mQlZL#D*wVTj=ZHVp#u5^Ek`zEdX z9-gOHE$Zb+M|3u@o&svN4f$_(o#)!rKh*R*bPkL?7ua76MIx7^6{@C0A~d_d8cS!0+`?& zHgXK2E8)E|AG;mV2jxm1vAhiH^bupdh{kicfqU!f6Z9n#ndEdLj+xq`bea&hKr zRXKCB>d9QJdNTK_p3J@S%*2^<<@xb)=3DR7XXeRT-ksLobn4oxa$cpQ*MdC=Uxnwl ztXVf;@0+h;-+VRu=4;qDU(3FE_QuE2J?jO&R-S#IEBoTh6*> zw(^|k`7+N1`Mt$``ilJKxhTKO+^4VdWIe#sOFW}n-KVd|ygN6RW4X|CTW`d25932Y z_ug$&=eDl9Z^JsX^>zQwJN0hiU3mBvcj2kCUk@_Ze~>i=vS#36{LC)jX72OA?+&sC zK5uAoi%ruj)FqQQ zbq3(<1SjtljT^uO=Q9T94Pp^zCM0Xyv;9-VkQ(;dSF_i?s(t-jKYQ(EeVy#LkF(!? z7yIqg?6;3of1jru{|w#VTD$oA7d{1TvtLry;HY!V#?jY=rLT?v**cJIVguQLNld)o z$R_$4xAax)ECAjqsxM%I^X&$wtTQ-AY?1RRSqDZvROeJ&YtnOALK8ivPg$}w2FTI~ zo>Ly(qU!;GUwg)~{WP%`+zDCdS;-j$CoLMa0W@l%LF^UTiqZgn!O#%Cp^>b#&LB7n z4aswdV>vm8U|pVj0)AAxz1#f{;4!gB)|;dUE&i7C>n|>uc4C?J7lR@E0sjq)Kef(t zuGCux*bh$w0Xz+8o)YhIM{J(@;i=c+>2d&1m*J^5geTx93{PTj+Op&vd+E`i?6ZvR zxU2T=H?t;G?uwpb|NbG1=1c(18E75~p$WX(&@^_Mvd&59fClx@=|m@80Xpe2c6yK7 zYU`vEowQl}jRx>H3V&@O`~iQ!@FzOy(7q~bLI==6vqi%?1HktM>kNRRzS`WDd!tQ5 ze02aFn0=PJEgJm+a`Yp|?hrYE|L7xDojZ>l(DCa=!$gByHfGoG&2zAZ7h^l-Q@@9_Ik4 zc(lYE+;#XV93Q#Px!}@nB;M=34Lp9kvBVtQVxE8JVo9dFa2>$KJ)2rnRiWi{h?jD9 zfb8*o-U zF7b&?oE_ll>wWHbY`$jUYsTX1L;znW;AvP>`c;+BOkn>>=oI?p zq_RKzT;J#ZlC9?n^nBXlt0jQ17Wg_H!WZz58NQ7DWj|*v^+ocmQ}8twz}J}OE79aW zZu4~tzD`Cv@ zKY*TlE&k>L_?v^j-VhxC{~>r){f9r5&rY%TTEB4V*7sfHBYhk8vfShv!mFl!=gDJKyw_L9U(M03JPkiL z8i2-bk49kL1?*!5`2Bpb!NT1WfV&6W4IAJF_Ad)@n|!g(!rd8wyA#}X8{h`^P$6!U zFV^N&xF?U7s3d*rT1a{oK`vD)>(x5u)#pKVF=qWHd^ z@cCxV`1ZA1bL^$--!VJ zPQc$x2!FueW%!e}XOVVbgmV$#wbeiOLyx8OaTde0MRO>C<`6WeLudjoF*MP&qS{nFa}Su zCZy0#tnu*dbf5djHcw;lG-~lw7r;{;JdK9%1pJ$ZC$ZBcb4K;p3H`0h5m-y{le)Y0 z*9=W#C)Qf{Il>Tf$(R@GE99=$bvhX~cDmpFl&uriO{51boh(Jx*R7>QCOr_M6X3@T zf2MB9co%oAD85*WP;76!XRG_&9-A-L7p%Dt^xho4ZE%J+fQKC1^E4(tHr`S5`cRI+$|g62KIWtuG?Z8 zcz@93Tum14p#a=N;BMLgH?V7kxJ}O0XyNV)z}*M##tm=-`;LtpefPt=pL4OcV9mb! z?mP{@z3PTW{dyXH8xKs{OXU(wHR>gWGZ&ySZgXL_fZuW#8S^X5hO`hN&MIKyDwohxhR>_2&%zt{hg z?B)N(54vhkqs+~}yj7hQdW|v1a^|!vXiNJUXOwyT4%$+=ySab1By;_Tk#ik?QgW_; zDVnQziFd9?a~*LFUo6R#AE&*!LGDeNT2HWClCk-A8e^UuX1@QmD08d2tZ>eM)w*-_ z4aep`ATm-WIaYd=zWtna=juE(b^P+?{A2m^0D!5y>^05@yTaYL3w%4zA7gguSS)uJ zJSWdbbN4dm|I|!0cQDg%RDfZz1CVTK@AAF2E9Ph=RG9P|VEAsP{ z`X}d^RzxH2_x`N(T>Oc}8wZ#(KLD(Pcfa>%TPPd%e)G-u{-Sg@Ftt9;v+uF4YGiwk zbBvu@sT1BkE|-4W%$ZUrCZjpEPV}rtr+Ai)Gc+F%}#Kb@?PFeoo$u-8onJ#ywUwuTIX_%0V=#(tv%F~srQb( z(fz1-4}HsdqQ%ZB^?7RFL(aFpU+C9&V1EuymG3Fq7w(6?cXsd@OGl$xN2j!o7$*$X zQB#197)w<0;qyGz-3m@q5gqYv>Xeo}Qtf`y$UYjNBg#BoR=YdRd!i%C(<9M*9IsY9 zt+}VesYXX58|Vnw3r0tZHahwhbcBtbf14+R*w*3vYE>6Fvs&G^@_S#Zp^kT@%StlN zEqPrY+5IWj>UsASr3a&dcdDe9W9m+or;bK*@~+&e(myOZ55KP{9aA#?gT#pa`o1D( zSnG^3bEgWi)xT54S#Hb7UJ7hdwTnMlAE>_9Hd3%cIPx1C_JTikRNLS}wfkmcgF#K# z_GikJts-x7vyS$Au@&X%{%GD-i?Iy&*V<~ajkUQO*b3NP##V~9_Gjoj*g@H+O!=Gg zz5QZ0<_&*Y+7;r%8ryUivCXu$O^;=p-c8zOPRX>^HoXD1nQP12X8I;=1O8Nx*7>nF zxxa06-W^~Y%9L#`yvgl0?}=?FPj_0jnGCSaB(~|?z&5}#;8d|j(azVSYkD5pq3$@u zYGW63?~N*Nhd%e-IAh*EFnmMB)l|FYIq_zZudjhihSw`|hJBLOyU39#{qW#fUHv@!VQELUZ_FTdHn&*)%xD>+|Gt(_tl z?fUP3PR=&FC!@}*YADSby{8uSw~@EF-~9z$CwXrj{McLEZ)>>8XJn6|s;8g%Qq85o ze4L|9`T0&=_8jM+JXfb#R6gTf|Q7+D`SBofi zF)nTR_TyxaWvBL=v=jK{E=Mo^)wpv;*R`6i9VaPM?fPZrY@MZcufIy zv5C4^y+K_Bwg6657Zq(CCutv?%DfGa*fxk2u|cJ_L4{?5%1zp!KEMW*0XC?&Y*2ZV zHUNLBLhJTIjr+9GZ7jeBlzFzg!>uy!i47<(b_VVllh>>=w#68B;TW)=djb1JV*^DS z8|?DhJMKF3awEH^M)?xOYR{_x0__u{%`Ud%aKB+hz8>P}k)CZ&RoI zI7+>fvu;%!T`a)In6xMBTNS=n4ZcP2QEzY8anw1_99_fS?Dy!;-2HMQd-r$m?uopa zah%%H>|Okh@HCVpajCw~LH z%FhMw4E>bL@ITXOij%}4`X2YMxg&lmVC-@V`_6mz zEjk7c{4<6=wCR(0If&c~f^Aiv^&4NR*=c+R-r`YmMskukyqLS#AB^ezq}qy!Gr{-q zk?(rB<7_0KJ2Jk$soZf~$+PA~vilW&RBPF$N#srTX)k^83B@L9fuCx;s+h#>%+=o9|ML z$;&t519Bdav$!X758qt>vn{)^ai)Rq;*4F;XZ(1wvNYe`U03z~Ymvm;+&5@`Dz>oh zUe@(TOWg7|CUQqAKb477_SCcSFPi%-(~R2}-aVS`(e^lJ*<*T>_81JX$8>-_xM!T0 zq2dDf{@$EDz@Iv&?Q!94?mM*n&e??Wr}QNCSo?#i$Ic`?>2V2DmZFS!f=z4PKYUWh zCUB^^gmF(7>4^Yb6TDLxCn!_6j@7zfGq|Kaj}s@xz~Q%r0rj+rdO8+TPl5j?cvYMb z9!*X|drbWDV)3$-58crI5xLX-oaV>(joUomP(E?nwinVT7^`3$aGhUNYQH#X`Nila z{h~g=FGk_Ju%6aieo=XoegXc}Nn?jQ-7gtCoX~zTj2#O7Vi=wZZAqE3<%K)l2P_=r z#5?x3c|OLx$~s)kovgz}nZlL0%WW{Y#4m>Mive&LzqpBcmU{3izd%kIr}f)5+KiKu zs}fUupEq&i!d-5e=4VrJ<4{1{nDOpaeX7^;kG@U%#{y$u+7|v8Kp*-m^pAx^K5on; zZZ2+sKhV~<1HKe_{K+6_;Iaf33iuHWtc?$7JE0S*;6I<L1;u+hp5IuL=UvF>D?B+0p&Lzm9Zb6-T?G=htLE5FAY6#GWS3Z>eIqco=SVVC?(b&w0N7 zIn0&u+Vc`xoJC#1Z>eP&YL+vYxVR(|uG zlJ{Bvg5pa=a=R?@x?VbUeY);?oo}S zlX=ho0_{%bJ>`7sPWCN-OP=qDdgTvAz49k@`KNXHSG@8^z8O{bJU{$DqH135;Vm)O z+XFjuL-wy88P@w(-x162M}22(?b*{;%30@x@0qrC_O^_Q<#ro0`#Ae5_OBZ&xn%Yi z0h77(S9*0@i=U>i?9byI-?1L&_+uG)r*Qnm#|cbue#^$$vp<)-@p!hsdw(vq{CKwa z`s3NdOOLPLkJ^!!$H;QV@Y=CI7o#3ZPLL9OhxX^3)&04h5pOR3CFrG>DO*A2fq2eY zsLD742c&MQKDHCr{SC^T=5lXtvZY+jf%dnRhtIo>DqVQ}b(71qp(~A_r`MkueJprx zl6O-r`=t$eF>-9D`xW?Av7uSxu*WDVQ}12a>2{d+#5R zCe1?%8s)T=PRowWgONxkiG9BNv$4+;OV1`-9^+|Km?z|AJpOTa|g4ve)NW zpUU^bYw}_h>qaczIs7*!T7#+7s)Hob*jY{k7bfg z(BUk;>+sv5&g853V)>7g|9022kvr1O0{iR{nbX{F#uxd{X?jeZ2O{U{DLW^2xed0R zp_{I>WT_93r5;%-Lu3K|twLGKz`G^#QKx#xnw&9JW_)g!8mIhyz7zj6GXJ{hx*B<7 zJ2E?;y(=$cSzgBHwTw;--gvk0>=aMd2KVnZZl~6=11d4zK4!>qTgN7$nNy& zcE1ietB+>TomaPb-<+f3)sF^spUX*uuNk_$(;;|nyW_@C(K+HWw&tn24~sW0cMGIza2*V8^-Pigb~db(`! zb2WgUtKeS_;RpCT4L{J3eA4M7mzh3=ZJBGom2sFWTZy3o<1jPZz46kkTh-WunrmO$ zy1DVv1;ww5wfjxKWN9CDv0%J(0pBp=b2E?LTt6H9sjK_ExclXM+y{&gT-oQ1oh+bF zP5+v-p2#Zc^{yPt9tb9lO{4YooInt@r5w zy-x?|oiZ;b-0MDTaERW)lRmeB-p}pJeP8QcwRz+y(&jzIcSp|e%e_Ee*Kr`?J|S}# zXY+WRo`5>lL!CMsQm26bf=#a`k<2R0hzfgvN;w8o*bd@aj`?wKMCWgNT`znySjKt4{+(>eEuC7srOI`gC-Y z_35=rX$RKEv7`I^IO5Oyyw;hIV@sVk7stS#8Zvd^o$fYczX4sJ`q6D+9P5Xt!Z=2m z7sndiucAlOk4=Lo-Iuq|x;WOiFZZ(6yTiK@!(L$Dd0Ju`woaZUPwUBl@60M4eRR#( z*lZ{7gxDAOuNpewmOM@ILOc2VPkH&m^W@s`)PYPnxnlg;_#MvKF5Zc6bKqf}{X2@- ze_Y$Y%d&s>Chb2RVE=A(UD%FITlOEnN&AC8)unBBtkHeJ*sep{za8Bd+P@v13hhss z7f&1AT?U8LRq&+S^7dP2|F(U(R$~|5#V$U*Gu1keE6gDpi|D>j>%Pg-ee))DKOCU@ zX5ptGhZweW-*=O`2Y;$b>n-sv_gk>^j4_*26!seJ!MMw$KK^$?y>3~c+&OY z(0%@Oy071tyUP12f8<@!y;Hr_>+9Btj^#`%(O<|q-1fZg&Y1kQR`7Yc3}6j_!nI#&beT!qeZ2p!;WHL`$H<`0syx9W39$~cDv8il#b^>)u@+*A6${*_gC zmf9IFvv|4~z|%!|S`6U{_&R56X+2Je7{NDqe97j+LHJE$X$2W${gag zdL82m+xL;O;4y;gTfN+Rv@AbHaH?!`V+4&#hPAo%sdm4O@^kCPNAkIK^&>ZzTZ2C} zYW(m$?t6`nN7}tHf)nVtuzf!PPlfF}WvX2{_8xcsUs^E=Jn3O@6l>py+jG}>U$yVN zYv)$wcNEcme-Yg;-s0(g(9-?TCUw7Zi^Qz8x*rmL3UaHJhx58$eE8;c5B}7k)?4Jg z?te9U>({#PLvMw;?}Mj8-BYG?&pA~eGdNUzNB6zpD5m?~_S_3b_s~?iRacppTXl<$ z$*m5F{z7uAnY`}Kn0Eb;;48?jW*+w2h&8zt@20x744i58Z;cFH8i$=*QKn>#ywAPQ zyeG0!p6WnL%R36~-H2!cV-QmT9z}yPh7mYp??F;uKgNLI``=ZGO+ALb5d0Ll@ z{G-rn3yD3z-(u+L`0S6H4BWzbgcgnA02;&4XbzzP{2%^>ZrcYQ_VXH*999Ls5jl}NV@LHI+?AEqA_CEJd;KA>2H)5-L zOSbMj55E4ok*z*NHsF7(Ws|WG$wnfghY`Vo;Q(Oywbpia<8DDC0zhd)O z3xCxXf4c+t+YNu!A^ZV9Wpv-9b7dTXIe;fVY^@+xy+0wRu~8D3@N@;>R23#potcCAxu)|6{kbNut-epqHU0e|T{k5kUpUBGvx6DQ#~W__FEt&{Zo6YwwBpF! z%o(XVHHofeoOJja;9<^&8C*kpI0FP%i zkH?zb58FIW!sEEbV_N`^ZSXiA!Xxm1ZtJjf1tw+_m9*v^wQvtd@WqAIeyUKi--*%3o z>k&)WRROxLLf0c9x(5C#cvU^B&etQqkEZjH^sq&%EPz%Sw1z`y0sm`FOWJAj%#3q% z6LvisVprhGuE##;zQ^cZ^W6_DA@_{`{!2ZopSf6(O%GbKELW^=o0dB`>pMgi;Q!u| zCArwadRcv5XCJog53pswvE>8q3$`u$uw{?M(`*1wv+&dt!V~b%SUl1GalhUs^m`~o zzra2HKH&b9;al=7%I~suJ6_?n30=tF9UyBSe1S z_Zj&GFLNi!@s4aiye7!E(rp%v(Eu8w&}a*x0ld-BD43hs|4yrK04&{X(Hjn+Hw?Yz z5PHC?3_au1;O?OA^!HS-9?GII5I|!98oNVi0MGrL?t7bh*{~%%-Zq5z4RFtITHHsB zy=j}%l#AcQSx=m9foI7h>hPI*WGT$q>W$Al=+3~SAOGs`nHo#><^b87k-a8FcHrlY z>^lEV*5b$ShNmicst(|(+Q{{w`)f8&Rq#|{@l+GQQw=;-gzyCXS2a(`+753Vwjl3K zR#api+A=c-ST1vbl@;8D#vQ7r|5n+tHqVPhRQvRchG*nWR&-?3yr)DDsWX)65^lM4s3uRIysuF8K_ zt+n&Z%Omx*X3dxeB(-pZvg)j)=>&Sl1HSb4y@U$QdlpDFSkV$ z{VKJO<+;hK%yScZty|%E?rdrBc^HUh<&E|1^~Q5AVu!*p#f$J%IHpLM@-6PW?J+o{ zp3hRxXY#gO=QA^Vb3?{PyenghM<(>zI?kp^pDhhO$EHW?`JAQa=}qc+C_vBCLc2iE zLzbRo`*CmKYt6YM(!ejthPMBs>-RJY~vGiBk8aZY$>iPkJP8C!=3KPLAx& zWq4o3CEi`<^Mgfve!1L>Ek`Xq4{uV>WdV8~7TN_qUuNlfdH>DD7VxKzDjjjwZmIiK zqoYAh*YS!w1Lk9`)#9dMH`>j=V2J1 zKl7#{KHpu$=clzTdMsP?ZqgQWN`|#@zBj-YbNlmge)=YD0sd5v*730|ZoAQOxAyri zbX@53UGP-s^OPw&UD)FO?LW7C9z5yJyq$a-nY}BWdvibHedY7KyUypEi}?Jo)^nSs z=k`tNc`QKB?Lxc2=f^BP58tGo!Jlf=I^y2!?;9O8Yr3}2Q>Juztju-Id*btyr+4Rd z=?nz;`~W_`djp>b_K!y2iZ(v~KIW#N?-1iv8{cw3a#fWlUL*F)diuM~ocjcGJq_?6 z=VJAguU!+=p!tq$Rr@4<$?)E@KjV-uIg@-_r@!qi__of-?0xH)Z#(&xd~1?@xn{q` z{)?}FLC%x9L|llzY@G))&K`u*(CMvk@BHzD_dj>4Dx=O?8Li4DPgZ6BhC3`H#P!Bk zU;l!vV@?n1b(bSmnIlyd?sM|Za8>4D+S)5nW9hpkukTAH#q zXSgeqMknj`FmN7==zQuH#-a<`+Oi^Xr&`yCN~=CpZL&Tz2GobDz3b~kqg5ZOZ?Zms zKUJx1{x@6QoyOi}I_|{Kdtuy(!Bb(}p-k14M7cZrGgjOIPkOb)??FT*Gq!)%f+o;TYIANnF{At-Tnt-|XF3+2hOUugh53myhp@ z`);nS1%K+s9vz#@-8rqJ6n@AZSh?5u?NArgSvNz}iKDDRK8jz?ZOz0#s?WMP?wxh> zGWE@zb@MsCOU>=eB>Cq1{GV>5ZiAO=}66$`*rN{zD)Y+o{jtazz@KO*i-7Y^oe(xvyWQ3^5go`{J%2zwoN;$x2UZUs$kw;mRg`VJ5&At_1kP zjO7cHH|Y!DPc3L)I2LygYWbbHJzk&gGIl7ebC=<%u+CBDwe@lLdmqwu4jgLC>!PQN z^lSjGS>7oepQFsHzZLF+!6klik@LdOgTw6M9S-n|Vf^BJh+hDo2d}EJOI~t04~ZDuE;I! zV+NP_#cBNF6gZ4uGzR!ZBYtrz#4mt93|{3I$f?fR8E5{ooOJ-?3hJDlpty1D7WZDw zkMWC&jpD{|K-?(P{xM?t$H`6lM{R(AoJ4k7aPdm+vU7Mv4yNH!xq=}=zhE89ml;g)2ETV+o7MJ>?b~RRPPb~H7oCLv-Cb1 zp!ZSq-WH;F;BVJ@cc2ltN4SwTBxsLtUzwL@Hd!&Ed6O|>Sn<1d9HDv7`WP|Xp3gJ; z+HWq;1b?bY+wRNT-S-;XHR>4Ap!`Phge_Iy(rJLF!WcoB@}0;Icm8oJp9fF6K5r9K zr;SaM^?P#Hd0*96-d&f^R~5*?qmYy4LQqSN|)o2|Z z+u>f(I!fVR$*MiM-+d(ZdDXWa)_vQ-s_em+EWfVE>(HqU@atOqx+27{fe#p6LnqL$ zS7O0_y|Tsg>(yAk{}kJ#zAFRt9ShKRrKRtchi=ZV!Jk@f^L+Bc4tLo2n@9?stP+pBec&Ale?HM-_q<=3aJe(IH2a6ffM>-nms z=cU-@`l$feI#%tz9hn^ffy*M=WkUux8=2CTeFYn5ogUOY4OqV2qqTVzc$R<@IIFZo~E)ehQHC6nYYgF1id z(Q=(buIT`|rj6aI+$U|h&LP)XORhr!aveghvmtT;PZ_y-ipynuwJ?AAV3z!)Ws8@; zOu&!iFP&S~<}VX%Ij7~JwfRfrcDLQg)A^9fUrfG{W~`%uxGLu*@8|r3UE~fsc^bGH z?~u6!auL%;?bqXa&u>M?CNGgQsm@!u$~!!}?=)qS(}*vCXa6Vld*X9u-&4J|%^0>h z9blW&#x}RRtB+dk=@_;dwQN%tV4FH@Ga6zW;IDyK`CNV8HvT$<4_iFrQ^_*T?+E;! z4B+>qsUvT2=WTvR;CI;KHx|He41R}0_ys;^_$|xx+e@x4xvFW_f1Un(Y?06#S3?28n7Q){LdO0($! zi`LZuT34Yp5JC(1u%QKwG_;Znd-G>t^gu(_RP|z`KK?I^V|~V_-r%Nf8}(wNZi~O^ z0RE=ouRDZ4;7=Ob$1{x#8stb;zK_ZiB*j4|}lY0;Yupf?G<&JcRQn>D@U*xsyz zJ|c1+1~HNI+Pd!jgV(#qa{qIZH83MOZ|f_~G~7x%*A!#kCy&b+4v=ve8Jj&B z?YaF+W{wTmarkSrb=uVC=NwLN0M1@;@=npS?0^Z*w-`A_;hUJ4?%SK`M+P+p{2e`h z{E9z*{53Ov{G(2Eg`P!M4R1rvdgN@dwKWLEjPov5;uEK?9HZ{ zIInj%&!xSYr05bHa_`+8(DldG(WlZY`ZQzfACWyk%w4HIbv5*Y`qb5`zP=cVywUwS zG*t|v?AkqEJX3i9I3y2vu3z_y`FKy=?gHG=`cS$XTOa>Y{Z`#CqwbekbgKjCRztTegf8$87`h@0bdzOPEL@3t zv5>p%oK^lWjD@SMk{@zz;Tzq0qg#nta#rv%@0)R`rIPh}S=z%sfA7weqIv;dXZTb7 z1-|%DMVr%Y4hTb&v6wXBM*S|t6Jnem-94ql+;arq+ z!t%JBsQ?+Lka2$fJv4qS1SWCoRZUaz$N9p(olXVdJOxhPDHRIY}%O8;OrdEbJ}uVqu@>1D_PRct`1YIxo*U zADC{e~Y@{zQ*_FLChYEyudPEBMSjBl=W&MV}@Xs<=kXa=2G9@N9{m z62G74^z4!PsPZ|v7g5z=?)>Y;jt@Xb;i5cE4iLZfk89E`CG2qp_XKjtxrv=61^oxk zRd3;3{*v+rJ^o2dsCJtSuFgGtUzIt#n!g+D9aaogxnyGr=M3caD z0M4`E*}9x5Uq>woE@VsCw?|`1#WM_?Z@6p=UpSb|7b`CFf)SPm}P} zxdBhWB-VY}mb1f>b2I?wC^&hisGPtA=QBpm^Ro6FzQso*ejbf^@pIVof%k}9yrX=e zEicbHA82dM-J@~#UT({#hTFi!vvE%*DY^uQ#L(vjpNXI7Q|T3b+VS(8#3VDPMW5xG z8LPMER#-3Q^@IEOdv&{sy4?(ag>}2x9S~? z1O8XwRk5cVe}NyhZ{O}Cwo|tx{%~KP(-6R8gNZ+HcBgF~>*2B1;;}7&$2NGZ4dD^^ zIg3ZxAD^s;r+33sH9XY>@Kj^;_GZ_$d8&q|N{gqu0G{gLsWOBo;J>1IO4buI(4Fjy zS7Qv-_@M6h4*Wi`sv2KvZ_CD5Zx=ciQWhiMw)m?G;I9h)%0l=9{-n{F#O#@X_G=}Y zO|M4saVHi)D+aCAkUKGef56bfe}qd^WBbZgc@ zA8Yde-?Q4US>1k3aOa-M|0knf{twS-;3{@4;ot76qOU0%Kwd=bF^P#Bk>Vwzq+Dc`_=9Fz$Zm6-cdT9%FDCP2c{CaPiUOI6Rp`) zcPqGfmbGP)qDyc{`}JMHXWB3Hsq~6I?eci)gYzk6bn_hfY{y|0~{pTI7KbH<(4J!(y@H#dg~{?vFPr{s^+xQ}T0 zow0;Bhj|LyX!?G8e+r%o=jJI>IJh77)dRXc2Zw6Q^qq3)(Ewbdyi*uADO0$(5B0kS zm&CV|#LW}nF#XiZ06(q7PfvJ$S~NER{^#ITxqn zZr$HNk^A+Q^!;f=mS1qM+@{tBuQE2EZD8iHoTKnv=ohQj{b@^yoAV3sb5EDH!yWD) z89NMUzv#yfg?`ZwPldLm%=4|cx=&g-%I~J#?Dce!?hC-x7l4a0h3nW`-7bSm{Gu1X z;LbYVFJ_d!*3Oa6B^_yzDz@G8GRPFeStoQhjNRVmzR%dLP5V(xfbCo0sW84!=Ea1!xqr4_#}{y@_|l~Ps5t;v zGw&4oBxPQGu5~XMT;fMf_)#M`Onm7J@S{Hbs4>Kkfd2t_l^?;QSs$3}*1pu0_oaXL zyZBNUzSJG;OQyYgjy)gpzjH1>=Zg=izLqK%{s+k`>MZ^{1NiTR|GE(Vfq%~M56*Hq zOQqV=v05KjBYI|>tEJ%nylQM+W9(Gx4jbLJ@V)Gv`QhttlH4cG9vX9(u;SgG$JXO+ zW_{t$pdY!9Flo+P<1Uf6h#o@vq1QB?B>laJoB>+z>0H(%aCZs!lH*tGbE;dbgH)yQtvl5|rw5D<>d*mqpj=qeI^b@gH9A8qbQxWHe_b3t8B5N^Q~G&aKVQ;M z?%+~z?%-0-Eh_iS#owWy59#NV`uS=7{EB{lQ$PQQesTww!o!_gJU?E}eOq_xwGQdw z1G#IZkr&I0+@E(Ba(sPHX9?rE$L7xnoo~inwFWi9|F1N-PIt)~`p&5S zO}>av=N#70D*g)ZvFjqoZQ#(Fz;^TKDUG1=eF&M#T(nW zw@sDv?ZKXL$``%gDew0S-0${6BLCjOIadRCyb6!YA@h*HciKFz!Xtbpq+d0=g}J?0UJu^- zytTOxYw^-cAvAzT3=MFnp^=<@C_mP*01X-IxDv}bi~L{MrY`cmtm{rZ;J(_f+h?)S z6>!a2{7nYvU=sf3LihvzKf&wUenIO%#>__0!K_7NEP%!sG-g9+0ROs8Lv%2L4zTqu z?3tdiXq*V3aRM4MAvAzb8X8*96+eHbOU@Cy3xC?h*k78pbSkfzM%U;0zfjlbwXQEb z;J#?){yD>=*pRh)%HJ3VWUU-`?O1wXtsL=ht-rAz zF3p;`4QT-Xc}*kP!dfeI9ic8cL+lk8^VX%NPeVuNrheb^blZA;P=@cl7)i9a58L_} zLm#6Suk``E*2C*)2(Q5R8-0LN@*ySj@3C%2=U|HO5zV)(T`T1KB;OU|1M*!a) z0en-Y_)bLKqc-2|@ZDnZJrcn82z<1J@C|&(@C{C7<0kON$)kq~?9pU&=$(0WMDvp# z+MB6(19ztIxAWPZ`aZ>qJJNmdRB&gc!@K4TD^ISN8+*gC`G2o*?c?e6v8KvfPj*Ds zx?TGv?m;s5G0K`U;Dz@wdbW+Z4`@6N>){;H`PFuOj#x-scwWzqi7iYHm}b9#g3SXDKm2{P8vHT4&j{Gf)4Lq2CGpx)8epj~E`nsm6O7OS2C2UuD17k(yZUddar4 zpT%a+qyHo7zRzuW+qL9vhyI#`_ud-gizV)HzWHgRYvFs9cDZqHw!dX>rd6MHmb%)W zzhk17^8-Lf z`x0fz%Dt+8s@6*HWB=e$uaA+$Z<5O;nU`5>m%3h(`P^^o`(2m!WSlEynU|#eMoDIb z^3-)%bHch*fi09}Vtl*hYxI5j&A$IkjCZ5_7CSjBC0@)}je6t0G2|vF}?;d&qr5=KFxBjgD4$AH4qEo~(Pn#9cr>P5i&u zI=3^%pBKQfdqZh&XMqCc6nZ}j=94NZwBGst7w@k%9>EGPDkmZ z#28C1A%DJgOXTyfOAaP<#b3|mb>sBsY5V@#5AAd7Y5V#E_FL%Nj{oa?b-akLwrgLV zw0!mKCVjO>@w(Pm&$jx$;`?fk<*V&C>8s#RO=>^m%&!UKXXDyePov91Up);^g}zFe z^3}u^H(_vyJ;0M514l7m9c#_~oY6J!8ejbed!T(^9nrpe5?>w7<8tat*85dGwjEt> z+e@Zx2PS@X#LyHTPa==;)v^GbW#HtUqP_}DaCU2)%2!8%eYLkV@_F%5<*UP%EU`RY z-%n%E9bQk@_fug1%E$pua=-hXqu>l$lYUg&hx5W}_(sKd%F4^U+(5Ngi!ragVqKoZ zZPRSA=l(4J8_ zWoJy~j?exU`C(^UruRy_mt!7^Wqz45!IA8aWsXaJ*%iwyPsv)JHZQ;IZp%3HWts0u zS(jBdSC*;cyWXBy<`)Dn@5wj4J#Cr8{5CN&z1#B5{s6u7qnF(wz6t!VTXntD?QXJ( zwRDWzIknN8QwNR0SWu^8!Hba#W$p~$`gvq6v7p-GX?FlmyWy!igeTzV4Nv07?2S)0 zwPpL^&)kg{eeoUYOzh~3oV6kM%&^98%{spN0NVA?t_-0K{Bwpj^b~E@>){jGU5w+Z z^>H$u8$&l`0lF#Ex=Czxf63NO4Bf0m^7U~gy1s6#w9@YknPUY0F~gteW|g&T@G13B z=|bk^7Ff5oY|&Z@ptS_8ShS}DXir0X z!J}>WiTpeSn8ckmI-F1BePApA=NLG7r)Vq#COF@#6r=lu0J@T8xnNzKq-Z?LR9pJarYgMY&8Uq0|2GH-h5Pt#wf}tUNLnGN^tzVshhQxr$29BB*2jCtDcgF^}f&HgK+*`mM2X~u= zdo%#|D7f1;zzyu*72=MAn?2^~W()Ul0PbOMH*bI&*ryF{^nK^8k^3dzq`m6;SH$K& z1eUJWZB}>0Tg%-@o3-1bJCLV)$&BL-KzH|gx_+AlOx9ihvY{=0+nC6=SzQ4*yTHji zMcXW3g7dJAQ{r}aB69>87|+kB{zEPN*IE2`2GHt+R^0})fJyuKlufJF;=d^XXA?Mi zrzrox1n19coXHx_FTy5{)B#ybP(v;u{h(T&Qn%}P%A7B2r%oVuHQ%NAMzw?0dHLvf zuN~8?PUI>Ljaq1keff?)Ke=WkC%8%k7chmZVgpCrv8OQoDA zTVy@de}hi4ERor8O;pJn^J}6mmS$74rP=3SPJ#YM64J6GT3EZ2tF!Ps${xk~!!! z^P)Rt?1l08bWaRi)_SPpTl4FofT=v}Xj|^cP+RV)LHgi5{H;cF{Uj61%t0`p^+=TUQ1v{I^K6iEo{dtz z#eI6Wl=Ezo-(~L8&GMUP3(uE%w#B@4RLq@*uA}OR6<*?x%Ix_?K@S9KUemVC~;{Yp=ed%WEkIhhP53`88SFl8ZNv46my9 z4}OpJSHt5n*Z6T2n>u6MiH42Lc*<13+|?9wS6%Dp9E}eofk_;>Th~hmd&-=(k8`DD zeV(zh$Dh}>+fE-R-wV!LY@B8IMhCt!fUop3_cpgT`!w@Ssmpt_y|a6>hcE8U{y+3* zC+Nq$M4s?v+VH1FW4R+IW4Y%lw`BeU`TUU-vAJSP=HT7doa>6!x4)6+^^B?eH{f+; z{W#1SGcF74+Yjhm1s-M2)j5g$x(=B49AI*ek@ES9hce~2dU3K`-}lbikr&IOZTCAj z;3sGt^oHq!-|BuBdI}F^<@&54_5JbQ`<>+?-!Gf-4bDL|-&0mzr{~PjEq7X|^_qVR zT;?mqmdT4H#Fdht*qIUiMpxn|&`4g~lOKm*p3L`~nUeK>GlMOzgp73nf4qI&|I(e2Yj@X_sba)f%WyQsc)6;_YEJE!Ecw- zUgGgT$+w04Pa6KWyZ_F7C;U_1-@Yev54z}xZmZ~TD#@hB`QFIWR+0gimwTDm)rLId z8^{CfC1|K|hbG>I#!li_DLUV&^)GS8{5c(*u}F+qvsPVVnb4)ZfBt9k>k?#a*!e2s zFZEj1u>e`ejE=UuDO*;`*UXpI1;|zhzoQ$-2J9O~Ht;E1F%K7LtCL3OJKW=j56ZB+ zT7Pm$bWvH7*@`Y4$SKdDOg&{KX7GP~fAbBt8{T+wGL3`g0o27P0% zio8shjJ+z5>BM@OE}6ClnDjZ?ja=dv!^mcE-iY}=;N!f}7C0B@Rm6BuVY}MlpTZAcN|E zT4!9S{^yC9*Z&;x&b%1nyENaZe6u|-AHKS_|JmM}8!$9#pdt3X(j`Li?}@JJu@?Jv{+L>9r>KgwUdUJKBGJsR^g z!p^k7?{6Cpw^Qs*}$B2V=UXdJC;4n{Mt|I9E?|*t$G5jWP>$VRcYz2K0wZT%+*M~{+9*ND1*kTH-1x84&Y;& zhRh{8=t|~*#7-~M{yzU3w7<(yFOI(ky}~&D8sn^`>~+6zn|mBQDt_XxY0A?#EdH+N z$Is80IDVb+^Be2Om;5*m>~D?y;8SsY8Jt0Jd|C66sB&L2d{AcMc)8>f3(@s)JWd>^ zT*dK)Ru#t&BJ*#9L)NKEy-3dJGa;@JT7C+EcEQlfkDMHxptq0f34;VI*YCwa;^;;26VgYV>AO%=l~=jFp!*T(V7od0pZ z7Z*~?t(n84t=Zm_oc%Du84xGT zOXr6Ia2^6D?-bQJFv0l^gR_tK;eDs%Y{(^YE7{0%K7(w3$9w5UEnAD0Z35XQE!nyQ z_~-`jH$vZ{)2PQa=Yn;j5)Cch^WKi`Xrt3qQt`8NuK2&=3 zA;EWPzEOU1GB4k{`fxIlyU);Qf`-_a?^IrM)EifSr{Dsna1C#OYdDd6hsKpU${c4e z^{bNlRUv1qP`6^OSqD5)x0YuL@|u3VwqO8z4CZM#%aM%X`I3o+%L&%NZJ;|~qPyLi z7sdC0WskW4oO9shouc*tCOF?_aB4dg<~8s70C`Qbr>o?-NH#Sc$@ZR)WDgh4XebMTFGF4~#;iErbT}q^6N%-q%4_Ca+2MMATZe$G>9Yd4hNz$;WeY zf(~F`<9peIBtDev({qVU_-K(iOrO7D_-pp~3(Nt4NqlD72U3PkEAlj* z+5q`$k-uUC`GJZ2rM6DXES;7G;4A|t?-bQ3Fv0ovT3*wB*m3LH2P0n2eh43FN2U(u zM=Br69En9T_t1}tGtbG~=KUMaZSswo+x!D)IpDJAHgA_PFWw28+l(_u#rlR^oH;4= zWDZK6<;*!TC-QO0(bMB?GN)Md42Um5KN$;|^W2*F&aUIz^Yflnw`Wt;w`Y56ZqFXB zy*-;e70>;A!|mB88*k6{?Y=$x3r)bs;X z%*B;67q_2zv~uR%oT>O4UY%wA8{blG>^c3raDH@}a@|jl{M@nmJt7ljO8#liWjPVg z&ySA4gKitIsq-SX<>yC%$v4iq1Gytp2XarHJ&=2P@<6VCgujY-uK#>Ir{+j2AF?XPb=W(93^1H+xsFUA3>*aT;JJ2A%c{a-LE$+Z>`OULQewVoe z%{*Iqwn#b8HYwlg4z$Z}o*nYL+#TrT*~+s^%6WE6dE6a1B)@s~@O+tPuasA~1AS7? zvp=5ud(No%$Ura2=Z@2m=SM#W&9`PqnjFK1NT%NZ39b4JB) z^6n#yML*106t~>@b;=fR-13AjKM--h|7Tmy0aNAb-SpabRoQ2~vNhj+Rlmo4t(1Qb zUyyen{$uaVj7Pq=7LN~)N7b1c5ATYq^Dzp~!+7|BD(~8soEc>8LFV9xqig44hvK>P zQT)O5C0DD~=TEDgwSV+L@t6TjV#Z99&NJ|x^w5Dk&dLCsmEh!^qHzeA;QXqMv+4lr z;69Y?uROpRKOf5WR(~jaxavdMJ>)WN%)hoW#*ttgLdDnBa$>C|S499174Q(-fCpg0 z!}B%|tDHq-bhUEZdR?tN&iKjx;&K5KoFCITlhp@u&LH}lpni>0=T0GG(}%K8A!}+k zGBzS(!-uk;M8*@ycpMpzA>)xn>f#k_w;=WPSl4rtw`V@f8JD}5Yfewxo{{y768~b* zIt?vn0ek3i7}KsfLR)=LpOt%ug^zOlpYQG$ob1h8LEo{q=$*&{3Ed41go(AN$0wc_ckXbuZJuJt8xDP0Q<=p>|#U$~9+*%pnZ02)is zSPr29{FV1<{{^?uNG?2{&yyFSaU1I&ua@VWCH^m5r^>lVjA^moKJI=CJib1zavs)# z#ou%Qf79^CIZ9F&is}IPCBvWSV3D($L3^a(7&P8-E8=wQuMpZgURJbqLI^Yb>^t8p_Pyl~J@HZX8AMno@{zL~eS_hKb zb)$nRi$-4njXr2hh0p;0giS;Ipc@^S@zY6*MppohE@(`K&;Z_UXlOl0c5wCz^;)ev z9!I|u0s5UVK33tr$JXyS`W>_QY6{@13BJZc_yYbei!T{3E8l;nE6TYrW)Jv&bJhra zD_%$8^;7__r;IObbIWaBN8xqE;s^|M%W}eT~ECUBV|iRCRALAG7vX z==@uFmO4BP&nE(SK4J8`&HXEI`*nC2o`)=+S9S!%{l{p}LU;!L7Z%UbH;MkBzE;j` zWZl1K`vG_x4B(A3@VvTpi~Bn^Zv*hwXYsZWz}o`6^@Z>T{A)IE*gpEx=#%|GzD}#q zpVa>zcws@Ql;BguryF+*c{uztMH2mBpb$@J!x5ugzzPbYV z>N2{!)qT?Ds}sK3Ext|#@O28l+C%sPp0fB-ea+z=>YQ>}kFfV8=0i^G$Q+imfcef~t`j`Rq$3(pQY@tA*Khu5~;>bCOzsF4BrlVgu@Cf#G%^vGkGI?kam zXQ02zyq%oy5$EqnG*ZRi;I1uSs@cW(_V-vbu`60p(SM@SJ;0qxsvb9?yXFAhH5=Vk zy48lR#NH-!*J$akFF<#F=&mtDcfhMG-6@;OIDI=dC5Lh9;j1BluLk35mF^GTW7XAq z_^P$|Y75}24Zdna_yYcY@Tz%p;)a?#Xw2L6Prr;!cZb-tDZr+?3v9|g(qhxMXx%2; zv1j9BjC($oiCOl%jy-o_%X0oYuqS_m<=9h=RbWrfSE)!3SE@U*9PFy@+p0njLGxZ! zMt9rY|JUe_vgggY!{AZhR~Grc()h#<_s`7tl!>pUt9N8BRq8#`CSJs_VOf9;%M2eo z+~*7)@vRs(d~It!Z(QBJKHjcAnn}O5Z{vIh_$MqI`tf3MyB9BRY|S|<&?(I2R`%&w zdz<@Vo39)Da_Q?9UsnS7x&mL=GyqMkY$BX;Kw=QqrI9|*_yD(l{ezYK7 z+@^f%gq9&W`)Jmgdo&Z3^J-+D=f&;WW5lOc&Lh18nyHJAW|NDLuDweEzjLsuw1xfE zk9p^OY~+LZp4`)>+D_v~i|8!K4;PJ|tK3$jXUcp(G=6-g$oE(D_ZO<%cbo4iQ+_zL zeXSo#ESbaJ^8xmrH+`YhsBXnhrJhC>#Q!aZ{X$u(B^UfoZSStOC)0VF^ z2lz@eI8TT83hF?@IPbH*U|~p~nps%~KZ5h5(uk&^#4F6Zp0QnnFi( zk!-|AD)PSi>Nq;9cr=@?V;lpyWT7JB9OZ2F|dOKkuzweWH>gcsm{`EIKYLnm4J zXnuU)C^S^xg1UTy{|noc6UN8h=zaq{%AR7MVe0ar#ouz}`nGPllljXK{(xVw_*3&9 zbCq6v>4&F*0GTo`8Q*^OT(H%sTj@xyL7UTKkT) zLuV`fw(sL&$FrT;^wE8JJIXs#mD%(mi>H|Yo@U_bPzX=Jf5Fm|_)BuCGe5@h|Fib~ zadBSPo&Nw50wiM_%h<*amSh)8I3|wLC9%@r0m)cKHjasdTcyDR+L9S$6PxUkR@q=# zO0grS#1BdFR!K=rze{A=swv$iM%y7o-mtc^OA`8B(kfkQYr6!=S(4C(XtWLfzR!K` zedaP;c$}~Ohh8I|^UOJ)^W)xo?s@J!rw$pi$En9=4Gx<%7(W(!4Ytkdv006Uug8I} z2YfXl_@LKY_#`(7#+lfmGi|F1vDKl%wey57aAf8QhwAM-f%*9wH9!BZtxw(EsaR)y zvaPG$f4`l`Zp8mdBbQJlqntJ9qJ%7~}ChxW9)e;Lsl>tsf7)qHdB<_od`(k8d&R@kQ z?yvE_$ajPJtBANSurQT4FqMF*AOsWiXEml+sh%r{eVN0T#eZSiR_$V|LTxLFPiz(7 zD#OpU^~u=MWywUgg|EPYuK;}6A^4#GmSwYq@L#$wJ^wG{`t$!{ZYq9>|7Y6oQmyPM z7;D#hdu;nH*0QJIe)CLW=CYOZ|IB^tDQef=>p+iM_|*J=>at*7y-93!>b_)Rp*B6Q z%DO#0(Cmr%9k$)~kKJ+V%d>PYXpE2yCYsWEi1vRDzkvDD08*#`RLEdzTJm^1v zm$e>?yg}rdI_(59B)2|;KPLHqravaNKgO^1UWHE(H)rt2n1!#~fv+2UV(o4+Ysc3_Z7SA&U$U+9zVtlagb#)- z9orl_wxQ#2h>p;|Xmpf0yovb24{BbOxnvOA4>@cMnmJtV*5wJ9dV1fQe78a2c8@xBY{?#Hw z_CIy_zMlVQ&bRfosc|{;AHBi*jJBhCmRpDKt1Nuo4t(9-<9vvY&_Azr zY!>^sB6oUUa?7SjQqH0bLfb1noFzwOPD{*MGN&9er;s@tA`|+Pwq0dUHJrBVzZSa= z?_)2SF*lB&^Nb~b!XbYG`7r_UXhvW^O!*44E5;vCoLZJ|o&b(Hp&=ztghMF!mX=@HIN{HG*$21RwOD z!PnI1)!bN>w$K0jN7$z(WL(xFJ9AvtWQ@!48`ZchwS9c@u2igwaan7POH)^sxv>Ht z9Jh4b<-oW_`uAK$B-d&V-G&)b@-sy_+X3oMcW5G_~3|zuh4<7 z5PU~M@Iimp!l&lO#e!gN{Dk=6Qo-7D<5Iy&A6%+iJ~xhUQ9el8Ivm3Xi*>vcwaz^^ z&K4vSotBOZ$kD$Od)fTPWTB4pA0awI->Y?OmN`P^#@V`HZhY8al03C-y`QJHBR4Zo zZNF>f9Ktn!{oU%l)9`8IJ{eannpdlXSF3{;*A%but=@Hpm(15K_ZoLl4^M}L7|gK8iK8Fx5zn}#eDx6&(b=6>xZ1oF_Ud{{57x4#*X3p(diIr=9+?09WH&|!5PxPD8yrvzzrX9Sv=EqH$H)eQA z+)SbO8F-ku>38VekKSiO^oIVYTJP8h{sCujp3giNpFoc5x%h<9^A_*#3^uOit@qFO zm^#Skp0ny8*?Nxb`_O27%(sO+E0_LH@$P)}zGL&eyLn9U|6XML7O%*}X7@d#5zeQ? zI`fnAoIUc7k$1`eB`1z`-jj^A=Lb1KJ91;~_dwIWYi!Z&-s?v9HjS;x!p8p>(3f`THN2E~FVt%|xpYu- zklI;p+E>j5`J+GV!(X}gBsn`V6f3yLKO-gg73L@9e8t~Dw`1vL^G+1=TqE0x3I4Bq zU3d@Qy(g*8S}o-zuaS6WEW{S_)O*6m;2B@oI~rTeleza`{8FA8AKOjux5d3GcYTfC zBFquri$u%4y~bvj_WI)lzDm~8Ufyj$T$wW{o!HVfraO)O%e{ZZPV!xP)TOens4A7Q z296^BbwqAJ_hS~nj#c<|m^i!D`<~&)wYYv~nygi7UTh;C+8y!GZt&ddb(!x=oVF1U zEmk~CDjTVHGrVka?#aEJK?sQl=!bMXNGt?ruTJLq>*juNH92rK8NJ@={icm;Ke!q! zTtg0AL*Qx%!3F(6jVpF?Z~AP6#Hp#vNc5~IiW`tzO8`mLDi@ndR-#8eM4 z)vIHwFC(UUGh%A|o!(y={rYrF!B@ppKQYx!3=Di|)Vw$HM3bK1*GGP;-WyqiEnIO{ zW9)aES7-Qh?Zj{E?{^Rv&-=eMYK5NI>DOjrZF$M&_Pk_bmu2HFhmE_i@vaaXL;vx1 zJx57QAtTndH(i&huw=A4WV9lqB18uCzsZ!*jtpuWsvpg^b>zR6oJNP7M&y+FapZF{Ua+`+R7p4_wQ@9Urm&!5}a86R!fNd2yATb}>k$Fe;C_jJYR zQDW(_%OP_YGE3Hw2~B?c_P4goVoQ%w2hUP?a?h%IKog!XX`anx#OyYIJn?(%W&LQr z%RQ03e(oak@FagPd+#H^n+x7S$p2*w{DgZF9mHl4v2*0AIP827m2c%;5|I zax!sU+AX;z>qv!nlZ|U}cPcS&;X1cri3$e*UYud zSrZ$0r>iAv+97KiS+gOsp#S_9Z3BFxWKG5NAL1Z*|;XaHD=*D;=pwTTw@`) zppO__;-hK$adc}R$-Yf|)QXQrELoinS)Irl36TZ;bG9srhgN*V+?Y6N@o#bPZ-M{G z5dP4Q8vgK>vs78n@_Q<&*WAr}LG5#}&=Z4}%tnXIMr00#$b|loEmP!C=U4HA3{~gv z$F~E>${c?KCg$Gd?S@AXbN%?X&%##ez*Y&iz7TBC@3gVW@5?NEY&XB%GdO#|+3UdB zYhv(r?>ZZ24>-FmoW%~D#o+7?!3jOr#wi$y31ttnCq053S6*?%*zk7m*9|tV?bZ3_ zSIZAK{65#mb$))Bzn|pqXo3DsikX*=d?*>4&*hw{rO#6C%6V_8mfyaI=mY(=GAqyE zx6y6bSgoTo$mpbKAuS3S5I9Jm@ZuJLz!EjF%taMfD4dL6iW!BrcA z3wo2mC9wwI*a&{=t4+3nvj&XHSDpB(%97XZkk^g8st|e5-=pQlI<>FNSnA*m4Ef5k z_a@6V^6q8V1gEm0g{Q-Trvp5dA$Xvd8vRw=aPF;_v)<9I{=6)8bbDUro*489^jIS{ zsjx7#Ixw_?p&|qW^!Z=&$78H99lt>gimqjroCb%S2IQ25$btU9v>bnoplgq%D{IgS zU7;&oE77&o!cgnLPz#3A5Dd`&%II2|p(}c-FmWW!iMHMsjTCz4v%^Hns)c zlXSttHsioH1GWnx*r3;D+O*rUspLJjO`$29j%k~o1NW>0_pHV}{vPiJ8}~VIpS5tG za^OA%?z17dq30W$j%C=?`mO%<4Z1!ca}w`fXoJ>vCfk2!)?_wyaSO{y2bPmynOdW7 z2sGI*zSr1LGL+yBgEzDnGkKd{U&9vf zb_efvcn`0^8`|@kyiKpKA&YmDgLf0Wht}W??U><>J*3x{?Dd6x0I~LU0cRG0PgeUi`8duPS zXWZr~HJVD^wT2FD=3VPO;P18YS2$!K=;dC}WAbs+byWJ~s4$>ya!;N6pq z!$aQlCo%O3Jr~CH?=QdeEVbD#egkUuFCEBm?O!^~`ta-CI^?MNfNOg{p!X-(M%9+u zn5Wy}k-5IKn|b=zz2TdzHM@;@x+Sewd~)5&wQq6{^>W`|tJapFpM`q0ym;^?zg!=gszvZq>g}51!Xh6OZ+; z(`Q4lOQXXsjm9qj%6r7{lrh+VUFs~m9Cz5|ICiNEu?zILu?tx9@}r~i+U%6PlOg}r z(T=V1?iur*9P*mIW)A25h_C)m_T^d8Eou5gutSZpL#0=4_=z2=utTL~hYp7wIo z2|Mfzu>*A94)6628QfeGo90E{R~m0zH)>+=r=KSV_lLw_lOqQAXT;$6dsPhXGV&VH zziAKShG*3c>(sNjr_HlCt|y?M&&e-;Ehm3yE+?=2oc~;oSbm@P!)2=pEioT34ZGV^=eOZRz3t$|ZV!EV1Hb zmm^Mgp<_u%oIw9FI;nXCzB1pdJhUQ2pNduV;d+KX{9gYK?<`29VX=;x7b`KiF+rvm(x?fc33TnU=2&;Q2wN#reA{XDF`bT6CvY+*OgC)Via z0Zn*5ta-L9?jCI}+%p<0-7^|Tm&}~__T0!9V;6Ep{WBsw1E0@X{tW!WZhNfYi}!m^ z+4do}+U9qUM&-=NH2vb{tv(&I@Xb7@ISc;zkRBS)XSVA4!8AR@RQyKL?>FG@#H=M} z${}Y8IkO>hp#K*wN6Fy%dr(U@&+*S8$CXE%tJd-Ies2LDDv#jW(@`srP|rWIc>V#8 z%sgU7e?R&g-dD}{#sBoN`&IhXt(r$nRj0mebd!8f&Rg~61bM_0%r~*)Icw(;{n#}# zk2vnfgPwbt1Aarz;jb7SidZ}Qb|(}4yVH4ud7dtL1byt(^Ow`uWx`>X31gQJc>4`c zvCC=fa*F%SxtT*?%Z#l<`219e&!IOOyMQ(CGS<(LtnfTyq!OCdDj|#VuzF1VbHQegToFD*kLfl4$wCnJ4hZOb{KdQ zb{Gh;19aaGRbJfS=2|dkSLOtH#LOQMgS$dvunPS$V{lhS3`Xx%F}U5xt3>~*-F_ai zGiP}o!F6h=t~`QRzSDbUiyq56x$ii6L@&0MJfgzq!}{*$5xw*s;hyE|d&C>n-;Xu! zPR1*Cr}K!?oVD|a(%tSng6kRU?$;yZ5${T^YYe)bM-+aJ^C!%Ys_xiLY#jrC=G=2k z`G~wJ%X`x3E3wsG&2Lt@-;A-`oRwoN7rS(Y#1`~V!#Bu1q~rm|Q1X{v^IPWpaw<{r=_Px!F$lgMkS zPW%3pgXbxDa?h&u257=Fs(H4I)r>Yz(`RqCW;Bj2nYqW6>&QKZkt6xFoWC2%UY>gl z*JO;Z94~I{BRRlG&FB`%JNmQzdUXTw-iTc?p z^L1Wzt%W`eUy1ivKmE8QU!h*TU7pvOu~-APS_igT6KCtZej8g2*mhaix*XWLz_u#{ z8}w&1wjjqbwRBS}sYH$|$Eh@STjz}$Y+QT!Zk^+p9BJn&-`{C;TkpMKzR$In@6zAz zV4nKf^7p^|7V}r0evj6P%=f?0Lob+{njH3M!XD)z_JH1K>>+uP)WPcLF{tY+cOXAj zSHrV#|NSpnS5P;Qvwrp2$vxsv87Jh?%X;3`IrO>j^HV39{U@8p31iesWqNi6<_6+JbIM~3pMNmhtBgd() zNyc*N1DI>cFLuZ;Mt*LHeCYpBs@D$YjD+ydwfX=qM*OwyQX~~$;{TcUS&Hg;JJ&k{ zp8)5jC}*s=->hx3Su5wv*=qJCes7Ld$2#;03!nNe=R}sD)6RnFf&8IXmcHjUwB zMkY;;5~HUU%paJXbmf z{vHc|nL}0?vU=8#1x<3YAKJ2xS@;VbJPYB;J*(n}COjuJ&sZbReDF^k9n^Zd5b>WY zE%GVPl`ioq^@k_>+9m+z_PO7xtQ=Sm&I z3!389xdyM!XsS)~YVL@p4lL0_>JsN67QwYZuQ7O-=SuJS6ZTLYoYNsU$-D6@4cm1e zBYFPPJQf*!H79H6UBsN~D>+6VveOav&Q@H~Tk;m@e<0YJd~C4^-HWUhpSGoO#%Cfc z*P)pxXT;X9KQxJ-8m*7gz18yRDF@F}@Z_FVeF{x@-e&V`Ar>d-MTQO%lZi$P_efes zFvpD`qj9B-V2*>9lfgfj-0bK6uxz z!5iBD$mDJ2xGIZxw}W>#ysOsW4Qk??2M-8uqFr3CU|nss__C%cz#>+jI}a8CDy^O=71VK2h{30pia*L_5K|2 z8NQd`J1Ta|)B3HL1InYRe`jR0Ap_gQ`JS2sO8hzCap46`@hV+|S7|hr(7c*U$dOLd zORk=IppJQq2#59}Ox;h`A^+$ox_o8GYn& z>F@THhR-r5J<=TU)aL{K=cCmTZxg-W=v#Hi!FSWontRsl0S8~|-Coueho|0;Op%xO z+U1_uR(cSr_X*29$UThHRQ?YAd5``~=+DpU&lmLPEBf=i{-j5i|9$;QPb~f(&7&6< za(++rPt4zwdYXDm-VW@Ad}?m5%e%qidL1qXU##>^^oYyaobC}O!Efvf{C;rWt-KqmAT>w-u)R&v4~|}N6$Poi^cj=h zaPgh~|DUE;+|yCrE3UF26<;sCv zqpJR0hg=;O@&3)Dw(jw+0^b(O4pE+0>c2C4&NUXKd(QnE-tBWeHsYGHXJZ}v!Gd(p zxgzB0oM%pY&OKR}?l}id?UNenQU@#RQjhGcOFddqmufGsOMSeoF4b1Vzs~$r+x`N- z_Zt{JqY5tWW;t^SJ!I-g~TH z{^oN){?7Ft8I^ILq5$n`w$u~TxL&oTKs-+SydpVfR$$aOx? z$n^s6u}S%x&nZ5?#pkqK-{?JdR<83oBY$u59y=$0^Eu1sxA?rkXZ2;?WApMip9_3u z6?%^?=BIu}@4Ck?<)V%lpx(UUcVmFFMAP>VHQp+P&)T+mYpcj(&!l z^z}`qhaKbX8R=!0@O#v4guaiMR@Xk8?pwE!xZVd&xxVi&v%ETD{}}fc#AX)Sx|SBm z0sM1-*#-QTig+@6>0)A9=WZ{Xyt?>7_WE_JuOHB4{kW2tRdr%wFOglB<~i%=7dI>Y z;@02^O?duGiRO8Td9(Jx(YBfgIj{BLXl&Pm$>z!jlPx`*dTUsu24?|A4lS*hZbv*_9vujB(dJYd>Rzj$hIH1Dv$eJcRdbi;yGqvh2h_8*2aLQ{^lxuqyz@+~rD*xHHLfS1 zXP(jVF;{sD*Xi-m(l8otDjHS4XA%35tHjIjRk_1g<;GW4-n99?_^J$Fm0G^4b@-|l zJf$JNf<6UbH3tb6c@A3gCVW*A;w$LB-gkOs#&%o_d{vhA)t9^RRe6Z7DjdEl&-9i5 z9CX&$sSN!qw6C^h_=@WZ=nh{omqom%43BNTuhhKO#Q#f+()~C1zq-Ce?%E~(fae*1 zzV!1t_RI7hmG=&|6y&G=7M^kLZ7ysWZ7JY8l5gUBx%c~-v~FmukwQC@NjnDZ0iX7g z&}LX`rXN%>Des9oq37l}*W%3S3ZvX}R^Rgt>mIHJ_sIQAd7Q!E-t2txC1RYurE{ND zbD00!Hyiv*d-ePp@jifj#h+fL@rlj+6B*2BKS;~iPQ6NKa^JYr5SaIF6rZ2w{?ptq zeX1=?>V9a7uf#fWnOMwAuO*9)o_&k->{|@!sRjKS@S0dx`?RSmlY&X+j7z@{rl|*# ziJp7NIay21JMiDe9-nj9rsa#AU$w_4V~Y69^8N-sfql;HO}$+`KEG?>Q?>oxw0(xf zKE2pyX76(Qyq*0&jePOD*vIPs89Vc!{|@&qdTpMz;-SY84?V=g>5zDU{+Ud9UFlw% zfxLF)owDQ|a>zS`yi+0apvSemX3>o~Bi4>Q{ch4HpvBGFKa4!r+COZ@UY7So?pHCu zwU_@;ul;7c3|V-a9C(|+I~0N!`aWYH#-JK6yVCJcA@Q(_c<9X-FICuUz>;6@kYA7d zfe`u7Z?NQxoLCk1GVe9*MF#uMcpv@Uj`RP_I>T{oE6y-%Ft!r=^f6wJS@=pF_)5Wd zECe6)91EWsFH5>_;1Mu&J1}({|7CmUuCd1O5ilLHFkN!=4ZK9(z(XOJpwGZp=D64r zef;oS(DR1zvsKP<%Q>{OR|NCkUw;Nao~4IluQjgao|!B7?XZPu-hpWzOdTPZpbu$G zGOsE>&U`Tatjvt-3FNg}@}?c~-efP)o=kZY$TQE#jJy%#HCggbJLH{4zoroVpm%6_ z%@U)m>#-5!>2dv8XtIVW-5V`=!wz}F$ZHId2mN=9er8-A^Zgm?xkA0$>2C4qu@Cz1 zlj`}Pe-2BYXe3JF|PNDbW^S+F+OE1#|eN2OW+n@vEAQ4oJodZ)Hn6`yrg8mcus{BO8$*#SeE%+ckkkZewWAp$` zlvuK=9I~pART3f#`nQcNVo3RizMosD2kcp1B)!&)kCR z6Bpp0xqsw4=C>K-YV1|ltNr7*Y#SBe*ZKRCZ5Qqj-uD}urcd1bhV;0bb@Yjw1^0YN zpCIV>TXs`^ou*Hmp8FCr$Y9SAKS!UXS^l3HBbIX@z6;hX4{sr=0ummgnk%?)GV8?o&67J6mQ!B?&8^rn<&6>41(jxevk#h#gd+-^{DdzEeL8G5qOJF|`6nbrC?a`dB2CWb8i_B-sqANvo5*dO}y zMnCqx&9Yw96SsN|eGyum>#@^%4^XM&rJr~iaKy`iiQ^64)3!hQ@kgJ9cc%mIPVn}H z;D!DfgSQfYfGwy2e(ftI+fC1R*~iOx>j7u4181*^>pZW?#@PeTZVP9z17|TfyF+k7 z->-2BMpfTAvLU<{cZ7axYyEBzx*zX(-bsU-Ye9YI5`E6{Bag?I3f0`ZH<)|<-hcAj zGe6Gqy&C4%TMdt;dgk&%Rb!Fbfc!sL``<^Hqfs! zwlR6snL>Y!nJiRm%+H@>Je{fc^Qg)CbRIQTn5<^K`9DIRqMzUKj67TGlKgx<4U%RJYv`-$#C*D8muRYunW?-|2Oq8eIIB2@?<_PT>G4VQ@#6~KiBPZ{{Hyb=uO+Y>}L+{u1_{|Z}7WZ$?NNh zw{lCz{SF=Xqhoo9j?nMaI?CQr#aq4ApR@!Sk{6cZgKZ8UY%@OC=#|^JOYuRGg|EVa zuL68UA^4z|S@=|5NKeLb*1uShKW6h7lPWJPVlF8z9F=jJW3Cl*O?pI1URdhKV~`h0 zpGfG=yfC`S+o<(vE3IEUFO(jSnRy}KS(X=$Z&K^)`)wQ17gPF4w$TqVSYH?EmA90e z&I@xLcFP6#Qb=zi=&xL5?JZ;;SxomU4A#|IoXuM@&pBkCL*{&lOz2-RI>J-ct0pe<&y&yQayA(mne*cX z`c|qu{W7nM?*{YZY%OP#Elj5!m`;OfCIl1oLmE?T;y%9~BRw4$v(0urX5g|Qhx^UL ztSJNZGVHh36v^}6#@>~+mYqb7>RoBplnL~fHRTL8n{?Q0Qrm3&GVk5C&CX!6G0SFe zp?BqN7CyD6w508Gh1jPB`%Kg>uS2&IyCar-=~Ae#){admDtsL zag}ebvUY$c;9r6Z3Hji8Kb~)tjLf-KZdC*6Ve(+V}vQ&@DUSg~d8JXj<&y34L@89#?U|jYR zW5+B^B@Rp_U^*6p3HlceCYgf!PBt#bUHX}>s zI+3+x^)Bo{hK#pPY;nk8i$k@%Taey`JR5t@6O6gxd;L6^evMhO{}UUX+NA1iJ!0?? zL#nPJXTLi)`Rh*=xN01@YK(6$_hzoN;=Br6l@_iJ2d)lqRfgb#eipu}rYPgQ6CZ(Z ztE@q?rZj4N72w4TG)9k3osQ zFLV)KH6i^Wr8i|}-c^(C59yDgD^%X~KW$y=>4Q~8e@OaR26-2~DHA1@e!Cp{?Lxnj z5dEMZH1;=RpI($fJ+1&5QXeS9{zVS^7a99s={4Gz3$cH;g|E+Xp!>k$7~xF;MaM2+g(Wawu@!{pv*PPh6@ZUV=$dezuQe;znT&#u|^E7!YO`YEY7zR3G~_y+6Uxx3gybH6!9 zcglhH6nM{u;D!FT2JhHDfA1>eOwO!j)~jS5odV~y1Lw5H8NJFIwsB5@^NfYF-+{9q zoM%FCLO-c-s(O{Y-)Ulfc)e=kuC?n`(0%(}7Wj2x-8wEKDx+kUNO_^wp*Nn?Y}-u(gods2z^eJg7%^q*Ag=>Tys=!kR`~N3*)>4<2)EULNG%Ag25>9 zCpMg+r={7endb##$ZN6WO*-UFBCjPx9`sKddB$gB$TQE^8jvCDc_TjC&;K*`HT%sN zEcRM#pEcq$yN6`I17AP*>O$~AZ?f>I^}I{_?1=BPC_Yi^`H{NOcz1!SkG*m@q zWJ`Ulr(pSdehm50GwWmiym*bbTkF%-Q@8edehB`V>p9<9ww{k)qt^3J*fwgQPihx^ zQV*s3q{dqDYo+DaPKVt(!Ce_*H|SZ~Zp{)yQm<-F_eQOAKiV#CCczxR&S6!5z&^eeOUYjo(> zh<;@u`ayrC(5h)5BUXccrsh*($*6M3s6s|bhz#go*D_+Y^v6U-gmI|s^JL2%(jU`l zpJFp6uJ!(b@2h!?Yft~4zjn#HDRQvO;e*y0H+ZZ5Mg^>U^vVqKqcR8fGO!o=*pa`o zzY(-7es?xy+o#~JG|xf@&q8=|&#J!1oG3tLgzwcs`?fHq&D>wm@Gybm4b` z%laEV$2~FApG)Rq<0E=*CKlGEaa?fVxB!lYHE=)^dnRn%=*=1UeYL)v+_S1~(1hoM zHc$4*fsamUAB|}rokNdVOOGjs9#iNsyM|0?V$b*5GS69hj5v6Xz>|Ac)dQOF+@^Up zkKvN+N z{)4i|;P)@_`?OqSs=Q{B{#8@R&Rip>_DHV&y-4&r?~mXax51M5Tx zR_K3duy%3Q9XwljM^~&nKN=+z&hm(Yz~{aP=1pF*Xj zSDn%8dT*1_tJ2a-&hcn}ZNJ0Ui*sEKaem(xoVk{Mp|172&**o9_g za0X`(^1wWzF*kv^#euoS*tFDZvoSY;xzWNr?7%z>=Ee}r&|3{=u!=qX^K%+kJ-8Yi zxEhQtOT9fdu6l6QTDW>0xO%}=8-fdZRO5<`?4{ojJrKc{jV;x=h-d)+o=nhhF}~3JrSEgF4_&Zi%sXVvBV!>% z2J}Lg40E>qf+b_dA!7y^7eZt}|9OG6pTzHvBn1 z6P5ESk()jFUFiaJ@z-_cEX|PK7f^EvI*-fT!QU76Z1DHRXV7EP(qq6Oa{!r>YsiEq`=hhA%rllA z-434J@Z_FV^?)Wkzis@}b9XX!>~3|wCv(sBeeQ{L`njU|Z7VrvifgeWA>;YTD&v{! z8RMCEB5(En8$2ZzVv5dq9wWCM)4#{PhTr36>wKPT@sXU=d7f#gbDF2HZ&v=T@vaT3 z-WNPG7}=d_KDAr+LHy=)o3~H%k9XZ2{AO5cGvi!;wcXdR8DH+;IhN?TojHT={?x?k z-P~ttTdH<5gl|t;zHN2*p%p)zT*D90B%ThyTjjrMy|;W@@8DSv&!IJVLKB|#Hcz{D zvs1@trH)bhttJL6J?b1X>ySCHhD>M@Pw%#6_FH;XICxgTlY3T;QE0;R2Fg4@T+wLBXm2DW!k9?i?73Uw6J$?SV z$h*(;$=~Jiaxm(5Sp>g9FTZ<~XKAWV+T61{6)(HnuJaPN+q@U@{kTm)i*rx@Wv`SZ zayJlT;ONG#@;s~9k4^JjuDKgtxf#5oH+g@gdBuzU7@f>c=YT5a=(n2avV4{8uxmDU z?OMaG&?G)4kQKz-AYw(07Jpa<>Y1g8ra{YO6I@g~U+tH)L(j%m= zt8;$u@Z;l)w#;@*k4c9fljy-ctHvBOiMb~<&*tgcWNeDQkd9i^Gu*Q*=9-AP)44&+ z6-&&Wt{sg{lb7yMPG1o+#Ow?w?+)dslWXoL18A9I0p<`|^*N?eI>?-r& zNba)VE;Kj7YcPXX^k#3p<`o}-7yFLeGh?m}U)5W_8gSTk0K3+&VOMApA3L;N)xM_A z@>P$6XAeBNXH{Q86P}xGp5({DTHK*yj$W~ z%J(E*=y|ZR?o&?OR=^{(j#**W&R_FBX1*`$Q~7T8VwN529Xi*e^EO}SRco%$4``j` z`FK$Gsn9)$OTbm?z*TDW`ZcfG##I8YA`4f!16Mh?ib8Nf|A4`T4`LOy%j-Uc;FEe{ z0r(0X_zI2P%Dn4rds$yf=%+QV*gSm-C+V#!<8HOO4}DOS50S?WF$`1y>(&u5IEw|n>6exAV3W0nn$IQ)DBKaYj@8Twv>PsU6)_+-qi zRrhJtm`A{T%7OWm88h3x8*R)ZU_NPKZgF640rSZa%+Rkln9Z1xx=*dfH3+UD2d*Jw z%N<@S*BZ-%;Oe(<)i`j~fU7?Q7xbUQSH^Ozl`&JR$INPVpURLiQ@P5R;rhxkv%{;= zwvH+K^16?#aq`bR8!>;YwU2!KZF$es67N*~{_-C1WU{!{HA zm1p(Vr04G<2hSpSa?h&y2{hr^XLy!!KiIeP4p`YgZ$J7Y^?Ui zEAMd65?;_0ul;NA+Fz4Ot@r1R=Ej;-tmLlI0~32V6S*hZJVt-uQ}phH4>@n@^fUC+ zJgs@wr+M-WH}Lfd^RCiCY*oL~R%Q=Rf0NYz&~g<<_}*#yeAimM`y9Oc;9a{0Z)jtg zyv=*dt1RB#4&L4Hu3CdPw6A6IHt#L3w0L(qcz43Pat+?lo;AF&hxBHM%2?)KyyK1M zCZQ!JeEY}h^;j-vEL2!>Thnr1Hoj;@ZpBKuFPnZ0&}7^lHL}%yq9#2S>Kr`l;90%~ zPiVrk-R3DdPCa889fGl30{&79f2~7SEwW12kOfV~-6w5XB^Le)2hR$4a?h$`8Jh5H z(L7^k7-tgu=%B`Oksiy%dMuadv0Unp<*j@#!FN<_)3?>kD=WrwQBCSPBV!U7;$Oa} z#xlK7Wh@s8FKCKa?i##uYf`zIS93OfzDpU$C5+=@#&Hqj7#=c?WqtTAy%Z8tn&%~} z$Iw#F%CWq(n`bb7k0E<~3&t|EbL*_VH++M!ykPO3ckrHv_re;yp?xQlw;9V9EZ#E? z-ZSvNum*2v|1p!d8O!G^-jfdAlkh&b25)G8Y~pRz`G@F{C_XO3ERlzN5zCSX#do<9e(*b(4`X zgADO6-&5oIWR@D&*9tFair4TOyoRe&S7=_%C#zEjI(H{qI(8?U+jl2pZS=&1hZ)y@ z_t`g|le~8;_4OY;sgsUhUK>Qh72Qge7V5-sJe!Bc*p<2 zC)as(^pLK5vfTR|@1*8mN8Odr9B=E#=L2ay;`KSfToS}=J^mT+{j=)675eEMYd$$g zTy^O)u4VK??z3c6I%HHLqc21T^y5Ybyc5WXmF-TSUG7GPoO3!x&$u4`pIL|N(RLay z_kJHfft`+3lLuS)avk_`!Pgan5Bie^pV+^<+P8tk<}7{TIxQKC*(>e5Si@PW5E;;a z%g7M@XKRT4h+h+ELvK^dY)6(WR@zOh-0F238*pv=di~7j5b-Ycg%)_V!Xwj$t;UA8 zdcSVIFS@p1!~K?iV-Ees&~JZ;e$a0>`hi7_=abSem71$yliFK7*ywS&0$YR8?Va9b zHnw`O)mqs49N7B6RvUs1dcKWK<`}RAanx3wik+kfU?;w=vgCC;qNuH-+1mt?oG`4>riZ7_j#iiWMV0j z&K0s9x@V*N(i;7Yph>RqsL@@<_N8c==Y_15^VWrGa?Le(LKB|9Y4b$Cwt4!zp+k^= z&@=K^=}l?pwL$(g@AqSBwq;$g@J~AMPlBI&R?R=4N&a!K<{7&{ZXmW7A5oW$4QKiJ z#|WR2f1Kh|;$Qo#a zk~3^22QBaCnW&lTr{U=u|I_Rn>eR6fJR>M>_Pg^l&_2Yv@Yw`<$1vw zd@-5E8Xt7nZ4kRn`gU72FM$5nSyo;!kH3*06}xrOlk&7BqsJkm2N|bBWI+F-kpXY% zp%m+)7pD15(=ak5FBqXO=_&r7xu%`cb{enno`6qar;#Yn(ky&U4t!1E8w$Y({Zj^? zjHh9G@QDp1FQ~!>1D1?>hm3k;41~yl{vjhn^slN;=LLP}ZDNI9kj_{+ZerzK-eF?{ zuB})r=))NAb=a`i*zjFmh55ed+Jg@)4SJ4^O~yXhf;j4<$6799c#{68ZI-+lhrAi& zwS~xo{qdC(ci3~kvFE$JzXC^~ zXCwAprGH_tml#C9`Vjq~|Ao=d__|N`5jQzt4cMfgVdhw_HM+gq`<#uf25h@5+jlu^ z-vzc^A=sclZDSK(gDtQ@6Ta@_S`)tBX~}DM$ZJR5&JcOfKdR-$n&``izgNo(?tS!) z=Z3jAv7qyUTHR~2EW%j>3(I~7mi=HU_pvzFRcNw?f6VAEW4kPx&I@WBJZs>|J*%#( z(1d4$%@h6FYU#C!4nbZ}4E_=ef0aX46|zd!kOfWF@Q>KCiY@$Q4xVN3dOy$E(6{=pTtx?ecKd2dbP=C9=+La;FyOrs_yz`tQshhU7sehmCCJ_rijgYf87%%w7GFbPvM;Wb5YybE=17cDjclH0A%X zXzJidH1)_ZxyAthIwPsJiHPo77)jkn-@-?`_@r;)qeuAs7N4xs^Ss}@{a7URD1H6@ zoW6dlHy?gfefRLA^u$wr{m29E&5C%p(%0`+`udrEdH3#!c>Cy=_YD2=HqtNeApP=G zAH931k9PGpFs6S`ogpKKNRXG98hgCbkrz~w7xb+${-DYDtI=a4j?Rf*>}<~1%sR&O zEMuB`RvpvOgy(HG&qLVnB=dSB`FI0)d3|;AKwWk6Ci2T|)Lyo-_HJRX);1YQJ<-Qr zjC0a;&C$`e-mKBKNxs{v`vtQ0C)zEY&pGg&17G_Z_@D{C9X3Alfk5X82hRz3a?h$d zLld5x4Nvry`AdG=n$5hG!<@B+Jx5tqg!ch5-(ct1P$b!WGLmc=jwBC^u+}wMdYyJ) zI1Pp-AH%A91?U4y{ye9AiLBTVvP~XeZ^;;R$QVRMeTWR`pUsqU5*g+dFDOo8OGceW$Q>5A_4) ze{zP@KGp~I$@(Clb-{-4L_QfUc<+-Mq{U0$0u0F&#;b9W+n9+{`I`a>2rJmjIxG5dAS##SL<>h zJ5CKzVKM9Wf~IG#+l$t^z3K4OMtmFNn$l+xTTNT*_F3dDTeq{)>ozpCZZEKI&$Dh{ zz{Y3!cS*0=} zjvk3K(KOF?$NJt*ym8N};{}?GmpT*6W2^_nUVN;2G&adve1^4ng0=WGYjK3NcpYnT z9&;eSjf*d3seX&^F@p}y++2!MMRdYk*dbkAE6HhdS>p62coH0sq;k+-{ej3 zeG_Yme*DyD*(D?oTh%V)Vy7)!>UnHo+AjY=>{3|GKAGRr%kRF6eA@G@Q~g3Ks!qny zBcK;&`TF#r54qwBeR{P%k(<3>>=K_bH3-B}Z?wV^j^d~HRV#V6d=2_bz zaCJFwbs0O~>^)-RIs~o`3)fqyHN`DlYF{}W3F2>`*z#;7c<&mfO2@^ws)}&5Vm989s{KqT=Fm6Bk{?1^H?a7ai%iI3Y4SLu4Lu$n4CJdDxe^VC*Jw(Sh9$ zS#d$V&3`V6{VN^zuQYM7-Rm}dBrbOHuiT1@klNU)^Iv&1^$Bf%Ri^`^s?)J9#3lc{ z(mxOSvN_*J{+V}O6v!>xp0x8wKMEjH=F17~!`}mh5te z>~drm`Ldn44K&F^?lrO{ZVIF6HHMsdg-yv*<(^e@8)(Awy@uyBx!!5`f_sb94s*$4 z{Cllj{GTsneenQw$QJ65%~FTVjV8ajJM#TseyaL~f4=|piSe9=r~mo>u@`>% zsjL@%xjW*W&nZmjeM5BobBP_Hx>{3~UsvPoOq9A>td+mNmF+#+#%Fbo_h@^TUtjCU z3a_tmR>+mR--{nNKHT51uW77?r|D1)BCp6*Npn1w!u6R>*s(Bk{JBjiPL-e@b={~Onv zIo~7agoxjv7(8WNP9RUtXNk{Zhq9B+U7Sy<0jJpu^*DUjgYRlW&d5L?Nm=oLjM$-? zbiJ;^lF{Oj(SnSM5E;<_*p@+j#JXydZODoe7l|@UMx#SUBQnZDWI+FdEd$SzPu+hd zH`t_OWPljqdx;_oPlW?d1$c@=@IY@gI-{%bm31e;Qkd=M*#%iCsfDcAe-)Z>Qt0i3 zkC_`21@OwY@D(`l6@V{01RwMYgKq$yV2l;kP;2*d4$eF!6Vyh67-qk}VhtuIGUt+3 z&1)`2Q=5$(WHirnZbJN`^O`^}vC)DhZ?$t!0#^sDd zrx|p*5F!Km_lyj|jSQ)mNR40z=U@_Nk-?`tn~I;~|CzOdbL6gS4!zv_&+rLsFcVEB zrYw9X9r#XyZz=>I^lw=BRIQ+g{XWkkFElvBr-G%D zaX=oS_6EnWZI30V%ps=?IX%7{XAT2Ra+tepIme=D?1c`Vh4ADa!S3V=Ecb9cmB1`4VI##@unQLUu?b<8T~fbn-^tYOWXOEi#@y1*|1;;ib~E2y;XMJLV7_Z(ZlTT;#NlesR;ewm z8Hdn6W#Lov-Jq^lG=gcr1Jiyp-(BJDw=p$>sougg;IP>MHmeW81ijHWLvs$sPQx|YvFX|WXfUF z5-rIp;>Hsff%h{hZU^&yD7@Pgl=7A6GS&QNfWI?74g0#<>|{$_cJe@db~09;rOqoc-~Tl4Teo@Y_Z?DKd3TN%=eHw4U4^}+ zjUi4AL;Y=@d+ySIXVz7!th&mzho?NSa+cYzt5jjT622#UWNMUZ|Fo>Gl9R5hl=|O^ z@1m}9+GOSx~NuEKt1 zjk?P6I!d*wqYNL5_AeB~#ulij=$c~Iue1kquJP=@B+jog;}!koHz~ndGwsM5rpX() zXVtL-O?WQ-+@FgQ>^0)$G6&Qoo9k+lEwwet12r`(&Mm202=Cd?y94AIrm7?N==~u3h4?J%;U%$NXu;Q;dftB3%Hwi@#|VZjB7FW zOfvt8{`UzM&YRuC-+RdoozML^o3=uK&IFl$JHGw}O8@5!7WP1K&V?xb<+<&VwEnk? z%Y#orsS_sU~Vm2;NyF-IJZ={SsT z^fnoO5{IXV!?$T4mHKCYe91n|k45T}GVk}*jGCT6+piDmg5Oj1%9CJq)hkb$akJ6e zX7F-t`*qg$rLH)%%J+wizMH%v^L?&uzed-L3Yb%{7iVnlsDPeWWKO^yv0a>tc^iLw z@*lNLgty3u?W#`a-+f>=UP}zG};d$8al9grlUNg5vR1XRw^Mm7`@3c5EG{^5&XxHyJbJlI^<Pn>n}pe!~;onK`Y@<@YVJN4TWNC}(S%Iq%SNiZixj>=9b5adgIk;S3mBLe^2} zul$qVtBC!O6_c~6rZ(7M$vEkdaS|B~Au^zUJyQnfBxJ1aU@l73Su*+^GWwBG7a{}t zbD1(uA;X-pt+8bEIAru7qb5WK^e!zUHb$&tD|rSbe&Y8%sPWWJR%wKCt9@hLfEIiK=eoihsZ-kvRdPo7PvF>mdU&3Hdy-oI4B z*;y^4xrH;foJD9U=UI4}$lzZaGT|de0*7d({S>|2Ojde?QOvn{wp$)4UJO+OK~2UF3H>Lo(+8#`GRk z?~~*6`fsyGJ+1%F+@nrdd(@i`PyKhn$u+UByl+O{d$Qf^Q3sJ{?@^z$p8Z2pJ~_=E zl|B0-r?B%N|9D2ccQ;*Q9l_Y`%St7Vqp!)y zs&ZDYXH~mL6UW!sYeJK8b^x2I^8naJ-ro}NoXuXzbC$W0dsZF0(1d5b&GQg;9>MOz zQdi^sIr}*q(8$?8V2 z8xA+zwl4C;*c9U$8_b!xn%@*e#*4fx=J$W(yUJ#K_jUSS9IVSq6=d<8t)6k5wej`y z@BKUHo&KEBCywWg2C;(8 z+K%rYZEMdazp!L>Ib?Prb61E==(~-~cJ7D&4&+L|2I(mu*M4{=hdpxtZk|hJkH(K5 z9hEv{-jmb_v9+;Ld?$0jr=z{fMu)HRe%IItU8FuJy-IfEZ+u2-ip15_J)hq9rG1~? z_@y1ceCBoOKar@-9{n-*JW`gW?k&&S_)J^5_;!=>Ex!EO>)#L`Z&E&9=HLBk|L)Dv zzAP6T>a#xPH!%BaM)&IdO}w^dbcgTbB3Y-E&cwoA9Se$KK=}g3sG^UgQjX)m-0%kKr5m7=53XZPNumJ!W}PW@#8)Z23PR!w`j?Gt;mtXa2>TUvUSKIgo`sA|dt_^SjBoai z+4dk8Oe{vym=>u|W$xt`sYfpQIp(V8Mxb|Fm{blq#cvw$HEUQy;-l2Yrl=2rH~3A% zwEj)QJea9zufWWn(D&ih-bZcB^I$$_VV-ngo&@u`5X{hj%fj3|E$;~7S(TihWpAd& zn%$OXhPLE0It8Zyc!oPXS_@da`XY@Ve>zbIrMtV*N#^eN;GGmZy{ybLfo&Sk7 zCgCH$;|j(FHPjU`NR3o}wCa` zj^E=}{Pw@e_^oxsZ@>5|V@;{G;o15W53pRNZ0AQBFpQX ztJPMItn};4#;?$1ztC#S>Ov2*-n@l6r@`M$yu=Q%mq&-pdfi9A{>F2^WG^XsuEf=9 zb;lDXPFJZr265WKdp_p%c!r{rBS(<(8_*%UR$wpuYtP4rF8u`{a9vV4wh!;YCT zIulLLu@lj^HpjxhxmCwk^jdELz16(cq+@hH@s$~)`@xhMqg?an*lWFK4G-}LeC*$Q zt%%XaXzGNqwcIZ;%6C+Z*6J9gPPy!?&7h+mHAp?GevKG~CNY|{Wz|_R+U?-U@2O1v z)1J?Qxaa%A)8JPzTI-I{|M(ZwlZho2qgB|{j1B8tO%R{fxf)w;5T8}Nm&xb>Pu80| z;=ADKs%h;~exX0*b>1V!FI>wrz2#(mqJ}Da+xSjDX4N|fGJRgjcQV&iuHo}%BZsf^ zt}?vEhdc3kxuxT3_0MwOU#qUG&?81q>bk;rJNs~nPZguYiab+`Qv;2cAukhOnbEz( zd;R}d>;5+Im00*zt8bQs;Di1n_^NduEUJ#ly8~i6_dK(o+>_t=OH7O3gZ#6UX9z`> z{0c|xRiJNCh~|wu!tu&hMkWXVkqOr3N9N zk5Ky%+ChAi;L~-!CvN6q__Bxavhog3jUiv;<-N8c_-)i>GOu$_KKDqSBOjjXvs!;P z>-xu&)_IEB7carBDs&v8aGpLfXYc(TyDkdr?&bo9E5 zby)?k@5m~6=7pS+i#r%2ve$j#rIHuP+rJ(;yp7*iMTTC;x&Gn~0{3lA^H*oYF7yl&Z9T%yAG-Mz4ZEn{{UR5=TD^-o;OWGeNUfTa+p0?LO&i;$f zAN{S1>b~(Sy>5Mv;KavY&wFy4xBdHm-Q~nfH@tWv=c5<-u3A&_3j91wuAMk~%|)rZ z{Atd$7p3kpboAPbVRe@mc3&qr6t5E+&xxbIndWbH-wQd{1ia>SZgC>#p^KU0`gyMTb}I6I{$qb!pE&xFi!Z?Eg`DDxW^O(4 zQnBDwInm1o+e?ivzL3*+ajks*tI*HESH|@Tc(VShIp>>4Z+KD0)QO|N4c{vsmzs*1 zllS7!6T5GC@lVzZz3Jkg9{uu*Dxan9@xsxoE>a6zk)%(Q{Uq>@ z$d2A|;-xEJJb}$mzk6QluF|*qh2mG;jsve9|@_?i1f z&FJ}0uHheOH){X*vd8aGJdmF`pM9J@=E`rMKxU@jK4JMSQtbUi61 zeOGkAZwG$`zx_jY+HVK7{n#^`d2j9?(zW5a@7BCEzrjE7+u>sG1+C}Y0WH_|8`u0e zF81nezj6KiN3fw8SKoB_?VI@RBWw5#+F!y`)+Jx|_#H2NV&;9O)_vkKy}rvhdk9&X z{(8vrSM(b1sO>LkEBtl$D*k#-`|JK+!Czmq{B^&!o9(Z!S^j$NE&2=ofxoDke8BkY zZY|gL7uS@(BG-E7E?DD?>*w#phQ?n{IsEk${|NKPBA20ECYx!!ug68{5_Hg(r3tzn+ zapxKTAhl%HtAAoY`eyTtpJb)itA9dPW}fkrblrLGAKqHs`5gR%aTUGZ`{jAl>0)EFZ-s5-@Gj6OdA<2S2EWpBQZcWdRp zvg4WaFS(z6o&UW5?BK`Wi3HESE`0aR)n(6rZRN9rx$ioB_%+LipMQ%!g#T;b(R#;j z@IGgBehHmrynPc}WsbLRf+?d0_8Qmxc)!6bxBV-8z5x&8-%qCf`?8rMKZ$?8;rn;B z8r`eV%iybW5_qx~8=d40`&fn_|3YJlzC-!(dV`00#Gf+1s&U7eg7aTm#fNul zAO4Bu!>_$bA3o&p;nxK3^8MJ{LzWNke2YGW|7(Aub^hu*JfrX2m$VO`!%mq#d=5;R zKIEG6VWiX>owITj;q!TT7$4r^@Zl}^@be))ggyvg<-?D0KYX`S^O%uZ2fmp*s>kP3 z$dd7SO@?2e()bRSD!+bNW1Kq*zH2hZ=f_v^?T`HDCO`h9<=aoaN#DM)^0~>}r?6wD zZ{J8iH<|m4J)~_qexoP4OU-WXe(jgLv1z7X?gmq)U%2Lvxh>w`|HvA1!skwS z7{5H_@XJ&9<<1blKz{|kYRo;y{qWsxJ=^g21^*vw?;ju6S>5@Met0a)wvs5I1O*gZ z0pTc#06`UEK#^p7?8vr4M50jBDl>9XXGXCS)ULKsL2(RKgP~fk+pkzezap4L1VL45 zx`Ht~s;w5)^|C4zty;WWHE}`T)U;~rw)%G5qU`%T_jzU>jh@lCFY||9S98z3=X}nO z=jT25T*10_FYA?eS#y}m<6f2!pB zd?TX2*w1I*`G6N4C{7)qX4`?P7p@*4SNp)&OIM?VoEtlyIakHG6UFj8=~E?lgSUX^ zyOa7i|Eu3a`uBb6cLLk0{p{Gu;!MrEM~}~6UgEhE=fp3ulY4nK&VAwsVma0YE@M0O zEs4_1yV=m>p6JltRL_aMsV4{brj8BlP4)IuN1%(p#Uh^375ndKUoJ{LTu|UWwZyTR z;}wq2aa@-3h2B$F${GV_`ABi@m3U9Gf|oa(s?snVjF`JykBh zIaY8y&#_X@2fe4NKZ;lP}dyDtfZjQ|y8|6I5 z7CB$)JrycW{R7{?c)GPX^%UR0_-(#{aZ_O+_3+Msw_FfNwKWGk`6h@7J0Z`SY(o{6YWu<>6lm zcwZ42UkrGMiI2l$FI+u5cJAt7VnKa}96$8G!*O_1fp>`O4psf$)oo8KUOhw{ z$#c*{Zz@pV={U5n!0X|g8=s)Q`oY5mUcAcBQ&;cFwHK2gf$w!&icXcJTW4J``8Uuc521_rlJP|1B-T!Cyfn|v4xamYe{2Ju(1hnjmD?dUC9o+^*u(vvpe%KjOXg z9^P&5sojz|h;P#Q=nF*|tY;ip&wzDd&&D};(EsI!T7PiLGrQ<0HqhqyMaMKI_S9(mYQLfjdYJQ)H($ha zr_O(scgQV_%Ra_dp0z(g48>+Gd?OBgBjB6OgAe+b4L*DrLq^~Sfw$~1?;oB;#x3Ml zOc#;6!2enEqsYvjRFl*h2;AZQ27J=?oQBsK3tz7TUoZI1ot@!r>tom%$$H5NnrGw;T?ZdP>|<3exUPmM5qPMb*QU$kwe2E2u_(}A%Qj1ze< zLVv%7QEV7)+n;&Aas(N~Ik^=0-C@HqZA126_SiNY#fHNcz8VL<8t@J0!3X_83!lnQ zDf4Y8wF;`mKINM?u2oQh?CiP$<@?jM3j7#&y{c94q^*O*blLu7ykdW%+0+bQ4JKnJ zEWJt{dX=Kri9C8i-(vJa4r6d4Iw1BX$K_gZ&E8RDz}VQ|J6ipLAFC2aJIN1!`4M@~ zHNWT_c!PIuw*IT3WPCZ4 z(SHH`doBH!kfG-a7ffHjgpA%i`a}OC^ho#hBiMQYS=geP{GXkFv9mL9J2fI^k=Jd> zn|H{YM_zXxdCXG58Hd^?aq-$X656t&LQ_Z6MS2XF8`uI;bJs3XLAn}u)O zfo~jqZF%rP{}l_LdIw-QsQLk`YkgqFpfuSA4-^-8YR2*GZgs-TS3bM(R$>%au4gx7;&d}*x=_}NsWJh zl(|F+b1_*{#h}No`u%jcHOM#L(5KeYr_-TNC;HUp(Fgk9|FzXtkP&VrcFj0fWyuIR zWQ34Wl}85jg=`sZ$S^fA%8OF53QJCdLrw#7DttNiIy61UgI2(EqwU%^s{NE>OEbr- za`3EzC)ebB&l8&P{8t-0?K_T*n&iF8!k}LhBN+7SGzQV5)Y7BUA+r*hr5nhECiBYw zZOaT=daQ0*-zTo_Bkynnp3sEntmYXBhQLnjqDyv7jCrnkq15ls1B?NGBERjL7|cx% zvDOmW{}Nh>?)!)KrXJ#440?=tWo)G|6}wiLvHvv(?rY$_*0S-u6?%up9bIYh$FgPk z%2>9vY3*3H+~Uuk&5?$T@WD0BF9 zy%6jmvdy2&wWEuL>e)o>GB{-3%^dd?y+(;%Mz`!aB#~S03zjZZ4qc|e zwva~`=&xSZZ6BU8PXL!%o72auxwq=q)SmX*+?S}v1EVXks@65|CXYT5@885bOqPrx zhm0X)Oy`jS{VPUBKi6NOO)8uE@0Y%~N!wKHb4J@|%3+@=hkZDQeZCf8ukW~RpEKBJ z!ouF^z}^X#i9Fb$A2ZnDDeJMc4`fbr+LF=ckkN*W(|Ke-KWb#aQ*yDxwVTrOkkG@- z32OI|m#ym;*KOimKWsIsZ8hew)tJLpoKvmm3`pHz|6Ck+|D`TLMH8qaY(zutn*v5I|(aN(x4^Xnkk^t$4CGv6u%8`nDK z*DAOAQO!GCw=WqD?#rzAmWzEm4rn_Lf;GEM4x&ePo8+7yb9Z@v{j$|22e4xwJWQLs zQk?ELE|`Af%3f+0<*_65zk;utr!$X=!FPw`=QBSK&lUUi)8d7xXs_5d>z%J&x!0dlGXIhok@@-YHkqFnC!{Y9bFSngfjbHc0=Eos{w3~}5-NO7We zyVM9MWPi)THQ~TD0j_o*mvcS^?KzoO+cs!x$@qNO!E+d%T$6J?1xEgQ&(Ci25ZzWBA#(y7nEvk#tJlT#;X z!tNk)DP3Ccr+Op~_{2dOS9q{CuocN&$ z&j&Tn@GAS25>KXo-d*h1A!_6(b%>M_qUI51Uol+M zl3L+fY3t!a_VUEP+(+M;idGb+q^8l2gcmf$t8xQgl`W~i*1RGWEvfLSy@{hC+GfjM zY6b31hIiA3;3GASzRI^o)Eq|e@EqYnl^%n|_d)*3GIF9d8T-9x`mq}9SGL}MX}zGG z)mRj6cs|H_?e0yy+Y_{SS2%cAz&p4BZ)ji0=Di8tTj0G)KAGu%gAU$7c(3Npy$nP9 zWH#?D@TUKWtysKQiqd_1+9oT!=d`i`Z)pF?@Wvi@ZVx;lec8+W9X|Z(r@sy@R_gmX zJXhrRSyu|^V=cK$8MzmXFP4zYyGuD^8Je`ksF5u`zS5kr(?ti*i}2){oIIfk&-d9p z84KcbdlEh9kZ#|Xz`tnWpLNKZMb_d5vY<&@{25yo?;WQ7Jn7&$2~V!ci65Hq+^>0t z%V>M}MD1J1{OeSa-@ZpUO8Xw=DD8W!NVV@E_r56n|IV#|4O&-a%6~q zxlgt4nF7_m{|R~wn&LIP0k2tV-e_JC-U~cBMlGdLYATKF0WaTPf`_#20P*y@e4F84 z3V8M>`!BLi$!_Bn#K75%tmt6IhUs`7#D-_r+c4e6p`F)w6n1!~+xQuacdvtYFTBre zz#G~`HgD6$CoJBb4&I&cp4fmlv|rEWZQA&0i+7uYcN@HU*DyP-(l&wiVZ$4HNE@e} zw7*nTF!AW2S3i9gTCCFdb+|^i@t;sVFKLfY8QIdtN1D@d8LiIflI}OE(S>WWb-7@k z4?+{3M{J(b#%pNf=#XyXLj}|muX7pRv#s`~In~aQVWQc#c zPqp!0zl~p8gcmf$t8W8dea)$>Tr2Z|NH1-Cg}UEYTauCGmSp$}-<^VoY2)AGn;`!t z&-bN`%XcWV+jtEz(4CPLT_{{XW-YX&Yns{f-E=&6H>WOWJPJEJ(`~%d;yvr&Jqz#7 z_5MlohW0zzyiFU=QEM#SH%-C2V*}pMMzeXFHr{689(Uj#hj-fsyrF&6@WvkYIR1fy zuYUSGv{+oQqKaRK1Mnaa{k&N7QdmKS-XuaHYdxR$KvERs+Hr~>lY2yP9o&)gY znw)I}n(&O+Jf)2fw(z{&YU9-UiZxjH`yI0Sk=3w)ENIdm4N3xB7BXD2+lCMSMq z!t*iBGh9de!zbxB&UY2mGhn{0pxQX!S5R%7Z!E~%`Ze4a;~o{;wHf`^wei~K)HWld z9vR|a?o(}?8ehVzKzKn@ys9?fRn?qI{iSZ>m9+6T+Bo(7Bh>c~Q{O)d57WkH_~wY& zD^>eWV(JS zFlO%`RPaqHdCwy7M(?X&Oz(A-H?xPI(J5N#@Kq(gD)oJpEAKlD{WDs3!4$4)!7qWN z%vtbb`zKm0tgHH)VufH0I3z1P@jTYW9xjhOzm;y zqc?ebY`w2ErPkCLyXe4l5lqw(llGL;N6;TMn8ZhO%}LQ+zTH=N^Ny;Wx9fe#NsaRo zI2Ro_7d6h~Z}MJekf7N(@&i&~&HH{sp?UlAe zzXMl4xTf;pg8n@Vm+J32blaicSM-bn(;4HN8t;saX%bB17N&Lwrgkum=fMPhQez5t zP)84Y6)?9-`$fJ*!S@SHyZ^O^*vo4{R^V&xC4rJ2sgEJ~oYcywXWUHJsqz3y)p3(^R8Fkoa)Y#|E zUfl4L7#qPpQh&?rF;qM3Q;mIw^VkRaWH0@!?!E*?nT$6JS2TgdM(>%j1%&!Fd zSQ9zjjBC_9%c_aB&W?>usm~dn{Y}Xz_b|Suz99GS*0$-? zwyDQ94fxgQ(dW>k4?P+-&;y$2F|1`OeD#)XjyQN8fhX7Gv<)=j`HanzzJgk3i5_%F zufeOqUt{6#aLDRFR?P;opvheNge|Mu!r$oN*$7Xr$%!AD@I0n@hC}#PY%l$t?6c*m z=YKEv#kfb=vNEIJI$u{drQWDzP&;vbJ^xTsDheN&S0DV(QqP~~^URk^?);q8l6*#u z$(`7(Zygg+*g!} z^cSgjCN30FPwLydc~7Fqe`n$!-{Y~rsNR_e%3(RPO+5;%@%PV~U?DN~!PKmB~90ydy!LmU?G` zT&;)C^Se@h^Ns{LV(MLqYK{fGBT*ygIo8T~j&<^zcO>fNH^&B!@~#B=cn>#oY?SjH zTjV$INQ5}byArKM{yPqBMfu-xXfN9M9S8hzn0HvVKcU}cAok=Pgu@a4U53NY>30@B z@4vHf@O;2)<(-9-_^dR%cr`w_n)$9?M^P$v1lyWEbUL_xe3=gM+;@YVENIeSya)fO z@ee=5I`(9EmN|Hq!INup_Ce5u=PsKkIc)KEeB6(Z`;pQm_`T$NHk#bA|S| z-`Bc>QQB{G6#Zqs!JOD!7lkJI;S#Ii3jRkIYJ{v^|D!MU+WmXUsk+dh_X{}prKjiv zxzGP@v;H>Q@+LpG;2OCFtA*?5m#gFo;ozPDi-N6=K-nV9N;A5c-=I|U?C3pA=SeG4Gmo?UNcY6ai)+=C@JTrs!q66zi zuwKrC75dK`tP-QdPIzt~dF$jr%HF^wOUATA#xyc6<&gpXXN?T_tMPJ7`)D4$7aV#o z7$4Po@3!@xNAHUkrcno`Q7~Q1g9-XOHKy+n^0 zU|&*lQ=`}?ox3!+DH)rwa11+e41;4P4-V*?E!%_#eOc+X_!Raz>#)yR6Bo7KKmUal z!&BI2(!$m4z|{?|$vn8A{{wtg-z7eiZxw}ftd4_8a?-N*+$N0A?(zQE#xxG5F$+_R z15*o_#`0i-{y#OQa7gm{ITrPdWA( z%3~kszi8}JfqlR#YjKI?^TcvD_9zMX&sUz;-|v)|mNp+7wB$=}nqJFYF#SFGX0gFM z@}VEq@*Y!a3NRIoD7~9|H zz0usyxmOPQ_p9;v0skF^Cg`zBzaI>b7AGTP*rnaF%cR3Dlh~y_k6ob8{<$?zLPmIW zZ{{6^kR@ZpA!7s?p*%96|CW)#9E0ZxNzp~#Q7C!HpKq9U@|%0Dc4GEwq@74iH(FSR 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

(bqyBNnSsWTI@*6EQS2BpPVF-e{tU2t{>vq3m-# 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

cv=Y=he2G961^1H}t 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 F{{sX$^QHg* literal 142424 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

-Vepl(pFBNJF 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ⅆVHG~|HQknMI1sc++W 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 UqJ}ehZ%DiOd@isp2N(SPA7$tZ2LJ#7 literal 38996 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 diff --git a/scripts/camera.h b/scripts/camera.h deleted file mode 100644 index d136cb1..0000000 --- a/scripts/camera.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef CAMERA_H -#define CAMERA_H -#include -#include "input.h" - -void UpdateCamera2DTarget(Camera2D *camera, Vector2 *position, const float smoothness){ - camera->target = Vector2Lerp(camera->target, *position, smoothness * GetFrameTime()); -} - -void UpdateCamera2DZoom(Camera2D *camera, const float *scaleFactor, const float *minZoom, const float *maxZoom){ - float targetZoom = Clamp(camera->zoom * *scaleFactor, *minZoom, *maxZoom); - camera->zoom = Lerp(camera->zoom, targetZoom, 0.1f); -} - -#endif // CAMERA_H diff --git a/scripts/main.c b/scripts/main.c deleted file mode 100644 index 227ff3f..0000000 --- a/scripts/main.c +++ /dev/null @@ -1,230 +0,0 @@ -#include -#include "sprite.h" -#include "animation.h" -#include "tilesprite.h" -#include "vector.h" -#include "object.h" -#include "physics.h" -#include "camera.h" -#include "input.h" - -// Structs - -typedef struct { - Sprite sprite; - Animation animation; - Physics physics; -} Player; - -typedef struct { - Sprite sprite; - Animation animation; - Physics physics; - Object target; - Object hive; - int flowerCount; -} Bee; - -int main(void) -{ - // Load - InitWindow(1280, 720, "The Last Hive"); - - InitAudioDevice(); - Music music = LoadMusicStream("assets/beez.mp3"); - PlayMusicStream(music); - - Texture2D flowerTexture = LoadTexture("assets/flower.png"); - Texture2D beeTexture = LoadTexture("assets/character_bee.png"); - Texture2D floorTexture = LoadTexture("assets/grass.png"); - Texture2D hiveTexture = LoadTexture("assets/hive.png"); - - TileSprite floor = { - .sprite = { - .texture = floorTexture, - .frameSize = {16.0f,16.0f}, - .sourceRec = { 0.0f, 0.0f, 16.0f, 16.0f}, - .destRec = {0.0f, 0.0f, 16.0f, 16.0f}, - .origin = {8.0f, 8.0f}, - .rotation = 0.0f, - .color = WHITE - }, - .bounds = {0.0f,0.0f,0.0f,0.0f} - }; - - Object hive = { - .sprite = { - .texture = hiveTexture, - .frameSize = {32.0f,32.0f}, - .sourceRec = {0.0f, 0.0f, 32.0f, 32.0f}, - .destRec = {0.0f, 0.0f, 32.0f, 32.0f}, - .origin = {16.0f, 16.0f}, - .rotation = 0.0f, - .color = WHITE - }, - .position = (Vector2){0.0f,0.0f} - }; - - ObjectArray flowers = CreateObjectArray(&(Object){ - .sprite = { - .texture = flowerTexture, - .frameSize = {16.0f, 16.0f}, - .sourceRec = {0.0f, 0.0f, 16.0f, 16.0f}, - .destRec = {0.0f, 0.0f, 16.0f, 16.0f}, - .origin = {8.0f, 8.0f}, - .rotation = 45.0f, - .color = WHITE - }, - .position = {0.0f, 0.0f} - }, 10); - if (!flowers.data) { - printf("Memory allocation failed.\n"); - exit(1); - } - Rectangle flowerField = {-50.0f, -50.0f, 100.0f, 100.0f}; - SetRandomPositionForObjectArray(&flowers, flowerField); - - Player player = { - .sprite = { - .texture = beeTexture, - .frameSize = {16.0f, 16.0f}, - .sourceRec = {0.0f, 0.0f, 16.0f, 16.0f}, - .destRec = {0.0f, 0.0f, 16.0f, 16.0f}, - .origin = {8.0f, 8.0f}, - .rotation = 0.0f, - .color = WHITE - }, - .animation = { - .currentFrame = 0, - .maxFrame = 4, - .framesCounter = 0, - .framesSpeed = 10, - .animTimer = 0.0f - }, - .physics = { - .position = hive.position, - .direction = (Vector2){0.0f,0.0f}, - .speed = 50.0f - } - }; - - Bee bee1 = { - .sprite = { - .texture = beeTexture, - .frameSize = {16.0f, 16.0f}, - .sourceRec = {0.0f, 0.0f, 16.0f, 16.0f}, - .destRec = {0.0f, 0.0f, 16.0f, 16.0f}, - .origin = {8.0f, 8.0f}, - .rotation = 0.0f, - .color = WHITE - }, - .animation = { - .currentFrame = 0, - .maxFrame = 4, - .framesCounter = 0, - .framesSpeed = 10, - .animTimer = 0.0f - }, - .physics = { - .position = hive.position, - .direction = (Vector2){0.0f,0.0f}, - .speed = 10.0f - }, - .target = *GetRandomObject(&flowers), - .hive = hive - }; - - Camera2D camera = { - .offset = (Vector2){GetScreenWidth() / 2.0f, GetScreenHeight() / 2.0f}, - .target = player.physics.position, - .rotation = 0.0f, - .zoom = 10.0f - }; - - Mouse mouse = { - .zoomSpeed = 0.10f, - .minZoom = 5.0f, - .maxZoom = 10.0f - }; - - // Update & Render - while (!WindowShouldClose()) - { - // Update - UpdateMusicStream(music); - - UpdateTileSpriteBounds(&floor, &camera); - - UpdateMouse(&mouse, &camera); - - if (mouse.leftButton) { - AddObjectToArray(&flowers, flowers.prototype, mouse.worldPosition); - } - - UpdateVectorOnInput(&player.physics.direction); - Move(&player.physics.position, &player.physics.direction, &player.physics.speed); - UpdateSpriteRotation(&player.sprite, &player.physics.direction); - UpdateSpriteDestRec(&player.sprite, &player.physics.position); - UpdateAnimation(&player.animation, GetFrameTime()); - UpdateSpriteSourceRec(&player.sprite, &(Vector2){player.sprite.frameSize.x, player.sprite.frameSize.x * player.animation.currentFrame}); - - const float tolerance = 1.0f; - - if (bee1.flowerCount < 4){ - if (fabs(bee1.physics.position.x - bee1.target.position.x) < tolerance && - fabs(bee1.physics.position.y - bee1.target.position.y) < tolerance) { - bee1.target = *GetRandomObject(&flowers); - bee1.flowerCount++; - } else { - Move(&bee1.physics.position, &bee1.physics.direction, &bee1.physics.speed); - UpdateSpriteRotation(&bee1.sprite, &bee1.physics.direction); - bee1.physics.direction = GetDirectionToObject(&bee1.target, bee1.physics.position); - } - } else { - bee1.target = hive; - if (fabs(bee1.physics.position.x - bee1.target.position.x) < tolerance && - fabs(bee1.physics.position.y - bee1.target.position.y) < tolerance) { - bee1.physics.speed = 0.0f; - } else { - Move(&bee1.physics.position, &bee1.physics.direction, &bee1.physics.speed); - UpdateSpriteRotation(&bee1.sprite, &bee1.physics.direction); - bee1.physics.direction = GetDirectionToObject(&bee1.target, bee1.physics.position); - } - } - - UpdateSpriteDestRec(&bee1.sprite, &bee1.physics.position); - UpdateAnimation(&bee1.animation, GetFrameTime()); - UpdateSpriteSourceRec(&bee1.sprite, &(Vector2){bee1.sprite.frameSize.x, bee1.sprite.frameSize.x * bee1.animation.currentFrame}); - - UpdateCamera2DTarget(&camera, &player.physics.position, 5.0f); - - if (mouse.wheelMove != 0) - { - UpdateCamera2DZoom(&camera, &mouse.scaleFactor, &mouse.minZoom, &mouse.maxZoom); - } - - // Render - BeginDrawing(); - ClearBackground(BLACK); - BeginMode2D(camera); - RenderTileSprite(&floor); - RenderSprite(&hive.sprite); - RenderObjectArray(&flowers); - RenderSprite(&bee1.sprite); - RenderSprite(&player.sprite); - EndMode2D(); - DrawFPS(10,10); - EndDrawing(); - } - // Unload - UnloadTexture(floorTexture); - UnloadTexture(hiveTexture); - UnloadTexture(flowerTexture); - UnloadTexture(beeTexture); - UnloadMusicStream(music); - free(flowers.data); - // Close - CloseAudioDevice(); - CloseWindow(); - return 0; -} diff --git a/scripts/physics.h b/scripts/physics.h deleted file mode 100644 index 18e9db5..0000000 --- a/scripts/physics.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef PHYSICS_H -#define PHYSICS_H -#include -#include - -typedef struct { - Vector2 position; - Vector2 direction; - float speed; -} Physics; - -Vector2 GetVelocity(Vector2 *direction, float *speed){ - return Vector2Scale(*direction, *speed * GetFrameTime()); -} - -void Move(Vector2 *position, Vector2 *direction, float *speed) { - *position = Vector2Add(*position, GetVelocity(direction, speed)); -} - -#endif // PHYSICS_H diff --git a/scripts/tilesprite.h b/scripts/tilesprite.h deleted file mode 100644 index 82bc32c..0000000 --- a/scripts/tilesprite.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef TILESPRITE_H -#define TILESPRITE_H -#include -#include "sprite.h" - -typedef struct { - Sprite sprite; - Rectangle bounds; -} TileSprite; - -void UpdateTileSpriteBounds(TileSprite *tileSprite, const Camera2D *camera){ - tileSprite->bounds.x = (int)((camera->target.x - (GetScreenWidth() / 2.0f / camera->zoom)) / tileSprite->sprite.frameSize.x) - 1; - tileSprite->bounds.width = (int)((camera->target.x + (GetScreenWidth() / 2.0f / camera->zoom)) / tileSprite->sprite.frameSize.x) + 1; - tileSprite->bounds.y = (int)((camera->target.y - (GetScreenHeight() / 2.0f / camera->zoom)) / tileSprite->sprite.frameSize.y) - 1; - tileSprite->bounds.height = (int)((camera->target.y + (GetScreenHeight() / 2.0f / camera->zoom)) / tileSprite->sprite.frameSize.y) + 1; -} - -void RenderTileSprite(TileSprite *tileSprite){ - for (float y = tileSprite->bounds.y; y <= tileSprite->bounds.height; y++) - { - for (float x = tileSprite->bounds.x; x <= tileSprite->bounds.width; x++) - { - Vector2 tilePosition = {x * tileSprite->sprite.frameSize.x, y * tileSprite->sprite.frameSize.y}; - UpdateSpriteDestRec(&tileSprite->sprite, &tilePosition); - RenderSprite(&tileSprite->sprite); - } - } -} - -#endif //TILESPRITE_H diff --git a/shaders/vignette.fs b/shaders/vignette.fs new file mode 100644 index 0000000..20e238a --- /dev/null +++ b/shaders/vignette.fs @@ -0,0 +1,19 @@ +#version 330 + +uniform sampler2D texture0; +uniform vec2 resolution; +uniform float strength; + +in vec2 fragTexCoord; +out vec4 finalColor; + +void main() +{ + vec2 uv = fragTexCoord; + vec2 position = uv - vec2(0.5); + float dist = length(position) * 2.0; + float vignette = 1.0 - strength * dist * dist; + vignette = clamp(vignette, 0.0, 1.0); + vec4 color = texture(texture0, uv); + finalColor = vec4(color.rgb * vignette, color.a); +} diff --git a/scripts/animation.h b/src/engine/animation.h similarity index 89% rename from scripts/animation.h rename to src/engine/animation.h index 6c4a7c9..99c8abf 100644 --- a/scripts/animation.h +++ b/src/engine/animation.h @@ -1,5 +1,5 @@ -#ifndef ANIMSPRITE_H -#define ANIMSPRITE_H +#ifndef ANIMATION_H +#define ANIMATION_H typedef struct { int currentFrame; @@ -25,4 +25,4 @@ void UpdateAnimation(Animation *animation, float deltaTime) { } } -#endif // ANIMSPRITE_H +#endif // ANIMATION_H diff --git a/src/engine/camera.h b/src/engine/camera.h new file mode 100644 index 0000000..91061f7 --- /dev/null +++ b/src/engine/camera.h @@ -0,0 +1,29 @@ +#ifndef CAMERA_H +#define CAMERA_H +#include "input.h" + +Camera2D CreateCamera(int screenWidth, int screenHeight, Vector2 playerPosition, float initZoom){ + return (Camera2D){ + .offset = (Vector2){screenWidth / 2.0f, screenHeight / 2.0f}, + .target = playerPosition, + .rotation = 0.0f, + .zoom = initZoom + }; +} + +void UpdateCameraTarget(Camera2D *camera, Vector2 *position, const float smoothness){ + camera->target = Vector2Lerp(camera->target, *position, smoothness * GetFrameTime()); +} + +void UpdateCameraZoom(Camera2D *camera, const float *scaleFactor, const float *minZoom, const float *maxZoom){ + float targetZoom = Clamp(camera->zoom * *scaleFactor, *minZoom, *maxZoom); + camera->zoom = Lerp(camera->zoom, targetZoom, 0.1f); +} + +void UpdateCamera2D(Camera2D* camera, Vector2* position, Mouse* mouse){ + UpdateCameraTarget(camera, position, 5.0f); + UpdateCameraZoom(camera, &mouse->scaleFactor, &mouse->minZoom, &mouse->maxZoom); +} + + +#endif // CAMERA_H diff --git a/src/engine/gui.h b/src/engine/gui.h new file mode 100644 index 0000000..49bba2e --- /dev/null +++ b/src/engine/gui.h @@ -0,0 +1,29 @@ +#ifndef GUI_H +#define GUI_H + +#define RAYGUI_IMPLEMENTATION +#include "../include/raygui.h" + +typedef struct +{ + Rectangle rec; + const char *text; +} Button; + +void initButton(Button *b, const char *text, int buttonWidth, int buttonHeight, int buttonPosX, int buttonPosY) +{ + b->rec = (Rectangle){buttonPosX - buttonWidth / 2, buttonPosY - buttonHeight / 2, buttonWidth, buttonHeight}; + b->text = text; +} + +int isButtonClicked(Button *b) +{ + return (CheckCollisionPointRec(GetMousePosition(), b->rec) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON)); +} + +void renderButton(Button *b) +{ + GuiButton(b->rec, b->text); +} + +#endif // GUI_H diff --git a/scripts/input.h b/src/engine/input.h similarity index 57% rename from scripts/input.h rename to src/engine/input.h index 9d93948..5683c77 100644 --- a/scripts/input.h +++ b/src/engine/input.h @@ -1,6 +1,5 @@ #ifndef INPUT_H #define INPUT_H -#include typedef struct { Vector2 worldPosition; @@ -13,6 +12,14 @@ typedef struct { bool rightButton; } Mouse; +Mouse CreateMouse(float zoomSpeed, float minZoom, float maxZoom){ + return (Mouse){ + .zoomSpeed = zoomSpeed, + .minZoom = minZoom, + .maxZoom = maxZoom + }; +} + void UpdateMouse(Mouse *mouse, Camera2D *camera) { mouse->worldPosition = GetScreenToWorld2D(GetMousePosition(), *camera); mouse->leftButton = IsMouseButtonDown(MOUSE_LEFT_BUTTON); @@ -28,13 +35,14 @@ void UpdateMouse(Mouse *mouse, Camera2D *camera) { } } -void UpdateVectorOnInput(Vector2 *vector){ - *vector = (Vector2){0.0f, 0.0f}; - if (IsKeyDown(KEY_RIGHT) || IsKeyDown(KEY_D)){ vector->x += 1.0f; } - if (IsKeyDown(KEY_LEFT) || IsKeyDown(KEY_A)){ vector->x -= 1.0f; } - if (IsKeyDown(KEY_DOWN) || IsKeyDown(KEY_S)){ vector->y += 1.0f; } - if (IsKeyDown(KEY_UP) || IsKeyDown(KEY_W)){ vector->y -= 1.0f; } - if (Vector2Length(*vector) > 0.0f) { *vector = Vector2Normalize(*vector); } +Vector2 GetDirectionVector(void){ + Vector2 vector = {.x = 0.0f, .y = 0.0f}; + if (IsKeyDown(KEY_RIGHT) || IsKeyDown(KEY_D)){vector.x += 1.0f; } + if (IsKeyDown(KEY_LEFT) || IsKeyDown(KEY_A)){ vector.x -= 1.0f; } + if (IsKeyDown(KEY_DOWN) || IsKeyDown(KEY_S)){ vector.y += 1.0f; } + if (IsKeyDown(KEY_UP) || IsKeyDown(KEY_W)){ vector.y -= 1.0f; } + if (Vector2Length(vector) > 0.0f) {vector = Vector2Normalize(vector); } + return vector; } #endif //INPUT_H diff --git a/src/engine/musicmanager.h b/src/engine/musicmanager.h new file mode 100644 index 0000000..2dc18aa --- /dev/null +++ b/src/engine/musicmanager.h @@ -0,0 +1,23 @@ +#ifndef MUSICMANAGER_H +#define MUSICMANAGER_H + +typedef struct { + Music music; + bool playing; +} MyMusic; + +MyMusic CreateMusic(char* musicPath){ + MyMusic music = { + .music = LoadMusicStream(musicPath), + .playing = 0 + }; + PlayMusicStream(music.music); + return music; +} + +void UpdateMusic(MyMusic* music){ + UpdateMusicStream(music->music); +} + +#endif // MUSICMANAGER_H + diff --git a/scripts/object.h b/src/engine/object.h similarity index 89% rename from scripts/object.h rename to src/engine/object.h index 41753f5..73d5a03 100644 --- a/scripts/object.h +++ b/src/engine/object.h @@ -1,9 +1,5 @@ #ifndef OBJECT_H #define OBJECT_H -#include -#include -#include -#include #include "sprite.h" #include "vector.h" @@ -22,13 +18,13 @@ typedef struct { ObjectArray CreateObjectArray(const Object *prototype, const size_t count) { ObjectArray objects = {0}; - if (count <= 0) { + if (count == 0) { printf("Objects size must be greater than 0.\n"); return objects; } objects.count = count; - objects.data = malloc(count * sizeof(Object)); + objects.data = (Object* )malloc(count * sizeof(Object)); if (!objects.data) { printf("Memory allocation of objects failed.\n"); @@ -45,14 +41,14 @@ ObjectArray CreateObjectArray(const Object *prototype, const size_t count) { } Object* GetRandomObject(ObjectArray *objects){ - if (objects->count == 0) { + if (objects->count == 0 || objects->data == NULL) { return NULL; } return &objects->data[GetRandomValue(0, (int)objects->count-1)]; } void AddObjectToArray(ObjectArray *objects, const Object *prototype, Vector2 position) { - Object *newData = realloc(objects->data, (objects->count + 1) * sizeof(Object)); + Object *newData = (Object* )realloc(objects->data, (objects->count + 1) * sizeof(Object)); if (newData) { objects->data = newData; objects->data[objects->count] = *prototype; @@ -100,6 +96,8 @@ void SwapAndPopObjectsArrayOnRecCollision(ObjectArray *objects, const Rectangle i--; } } + objects->data = (Object*)realloc(objects->data, objects->count * sizeof(Object)); + } void SwapAndPopObjectsArrayOnPointCollision(ObjectArray *objects, const Vector2 point){ @@ -115,6 +113,7 @@ void SwapAndPopObjectsArrayOnPointCollision(ObjectArray *objects, const Vector2 i--; } } + objects->data = (Object*)realloc(objects->data, objects->count * sizeof(Object)); } Vector2 GetDirectionToObject(Object *object, Vector2 position){ diff --git a/src/engine/physics.h b/src/engine/physics.h new file mode 100644 index 0000000..94d2e85 --- /dev/null +++ b/src/engine/physics.h @@ -0,0 +1,33 @@ +#ifndef PHYSICS_H +#define PHYSICS_H + +typedef struct { + Vector2 position; + Vector2 direction; + Vector2 velocity; + float speed; +} Physics; + +void UpdatePhysicsDirection(Vector2 *direction, Vector2 vector){ + *direction = vector; +} + +void UpdatePhysicsVelocity(Vector2 *velocity, Vector2 *direction, float *speed){ + *velocity = Vector2Scale(*direction, *speed * GetFrameTime()); +} + +void UpdatePhysicsPosition(Vector2 *position, Vector2 *velocity) { + *position = Vector2Add(*position, *velocity); +} + +void UpdatePhysicsSpeed(float *speed, float *newSpeed){ + *speed = *newSpeed; +} + +void UpdatePhysics(Physics *physics, Vector2 target){ + UpdatePhysicsDirection(&physics->direction, target); + UpdatePhysicsVelocity(&physics->velocity, &physics->direction, &physics->speed); + UpdatePhysicsPosition(&physics->position, &physics->velocity); +} + +#endif // PHYSICS_H diff --git a/src/engine/screen.h b/src/engine/screen.h new file mode 100644 index 0000000..8c48788 --- /dev/null +++ b/src/engine/screen.h @@ -0,0 +1,10 @@ +#ifndef SCREEN_H +#define SCREEN_H + +typedef enum Screen { + LOGO = 0, + MENU, + GAMEPLAY +} Screen; + +#endif // SCREEN_H diff --git a/src/engine/settings.h b/src/engine/settings.h new file mode 100644 index 0000000..46a0266 --- /dev/null +++ b/src/engine/settings.h @@ -0,0 +1,10 @@ +#ifndef SETTINGS_H +#define SETTINGS_H + +typedef struct { + int screenWidth; + int screenHeight; + const char* name; +} Settings; + +#endif // SETTINGS_H diff --git a/src/engine/shader.h b/src/engine/shader.h new file mode 100644 index 0000000..40fb91d --- /dev/null +++ b/src/engine/shader.h @@ -0,0 +1,40 @@ +#ifndef SHADER_H +#define SHADER_H + +typedef struct { + Shader shader; + int resolutionLoc; + int strengthLoc; + float strength; +} VignetteShader; + +VignetteShader CreateShader(const char* shaderPath, float strength){ + VignetteShader vignetteShader = {0}; + vignetteShader.shader = LoadShader(NULL, shaderPath); + + if (vignetteShader.shader.id == 0) { + TraceLog(LOG_ERROR, "Failed to load shader: %s", shaderPath); + return vignetteShader; + } + + vignetteShader.strength = strength; + vignetteShader.resolutionLoc = GetShaderLocation(vignetteShader.shader, "resolution"); + vignetteShader.strengthLoc = GetShaderLocation(vignetteShader.shader, "strength"); + Vector2 resolution = { (float)GetScreenWidth(), (float)GetScreenHeight() }; + SetShaderValue(vignetteShader.shader, vignetteShader.resolutionLoc, &resolution, SHADER_UNIFORM_VEC2); + return vignetteShader; +} + +void UpdateShader(VignetteShader* vignetteShader){ + if (vignetteShader->shader.id == 0) return; + SetShaderValue(vignetteShader->shader, vignetteShader->strengthLoc, &vignetteShader->strength, SHADER_UNIFORM_FLOAT); + Vector2 resolution = { (float)GetScreenWidth(), (float)GetScreenHeight() }; + SetShaderValue(vignetteShader->shader, vignetteShader->resolutionLoc, &resolution, SHADER_UNIFORM_VEC2); +} + +void UnloadVignetteShader(VignetteShader* vignetteShader){ + if (vignetteShader->shader.id == 0) return; + UnloadShader(vignetteShader->shader); +} + +#endif // SHADER_H diff --git a/scripts/sprite.h b/src/engine/sprite.h similarity index 96% rename from scripts/sprite.h rename to src/engine/sprite.h index 6c60900..5fa1682 100644 --- a/scripts/sprite.h +++ b/src/engine/sprite.h @@ -1,7 +1,5 @@ #ifndef SPRITE_H #define SPRITE_H -#include -#include typedef struct { Texture2D texture; diff --git a/scripts/vector.h b/src/engine/vector.h similarity index 88% rename from scripts/vector.h rename to src/engine/vector.h index 8267718..dfb2056 100644 --- a/scripts/vector.h +++ b/src/engine/vector.h @@ -1,8 +1,5 @@ #ifndef VECTOR_H #define VECTOR_H -#include -#include -#include typedef struct { Vector2 *data; diff --git a/src/game/IDEAS.md b/src/game/IDEAS.md new file mode 100644 index 0000000..679f859 --- /dev/null +++ b/src/game/IDEAS.md @@ -0,0 +1,8 @@ +- Naturschuetzer in einem Brachland +- Jahreszeiten -> mehrere Generationen von Bienenstaemmen +- Kasten sauber machen + +- 1. Samen saehen +- 2. Zuckerwasser aufstellen +- 3. Kaesten aufstellen +- 4. Baueme pflanzen \ No newline at end of file diff --git a/src/game/bee.h b/src/game/bee.h new file mode 100644 index 0000000..e3b303e --- /dev/null +++ b/src/game/bee.h @@ -0,0 +1,72 @@ +#ifndef BEE_H +#define BEE_H +#include "../engine/sprite.h" +#include "../engine/animation.h" +#include "../engine/physics.h" +#include "../engine/object.h" + + +typedef struct { + Sprite sprite; + Animation animation; + Physics physics; + Object target; + Object hive; + int flowerCount; +} Bee; + +Bee CreateBee(Texture2D texture, float frameWidth, int maxFrame, int framesSpeed, Vector2 position, float speed, ObjectArray* target, Object* base){ + return (Bee){ + .sprite = { + .texture = texture, + .frameSize = {frameWidth, frameWidth}, + .sourceRec = {0.0f, 0.0f, frameWidth, frameWidth}, + .destRec = {0.0f, 0.0f, frameWidth, frameWidth}, + .origin = {frameWidth / 2, frameWidth / 2}, + .rotation = 0.0f, + .color = WHITE + }, + .animation = { + .currentFrame = 0, + .maxFrame = maxFrame, + .framesCounter = 0, + .framesSpeed = framesSpeed, + .animTimer = 0.0f + }, + .physics = { + .position = position, + .direction = (Vector2){0.0f,0.0f}, + .speed = speed + }, + .target = *GetRandomObject(target), + .hive = *base + }; +} + +void UpdateBee(Bee* bee, ObjectArray* flowers, Object hive){ + const float tolerance = 1.0f; + + if (bee->flowerCount < 4){ + if (fabs(bee->physics.position.x - bee->target.position.x) < tolerance && + fabs(bee->physics.position.y - bee->target.position.y) < tolerance) { + bee->target = *GetRandomObject(flowers); + bee->flowerCount++; + } else { + } + } else { + bee->target = hive; + if (fabs(bee->physics.position.x - bee->target.position.x) < tolerance && + fabs(bee->physics.position.y - bee->target.position.y) < tolerance) { + bee->physics.speed = 0.0f; + } else { + } + } + + UpdatePhysics(&bee->physics, GetDirectionToObject(&bee->target, bee->physics.position)); + UpdateSpriteRotation(&bee->sprite, &bee->physics.direction); + UpdateSpriteDestRec(&bee->sprite, &bee->physics.position); + UpdateAnimation(&bee->animation, GetFrameTime()); + UpdateSpriteSourceRec(&bee->sprite, &(Vector2){bee->sprite.frameSize.x, bee->sprite.frameSize.x * bee->animation.currentFrame}); +} + +#endif // BEE_H diff --git a/src/game/floor.h b/src/game/floor.h new file mode 100644 index 0000000..6945311 --- /dev/null +++ b/src/game/floor.h @@ -0,0 +1,44 @@ +#ifndef Floor_H +#define Floor_H +#include "../engine/sprite.h" + +typedef struct { + Sprite sprite; + Rectangle bounds; +} Floor; + +Floor CreateFloor(Texture2D texture, float textureWidth){ + return (Floor){ + .sprite = { + .texture = texture, + .frameSize = {textureWidth,textureWidth}, + .sourceRec = { 0.0f, 0.0f, textureWidth, textureWidth}, + .destRec = {0.0f, 0.0f, textureWidth, textureWidth}, + .origin = {textureWidth / 2, textureWidth / 2}, + .rotation = 0.0f, + .color = WHITE + }, + .bounds = {0.0f,0.0f,0.0f,0.0f} + }; +} + +void UpdateFloor(Floor *Floor, const Camera2D *camera){ + Floor->bounds.x = (int)((camera->target.x - (GetScreenWidth() / 2.0f / camera->zoom)) / Floor->sprite.frameSize.x) - 1; + Floor->bounds.width = (int)((camera->target.x + (GetScreenWidth() / 2.0f / camera->zoom)) / Floor->sprite.frameSize.x) + 1; + Floor->bounds.y = (int)((camera->target.y - (GetScreenHeight() / 2.0f / camera->zoom)) / Floor->sprite.frameSize.y) - 1; + Floor->bounds.height = (int)((camera->target.y + (GetScreenHeight() / 2.0f / camera->zoom)) / Floor->sprite.frameSize.y) + 1; +} + +void RenderFloor(Floor *Floor){ + for (int y = (int)Floor->bounds.y; y <= (int)Floor->bounds.height; y++) + { + for (int x = (int)Floor->bounds.x; x <= (int)Floor->bounds.width; x++) + { + Vector2 floorPosition = {x * Floor->sprite.frameSize.x, y * Floor->sprite.frameSize.y}; + UpdateSpriteDestRec(&Floor->sprite, &floorPosition); + RenderSprite(&Floor->sprite); + } + } +} + +#endif //Floor_H diff --git a/src/game/flowers.h b/src/game/flowers.h new file mode 100644 index 0000000..db64e8f --- /dev/null +++ b/src/game/flowers.h @@ -0,0 +1,29 @@ +#ifndef FLOWERS_H +#define FLOWERS_H + +#include "../engine/object.h" + +ObjectArray CreateFlowers(Texture2D texture,float frameWidth, float rotation, float fieldSize) { + ObjectArray flowers = CreateObjectArray(&(Object){ + .sprite = { + .texture = texture, + .sourceRec = {0.0f, 0.0f, frameWidth, frameWidth}, + .destRec = {0.0f, 0.0f, frameWidth, frameWidth}, + .origin = {frameWidth / 2, frameWidth / 2}, + .rotation = rotation, + .color = WHITE + }, + .position = {0.0f, 0.0f} + }, 10); + + if (!flowers.data) { + printf("Memory allocation failed.\n"); + exit(1); + } + + SetRandomPositionForObjectArray(&flowers, (Rectangle){-fieldSize, -fieldSize, fieldSize * 2, fieldSize * 2}); + + return flowers; +} + +#endif // FLOWERS_H diff --git a/src/game/game.h b/src/game/game.h new file mode 100644 index 0000000..961cce7 --- /dev/null +++ b/src/game/game.h @@ -0,0 +1,94 @@ +#ifndef GAME_H +#define GAME_H +#include "../engine/object.h" +#include "../engine/camera.h" +#include "../engine/input.h" +#include "../engine/shader.h" +#include "../engine/musicmanager.h" +#include "floor.h" +#include "player.h" +#include "bee.h" +#include "hive.h" +#include "flowers.h" + +typedef struct { + VignetteShader vignetteShader; + MyMusic ambient; + RenderTexture2D target; + Texture2D flowerTexture, beeTexture, floorTexture, hiveTexture; + Floor floor; + Object hive; + ObjectArray flowers; + Player player; + Bee bee1; + Camera2D camera; + Mouse mouse; +} GameState; + +void initGame(GameState* g){ + InitAudioDevice(); + + g->vignetteShader = CreateShader("shaders/vignette.fs", 0.3f); + + g->ambient = CreateMusic("assets/beez.mp3"); + + g->target = LoadRenderTexture(GetScreenWidth(), GetScreenHeight()); + + g->flowerTexture = LoadTexture("assets/flower.png"); + g->beeTexture = LoadTexture("assets/character_bee.png"); + g->floorTexture = LoadTexture("assets/grass.png"); + g->hiveTexture = LoadTexture("assets/hive.png"); + + g->floor = CreateFloor(g->floorTexture, 16.0f); + g->flowers = CreateFlowers(g->flowerTexture, 16.0f, 45.0f, 50.0f); + g->hive = CreateHive(g->hiveTexture, 32.0f); + g->player = CreatePlayer(g->beeTexture, 16.0f, 4, 10, g->hive.position, 50.0f); + g->bee1 = CreateBee(g->beeTexture, 16.0f, 4, 10, g->hive.position, 10.0f, &g->flowers, &g->hive); + + g->camera = CreateCamera(GetScreenWidth(), GetScreenHeight(), g->player.physics.position, 10.0f); + g->mouse = CreateMouse(0.10f, 5.0f, 10.0f); +} + +void updateGame(GameState* g){ + UpdateShader(&g->vignetteShader); + UpdateMusic(&g->ambient); + UpdateMouse(&g->mouse, &g->camera); + UpdateCamera2D(&g->camera, &g->player.physics.position, &g->mouse); + UpdateFloor(&g->floor, &g->camera); + UpdatePlayer(&g->player); + UpdateBee(&g->bee1, &g->flowers, g->hive); +} + +void renderGame(GameState* g){ + BeginTextureMode(g->target); + ClearBackground(BLACK); + BeginMode2D(g->camera); + RenderFloor(&g->floor); + RenderSprite(&g->hive.sprite); + RenderObjectArray(&g->flowers); + RenderSprite(&g->bee1.sprite); + RenderSprite(&g->player.sprite); + EndMode2D(); + EndTextureMode(); + BeginDrawing(); + ClearBackground(BLACK); + BeginShaderMode(g->vignetteShader.shader); + DrawTextureRec(g->target.texture, (Rectangle){ 0, 0, g->target.texture.width, -g->target.texture.height }, (Vector2){ 0, 0 }, WHITE); + EndShaderMode(); + DrawFPS(10, 10); + EndDrawing(); +} + +void cleanupGame(GameState* g){ + UnloadVignetteShader(&g->vignetteShader); + UnloadRenderTexture(g->target); + UnloadTexture(g->floorTexture); + UnloadTexture(g->hiveTexture); + UnloadTexture(g->flowerTexture); + UnloadTexture(g->beeTexture); + UnloadMusicStream(g->ambient.music); + free(g->flowers.data); + CloseAudioDevice(); +} + +#endif // GAME_H diff --git a/src/game/hive.h b/src/game/hive.h new file mode 100644 index 0000000..0d70ce5 --- /dev/null +++ b/src/game/hive.h @@ -0,0 +1,19 @@ +#ifndef HIVE_H +#define HIVE_H +#include "../engine/object.h" + +Object CreateHive(Texture2D texture, float frameWidth){ + return (Object) { + .sprite = { + .texture = texture, + .sourceRec = (Rectangle){0.0f, 0.0f, frameWidth, frameWidth}, + .destRec = (Rectangle){0.0f, 0.0f, frameWidth, frameWidth}, + .origin = (Vector2){frameWidth / 2, frameWidth / 2}, + .rotation = 0.0f, + .color = WHITE, + }, + .position = (Vector2){0.0f, 0.0f} + }; +} + +#endif // HIVE_H diff --git a/src/game/logo.h b/src/game/logo.h new file mode 100644 index 0000000..4b508d6 --- /dev/null +++ b/src/game/logo.h @@ -0,0 +1,110 @@ +#ifndef LOGO_H +#define LOGO_H + +typedef struct { + int frameCounter; + int positionX; + int positionY; + int lettersCount; + int topSideRecWidth; + int leftSideRecHeight; + int bottomSideRecWidth; + int rightSideRecHeight; + int state; + float alpha; +} LogoState; + +void initLogo(LogoState *l) { + SetTargetFPS(60); + + l->frameCounter = 0; + l->positionX = GetScreenWidth() / 2 - 128; + l->positionY = GetScreenHeight() / 2 - 128; + l->lettersCount = 0; + l->topSideRecWidth = 16; + l->leftSideRecHeight = 16; + l->bottomSideRecWidth = 16; + l->rightSideRecHeight = 16; + l->state = 0; + l->alpha = 1.0f; +} + +void updateLogo(LogoState *l, Screen *currentScreen) { + l->frameCounter++; // Increment the frame counter each frame + + if (l->state == 0) { // State 0: Small box blinking for 120 frames (2 seconds at 60 FPS) + if (l->frameCounter >= 120) { + l->state = 1; + l->frameCounter = 0; // Reset frame counter + } + } + else if (l->state == 1) { // State 1: Top and left bars growing + l->topSideRecWidth += 4; + l->leftSideRecHeight += 4; + + if (l->topSideRecWidth >= 256) { + l->state = 2; + l->frameCounter = 0; + } + } + else if (l->state == 2) { // State 2: Bottom and right bars growing + l->bottomSideRecWidth += 4; + l->rightSideRecHeight += 4; + + if (l->bottomSideRecWidth >= 256) { + l->state = 3; + l->frameCounter = 0; + } + } + else if (l->state == 3) { // State 3: Letters appearing + if (l->frameCounter % 12 == 0) { // Every 12 frames, one more letter appears + l->lettersCount++; + } + + if (l->lettersCount >= 10) { // Fade out animation + l->alpha -= 0.02f; + if (l->alpha <= 0.0f) { + l->alpha = 0.0f; + l->state = 4; + } + } + } + else if (l->state == 4) { // State 4: Transition to GAMEPLAY + SetTargetFPS(0); + *currentScreen = MENU; + } +} + +void renderLogo(const LogoState *l) { + BeginDrawing(); + ClearBackground(RAYWHITE); + + if (l->state == 0) { // Small box blinking + if ((l->frameCounter / 15) % 2 == 0) { // Blink every 15 frames + DrawRectangle(l->positionX, l->positionY, 16, 16, BLACK); + } + } + else if (l->state == 1) { // Top and left bars growing + DrawRectangle(l->positionX, l->positionY, l->topSideRecWidth, 16, BLACK); + DrawRectangle(l->positionX, l->positionY, 16, l->leftSideRecHeight, BLACK); + } + else if (l->state == 2) { // Bottom and right bars growing + DrawRectangle(l->positionX, l->positionY, l->topSideRecWidth, 16, BLACK); + DrawRectangle(l->positionX, l->positionY, 16, l->leftSideRecHeight, BLACK); + DrawRectangle(l->positionX + 240, l->positionY, 16, l->rightSideRecHeight, BLACK); + DrawRectangle(l->positionX, l->positionY + 240, l->bottomSideRecWidth, 16, BLACK); + } + else if (l->state == 3) { // Letters appearing + DrawRectangle(l->positionX, l->positionY, l->topSideRecWidth, 16, Fade(BLACK, l->alpha)); + DrawRectangle(l->positionX, l->positionY + 16, 16, l->leftSideRecHeight - 32, Fade(BLACK, l->alpha)); + DrawRectangle(l->positionX + 240, l->positionY + 16, 16, l->rightSideRecHeight - 32, Fade(BLACK, l->alpha)); + DrawRectangle(l->positionX, l->positionY + 240, l->bottomSideRecWidth, 16, Fade(BLACK, l->alpha)); + DrawRectangle(GetScreenWidth() / 2 - 112, GetScreenHeight() / 2 - 112, 224, 224, Fade(RAYWHITE, l->alpha)); + + DrawText(TextSubtext("raylib", 0, l->lettersCount), GetScreenWidth() / 2 - 44, GetScreenHeight() / 2 + 48, 50, Fade(BLACK, l->alpha)); + } + + EndDrawing(); +} + +#endif // LOGO_H diff --git a/src/game/menu.h b/src/game/menu.h new file mode 100644 index 0000000..e568fac --- /dev/null +++ b/src/game/menu.h @@ -0,0 +1,27 @@ +#ifndef MENU_H +#define MENU_H + +#include "../engine/gui.h" + +typedef struct { + Button startButton; +} MenuState; + +void initMenu(MenuState *t){ + initButton(&t->startButton, "Start Game", GetScreenWidth() / 10, GetScreenHeight() / 20, GetScreenWidth() / 2, GetScreenHeight() / 2); +} + +void updateMenu(MenuState *t, Screen *currentScreen){ + if (isButtonClicked(&t->startButton)) { + *currentScreen = GAMEPLAY; + } +} + +void renderMenu(MenuState *t){ + BeginDrawing(); + ClearBackground(WHITE); + renderButton(&t->startButton); + EndDrawing(); +} + +#endif // MENU_H diff --git a/src/game/player.h b/src/game/player.h new file mode 100644 index 0000000..9ba45be --- /dev/null +++ b/src/game/player.h @@ -0,0 +1,48 @@ +#ifndef PLAYER_H +#define PLAYER_H +#include "../engine/sprite.h" +#include "../engine/animation.h" +#include "../engine/physics.h" +#include "../engine/input.h" + +typedef struct { + Sprite sprite; + Animation animation; + Physics physics; +} Player; + +Player CreatePlayer(Texture2D texture, float frameWidth, int maxFrame, int framesSpeed, Vector2 startPosition, float speed){ + return (Player){ + .sprite = { + .texture = texture, + .frameSize = {frameWidth, frameWidth}, + .sourceRec = {0.0f, 0.0f, frameWidth, frameWidth}, + .destRec = {0.0f, 0.0f, frameWidth, frameWidth}, + .origin = {frameWidth / 2, frameWidth / 2}, + .rotation = 0.0f, + .color = WHITE + }, + .animation = { + .currentFrame = 0, + .maxFrame = maxFrame, + .framesCounter = 0, + .framesSpeed = framesSpeed, + .animTimer = 0.0f + }, + .physics = { + .position = startPosition, + .direction = (Vector2){0.0f,0.0f}, + .speed = speed + } + }; +} + +void UpdatePlayer(Player* player){ + UpdatePhysics(&player->physics, GetDirectionVector()); + UpdateSpriteRotation(&player->sprite, &player->physics.direction); + UpdateSpriteDestRec(&player->sprite, &player->physics.position); + UpdateAnimation(&player->animation, GetFrameTime()); + UpdateSpriteSourceRec(&player->sprite, &(Vector2){player->sprite.frameSize.x, player->sprite.frameSize.x * player->animation.currentFrame}); +} + +#endif // PLAYER_H diff --git a/src/include/raygui.h b/src/include/raygui.h new file mode 100644 index 0000000..39908db --- /dev/null +++ b/src/include/raygui.h @@ -0,0 +1,5928 @@ +/******************************************************************************************* +* +* raygui v4.5-dev - A simple and easy-to-use immediate-mode gui library +* +* DESCRIPTION: +* raygui is a tools-dev-focused immediate-mode-gui library based on raylib but also +* available as a standalone library, as long as input and drawing functions are provided. +* +* FEATURES: +* - Immediate-mode gui, minimal retained data +* - +25 controls provided (basic and advanced) +* - Styling system for colors, font and metrics +* - Icons supported, embedded as a 1-bit icons pack +* - Standalone mode option (custom input/graphics backend) +* - Multiple support tools provided for raygui development +* +* POSSIBLE IMPROVEMENTS: +* - Better standalone mode API for easy plug of custom backends +* - Externalize required inputs, allow user easier customization +* +* LIMITATIONS: +* - No editable multi-line word-wraped text box supported +* - No auto-layout mechanism, up to the user to define controls position and size +* - Standalone mode requires library modification and some user work to plug another backend +* +* NOTES: +* - WARNING: GuiLoadStyle() and GuiLoadStyle{Custom}() functions, allocate memory for +* font atlas recs and glyphs, freeing that memory is (usually) up to the user, +* no unload function is explicitly provided... but note that GuiLoadStyleDefault() unloads +* by default any previously loaded font (texture, recs, glyphs). +* - Global UI alpha (guiAlpha) is applied inside GuiDrawRectangle() and GuiDrawText() functions +* +* CONTROLS PROVIDED: +* # Container/separators Controls +* - WindowBox --> StatusBar, Panel +* - GroupBox --> Line +* - Line +* - Panel --> StatusBar +* - ScrollPanel --> StatusBar +* - TabBar --> Button +* +* # Basic Controls +* - Label +* - LabelButton --> Label +* - Button +* - Toggle +* - ToggleGroup --> Toggle +* - ToggleSlider +* - CheckBox +* - ComboBox +* - DropdownBox +* - TextBox +* - ValueBox --> TextBox +* - Spinner --> Button, ValueBox +* - Slider +* - SliderBar --> Slider +* - ProgressBar +* - StatusBar +* - DummyRec +* - Grid +* +* # Advance Controls +* - ListView +* - ColorPicker --> ColorPanel, ColorBarHue +* - MessageBox --> Window, Label, Button +* - TextInputBox --> Window, Label, TextBox, Button +* +* It also provides a set of functions for styling the controls based on its properties (size, color). +* +* +* RAYGUI STYLE (guiStyle): +* raygui uses a global data array for all gui style properties (allocated on data segment by default), +* when a new style is loaded, it is loaded over the global style... but a default gui style could always be +* recovered with GuiLoadStyleDefault() function, that overwrites the current style to the default one +* +* The global style array size is fixed and depends on the number of controls and properties: +* +* static unsigned int guiStyle[RAYGUI_MAX_CONTROLS*(RAYGUI_MAX_PROPS_BASE + RAYGUI_MAX_PROPS_EXTENDED)]; +* +* guiStyle size is by default: 16*(16 + 8) = 384*4 = 1536 bytes = 1.5 KB +* +* Note that the first set of BASE properties (by default guiStyle[0..15]) belong to the generic style +* used for all controls, when any of those base values is set, it is automatically populated to all +* controls, so, specific control values overwriting generic style should be set after base values. +* +* After the first BASE set we have the EXTENDED properties (by default guiStyle[16..23]), those +* properties are actually common to all controls and can not be overwritten individually (like BASE ones) +* Some of those properties are: TEXT_SIZE, TEXT_SPACING, LINE_COLOR, BACKGROUND_COLOR +* +* Custom control properties can be defined using the EXTENDED properties for each independent control. +* +* TOOL: rGuiStyler is a visual tool to customize raygui style: github.com/raysan5/rguistyler +* +* +* RAYGUI ICONS (guiIcons): +* raygui could use a global array containing icons data (allocated on data segment by default), +* a custom icons set could be loaded over this array using GuiLoadIcons(), but loaded icons set +* must be same RAYGUI_ICON_SIZE and no more than RAYGUI_ICON_MAX_ICONS will be loaded +* +* Every icon is codified in binary form, using 1 bit per pixel, so, every 16x16 icon +* requires 8 integers (16*16/32) to be stored in memory. +* +* When the icon is draw, actually one quad per pixel is drawn if the bit for that pixel is set. +* +* The global icons array size is fixed and depends on the number of icons and size: +* +* static unsigned int guiIcons[RAYGUI_ICON_MAX_ICONS*RAYGUI_ICON_DATA_ELEMENTS]; +* +* guiIcons size is by default: 256*(16*16/32) = 2048*4 = 8192 bytes = 8 KB +* +* TOOL: rGuiIcons is a visual tool to customize/create raygui icons: github.com/raysan5/rguiicons +* +* RAYGUI LAYOUT: +* raygui currently does not provide an auto-layout mechanism like other libraries, +* layouts must be defined manually on controls drawing, providing the right bounds Rectangle for it. +* +* TOOL: rGuiLayout is a visual tool to create raygui layouts: github.com/raysan5/rguilayout +* +* CONFIGURATION: +* #define RAYGUI_IMPLEMENTATION +* Generates the implementation of the library into the included file. +* If not defined, the library is in header only mode and can be included in other headers +* or source files without problems. But only ONE file should hold the implementation. +* +* #define RAYGUI_STANDALONE +* Avoid raylib.h header inclusion in this file. Data types defined on raylib are defined +* internally in the library and input management and drawing functions must be provided by +* the user (check library implementation for further details). +* +* #define RAYGUI_NO_ICONS +* Avoid including embedded ricons data (256 icons, 16x16 pixels, 1-bit per pixel, 2KB) +* +* #define RAYGUI_CUSTOM_ICONS +* Includes custom ricons.h header defining a set of custom icons, +* this file can be generated using rGuiIcons tool +* +* #define RAYGUI_DEBUG_RECS_BOUNDS +* Draw control bounds rectangles for debug +* +* #define RAYGUI_DEBUG_TEXT_BOUNDS +* Draw text bounds rectangles for debug +* +* VERSIONS HISTORY: +* 5.0-dev (2025) Current dev version... +* ADDED: guiControlExclusiveMode and guiControlExclusiveRec for exclusive modes +* ADDED: GuiValueBoxFloat() +* ADDED: GuiDropdonwBox() properties: DROPDOWN_ARROW_HIDDEN, DROPDOWN_ROLL_UP +* ADDED: GuiListView() property: LIST_ITEMS_BORDER_WIDTH +* ADDED: GuiLoadIconsFromMemory() +* ADDED: Multiple new icons +* REMOVED: GuiSpinner() from controls list, using BUTTON + VALUEBOX properties +* REVIEWED: Controls using text labels to use LABEL properties +* REVIEWED: Replaced sprintf() by snprintf() for more safety +* REVIEWED: GuiTabBar(), close tab with mouse middle button +* REVIEWED: GuiScrollPanel(), scroll speed proportional to content +* REVIEWED: GuiDropdownBox(), support roll up and hidden arrow +* REVIEWED: GuiTextBox(), cursor position initialization +* REVIEWED: GuiSliderPro(), control value change check +* REVIEWED: GuiGrid(), simplified implementation +* REVIEWED: GuiIconText(), increase buffer size and reviewed padding +* REVIEWED: GuiDrawText(), improved wrap mode drawing +* REVIEWED: GuiScrollBar(), minor tweaks +* REVIEWED: GuiProgressBar(), improved borders computing +* REVIEWED: GuiTextBox(), multiple improvements: autocursor and more +* REVIEWED: Functions descriptions, removed wrong return value reference +* REDESIGNED: GuiColorPanel(), improved HSV <-> RGBA convertion +* +* 4.0 (12-Sep-2023) ADDED: GuiToggleSlider() +* ADDED: GuiColorPickerHSV() and GuiColorPanelHSV() +* ADDED: Multiple new icons, mostly compiler related +* ADDED: New DEFAULT properties: TEXT_LINE_SPACING, TEXT_ALIGNMENT_VERTICAL, TEXT_WRAP_MODE +* ADDED: New enum values: GuiTextAlignment, GuiTextAlignmentVertical, GuiTextWrapMode +* ADDED: Support loading styles with custom font charset from external file +* REDESIGNED: GuiTextBox(), support mouse cursor positioning +* REDESIGNED: GuiDrawText(), support multiline and word-wrap modes (read only) +* REDESIGNED: GuiProgressBar() to be more visual, progress affects border color +* REDESIGNED: Global alpha consideration moved to GuiDrawRectangle() and GuiDrawText() +* REDESIGNED: GuiScrollPanel(), get parameters by reference and return result value +* REDESIGNED: GuiToggleGroup(), get parameters by reference and return result value +* REDESIGNED: GuiComboBox(), get parameters by reference and return result value +* REDESIGNED: GuiCheckBox(), get parameters by reference and return result value +* REDESIGNED: GuiSlider(), get parameters by reference and return result value +* REDESIGNED: GuiSliderBar(), get parameters by reference and return result value +* REDESIGNED: GuiProgressBar(), get parameters by reference and return result value +* REDESIGNED: GuiListView(), get parameters by reference and return result value +* REDESIGNED: GuiColorPicker(), get parameters by reference and return result value +* REDESIGNED: GuiColorPanel(), get parameters by reference and return result value +* REDESIGNED: GuiColorBarAlpha(), get parameters by reference and return result value +* REDESIGNED: GuiColorBarHue(), get parameters by reference and return result value +* REDESIGNED: GuiGrid(), get parameters by reference and return result value +* REDESIGNED: GuiGrid(), added extra parameter +* REDESIGNED: GuiListViewEx(), change parameters order +* REDESIGNED: All controls return result as int value +* REVIEWED: GuiScrollPanel() to avoid smallish scroll-bars +* REVIEWED: All examples and specially controls_test_suite +* RENAMED: gui_file_dialog module to gui_window_file_dialog +* UPDATED: All styles to include ISO-8859-15 charset (as much as possible) +* +* 3.6 (10-May-2023) ADDED: New icon: SAND_TIMER +* ADDED: GuiLoadStyleFromMemory() (binary only) +* REVIEWED: GuiScrollBar() horizontal movement key +* REVIEWED: GuiTextBox() crash on cursor movement +* REVIEWED: GuiTextBox(), additional inputs support +* REVIEWED: GuiLabelButton(), avoid text cut +* REVIEWED: GuiTextInputBox(), password input +* REVIEWED: Local GetCodepointNext(), aligned with raylib +* REDESIGNED: GuiSlider*()/GuiScrollBar() to support out-of-bounds +* +* 3.5 (20-Apr-2023) ADDED: GuiTabBar(), based on GuiToggle() +* ADDED: Helper functions to split text in separate lines +* ADDED: Multiple new icons, useful for code editing tools +* REMOVED: Unneeded icon editing functions +* REMOVED: GuiTextBoxMulti(), very limited and broken +* REMOVED: MeasureTextEx() dependency, logic directly implemented +* REMOVED: DrawTextEx() dependency, logic directly implemented +* REVIEWED: GuiScrollBar(), improve mouse-click behaviour +* REVIEWED: Library header info, more info, better organized +* REDESIGNED: GuiTextBox() to support cursor movement +* REDESIGNED: GuiDrawText() to divide drawing by lines +* +* 3.2 (22-May-2022) RENAMED: Some enum values, for unification, avoiding prefixes +* REMOVED: GuiScrollBar(), only internal +* REDESIGNED: GuiPanel() to support text parameter +* REDESIGNED: GuiScrollPanel() to support text parameter +* REDESIGNED: GuiColorPicker() to support text parameter +* REDESIGNED: GuiColorPanel() to support text parameter +* REDESIGNED: GuiColorBarAlpha() to support text parameter +* REDESIGNED: GuiColorBarHue() to support text parameter +* REDESIGNED: GuiTextInputBox() to support password +* +* 3.1 (12-Jan-2022) REVIEWED: Default style for consistency (aligned with rGuiLayout v2.5 tool) +* REVIEWED: GuiLoadStyle() to support compressed font atlas image data and unload previous textures +* REVIEWED: External icons usage logic +* REVIEWED: GuiLine() for centered alignment when including text +* RENAMED: Multiple controls properties definitions to prepend RAYGUI_ +* RENAMED: RICON_ references to RAYGUI_ICON_ for library consistency +* Projects updated and multiple tweaks +* +* 3.0 (04-Nov-2021) Integrated ricons data to avoid external file +* REDESIGNED: GuiTextBoxMulti() +* REMOVED: GuiImageButton*() +* Multiple minor tweaks and bugs corrected +* +* 2.9 (17-Mar-2021) REMOVED: Tooltip API +* 2.8 (03-May-2020) Centralized rectangles drawing to GuiDrawRectangle() +* 2.7 (20-Feb-2020) ADDED: Possible tooltips API +* 2.6 (09-Sep-2019) ADDED: GuiTextInputBox() +* REDESIGNED: GuiListView*(), GuiDropdownBox(), GuiSlider*(), GuiProgressBar(), GuiMessageBox() +* REVIEWED: GuiTextBox(), GuiSpinner(), GuiValueBox(), GuiLoadStyle() +* Replaced property INNER_PADDING by TEXT_PADDING, renamed some properties +* ADDED: 8 new custom styles ready to use +* Multiple minor tweaks and bugs corrected +* +* 2.5 (28-May-2019) Implemented extended GuiTextBox(), GuiValueBox(), GuiSpinner() +* 2.3 (29-Apr-2019) ADDED: rIcons auxiliar library and support for it, multiple controls reviewed +* Refactor all controls drawing mechanism to use control state +* 2.2 (05-Feb-2019) ADDED: GuiScrollBar(), GuiScrollPanel(), reviewed GuiListView(), removed Gui*Ex() controls +* 2.1 (26-Dec-2018) REDESIGNED: GuiCheckBox(), GuiComboBox(), GuiDropdownBox(), GuiToggleGroup() > Use combined text string +* REDESIGNED: Style system (breaking change) +* 2.0 (08-Nov-2018) ADDED: Support controls guiLock and custom fonts +* REVIEWED: GuiComboBox(), GuiListView()... +* 1.9 (09-Oct-2018) REVIEWED: GuiGrid(), GuiTextBox(), GuiTextBoxMulti(), GuiValueBox()... +* 1.8 (01-May-2018) Lot of rework and redesign to align with rGuiStyler and rGuiLayout +* 1.5 (21-Jun-2017) Working in an improved styles system +* 1.4 (15-Jun-2017) Rewritten all GUI functions (removed useless ones) +* 1.3 (12-Jun-2017) Complete redesign of style system +* 1.1 (01-Jun-2017) Complete review of the library +* 1.0 (07-Jun-2016) Converted to header-only by Ramon Santamaria. +* 0.9 (07-Mar-2016) Reviewed and tested by Albert Martos, Ian Eito, Sergio Martinez and Ramon Santamaria. +* 0.8 (27-Aug-2015) Initial release. Implemented by Kevin Gato, Daniel Nicolás and Ramon Santamaria. +* +* DEPENDENCIES: +* raylib 5.0 - Inputs reading (keyboard/mouse), shapes drawing, font loading and text drawing +* +* STANDALONE MODE: +* By default raygui depends on raylib mostly for the inputs and the drawing functionality but that dependency can be disabled +* with the config flag RAYGUI_STANDALONE. In that case is up to the user to provide another backend to cover library needs. +* +* The following functions should be redefined for a custom backend: +* +* - Vector2 GetMousePosition(void); +* - float GetMouseWheelMove(void); +* - bool IsMouseButtonDown(int button); +* - bool IsMouseButtonPressed(int button); +* - bool IsMouseButtonReleased(int button); +* - bool IsKeyDown(int key); +* - bool IsKeyPressed(int key); +* - int GetCharPressed(void); // -- GuiTextBox(), GuiValueBox() +* +* - void DrawRectangle(int x, int y, int width, int height, Color color); // -- GuiDrawRectangle() +* - void DrawRectangleGradientEx(Rectangle rec, Color col1, Color col2, Color col3, Color col4); // -- GuiColorPicker() +* +* - Font GetFontDefault(void); // -- GuiLoadStyleDefault() +* - Font LoadFontEx(const char *fileName, int fontSize, int *codepoints, int codepointCount); // -- GuiLoadStyle() +* - Texture2D LoadTextureFromImage(Image image); // -- GuiLoadStyle(), required to load texture from embedded font atlas image +* - void SetShapesTexture(Texture2D tex, Rectangle rec); // -- GuiLoadStyle(), required to set shapes rec to font white rec (optimization) +* - char *LoadFileText(const char *fileName); // -- GuiLoadStyle(), required to load charset data +* - void UnloadFileText(char *text); // -- GuiLoadStyle(), required to unload charset data +* - const char *GetDirectoryPath(const char *filePath); // -- GuiLoadStyle(), required to find charset/font file from text .rgs +* - int *LoadCodepoints(const char *text, int *count); // -- GuiLoadStyle(), required to load required font codepoints list +* - void UnloadCodepoints(int *codepoints); // -- GuiLoadStyle(), required to unload codepoints list +* - unsigned char *DecompressData(const unsigned char *compData, int compDataSize, int *dataSize); // -- GuiLoadStyle() +* +* CONTRIBUTORS: +* Ramon Santamaria: Supervision, review, redesign, update and maintenance +* Vlad Adrian: Complete rewrite of GuiTextBox() to support extended features (2019) +* Sergio Martinez: Review, testing (2015) and redesign of multiple controls (2018) +* Adria Arranz: Testing and implementation of additional controls (2018) +* Jordi Jorba: Testing and implementation of additional controls (2018) +* Albert Martos: Review and testing of the library (2015) +* Ian Eito: Review and testing of the library (2015) +* Kevin Gato: Initial implementation of basic components (2014) +* Daniel Nicolas: Initial implementation of basic components (2014) +* +* +* LICENSE: zlib/libpng +* +* Copyright (c) 2014-2025 Ramon Santamaria (@raysan5) +* +* This software is provided "as-is", without any express or implied warranty. In no event +* will the authors be held liable for any damages arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, including commercial +* applications, and to alter it and redistribute it freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not claim that you +* wrote the original software. If you use this software in a product, an acknowledgment +* in the product documentation would be appreciated but is not required. +* +* 2. Altered source versions must be plainly marked as such, and must not be misrepresented +* as being the original software. +* +* 3. This notice may not be removed or altered from any source distribution. +* +**********************************************************************************************/ + +#ifndef RAYGUI_H +#define RAYGUI_H + +#define RAYGUI_VERSION_MAJOR 4 +#define RAYGUI_VERSION_MINOR 5 +#define RAYGUI_VERSION_PATCH 0 +#define RAYGUI_VERSION "5.0-dev" + +#if !defined(RAYGUI_STANDALONE) + #include "raylib.h" +#endif + +// Function specifiers in case library is build/used as a shared library (Windows) +// NOTE: Microsoft specifiers to tell compiler that symbols are imported/exported from a .dll +#if defined(_WIN32) + #if defined(BUILD_LIBTYPE_SHARED) + #define RAYGUIAPI __declspec(dllexport) // We are building the library as a Win32 shared library (.dll) + #elif defined(USE_LIBTYPE_SHARED) + #define RAYGUIAPI __declspec(dllimport) // We are using the library as a Win32 shared library (.dll) + #endif +#endif + +// Function specifiers definition +#ifndef RAYGUIAPI + #define RAYGUIAPI // Functions defined as 'extern' by default (implicit specifiers) +#endif + +//---------------------------------------------------------------------------------- +// Defines and Macros +//---------------------------------------------------------------------------------- +// Allow custom memory allocators +#ifndef RAYGUI_MALLOC + #define RAYGUI_MALLOC(sz) malloc(sz) +#endif +#ifndef RAYGUI_CALLOC + #define RAYGUI_CALLOC(n,sz) calloc(n,sz) +#endif +#ifndef RAYGUI_FREE + #define RAYGUI_FREE(p) free(p) +#endif + +// Simple log system to avoid printf() calls if required +// NOTE: Avoiding those calls, also avoids const strings memory usage +#define RAYGUI_SUPPORT_LOG_INFO +#if defined(RAYGUI_SUPPORT_LOG_INFO) + #define RAYGUI_LOG(...) printf(__VA_ARGS__) +#else + #define RAYGUI_LOG(...) +#endif + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +// NOTE: Some types are required for RAYGUI_STANDALONE usage +//---------------------------------------------------------------------------------- +#if defined(RAYGUI_STANDALONE) + #ifndef __cplusplus + // Boolean type + #ifndef true + typedef enum { false, true } bool; + #endif + #endif + + // Vector2 type + typedef struct Vector2 { + float x; + float y; + } Vector2; + + // Vector3 type // -- ConvertHSVtoRGB(), ConvertRGBtoHSV() + typedef struct Vector3 { + float x; + float y; + float z; + } Vector3; + + // Color type, RGBA (32bit) + typedef struct Color { + unsigned char r; + unsigned char g; + unsigned char b; + unsigned char a; + } Color; + + // Rectangle type + typedef struct Rectangle { + float x; + float y; + float width; + float height; + } Rectangle; + + // TODO: Texture2D type is very coupled to raylib, required by Font type + // It should be redesigned to be provided by user + typedef struct Texture2D { + unsigned int id; // OpenGL texture id + int width; // Texture base width + int height; // Texture base height + int mipmaps; // Mipmap levels, 1 by default + int format; // Data format (PixelFormat type) + } Texture2D; + + // Image, pixel data stored in CPU memory (RAM) + typedef struct Image { + void *data; // Image raw data + int width; // Image base width + int height; // Image base height + int mipmaps; // Mipmap levels, 1 by default + int format; // Data format (PixelFormat type) + } Image; + + // GlyphInfo, font characters glyphs info + typedef struct GlyphInfo { + int value; // Character value (Unicode) + int offsetX; // Character offset X when drawing + int offsetY; // Character offset Y when drawing + int advanceX; // Character advance position X + Image image; // Character image data + } GlyphInfo; + + // TODO: Font type is very coupled to raylib, mostly required by GuiLoadStyle() + // It should be redesigned to be provided by user + typedef struct Font { + int baseSize; // Base size (default chars height) + int glyphCount; // Number of glyph characters + int glyphPadding; // Padding around the glyph characters + Texture2D texture; // Texture atlas containing the glyphs + Rectangle *recs; // Rectangles in texture for the glyphs + GlyphInfo *glyphs; // Glyphs info data + } Font; +#endif + +// Style property +// NOTE: Used when exporting style as code for convenience +typedef struct GuiStyleProp { + unsigned short controlId; // Control identifier + unsigned short propertyId; // Property identifier + int propertyValue; // Property value +} GuiStyleProp; + +/* +// Controls text style -NOT USED- +// NOTE: Text style is defined by control +typedef struct GuiTextStyle { + unsigned int size; + int charSpacing; + int lineSpacing; + int alignmentH; + int alignmentV; + int padding; +} GuiTextStyle; +*/ + +// Gui control state +typedef enum { + STATE_NORMAL = 0, + STATE_FOCUSED, + STATE_PRESSED, + STATE_DISABLED +} GuiState; + +// Gui control text alignment +typedef enum { + TEXT_ALIGN_LEFT = 0, + TEXT_ALIGN_CENTER, + TEXT_ALIGN_RIGHT +} GuiTextAlignment; + +// Gui control text alignment vertical +// NOTE: Text vertical position inside the text bounds +typedef enum { + TEXT_ALIGN_TOP = 0, + TEXT_ALIGN_MIDDLE, + TEXT_ALIGN_BOTTOM +} GuiTextAlignmentVertical; + +// Gui control text wrap mode +// NOTE: Useful for multiline text +typedef enum { + TEXT_WRAP_NONE = 0, + TEXT_WRAP_CHAR, + TEXT_WRAP_WORD +} GuiTextWrapMode; + +// Gui controls +typedef enum { + // Default -> populates to all controls when set + DEFAULT = 0, + + // Basic controls + LABEL, // Used also for: LABELBUTTON + BUTTON, + TOGGLE, // Used also for: TOGGLEGROUP + SLIDER, // Used also for: SLIDERBAR, TOGGLESLIDER + PROGRESSBAR, + CHECKBOX, + COMBOBOX, + DROPDOWNBOX, + TEXTBOX, // Used also for: TEXTBOXMULTI + VALUEBOX, + CONTROL11, + LISTVIEW, + COLORPICKER, + SCROLLBAR, + STATUSBAR +} GuiControl; + +// Gui base properties for every control +// NOTE: RAYGUI_MAX_PROPS_BASE properties (by default 16 properties) +typedef enum { + BORDER_COLOR_NORMAL = 0, // Control border color in STATE_NORMAL + BASE_COLOR_NORMAL, // Control base color in STATE_NORMAL + TEXT_COLOR_NORMAL, // Control text color in STATE_NORMAL + BORDER_COLOR_FOCUSED, // Control border color in STATE_FOCUSED + BASE_COLOR_FOCUSED, // Control base color in STATE_FOCUSED + TEXT_COLOR_FOCUSED, // Control text color in STATE_FOCUSED + BORDER_COLOR_PRESSED, // Control border color in STATE_PRESSED + BASE_COLOR_PRESSED, // Control base color in STATE_PRESSED + TEXT_COLOR_PRESSED, // Control text color in STATE_PRESSED + BORDER_COLOR_DISABLED, // Control border color in STATE_DISABLED + BASE_COLOR_DISABLED, // Control base color in STATE_DISABLED + TEXT_COLOR_DISABLED, // Control text color in STATE_DISABLED + BORDER_WIDTH = 12, // Control border size, 0 for no border + //TEXT_SIZE, // Control text size (glyphs max height) -> GLOBAL for all controls + //TEXT_SPACING, // Control text spacing between glyphs -> GLOBAL for all controls + //TEXT_LINE_SPACING, // Control text spacing between lines -> GLOBAL for all controls + TEXT_PADDING = 13, // Control text padding, not considering border + TEXT_ALIGNMENT = 14, // Control text horizontal alignment inside control text bound (after border and padding) + //TEXT_WRAP_MODE // Control text wrap-mode inside text bounds -> GLOBAL for all controls +} GuiControlProperty; + +// TODO: Which text styling properties should be global or per-control? +// At this moment TEXT_PADDING and TEXT_ALIGNMENT is configured and saved per control while +// TEXT_SIZE, TEXT_SPACING, TEXT_LINE_SPACING, TEXT_ALIGNMENT_VERTICAL, TEXT_WRAP_MODE are global and +// should be configured by user as needed while defining the UI layout + +// Gui extended properties depend on control +// NOTE: RAYGUI_MAX_PROPS_EXTENDED properties (by default, max 8 properties) +//---------------------------------------------------------------------------------- +// DEFAULT extended properties +// NOTE: Those properties are common to all controls or global +// WARNING: We only have 8 slots for those properties by default!!! -> New global control: TEXT? +typedef enum { + TEXT_SIZE = 16, // Text size (glyphs max height) + TEXT_SPACING, // Text spacing between glyphs + LINE_COLOR, // Line control color + BACKGROUND_COLOR, // Background color + TEXT_LINE_SPACING, // Text spacing between lines + TEXT_ALIGNMENT_VERTICAL, // Text vertical alignment inside text bounds (after border and padding) + TEXT_WRAP_MODE // Text wrap-mode inside text bounds + //TEXT_DECORATION // Text decoration: 0-None, 1-Underline, 2-Line-through, 3-Overline + //TEXT_DECORATION_THICK // Text decoration line thickness +} GuiDefaultProperty; + +// Other possible text properties: +// TEXT_WEIGHT // Normal, Italic, Bold -> Requires specific font change +// TEXT_INDENT // Text indentation -> Now using TEXT_PADDING... + +// Label +//typedef enum { } GuiLabelProperty; + +// Button/Spinner +//typedef enum { } GuiButtonProperty; + +// Toggle/ToggleGroup +typedef enum { + GROUP_PADDING = 16, // ToggleGroup separation between toggles +} GuiToggleProperty; + +// Slider/SliderBar +typedef enum { + SLIDER_WIDTH = 16, // Slider size of internal bar + SLIDER_PADDING // Slider/SliderBar internal bar padding +} GuiSliderProperty; + +// ProgressBar +typedef enum { + PROGRESS_PADDING = 16, // ProgressBar internal padding +} GuiProgressBarProperty; + +// ScrollBar +typedef enum { + ARROWS_SIZE = 16, // ScrollBar arrows size + ARROWS_VISIBLE, // ScrollBar arrows visible + SCROLL_SLIDER_PADDING, // ScrollBar slider internal padding + SCROLL_SLIDER_SIZE, // ScrollBar slider size + SCROLL_PADDING, // ScrollBar scroll padding from arrows + SCROLL_SPEED, // ScrollBar scrolling speed +} GuiScrollBarProperty; + +// CheckBox +typedef enum { + CHECK_PADDING = 16 // CheckBox internal check padding +} GuiCheckBoxProperty; + +// ComboBox +typedef enum { + COMBO_BUTTON_WIDTH = 16, // ComboBox right button width + COMBO_BUTTON_SPACING // ComboBox button separation +} GuiComboBoxProperty; + +// DropdownBox +typedef enum { + ARROW_PADDING = 16, // DropdownBox arrow separation from border and items + DROPDOWN_ITEMS_SPACING, // DropdownBox items separation + DROPDOWN_ARROW_HIDDEN, // DropdownBox arrow hidden + DROPDOWN_ROLL_UP // DropdownBox roll up flag (default rolls down) +} GuiDropdownBoxProperty; + +// TextBox/TextBoxMulti/ValueBox/Spinner +typedef enum { + TEXT_READONLY = 16, // TextBox in read-only mode: 0-text editable, 1-text no-editable +} GuiTextBoxProperty; + +// ValueBox/Spinner +typedef enum { + SPINNER_BUTTON_WIDTH = 16, // Spinner left/right buttons width + SPINNER_BUTTON_SPACING, // Spinner buttons separation +} GuiValueBoxProperty; + +// Control11 +//typedef enum { } GuiControl11Property; + +// ListView +typedef enum { + LIST_ITEMS_HEIGHT = 16, // ListView items height + LIST_ITEMS_SPACING, // ListView items separation + SCROLLBAR_WIDTH, // ListView scrollbar size (usually width) + SCROLLBAR_SIDE, // ListView scrollbar side (0-SCROLLBAR_LEFT_SIDE, 1-SCROLLBAR_RIGHT_SIDE) + LIST_ITEMS_BORDER_NORMAL, // ListView items border enabled in normal state + LIST_ITEMS_BORDER_WIDTH // ListView items border width +} GuiListViewProperty; + +// ColorPicker +typedef enum { + COLOR_SELECTOR_SIZE = 16, + HUEBAR_WIDTH, // ColorPicker right hue bar width + HUEBAR_PADDING, // ColorPicker right hue bar separation from panel + HUEBAR_SELECTOR_HEIGHT, // ColorPicker right hue bar selector height + HUEBAR_SELECTOR_OVERFLOW // ColorPicker right hue bar selector overflow +} GuiColorPickerProperty; + +#define SCROLLBAR_LEFT_SIDE 0 +#define SCROLLBAR_RIGHT_SIDE 1 + +//---------------------------------------------------------------------------------- +// Global Variables Definition +//---------------------------------------------------------------------------------- +// ... + +//---------------------------------------------------------------------------------- +// Module Functions Declaration +//---------------------------------------------------------------------------------- + +#if defined(__cplusplus) +extern "C" { // Prevents name mangling of functions +#endif + +// Global gui state control functions +RAYGUIAPI void GuiEnable(void); // Enable gui controls (global state) +RAYGUIAPI void GuiDisable(void); // Disable gui controls (global state) +RAYGUIAPI void GuiLock(void); // Lock gui controls (global state) +RAYGUIAPI void GuiUnlock(void); // Unlock gui controls (global state) +RAYGUIAPI bool GuiIsLocked(void); // Check if gui is locked (global state) +RAYGUIAPI void GuiSetAlpha(float alpha); // Set gui controls alpha (global state), alpha goes from 0.0f to 1.0f +RAYGUIAPI void GuiSetState(int state); // Set gui state (global state) +RAYGUIAPI int GuiGetState(void); // Get gui state (global state) + +// Font set/get functions +RAYGUIAPI void GuiSetFont(Font font); // Set gui custom font (global state) +RAYGUIAPI Font GuiGetFont(void); // Get gui custom font (global state) + +// Style set/get functions +RAYGUIAPI void GuiSetStyle(int control, int property, int value); // Set one style property +RAYGUIAPI int GuiGetStyle(int control, int property); // Get one style property + +// Styles loading functions +RAYGUIAPI void GuiLoadStyle(const char *fileName); // Load style file over global style variable (.rgs) +RAYGUIAPI void GuiLoadStyleDefault(void); // Load style default over global style + +// Tooltips management functions +RAYGUIAPI void GuiEnableTooltip(void); // Enable gui tooltips (global state) +RAYGUIAPI void GuiDisableTooltip(void); // Disable gui tooltips (global state) +RAYGUIAPI void GuiSetTooltip(const char *tooltip); // Set tooltip string + +// Icons functionality +RAYGUIAPI const char *GuiIconText(int iconId, const char *text); // Get text with icon id prepended (if supported) +#if !defined(RAYGUI_NO_ICONS) +RAYGUIAPI void GuiSetIconScale(int scale); // Set default icon drawing size +RAYGUIAPI unsigned int *GuiGetIcons(void); // Get raygui icons data pointer +RAYGUIAPI char **GuiLoadIcons(const char *fileName, bool loadIconsName); // Load raygui icons file (.rgi) into internal icons data +RAYGUIAPI void GuiDrawIcon(int iconId, int posX, int posY, int pixelSize, Color color); // Draw icon using pixel size at specified position +#endif + +// Controls +//---------------------------------------------------------------------------------------------------------- +// Container/separator controls, useful for controls organization +RAYGUIAPI int GuiWindowBox(Rectangle bounds, const char *title); // Window Box control, shows a window that can be closed +RAYGUIAPI int GuiGroupBox(Rectangle bounds, const char *text); // Group Box control with text name +RAYGUIAPI int GuiLine(Rectangle bounds, const char *text); // Line separator control, could contain text +RAYGUIAPI int GuiPanel(Rectangle bounds, const char *text); // Panel control, useful to group controls +RAYGUIAPI int GuiTabBar(Rectangle bounds, const char **text, int count, int *active); // Tab Bar control, returns TAB to be closed or -1 +RAYGUIAPI int GuiScrollPanel(Rectangle bounds, const char *text, Rectangle content, Vector2 *scroll, Rectangle *view); // Scroll Panel control + +// Basic controls set +RAYGUIAPI int GuiLabel(Rectangle bounds, const char *text); // Label control +RAYGUIAPI int GuiButton(Rectangle bounds, const char *text); // Button control, returns true when clicked +RAYGUIAPI int GuiLabelButton(Rectangle bounds, const char *text); // Label button control, returns true when clicked +RAYGUIAPI int GuiToggle(Rectangle bounds, const char *text, bool *active); // Toggle Button control +RAYGUIAPI int GuiToggleGroup(Rectangle bounds, const char *text, int *active); // Toggle Group control +RAYGUIAPI int GuiToggleSlider(Rectangle bounds, const char *text, int *active); // Toggle Slider control +RAYGUIAPI int GuiCheckBox(Rectangle bounds, const char *text, bool *checked); // Check Box control, returns true when active +RAYGUIAPI int GuiComboBox(Rectangle bounds, const char *text, int *active); // Combo Box control + +RAYGUIAPI int GuiDropdownBox(Rectangle bounds, const char *text, int *active, bool editMode); // Dropdown Box control +RAYGUIAPI int GuiSpinner(Rectangle bounds, const char *text, int *value, int minValue, int maxValue, bool editMode); // Spinner control +RAYGUIAPI int GuiValueBox(Rectangle bounds, const char *text, int *value, int minValue, int maxValue, bool editMode); // Value Box control, updates input text with numbers +RAYGUIAPI int GuiValueBoxFloat(Rectangle bounds, const char *text, char *textValue, float *value, bool editMode); // Value box control for float values +RAYGUIAPI int GuiTextBox(Rectangle bounds, char *text, int textSize, bool editMode); // Text Box control, updates input text + +RAYGUIAPI int GuiSlider(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue); // Slider control +RAYGUIAPI int GuiSliderPro(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue, int sliderWidth); // Slider control with extended parameters +RAYGUIAPI int GuiSliderBar(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue); // Slider Bar control +RAYGUIAPI int GuiProgressBar(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue); // Progress Bar control +RAYGUIAPI int GuiStatusBar(Rectangle bounds, const char *text); // Status Bar control, shows info text +RAYGUIAPI int GuiDummyRec(Rectangle bounds, const char *text); // Dummy control for placeholders +RAYGUIAPI int GuiGrid(Rectangle bounds, const char *text, float spacing, int subdivs, Vector2 *mouseCell); // Grid control + +// Advance controls set +RAYGUIAPI int GuiListView(Rectangle bounds, const char *text, int *scrollIndex, int *active); // List View control +RAYGUIAPI int GuiListViewEx(Rectangle bounds, const char **text, int count, int *scrollIndex, int *active, int *focus); // List View with extended parameters +RAYGUIAPI int GuiMessageBox(Rectangle bounds, const char *title, const char *message, const char *buttons); // Message Box control, displays a message +RAYGUIAPI int GuiTextInputBox(Rectangle bounds, const char *title, const char *message, const char *buttons, char *text, int textMaxSize, bool *secretViewActive); // Text Input Box control, ask for text, supports secret +RAYGUIAPI int GuiColorPicker(Rectangle bounds, const char *text, Color *color); // Color Picker control (multiple color controls) +RAYGUIAPI int GuiColorPanel(Rectangle bounds, const char *text, Color *color); // Color Panel control +RAYGUIAPI int GuiColorBarAlpha(Rectangle bounds, const char *text, float *alpha); // Color Bar Alpha control +RAYGUIAPI int GuiColorBarHue(Rectangle bounds, const char *text, float *value); // Color Bar Hue control +RAYGUIAPI int GuiColorPickerHSV(Rectangle bounds, const char *text, Vector3 *colorHsv); // Color Picker control that avoids conversion to RGB on each call (multiple color controls) +RAYGUIAPI int GuiColorPanelHSV(Rectangle bounds, const char *text, Vector3 *colorHsv); // Color Panel control that updates Hue-Saturation-Value color value, used by GuiColorPickerHSV() +//---------------------------------------------------------------------------------------------------------- + +#if !defined(RAYGUI_NO_ICONS) + +#if !defined(RAYGUI_CUSTOM_ICONS) +//---------------------------------------------------------------------------------- +// Icons enumeration +//---------------------------------------------------------------------------------- +typedef enum { + ICON_NONE = 0, + ICON_FOLDER_FILE_OPEN = 1, + ICON_FILE_SAVE_CLASSIC = 2, + ICON_FOLDER_OPEN = 3, + ICON_FOLDER_SAVE = 4, + ICON_FILE_OPEN = 5, + ICON_FILE_SAVE = 6, + ICON_FILE_EXPORT = 7, + ICON_FILE_ADD = 8, + ICON_FILE_DELETE = 9, + ICON_FILETYPE_TEXT = 10, + ICON_FILETYPE_AUDIO = 11, + ICON_FILETYPE_IMAGE = 12, + ICON_FILETYPE_PLAY = 13, + ICON_FILETYPE_VIDEO = 14, + ICON_FILETYPE_INFO = 15, + ICON_FILE_COPY = 16, + ICON_FILE_CUT = 17, + ICON_FILE_PASTE = 18, + ICON_CURSOR_HAND = 19, + ICON_CURSOR_POINTER = 20, + ICON_CURSOR_CLASSIC = 21, + ICON_PENCIL = 22, + ICON_PENCIL_BIG = 23, + ICON_BRUSH_CLASSIC = 24, + ICON_BRUSH_PAINTER = 25, + ICON_WATER_DROP = 26, + ICON_COLOR_PICKER = 27, + ICON_RUBBER = 28, + ICON_COLOR_BUCKET = 29, + ICON_TEXT_T = 30, + ICON_TEXT_A = 31, + ICON_SCALE = 32, + ICON_RESIZE = 33, + ICON_FILTER_POINT = 34, + ICON_FILTER_BILINEAR = 35, + ICON_CROP = 36, + ICON_CROP_ALPHA = 37, + ICON_SQUARE_TOGGLE = 38, + ICON_SYMMETRY = 39, + ICON_SYMMETRY_HORIZONTAL = 40, + ICON_SYMMETRY_VERTICAL = 41, + ICON_LENS = 42, + ICON_LENS_BIG = 43, + ICON_EYE_ON = 44, + ICON_EYE_OFF = 45, + ICON_FILTER_TOP = 46, + ICON_FILTER = 47, + ICON_TARGET_POINT = 48, + ICON_TARGET_SMALL = 49, + ICON_TARGET_BIG = 50, + ICON_TARGET_MOVE = 51, + ICON_CURSOR_MOVE = 52, + ICON_CURSOR_SCALE = 53, + ICON_CURSOR_SCALE_RIGHT = 54, + ICON_CURSOR_SCALE_LEFT = 55, + ICON_UNDO = 56, + ICON_REDO = 57, + ICON_REREDO = 58, + ICON_MUTATE = 59, + ICON_ROTATE = 60, + ICON_REPEAT = 61, + ICON_SHUFFLE = 62, + ICON_EMPTYBOX = 63, + ICON_TARGET = 64, + ICON_TARGET_SMALL_FILL = 65, + ICON_TARGET_BIG_FILL = 66, + ICON_TARGET_MOVE_FILL = 67, + ICON_CURSOR_MOVE_FILL = 68, + ICON_CURSOR_SCALE_FILL = 69, + ICON_CURSOR_SCALE_RIGHT_FILL = 70, + ICON_CURSOR_SCALE_LEFT_FILL = 71, + ICON_UNDO_FILL = 72, + ICON_REDO_FILL = 73, + ICON_REREDO_FILL = 74, + ICON_MUTATE_FILL = 75, + ICON_ROTATE_FILL = 76, + ICON_REPEAT_FILL = 77, + ICON_SHUFFLE_FILL = 78, + ICON_EMPTYBOX_SMALL = 79, + ICON_BOX = 80, + ICON_BOX_TOP = 81, + ICON_BOX_TOP_RIGHT = 82, + ICON_BOX_RIGHT = 83, + ICON_BOX_BOTTOM_RIGHT = 84, + ICON_BOX_BOTTOM = 85, + ICON_BOX_BOTTOM_LEFT = 86, + ICON_BOX_LEFT = 87, + ICON_BOX_TOP_LEFT = 88, + ICON_BOX_CENTER = 89, + ICON_BOX_CIRCLE_MASK = 90, + ICON_POT = 91, + ICON_ALPHA_MULTIPLY = 92, + ICON_ALPHA_CLEAR = 93, + ICON_DITHERING = 94, + ICON_MIPMAPS = 95, + ICON_BOX_GRID = 96, + ICON_GRID = 97, + ICON_BOX_CORNERS_SMALL = 98, + ICON_BOX_CORNERS_BIG = 99, + ICON_FOUR_BOXES = 100, + ICON_GRID_FILL = 101, + ICON_BOX_MULTISIZE = 102, + ICON_ZOOM_SMALL = 103, + ICON_ZOOM_MEDIUM = 104, + ICON_ZOOM_BIG = 105, + ICON_ZOOM_ALL = 106, + ICON_ZOOM_CENTER = 107, + ICON_BOX_DOTS_SMALL = 108, + ICON_BOX_DOTS_BIG = 109, + ICON_BOX_CONCENTRIC = 110, + ICON_BOX_GRID_BIG = 111, + ICON_OK_TICK = 112, + ICON_CROSS = 113, + ICON_ARROW_LEFT = 114, + ICON_ARROW_RIGHT = 115, + ICON_ARROW_DOWN = 116, + ICON_ARROW_UP = 117, + ICON_ARROW_LEFT_FILL = 118, + ICON_ARROW_RIGHT_FILL = 119, + ICON_ARROW_DOWN_FILL = 120, + ICON_ARROW_UP_FILL = 121, + ICON_AUDIO = 122, + ICON_FX = 123, + ICON_WAVE = 124, + ICON_WAVE_SINUS = 125, + ICON_WAVE_SQUARE = 126, + ICON_WAVE_TRIANGULAR = 127, + ICON_CROSS_SMALL = 128, + ICON_PLAYER_PREVIOUS = 129, + ICON_PLAYER_PLAY_BACK = 130, + ICON_PLAYER_PLAY = 131, + ICON_PLAYER_PAUSE = 132, + ICON_PLAYER_STOP = 133, + ICON_PLAYER_NEXT = 134, + ICON_PLAYER_RECORD = 135, + ICON_MAGNET = 136, + ICON_LOCK_CLOSE = 137, + ICON_LOCK_OPEN = 138, + ICON_CLOCK = 139, + ICON_TOOLS = 140, + ICON_GEAR = 141, + ICON_GEAR_BIG = 142, + ICON_BIN = 143, + ICON_HAND_POINTER = 144, + ICON_LASER = 145, + ICON_COIN = 146, + ICON_EXPLOSION = 147, + ICON_1UP = 148, + ICON_PLAYER = 149, + ICON_PLAYER_JUMP = 150, + ICON_KEY = 151, + ICON_DEMON = 152, + ICON_TEXT_POPUP = 153, + ICON_GEAR_EX = 154, + ICON_CRACK = 155, + ICON_CRACK_POINTS = 156, + ICON_STAR = 157, + ICON_DOOR = 158, + ICON_EXIT = 159, + ICON_MODE_2D = 160, + ICON_MODE_3D = 161, + ICON_CUBE = 162, + ICON_CUBE_FACE_TOP = 163, + ICON_CUBE_FACE_LEFT = 164, + ICON_CUBE_FACE_FRONT = 165, + ICON_CUBE_FACE_BOTTOM = 166, + ICON_CUBE_FACE_RIGHT = 167, + ICON_CUBE_FACE_BACK = 168, + ICON_CAMERA = 169, + ICON_SPECIAL = 170, + ICON_LINK_NET = 171, + ICON_LINK_BOXES = 172, + ICON_LINK_MULTI = 173, + ICON_LINK = 174, + ICON_LINK_BROKE = 175, + ICON_TEXT_NOTES = 176, + ICON_NOTEBOOK = 177, + ICON_SUITCASE = 178, + ICON_SUITCASE_ZIP = 179, + ICON_MAILBOX = 180, + ICON_MONITOR = 181, + ICON_PRINTER = 182, + ICON_PHOTO_CAMERA = 183, + ICON_PHOTO_CAMERA_FLASH = 184, + ICON_HOUSE = 185, + ICON_HEART = 186, + ICON_CORNER = 187, + ICON_VERTICAL_BARS = 188, + ICON_VERTICAL_BARS_FILL = 189, + ICON_LIFE_BARS = 190, + ICON_INFO = 191, + ICON_CROSSLINE = 192, + ICON_HELP = 193, + ICON_FILETYPE_ALPHA = 194, + ICON_FILETYPE_HOME = 195, + ICON_LAYERS_VISIBLE = 196, + ICON_LAYERS = 197, + ICON_WINDOW = 198, + ICON_HIDPI = 199, + ICON_FILETYPE_BINARY = 200, + ICON_HEX = 201, + ICON_SHIELD = 202, + ICON_FILE_NEW = 203, + ICON_FOLDER_ADD = 204, + ICON_ALARM = 205, + ICON_CPU = 206, + ICON_ROM = 207, + ICON_STEP_OVER = 208, + ICON_STEP_INTO = 209, + ICON_STEP_OUT = 210, + ICON_RESTART = 211, + ICON_BREAKPOINT_ON = 212, + ICON_BREAKPOINT_OFF = 213, + ICON_BURGER_MENU = 214, + ICON_CASE_SENSITIVE = 215, + ICON_REG_EXP = 216, + ICON_FOLDER = 217, + ICON_FILE = 218, + ICON_SAND_TIMER = 219, + ICON_WARNING = 220, + ICON_HELP_BOX = 221, + ICON_INFO_BOX = 222, + ICON_PRIORITY = 223, + ICON_LAYERS_ISO = 224, + ICON_LAYERS2 = 225, + ICON_MLAYERS = 226, + ICON_MAPS = 227, + ICON_HOT = 228, + ICON_229 = 229, + ICON_230 = 230, + ICON_231 = 231, + ICON_232 = 232, + ICON_233 = 233, + ICON_234 = 234, + ICON_235 = 235, + ICON_236 = 236, + ICON_237 = 237, + ICON_238 = 238, + ICON_239 = 239, + ICON_240 = 240, + ICON_241 = 241, + ICON_242 = 242, + ICON_243 = 243, + ICON_244 = 244, + ICON_245 = 245, + ICON_246 = 246, + ICON_247 = 247, + ICON_248 = 248, + ICON_249 = 249, + ICON_250 = 250, + ICON_251 = 251, + ICON_252 = 252, + ICON_253 = 253, + ICON_254 = 254, + ICON_255 = 255, +} GuiIconName; +#endif + +#endif + +#if defined(__cplusplus) +} // Prevents name mangling of functions +#endif + +#endif // RAYGUI_H + +/*********************************************************************************** +* +* RAYGUI IMPLEMENTATION +* +************************************************************************************/ + +#if defined(RAYGUI_IMPLEMENTATION) + +#include // required for: isspace() [GuiTextBox()] +#include // Required for: FILE, fopen(), fclose(), fprintf(), feof(), fscanf(), snprintf(), vsprintf() [GuiLoadStyle(), GuiLoadIcons()] +#include // Required for: malloc(), calloc(), free() [GuiLoadStyle(), GuiLoadIcons()] +#include // Required for: strlen() [GuiTextBox(), GuiValueBox()], memset(), memcpy() +#include // Required for: va_list, va_start(), vfprintf(), va_end() [TextFormat()] +#include // Required for: roundf() [GuiColorPicker()] + +#ifdef __cplusplus + #define RAYGUI_CLITERAL(name) name +#else + #define RAYGUI_CLITERAL(name) (name) +#endif + +// Check if two rectangles are equal, used to validate a slider bounds as an id +#ifndef CHECK_BOUNDS_ID + #define CHECK_BOUNDS_ID(src, dst) ((src.x == dst.x) && (src.y == dst.y) && (src.width == dst.width) && (src.height == dst.height)) +#endif + +#if !defined(RAYGUI_NO_ICONS) && !defined(RAYGUI_CUSTOM_ICONS) + +// Embedded icons, no external file provided +#define RAYGUI_ICON_SIZE 16 // Size of icons in pixels (squared) +#define RAYGUI_ICON_MAX_ICONS 256 // Maximum number of icons +#define RAYGUI_ICON_MAX_NAME_LENGTH 32 // Maximum length of icon name id + +// Icons data is defined by bit array (every bit represents one pixel) +// Those arrays are stored as unsigned int data arrays, so, +// every array element defines 32 pixels (bits) of information +// One icon is defined by 8 int, (8 int * 32 bit = 256 bit = 16*16 pixels) +// NOTE: Number of elemens depend on RAYGUI_ICON_SIZE (by default 16x16 pixels) +#define RAYGUI_ICON_DATA_ELEMENTS (RAYGUI_ICON_SIZE*RAYGUI_ICON_SIZE/32) + +//---------------------------------------------------------------------------------- +// Icons data for all gui possible icons (allocated on data segment by default) +// +// NOTE 1: Every icon is codified in binary form, using 1 bit per pixel, so, +// every 16x16 icon requires 8 integers (16*16/32) to be stored +// +// NOTE 2: A different icon set could be loaded over this array using GuiLoadIcons(), +// but loaded icons set must be same RAYGUI_ICON_SIZE and no more than RAYGUI_ICON_MAX_ICONS +// +// guiIcons size is by default: 256*(16*16/32) = 2048*4 = 8192 bytes = 8 KB +//---------------------------------------------------------------------------------- +static unsigned int guiIcons[RAYGUI_ICON_MAX_ICONS*RAYGUI_ICON_DATA_ELEMENTS] = { + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_NONE + 0x3ff80000, 0x2f082008, 0x2042207e, 0x40027fc2, 0x40024002, 0x40024002, 0x40024002, 0x00007ffe, // ICON_FOLDER_FILE_OPEN + 0x3ffe0000, 0x44226422, 0x400247e2, 0x5ffa4002, 0x57ea500a, 0x500a500a, 0x40025ffa, 0x00007ffe, // ICON_FILE_SAVE_CLASSIC + 0x00000000, 0x0042007e, 0x40027fc2, 0x40024002, 0x41024002, 0x44424282, 0x793e4102, 0x00000100, // ICON_FOLDER_OPEN + 0x00000000, 0x0042007e, 0x40027fc2, 0x40024002, 0x41024102, 0x44424102, 0x793e4282, 0x00000000, // ICON_FOLDER_SAVE + 0x3ff00000, 0x201c2010, 0x20042004, 0x21042004, 0x24442284, 0x21042104, 0x20042104, 0x00003ffc, // ICON_FILE_OPEN + 0x3ff00000, 0x201c2010, 0x20042004, 0x21042004, 0x21042104, 0x22842444, 0x20042104, 0x00003ffc, // ICON_FILE_SAVE + 0x3ff00000, 0x201c2010, 0x00042004, 0x20041004, 0x20844784, 0x00841384, 0x20042784, 0x00003ffc, // ICON_FILE_EXPORT + 0x3ff00000, 0x201c2010, 0x20042004, 0x20042004, 0x22042204, 0x22042f84, 0x20042204, 0x00003ffc, // ICON_FILE_ADD + 0x3ff00000, 0x201c2010, 0x20042004, 0x20042004, 0x25042884, 0x25042204, 0x20042884, 0x00003ffc, // ICON_FILE_DELETE + 0x3ff00000, 0x201c2010, 0x20042004, 0x20042ff4, 0x20042ff4, 0x20042ff4, 0x20042004, 0x00003ffc, // ICON_FILETYPE_TEXT + 0x3ff00000, 0x201c2010, 0x27042004, 0x244424c4, 0x26442444, 0x20642664, 0x20042004, 0x00003ffc, // ICON_FILETYPE_AUDIO + 0x3ff00000, 0x201c2010, 0x26042604, 0x20042004, 0x35442884, 0x2414222c, 0x20042004, 0x00003ffc, // ICON_FILETYPE_IMAGE + 0x3ff00000, 0x201c2010, 0x20c42004, 0x22442144, 0x22442444, 0x20c42144, 0x20042004, 0x00003ffc, // ICON_FILETYPE_PLAY + 0x3ff00000, 0x3ffc2ff0, 0x3f3c2ff4, 0x3dbc2eb4, 0x3dbc2bb4, 0x3f3c2eb4, 0x3ffc2ff4, 0x00002ff4, // ICON_FILETYPE_VIDEO + 0x3ff00000, 0x201c2010, 0x21842184, 0x21842004, 0x21842184, 0x21842184, 0x20042184, 0x00003ffc, // ICON_FILETYPE_INFO + 0x0ff00000, 0x381c0810, 0x28042804, 0x28042804, 0x28042804, 0x28042804, 0x20102ffc, 0x00003ff0, // ICON_FILE_COPY + 0x00000000, 0x701c0000, 0x079c1e14, 0x55a000f0, 0x079c00f0, 0x701c1e14, 0x00000000, 0x00000000, // ICON_FILE_CUT + 0x01c00000, 0x13e41bec, 0x3f841004, 0x204420c4, 0x20442044, 0x20442044, 0x207c2044, 0x00003fc0, // ICON_FILE_PASTE + 0x00000000, 0x3aa00fe0, 0x2abc2aa0, 0x2aa42aa4, 0x20042aa4, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_CURSOR_HAND + 0x00000000, 0x003c000c, 0x030800c8, 0x30100c10, 0x10202020, 0x04400840, 0x01800280, 0x00000000, // ICON_CURSOR_POINTER + 0x00000000, 0x00180000, 0x01f00078, 0x03e007f0, 0x07c003e0, 0x04000e40, 0x00000000, 0x00000000, // ICON_CURSOR_CLASSIC + 0x00000000, 0x04000000, 0x11000a00, 0x04400a80, 0x01100220, 0x00580088, 0x00000038, 0x00000000, // ICON_PENCIL + 0x04000000, 0x15000a00, 0x50402880, 0x14102820, 0x05040a08, 0x015c028c, 0x007c00bc, 0x00000000, // ICON_PENCIL_BIG + 0x01c00000, 0x01400140, 0x01400140, 0x0ff80140, 0x0ff80808, 0x0aa80808, 0x0aa80aa8, 0x00000ff8, // ICON_BRUSH_CLASSIC + 0x1ffc0000, 0x5ffc7ffe, 0x40004000, 0x00807f80, 0x01c001c0, 0x01c001c0, 0x01c001c0, 0x00000080, // ICON_BRUSH_PAINTER + 0x00000000, 0x00800000, 0x01c00080, 0x03e001c0, 0x07f003e0, 0x036006f0, 0x000001c0, 0x00000000, // ICON_WATER_DROP + 0x00000000, 0x3e003800, 0x1f803f80, 0x0c201e40, 0x02080c10, 0x00840104, 0x00380044, 0x00000000, // ICON_COLOR_PICKER + 0x00000000, 0x07800300, 0x1fe00fc0, 0x3f883fd0, 0x0e021f04, 0x02040402, 0x00f00108, 0x00000000, // ICON_RUBBER + 0x00c00000, 0x02800140, 0x08200440, 0x20081010, 0x2ffe3004, 0x03f807fc, 0x00e001f0, 0x00000040, // ICON_COLOR_BUCKET + 0x00000000, 0x21843ffc, 0x01800180, 0x01800180, 0x01800180, 0x01800180, 0x03c00180, 0x00000000, // ICON_TEXT_T + 0x00800000, 0x01400180, 0x06200340, 0x0c100620, 0x1ff80c10, 0x380c1808, 0x70067004, 0x0000f80f, // ICON_TEXT_A + 0x78000000, 0x50004000, 0x00004800, 0x03c003c0, 0x03c003c0, 0x00100000, 0x0002000a, 0x0000000e, // ICON_SCALE + 0x75560000, 0x5e004002, 0x54001002, 0x41001202, 0x408200fe, 0x40820082, 0x40820082, 0x00006afe, // ICON_RESIZE + 0x00000000, 0x3f003f00, 0x3f003f00, 0x3f003f00, 0x00400080, 0x001c0020, 0x001c001c, 0x00000000, // ICON_FILTER_POINT + 0x6d800000, 0x00004080, 0x40804080, 0x40800000, 0x00406d80, 0x001c0020, 0x001c001c, 0x00000000, // ICON_FILTER_BILINEAR + 0x40080000, 0x1ffe2008, 0x14081008, 0x11081208, 0x10481088, 0x10081028, 0x10047ff8, 0x00001002, // ICON_CROP + 0x00100000, 0x3ffc0010, 0x2ab03550, 0x22b02550, 0x20b02150, 0x20302050, 0x2000fff0, 0x00002000, // ICON_CROP_ALPHA + 0x40000000, 0x1ff82000, 0x04082808, 0x01082208, 0x00482088, 0x00182028, 0x35542008, 0x00000002, // ICON_SQUARE_TOGGLE + 0x00000000, 0x02800280, 0x06c006c0, 0x0ea00ee0, 0x1e901eb0, 0x3e883e98, 0x7efc7e8c, 0x00000000, // ICON_SYMMETRY + 0x01000000, 0x05600100, 0x1d480d50, 0x7d423d44, 0x3d447d42, 0x0d501d48, 0x01000560, 0x00000100, // ICON_SYMMETRY_HORIZONTAL + 0x01800000, 0x04200240, 0x10080810, 0x00001ff8, 0x00007ffe, 0x0ff01ff8, 0x03c007e0, 0x00000180, // ICON_SYMMETRY_VERTICAL + 0x00000000, 0x010800f0, 0x02040204, 0x02040204, 0x07f00308, 0x1c000e00, 0x30003800, 0x00000000, // ICON_LENS + 0x00000000, 0x061803f0, 0x08240c0c, 0x08040814, 0x0c0c0804, 0x23f01618, 0x18002400, 0x00000000, // ICON_LENS_BIG + 0x00000000, 0x00000000, 0x1c7007c0, 0x638e3398, 0x1c703398, 0x000007c0, 0x00000000, 0x00000000, // ICON_EYE_ON + 0x00000000, 0x10002000, 0x04700fc0, 0x610e3218, 0x1c703098, 0x001007a0, 0x00000008, 0x00000000, // ICON_EYE_OFF + 0x00000000, 0x00007ffc, 0x40047ffc, 0x10102008, 0x04400820, 0x02800280, 0x02800280, 0x00000100, // ICON_FILTER_TOP + 0x00000000, 0x40027ffe, 0x10082004, 0x04200810, 0x02400240, 0x02400240, 0x01400240, 0x000000c0, // ICON_FILTER + 0x00800000, 0x00800080, 0x00000080, 0x3c9e0000, 0x00000000, 0x00800080, 0x00800080, 0x00000000, // ICON_TARGET_POINT + 0x00800000, 0x00800080, 0x00800080, 0x3f7e01c0, 0x008001c0, 0x00800080, 0x00800080, 0x00000000, // ICON_TARGET_SMALL + 0x00800000, 0x00800080, 0x03e00080, 0x3e3e0220, 0x03e00220, 0x00800080, 0x00800080, 0x00000000, // ICON_TARGET_BIG + 0x01000000, 0x04400280, 0x01000100, 0x43842008, 0x43849ab2, 0x01002008, 0x04400100, 0x01000280, // ICON_TARGET_MOVE + 0x01000000, 0x04400280, 0x01000100, 0x41042108, 0x41049ff2, 0x01002108, 0x04400100, 0x01000280, // ICON_CURSOR_MOVE + 0x781e0000, 0x500a4002, 0x04204812, 0x00000240, 0x02400000, 0x48120420, 0x4002500a, 0x0000781e, // ICON_CURSOR_SCALE + 0x00000000, 0x20003c00, 0x24002800, 0x01000200, 0x00400080, 0x00140024, 0x003c0004, 0x00000000, // ICON_CURSOR_SCALE_RIGHT + 0x00000000, 0x0004003c, 0x00240014, 0x00800040, 0x02000100, 0x28002400, 0x3c002000, 0x00000000, // ICON_CURSOR_SCALE_LEFT + 0x00000000, 0x00100020, 0x10101fc8, 0x10001020, 0x10001000, 0x10001000, 0x00001fc0, 0x00000000, // ICON_UNDO + 0x00000000, 0x08000400, 0x080813f8, 0x00080408, 0x00080008, 0x00080008, 0x000003f8, 0x00000000, // ICON_REDO + 0x00000000, 0x3ffc0000, 0x20042004, 0x20002000, 0x20402000, 0x3f902020, 0x00400020, 0x00000000, // ICON_REREDO + 0x00000000, 0x3ffc0000, 0x20042004, 0x27fc2004, 0x20202000, 0x3fc82010, 0x00200010, 0x00000000, // ICON_MUTATE + 0x00000000, 0x0ff00000, 0x10081818, 0x11801008, 0x10001180, 0x18101020, 0x00100fc8, 0x00000020, // ICON_ROTATE + 0x00000000, 0x04000200, 0x240429fc, 0x20042204, 0x20442004, 0x3f942024, 0x00400020, 0x00000000, // ICON_REPEAT + 0x00000000, 0x20001000, 0x22104c0e, 0x00801120, 0x11200040, 0x4c0e2210, 0x10002000, 0x00000000, // ICON_SHUFFLE + 0x7ffe0000, 0x50024002, 0x44024802, 0x41024202, 0x40424082, 0x40124022, 0x4002400a, 0x00007ffe, // ICON_EMPTYBOX + 0x00800000, 0x03e00080, 0x08080490, 0x3c9e0808, 0x08080808, 0x03e00490, 0x00800080, 0x00000000, // ICON_TARGET + 0x00800000, 0x00800080, 0x00800080, 0x3ffe01c0, 0x008001c0, 0x00800080, 0x00800080, 0x00000000, // ICON_TARGET_SMALL_FILL + 0x00800000, 0x00800080, 0x03e00080, 0x3ffe03e0, 0x03e003e0, 0x00800080, 0x00800080, 0x00000000, // ICON_TARGET_BIG_FILL + 0x01000000, 0x07c00380, 0x01000100, 0x638c2008, 0x638cfbbe, 0x01002008, 0x07c00100, 0x01000380, // ICON_TARGET_MOVE_FILL + 0x01000000, 0x07c00380, 0x01000100, 0x610c2108, 0x610cfffe, 0x01002108, 0x07c00100, 0x01000380, // ICON_CURSOR_MOVE_FILL + 0x781e0000, 0x6006700e, 0x04204812, 0x00000240, 0x02400000, 0x48120420, 0x700e6006, 0x0000781e, // ICON_CURSOR_SCALE_FILL + 0x00000000, 0x38003c00, 0x24003000, 0x01000200, 0x00400080, 0x000c0024, 0x003c001c, 0x00000000, // ICON_CURSOR_SCALE_RIGHT_FILL + 0x00000000, 0x001c003c, 0x0024000c, 0x00800040, 0x02000100, 0x30002400, 0x3c003800, 0x00000000, // ICON_CURSOR_SCALE_LEFT_FILL + 0x00000000, 0x00300020, 0x10301ff8, 0x10001020, 0x10001000, 0x10001000, 0x00001fc0, 0x00000000, // ICON_UNDO_FILL + 0x00000000, 0x0c000400, 0x0c081ff8, 0x00080408, 0x00080008, 0x00080008, 0x000003f8, 0x00000000, // ICON_REDO_FILL + 0x00000000, 0x3ffc0000, 0x20042004, 0x20002000, 0x20402000, 0x3ff02060, 0x00400060, 0x00000000, // ICON_REREDO_FILL + 0x00000000, 0x3ffc0000, 0x20042004, 0x27fc2004, 0x20202000, 0x3ff82030, 0x00200030, 0x00000000, // ICON_MUTATE_FILL + 0x00000000, 0x0ff00000, 0x10081818, 0x11801008, 0x10001180, 0x18301020, 0x00300ff8, 0x00000020, // ICON_ROTATE_FILL + 0x00000000, 0x06000200, 0x26042ffc, 0x20042204, 0x20442004, 0x3ff42064, 0x00400060, 0x00000000, // ICON_REPEAT_FILL + 0x00000000, 0x30001000, 0x32107c0e, 0x00801120, 0x11200040, 0x7c0e3210, 0x10003000, 0x00000000, // ICON_SHUFFLE_FILL + 0x00000000, 0x30043ffc, 0x24042804, 0x21042204, 0x20442084, 0x20142024, 0x3ffc200c, 0x00000000, // ICON_EMPTYBOX_SMALL + 0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX + 0x00000000, 0x23c43ffc, 0x23c423c4, 0x200423c4, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_TOP + 0x00000000, 0x3e043ffc, 0x3e043e04, 0x20043e04, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_TOP_RIGHT + 0x00000000, 0x20043ffc, 0x20042004, 0x3e043e04, 0x3e043e04, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_RIGHT + 0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x3e042004, 0x3e043e04, 0x3ffc3e04, 0x00000000, // ICON_BOX_BOTTOM_RIGHT + 0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x23c42004, 0x23c423c4, 0x3ffc23c4, 0x00000000, // ICON_BOX_BOTTOM + 0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x207c2004, 0x207c207c, 0x3ffc207c, 0x00000000, // ICON_BOX_BOTTOM_LEFT + 0x00000000, 0x20043ffc, 0x20042004, 0x207c207c, 0x207c207c, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_LEFT + 0x00000000, 0x207c3ffc, 0x207c207c, 0x2004207c, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_TOP_LEFT + 0x00000000, 0x20043ffc, 0x20042004, 0x23c423c4, 0x23c423c4, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_CENTER + 0x7ffe0000, 0x40024002, 0x47e24182, 0x4ff247e2, 0x47e24ff2, 0x418247e2, 0x40024002, 0x00007ffe, // ICON_BOX_CIRCLE_MASK + 0x7fff0000, 0x40014001, 0x40014001, 0x49555ddd, 0x4945495d, 0x400149c5, 0x40014001, 0x00007fff, // ICON_POT + 0x7ffe0000, 0x53327332, 0x44ce4cce, 0x41324332, 0x404e40ce, 0x48125432, 0x4006540e, 0x00007ffe, // ICON_ALPHA_MULTIPLY + 0x7ffe0000, 0x53327332, 0x44ce4cce, 0x41324332, 0x5c4e40ce, 0x44124432, 0x40065c0e, 0x00007ffe, // ICON_ALPHA_CLEAR + 0x7ffe0000, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x00007ffe, // ICON_DITHERING + 0x07fe0000, 0x1ffa0002, 0x7fea000a, 0x402a402a, 0x5b2a512a, 0x5128552a, 0x40205128, 0x00007fe0, // ICON_MIPMAPS + 0x00000000, 0x1ff80000, 0x12481248, 0x12481ff8, 0x1ff81248, 0x12481248, 0x00001ff8, 0x00000000, // ICON_BOX_GRID + 0x12480000, 0x7ffe1248, 0x12481248, 0x12487ffe, 0x7ffe1248, 0x12481248, 0x12487ffe, 0x00001248, // ICON_GRID + 0x00000000, 0x1c380000, 0x1c3817e8, 0x08100810, 0x08100810, 0x17e81c38, 0x00001c38, 0x00000000, // ICON_BOX_CORNERS_SMALL + 0x700e0000, 0x700e5ffa, 0x20042004, 0x20042004, 0x20042004, 0x20042004, 0x5ffa700e, 0x0000700e, // ICON_BOX_CORNERS_BIG + 0x3f7e0000, 0x21422142, 0x21422142, 0x00003f7e, 0x21423f7e, 0x21422142, 0x3f7e2142, 0x00000000, // ICON_FOUR_BOXES + 0x00000000, 0x3bb80000, 0x3bb83bb8, 0x3bb80000, 0x3bb83bb8, 0x3bb80000, 0x3bb83bb8, 0x00000000, // ICON_GRID_FILL + 0x7ffe0000, 0x7ffe7ffe, 0x77fe7000, 0x77fe77fe, 0x777e7700, 0x777e777e, 0x777e777e, 0x0000777e, // ICON_BOX_MULTISIZE + 0x781e0000, 0x40024002, 0x00004002, 0x01800000, 0x00000180, 0x40020000, 0x40024002, 0x0000781e, // ICON_ZOOM_SMALL + 0x781e0000, 0x40024002, 0x00004002, 0x03c003c0, 0x03c003c0, 0x40020000, 0x40024002, 0x0000781e, // ICON_ZOOM_MEDIUM + 0x781e0000, 0x40024002, 0x07e04002, 0x07e007e0, 0x07e007e0, 0x400207e0, 0x40024002, 0x0000781e, // ICON_ZOOM_BIG + 0x781e0000, 0x5ffa4002, 0x1ff85ffa, 0x1ff81ff8, 0x1ff81ff8, 0x5ffa1ff8, 0x40025ffa, 0x0000781e, // ICON_ZOOM_ALL + 0x00000000, 0x2004381c, 0x00002004, 0x00000000, 0x00000000, 0x20040000, 0x381c2004, 0x00000000, // ICON_ZOOM_CENTER + 0x00000000, 0x1db80000, 0x10081008, 0x10080000, 0x00001008, 0x10081008, 0x00001db8, 0x00000000, // ICON_BOX_DOTS_SMALL + 0x35560000, 0x00002002, 0x00002002, 0x00002002, 0x00002002, 0x00002002, 0x35562002, 0x00000000, // ICON_BOX_DOTS_BIG + 0x7ffe0000, 0x40024002, 0x48124ff2, 0x49924812, 0x48124992, 0x4ff24812, 0x40024002, 0x00007ffe, // ICON_BOX_CONCENTRIC + 0x00000000, 0x10841ffc, 0x10841084, 0x1ffc1084, 0x10841084, 0x10841084, 0x00001ffc, 0x00000000, // ICON_BOX_GRID_BIG + 0x00000000, 0x00000000, 0x10000000, 0x04000800, 0x01040200, 0x00500088, 0x00000020, 0x00000000, // ICON_OK_TICK + 0x00000000, 0x10080000, 0x04200810, 0x01800240, 0x02400180, 0x08100420, 0x00001008, 0x00000000, // ICON_CROSS + 0x00000000, 0x02000000, 0x00800100, 0x00200040, 0x00200010, 0x00800040, 0x02000100, 0x00000000, // ICON_ARROW_LEFT + 0x00000000, 0x00400000, 0x01000080, 0x04000200, 0x04000800, 0x01000200, 0x00400080, 0x00000000, // ICON_ARROW_RIGHT + 0x00000000, 0x00000000, 0x00000000, 0x08081004, 0x02200410, 0x00800140, 0x00000000, 0x00000000, // ICON_ARROW_DOWN + 0x00000000, 0x00000000, 0x01400080, 0x04100220, 0x10040808, 0x00000000, 0x00000000, 0x00000000, // ICON_ARROW_UP + 0x00000000, 0x02000000, 0x03800300, 0x03e003c0, 0x03e003f0, 0x038003c0, 0x02000300, 0x00000000, // ICON_ARROW_LEFT_FILL + 0x00000000, 0x00400000, 0x01c000c0, 0x07c003c0, 0x07c00fc0, 0x01c003c0, 0x004000c0, 0x00000000, // ICON_ARROW_RIGHT_FILL + 0x00000000, 0x00000000, 0x00000000, 0x0ff81ffc, 0x03e007f0, 0x008001c0, 0x00000000, 0x00000000, // ICON_ARROW_DOWN_FILL + 0x00000000, 0x00000000, 0x01c00080, 0x07f003e0, 0x1ffc0ff8, 0x00000000, 0x00000000, 0x00000000, // ICON_ARROW_UP_FILL + 0x00000000, 0x18a008c0, 0x32881290, 0x24822686, 0x26862482, 0x12903288, 0x08c018a0, 0x00000000, // ICON_AUDIO + 0x00000000, 0x04800780, 0x004000c0, 0x662000f0, 0x08103c30, 0x130a0e18, 0x0000318e, 0x00000000, // ICON_FX + 0x00000000, 0x00800000, 0x08880888, 0x2aaa0a8a, 0x0a8a2aaa, 0x08880888, 0x00000080, 0x00000000, // ICON_WAVE + 0x00000000, 0x00600000, 0x01080090, 0x02040108, 0x42044204, 0x24022402, 0x00001800, 0x00000000, // ICON_WAVE_SINUS + 0x00000000, 0x07f80000, 0x04080408, 0x04080408, 0x04080408, 0x7c0e0408, 0x00000000, 0x00000000, // ICON_WAVE_SQUARE + 0x00000000, 0x00000000, 0x00a00040, 0x22084110, 0x08021404, 0x00000000, 0x00000000, 0x00000000, // ICON_WAVE_TRIANGULAR + 0x00000000, 0x00000000, 0x04200000, 0x01800240, 0x02400180, 0x00000420, 0x00000000, 0x00000000, // ICON_CROSS_SMALL + 0x00000000, 0x18380000, 0x12281428, 0x10a81128, 0x112810a8, 0x14281228, 0x00001838, 0x00000000, // ICON_PLAYER_PREVIOUS + 0x00000000, 0x18000000, 0x11801600, 0x10181060, 0x10601018, 0x16001180, 0x00001800, 0x00000000, // ICON_PLAYER_PLAY_BACK + 0x00000000, 0x00180000, 0x01880068, 0x18080608, 0x06081808, 0x00680188, 0x00000018, 0x00000000, // ICON_PLAYER_PLAY + 0x00000000, 0x1e780000, 0x12481248, 0x12481248, 0x12481248, 0x12481248, 0x00001e78, 0x00000000, // ICON_PLAYER_PAUSE + 0x00000000, 0x1ff80000, 0x10081008, 0x10081008, 0x10081008, 0x10081008, 0x00001ff8, 0x00000000, // ICON_PLAYER_STOP + 0x00000000, 0x1c180000, 0x14481428, 0x15081488, 0x14881508, 0x14281448, 0x00001c18, 0x00000000, // ICON_PLAYER_NEXT + 0x00000000, 0x03c00000, 0x08100420, 0x10081008, 0x10081008, 0x04200810, 0x000003c0, 0x00000000, // ICON_PLAYER_RECORD + 0x00000000, 0x0c3007e0, 0x13c81818, 0x14281668, 0x14281428, 0x1c381c38, 0x08102244, 0x00000000, // ICON_MAGNET + 0x07c00000, 0x08200820, 0x3ff80820, 0x23882008, 0x21082388, 0x20082108, 0x1ff02008, 0x00000000, // ICON_LOCK_CLOSE + 0x07c00000, 0x08000800, 0x3ff80800, 0x23882008, 0x21082388, 0x20082108, 0x1ff02008, 0x00000000, // ICON_LOCK_OPEN + 0x01c00000, 0x0c180770, 0x3086188c, 0x60832082, 0x60034781, 0x30062002, 0x0c18180c, 0x01c00770, // ICON_CLOCK + 0x0a200000, 0x1b201b20, 0x04200e20, 0x04200420, 0x04700420, 0x0e700e70, 0x0e700e70, 0x04200e70, // ICON_TOOLS + 0x01800000, 0x3bdc318c, 0x0ff01ff8, 0x7c3e1e78, 0x1e787c3e, 0x1ff80ff0, 0x318c3bdc, 0x00000180, // ICON_GEAR + 0x01800000, 0x3ffc318c, 0x1c381ff8, 0x781e1818, 0x1818781e, 0x1ff81c38, 0x318c3ffc, 0x00000180, // ICON_GEAR_BIG + 0x00000000, 0x08080ff8, 0x08081ffc, 0x0aa80aa8, 0x0aa80aa8, 0x0aa80aa8, 0x08080aa8, 0x00000ff8, // ICON_BIN + 0x00000000, 0x00000000, 0x20043ffc, 0x08043f84, 0x04040f84, 0x04040784, 0x000007fc, 0x00000000, // ICON_HAND_POINTER + 0x00000000, 0x24400400, 0x00001480, 0x6efe0e00, 0x00000e00, 0x24401480, 0x00000400, 0x00000000, // ICON_LASER + 0x00000000, 0x03c00000, 0x08300460, 0x11181118, 0x11181118, 0x04600830, 0x000003c0, 0x00000000, // ICON_COIN + 0x00000000, 0x10880080, 0x06c00810, 0x366c07e0, 0x07e00240, 0x00001768, 0x04200240, 0x00000000, // ICON_EXPLOSION + 0x00000000, 0x3d280000, 0x2528252c, 0x3d282528, 0x05280528, 0x05e80528, 0x00000000, 0x00000000, // ICON_1UP + 0x01800000, 0x03c003c0, 0x018003c0, 0x0ff007e0, 0x0bd00bd0, 0x0a500bd0, 0x02400240, 0x02400240, // ICON_PLAYER + 0x01800000, 0x03c003c0, 0x118013c0, 0x03c81ff8, 0x07c003c8, 0x04400440, 0x0c080478, 0x00000000, // ICON_PLAYER_JUMP + 0x3ff80000, 0x30183ff8, 0x30183018, 0x3ff83ff8, 0x03000300, 0x03c003c0, 0x03e00300, 0x000003e0, // ICON_KEY + 0x3ff80000, 0x3ff83ff8, 0x33983ff8, 0x3ff83398, 0x3ff83ff8, 0x00000540, 0x0fe00aa0, 0x00000fe0, // ICON_DEMON + 0x00000000, 0x0ff00000, 0x20041008, 0x25442004, 0x10082004, 0x06000bf0, 0x00000300, 0x00000000, // ICON_TEXT_POPUP + 0x00000000, 0x11440000, 0x07f00be8, 0x1c1c0e38, 0x1c1c0c18, 0x07f00e38, 0x11440be8, 0x00000000, // ICON_GEAR_EX + 0x00000000, 0x20080000, 0x0c601010, 0x07c00fe0, 0x07c007c0, 0x0c600fe0, 0x20081010, 0x00000000, // ICON_CRACK + 0x00000000, 0x20080000, 0x0c601010, 0x04400fe0, 0x04405554, 0x0c600fe0, 0x20081010, 0x00000000, // ICON_CRACK_POINTS + 0x00000000, 0x00800080, 0x01c001c0, 0x1ffc3ffe, 0x03e007f0, 0x07f003e0, 0x0c180770, 0x00000808, // ICON_STAR + 0x0ff00000, 0x08180810, 0x08100818, 0x0a100810, 0x08180810, 0x08100818, 0x08100810, 0x00001ff8, // ICON_DOOR + 0x0ff00000, 0x08100810, 0x08100810, 0x10100010, 0x4f902010, 0x10102010, 0x08100010, 0x00000ff0, // ICON_EXIT + 0x00040000, 0x001f000e, 0x0ef40004, 0x12f41284, 0x0ef41214, 0x10040004, 0x7ffc3004, 0x10003000, // ICON_MODE_2D + 0x78040000, 0x501f600e, 0x0ef44004, 0x12f41284, 0x0ef41284, 0x10140004, 0x7ffc300c, 0x10003000, // ICON_MODE_3D + 0x7fe00000, 0x50286030, 0x47fe4804, 0x44224402, 0x44224422, 0x241275e2, 0x0c06140a, 0x000007fe, // ICON_CUBE + 0x7fe00000, 0x5ff87ff0, 0x47fe4ffc, 0x44224402, 0x44224422, 0x241275e2, 0x0c06140a, 0x000007fe, // ICON_CUBE_FACE_TOP + 0x7fe00000, 0x50386030, 0x47c2483c, 0x443e443e, 0x443e443e, 0x241e75fe, 0x0c06140e, 0x000007fe, // ICON_CUBE_FACE_LEFT + 0x7fe00000, 0x50286030, 0x47fe4804, 0x47fe47fe, 0x47fe47fe, 0x27fe77fe, 0x0ffe17fe, 0x000007fe, // ICON_CUBE_FACE_FRONT + 0x7fe00000, 0x50286030, 0x47fe4804, 0x44224402, 0x44224422, 0x3bf27be2, 0x0bfe1bfa, 0x000007fe, // ICON_CUBE_FACE_BOTTOM + 0x7fe00000, 0x70286030, 0x7ffe7804, 0x7c227c02, 0x7c227c22, 0x3c127de2, 0x0c061c0a, 0x000007fe, // ICON_CUBE_FACE_RIGHT + 0x7fe00000, 0x6fe85ff0, 0x781e77e4, 0x7be27be2, 0x7be27be2, 0x24127be2, 0x0c06140a, 0x000007fe, // ICON_CUBE_FACE_BACK + 0x00000000, 0x2a0233fe, 0x22022602, 0x22022202, 0x2a022602, 0x00a033fe, 0x02080110, 0x00000000, // ICON_CAMERA + 0x00000000, 0x200c3ffc, 0x000c000c, 0x3ffc000c, 0x30003000, 0x30003000, 0x3ffc3004, 0x00000000, // ICON_SPECIAL + 0x00000000, 0x0022003e, 0x012201e2, 0x0100013e, 0x01000100, 0x79000100, 0x4f004900, 0x00007800, // ICON_LINK_NET + 0x00000000, 0x44007c00, 0x45004600, 0x00627cbe, 0x00620022, 0x45007cbe, 0x44004600, 0x00007c00, // ICON_LINK_BOXES + 0x00000000, 0x0044007c, 0x0010007c, 0x3f100010, 0x3f1021f0, 0x3f100010, 0x3f0021f0, 0x00000000, // ICON_LINK_MULTI + 0x00000000, 0x0044007c, 0x00440044, 0x0010007c, 0x00100010, 0x44107c10, 0x440047f0, 0x00007c00, // ICON_LINK + 0x00000000, 0x0044007c, 0x00440044, 0x0000007c, 0x00000010, 0x44007c10, 0x44004550, 0x00007c00, // ICON_LINK_BROKE + 0x02a00000, 0x22a43ffc, 0x20042004, 0x20042ff4, 0x20042ff4, 0x20042ff4, 0x20042004, 0x00003ffc, // ICON_TEXT_NOTES + 0x3ffc0000, 0x20042004, 0x245e27c4, 0x27c42444, 0x2004201e, 0x201e2004, 0x20042004, 0x00003ffc, // ICON_NOTEBOOK + 0x00000000, 0x07e00000, 0x04200420, 0x24243ffc, 0x24242424, 0x24242424, 0x3ffc2424, 0x00000000, // ICON_SUITCASE + 0x00000000, 0x0fe00000, 0x08200820, 0x40047ffc, 0x7ffc5554, 0x40045554, 0x7ffc4004, 0x00000000, // ICON_SUITCASE_ZIP + 0x00000000, 0x20043ffc, 0x3ffc2004, 0x13c81008, 0x100813c8, 0x10081008, 0x1ff81008, 0x00000000, // ICON_MAILBOX + 0x00000000, 0x40027ffe, 0x5ffa5ffa, 0x5ffa5ffa, 0x40025ffa, 0x03c07ffe, 0x1ff81ff8, 0x00000000, // ICON_MONITOR + 0x0ff00000, 0x6bfe7ffe, 0x7ffe7ffe, 0x68167ffe, 0x08106816, 0x08100810, 0x0ff00810, 0x00000000, // ICON_PRINTER + 0x3ff80000, 0xfffe2008, 0x870a8002, 0x904a888a, 0x904a904a, 0x870a888a, 0xfffe8002, 0x00000000, // ICON_PHOTO_CAMERA + 0x0fc00000, 0xfcfe0cd8, 0x8002fffe, 0x84428382, 0x84428442, 0x80028382, 0xfffe8002, 0x00000000, // ICON_PHOTO_CAMERA_FLASH + 0x00000000, 0x02400180, 0x08100420, 0x20041008, 0x23c42004, 0x22442244, 0x3ffc2244, 0x00000000, // ICON_HOUSE + 0x00000000, 0x1c700000, 0x3ff83ef8, 0x3ff83ff8, 0x0fe01ff0, 0x038007c0, 0x00000100, 0x00000000, // ICON_HEART + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x80000000, 0xe000c000, // ICON_CORNER + 0x00000000, 0x14001c00, 0x15c01400, 0x15401540, 0x155c1540, 0x15541554, 0x1ddc1554, 0x00000000, // ICON_VERTICAL_BARS + 0x00000000, 0x03000300, 0x1b001b00, 0x1b601b60, 0x1b6c1b60, 0x1b6c1b6c, 0x1b6c1b6c, 0x00000000, // ICON_VERTICAL_BARS_FILL + 0x00000000, 0x00000000, 0x403e7ffe, 0x7ffe403e, 0x7ffe0000, 0x43fe43fe, 0x00007ffe, 0x00000000, // ICON_LIFE_BARS + 0x7ffc0000, 0x43844004, 0x43844284, 0x43844004, 0x42844284, 0x42844284, 0x40044384, 0x00007ffc, // ICON_INFO + 0x40008000, 0x10002000, 0x04000800, 0x01000200, 0x00400080, 0x00100020, 0x00040008, 0x00010002, // ICON_CROSSLINE + 0x00000000, 0x1ff01ff0, 0x18301830, 0x1f001830, 0x03001f00, 0x00000300, 0x03000300, 0x00000000, // ICON_HELP + 0x3ff00000, 0x2abc3550, 0x2aac3554, 0x2aac3554, 0x2aac3554, 0x2aac3554, 0x2aac3554, 0x00003ffc, // ICON_FILETYPE_ALPHA + 0x3ff00000, 0x201c2010, 0x22442184, 0x28142424, 0x29942814, 0x2ff42994, 0x20042004, 0x00003ffc, // ICON_FILETYPE_HOME + 0x07fe0000, 0x04020402, 0x7fe20402, 0x44224422, 0x44224422, 0x402047fe, 0x40204020, 0x00007fe0, // ICON_LAYERS_VISIBLE + 0x07fe0000, 0x04020402, 0x7c020402, 0x44024402, 0x44024402, 0x402047fe, 0x40204020, 0x00007fe0, // ICON_LAYERS + 0x00000000, 0x40027ffe, 0x7ffe4002, 0x40024002, 0x40024002, 0x40024002, 0x7ffe4002, 0x00000000, // ICON_WINDOW + 0x09100000, 0x09f00910, 0x09100910, 0x00000910, 0x24a2779e, 0x27a224a2, 0x709e20a2, 0x00000000, // ICON_HIDPI + 0x3ff00000, 0x201c2010, 0x2a842e84, 0x2e842a84, 0x2ba42004, 0x2aa42aa4, 0x20042ba4, 0x00003ffc, // ICON_FILETYPE_BINARY + 0x00000000, 0x00000000, 0x00120012, 0x4a5e4bd2, 0x485233d2, 0x00004bd2, 0x00000000, 0x00000000, // ICON_HEX + 0x01800000, 0x381c0660, 0x23c42004, 0x23c42044, 0x13c82204, 0x08101008, 0x02400420, 0x00000180, // ICON_SHIELD + 0x007e0000, 0x20023fc2, 0x40227fe2, 0x400a403a, 0x400a400a, 0x400a400a, 0x4008400e, 0x00007ff8, // ICON_FILE_NEW + 0x00000000, 0x0042007e, 0x40027fc2, 0x44024002, 0x5f024402, 0x44024402, 0x7ffe4002, 0x00000000, // ICON_FOLDER_ADD + 0x44220000, 0x12482244, 0xf3cf0000, 0x14280420, 0x48122424, 0x08100810, 0x1ff81008, 0x03c00420, // ICON_ALARM + 0x0aa00000, 0x1ff80aa0, 0x1068700e, 0x1008706e, 0x1008700e, 0x1008700e, 0x0aa01ff8, 0x00000aa0, // ICON_CPU + 0x07e00000, 0x04201db8, 0x04a01c38, 0x04a01d38, 0x04a01d38, 0x04a01d38, 0x04201d38, 0x000007e0, // ICON_ROM + 0x00000000, 0x03c00000, 0x3c382ff0, 0x3c04380c, 0x01800000, 0x03c003c0, 0x00000180, 0x00000000, // ICON_STEP_OVER + 0x01800000, 0x01800180, 0x01800180, 0x03c007e0, 0x00000180, 0x01800000, 0x03c003c0, 0x00000180, // ICON_STEP_INTO + 0x01800000, 0x07e003c0, 0x01800180, 0x01800180, 0x00000180, 0x01800000, 0x03c003c0, 0x00000180, // ICON_STEP_OUT + 0x00000000, 0x0ff003c0, 0x181c1c34, 0x303c301c, 0x30003000, 0x1c301800, 0x03c00ff0, 0x00000000, // ICON_RESTART + 0x00000000, 0x00000000, 0x07e003c0, 0x0ff00ff0, 0x0ff00ff0, 0x03c007e0, 0x00000000, 0x00000000, // ICON_BREAKPOINT_ON + 0x00000000, 0x00000000, 0x042003c0, 0x08100810, 0x08100810, 0x03c00420, 0x00000000, 0x00000000, // ICON_BREAKPOINT_OFF + 0x00000000, 0x00000000, 0x1ff81ff8, 0x1ff80000, 0x00001ff8, 0x1ff81ff8, 0x00000000, 0x00000000, // ICON_BURGER_MENU + 0x00000000, 0x00000000, 0x00880070, 0x0c880088, 0x1e8810f8, 0x3e881288, 0x00000000, 0x00000000, // ICON_CASE_SENSITIVE + 0x00000000, 0x02000000, 0x07000a80, 0x07001fc0, 0x02000a80, 0x00300030, 0x00000000, 0x00000000, // ICON_REG_EXP + 0x00000000, 0x0042007e, 0x40027fc2, 0x40024002, 0x40024002, 0x40024002, 0x7ffe4002, 0x00000000, // ICON_FOLDER + 0x3ff00000, 0x201c2010, 0x20042004, 0x20042004, 0x20042004, 0x20042004, 0x20042004, 0x00003ffc, // ICON_FILE + 0x1ff00000, 0x20082008, 0x17d02fe8, 0x05400ba0, 0x09200540, 0x23881010, 0x2fe827c8, 0x00001ff0, // ICON_SAND_TIMER + 0x01800000, 0x02400240, 0x05a00420, 0x09900990, 0x11881188, 0x21842004, 0x40024182, 0x00003ffc, // ICON_WARNING + 0x7ffe0000, 0x4ff24002, 0x4c324ff2, 0x4f824c02, 0x41824f82, 0x41824002, 0x40024182, 0x00007ffe, // ICON_HELP_BOX + 0x7ffe0000, 0x41824002, 0x40024182, 0x41824182, 0x41824182, 0x41824182, 0x40024182, 0x00007ffe, // ICON_INFO_BOX + 0x01800000, 0x04200240, 0x10080810, 0x7bde2004, 0x0a500a50, 0x08500bd0, 0x08100850, 0x00000ff0, // ICON_PRIORITY + 0x01800000, 0x18180660, 0x80016006, 0x98196006, 0x99996666, 0x19986666, 0x01800660, 0x00000000, // ICON_LAYERS_ISO + 0x07fe0000, 0x1c020402, 0x74021402, 0x54025402, 0x54025402, 0x500857fe, 0x40205ff8, 0x00007fe0, // ICON_LAYERS2 + 0x0ffe0000, 0x3ffa0802, 0x7fea200a, 0x402a402a, 0x422a422a, 0x422e422a, 0x40384e28, 0x00007fe0, // ICON_MLAYERS + 0x0ffe0000, 0x3ffa0802, 0x7fea200a, 0x402a402a, 0x5b2a512a, 0x512e552a, 0x40385128, 0x00007fe0, // ICON_MAPS + 0x04200000, 0x1cf00c60, 0x11f019f0, 0x0f3807b8, 0x1e3c0f3c, 0x1c1c1e1c, 0x1e3c1c1c, 0x00000f70, // ICON_HOT + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_229 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_230 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_231 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_232 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_233 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_234 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_235 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_236 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_237 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_238 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_239 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_240 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_241 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_242 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_243 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_244 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_245 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_246 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_247 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_248 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_249 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_250 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_251 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_252 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_253 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_254 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_255 +}; + +// NOTE: A pointer to current icons array should be defined +static unsigned int *guiIconsPtr = guiIcons; + +#endif // !RAYGUI_NO_ICONS && !RAYGUI_CUSTOM_ICONS + +#ifndef RAYGUI_ICON_SIZE + #define RAYGUI_ICON_SIZE 0 +#endif + +// WARNING: Those values define the total size of the style data array, +// if changed, previous saved styles could become incompatible +#define RAYGUI_MAX_CONTROLS 16 // Maximum number of controls +#define RAYGUI_MAX_PROPS_BASE 16 // Maximum number of base properties +#define RAYGUI_MAX_PROPS_EXTENDED 8 // Maximum number of extended properties + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- +// Gui control property style color element +typedef enum { BORDER = 0, BASE, TEXT, OTHER } GuiPropertyElement; + +//---------------------------------------------------------------------------------- +// Global Variables Definition +//---------------------------------------------------------------------------------- +static GuiState guiState = STATE_NORMAL; // Gui global state, if !STATE_NORMAL, forces defined state + +static Font guiFont = { 0 }; // Gui current font (WARNING: highly coupled to raylib) +static bool guiLocked = false; // Gui lock state (no inputs processed) +static float guiAlpha = 1.0f; // Gui controls transparency + +static unsigned int guiIconScale = 1; // Gui icon default scale (if icons enabled) + +static bool guiTooltip = false; // Tooltip enabled/disabled +static const char *guiTooltipPtr = NULL; // Tooltip string pointer (string provided by user) + +static bool guiControlExclusiveMode = false; // Gui control exclusive mode (no inputs processed except current control) +static Rectangle guiControlExclusiveRec = { 0 }; // Gui control exclusive bounds rectangle, used as an unique identifier + +static int textBoxCursorIndex = 0; // Cursor index, shared by all GuiTextBox*() +//static int blinkCursorFrameCounter = 0; // Frame counter for cursor blinking +static int autoCursorCounter = 0; // Frame counter for automatic repeated cursor movement on key-down (cooldown and delay) + +//---------------------------------------------------------------------------------- +// Style data array for all gui style properties (allocated on data segment by default) +// +// NOTE 1: First set of BASE properties are generic to all controls but could be individually +// overwritten per control, first set of EXTENDED properties are generic to all controls and +// can not be overwritten individually but custom EXTENDED properties can be used by control +// +// NOTE 2: A new style set could be loaded over this array using GuiLoadStyle(), +// but default gui style could always be recovered with GuiLoadStyleDefault() +// +// guiStyle size is by default: 16*(16 + 8) = 384*4 = 1536 bytes = 1.5 KB +//---------------------------------------------------------------------------------- +static unsigned int guiStyle[RAYGUI_MAX_CONTROLS*(RAYGUI_MAX_PROPS_BASE + RAYGUI_MAX_PROPS_EXTENDED)] = { 0 }; + +static bool guiStyleLoaded = false; // Style loaded flag for lazy style initialization + +//---------------------------------------------------------------------------------- +// Standalone Mode Functions Declaration +// +// NOTE: raygui depend on some raylib input and drawing functions +// To use raygui as standalone library, below functions must be defined by the user +//---------------------------------------------------------------------------------- +#if defined(RAYGUI_STANDALONE) + +#define KEY_RIGHT 262 +#define KEY_LEFT 263 +#define KEY_DOWN 264 +#define KEY_UP 265 +#define KEY_BACKSPACE 259 +#define KEY_ENTER 257 + +#define MOUSE_LEFT_BUTTON 0 + +// Input required functions +//------------------------------------------------------------------------------- +static Vector2 GetMousePosition(void); +static float GetMouseWheelMove(void); +static bool IsMouseButtonDown(int button); +static bool IsMouseButtonPressed(int button); +static bool IsMouseButtonReleased(int button); + +static bool IsKeyDown(int key); +static bool IsKeyPressed(int key); +static int GetCharPressed(void); // -- GuiTextBox(), GuiValueBox() +//------------------------------------------------------------------------------- + +// Drawing required functions +//------------------------------------------------------------------------------- +static void DrawRectangle(int x, int y, int width, int height, Color color); // -- GuiDrawRectangle() +static void DrawRectangleGradientEx(Rectangle rec, Color col1, Color col2, Color col3, Color col4); // -- GuiColorPicker() +//------------------------------------------------------------------------------- + +// Text required functions +//------------------------------------------------------------------------------- +static Font GetFontDefault(void); // -- GuiLoadStyleDefault() +static Font LoadFontEx(const char *fileName, int fontSize, int *codepoints, int codepointCount); // -- GuiLoadStyle(), load font + +static Texture2D LoadTextureFromImage(Image image); // -- GuiLoadStyle(), required to load texture from embedded font atlas image +static void SetShapesTexture(Texture2D tex, Rectangle rec); // -- GuiLoadStyle(), required to set shapes rec to font white rec (optimization) + +static char *LoadFileText(const char *fileName); // -- GuiLoadStyle(), required to load charset data +static void UnloadFileText(char *text); // -- GuiLoadStyle(), required to unload charset data + +static const char *GetDirectoryPath(const char *filePath); // -- GuiLoadStyle(), required to find charset/font file from text .rgs + +static int *LoadCodepoints(const char *text, int *count); // -- GuiLoadStyle(), required to load required font codepoints list +static void UnloadCodepoints(int *codepoints); // -- GuiLoadStyle(), required to unload codepoints list + +static unsigned char *DecompressData(const unsigned char *compData, int compDataSize, int *dataSize); // -- GuiLoadStyle() +//------------------------------------------------------------------------------- + +// raylib functions already implemented in raygui +//------------------------------------------------------------------------------- +static Color GetColor(int hexValue); // Returns a Color struct from hexadecimal value +static int ColorToInt(Color color); // Returns hexadecimal value for a Color +static bool CheckCollisionPointRec(Vector2 point, Rectangle rec); // Check if point is inside rectangle +static const char *TextFormat(const char *text, ...); // Formatting of text with variables to 'embed' +static const char **TextSplit(const char *text, char delimiter, int *count); // Split text into multiple strings +static int TextToInteger(const char *text); // Get integer value from text +static float TextToFloat(const char *text); // Get float value from text + +static int GetCodepointNext(const char *text, int *codepointSize); // Get next codepoint in a UTF-8 encoded text +static const char *CodepointToUTF8(int codepoint, int *byteSize); // Encode codepoint into UTF-8 text (char array size returned as parameter) + +static void DrawRectangleGradientV(int posX, int posY, int width, int height, Color color1, Color color2); // Draw rectangle vertical gradient +//------------------------------------------------------------------------------- + +#endif // RAYGUI_STANDALONE + +//---------------------------------------------------------------------------------- +// Module specific Functions Declaration +//---------------------------------------------------------------------------------- +static void GuiLoadStyleFromMemory(const unsigned char *fileData, int dataSize); // Load style from memory (binary only) + +static int GetTextWidth(const char *text); // Gui get text width using gui font and style +static Rectangle GetTextBounds(int control, Rectangle bounds); // Get text bounds considering control bounds +static const char *GetTextIcon(const char *text, int *iconId); // Get text icon if provided and move text cursor + +static void GuiDrawText(const char *text, Rectangle textBounds, int alignment, Color tint); // Gui draw text using default font +static void GuiDrawRectangle(Rectangle rec, int borderWidth, Color borderColor, Color color); // Gui draw rectangle using default raygui style + +static const char **GuiTextSplit(const char *text, char delimiter, int *count, int *textRow); // Split controls text into multiple strings +static Vector3 ConvertHSVtoRGB(Vector3 hsv); // Convert color data from HSV to RGB +static Vector3 ConvertRGBtoHSV(Vector3 rgb); // Convert color data from RGB to HSV + +static int GuiScrollBar(Rectangle bounds, int value, int minValue, int maxValue); // Scroll bar control, used by GuiScrollPanel() +static void GuiTooltip(Rectangle controlRec); // Draw tooltip using control rec position + +static Color GuiFade(Color color, float alpha); // Fade color by an alpha factor + +//---------------------------------------------------------------------------------- +// Gui Setup Functions Definition +//---------------------------------------------------------------------------------- +// Enable gui global state +// NOTE: We check for STATE_DISABLED to avoid messing custom global state setups +void GuiEnable(void) { if (guiState == STATE_DISABLED) guiState = STATE_NORMAL; } + +// Disable gui global state +// NOTE: We check for STATE_NORMAL to avoid messing custom global state setups +void GuiDisable(void) { if (guiState == STATE_NORMAL) guiState = STATE_DISABLED; } + +// Lock gui global state +void GuiLock(void) { guiLocked = true; } + +// Unlock gui global state +void GuiUnlock(void) { guiLocked = false; } + +// Check if gui is locked (global state) +bool GuiIsLocked(void) { return guiLocked; } + +// Set gui controls alpha global state +void GuiSetAlpha(float alpha) +{ + if (alpha < 0.0f) alpha = 0.0f; + else if (alpha > 1.0f) alpha = 1.0f; + + guiAlpha = alpha; +} + +// Set gui state (global state) +void GuiSetState(int state) { guiState = (GuiState)state; } + +// Get gui state (global state) +int GuiGetState(void) { return guiState; } + +// Set custom gui font +// NOTE: Font loading/unloading is external to raygui +void GuiSetFont(Font font) +{ + if (font.texture.id > 0) + { + // NOTE: If we try to setup a font but default style has not been + // lazily loaded before, it will be overwritten, so we need to force + // default style loading first + if (!guiStyleLoaded) GuiLoadStyleDefault(); + + guiFont = font; + } +} + +// Get custom gui font +Font GuiGetFont(void) +{ + return guiFont; +} + +// Set control style property value +void GuiSetStyle(int control, int property, int value) +{ + if (!guiStyleLoaded) GuiLoadStyleDefault(); + guiStyle[control*(RAYGUI_MAX_PROPS_BASE + RAYGUI_MAX_PROPS_EXTENDED) + property] = value; + + // Default properties are propagated to all controls + if ((control == 0) && (property < RAYGUI_MAX_PROPS_BASE)) + { + for (int i = 1; i < RAYGUI_MAX_CONTROLS; i++) guiStyle[i*(RAYGUI_MAX_PROPS_BASE + RAYGUI_MAX_PROPS_EXTENDED) + property] = value; + } +} + +// Get control style property value +int GuiGetStyle(int control, int property) +{ + if (!guiStyleLoaded) GuiLoadStyleDefault(); + return guiStyle[control*(RAYGUI_MAX_PROPS_BASE + RAYGUI_MAX_PROPS_EXTENDED) + property]; +} + +//---------------------------------------------------------------------------------- +// Gui Controls Functions Definition +//---------------------------------------------------------------------------------- + +// Window Box control +int GuiWindowBox(Rectangle bounds, const char *title) +{ + // Window title bar height (including borders) + // NOTE: This define is also used by GuiMessageBox() and GuiTextInputBox() + #if !defined(RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT) + #define RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT 24 + #endif + + #if !defined(RAYGUI_WINDOWBOX_CLOSEBUTTON_HEIGHT) + #define RAYGUI_WINDOWBOX_CLOSEBUTTON_HEIGHT 18 + #endif + + int result = 0; + //GuiState state = guiState; + + int statusBarHeight = RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT; + + Rectangle statusBar = { bounds.x, bounds.y, bounds.width, (float)statusBarHeight }; + if (bounds.height < statusBarHeight*2.0f) bounds.height = statusBarHeight*2.0f; + + const float vPadding = statusBarHeight/2.0f - RAYGUI_WINDOWBOX_CLOSEBUTTON_HEIGHT/2.0f; + Rectangle windowPanel = { bounds.x, bounds.y + (float)statusBarHeight - 1, bounds.width, bounds.height - (float)statusBarHeight + 1 }; + Rectangle closeButtonRec = { statusBar.x + statusBar.width - GuiGetStyle(STATUSBAR, BORDER_WIDTH) - RAYGUI_WINDOWBOX_CLOSEBUTTON_HEIGHT - vPadding, + statusBar.y + vPadding, RAYGUI_WINDOWBOX_CLOSEBUTTON_HEIGHT, RAYGUI_WINDOWBOX_CLOSEBUTTON_HEIGHT }; + + // Update control + //-------------------------------------------------------------------- + // NOTE: Logic is directly managed by button + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + GuiStatusBar(statusBar, title); // Draw window header as status bar + GuiPanel(windowPanel, NULL); // Draw window base + + // Draw window close button + int tempBorderWidth = GuiGetStyle(BUTTON, BORDER_WIDTH); + int tempTextAlignment = GuiGetStyle(BUTTON, TEXT_ALIGNMENT); + GuiSetStyle(BUTTON, BORDER_WIDTH, 1); + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); +#if defined(RAYGUI_NO_ICONS) + result = GuiButton(closeButtonRec, "x"); +#else + result = GuiButton(closeButtonRec, GuiIconText(ICON_CROSS_SMALL, NULL)); +#endif + GuiSetStyle(BUTTON, BORDER_WIDTH, tempBorderWidth); + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, tempTextAlignment); + //-------------------------------------------------------------------- + + return result; // Window close button clicked: result = 1 +} + +// Group Box control with text name +int GuiGroupBox(Rectangle bounds, const char *text) +{ + #if !defined(RAYGUI_GROUPBOX_LINE_THICK) + #define RAYGUI_GROUPBOX_LINE_THICK 1 + #endif + + int result = 0; + GuiState state = guiState; + + // Draw control + //-------------------------------------------------------------------- + GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y, RAYGUI_GROUPBOX_LINE_THICK, bounds.height }, 0, BLANK, GetColor(GuiGetStyle(DEFAULT, (state == STATE_DISABLED)? (int)BORDER_COLOR_DISABLED : (int)LINE_COLOR))); + GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y + bounds.height - 1, bounds.width, RAYGUI_GROUPBOX_LINE_THICK }, 0, BLANK, GetColor(GuiGetStyle(DEFAULT, (state == STATE_DISABLED)? (int)BORDER_COLOR_DISABLED : (int)LINE_COLOR))); + GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x + bounds.width - 1, bounds.y, RAYGUI_GROUPBOX_LINE_THICK, bounds.height }, 0, BLANK, GetColor(GuiGetStyle(DEFAULT, (state == STATE_DISABLED)? (int)BORDER_COLOR_DISABLED : (int)LINE_COLOR))); + + GuiLine(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y - GuiGetStyle(DEFAULT, TEXT_SIZE)/2, bounds.width, (float)GuiGetStyle(DEFAULT, TEXT_SIZE) }, text); + //-------------------------------------------------------------------- + + return result; +} + +// Line control +int GuiLine(Rectangle bounds, const char *text) +{ + #if !defined(RAYGUI_LINE_MARGIN_TEXT) + #define RAYGUI_LINE_MARGIN_TEXT 12 + #endif + #if !defined(RAYGUI_LINE_TEXT_PADDING) + #define RAYGUI_LINE_TEXT_PADDING 4 + #endif + + int result = 0; + GuiState state = guiState; + + Color color = GetColor(GuiGetStyle(DEFAULT, (state == STATE_DISABLED)? (int)BORDER_COLOR_DISABLED : (int)LINE_COLOR)); + + // Draw control + //-------------------------------------------------------------------- + if (text == NULL) GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y + bounds.height/2, bounds.width, 1 }, 0, BLANK, color); + else + { + Rectangle textBounds = { 0 }; + textBounds.width = (float)GetTextWidth(text) + 2; + textBounds.height = bounds.height; + textBounds.x = bounds.x + RAYGUI_LINE_MARGIN_TEXT; + textBounds.y = bounds.y; + + // Draw line with embedded text label: "--- text --------------" + GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y + bounds.height/2, RAYGUI_LINE_MARGIN_TEXT - RAYGUI_LINE_TEXT_PADDING, 1 }, 0, BLANK, color); + GuiDrawText(text, textBounds, TEXT_ALIGN_LEFT, color); + GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x + 12 + textBounds.width + 4, bounds.y + bounds.height/2, bounds.width - textBounds.width - RAYGUI_LINE_MARGIN_TEXT - RAYGUI_LINE_TEXT_PADDING, 1 }, 0, BLANK, color); + } + //-------------------------------------------------------------------- + + return result; +} + +// Panel control +int GuiPanel(Rectangle bounds, const char *text) +{ + #if !defined(RAYGUI_PANEL_BORDER_WIDTH) + #define RAYGUI_PANEL_BORDER_WIDTH 1 + #endif + + int result = 0; + GuiState state = guiState; + + // Text will be drawn as a header bar (if provided) + Rectangle statusBar = { bounds.x, bounds.y, bounds.width, (float)RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT }; + if ((text != NULL) && (bounds.height < RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT*2.0f)) bounds.height = RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT*2.0f; + + if (text != NULL) + { + // Move panel bounds after the header bar + bounds.y += (float)RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT - 1; + bounds.height -= (float)RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT - 1; + } + + // Draw control + //-------------------------------------------------------------------- + if (text != NULL) GuiStatusBar(statusBar, text); // Draw panel header as status bar + + GuiDrawRectangle(bounds, RAYGUI_PANEL_BORDER_WIDTH, GetColor(GuiGetStyle(DEFAULT, (state == STATE_DISABLED)? (int)BORDER_COLOR_DISABLED : (int)LINE_COLOR)), + GetColor(GuiGetStyle(DEFAULT, (state == STATE_DISABLED)? (int)BASE_COLOR_DISABLED : (int)BACKGROUND_COLOR))); + //-------------------------------------------------------------------- + + return result; +} + +// Tab Bar control +// NOTE: Using GuiToggle() for the TABS +int GuiTabBar(Rectangle bounds, const char **text, int count, int *active) +{ + #define RAYGUI_TABBAR_ITEM_WIDTH 160 + + int result = -1; + //GuiState state = guiState; + + Rectangle tabBounds = { bounds.x, bounds.y, RAYGUI_TABBAR_ITEM_WIDTH, bounds.height }; + + if (*active < 0) *active = 0; + else if (*active > count - 1) *active = count - 1; + + int offsetX = 0; // Required in case tabs go out of screen + offsetX = (*active + 2)*RAYGUI_TABBAR_ITEM_WIDTH - GetScreenWidth(); + if (offsetX < 0) offsetX = 0; + + bool toggle = false; // Required for individual toggles + + // Draw control + //-------------------------------------------------------------------- + for (int i = 0; i < count; i++) + { + tabBounds.x = bounds.x + (RAYGUI_TABBAR_ITEM_WIDTH + 4)*i - offsetX; + + if (tabBounds.x < GetScreenWidth()) + { + // Draw tabs as toggle controls + int textAlignment = GuiGetStyle(TOGGLE, TEXT_ALIGNMENT); + int textPadding = GuiGetStyle(TOGGLE, TEXT_PADDING); + GuiSetStyle(TOGGLE, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT); + GuiSetStyle(TOGGLE, TEXT_PADDING, 8); + + if (i == (*active)) + { + toggle = true; + GuiToggle(tabBounds, GuiIconText(12, text[i]), &toggle); + } + else + { + toggle = false; + GuiToggle(tabBounds, GuiIconText(12, text[i]), &toggle); + if (toggle) *active = i; + } + + // Close tab with middle mouse button pressed + if (CheckCollisionPointRec(GetMousePosition(), tabBounds) && IsMouseButtonPressed(MOUSE_MIDDLE_BUTTON)) result = i; + + GuiSetStyle(TOGGLE, TEXT_PADDING, textPadding); + GuiSetStyle(TOGGLE, TEXT_ALIGNMENT, textAlignment); + + // Draw tab close button + // NOTE: Only draw close button for current tab: if (CheckCollisionPointRec(mousePosition, tabBounds)) + int tempBorderWidth = GuiGetStyle(BUTTON, BORDER_WIDTH); + int tempTextAlignment = GuiGetStyle(BUTTON, TEXT_ALIGNMENT); + GuiSetStyle(BUTTON, BORDER_WIDTH, 1); + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); +#if defined(RAYGUI_NO_ICONS) + if (GuiButton(RAYGUI_CLITERAL(Rectangle){ tabBounds.x + tabBounds.width - 14 - 5, tabBounds.y + 5, 14, 14 }, "x")) result = i; +#else + if (GuiButton(RAYGUI_CLITERAL(Rectangle){ tabBounds.x + tabBounds.width - 14 - 5, tabBounds.y + 5, 14, 14 }, GuiIconText(ICON_CROSS_SMALL, NULL))) result = i; +#endif + GuiSetStyle(BUTTON, BORDER_WIDTH, tempBorderWidth); + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, tempTextAlignment); + } + } + + // Draw tab-bar bottom line + GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y + bounds.height - 1, bounds.width, 1 }, 0, BLANK, GetColor(GuiGetStyle(TOGGLE, BORDER_COLOR_NORMAL))); + //-------------------------------------------------------------------- + + return result; // Return as result the current TAB closing requested +} + +// Scroll Panel control +int GuiScrollPanel(Rectangle bounds, const char *text, Rectangle content, Vector2 *scroll, Rectangle *view) +{ + #define RAYGUI_MIN_SCROLLBAR_WIDTH 40 + #define RAYGUI_MIN_SCROLLBAR_HEIGHT 40 + #define RAYGUI_MIN_MOUSE_WHEEL_SPEED 20 + + int result = 0; + GuiState state = guiState; + + Rectangle temp = { 0 }; + if (view == NULL) view = &temp; + + Vector2 scrollPos = { 0.0f, 0.0f }; + if (scroll != NULL) scrollPos = *scroll; + + // Text will be drawn as a header bar (if provided) + Rectangle statusBar = { bounds.x, bounds.y, bounds.width, (float)RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT }; + if (bounds.height < RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT*2.0f) bounds.height = RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT*2.0f; + + if (text != NULL) + { + // Move panel bounds after the header bar + bounds.y += (float)RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT - 1; + bounds.height -= (float)RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT + 1; + } + + bool hasHorizontalScrollBar = (content.width > bounds.width - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH))? true : false; + bool hasVerticalScrollBar = (content.height > bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH))? true : false; + + // Recheck to account for the other scrollbar being visible + if (!hasHorizontalScrollBar) hasHorizontalScrollBar = (hasVerticalScrollBar && (content.width > (bounds.width - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH))))? true : false; + if (!hasVerticalScrollBar) hasVerticalScrollBar = (hasHorizontalScrollBar && (content.height > (bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH))))? true : false; + + int horizontalScrollBarWidth = hasHorizontalScrollBar? GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH) : 0; + int verticalScrollBarWidth = hasVerticalScrollBar? GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH) : 0; + Rectangle horizontalScrollBar = { + (float)((GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (float)bounds.x + verticalScrollBarWidth : (float)bounds.x) + GuiGetStyle(DEFAULT, BORDER_WIDTH), + (float)bounds.y + bounds.height - horizontalScrollBarWidth - GuiGetStyle(DEFAULT, BORDER_WIDTH), + (float)bounds.width - verticalScrollBarWidth - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH), + (float)horizontalScrollBarWidth + }; + Rectangle verticalScrollBar = { + (float)((GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (float)bounds.x + GuiGetStyle(DEFAULT, BORDER_WIDTH) : (float)bounds.x + bounds.width - verticalScrollBarWidth - GuiGetStyle(DEFAULT, BORDER_WIDTH)), + (float)bounds.y + GuiGetStyle(DEFAULT, BORDER_WIDTH), + (float)verticalScrollBarWidth, + (float)bounds.height - horizontalScrollBarWidth - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) + }; + + // Make sure scroll bars have a minimum width/height + if (horizontalScrollBar.width < RAYGUI_MIN_SCROLLBAR_WIDTH) horizontalScrollBar.width = RAYGUI_MIN_SCROLLBAR_WIDTH; + if (verticalScrollBar.height < RAYGUI_MIN_SCROLLBAR_HEIGHT) verticalScrollBar.height = RAYGUI_MIN_SCROLLBAR_HEIGHT; + + // Calculate view area (area without the scrollbars) + *view = (GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? + RAYGUI_CLITERAL(Rectangle){ bounds.x + verticalScrollBarWidth + GuiGetStyle(DEFAULT, BORDER_WIDTH), bounds.y + GuiGetStyle(DEFAULT, BORDER_WIDTH), bounds.width - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - verticalScrollBarWidth, bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - horizontalScrollBarWidth } : + RAYGUI_CLITERAL(Rectangle){ bounds.x + GuiGetStyle(DEFAULT, BORDER_WIDTH), bounds.y + GuiGetStyle(DEFAULT, BORDER_WIDTH), bounds.width - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - verticalScrollBarWidth, bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - horizontalScrollBarWidth }; + + // Clip view area to the actual content size + if (view->width > content.width) view->width = content.width; + if (view->height > content.height) view->height = content.height; + + float horizontalMin = hasHorizontalScrollBar? ((GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (float)-verticalScrollBarWidth : 0) - (float)GuiGetStyle(DEFAULT, BORDER_WIDTH) : (((float)GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (float)-verticalScrollBarWidth : 0) - (float)GuiGetStyle(DEFAULT, BORDER_WIDTH); + float horizontalMax = hasHorizontalScrollBar? content.width - bounds.width + (float)verticalScrollBarWidth + GuiGetStyle(DEFAULT, BORDER_WIDTH) - (((float)GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (float)verticalScrollBarWidth : 0) : (float)-GuiGetStyle(DEFAULT, BORDER_WIDTH); + float verticalMin = hasVerticalScrollBar? 0.0f : -1.0f; + float verticalMax = hasVerticalScrollBar? content.height - bounds.height + (float)horizontalScrollBarWidth + (float)GuiGetStyle(DEFAULT, BORDER_WIDTH) : (float)-GuiGetStyle(DEFAULT, BORDER_WIDTH); + + // Update control + //-------------------------------------------------------------------- + if ((state != STATE_DISABLED) && !guiLocked) + { + Vector2 mousePoint = GetMousePosition(); + + // Check button state + if (CheckCollisionPointRec(mousePoint, bounds)) + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED; + else state = STATE_FOCUSED; + +#if defined(SUPPORT_SCROLLBAR_KEY_INPUT) + if (hasHorizontalScrollBar) + { + if (IsKeyDown(KEY_RIGHT)) scrollPos.x -= GuiGetStyle(SCROLLBAR, SCROLL_SPEED); + if (IsKeyDown(KEY_LEFT)) scrollPos.x += GuiGetStyle(SCROLLBAR, SCROLL_SPEED); + } + + if (hasVerticalScrollBar) + { + if (IsKeyDown(KEY_DOWN)) scrollPos.y -= GuiGetStyle(SCROLLBAR, SCROLL_SPEED); + if (IsKeyDown(KEY_UP)) scrollPos.y += GuiGetStyle(SCROLLBAR, SCROLL_SPEED); + } +#endif + float wheelMove = GetMouseWheelMove(); + + // Set scrolling speed with mouse wheel based on ratio between bounds and content + Vector2 mouseWheelSpeed = { content.width/bounds.width, content.height/bounds.height }; + if (mouseWheelSpeed.x < RAYGUI_MIN_MOUSE_WHEEL_SPEED) mouseWheelSpeed.x = RAYGUI_MIN_MOUSE_WHEEL_SPEED; + if (mouseWheelSpeed.y < RAYGUI_MIN_MOUSE_WHEEL_SPEED) mouseWheelSpeed.y = RAYGUI_MIN_MOUSE_WHEEL_SPEED; + + // Horizontal and vertical scrolling with mouse wheel + if (hasHorizontalScrollBar && (IsKeyDown(KEY_LEFT_CONTROL) || IsKeyDown(KEY_LEFT_SHIFT))) scrollPos.x += wheelMove*mouseWheelSpeed.x; + else scrollPos.y += wheelMove*mouseWheelSpeed.y; // Vertical scroll + } + } + + // Normalize scroll values + if (scrollPos.x > -horizontalMin) scrollPos.x = -horizontalMin; + if (scrollPos.x < -horizontalMax) scrollPos.x = -horizontalMax; + if (scrollPos.y > -verticalMin) scrollPos.y = -verticalMin; + if (scrollPos.y < -verticalMax) scrollPos.y = -verticalMax; + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + if (text != NULL) GuiStatusBar(statusBar, text); // Draw panel header as status bar + + GuiDrawRectangle(bounds, 0, BLANK, GetColor(GuiGetStyle(DEFAULT, BACKGROUND_COLOR))); // Draw background + + // Save size of the scrollbar slider + const int slider = GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE); + + // Draw horizontal scrollbar if visible + if (hasHorizontalScrollBar) + { + // Change scrollbar slider size to show the diff in size between the content width and the widget width + GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, (int)(((bounds.width - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - verticalScrollBarWidth)/(int)content.width)*((int)bounds.width - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - verticalScrollBarWidth))); + scrollPos.x = (float)-GuiScrollBar(horizontalScrollBar, (int)-scrollPos.x, (int)horizontalMin, (int)horizontalMax); + } + else scrollPos.x = 0.0f; + + // Draw vertical scrollbar if visible + if (hasVerticalScrollBar) + { + // Change scrollbar slider size to show the diff in size between the content height and the widget height + GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, (int)(((bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - horizontalScrollBarWidth)/(int)content.height)*((int)bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - horizontalScrollBarWidth))); + scrollPos.y = (float)-GuiScrollBar(verticalScrollBar, (int)-scrollPos.y, (int)verticalMin, (int)verticalMax); + } + else scrollPos.y = 0.0f; + + // Draw detail corner rectangle if both scroll bars are visible + if (hasHorizontalScrollBar && hasVerticalScrollBar) + { + Rectangle corner = { (GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (bounds.x + GuiGetStyle(DEFAULT, BORDER_WIDTH) + 2) : (horizontalScrollBar.x + horizontalScrollBar.width + 2), verticalScrollBar.y + verticalScrollBar.height + 2, (float)horizontalScrollBarWidth - 4, (float)verticalScrollBarWidth - 4 }; + GuiDrawRectangle(corner, 0, BLANK, GetColor(GuiGetStyle(LISTVIEW, TEXT + (state*3)))); + } + + // Draw scrollbar lines depending on current state + GuiDrawRectangle(bounds, GuiGetStyle(LISTVIEW, BORDER_WIDTH), GetColor(GuiGetStyle(LISTVIEW, BORDER + (state*3))), BLANK); + + // Set scrollbar slider size back to the way it was before + GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, slider); + //-------------------------------------------------------------------- + + if (scroll != NULL) *scroll = scrollPos; + + return result; +} + +// Label control +int GuiLabel(Rectangle bounds, const char *text) +{ + int result = 0; + GuiState state = guiState; + + // Update control + //-------------------------------------------------------------------- + //... + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + GuiDrawText(text, GetTextBounds(LABEL, bounds), GuiGetStyle(LABEL, TEXT_ALIGNMENT), GetColor(GuiGetStyle(LABEL, TEXT + (state*3)))); + //-------------------------------------------------------------------- + + return result; +} + +// Button control, returns true when clicked +int GuiButton(Rectangle bounds, const char *text) +{ + int result = 0; + GuiState state = guiState; + + // Update control + //-------------------------------------------------------------------- + if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) + { + Vector2 mousePoint = GetMousePosition(); + + // Check button state + if (CheckCollisionPointRec(mousePoint, bounds)) + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED; + else state = STATE_FOCUSED; + + if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) result = 1; + } + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + GuiDrawRectangle(bounds, GuiGetStyle(BUTTON, BORDER_WIDTH), GetColor(GuiGetStyle(BUTTON, BORDER + (state*3))), GetColor(GuiGetStyle(BUTTON, BASE + (state*3)))); + GuiDrawText(text, GetTextBounds(BUTTON, bounds), GuiGetStyle(BUTTON, TEXT_ALIGNMENT), GetColor(GuiGetStyle(BUTTON, TEXT + (state*3)))); + + if (state == STATE_FOCUSED) GuiTooltip(bounds); + //------------------------------------------------------------------ + + return result; // Button pressed: result = 1 +} + +// Label button control +int GuiLabelButton(Rectangle bounds, const char *text) +{ + GuiState state = guiState; + bool pressed = false; + + // NOTE: We force bounds.width to be all text + float textWidth = (float)GetTextWidth(text); + if ((bounds.width - 2*GuiGetStyle(LABEL, BORDER_WIDTH) - 2*GuiGetStyle(LABEL, TEXT_PADDING)) < textWidth) bounds.width = textWidth + 2*GuiGetStyle(LABEL, BORDER_WIDTH) + 2*GuiGetStyle(LABEL, TEXT_PADDING) + 2; + + // Update control + //-------------------------------------------------------------------- + if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) + { + Vector2 mousePoint = GetMousePosition(); + + // Check checkbox state + if (CheckCollisionPointRec(mousePoint, bounds)) + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED; + else state = STATE_FOCUSED; + + if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) pressed = true; + } + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + GuiDrawText(text, GetTextBounds(LABEL, bounds), GuiGetStyle(LABEL, TEXT_ALIGNMENT), GetColor(GuiGetStyle(LABEL, TEXT + (state*3)))); + //-------------------------------------------------------------------- + + return pressed; +} + +// Toggle Button control +int GuiToggle(Rectangle bounds, const char *text, bool *active) +{ + int result = 0; + GuiState state = guiState; + + bool temp = false; + if (active == NULL) active = &temp; + + // Update control + //-------------------------------------------------------------------- + if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) + { + Vector2 mousePoint = GetMousePosition(); + + // Check toggle button state + if (CheckCollisionPointRec(mousePoint, bounds)) + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED; + else if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) + { + state = STATE_NORMAL; + *active = !(*active); + } + else state = STATE_FOCUSED; + } + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + if (state == STATE_NORMAL) + { + GuiDrawRectangle(bounds, GuiGetStyle(TOGGLE, BORDER_WIDTH), GetColor(GuiGetStyle(TOGGLE, ((*active)? BORDER_COLOR_PRESSED : (BORDER + state*3)))), GetColor(GuiGetStyle(TOGGLE, ((*active)? BASE_COLOR_PRESSED : (BASE + state*3))))); + GuiDrawText(text, GetTextBounds(TOGGLE, bounds), GuiGetStyle(TOGGLE, TEXT_ALIGNMENT), GetColor(GuiGetStyle(TOGGLE, ((*active)? TEXT_COLOR_PRESSED : (TEXT + state*3))))); + } + else + { + GuiDrawRectangle(bounds, GuiGetStyle(TOGGLE, BORDER_WIDTH), GetColor(GuiGetStyle(TOGGLE, BORDER + state*3)), GetColor(GuiGetStyle(TOGGLE, BASE + state*3))); + GuiDrawText(text, GetTextBounds(TOGGLE, bounds), GuiGetStyle(TOGGLE, TEXT_ALIGNMENT), GetColor(GuiGetStyle(TOGGLE, TEXT + state*3))); + } + + if (state == STATE_FOCUSED) GuiTooltip(bounds); + //-------------------------------------------------------------------- + + return result; +} + +// Toggle Group control +int GuiToggleGroup(Rectangle bounds, const char *text, int *active) +{ + #if !defined(RAYGUI_TOGGLEGROUP_MAX_ITEMS) + #define RAYGUI_TOGGLEGROUP_MAX_ITEMS 32 + #endif + + int result = 0; + float initBoundsX = bounds.x; + + int temp = 0; + if (active == NULL) active = &temp; + + bool toggle = false; // Required for individual toggles + + // Get substrings items from text (items pointers) + int rows[RAYGUI_TOGGLEGROUP_MAX_ITEMS] = { 0 }; + int itemCount = 0; + const char **items = GuiTextSplit(text, ';', &itemCount, rows); + + int prevRow = rows[0]; + + for (int i = 0; i < itemCount; i++) + { + if (prevRow != rows[i]) + { + bounds.x = initBoundsX; + bounds.y += (bounds.height + GuiGetStyle(TOGGLE, GROUP_PADDING)); + prevRow = rows[i]; + } + + if (i == (*active)) + { + toggle = true; + GuiToggle(bounds, items[i], &toggle); + } + else + { + toggle = false; + GuiToggle(bounds, items[i], &toggle); + if (toggle) *active = i; + } + + bounds.x += (bounds.width + GuiGetStyle(TOGGLE, GROUP_PADDING)); + } + + return result; +} + +// Toggle Slider control extended +int GuiToggleSlider(Rectangle bounds, const char *text, int *active) +{ + int result = 0; + GuiState state = guiState; + + int temp = 0; + if (active == NULL) active = &temp; + + //bool toggle = false; // Required for individual toggles + + // Get substrings items from text (items pointers) + int itemCount = 0; + const char **items = NULL; + + if (text != NULL) items = GuiTextSplit(text, ';', &itemCount, NULL); + + Rectangle slider = { + 0, // Calculated later depending on the active toggle + bounds.y + GuiGetStyle(SLIDER, BORDER_WIDTH) + GuiGetStyle(SLIDER, SLIDER_PADDING), + (bounds.width - 2*GuiGetStyle(SLIDER, BORDER_WIDTH) - (itemCount + 1)*GuiGetStyle(SLIDER, SLIDER_PADDING))/itemCount, + bounds.height - 2*GuiGetStyle(SLIDER, BORDER_WIDTH) - 2*GuiGetStyle(SLIDER, SLIDER_PADDING) }; + + // Update control + //-------------------------------------------------------------------- + if ((state != STATE_DISABLED) && !guiLocked) + { + Vector2 mousePoint = GetMousePosition(); + + if (CheckCollisionPointRec(mousePoint, bounds)) + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED; + else if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) + { + state = STATE_PRESSED; + (*active)++; + result = 1; + } + else state = STATE_FOCUSED; + } + + if ((*active) && (state != STATE_FOCUSED)) state = STATE_PRESSED; + } + + if (*active >= itemCount) *active = 0; + slider.x = bounds.x + GuiGetStyle(SLIDER, BORDER_WIDTH) + (*active + 1)*GuiGetStyle(SLIDER, SLIDER_PADDING) + (*active)*slider.width; + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + GuiDrawRectangle(bounds, GuiGetStyle(SLIDER, BORDER_WIDTH), GetColor(GuiGetStyle(TOGGLE, BORDER + (state*3))), + GetColor(GuiGetStyle(TOGGLE, BASE_COLOR_NORMAL))); + + // Draw internal slider + if (state == STATE_NORMAL) GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, BASE_COLOR_PRESSED))); + else if (state == STATE_FOCUSED) GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, BASE_COLOR_FOCUSED))); + else if (state == STATE_PRESSED) GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, BASE_COLOR_PRESSED))); + + // Draw text in slider + if (text != NULL) + { + Rectangle textBounds = { 0 }; + textBounds.width = (float)GetTextWidth(text); + textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); + textBounds.x = slider.x + slider.width/2 - textBounds.width/2; + textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2; + + GuiDrawText(items[*active], textBounds, GuiGetStyle(TOGGLE, TEXT_ALIGNMENT), Fade(GetColor(GuiGetStyle(TOGGLE, TEXT + (state*3))), guiAlpha)); + } + //-------------------------------------------------------------------- + + return result; +} + +// Check Box control, returns 1 when state changed +int GuiCheckBox(Rectangle bounds, const char *text, bool *checked) +{ + int result = 0; + GuiState state = guiState; + + bool temp = false; + if (checked == NULL) checked = &temp; + + Rectangle textBounds = { 0 }; + + if (text != NULL) + { + textBounds.width = (float)GetTextWidth(text) + 2; + textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); + textBounds.x = bounds.x + bounds.width + GuiGetStyle(CHECKBOX, TEXT_PADDING); + textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2; + if (GuiGetStyle(CHECKBOX, TEXT_ALIGNMENT) == TEXT_ALIGN_LEFT) textBounds.x = bounds.x - textBounds.width - GuiGetStyle(CHECKBOX, TEXT_PADDING); + } + + // Update control + //-------------------------------------------------------------------- + if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) + { + Vector2 mousePoint = GetMousePosition(); + + Rectangle totalBounds = { + (GuiGetStyle(CHECKBOX, TEXT_ALIGNMENT) == TEXT_ALIGN_LEFT)? textBounds.x : bounds.x, + bounds.y, + bounds.width + textBounds.width + GuiGetStyle(CHECKBOX, TEXT_PADDING), + bounds.height, + }; + + // Check checkbox state + if (CheckCollisionPointRec(mousePoint, totalBounds)) + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED; + else state = STATE_FOCUSED; + + if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) + { + *checked = !(*checked); + result = 1; + } + } + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + GuiDrawRectangle(bounds, GuiGetStyle(CHECKBOX, BORDER_WIDTH), GetColor(GuiGetStyle(CHECKBOX, BORDER + (state*3))), BLANK); + + if (*checked) + { + Rectangle check = { bounds.x + GuiGetStyle(CHECKBOX, BORDER_WIDTH) + GuiGetStyle(CHECKBOX, CHECK_PADDING), + bounds.y + GuiGetStyle(CHECKBOX, BORDER_WIDTH) + GuiGetStyle(CHECKBOX, CHECK_PADDING), + bounds.width - 2*(GuiGetStyle(CHECKBOX, BORDER_WIDTH) + GuiGetStyle(CHECKBOX, CHECK_PADDING)), + bounds.height - 2*(GuiGetStyle(CHECKBOX, BORDER_WIDTH) + GuiGetStyle(CHECKBOX, CHECK_PADDING)) }; + GuiDrawRectangle(check, 0, BLANK, GetColor(GuiGetStyle(CHECKBOX, TEXT + state*3))); + } + + GuiDrawText(text, textBounds, (GuiGetStyle(CHECKBOX, TEXT_ALIGNMENT) == TEXT_ALIGN_RIGHT)? TEXT_ALIGN_LEFT : TEXT_ALIGN_RIGHT, GetColor(GuiGetStyle(LABEL, TEXT + (state*3)))); + //-------------------------------------------------------------------- + + return result; +} + +// Combo Box control +int GuiComboBox(Rectangle bounds, const char *text, int *active) +{ + int result = 0; + GuiState state = guiState; + + int temp = 0; + if (active == NULL) active = &temp; + + bounds.width -= (GuiGetStyle(COMBOBOX, COMBO_BUTTON_WIDTH) + GuiGetStyle(COMBOBOX, COMBO_BUTTON_SPACING)); + + Rectangle selector = { (float)bounds.x + bounds.width + GuiGetStyle(COMBOBOX, COMBO_BUTTON_SPACING), + (float)bounds.y, (float)GuiGetStyle(COMBOBOX, COMBO_BUTTON_WIDTH), (float)bounds.height }; + + // Get substrings items from text (items pointers, lengths and count) + int itemCount = 0; + const char **items = GuiTextSplit(text, ';', &itemCount, NULL); + + if (*active < 0) *active = 0; + else if (*active > (itemCount - 1)) *active = itemCount - 1; + + // Update control + //-------------------------------------------------------------------- + if ((state != STATE_DISABLED) && !guiLocked && (itemCount > 1) && !guiControlExclusiveMode) + { + Vector2 mousePoint = GetMousePosition(); + + if (CheckCollisionPointRec(mousePoint, bounds) || + CheckCollisionPointRec(mousePoint, selector)) + { + if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) + { + *active += 1; + if (*active >= itemCount) *active = 0; // Cyclic combobox + } + + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED; + else state = STATE_FOCUSED; + } + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + // Draw combo box main + GuiDrawRectangle(bounds, GuiGetStyle(COMBOBOX, BORDER_WIDTH), GetColor(GuiGetStyle(COMBOBOX, BORDER + (state*3))), GetColor(GuiGetStyle(COMBOBOX, BASE + (state*3)))); + GuiDrawText(items[*active], GetTextBounds(COMBOBOX, bounds), GuiGetStyle(COMBOBOX, TEXT_ALIGNMENT), GetColor(GuiGetStyle(COMBOBOX, TEXT + (state*3)))); + + // Draw selector using a custom button + // NOTE: BORDER_WIDTH and TEXT_ALIGNMENT forced values + int tempBorderWidth = GuiGetStyle(BUTTON, BORDER_WIDTH); + int tempTextAlign = GuiGetStyle(BUTTON, TEXT_ALIGNMENT); + GuiSetStyle(BUTTON, BORDER_WIDTH, 1); + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); + + GuiButton(selector, TextFormat("%i/%i", *active + 1, itemCount)); + + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, tempTextAlign); + GuiSetStyle(BUTTON, BORDER_WIDTH, tempBorderWidth); + //-------------------------------------------------------------------- + + return result; +} + +// Dropdown Box control +// NOTE: Returns mouse click +int GuiDropdownBox(Rectangle bounds, const char *text, int *active, bool editMode) +{ + int result = 0; + GuiState state = guiState; + + int temp = 0; + if (active == NULL) active = &temp; + + int itemSelected = *active; + int itemFocused = -1; + + int direction = 0; // Dropdown box open direction: down (default) + if (GuiGetStyle(DROPDOWNBOX, DROPDOWN_ROLL_UP) == 1) direction = 1; // Up + + // Get substrings items from text (items pointers, lengths and count) + int itemCount = 0; + const char **items = GuiTextSplit(text, ';', &itemCount, NULL); + + Rectangle boundsOpen = bounds; + boundsOpen.height = (itemCount + 1)*(bounds.height + GuiGetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_SPACING)); + if (direction == 1) boundsOpen.y -= itemCount*(bounds.height + GuiGetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_SPACING)) + GuiGetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_SPACING); + + Rectangle itemBounds = bounds; + + // Update control + //-------------------------------------------------------------------- + if ((state != STATE_DISABLED) && (editMode || !guiLocked) && (itemCount > 1) && !guiControlExclusiveMode) + { + Vector2 mousePoint = GetMousePosition(); + + if (editMode) + { + state = STATE_PRESSED; + + // Check if mouse has been pressed or released outside limits + if (!CheckCollisionPointRec(mousePoint, boundsOpen)) + { + if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON) || IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) result = 1; + } + + // Check if already selected item has been pressed again + if (CheckCollisionPointRec(mousePoint, bounds) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) result = 1; + + // Check focused and selected item + for (int i = 0; i < itemCount; i++) + { + // Update item rectangle y position for next item + if (direction == 0) itemBounds.y += (bounds.height + GuiGetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_SPACING)); + else itemBounds.y -= (bounds.height + GuiGetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_SPACING)); + + if (CheckCollisionPointRec(mousePoint, itemBounds)) + { + itemFocused = i; + if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) + { + itemSelected = i; + result = 1; // Item selected + } + break; + } + } + + itemBounds = bounds; + } + else + { + if (CheckCollisionPointRec(mousePoint, bounds)) + { + if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) + { + result = 1; + state = STATE_PRESSED; + } + else state = STATE_FOCUSED; + } + } + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + if (editMode) GuiPanel(boundsOpen, NULL); + + GuiDrawRectangle(bounds, GuiGetStyle(DROPDOWNBOX, BORDER_WIDTH), GetColor(GuiGetStyle(DROPDOWNBOX, BORDER + state*3)), GetColor(GuiGetStyle(DROPDOWNBOX, BASE + state*3))); + GuiDrawText(items[itemSelected], GetTextBounds(DROPDOWNBOX, bounds), GuiGetStyle(DROPDOWNBOX, TEXT_ALIGNMENT), GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + state*3))); + + if (editMode) + { + // Draw visible items + for (int i = 0; i < itemCount; i++) + { + // Update item rectangle y position for next item + if (direction == 0) itemBounds.y += (bounds.height + GuiGetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_SPACING)); + else itemBounds.y -= (bounds.height + GuiGetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_SPACING)); + + if (i == itemSelected) + { + GuiDrawRectangle(itemBounds, GuiGetStyle(DROPDOWNBOX, BORDER_WIDTH), GetColor(GuiGetStyle(DROPDOWNBOX, BORDER_COLOR_PRESSED)), GetColor(GuiGetStyle(DROPDOWNBOX, BASE_COLOR_PRESSED))); + GuiDrawText(items[i], GetTextBounds(DROPDOWNBOX, itemBounds), GuiGetStyle(DROPDOWNBOX, TEXT_ALIGNMENT), GetColor(GuiGetStyle(DROPDOWNBOX, TEXT_COLOR_PRESSED))); + } + else if (i == itemFocused) + { + GuiDrawRectangle(itemBounds, GuiGetStyle(DROPDOWNBOX, BORDER_WIDTH), GetColor(GuiGetStyle(DROPDOWNBOX, BORDER_COLOR_FOCUSED)), GetColor(GuiGetStyle(DROPDOWNBOX, BASE_COLOR_FOCUSED))); + GuiDrawText(items[i], GetTextBounds(DROPDOWNBOX, itemBounds), GuiGetStyle(DROPDOWNBOX, TEXT_ALIGNMENT), GetColor(GuiGetStyle(DROPDOWNBOX, TEXT_COLOR_FOCUSED))); + } + else GuiDrawText(items[i], GetTextBounds(DROPDOWNBOX, itemBounds), GuiGetStyle(DROPDOWNBOX, TEXT_ALIGNMENT), GetColor(GuiGetStyle(DROPDOWNBOX, TEXT_COLOR_NORMAL))); + } + } + + if (!GuiGetStyle(DROPDOWNBOX, DROPDOWN_ARROW_HIDDEN)) + { + // Draw arrows (using icon if available) +#if defined(RAYGUI_NO_ICONS) + GuiDrawText("v", RAYGUI_CLITERAL(Rectangle){ bounds.x + bounds.width - GuiGetStyle(DROPDOWNBOX, ARROW_PADDING), bounds.y + bounds.height/2 - 2, 10, 10 }, + TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + (state*3)))); +#else + GuiDrawText(direction? "#121#" : "#120#", RAYGUI_CLITERAL(Rectangle){ bounds.x + bounds.width - GuiGetStyle(DROPDOWNBOX, ARROW_PADDING), bounds.y + bounds.height/2 - 6, 10, 10 }, + TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + (state*3)))); // ICON_ARROW_DOWN_FILL +#endif + } + //-------------------------------------------------------------------- + + *active = itemSelected; + + // TODO: Use result to return more internal states: mouse-press out-of-bounds, mouse-press over selected-item... + return result; // Mouse click: result = 1 +} + +// Text Box control +// NOTE: Returns true on ENTER pressed (useful for data validation) +int GuiTextBox(Rectangle bounds, char *text, int textSize, bool editMode) +{ + #if !defined(RAYGUI_TEXTBOX_AUTO_CURSOR_COOLDOWN) + #define RAYGUI_TEXTBOX_AUTO_CURSOR_COOLDOWN 30 // Frames to wait for autocursor movement + #endif + #if !defined(RAYGUI_TEXTBOX_AUTO_CURSOR_DELAY) + #define RAYGUI_TEXTBOX_AUTO_CURSOR_DELAY 2 // Frames delay for autocursor movement + #endif + + int result = 0; + GuiState state = guiState; + + bool multiline = false; // TODO: Consider multiline text input + int wrapMode = GuiGetStyle(DEFAULT, TEXT_WRAP_MODE); + + Rectangle textBounds = GetTextBounds(TEXTBOX, bounds); + int textLength = (text != NULL)? (int)strlen(text) : 0; // Get current text length + int thisCursorIndex = textBoxCursorIndex; + if (thisCursorIndex > textLength) thisCursorIndex = textLength; + int textWidth = GetTextWidth(text) - GetTextWidth(text + thisCursorIndex); + int textIndexOffset = 0; // Text index offset to start drawing in the box + + // Cursor rectangle + // NOTE: Position X value should be updated + Rectangle cursor = { + textBounds.x + textWidth + GuiGetStyle(DEFAULT, TEXT_SPACING), + textBounds.y + textBounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE), + 2, + (float)GuiGetStyle(DEFAULT, TEXT_SIZE)*2 + }; + + if (cursor.height >= bounds.height) cursor.height = bounds.height - GuiGetStyle(TEXTBOX, BORDER_WIDTH)*2; + if (cursor.y < (bounds.y + GuiGetStyle(TEXTBOX, BORDER_WIDTH))) cursor.y = bounds.y + GuiGetStyle(TEXTBOX, BORDER_WIDTH); + + // Mouse cursor rectangle + // NOTE: Initialized outside of screen + Rectangle mouseCursor = cursor; + mouseCursor.x = -1; + mouseCursor.width = 1; + + // Blink-cursor frame counter + //if (!autoCursorMode) blinkCursorFrameCounter++; + //else blinkCursorFrameCounter = 0; + + // Update control + //-------------------------------------------------------------------- + // WARNING: Text editing is only supported under certain conditions: + if ((state != STATE_DISABLED) && // Control not disabled + !GuiGetStyle(TEXTBOX, TEXT_READONLY) && // TextBox not on read-only mode + !guiLocked && // Gui not locked + !guiControlExclusiveMode && // No gui slider on dragging + (wrapMode == TEXT_WRAP_NONE)) // No wrap mode + { + Vector2 mousePosition = GetMousePosition(); + + if (editMode) + { + // GLOBAL: Auto-cursor movement logic + // NOTE: Keystrokes are handled repeatedly when button is held down for some time + if (IsKeyDown(KEY_LEFT) || IsKeyDown(KEY_RIGHT) || IsKeyDown(KEY_UP) || IsKeyDown(KEY_DOWN) || IsKeyDown(KEY_BACKSPACE) || IsKeyDown(KEY_DELETE)) autoCursorCounter++; + else autoCursorCounter = 0; + + bool autoCursorShouldTrigger = (autoCursorCounter > RAYGUI_TEXTBOX_AUTO_CURSOR_COOLDOWN) && ((autoCursorCounter % RAYGUI_TEXTBOX_AUTO_CURSOR_DELAY) == 0); + + state = STATE_PRESSED; + + if (textBoxCursorIndex > textLength) textBoxCursorIndex = textLength; + + // If text does not fit in the textbox and current cursor position is out of bounds, + // we add an index offset to text for drawing only what requires depending on cursor + while (textWidth >= textBounds.width) + { + int nextCodepointSize = 0; + GetCodepointNext(text + textIndexOffset, &nextCodepointSize); + + textIndexOffset += nextCodepointSize; + + textWidth = GetTextWidth(text + textIndexOffset) - GetTextWidth(text + textBoxCursorIndex); + } + + int codepoint = GetCharPressed(); // Get Unicode codepoint + if (multiline && IsKeyPressed(KEY_ENTER)) codepoint = (int)'\n'; + + // Encode codepoint as UTF-8 + int codepointSize = 0; + const char *charEncoded = CodepointToUTF8(codepoint, &codepointSize); + + // Handle Paste action + if (IsKeyPressed(KEY_V) && (IsKeyDown(KEY_LEFT_CONTROL) || IsKeyDown(KEY_RIGHT_CONTROL))) + { + const char *pasteText = GetClipboardText(); + if (pasteText != NULL) + { + int pasteLength = 0; + int pasteCodepoint; + int pasteCodepointSize; + // count how many codepoints to copy, stopping at the first unwanted control character + while (true) + { + pasteCodepoint = GetCodepointNext(pasteText + pasteLength, &pasteCodepointSize); + if (textLength + pasteLength + pasteCodepointSize >= textSize) break; + if (!(multiline && (pasteCodepoint == (int)'\n')) && !(pasteCodepoint >= 32)) break; + pasteLength += pasteCodepointSize; + } + if (pasteLength > 0) + { + // Move forward data from cursor position + for (int i = textLength + pasteLength; i > textBoxCursorIndex; i--) text[i] = text[i - pasteLength]; + + // Paste data in at cursor + for (int i = 0; i < pasteLength; i++) text[textBoxCursorIndex + i] = pasteText[i]; + + textBoxCursorIndex += pasteLength; + textLength += pasteLength; + text[textLength] = '\0'; + } + } + } + // Add codepoint to text, at current cursor position + // NOTE: Make sure we do not overflow buffer size + else if (((multiline && (codepoint == (int)'\n')) || (codepoint >= 32)) && ((textLength + codepointSize) < textSize)) + { + // Move forward data from cursor position + for (int i = (textLength + codepointSize); i > textBoxCursorIndex; i--) text[i] = text[i - codepointSize]; + + // Add new codepoint in current cursor position + for (int i = 0; i < codepointSize; i++) text[textBoxCursorIndex + i] = charEncoded[i]; + + textBoxCursorIndex += codepointSize; + textLength += codepointSize; + + // Make sure text last character is EOL + text[textLength] = '\0'; + } + + // Move cursor to start + if ((textLength > 0) && IsKeyPressed(KEY_HOME)) textBoxCursorIndex = 0; + + // Move cursor to end + if ((textLength > textBoxCursorIndex) && IsKeyPressed(KEY_END)) textBoxCursorIndex = textLength; + + // Delete related codepoints from text, after current cursor position + if ((textLength > textBoxCursorIndex) && IsKeyPressed(KEY_DELETE) && (IsKeyDown(KEY_LEFT_CONTROL) || IsKeyDown(KEY_RIGHT_CONTROL))) + { + int offset = textBoxCursorIndex; + int accCodepointSize = 0; + int nextCodepointSize; + int nextCodepoint; + // Check characters of the same type to delete (either ASCII punctuation or anything non-whitespace) + // Not using isalnum() since it only works on ASCII characters + nextCodepoint = GetCodepointNext(text + offset, &nextCodepointSize); + bool puctuation = ispunct(nextCodepoint & 0xFF); + while (offset < textLength) + { + if ((puctuation && !ispunct(nextCodepoint & 0xFF)) || (!puctuation && (isspace(nextCodepoint & 0xFF) || ispunct(nextCodepoint & 0xFF)))) + break; + offset += nextCodepointSize; + accCodepointSize += nextCodepointSize; + nextCodepoint = GetCodepointNext(text + offset, &nextCodepointSize); + } + // Check whitespace to delete (ASCII only) + while (offset < textLength) + { + if (!isspace(nextCodepoint & 0xFF)) + break; + offset += nextCodepointSize; + accCodepointSize += nextCodepointSize; + nextCodepoint = GetCodepointNext(text + offset, &nextCodepointSize); + } + + // Move text after cursor forward (including final null terminator) + for (int i = offset; i <= textLength; i++) text[i - accCodepointSize] = text[i]; + + textLength -= accCodepointSize; + } + // Delete single codepoint from text, after current cursor position + else if ((textLength > textBoxCursorIndex) && (IsKeyPressed(KEY_DELETE) || (IsKeyDown(KEY_DELETE) && autoCursorShouldTrigger))) + { + int nextCodepointSize = 0; + GetCodepointNext(text + textBoxCursorIndex, &nextCodepointSize); + + // Move text after cursor forward (including final null terminator) + for (int i = textBoxCursorIndex + nextCodepointSize; i <= textLength; i++) text[i - nextCodepointSize] = text[i]; + + textLength -= nextCodepointSize; + } + + // Delete related codepoints from text, before current cursor position + if ((textBoxCursorIndex > 0) && IsKeyPressed(KEY_BACKSPACE) && (IsKeyDown(KEY_LEFT_CONTROL) || IsKeyDown(KEY_RIGHT_CONTROL))) + { + int offset = textBoxCursorIndex; + int accCodepointSize = 0; + int prevCodepointSize; + int prevCodepoint; + + // Check whitespace to delete (ASCII only) + while (offset > 0) + { + prevCodepoint = GetCodepointPrevious(text + offset, &prevCodepointSize); + if (!isspace(prevCodepoint & 0xFF)) break; + + offset -= prevCodepointSize; + accCodepointSize += prevCodepointSize; + } + // Check characters of the same type to delete (either ASCII punctuation or anything non-whitespace) + // Not using isalnum() since it only works on ASCII characters + bool puctuation = ispunct(prevCodepoint & 0xFF); + while (offset > 0) + { + prevCodepoint = GetCodepointPrevious(text + offset, &prevCodepointSize); + if ((puctuation && !ispunct(prevCodepoint & 0xFF)) || (!puctuation && (isspace(prevCodepoint & 0xFF) || ispunct(prevCodepoint & 0xFF)))) break; + + offset -= prevCodepointSize; + accCodepointSize += prevCodepointSize; + } + + // Move text after cursor forward (including final null terminator) + for (int i = textBoxCursorIndex; i <= textLength; i++) text[i - accCodepointSize] = text[i]; + + textLength -= accCodepointSize; + textBoxCursorIndex -= accCodepointSize; + } + // Delete single codepoint from text, before current cursor position + else if ((textBoxCursorIndex > 0) && (IsKeyPressed(KEY_BACKSPACE) || (IsKeyDown(KEY_BACKSPACE) && autoCursorShouldTrigger))) + { + int prevCodepointSize = 0; + + GetCodepointPrevious(text + textBoxCursorIndex, &prevCodepointSize); + + // Move text after cursor forward (including final null terminator) + for (int i = textBoxCursorIndex; i <= textLength; i++) text[i - prevCodepointSize] = text[i]; + + textLength -= prevCodepointSize; + textBoxCursorIndex -= prevCodepointSize; + } + + // Move cursor position with keys + if ((textBoxCursorIndex > 0) && IsKeyPressed(KEY_LEFT) && (IsKeyDown(KEY_LEFT_CONTROL) || IsKeyDown(KEY_RIGHT_CONTROL))) + { + int offset = textBoxCursorIndex; + int accCodepointSize = 0; + int prevCodepointSize; + int prevCodepoint; + + // Check whitespace to skip (ASCII only) + while (offset > 0) + { + prevCodepoint = GetCodepointPrevious(text + offset, &prevCodepointSize); + if (!isspace(prevCodepoint & 0xFF)) break; + + offset -= prevCodepointSize; + accCodepointSize += prevCodepointSize; + } + + // Check characters of the same type to skip (either ASCII punctuation or anything non-whitespace) + // Not using isalnum() since it only works on ASCII characters + bool puctuation = ispunct(prevCodepoint & 0xFF); + while (offset > 0) + { + prevCodepoint = GetCodepointPrevious(text + offset, &prevCodepointSize); + if ((puctuation && !ispunct(prevCodepoint & 0xFF)) || (!puctuation && (isspace(prevCodepoint & 0xFF) || ispunct(prevCodepoint & 0xFF)))) break; + + offset -= prevCodepointSize; + accCodepointSize += prevCodepointSize; + } + + textBoxCursorIndex = offset; + } + else if ((textBoxCursorIndex > 0) && (IsKeyPressed(KEY_LEFT) || (IsKeyDown(KEY_LEFT) && autoCursorShouldTrigger))) + { + int prevCodepointSize = 0; + GetCodepointPrevious(text + textBoxCursorIndex, &prevCodepointSize); + + textBoxCursorIndex -= prevCodepointSize; + } + else if ((textLength > textBoxCursorIndex) && IsKeyPressed(KEY_RIGHT) && (IsKeyDown(KEY_LEFT_CONTROL) || IsKeyDown(KEY_RIGHT_CONTROL))) + { + int offset = textBoxCursorIndex; + int accCodepointSize = 0; + int nextCodepointSize; + int nextCodepoint; + + // Check characters of the same type to skip (either ASCII punctuation or anything non-whitespace) + // Not using isalnum() since it only works on ASCII characters + nextCodepoint = GetCodepointNext(text + offset, &nextCodepointSize); + bool puctuation = ispunct(nextCodepoint & 0xFF); + while (offset < textLength) + { + if ((puctuation && !ispunct(nextCodepoint & 0xFF)) || (!puctuation && (isspace(nextCodepoint & 0xFF) || ispunct(nextCodepoint & 0xFF)))) break; + + offset += nextCodepointSize; + accCodepointSize += nextCodepointSize; + nextCodepoint = GetCodepointNext(text + offset, &nextCodepointSize); + } + + // Check whitespace to skip (ASCII only) + while (offset < textLength) + { + if (!isspace(nextCodepoint & 0xFF)) break; + + offset += nextCodepointSize; + accCodepointSize += nextCodepointSize; + nextCodepoint = GetCodepointNext(text + offset, &nextCodepointSize); + } + + textBoxCursorIndex = offset; + } + else if ((textLength > textBoxCursorIndex) && (IsKeyPressed(KEY_RIGHT) || (IsKeyDown(KEY_RIGHT) && autoCursorShouldTrigger))) + { + int nextCodepointSize = 0; + GetCodepointNext(text + textBoxCursorIndex, &nextCodepointSize); + + textBoxCursorIndex += nextCodepointSize; + } + + // Move cursor position with mouse + if (CheckCollisionPointRec(mousePosition, textBounds)) // Mouse hover text + { + float scaleFactor = (float)GuiGetStyle(DEFAULT, TEXT_SIZE)/(float)guiFont.baseSize; + int codepointIndex = 0; + float glyphWidth = 0.0f; + float widthToMouseX = 0; + int mouseCursorIndex = 0; + + for (int i = textIndexOffset; i < textLength; i += codepointSize) + { + codepoint = GetCodepointNext(&text[i], &codepointSize); + codepointIndex = GetGlyphIndex(guiFont, codepoint); + + if (guiFont.glyphs[codepointIndex].advanceX == 0) glyphWidth = ((float)guiFont.recs[codepointIndex].width*scaleFactor); + else glyphWidth = ((float)guiFont.glyphs[codepointIndex].advanceX*scaleFactor); + + if (mousePosition.x <= (textBounds.x + (widthToMouseX + glyphWidth/2))) + { + mouseCursor.x = textBounds.x + widthToMouseX; + mouseCursorIndex = i; + break; + } + + widthToMouseX += (glyphWidth + (float)GuiGetStyle(DEFAULT, TEXT_SPACING)); + } + + // Check if mouse cursor is at the last position + int textEndWidth = GetTextWidth(text + textIndexOffset); + if (GetMousePosition().x >= (textBounds.x + textEndWidth - glyphWidth/2)) + { + mouseCursor.x = textBounds.x + textEndWidth; + mouseCursorIndex = textLength; + } + + // Place cursor at required index on mouse click + if ((mouseCursor.x >= 0) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) + { + cursor.x = mouseCursor.x; + textBoxCursorIndex = mouseCursorIndex; + } + } + else mouseCursor.x = -1; + + // Recalculate cursor position.y depending on textBoxCursorIndex + cursor.x = bounds.x + GuiGetStyle(TEXTBOX, TEXT_PADDING) + GetTextWidth(text + textIndexOffset) - GetTextWidth(text + textBoxCursorIndex) + GuiGetStyle(DEFAULT, TEXT_SPACING); + //if (multiline) cursor.y = GetTextLines() + + // Finish text editing on ENTER or mouse click outside bounds + if ((!multiline && IsKeyPressed(KEY_ENTER)) || + (!CheckCollisionPointRec(mousePosition, bounds) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON))) + { + textBoxCursorIndex = 0; // GLOBAL: Reset the shared cursor index + autoCursorCounter = 0; // GLOBAL: Reset counter for repeated keystrokes + result = 1; + } + } + else + { + if (CheckCollisionPointRec(mousePosition, bounds)) + { + state = STATE_FOCUSED; + + if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) + { + textBoxCursorIndex = textLength; // GLOBAL: Place cursor index to the end of current text + autoCursorCounter = 0; // GLOBAL: Reset counter for repeated keystrokes + result = 1; + } + } + } + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + if (state == STATE_PRESSED) + { + GuiDrawRectangle(bounds, GuiGetStyle(TEXTBOX, BORDER_WIDTH), GetColor(GuiGetStyle(TEXTBOX, BORDER + (state*3))), GetColor(GuiGetStyle(TEXTBOX, BASE_COLOR_PRESSED))); + } + else if (state == STATE_DISABLED) + { + GuiDrawRectangle(bounds, GuiGetStyle(TEXTBOX, BORDER_WIDTH), GetColor(GuiGetStyle(TEXTBOX, BORDER + (state*3))), GetColor(GuiGetStyle(TEXTBOX, BASE_COLOR_DISABLED))); + } + else GuiDrawRectangle(bounds, GuiGetStyle(TEXTBOX, BORDER_WIDTH), GetColor(GuiGetStyle(TEXTBOX, BORDER + (state*3))), BLANK); + + // Draw text considering index offset if required + // NOTE: Text index offset depends on cursor position + GuiDrawText(text + textIndexOffset, textBounds, GuiGetStyle(TEXTBOX, TEXT_ALIGNMENT), GetColor(GuiGetStyle(TEXTBOX, TEXT + (state*3)))); + + // Draw cursor + if (editMode && !GuiGetStyle(TEXTBOX, TEXT_READONLY)) + { + //if (autoCursorMode || ((blinkCursorFrameCounter/40)%2 == 0)) + GuiDrawRectangle(cursor, 0, BLANK, GetColor(GuiGetStyle(TEXTBOX, BORDER_COLOR_PRESSED))); + + // Draw mouse position cursor (if required) + if (mouseCursor.x >= 0) GuiDrawRectangle(mouseCursor, 0, BLANK, GetColor(GuiGetStyle(TEXTBOX, BORDER_COLOR_PRESSED))); + } + else if (state == STATE_FOCUSED) GuiTooltip(bounds); + //-------------------------------------------------------------------- + + return result; // Mouse button pressed: result = 1 +} + +/* +// Text Box control with multiple lines and word-wrap +// NOTE: This text-box is readonly, no editing supported by default +bool GuiTextBoxMulti(Rectangle bounds, char *text, int textSize, bool editMode) +{ + bool pressed = false; + + GuiSetStyle(TEXTBOX, TEXT_READONLY, 1); + GuiSetStyle(DEFAULT, TEXT_WRAP_MODE, TEXT_WRAP_WORD); // WARNING: If wrap mode enabled, text editing is not supported + GuiSetStyle(DEFAULT, TEXT_ALIGNMENT_VERTICAL, TEXT_ALIGN_TOP); + + // TODO: Implement methods to calculate cursor position properly + pressed = GuiTextBox(bounds, text, textSize, editMode); + + GuiSetStyle(DEFAULT, TEXT_ALIGNMENT_VERTICAL, TEXT_ALIGN_MIDDLE); + GuiSetStyle(DEFAULT, TEXT_WRAP_MODE, TEXT_WRAP_NONE); + GuiSetStyle(TEXTBOX, TEXT_READONLY, 0); + + return pressed; +} +*/ + +// Spinner control, returns selected value +int GuiSpinner(Rectangle bounds, const char *text, int *value, int minValue, int maxValue, bool editMode) +{ + int result = 1; + GuiState state = guiState; + + int tempValue = *value; + + Rectangle valueBoxBounds = { + bounds.x + GuiGetStyle(VALUEBOX, SPINNER_BUTTON_WIDTH) + GuiGetStyle(VALUEBOX, SPINNER_BUTTON_SPACING), + bounds.y, + bounds.width - 2*(GuiGetStyle(VALUEBOX, SPINNER_BUTTON_WIDTH) + GuiGetStyle(VALUEBOX, SPINNER_BUTTON_SPACING)), bounds.height }; + Rectangle leftButtonBound = { (float)bounds.x, (float)bounds.y, (float)GuiGetStyle(VALUEBOX, SPINNER_BUTTON_WIDTH), (float)bounds.height }; + Rectangle rightButtonBound = { (float)bounds.x + bounds.width - GuiGetStyle(VALUEBOX, SPINNER_BUTTON_WIDTH), (float)bounds.y, + (float)GuiGetStyle(VALUEBOX, SPINNER_BUTTON_WIDTH), (float)bounds.height }; + + Rectangle textBounds = { 0 }; + if (text != NULL) + { + textBounds.width = (float)GetTextWidth(text) + 2; + textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); + textBounds.x = bounds.x + bounds.width + GuiGetStyle(VALUEBOX, TEXT_PADDING); + textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2; + if (GuiGetStyle(VALUEBOX, TEXT_ALIGNMENT) == TEXT_ALIGN_LEFT) textBounds.x = bounds.x - textBounds.width - GuiGetStyle(VALUEBOX, TEXT_PADDING); + } + + // Update control + //-------------------------------------------------------------------- + if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) + { + Vector2 mousePoint = GetMousePosition(); + + // Check spinner state + if (CheckCollisionPointRec(mousePoint, bounds)) + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED; + else state = STATE_FOCUSED; + } + } + +#if defined(RAYGUI_NO_ICONS) + if (GuiButton(leftButtonBound, "<")) tempValue--; + if (GuiButton(rightButtonBound, ">")) tempValue++; +#else + if (GuiButton(leftButtonBound, GuiIconText(ICON_ARROW_LEFT_FILL, NULL))) tempValue--; + if (GuiButton(rightButtonBound, GuiIconText(ICON_ARROW_RIGHT_FILL, NULL))) tempValue++; +#endif + + if (!editMode) + { + if (tempValue < minValue) tempValue = minValue; + if (tempValue > maxValue) tempValue = maxValue; + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + result = GuiValueBox(valueBoxBounds, NULL, &tempValue, minValue, maxValue, editMode); + + // Draw value selector custom buttons + // NOTE: BORDER_WIDTH and TEXT_ALIGNMENT forced values + int tempBorderWidth = GuiGetStyle(BUTTON, BORDER_WIDTH); + int tempTextAlign = GuiGetStyle(BUTTON, TEXT_ALIGNMENT); + GuiSetStyle(BUTTON, BORDER_WIDTH, GuiGetStyle(VALUEBOX, BORDER_WIDTH)); + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); + + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, tempTextAlign); + GuiSetStyle(BUTTON, BORDER_WIDTH, tempBorderWidth); + + // Draw text label if provided + GuiDrawText(text, textBounds, (GuiGetStyle(VALUEBOX, TEXT_ALIGNMENT) == TEXT_ALIGN_RIGHT)? TEXT_ALIGN_LEFT : TEXT_ALIGN_RIGHT, GetColor(GuiGetStyle(LABEL, TEXT + (state*3)))); + //-------------------------------------------------------------------- + + *value = tempValue; + return result; +} + +// Value Box control, updates input text with numbers +// NOTE: Requires static variables: frameCounter +int GuiValueBox(Rectangle bounds, const char *text, int *value, int minValue, int maxValue, bool editMode) +{ + #if !defined(RAYGUI_VALUEBOX_MAX_CHARS) + #define RAYGUI_VALUEBOX_MAX_CHARS 32 + #endif + + int result = 0; + GuiState state = guiState; + + char textValue[RAYGUI_VALUEBOX_MAX_CHARS + 1] = "\0"; + snprintf(textValue, RAYGUI_VALUEBOX_MAX_CHARS + 1, "%i", *value); + + Rectangle textBounds = { 0 }; + if (text != NULL) + { + textBounds.width = (float)GetTextWidth(text) + 2; + textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); + textBounds.x = bounds.x + bounds.width + GuiGetStyle(VALUEBOX, TEXT_PADDING); + textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2; + if (GuiGetStyle(VALUEBOX, TEXT_ALIGNMENT) == TEXT_ALIGN_LEFT) textBounds.x = bounds.x - textBounds.width - GuiGetStyle(VALUEBOX, TEXT_PADDING); + } + + // Update control + //-------------------------------------------------------------------- + if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) + { + Vector2 mousePoint = GetMousePosition(); + + bool valueHasChanged = false; + + if (editMode) + { + state = STATE_PRESSED; + + int keyCount = (int)strlen(textValue); + + // Only allow keys in range [48..57] + if (keyCount < RAYGUI_VALUEBOX_MAX_CHARS) + { + if (GetTextWidth(textValue) < bounds.width) + { + int key = GetCharPressed(); + if ((key >= 48) && (key <= 57)) + { + textValue[keyCount] = (char)key; + keyCount++; + valueHasChanged = true; + } + } + } + + // Delete text + if (keyCount > 0) + { + if (IsKeyPressed(KEY_BACKSPACE)) + { + keyCount--; + textValue[keyCount] = '\0'; + valueHasChanged = true; + } + } + + if (valueHasChanged) *value = TextToInteger(textValue); + + // NOTE: We are not clamp values until user input finishes + //if (*value > maxValue) *value = maxValue; + //else if (*value < minValue) *value = minValue; + + if ((IsKeyPressed(KEY_ENTER) || IsKeyPressed(KEY_KP_ENTER)) || (!CheckCollisionPointRec(mousePoint, bounds) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON))) + { + if (*value > maxValue) *value = maxValue; + else if (*value < minValue) *value = minValue; + + result = 1; + } + } + else + { + if (*value > maxValue) *value = maxValue; + else if (*value < minValue) *value = minValue; + + if (CheckCollisionPointRec(mousePoint, bounds)) + { + state = STATE_FOCUSED; + if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) result = 1; + } + } + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + Color baseColor = BLANK; + if (state == STATE_PRESSED) baseColor = GetColor(GuiGetStyle(VALUEBOX, BASE_COLOR_PRESSED)); + else if (state == STATE_DISABLED) baseColor = GetColor(GuiGetStyle(VALUEBOX, BASE_COLOR_DISABLED)); + + GuiDrawRectangle(bounds, GuiGetStyle(VALUEBOX, BORDER_WIDTH), GetColor(GuiGetStyle(VALUEBOX, BORDER + (state*3))), baseColor); + GuiDrawText(textValue, GetTextBounds(VALUEBOX, bounds), TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(VALUEBOX, TEXT + (state*3)))); + + // Draw cursor rectangle + if (editMode) + { + // NOTE: ValueBox internal text is always centered + Rectangle cursor = { bounds.x + GetTextWidth(textValue)/2 + bounds.width/2 + 1, + bounds.y + GuiGetStyle(TEXTBOX, BORDER_WIDTH) + 2, + 2, bounds.height - GuiGetStyle(TEXTBOX, BORDER_WIDTH)*2 - 4 }; + if (cursor.height > bounds.height) cursor.height = bounds.height - GuiGetStyle(TEXTBOX, BORDER_WIDTH)*2; + GuiDrawRectangle(cursor, 0, BLANK, GetColor(GuiGetStyle(VALUEBOX, BORDER_COLOR_PRESSED))); + } + + // Draw text label if provided + GuiDrawText(text, textBounds, (GuiGetStyle(VALUEBOX, TEXT_ALIGNMENT) == TEXT_ALIGN_RIGHT)? TEXT_ALIGN_LEFT : TEXT_ALIGN_RIGHT, GetColor(GuiGetStyle(LABEL, TEXT + (state*3)))); + //-------------------------------------------------------------------- + + return result; +} + +// Floating point Value Box control, updates input val_str with numbers +// NOTE: Requires static variables: frameCounter +int GuiValueBoxFloat(Rectangle bounds, const char *text, char *textValue, float *value, bool editMode) +{ + #if !defined(RAYGUI_VALUEBOX_MAX_CHARS) + #define RAYGUI_VALUEBOX_MAX_CHARS 32 + #endif + + int result = 0; + GuiState state = guiState; + + //char textValue[RAYGUI_VALUEBOX_MAX_CHARS + 1] = "\0"; + //snprintf(textValue, sizeof(textValue), "%2.2f", *value); + + Rectangle textBounds = {0}; + if (text != NULL) + { + textBounds.width = (float)GetTextWidth(text) + 2; + textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); + textBounds.x = bounds.x + bounds.width + GuiGetStyle(VALUEBOX, TEXT_PADDING); + textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2; + if (GuiGetStyle(VALUEBOX, TEXT_ALIGNMENT) == TEXT_ALIGN_LEFT) textBounds.x = bounds.x - textBounds.width - GuiGetStyle(VALUEBOX, TEXT_PADDING); + } + + // Update control + //-------------------------------------------------------------------- + if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) + { + Vector2 mousePoint = GetMousePosition(); + + bool valueHasChanged = false; + + if (editMode) + { + state = STATE_PRESSED; + + int keyCount = (int)strlen(textValue); + + // Only allow keys in range [48..57] + if (keyCount < RAYGUI_VALUEBOX_MAX_CHARS) + { + if (GetTextWidth(textValue) < bounds.width) + { + int key = GetCharPressed(); + if (((key >= 48) && (key <= 57)) || + (key == '.') || + ((keyCount == 0) && (key == '+')) || // NOTE: Sign can only be in first position + ((keyCount == 0) && (key == '-'))) + { + textValue[keyCount] = (char)key; + keyCount++; + + valueHasChanged = true; + } + } + } + + // Pressed backspace + if (IsKeyPressed(KEY_BACKSPACE)) + { + if (keyCount > 0) + { + keyCount--; + textValue[keyCount] = '\0'; + valueHasChanged = true; + } + } + + if (valueHasChanged) *value = TextToFloat(textValue); + + if ((IsKeyPressed(KEY_ENTER) || IsKeyPressed(KEY_KP_ENTER)) || (!CheckCollisionPointRec(mousePoint, bounds) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON))) result = 1; + } + else + { + if (CheckCollisionPointRec(mousePoint, bounds)) + { + state = STATE_FOCUSED; + if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) result = 1; + } + } + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + Color baseColor = BLANK; + if (state == STATE_PRESSED) baseColor = GetColor(GuiGetStyle(VALUEBOX, BASE_COLOR_PRESSED)); + else if (state == STATE_DISABLED) baseColor = GetColor(GuiGetStyle(VALUEBOX, BASE_COLOR_DISABLED)); + + GuiDrawRectangle(bounds, GuiGetStyle(VALUEBOX, BORDER_WIDTH), GetColor(GuiGetStyle(VALUEBOX, BORDER + (state*3))), baseColor); + GuiDrawText(textValue, GetTextBounds(VALUEBOX, bounds), TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(VALUEBOX, TEXT + (state*3)))); + + // Draw cursor + if (editMode) + { + // NOTE: ValueBox internal text is always centered + Rectangle cursor = {bounds.x + GetTextWidth(textValue)/2 + bounds.width/2 + 1, + bounds.y + 2*GuiGetStyle(VALUEBOX, BORDER_WIDTH), 4, + bounds.height - 4*GuiGetStyle(VALUEBOX, BORDER_WIDTH)}; + GuiDrawRectangle(cursor, 0, BLANK, GetColor(GuiGetStyle(VALUEBOX, BORDER_COLOR_PRESSED))); + } + + // Draw text label if provided + GuiDrawText(text, textBounds, + (GuiGetStyle(VALUEBOX, TEXT_ALIGNMENT) == TEXT_ALIGN_RIGHT)? TEXT_ALIGN_LEFT : TEXT_ALIGN_RIGHT, + GetColor(GuiGetStyle(LABEL, TEXT + (state*3)))); + //-------------------------------------------------------------------- + + return result; +} + +// Slider control with pro parameters +// NOTE: Other GuiSlider*() controls use this one +int GuiSliderPro(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue, int sliderWidth) +{ + int result = 0; + GuiState state = guiState; + + float temp = (maxValue - minValue)/2.0f; + if (value == NULL) value = &temp; + float oldValue = *value; + + Rectangle slider = { bounds.x, bounds.y + GuiGetStyle(SLIDER, BORDER_WIDTH) + GuiGetStyle(SLIDER, SLIDER_PADDING), + 0, bounds.height - 2*GuiGetStyle(SLIDER, BORDER_WIDTH) - 2*GuiGetStyle(SLIDER, SLIDER_PADDING) }; + + // Update control + //-------------------------------------------------------------------- + if ((state != STATE_DISABLED) && !guiLocked) + { + Vector2 mousePoint = GetMousePosition(); + + if (guiControlExclusiveMode) // Allows to keep dragging outside of bounds + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) + { + if (CHECK_BOUNDS_ID(bounds, guiControlExclusiveRec)) + { + state = STATE_PRESSED; + // Get equivalent value and slider position from mousePosition.x + *value = (maxValue - minValue)*((mousePoint.x - bounds.x - sliderWidth/2)/(bounds.width-sliderWidth)) + minValue; + } + } + else + { + guiControlExclusiveMode = false; + guiControlExclusiveRec = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 }; + } + } + else if (CheckCollisionPointRec(mousePoint, bounds)) + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) + { + state = STATE_PRESSED; + guiControlExclusiveMode = true; + guiControlExclusiveRec = bounds; // Store bounds as an identifier when dragging starts + + if (!CheckCollisionPointRec(mousePoint, slider)) + { + // Get equivalent value and slider position from mousePosition.x + *value = (maxValue - minValue)*((mousePoint.x - bounds.x - sliderWidth/2)/(bounds.width-sliderWidth)) + minValue; + } + } + else state = STATE_FOCUSED; + } + + if (*value > maxValue) *value = maxValue; + else if (*value < minValue) *value = minValue; + } + + // Control value change check + if (oldValue == *value) result = 0; + else result = 1; + + // Slider bar limits check + float sliderValue = (((*value - minValue)/(maxValue - minValue))*(bounds.width - sliderWidth - 2*GuiGetStyle(SLIDER, BORDER_WIDTH))); + if (sliderWidth > 0) // Slider + { + slider.x += sliderValue; + slider.width = (float)sliderWidth; + if (slider.x <= (bounds.x + GuiGetStyle(SLIDER, BORDER_WIDTH))) slider.x = bounds.x + GuiGetStyle(SLIDER, BORDER_WIDTH); + else if ((slider.x + slider.width) >= (bounds.x + bounds.width)) slider.x = bounds.x + bounds.width - slider.width - GuiGetStyle(SLIDER, BORDER_WIDTH); + } + else if (sliderWidth == 0) // SliderBar + { + slider.x += GuiGetStyle(SLIDER, BORDER_WIDTH); + slider.width = sliderValue; + if (slider.width > bounds.width) slider.width = bounds.width - 2*GuiGetStyle(SLIDER, BORDER_WIDTH); + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + GuiDrawRectangle(bounds, GuiGetStyle(SLIDER, BORDER_WIDTH), GetColor(GuiGetStyle(SLIDER, BORDER + (state*3))), GetColor(GuiGetStyle(SLIDER, (state != STATE_DISABLED)? BASE_COLOR_NORMAL : BASE_COLOR_DISABLED))); + + // Draw slider internal bar (depends on state) + if (state == STATE_NORMAL) GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, BASE_COLOR_PRESSED))); + else if (state == STATE_FOCUSED) GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, TEXT_COLOR_FOCUSED))); + else if (state == STATE_PRESSED) GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, TEXT_COLOR_PRESSED))); + else if (state == STATE_DISABLED) GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, TEXT_COLOR_DISABLED))); + + // Draw left/right text if provided + if (textLeft != NULL) + { + Rectangle textBounds = { 0 }; + textBounds.width = (float)GetTextWidth(textLeft); + textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); + textBounds.x = bounds.x - textBounds.width - GuiGetStyle(SLIDER, TEXT_PADDING); + textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2; + + GuiDrawText(textLeft, textBounds, TEXT_ALIGN_RIGHT, GetColor(GuiGetStyle(LABEL, TEXT + (state*3)))); + } + + if (textRight != NULL) + { + Rectangle textBounds = { 0 }; + textBounds.width = (float)GetTextWidth(textRight); + textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); + textBounds.x = bounds.x + bounds.width + GuiGetStyle(SLIDER, TEXT_PADDING); + textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2; + + GuiDrawText(textRight, textBounds, TEXT_ALIGN_LEFT, GetColor(GuiGetStyle(LABEL, TEXT + (state*3)))); + } + //-------------------------------------------------------------------- + + return result; +} + +// Slider control extended, returns selected value and has text +int GuiSlider(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue) +{ + return GuiSliderPro(bounds, textLeft, textRight, value, minValue, maxValue, GuiGetStyle(SLIDER, SLIDER_WIDTH)); +} + +// Slider Bar control extended, returns selected value +int GuiSliderBar(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue) +{ + return GuiSliderPro(bounds, textLeft, textRight, value, minValue, maxValue, 0); +} + +// Progress Bar control extended, shows current progress value +int GuiProgressBar(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue) +{ + int result = 0; + GuiState state = guiState; + + float temp = (maxValue - minValue)/2.0f; + if (value == NULL) value = &temp; + + // Progress bar + Rectangle progress = { bounds.x + GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), + bounds.y + GuiGetStyle(PROGRESSBAR, BORDER_WIDTH) + GuiGetStyle(PROGRESSBAR, PROGRESS_PADDING), 0, + bounds.height - GuiGetStyle(PROGRESSBAR, BORDER_WIDTH) - 2*GuiGetStyle(PROGRESSBAR, PROGRESS_PADDING) -1 }; + + // Update control + //-------------------------------------------------------------------- + if (*value > maxValue) *value = maxValue; + + // WARNING: Working with floats could lead to rounding issues + if ((state != STATE_DISABLED)) progress.width = ((float)*value/(maxValue - minValue))*(bounds.width - 2*GuiGetStyle(PROGRESSBAR, BORDER_WIDTH)); + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + if (state == STATE_DISABLED) + { + GuiDrawRectangle(bounds, GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), GetColor(GuiGetStyle(PROGRESSBAR, BORDER + (state*3))), BLANK); + } + else + { + if (*value > minValue) + { + // Draw progress bar with colored border, more visual + GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y, (int)progress.width + (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH) }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_FOCUSED))); + GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y + 1, (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), bounds.height - 2 }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_FOCUSED))); + GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y + bounds.height - 1, (int)progress.width + (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH) }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_FOCUSED))); + } + else GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y, (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), bounds.height+GuiGetStyle(PROGRESSBAR, BORDER_WIDTH)-1 }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_NORMAL))); + + if (*value >= maxValue) GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x + progress.width + (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), bounds.y, (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), bounds.height+GuiGetStyle(PROGRESSBAR, BORDER_WIDTH)-1}, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_FOCUSED))); + else + { + // Draw borders not yet reached by value + GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x + (int)progress.width + (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), bounds.y, bounds.width - (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH) - (int)progress.width - 1, (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH) }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_NORMAL))); + GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x + (int)progress.width + (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), bounds.y + bounds.height - 1, bounds.width - (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH) - (int)progress.width - 1, (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH) }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_NORMAL))); + GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x + bounds.width - (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), bounds.y, (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), bounds.height+GuiGetStyle(PROGRESSBAR, BORDER_WIDTH)-1 }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_NORMAL))); + } + + // Draw slider internal progress bar (depends on state) + GuiDrawRectangle(progress, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BASE_COLOR_PRESSED))); + } + + // Draw left/right text if provided + if (textLeft != NULL) + { + Rectangle textBounds = { 0 }; + textBounds.width = (float)GetTextWidth(textLeft); + textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); + textBounds.x = bounds.x - textBounds.width - GuiGetStyle(PROGRESSBAR, TEXT_PADDING); + textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2; + + GuiDrawText(textLeft, textBounds, TEXT_ALIGN_RIGHT, GetColor(GuiGetStyle(LABEL, TEXT + (state*3)))); + } + + if (textRight != NULL) + { + Rectangle textBounds = { 0 }; + textBounds.width = (float)GetTextWidth(textRight); + textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); + textBounds.x = bounds.x + bounds.width + GuiGetStyle(PROGRESSBAR, TEXT_PADDING); + textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2; + + GuiDrawText(textRight, textBounds, TEXT_ALIGN_LEFT, GetColor(GuiGetStyle(LABEL, TEXT + (state*3)))); + } + //-------------------------------------------------------------------- + + return result; +} + +// Status Bar control +int GuiStatusBar(Rectangle bounds, const char *text) +{ + int result = 0; + GuiState state = guiState; + + // Draw control + //-------------------------------------------------------------------- + GuiDrawRectangle(bounds, GuiGetStyle(STATUSBAR, BORDER_WIDTH), GetColor(GuiGetStyle(STATUSBAR, BORDER + (state*3))), GetColor(GuiGetStyle(STATUSBAR, BASE + (state*3)))); + GuiDrawText(text, GetTextBounds(STATUSBAR, bounds), GuiGetStyle(STATUSBAR, TEXT_ALIGNMENT), GetColor(GuiGetStyle(STATUSBAR, TEXT + (state*3)))); + //-------------------------------------------------------------------- + + return result; +} + +// Dummy rectangle control, intended for placeholding +int GuiDummyRec(Rectangle bounds, const char *text) +{ + int result = 0; + GuiState state = guiState; + + // Update control + //-------------------------------------------------------------------- + if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) + { + Vector2 mousePoint = GetMousePosition(); + + // Check button state + if (CheckCollisionPointRec(mousePoint, bounds)) + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED; + else state = STATE_FOCUSED; + } + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + GuiDrawRectangle(bounds, 0, BLANK, GetColor(GuiGetStyle(DEFAULT, (state != STATE_DISABLED)? BASE_COLOR_NORMAL : BASE_COLOR_DISABLED))); + GuiDrawText(text, GetTextBounds(DEFAULT, bounds), TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(BUTTON, (state != STATE_DISABLED)? TEXT_COLOR_NORMAL : TEXT_COLOR_DISABLED))); + //------------------------------------------------------------------ + + return result; +} + +// List View control +int GuiListView(Rectangle bounds, const char *text, int *scrollIndex, int *active) +{ + int result = 0; + int itemCount = 0; + const char **items = NULL; + + if (text != NULL) items = GuiTextSplit(text, ';', &itemCount, NULL); + + result = GuiListViewEx(bounds, items, itemCount, scrollIndex, active, NULL); + + return result; +} + +// List View control with extended parameters +int GuiListViewEx(Rectangle bounds, const char **text, int count, int *scrollIndex, int *active, int *focus) +{ + int result = 0; + GuiState state = guiState; + + int itemFocused = (focus == NULL)? -1 : *focus; + int itemSelected = (active == NULL)? -1 : *active; + + // Check if we need a scroll bar + bool useScrollBar = false; + if ((GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING))*count > bounds.height) useScrollBar = true; + + // Define base item rectangle [0] + Rectangle itemBounds = { 0 }; + itemBounds.x = bounds.x + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING); + itemBounds.y = bounds.y + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING) + GuiGetStyle(DEFAULT, BORDER_WIDTH); + itemBounds.width = bounds.width - 2*GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING) - GuiGetStyle(DEFAULT, BORDER_WIDTH); + itemBounds.height = (float)GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT); + if (useScrollBar) itemBounds.width -= GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH); + + // Get items on the list + int visibleItems = (int)bounds.height/(GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING)); + if (visibleItems > count) visibleItems = count; + + int startIndex = (scrollIndex == NULL)? 0 : *scrollIndex; + if ((startIndex < 0) || (startIndex > (count - visibleItems))) startIndex = 0; + int endIndex = startIndex + visibleItems; + + // Update control + //-------------------------------------------------------------------- + if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) + { + Vector2 mousePoint = GetMousePosition(); + + // Check mouse inside list view + if (CheckCollisionPointRec(mousePoint, bounds)) + { + state = STATE_FOCUSED; + + // Check focused and selected item + for (int i = 0; i < visibleItems; i++) + { + if (CheckCollisionPointRec(mousePoint, itemBounds)) + { + itemFocused = startIndex + i; + if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) + { + if (itemSelected == (startIndex + i)) itemSelected = -1; + else itemSelected = startIndex + i; + } + break; + } + + // Update item rectangle y position for next item + itemBounds.y += (GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING)); + } + + if (useScrollBar) + { + int wheelMove = (int)GetMouseWheelMove(); + startIndex -= wheelMove; + + if (startIndex < 0) startIndex = 0; + else if (startIndex > (count - visibleItems)) startIndex = count - visibleItems; + + endIndex = startIndex + visibleItems; + if (endIndex > count) endIndex = count; + } + } + else itemFocused = -1; + + // Reset item rectangle y to [0] + itemBounds.y = bounds.y + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING) + GuiGetStyle(DEFAULT, BORDER_WIDTH); + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + GuiDrawRectangle(bounds, GuiGetStyle(LISTVIEW, BORDER_WIDTH), GetColor(GuiGetStyle(LISTVIEW, BORDER + state*3)), GetColor(GuiGetStyle(DEFAULT, BACKGROUND_COLOR))); // Draw background + + // Draw visible items + for (int i = 0; ((i < visibleItems) && (text != NULL)); i++) + { + if (GuiGetStyle(LISTVIEW, LIST_ITEMS_BORDER_NORMAL)) GuiDrawRectangle(itemBounds, GuiGetStyle(LISTVIEW, LIST_ITEMS_BORDER_WIDTH), GetColor(GuiGetStyle(LISTVIEW, BORDER_COLOR_NORMAL)), BLANK); + + if (state == STATE_DISABLED) + { + if ((startIndex + i) == itemSelected) GuiDrawRectangle(itemBounds, GuiGetStyle(LISTVIEW, LIST_ITEMS_BORDER_WIDTH), GetColor(GuiGetStyle(LISTVIEW, BORDER_COLOR_DISABLED)), GetColor(GuiGetStyle(LISTVIEW, BASE_COLOR_DISABLED))); + + GuiDrawText(text[startIndex + i], GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT), GetColor(GuiGetStyle(LISTVIEW, TEXT_COLOR_DISABLED))); + } + else + { + if (((startIndex + i) == itemSelected) && (active != NULL)) + { + // Draw item selected + GuiDrawRectangle(itemBounds, GuiGetStyle(LISTVIEW, LIST_ITEMS_BORDER_WIDTH), GetColor(GuiGetStyle(LISTVIEW, BORDER_COLOR_PRESSED)), GetColor(GuiGetStyle(LISTVIEW, BASE_COLOR_PRESSED))); + GuiDrawText(text[startIndex + i], GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT), GetColor(GuiGetStyle(LISTVIEW, TEXT_COLOR_PRESSED))); + } + else if (((startIndex + i) == itemFocused)) // && (focus != NULL)) // NOTE: We want items focused, despite not returned! + { + // Draw item focused + GuiDrawRectangle(itemBounds, GuiGetStyle(LISTVIEW, LIST_ITEMS_BORDER_WIDTH), GetColor(GuiGetStyle(LISTVIEW, BORDER_COLOR_FOCUSED)), GetColor(GuiGetStyle(LISTVIEW, BASE_COLOR_FOCUSED))); + GuiDrawText(text[startIndex + i], GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT), GetColor(GuiGetStyle(LISTVIEW, TEXT_COLOR_FOCUSED))); + } + else + { + // Draw item normal (no rectangle) + GuiDrawText(text[startIndex + i], GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT), GetColor(GuiGetStyle(LISTVIEW, TEXT_COLOR_NORMAL))); + } + } + + // Update item rectangle y position for next item + itemBounds.y += (GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING)); + } + + if (useScrollBar) + { + Rectangle scrollBarBounds = { + bounds.x + bounds.width - GuiGetStyle(LISTVIEW, BORDER_WIDTH) - GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH), + bounds.y + GuiGetStyle(LISTVIEW, BORDER_WIDTH), (float)GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH), + bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) + }; + + // Calculate percentage of visible items and apply same percentage to scrollbar + float percentVisible = (float)(endIndex - startIndex)/count; + float sliderSize = bounds.height*percentVisible; + + int prevSliderSize = GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE); // Save default slider size + int prevScrollSpeed = GuiGetStyle(SCROLLBAR, SCROLL_SPEED); // Save default scroll speed + GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, (int)sliderSize); // Change slider size + GuiSetStyle(SCROLLBAR, SCROLL_SPEED, count - visibleItems); // Change scroll speed + + startIndex = GuiScrollBar(scrollBarBounds, startIndex, 0, count - visibleItems); + + GuiSetStyle(SCROLLBAR, SCROLL_SPEED, prevScrollSpeed); // Reset scroll speed to default + GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, prevSliderSize); // Reset slider size to default + } + //-------------------------------------------------------------------- + + if (active != NULL) *active = itemSelected; + if (focus != NULL) *focus = itemFocused; + if (scrollIndex != NULL) *scrollIndex = startIndex; + + return result; +} + +// Color Panel control - Color (RGBA) variant. +int GuiColorPanel(Rectangle bounds, const char *text, Color *color) +{ + int result = 0; + + Vector3 vcolor = { (float)color->r/255.0f, (float)color->g/255.0f, (float)color->b/255.0f }; + Vector3 hsv = ConvertRGBtoHSV(vcolor); + Vector3 prevHsv = hsv; // workaround to see if GuiColorPanelHSV modifies the hsv. + + GuiColorPanelHSV(bounds, text, &hsv); + + // Check if the hsv was changed, only then change the color. + // This is required, because the Color->HSV->Color conversion has precision errors. + // Thus the assignment from HSV to Color should only be made, if the HSV has a new user-entered value. + // Otherwise GuiColorPanel would often modify it's color without user input. + // TODO: GuiColorPanelHSV could return 1 if the slider was dragged, to simplify this check. + if (hsv.x != prevHsv.x || hsv.y != prevHsv.y || hsv.z != prevHsv.z) + { + Vector3 rgb = ConvertHSVtoRGB(hsv); + + // NOTE: Vector3ToColor() only available on raylib 1.8.1 + *color = RAYGUI_CLITERAL(Color){ (unsigned char)(255.0f*rgb.x), + (unsigned char)(255.0f*rgb.y), + (unsigned char)(255.0f*rgb.z), + color->a }; + } + return result; +} + +// Color Bar Alpha control +// NOTE: Returns alpha value normalized [0..1] +int GuiColorBarAlpha(Rectangle bounds, const char *text, float *alpha) +{ + #if !defined(RAYGUI_COLORBARALPHA_CHECKED_SIZE) + #define RAYGUI_COLORBARALPHA_CHECKED_SIZE 10 + #endif + + int result = 0; + GuiState state = guiState; + Rectangle selector = { (float)bounds.x + (*alpha)*bounds.width - GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_HEIGHT)/2, + (float)bounds.y - GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_OVERFLOW), + (float)GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_HEIGHT), + (float)bounds.height + GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_OVERFLOW)*2 }; + + // Update control + //-------------------------------------------------------------------- + if ((state != STATE_DISABLED) && !guiLocked) + { + Vector2 mousePoint = GetMousePosition(); + + if (guiControlExclusiveMode) // Allows to keep dragging outside of bounds + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) + { + if (CHECK_BOUNDS_ID(bounds, guiControlExclusiveRec)) + { + state = STATE_PRESSED; + + *alpha = (mousePoint.x - bounds.x)/bounds.width; + if (*alpha <= 0.0f) *alpha = 0.0f; + if (*alpha >= 1.0f) *alpha = 1.0f; + } + } + else + { + guiControlExclusiveMode = false; + guiControlExclusiveRec = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 }; + } + } + else if (CheckCollisionPointRec(mousePoint, bounds) || CheckCollisionPointRec(mousePoint, selector)) + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) + { + state = STATE_PRESSED; + guiControlExclusiveMode = true; + guiControlExclusiveRec = bounds; // Store bounds as an identifier when dragging starts + + *alpha = (mousePoint.x - bounds.x)/bounds.width; + if (*alpha <= 0.0f) *alpha = 0.0f; + if (*alpha >= 1.0f) *alpha = 1.0f; + //selector.x = bounds.x + (int)(((alpha - 0)/(100 - 0))*(bounds.width - 2*GuiGetStyle(SLIDER, BORDER_WIDTH))) - selector.width/2; + } + else state = STATE_FOCUSED; + } + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + // Draw alpha bar: checked background + if (state != STATE_DISABLED) + { + int checksX = (int)bounds.width/RAYGUI_COLORBARALPHA_CHECKED_SIZE; + int checksY = (int)bounds.height/RAYGUI_COLORBARALPHA_CHECKED_SIZE; + + for (int x = 0; x < checksX; x++) + { + for (int y = 0; y < checksY; y++) + { + Rectangle check = { bounds.x + x*RAYGUI_COLORBARALPHA_CHECKED_SIZE, bounds.y + y*RAYGUI_COLORBARALPHA_CHECKED_SIZE, RAYGUI_COLORBARALPHA_CHECKED_SIZE, RAYGUI_COLORBARALPHA_CHECKED_SIZE }; + GuiDrawRectangle(check, 0, BLANK, ((x + y)%2)? Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED)), 0.4f) : Fade(GetColor(GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED)), 0.4f)); + } + } + + DrawRectangleGradientEx(bounds, RAYGUI_CLITERAL(Color){ 255, 255, 255, 0 }, RAYGUI_CLITERAL(Color){ 255, 255, 255, 0 }, Fade(RAYGUI_CLITERAL(Color){ 0, 0, 0, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 0, 0, 0, 255 }, guiAlpha)); + } + else DrawRectangleGradientEx(bounds, Fade(GetColor(GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED)), 0.1f), Fade(GetColor(GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED)), 0.1f), Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED)), guiAlpha), Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED)), guiAlpha)); + + GuiDrawRectangle(bounds, GuiGetStyle(COLORPICKER, BORDER_WIDTH), GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3)), BLANK); + + // Draw alpha bar: selector + GuiDrawRectangle(selector, 0, BLANK, GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3))); + //-------------------------------------------------------------------- + + return result; +} + +// Color Bar Hue control +// Returns hue value normalized [0..1] +// NOTE: Other similar bars (for reference): +// Color GuiColorBarSat() [WHITE->color] +// Color GuiColorBarValue() [BLACK->color], HSV/HSL +// float GuiColorBarLuminance() [BLACK->WHITE] +int GuiColorBarHue(Rectangle bounds, const char *text, float *hue) +{ + int result = 0; + GuiState state = guiState; + Rectangle selector = { (float)bounds.x - GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_OVERFLOW), (float)bounds.y + (*hue)/360.0f*bounds.height - GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_HEIGHT)/2, (float)bounds.width + GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_OVERFLOW)*2, (float)GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_HEIGHT) }; + + // Update control + //-------------------------------------------------------------------- + if ((state != STATE_DISABLED) && !guiLocked) + { + Vector2 mousePoint = GetMousePosition(); + + if (guiControlExclusiveMode) // Allows to keep dragging outside of bounds + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) + { + if (CHECK_BOUNDS_ID(bounds, guiControlExclusiveRec)) + { + state = STATE_PRESSED; + + *hue = (mousePoint.y - bounds.y)*360/bounds.height; + if (*hue <= 0.0f) *hue = 0.0f; + if (*hue >= 359.0f) *hue = 359.0f; + } + } + else + { + guiControlExclusiveMode = false; + guiControlExclusiveRec = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 }; + } + } + else if (CheckCollisionPointRec(mousePoint, bounds) || CheckCollisionPointRec(mousePoint, selector)) + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) + { + state = STATE_PRESSED; + guiControlExclusiveMode = true; + guiControlExclusiveRec = bounds; // Store bounds as an identifier when dragging starts + + *hue = (mousePoint.y - bounds.y)*360/bounds.height; + if (*hue <= 0.0f) *hue = 0.0f; + if (*hue >= 359.0f) *hue = 359.0f; + + } + else state = STATE_FOCUSED; + + /*if (IsKeyDown(KEY_UP)) + { + hue -= 2.0f; + if (hue <= 0.0f) hue = 0.0f; + } + else if (IsKeyDown(KEY_DOWN)) + { + hue += 2.0f; + if (hue >= 360.0f) hue = 360.0f; + }*/ + } + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + if (state != STATE_DISABLED) + { + // Draw hue bar:color bars + // TODO: Use directly DrawRectangleGradientEx(bounds, color1, color2, color2, color1); + DrawRectangleGradientV((int)bounds.x, (int)(bounds.y), (int)bounds.width, (int)ceilf(bounds.height/6), Fade(RAYGUI_CLITERAL(Color){ 255, 0, 0, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 255, 255, 0, 255 }, guiAlpha)); + DrawRectangleGradientV((int)bounds.x, (int)(bounds.y + bounds.height/6), (int)bounds.width, (int)ceilf(bounds.height/6), Fade(RAYGUI_CLITERAL(Color){ 255, 255, 0, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 0, 255, 0, 255 }, guiAlpha)); + DrawRectangleGradientV((int)bounds.x, (int)(bounds.y + 2*(bounds.height/6)), (int)bounds.width, (int)ceilf(bounds.height/6), Fade(RAYGUI_CLITERAL(Color){ 0, 255, 0, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 0, 255, 255, 255 }, guiAlpha)); + DrawRectangleGradientV((int)bounds.x, (int)(bounds.y + 3*(bounds.height/6)), (int)bounds.width, (int)ceilf(bounds.height/6), Fade(RAYGUI_CLITERAL(Color){ 0, 255, 255, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 0, 0, 255, 255 }, guiAlpha)); + DrawRectangleGradientV((int)bounds.x, (int)(bounds.y + 4*(bounds.height/6)), (int)bounds.width, (int)ceilf(bounds.height/6), Fade(RAYGUI_CLITERAL(Color){ 0, 0, 255, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 255, 0, 255, 255 }, guiAlpha)); + DrawRectangleGradientV((int)bounds.x, (int)(bounds.y + 5*(bounds.height/6)), (int)bounds.width, (int)(bounds.height/6), Fade(RAYGUI_CLITERAL(Color){ 255, 0, 255, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 255, 0, 0, 255 }, guiAlpha)); + } + else DrawRectangleGradientV((int)bounds.x, (int)bounds.y, (int)bounds.width, (int)bounds.height, Fade(Fade(GetColor(GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED)), 0.1f), guiAlpha), Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED)), guiAlpha)); + + GuiDrawRectangle(bounds, GuiGetStyle(COLORPICKER, BORDER_WIDTH), GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3)), BLANK); + + // Draw hue bar: selector + GuiDrawRectangle(selector, 0, BLANK, GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3))); + //-------------------------------------------------------------------- + + return result; +} + +// Color Picker control +// NOTE: It's divided in multiple controls: +// Color GuiColorPanel(Rectangle bounds, Color color) +// float GuiColorBarAlpha(Rectangle bounds, float alpha) +// float GuiColorBarHue(Rectangle bounds, float value) +// NOTE: bounds define GuiColorPanel() size +// NOTE: this picker converts RGB to HSV, which can cause the Hue control to jump. If you have this problem, consider using the HSV variant instead +int GuiColorPicker(Rectangle bounds, const char *text, Color *color) +{ + int result = 0; + + Color temp = { 200, 0, 0, 255 }; + if (color == NULL) color = &temp; + + GuiColorPanel(bounds, NULL, color); + + Rectangle boundsHue = { (float)bounds.x + bounds.width + GuiGetStyle(COLORPICKER, HUEBAR_PADDING), (float)bounds.y, (float)GuiGetStyle(COLORPICKER, HUEBAR_WIDTH), (float)bounds.height }; + //Rectangle boundsAlpha = { bounds.x, bounds.y + bounds.height + GuiGetStyle(COLORPICKER, BARS_PADDING), bounds.width, GuiGetStyle(COLORPICKER, BARS_THICK) }; + + // NOTE: this conversion can cause low hue-resolution, if the r, g and b value are very similar, which causes the hue bar to shift around when only the GuiColorPanel is used. + Vector3 hsv = ConvertRGBtoHSV(RAYGUI_CLITERAL(Vector3){ (*color).r/255.0f, (*color).g/255.0f, (*color).b/255.0f }); + + GuiColorBarHue(boundsHue, NULL, &hsv.x); + + //color.a = (unsigned char)(GuiColorBarAlpha(boundsAlpha, (float)color.a/255.0f)*255.0f); + Vector3 rgb = ConvertHSVtoRGB(hsv); + + *color = RAYGUI_CLITERAL(Color){ (unsigned char)roundf(rgb.x*255.0f), (unsigned char)roundf(rgb.y*255.0f), (unsigned char)roundf(rgb.z*255.0f), (*color).a }; + + return result; +} + +// Color Picker control that avoids conversion to RGB and back to HSV on each call, thus avoiding jittering. +// The user can call ConvertHSVtoRGB() to convert *colorHsv value to RGB. +// NOTE: It's divided in multiple controls: +// int GuiColorPanelHSV(Rectangle bounds, const char *text, Vector3 *colorHsv) +// int GuiColorBarAlpha(Rectangle bounds, const char *text, float *alpha) +// float GuiColorBarHue(Rectangle bounds, float value) +// NOTE: bounds define GuiColorPanelHSV() size +int GuiColorPickerHSV(Rectangle bounds, const char *text, Vector3 *colorHsv) +{ + int result = 0; + + Vector3 tempHsv = { 0 }; + + if (colorHsv == NULL) + { + const Vector3 tempColor = { 200.0f/255.0f, 0.0f, 0.0f }; + tempHsv = ConvertRGBtoHSV(tempColor); + colorHsv = &tempHsv; + } + + GuiColorPanelHSV(bounds, NULL, colorHsv); + + const Rectangle boundsHue = { (float)bounds.x + bounds.width + GuiGetStyle(COLORPICKER, HUEBAR_PADDING), (float)bounds.y, (float)GuiGetStyle(COLORPICKER, HUEBAR_WIDTH), (float)bounds.height }; + + GuiColorBarHue(boundsHue, NULL, &colorHsv->x); + + return result; +} + +// Color Panel control - HSV variant +int GuiColorPanelHSV(Rectangle bounds, const char *text, Vector3 *colorHsv) +{ + int result = 0; + GuiState state = guiState; + Vector2 pickerSelector = { 0 }; + + const Color colWhite = { 255, 255, 255, 255 }; + const Color colBlack = { 0, 0, 0, 255 }; + + pickerSelector.x = bounds.x + (float)colorHsv->y*bounds.width; // HSV: Saturation + pickerSelector.y = bounds.y + (1.0f - (float)colorHsv->z)*bounds.height; // HSV: Value + + Vector3 maxHue = { colorHsv->x, 1.0f, 1.0f }; + Vector3 rgbHue = ConvertHSVtoRGB(maxHue); + Color maxHueCol = { (unsigned char)(255.0f*rgbHue.x), + (unsigned char)(255.0f*rgbHue.y), + (unsigned char)(255.0f*rgbHue.z), 255 }; + + // Update control + //-------------------------------------------------------------------- + if ((state != STATE_DISABLED) && !guiLocked) + { + Vector2 mousePoint = GetMousePosition(); + + if (guiControlExclusiveMode) // Allows to keep dragging outside of bounds + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) + { + if (CHECK_BOUNDS_ID(bounds, guiControlExclusiveRec)) + { + pickerSelector = mousePoint; + + if (pickerSelector.x < bounds.x) pickerSelector.x = bounds.x; + if (pickerSelector.x > bounds.x + bounds.width) pickerSelector.x = bounds.x + bounds.width; + if (pickerSelector.y < bounds.y) pickerSelector.y = bounds.y; + if (pickerSelector.y > bounds.y + bounds.height) pickerSelector.y = bounds.y + bounds.height; + + // Calculate color from picker + Vector2 colorPick = { pickerSelector.x - bounds.x, pickerSelector.y - bounds.y }; + + colorPick.x /= (float)bounds.width; // Get normalized value on x + colorPick.y /= (float)bounds.height; // Get normalized value on y + + colorHsv->y = colorPick.x; + colorHsv->z = 1.0f - colorPick.y; + + } + } + else + { + guiControlExclusiveMode = false; + guiControlExclusiveRec = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 }; + } + } + else if (CheckCollisionPointRec(mousePoint, bounds)) + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) + { + state = STATE_PRESSED; + guiControlExclusiveMode = true; + guiControlExclusiveRec = bounds; + pickerSelector = mousePoint; + + // Calculate color from picker + Vector2 colorPick = { pickerSelector.x - bounds.x, pickerSelector.y - bounds.y }; + + colorPick.x /= (float)bounds.width; // Get normalized value on x + colorPick.y /= (float)bounds.height; // Get normalized value on y + + colorHsv->y = colorPick.x; + colorHsv->z = 1.0f - colorPick.y; + } + else state = STATE_FOCUSED; + } + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + if (state != STATE_DISABLED) + { + DrawRectangleGradientEx(bounds, Fade(colWhite, guiAlpha), Fade(colWhite, guiAlpha), Fade(maxHueCol, guiAlpha), Fade(maxHueCol, guiAlpha)); + DrawRectangleGradientEx(bounds, Fade(colBlack, 0), Fade(colBlack, guiAlpha), Fade(colBlack, guiAlpha), Fade(colBlack, 0)); + + // Draw color picker: selector + Rectangle selector = { pickerSelector.x - GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE)/2, pickerSelector.y - GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE)/2, (float)GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE), (float)GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE) }; + GuiDrawRectangle(selector, 0, BLANK, colWhite); + } + else + { + DrawRectangleGradientEx(bounds, Fade(Fade(GetColor(GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED)), 0.1f), guiAlpha), Fade(Fade(colBlack, 0.6f), guiAlpha), Fade(Fade(colBlack, 0.6f), guiAlpha), Fade(Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED)), 0.6f), guiAlpha)); + } + + GuiDrawRectangle(bounds, GuiGetStyle(COLORPICKER, BORDER_WIDTH), GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3)), BLANK); + //-------------------------------------------------------------------- + + return result; +} + +// Message Box control +int GuiMessageBox(Rectangle bounds, const char *title, const char *message, const char *buttons) +{ + #if !defined(RAYGUI_MESSAGEBOX_BUTTON_HEIGHT) + #define RAYGUI_MESSAGEBOX_BUTTON_HEIGHT 24 + #endif + #if !defined(RAYGUI_MESSAGEBOX_BUTTON_PADDING) + #define RAYGUI_MESSAGEBOX_BUTTON_PADDING 12 + #endif + + int result = -1; // Returns clicked button from buttons list, 0 refers to closed window button + + int buttonCount = 0; + const char **buttonsText = GuiTextSplit(buttons, ';', &buttonCount, NULL); + Rectangle buttonBounds = { 0 }; + buttonBounds.x = bounds.x + RAYGUI_MESSAGEBOX_BUTTON_PADDING; + buttonBounds.y = bounds.y + bounds.height - RAYGUI_MESSAGEBOX_BUTTON_HEIGHT - RAYGUI_MESSAGEBOX_BUTTON_PADDING; + buttonBounds.width = (bounds.width - RAYGUI_MESSAGEBOX_BUTTON_PADDING*(buttonCount + 1))/buttonCount; + buttonBounds.height = RAYGUI_MESSAGEBOX_BUTTON_HEIGHT; + + //int textWidth = GetTextWidth(message) + 2; + + Rectangle textBounds = { 0 }; + textBounds.x = bounds.x + RAYGUI_MESSAGEBOX_BUTTON_PADDING; + textBounds.y = bounds.y + RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT + RAYGUI_MESSAGEBOX_BUTTON_PADDING; + textBounds.width = bounds.width - RAYGUI_MESSAGEBOX_BUTTON_PADDING*2; + textBounds.height = bounds.height - RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT - 3*RAYGUI_MESSAGEBOX_BUTTON_PADDING - RAYGUI_MESSAGEBOX_BUTTON_HEIGHT; + + // Draw control + //-------------------------------------------------------------------- + if (GuiWindowBox(bounds, title)) result = 0; + + int prevTextAlignment = GuiGetStyle(LABEL, TEXT_ALIGNMENT); + GuiSetStyle(LABEL, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); + GuiLabel(textBounds, message); + GuiSetStyle(LABEL, TEXT_ALIGNMENT, prevTextAlignment); + + prevTextAlignment = GuiGetStyle(BUTTON, TEXT_ALIGNMENT); + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); + + for (int i = 0; i < buttonCount; i++) + { + if (GuiButton(buttonBounds, buttonsText[i])) result = i + 1; + buttonBounds.x += (buttonBounds.width + RAYGUI_MESSAGEBOX_BUTTON_PADDING); + } + + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, prevTextAlignment); + //-------------------------------------------------------------------- + + return result; +} + +// Text Input Box control, ask for text +int GuiTextInputBox(Rectangle bounds, const char *title, const char *message, const char *buttons, char *text, int textMaxSize, bool *secretViewActive) +{ + #if !defined(RAYGUI_TEXTINPUTBOX_BUTTON_HEIGHT) + #define RAYGUI_TEXTINPUTBOX_BUTTON_HEIGHT 24 + #endif + #if !defined(RAYGUI_TEXTINPUTBOX_BUTTON_PADDING) + #define RAYGUI_TEXTINPUTBOX_BUTTON_PADDING 12 + #endif + #if !defined(RAYGUI_TEXTINPUTBOX_HEIGHT) + #define RAYGUI_TEXTINPUTBOX_HEIGHT 26 + #endif + + // Used to enable text edit mode + // WARNING: No more than one GuiTextInputBox() should be open at the same time + static bool textEditMode = false; + + int result = -1; + + int buttonCount = 0; + const char **buttonsText = GuiTextSplit(buttons, ';', &buttonCount, NULL); + Rectangle buttonBounds = { 0 }; + buttonBounds.x = bounds.x + RAYGUI_TEXTINPUTBOX_BUTTON_PADDING; + buttonBounds.y = bounds.y + bounds.height - RAYGUI_TEXTINPUTBOX_BUTTON_HEIGHT - RAYGUI_TEXTINPUTBOX_BUTTON_PADDING; + buttonBounds.width = (bounds.width - RAYGUI_TEXTINPUTBOX_BUTTON_PADDING*(buttonCount + 1))/buttonCount; + buttonBounds.height = RAYGUI_TEXTINPUTBOX_BUTTON_HEIGHT; + + int messageInputHeight = (int)bounds.height - RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT - GuiGetStyle(STATUSBAR, BORDER_WIDTH) - RAYGUI_TEXTINPUTBOX_BUTTON_HEIGHT - 2*RAYGUI_TEXTINPUTBOX_BUTTON_PADDING; + + Rectangle textBounds = { 0 }; + if (message != NULL) + { + int textSize = GetTextWidth(message) + 2; + + textBounds.x = bounds.x + bounds.width/2 - textSize/2; + textBounds.y = bounds.y + RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT + messageInputHeight/4 - (float)GuiGetStyle(DEFAULT, TEXT_SIZE)/2; + textBounds.width = (float)textSize; + textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); + } + + Rectangle textBoxBounds = { 0 }; + textBoxBounds.x = bounds.x + RAYGUI_TEXTINPUTBOX_BUTTON_PADDING; + textBoxBounds.y = bounds.y + RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT - RAYGUI_TEXTINPUTBOX_HEIGHT/2; + if (message == NULL) textBoxBounds.y = bounds.y + 24 + RAYGUI_TEXTINPUTBOX_BUTTON_PADDING; + else textBoxBounds.y += (messageInputHeight/2 + messageInputHeight/4); + textBoxBounds.width = bounds.width - RAYGUI_TEXTINPUTBOX_BUTTON_PADDING*2; + textBoxBounds.height = RAYGUI_TEXTINPUTBOX_HEIGHT; + + // Draw control + //-------------------------------------------------------------------- + if (GuiWindowBox(bounds, title)) result = 0; + + // Draw message if available + if (message != NULL) + { + int prevTextAlignment = GuiGetStyle(LABEL, TEXT_ALIGNMENT); + GuiSetStyle(LABEL, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); + GuiLabel(textBounds, message); + GuiSetStyle(LABEL, TEXT_ALIGNMENT, prevTextAlignment); + } + + if (secretViewActive != NULL) + { + static char stars[] = "****************"; + if (GuiTextBox(RAYGUI_CLITERAL(Rectangle){ textBoxBounds.x, textBoxBounds.y, textBoxBounds.width - 4 - RAYGUI_TEXTINPUTBOX_HEIGHT, textBoxBounds.height }, + ((*secretViewActive == 1) || textEditMode)? text : stars, textMaxSize, textEditMode)) textEditMode = !textEditMode; + + GuiToggle(RAYGUI_CLITERAL(Rectangle){ textBoxBounds.x + textBoxBounds.width - RAYGUI_TEXTINPUTBOX_HEIGHT, textBoxBounds.y, RAYGUI_TEXTINPUTBOX_HEIGHT, RAYGUI_TEXTINPUTBOX_HEIGHT }, (*secretViewActive == 1)? "#44#" : "#45#", secretViewActive); + } + else + { + if (GuiTextBox(textBoxBounds, text, textMaxSize, textEditMode)) textEditMode = !textEditMode; + } + + int prevBtnTextAlignment = GuiGetStyle(BUTTON, TEXT_ALIGNMENT); + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); + + for (int i = 0; i < buttonCount; i++) + { + if (GuiButton(buttonBounds, buttonsText[i])) result = i + 1; + buttonBounds.x += (buttonBounds.width + RAYGUI_MESSAGEBOX_BUTTON_PADDING); + } + + if (result >= 0) textEditMode = false; + + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, prevBtnTextAlignment); + //-------------------------------------------------------------------- + + return result; // Result is the pressed button index +} + +// Grid control +// NOTE: Returns grid mouse-hover selected cell +// About drawing lines at subpixel spacing, simple put, not easy solution: +// https://stackoverflow.com/questions/4435450/2d-opengl-drawing-lines-that-dont-exactly-fit-pixel-raster +int GuiGrid(Rectangle bounds, const char *text, float spacing, int subdivs, Vector2 *mouseCell) +{ + // Grid lines alpha amount + #if !defined(RAYGUI_GRID_ALPHA) + #define RAYGUI_GRID_ALPHA 0.15f + #endif + + int result = 0; + GuiState state = guiState; + + Vector2 mousePoint = GetMousePosition(); + Vector2 currentMouseCell = { -1, -1 }; + + float spaceWidth = spacing/(float)subdivs; + int linesV = (int)(bounds.width/spaceWidth) + 1; + int linesH = (int)(bounds.height/spaceWidth) + 1; + + int color = GuiGetStyle(DEFAULT, LINE_COLOR); + + // Update control + //-------------------------------------------------------------------- + if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) + { + if (CheckCollisionPointRec(mousePoint, bounds)) + { + // NOTE: Cell values must be the upper left of the cell the mouse is in + currentMouseCell.x = floorf((mousePoint.x - bounds.x)/spacing); + currentMouseCell.y = floorf((mousePoint.y - bounds.y)/spacing); + } + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + if (state == STATE_DISABLED) color = GuiGetStyle(DEFAULT, BORDER_COLOR_DISABLED); + + if (subdivs > 0) + { + // Draw vertical grid lines + for (int i = 0; i < linesV; i++) + { + Rectangle lineV = { bounds.x + spacing*i/subdivs, bounds.y, 1, bounds.height + 1 }; + GuiDrawRectangle(lineV, 0, BLANK, ((i%subdivs) == 0)? GuiFade(GetColor(color), RAYGUI_GRID_ALPHA*4) : GuiFade(GetColor(color), RAYGUI_GRID_ALPHA)); + } + + // Draw horizontal grid lines + for (int i = 0; i < linesH; i++) + { + Rectangle lineH = { bounds.x, bounds.y + spacing*i/subdivs, bounds.width + 1, 1 }; + GuiDrawRectangle(lineH, 0, BLANK, ((i%subdivs) == 0)? GuiFade(GetColor(color), RAYGUI_GRID_ALPHA*4) : GuiFade(GetColor(color), RAYGUI_GRID_ALPHA)); + } + } + + if (mouseCell != NULL) *mouseCell = currentMouseCell; + return result; +} + +//---------------------------------------------------------------------------------- +// Tooltip management functions +// NOTE: Tooltips requires some global variables: tooltipPtr +//---------------------------------------------------------------------------------- +// Enable gui tooltips (global state) +void GuiEnableTooltip(void) { guiTooltip = true; } + +// Disable gui tooltips (global state) +void GuiDisableTooltip(void) { guiTooltip = false; } + +// Set tooltip string +void GuiSetTooltip(const char *tooltip) { guiTooltipPtr = tooltip; } + +//---------------------------------------------------------------------------------- +// Styles loading functions +//---------------------------------------------------------------------------------- + +// Load raygui style file (.rgs) +// NOTE: By default a binary file is expected, that file could contain a custom font, +// in that case, custom font image atlas is GRAY+ALPHA and pixel data can be compressed (DEFLATE) +void GuiLoadStyle(const char *fileName) +{ + #define MAX_LINE_BUFFER_SIZE 256 + + bool tryBinary = false; + if (!guiStyleLoaded) GuiLoadStyleDefault(); + + // Try reading the files as text file first + FILE *rgsFile = fopen(fileName, "rt"); + + if (rgsFile != NULL) + { + char buffer[MAX_LINE_BUFFER_SIZE] = { 0 }; + fgets(buffer, MAX_LINE_BUFFER_SIZE, rgsFile); + + if (buffer[0] == '#') + { + int controlId = 0; + int propertyId = 0; + unsigned int propertyValue = 0; + + while (!feof(rgsFile)) + { + switch (buffer[0]) + { + case 'p': + { + // Style property: p + + sscanf(buffer, "p %d %d 0x%x", &controlId, &propertyId, &propertyValue); + GuiSetStyle(controlId, propertyId, (int)propertyValue); + + } break; + case 'f': + { + // Style font: f + + int fontSize = 0; + char charmapFileName[256] = { 0 }; + char fontFileName[256] = { 0 }; + sscanf(buffer, "f %d %s %[^\r\n]s", &fontSize, charmapFileName, fontFileName); + + Font font = { 0 }; + int *codepoints = NULL; + int codepointCount = 0; + + if (charmapFileName[0] != '0') + { + // Load text data from file + // NOTE: Expected an UTF-8 array of codepoints, no separation + char *textData = LoadFileText(TextFormat("%s/%s", GetDirectoryPath(fileName), charmapFileName)); + codepoints = LoadCodepoints(textData, &codepointCount); + UnloadFileText(textData); + } + + if (fontFileName[0] != '\0') + { + // In case a font is already loaded and it is not default internal font, unload it + if (font.texture.id != GetFontDefault().texture.id) UnloadTexture(font.texture); + + if (codepointCount > 0) font = LoadFontEx(TextFormat("%s/%s", GetDirectoryPath(fileName), fontFileName), fontSize, codepoints, codepointCount); + else font = LoadFontEx(TextFormat("%s/%s", GetDirectoryPath(fileName), fontFileName), fontSize, NULL, 0); // Default to 95 standard codepoints + } + + // If font texture not properly loaded, revert to default font and size/spacing + if (font.texture.id == 0) + { + font = GetFontDefault(); + GuiSetStyle(DEFAULT, TEXT_SIZE, 10); + GuiSetStyle(DEFAULT, TEXT_SPACING, 1); + } + + UnloadCodepoints(codepoints); + + if ((font.texture.id > 0) && (font.glyphCount > 0)) GuiSetFont(font); + + } break; + default: break; + } + + fgets(buffer, MAX_LINE_BUFFER_SIZE, rgsFile); + } + } + else tryBinary = true; + + fclose(rgsFile); + } + + if (tryBinary) + { + rgsFile = fopen(fileName, "rb"); + + if (rgsFile != NULL) + { + fseek(rgsFile, 0, SEEK_END); + int fileDataSize = ftell(rgsFile); + fseek(rgsFile, 0, SEEK_SET); + + if (fileDataSize > 0) + { + unsigned char *fileData = (unsigned char *)RAYGUI_MALLOC(fileDataSize*sizeof(unsigned char)); + fread(fileData, sizeof(unsigned char), fileDataSize, rgsFile); + + GuiLoadStyleFromMemory(fileData, fileDataSize); + + RAYGUI_FREE(fileData); + } + + fclose(rgsFile); + } + } +} + +// Load style default over global style +void GuiLoadStyleDefault(void) +{ + // We set this variable first to avoid cyclic function calls + // when calling GuiSetStyle() and GuiGetStyle() + guiStyleLoaded = true; + + // Initialize default LIGHT style property values + // WARNING: Default value are applied to all controls on set but + // they can be overwritten later on for every custom control + GuiSetStyle(DEFAULT, BORDER_COLOR_NORMAL, 0x838383ff); + GuiSetStyle(DEFAULT, BASE_COLOR_NORMAL, 0xc9c9c9ff); + GuiSetStyle(DEFAULT, TEXT_COLOR_NORMAL, 0x686868ff); + GuiSetStyle(DEFAULT, BORDER_COLOR_FOCUSED, 0x5bb2d9ff); + GuiSetStyle(DEFAULT, BASE_COLOR_FOCUSED, 0xc9effeff); + GuiSetStyle(DEFAULT, TEXT_COLOR_FOCUSED, 0x6c9bbcff); + GuiSetStyle(DEFAULT, BORDER_COLOR_PRESSED, 0x0492c7ff); + GuiSetStyle(DEFAULT, BASE_COLOR_PRESSED, 0x97e8ffff); + GuiSetStyle(DEFAULT, TEXT_COLOR_PRESSED, 0x368bafff); + GuiSetStyle(DEFAULT, BORDER_COLOR_DISABLED, 0xb5c1c2ff); + GuiSetStyle(DEFAULT, BASE_COLOR_DISABLED, 0xe6e9e9ff); + GuiSetStyle(DEFAULT, TEXT_COLOR_DISABLED, 0xaeb7b8ff); + GuiSetStyle(DEFAULT, BORDER_WIDTH, 1); + GuiSetStyle(DEFAULT, TEXT_PADDING, 0); + GuiSetStyle(DEFAULT, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); + + // Initialize default extended property values + // NOTE: By default, extended property values are initialized to 0 + GuiSetStyle(DEFAULT, TEXT_SIZE, 10); // DEFAULT, shared by all controls + GuiSetStyle(DEFAULT, TEXT_SPACING, 1); // DEFAULT, shared by all controls + GuiSetStyle(DEFAULT, LINE_COLOR, 0x90abb5ff); // DEFAULT specific property + GuiSetStyle(DEFAULT, BACKGROUND_COLOR, 0xf5f5f5ff); // DEFAULT specific property + GuiSetStyle(DEFAULT, TEXT_LINE_SPACING, 15); // DEFAULT, 15 pixels between lines + GuiSetStyle(DEFAULT, TEXT_ALIGNMENT_VERTICAL, TEXT_ALIGN_MIDDLE); // DEFAULT, text aligned vertically to middle of text-bounds + + // Initialize control-specific property values + // NOTE: Those properties are in default list but require specific values by control type + GuiSetStyle(LABEL, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT); + GuiSetStyle(BUTTON, BORDER_WIDTH, 2); + GuiSetStyle(SLIDER, TEXT_PADDING, 4); + GuiSetStyle(PROGRESSBAR, TEXT_PADDING, 4); + GuiSetStyle(CHECKBOX, TEXT_PADDING, 4); + GuiSetStyle(CHECKBOX, TEXT_ALIGNMENT, TEXT_ALIGN_RIGHT); + GuiSetStyle(DROPDOWNBOX, TEXT_PADDING, 0); + GuiSetStyle(DROPDOWNBOX, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); + GuiSetStyle(TEXTBOX, TEXT_PADDING, 4); + GuiSetStyle(TEXTBOX, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT); + GuiSetStyle(VALUEBOX, TEXT_PADDING, 0); + GuiSetStyle(VALUEBOX, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT); + GuiSetStyle(STATUSBAR, TEXT_PADDING, 8); + GuiSetStyle(STATUSBAR, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT); + + // Initialize extended property values + // NOTE: By default, extended property values are initialized to 0 + GuiSetStyle(TOGGLE, GROUP_PADDING, 2); + GuiSetStyle(SLIDER, SLIDER_WIDTH, 16); + GuiSetStyle(SLIDER, SLIDER_PADDING, 1); + GuiSetStyle(PROGRESSBAR, PROGRESS_PADDING, 1); + GuiSetStyle(CHECKBOX, CHECK_PADDING, 1); + GuiSetStyle(COMBOBOX, COMBO_BUTTON_WIDTH, 32); + GuiSetStyle(COMBOBOX, COMBO_BUTTON_SPACING, 2); + GuiSetStyle(DROPDOWNBOX, ARROW_PADDING, 16); + GuiSetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_SPACING, 2); + GuiSetStyle(VALUEBOX, SPINNER_BUTTON_WIDTH, 24); + GuiSetStyle(VALUEBOX, SPINNER_BUTTON_SPACING, 2); + GuiSetStyle(SCROLLBAR, BORDER_WIDTH, 0); + GuiSetStyle(SCROLLBAR, ARROWS_VISIBLE, 0); + GuiSetStyle(SCROLLBAR, ARROWS_SIZE, 6); + GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING, 0); + GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, 16); + GuiSetStyle(SCROLLBAR, SCROLL_PADDING, 0); + GuiSetStyle(SCROLLBAR, SCROLL_SPEED, 12); + GuiSetStyle(LISTVIEW, LIST_ITEMS_HEIGHT, 28); + GuiSetStyle(LISTVIEW, LIST_ITEMS_SPACING, 2); + GuiSetStyle(LISTVIEW, LIST_ITEMS_BORDER_WIDTH, 1); + GuiSetStyle(LISTVIEW, SCROLLBAR_WIDTH, 12); + GuiSetStyle(LISTVIEW, SCROLLBAR_SIDE, SCROLLBAR_RIGHT_SIDE); + GuiSetStyle(COLORPICKER, COLOR_SELECTOR_SIZE, 8); + GuiSetStyle(COLORPICKER, HUEBAR_WIDTH, 16); + GuiSetStyle(COLORPICKER, HUEBAR_PADDING, 8); + GuiSetStyle(COLORPICKER, HUEBAR_SELECTOR_HEIGHT, 8); + GuiSetStyle(COLORPICKER, HUEBAR_SELECTOR_OVERFLOW, 2); + + if (guiFont.texture.id != GetFontDefault().texture.id) + { + // Unload previous font texture + UnloadTexture(guiFont.texture); + RL_FREE(guiFont.recs); + RL_FREE(guiFont.glyphs); + guiFont.recs = NULL; + guiFont.glyphs = NULL; + + // Setup default raylib font + guiFont = GetFontDefault(); + + // NOTE: Default raylib font character 95 is a white square + Rectangle whiteChar = guiFont.recs[95]; + + // NOTE: We set up a 1px padding on char rectangle to avoid pixel bleeding on MSAA filtering + SetShapesTexture(guiFont.texture, RAYGUI_CLITERAL(Rectangle){ whiteChar.x + 1, whiteChar.y + 1, whiteChar.width - 2, whiteChar.height - 2 }); + } +} + +// Get text with icon id prepended +// NOTE: Useful to add icons by name id (enum) instead of +// a number that can change between ricon versions +const char *GuiIconText(int iconId, const char *text) +{ +#if defined(RAYGUI_NO_ICONS) + return NULL; +#else + static char buffer[1024] = { 0 }; + static char iconBuffer[16] = { 0 }; + + if (text != NULL) + { + memset(buffer, 0, 1024); + snprintf(buffer, 1024, "#%03i#", iconId); + + for (int i = 5; i < 1024; i++) + { + buffer[i] = text[i - 5]; + if (text[i - 5] == '\0') break; + } + + return buffer; + } + else + { + snprintf(iconBuffer, 16, "#%03i#", iconId); + + return iconBuffer; + } +#endif +} + +#if !defined(RAYGUI_NO_ICONS) +// Get full icons data pointer +unsigned int *GuiGetIcons(void) { return guiIconsPtr; } + +// Load raygui icons file (.rgi) +// NOTE: In case nameIds are required, they can be requested with loadIconsName, +// they are returned as a guiIconsName[iconCount][RAYGUI_ICON_MAX_NAME_LENGTH], +// WARNING: guiIconsName[]][] memory should be manually freed! +char **GuiLoadIcons(const char *fileName, bool loadIconsName) +{ + // Style File Structure (.rgi) + // ------------------------------------------------------ + // Offset | Size | Type | Description + // ------------------------------------------------------ + // 0 | 4 | char | Signature: "rGI " + // 4 | 2 | short | Version: 100 + // 6 | 2 | short | reserved + + // 8 | 2 | short | Num icons (N) + // 10 | 2 | short | Icons size (Options: 16, 32, 64) (S) + + // Icons name id (32 bytes per name id) + // foreach (icon) + // { + // 12+32*i | 32 | char | Icon NameId + // } + + // Icons data: One bit per pixel, stored as unsigned int array (depends on icon size) + // S*S pixels/32bit per unsigned int = K unsigned int per icon + // foreach (icon) + // { + // ... | K | unsigned int | Icon Data + // } + + FILE *rgiFile = fopen(fileName, "rb"); + + char **guiIconsName = NULL; + + if (rgiFile != NULL) + { + char signature[5] = { 0 }; + short version = 0; + short reserved = 0; + short iconCount = 0; + short iconSize = 0; + + fread(signature, 1, 4, rgiFile); + fread(&version, sizeof(short), 1, rgiFile); + fread(&reserved, sizeof(short), 1, rgiFile); + fread(&iconCount, sizeof(short), 1, rgiFile); + fread(&iconSize, sizeof(short), 1, rgiFile); + + if ((signature[0] == 'r') && + (signature[1] == 'G') && + (signature[2] == 'I') && + (signature[3] == ' ')) + { + if (loadIconsName) + { + guiIconsName = (char **)RAYGUI_MALLOC(iconCount*sizeof(char **)); + for (int i = 0; i < iconCount; i++) + { + guiIconsName[i] = (char *)RAYGUI_MALLOC(RAYGUI_ICON_MAX_NAME_LENGTH); + fread(guiIconsName[i], 1, RAYGUI_ICON_MAX_NAME_LENGTH, rgiFile); + } + } + else fseek(rgiFile, iconCount*RAYGUI_ICON_MAX_NAME_LENGTH, SEEK_CUR); + + // Read icons data directly over internal icons array + fread(guiIconsPtr, sizeof(unsigned int), iconCount*(iconSize*iconSize/32), rgiFile); + } + + fclose(rgiFile); + } + + return guiIconsName; +} + +// Load icons from memory +// WARNING: Binary files only +char **GuiLoadIconsFromMemory(const unsigned char *fileData, int dataSize, bool loadIconsName) +{ + unsigned char *fileDataPtr = (unsigned char *)fileData; + char **guiIconsName = NULL; + + char signature[5] = { 0 }; + short version = 0; + short reserved = 0; + short iconCount = 0; + short iconSize = 0; + + memcpy(signature, fileDataPtr, 4); + memcpy(&version, fileDataPtr + 4, sizeof(short)); + memcpy(&reserved, fileDataPtr + 4 + 2, sizeof(short)); + memcpy(&iconCount, fileDataPtr + 4 + 2 + 2, sizeof(short)); + memcpy(&iconSize, fileDataPtr + 4 + 2 + 2 + 2, sizeof(short)); + fileDataPtr += 12; + + if ((signature[0] == 'r') && + (signature[1] == 'G') && + (signature[2] == 'I') && + (signature[3] == ' ')) + { + if (loadIconsName) + { + guiIconsName = (char **)RAYGUI_MALLOC(iconCount*sizeof(char *)); + for (int i = 0; i < iconCount; i++) + { + guiIconsName[i] = (char *)RAYGUI_MALLOC(RAYGUI_ICON_MAX_NAME_LENGTH); + memcpy(guiIconsName[i], fileDataPtr, RAYGUI_ICON_MAX_NAME_LENGTH); + fileDataPtr += RAYGUI_ICON_MAX_NAME_LENGTH; + } + } + else + { + // Skip icon name data if not required + fileDataPtr += iconCount*RAYGUI_ICON_MAX_NAME_LENGTH; + } + + int iconDataSize = iconCount*(iconSize*iconSize/32)*sizeof(unsigned int); + guiIconsPtr = (unsigned int *)RAYGUI_MALLOC(iconDataSize); + + memcpy(guiIconsPtr, fileDataPtr, iconDataSize); + } + + return guiIconsName; +} + +// Draw selected icon using rectangles pixel-by-pixel +void GuiDrawIcon(int iconId, int posX, int posY, int pixelSize, Color color) +{ + #define BIT_CHECK(a,b) ((a) & (1u<<(b))) + + for (int i = 0, y = 0; i < RAYGUI_ICON_SIZE*RAYGUI_ICON_SIZE/32; i++) + { + for (int k = 0; k < 32; k++) + { + if (BIT_CHECK(guiIconsPtr[iconId*RAYGUI_ICON_DATA_ELEMENTS + i], k)) + { + #if !defined(RAYGUI_STANDALONE) + GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ (float)posX + (k%RAYGUI_ICON_SIZE)*pixelSize, (float)posY + y*pixelSize, (float)pixelSize, (float)pixelSize }, 0, BLANK, color); + #endif + } + + if ((k == 15) || (k == 31)) y++; + } + } +} + +// Set icon drawing size +void GuiSetIconScale(int scale) +{ + if (scale >= 1) guiIconScale = scale; +} + +#endif // !RAYGUI_NO_ICONS + +//---------------------------------------------------------------------------------- +// Module specific Functions Definition +//---------------------------------------------------------------------------------- + +// Load style from memory +// WARNING: Binary files only +static void GuiLoadStyleFromMemory(const unsigned char *fileData, int dataSize) +{ + unsigned char *fileDataPtr = (unsigned char *)fileData; + + char signature[5] = { 0 }; + short version = 0; + short reserved = 0; + int propertyCount = 0; + + memcpy(signature, fileDataPtr, 4); + memcpy(&version, fileDataPtr + 4, sizeof(short)); + memcpy(&reserved, fileDataPtr + 4 + 2, sizeof(short)); + memcpy(&propertyCount, fileDataPtr + 4 + 2 + 2, sizeof(int)); + fileDataPtr += 12; + + if ((signature[0] == 'r') && + (signature[1] == 'G') && + (signature[2] == 'S') && + (signature[3] == ' ')) + { + short controlId = 0; + short propertyId = 0; + unsigned int propertyValue = 0; + + for (int i = 0; i < propertyCount; i++) + { + memcpy(&controlId, fileDataPtr, sizeof(short)); + memcpy(&propertyId, fileDataPtr + 2, sizeof(short)); + memcpy(&propertyValue, fileDataPtr + 2 + 2, sizeof(unsigned int)); + fileDataPtr += 8; + + if (controlId == 0) // DEFAULT control + { + // If a DEFAULT property is loaded, it is propagated to all controls + // NOTE: All DEFAULT properties should be defined first in the file + GuiSetStyle(0, (int)propertyId, propertyValue); + + if (propertyId < RAYGUI_MAX_PROPS_BASE) for (int j = 1; j < RAYGUI_MAX_CONTROLS; j++) GuiSetStyle(j, (int)propertyId, propertyValue); + } + else GuiSetStyle((int)controlId, (int)propertyId, propertyValue); + } + + // Font loading is highly dependant on raylib API to load font data and image + +#if !defined(RAYGUI_STANDALONE) + // Load custom font if available + int fontDataSize = 0; + memcpy(&fontDataSize, fileDataPtr, sizeof(int)); + fileDataPtr += 4; + + if (fontDataSize > 0) + { + Font font = { 0 }; + int fontType = 0; // 0-Normal, 1-SDF + + memcpy(&font.baseSize, fileDataPtr, sizeof(int)); + memcpy(&font.glyphCount, fileDataPtr + 4, sizeof(int)); + memcpy(&fontType, fileDataPtr + 4 + 4, sizeof(int)); + fileDataPtr += 12; + + // Load font white rectangle + Rectangle fontWhiteRec = { 0 }; + memcpy(&fontWhiteRec, fileDataPtr, sizeof(Rectangle)); + fileDataPtr += 16; + + // Load font image parameters + int fontImageUncompSize = 0; + int fontImageCompSize = 0; + memcpy(&fontImageUncompSize, fileDataPtr, sizeof(int)); + memcpy(&fontImageCompSize, fileDataPtr + 4, sizeof(int)); + fileDataPtr += 8; + + Image imFont = { 0 }; + imFont.mipmaps = 1; + memcpy(&imFont.width, fileDataPtr, sizeof(int)); + memcpy(&imFont.height, fileDataPtr + 4, sizeof(int)); + memcpy(&imFont.format, fileDataPtr + 4 + 4, sizeof(int)); + fileDataPtr += 12; + + if ((fontImageCompSize > 0) && (fontImageCompSize != fontImageUncompSize)) + { + // Compressed font atlas image data (DEFLATE), it requires DecompressData() + int dataUncompSize = 0; + unsigned char *compData = (unsigned char *)RAYGUI_MALLOC(fontImageCompSize); + memcpy(compData, fileDataPtr, fontImageCompSize); + fileDataPtr += fontImageCompSize; + + imFont.data = DecompressData(compData, fontImageCompSize, &dataUncompSize); + + // Security check, dataUncompSize must match the provided fontImageUncompSize + if (dataUncompSize != fontImageUncompSize) RAYGUI_LOG("WARNING: Uncompressed font atlas image data could be corrupted"); + + RAYGUI_FREE(compData); + } + else + { + // Font atlas image data is not compressed + imFont.data = (unsigned char *)RAYGUI_MALLOC(fontImageUncompSize); + memcpy(imFont.data, fileDataPtr, fontImageUncompSize); + fileDataPtr += fontImageUncompSize; + } + + if (font.texture.id != GetFontDefault().texture.id) UnloadTexture(font.texture); + font.texture = LoadTextureFromImage(imFont); + + RAYGUI_FREE(imFont.data); + + // Validate font atlas texture was loaded correctly + if (font.texture.id != 0) + { + // Load font recs data + int recsDataSize = font.glyphCount*sizeof(Rectangle); + int recsDataCompressedSize = 0; + + // WARNING: Version 400 adds the compression size parameter + if (version >= 400) + { + // RGS files version 400 support compressed recs data + memcpy(&recsDataCompressedSize, fileDataPtr, sizeof(int)); + fileDataPtr += sizeof(int); + } + + if ((recsDataCompressedSize > 0) && (recsDataCompressedSize != recsDataSize)) + { + // Recs data is compressed, uncompress it + unsigned char *recsDataCompressed = (unsigned char *)RAYGUI_MALLOC(recsDataCompressedSize); + + memcpy(recsDataCompressed, fileDataPtr, recsDataCompressedSize); + fileDataPtr += recsDataCompressedSize; + + int recsDataUncompSize = 0; + font.recs = (Rectangle *)DecompressData(recsDataCompressed, recsDataCompressedSize, &recsDataUncompSize); + + // Security check, data uncompressed size must match the expected original data size + if (recsDataUncompSize != recsDataSize) RAYGUI_LOG("WARNING: Uncompressed font recs data could be corrupted"); + + RAYGUI_FREE(recsDataCompressed); + } + else + { + // Recs data is uncompressed + font.recs = (Rectangle *)RAYGUI_CALLOC(font.glyphCount, sizeof(Rectangle)); + for (int i = 0; i < font.glyphCount; i++) + { + memcpy(&font.recs[i], fileDataPtr, sizeof(Rectangle)); + fileDataPtr += sizeof(Rectangle); + } + } + + // Load font glyphs info data + int glyphsDataSize = font.glyphCount*16; // 16 bytes data per glyph + int glyphsDataCompressedSize = 0; + + // WARNING: Version 400 adds the compression size parameter + if (version >= 400) + { + // RGS files version 400 support compressed glyphs data + memcpy(&glyphsDataCompressedSize, fileDataPtr, sizeof(int)); + fileDataPtr += sizeof(int); + } + + // Allocate required glyphs space to fill with data + font.glyphs = (GlyphInfo *)RAYGUI_CALLOC(font.glyphCount, sizeof(GlyphInfo)); + + if ((glyphsDataCompressedSize > 0) && (glyphsDataCompressedSize != glyphsDataSize)) + { + // Glyphs data is compressed, uncompress it + unsigned char *glypsDataCompressed = (unsigned char *)RAYGUI_MALLOC(glyphsDataCompressedSize); + + memcpy(glypsDataCompressed, fileDataPtr, glyphsDataCompressedSize); + fileDataPtr += glyphsDataCompressedSize; + + int glyphsDataUncompSize = 0; + unsigned char *glyphsDataUncomp = DecompressData(glypsDataCompressed, glyphsDataCompressedSize, &glyphsDataUncompSize); + + // Security check, data uncompressed size must match the expected original data size + if (glyphsDataUncompSize != glyphsDataSize) RAYGUI_LOG("WARNING: Uncompressed font glyphs data could be corrupted"); + + unsigned char *glyphsDataUncompPtr = glyphsDataUncomp; + + for (int i = 0; i < font.glyphCount; i++) + { + memcpy(&font.glyphs[i].value, glyphsDataUncompPtr, sizeof(int)); + memcpy(&font.glyphs[i].offsetX, glyphsDataUncompPtr + 4, sizeof(int)); + memcpy(&font.glyphs[i].offsetY, glyphsDataUncompPtr + 8, sizeof(int)); + memcpy(&font.glyphs[i].advanceX, glyphsDataUncompPtr + 12, sizeof(int)); + glyphsDataUncompPtr += 16; + } + + RAYGUI_FREE(glypsDataCompressed); + RAYGUI_FREE(glyphsDataUncomp); + } + else + { + // Glyphs data is uncompressed + for (int i = 0; i < font.glyphCount; i++) + { + memcpy(&font.glyphs[i].value, fileDataPtr, sizeof(int)); + memcpy(&font.glyphs[i].offsetX, fileDataPtr + 4, sizeof(int)); + memcpy(&font.glyphs[i].offsetY, fileDataPtr + 8, sizeof(int)); + memcpy(&font.glyphs[i].advanceX, fileDataPtr + 12, sizeof(int)); + fileDataPtr += 16; + } + } + } + else font = GetFontDefault(); // Fallback in case of errors loading font atlas texture + + GuiSetFont(font); + + // Set font texture source rectangle to be used as white texture to draw shapes + // NOTE: It makes possible to draw shapes and text (full UI) in a single draw call + if ((fontWhiteRec.x > 0) && + (fontWhiteRec.y > 0) && + (fontWhiteRec.width > 0) && + (fontWhiteRec.height > 0)) SetShapesTexture(font.texture, fontWhiteRec); + } +#endif + } +} + +// Gui get text width considering icon +static int GetTextWidth(const char *text) +{ + #if !defined(ICON_TEXT_PADDING) + #define ICON_TEXT_PADDING 4 + #endif + + Vector2 textSize = { 0 }; + int textIconOffset = 0; + + if ((text != NULL) && (text[0] != '\0')) + { + if (text[0] == '#') + { + for (int i = 1; (i < 5) && (text[i] != '\0'); i++) + { + if (text[i] == '#') + { + textIconOffset = i; + break; + } + } + } + + text += textIconOffset; + + // Make sure guiFont is set, GuiGetStyle() initializes it lazynessly + float fontSize = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); + + // Custom MeasureText() implementation + if ((guiFont.texture.id > 0) && (text != NULL)) + { + // Get size in bytes of text, considering end of line and line break + int size = 0; + for (int i = 0; i < MAX_LINE_BUFFER_SIZE; i++) + { + if ((text[i] != '\0') && (text[i] != '\n')) size++; + else break; + } + + float scaleFactor = fontSize/(float)guiFont.baseSize; + textSize.y = (float)guiFont.baseSize*scaleFactor; + float glyphWidth = 0.0f; + + for (int i = 0, codepointSize = 0; i < size; i += codepointSize) + { + int codepoint = GetCodepointNext(&text[i], &codepointSize); + int codepointIndex = GetGlyphIndex(guiFont, codepoint); + + if (guiFont.glyphs[codepointIndex].advanceX == 0) glyphWidth = ((float)guiFont.recs[codepointIndex].width*scaleFactor); + else glyphWidth = ((float)guiFont.glyphs[codepointIndex].advanceX*scaleFactor); + + textSize.x += (glyphWidth + (float)GuiGetStyle(DEFAULT, TEXT_SPACING)); + } + } + + if (textIconOffset > 0) textSize.x += (RAYGUI_ICON_SIZE + ICON_TEXT_PADDING); + } + + return (int)textSize.x; +} + +// Get text bounds considering control bounds +static Rectangle GetTextBounds(int control, Rectangle bounds) +{ + Rectangle textBounds = bounds; + + textBounds.x = bounds.x + GuiGetStyle(control, BORDER_WIDTH); + textBounds.y = bounds.y + GuiGetStyle(control, BORDER_WIDTH) + GuiGetStyle(control, TEXT_PADDING); + textBounds.width = bounds.width - 2*GuiGetStyle(control, BORDER_WIDTH) - 2*GuiGetStyle(control, TEXT_PADDING); + textBounds.height = bounds.height - 2*GuiGetStyle(control, BORDER_WIDTH) - 2*GuiGetStyle(control, TEXT_PADDING); // NOTE: Text is processed line per line! + + // Depending on control, TEXT_PADDING and TEXT_ALIGNMENT properties could affect the text-bounds + switch (control) + { + case COMBOBOX: + case DROPDOWNBOX: + case LISTVIEW: + // TODO: Special cases (no label): COMBOBOX, DROPDOWNBOX, LISTVIEW + case SLIDER: + case CHECKBOX: + case VALUEBOX: + case CONTROL11: + // TODO: More special cases (label on side): SLIDER, CHECKBOX, VALUEBOX, SPINNER + default: + { + // TODO: WARNING: TEXT_ALIGNMENT is already considered in GuiDrawText() + if (GuiGetStyle(control, TEXT_ALIGNMENT) == TEXT_ALIGN_RIGHT) textBounds.x -= GuiGetStyle(control, TEXT_PADDING); + else textBounds.x += GuiGetStyle(control, TEXT_PADDING); + } + break; + } + + return textBounds; +} + +// Get text icon if provided and move text cursor +// NOTE: We support up to 999 values for iconId +static const char *GetTextIcon(const char *text, int *iconId) +{ +#if !defined(RAYGUI_NO_ICONS) + *iconId = -1; + if (text[0] == '#') // Maybe we have an icon! + { + char iconValue[4] = { 0 }; // Maximum length for icon value: 3 digits + '\0' + + int pos = 1; + while ((pos < 4) && (text[pos] >= '0') && (text[pos] <= '9')) + { + iconValue[pos - 1] = text[pos]; + pos++; + } + + if (text[pos] == '#') + { + *iconId = TextToInteger(iconValue); + + // Move text pointer after icon + // WARNING: If only icon provided, it could point to EOL character: '\0' + if (*iconId >= 0) text += (pos + 1); + } + } +#endif + + return text; +} + +// Get text divided into lines (by line-breaks '\n') +static const char **GetTextLines(const char *text, int *count) +{ + #define RAYGUI_MAX_TEXT_LINES 128 + + static const char *lines[RAYGUI_MAX_TEXT_LINES] = { 0 }; + for (int i = 0; i < RAYGUI_MAX_TEXT_LINES; i++) lines[i] = NULL; // Init NULL pointers to substrings + + int textSize = (int)strlen(text); + + lines[0] = text; + int len = 0; + *count = 1; + //int lineSize = 0; // Stores current line size, not returned + + for (int i = 0, k = 0; (i < textSize) && (*count < RAYGUI_MAX_TEXT_LINES); i++) + { + if (text[i] == '\n') + { + //lineSize = len; + k++; + lines[k] = &text[i + 1]; // WARNING: next value is valid? + len = 0; + *count += 1; + } + else len++; + } + + //lines[*count - 1].size = len; + + return lines; +} + +// Get text width to next space for provided string +static float GetNextSpaceWidth(const char *text, int *nextSpaceIndex) +{ + float width = 0; + int codepointByteCount = 0; + int codepoint = 0; + int index = 0; + float glyphWidth = 0; + float scaleFactor = (float)GuiGetStyle(DEFAULT, TEXT_SIZE)/guiFont.baseSize; + + for (int i = 0; text[i] != '\0'; i++) + { + if (text[i] != ' ') + { + codepoint = GetCodepoint(&text[i], &codepointByteCount); + index = GetGlyphIndex(guiFont, codepoint); + glyphWidth = (guiFont.glyphs[index].advanceX == 0)? guiFont.recs[index].width*scaleFactor : guiFont.glyphs[index].advanceX*scaleFactor; + width += (glyphWidth + (float)GuiGetStyle(DEFAULT, TEXT_SPACING)); + } + else + { + *nextSpaceIndex = i; + break; + } + } + + return width; +} + +// Gui draw text using default font +static void GuiDrawText(const char *text, Rectangle textBounds, int alignment, Color tint) +{ + #define TEXT_VALIGN_PIXEL_OFFSET(h) ((int)h%2) // Vertical alignment for pixel perfect + + #if !defined(ICON_TEXT_PADDING) + #define ICON_TEXT_PADDING 4 + #endif + + if ((text == NULL) || (text[0] == '\0')) return; // Security check + + // PROCEDURE: + // - Text is processed line per line + // - For every line, horizontal alignment is defined + // - For all text, vertical alignment is defined (multiline text only) + // - For every line, wordwrap mode is checked (useful for GuitextBox(), read-only) + + // Get text lines (using '\n' as delimiter) to be processed individually + // WARNING: We can't use GuiTextSplit() function because it can be already used + // before the GuiDrawText() call and its buffer is static, it would be overriden :( + int lineCount = 0; + const char **lines = GetTextLines(text, &lineCount); + + // Text style variables + //int alignment = GuiGetStyle(DEFAULT, TEXT_ALIGNMENT); + int alignmentVertical = GuiGetStyle(DEFAULT, TEXT_ALIGNMENT_VERTICAL); + int wrapMode = GuiGetStyle(DEFAULT, TEXT_WRAP_MODE); // Wrap-mode only available in read-only mode, no for text editing + + // TODO: WARNING: This totalHeight is not valid for vertical alignment in case of word-wrap + float totalHeight = (float)(lineCount*GuiGetStyle(DEFAULT, TEXT_SIZE) + (lineCount - 1)*GuiGetStyle(DEFAULT, TEXT_SIZE)/2); + float posOffsetY = 0.0f; + + for (int i = 0; i < lineCount; i++) + { + int iconId = 0; + lines[i] = GetTextIcon(lines[i], &iconId); // Check text for icon and move cursor + + // Get text position depending on alignment and iconId + //--------------------------------------------------------------------------------- + Vector2 textBoundsPosition = { textBounds.x, textBounds.y }; + float textBoundsWidthOffset = 0.0f; + + // NOTE: We get text size after icon has been processed + // WARNING: GetTextWidth() also processes text icon to get width! -> Really needed? + int textSizeX = GetTextWidth(lines[i]); + + // If text requires an icon, add size to measure + if (iconId >= 0) + { + textSizeX += RAYGUI_ICON_SIZE*guiIconScale; + + // WARNING: If only icon provided, text could be pointing to EOF character: '\0' +#if !defined(RAYGUI_NO_ICONS) + if ((lines[i] != NULL) && (lines[i][0] != '\0')) textSizeX += ICON_TEXT_PADDING; +#endif + } + + // Check guiTextAlign global variables + switch (alignment) + { + case TEXT_ALIGN_LEFT: textBoundsPosition.x = textBounds.x; break; + case TEXT_ALIGN_CENTER: textBoundsPosition.x = textBounds.x + textBounds.width/2 - textSizeX/2; break; + case TEXT_ALIGN_RIGHT: textBoundsPosition.x = textBounds.x + textBounds.width - textSizeX; break; + default: break; + } + + if (textSizeX > textBounds.width && (lines[i] != NULL) && (lines[i][0] != '\0')) textBoundsPosition.x = textBounds.x; + + switch (alignmentVertical) + { + // Only valid in case of wordWrap = 0; + case TEXT_ALIGN_TOP: textBoundsPosition.y = textBounds.y + posOffsetY; break; + case TEXT_ALIGN_MIDDLE: textBoundsPosition.y = textBounds.y + posOffsetY + textBounds.height/2 - totalHeight/2 + TEXT_VALIGN_PIXEL_OFFSET(textBounds.height); break; + case TEXT_ALIGN_BOTTOM: textBoundsPosition.y = textBounds.y + posOffsetY + textBounds.height - totalHeight + TEXT_VALIGN_PIXEL_OFFSET(textBounds.height); break; + default: break; + } + + // NOTE: Make sure we get pixel-perfect coordinates, + // In case of decimals we got weird text positioning + textBoundsPosition.x = (float)((int)textBoundsPosition.x); + textBoundsPosition.y = (float)((int)textBoundsPosition.y); + //--------------------------------------------------------------------------------- + + // Draw text (with icon if available) + //--------------------------------------------------------------------------------- +#if !defined(RAYGUI_NO_ICONS) + if (iconId >= 0) + { + // NOTE: We consider icon height, probably different than text size + GuiDrawIcon(iconId, (int)textBoundsPosition.x, (int)(textBounds.y + textBounds.height/2 - RAYGUI_ICON_SIZE*guiIconScale/2 + TEXT_VALIGN_PIXEL_OFFSET(textBounds.height)), guiIconScale, tint); + textBoundsPosition.x += (float)(RAYGUI_ICON_SIZE*guiIconScale + ICON_TEXT_PADDING); + textBoundsWidthOffset = (float)(RAYGUI_ICON_SIZE*guiIconScale + ICON_TEXT_PADDING); + } +#endif + // Get size in bytes of text, + // considering end of line and line break + int lineSize = 0; + for (int c = 0; (lines[i][c] != '\0') && (lines[i][c] != '\n') && (lines[i][c] != '\r'); c++, lineSize++){ } + float scaleFactor = (float)GuiGetStyle(DEFAULT, TEXT_SIZE)/guiFont.baseSize; + + int lastSpaceIndex = 0; + bool tempWrapCharMode = false; + + int textOffsetY = 0; + float textOffsetX = 0.0f; + float glyphWidth = 0; + + int ellipsisWidth = GetTextWidth("..."); + bool textOverflow = false; + for (int c = 0, codepointSize = 0; c < lineSize; c += codepointSize) + { + int codepoint = GetCodepointNext(&lines[i][c], &codepointSize); + int index = GetGlyphIndex(guiFont, codepoint); + + // NOTE: Normally we exit the decoding sequence as soon as a bad byte is found (and return 0x3f) + // but we need to draw all of the bad bytes using the '?' symbol moving one byte + if (codepoint == 0x3f) codepointSize = 1; // TODO: Review not recognized codepoints size + + // Get glyph width to check if it goes out of bounds + if (guiFont.glyphs[index].advanceX == 0) glyphWidth = ((float)guiFont.recs[index].width*scaleFactor); + else glyphWidth = (float)guiFont.glyphs[index].advanceX*scaleFactor; + + // Wrap mode text measuring, to validate if + // it can be drawn or a new line is required + if (wrapMode == TEXT_WRAP_CHAR) + { + // Jump to next line if current character reach end of the box limits + if ((textOffsetX + glyphWidth) > textBounds.width - textBoundsWidthOffset) + { + textOffsetX = 0.0f; + textOffsetY += GuiGetStyle(DEFAULT, TEXT_LINE_SPACING); + + if (tempWrapCharMode) // Wrap at char level when too long words + { + wrapMode = TEXT_WRAP_WORD; + tempWrapCharMode = false; + } + } + } + else if (wrapMode == TEXT_WRAP_WORD) + { + if (codepoint == 32) lastSpaceIndex = c; + + // Get width to next space in line + int nextSpaceIndex = 0; + float nextSpaceWidth = GetNextSpaceWidth(lines[i] + c, &nextSpaceIndex); + + int nextSpaceIndex2 = 0; + float nextWordSize = GetNextSpaceWidth(lines[i] + lastSpaceIndex + 1, &nextSpaceIndex2); + + if (nextWordSize > textBounds.width - textBoundsWidthOffset) + { + // Considering the case the next word is longer than bounds + tempWrapCharMode = true; + wrapMode = TEXT_WRAP_CHAR; + } + else if ((textOffsetX + nextSpaceWidth) > textBounds.width - textBoundsWidthOffset) + { + textOffsetX = 0.0f; + textOffsetY += GuiGetStyle(DEFAULT, TEXT_LINE_SPACING); + } + } + + if (codepoint == '\n') break; // WARNING: Lines are already processed manually, no need to keep drawing after this codepoint + else + { + // TODO: There are multiple types of spaces in Unicode, + // maybe it's a good idea to add support for more: http://jkorpela.fi/chars/spaces.html + if ((codepoint != ' ') && (codepoint != '\t')) // Do not draw codepoints with no glyph + { + if (wrapMode == TEXT_WRAP_NONE) + { + // Draw only required text glyphs fitting the textBounds.width + if (textSizeX > textBounds.width) + { + if (textOffsetX <= (textBounds.width - glyphWidth - textBoundsWidthOffset - ellipsisWidth)) + { + DrawTextCodepoint(guiFont, codepoint, RAYGUI_CLITERAL(Vector2){ textBoundsPosition.x + textOffsetX, textBoundsPosition.y + textOffsetY }, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), GuiFade(tint, guiAlpha)); + } + else if (!textOverflow) + { + textOverflow = true; + + for (int j = 0; j < ellipsisWidth; j += ellipsisWidth/3) + { + DrawTextCodepoint(guiFont, '.', RAYGUI_CLITERAL(Vector2){ textBoundsPosition.x + textOffsetX + j, textBoundsPosition.y + textOffsetY }, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), GuiFade(tint, guiAlpha)); + } + } + } + else + { + DrawTextCodepoint(guiFont, codepoint, RAYGUI_CLITERAL(Vector2){ textBoundsPosition.x + textOffsetX, textBoundsPosition.y + textOffsetY }, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), GuiFade(tint, guiAlpha)); + } + } + else if ((wrapMode == TEXT_WRAP_CHAR) || (wrapMode == TEXT_WRAP_WORD)) + { + // Draw only glyphs inside the bounds + if ((textBoundsPosition.y + textOffsetY) <= (textBounds.y + textBounds.height - GuiGetStyle(DEFAULT, TEXT_SIZE))) + { + DrawTextCodepoint(guiFont, codepoint, RAYGUI_CLITERAL(Vector2){ textBoundsPosition.x + textOffsetX, textBoundsPosition.y + textOffsetY }, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), GuiFade(tint, guiAlpha)); + } + } + } + + if (guiFont.glyphs[index].advanceX == 0) textOffsetX += ((float)guiFont.recs[index].width*scaleFactor + (float)GuiGetStyle(DEFAULT, TEXT_SPACING)); + else textOffsetX += ((float)guiFont.glyphs[index].advanceX*scaleFactor + (float)GuiGetStyle(DEFAULT, TEXT_SPACING)); + } + } + + if (wrapMode == TEXT_WRAP_NONE) posOffsetY += (float)GuiGetStyle(DEFAULT, TEXT_LINE_SPACING); + else if ((wrapMode == TEXT_WRAP_CHAR) || (wrapMode == TEXT_WRAP_WORD)) posOffsetY += (textOffsetY + (float)GuiGetStyle(DEFAULT, TEXT_LINE_SPACING)); + //--------------------------------------------------------------------------------- + } + +#if defined(RAYGUI_DEBUG_TEXT_BOUNDS) + GuiDrawRectangle(textBounds, 0, WHITE, Fade(BLUE, 0.4f)); +#endif +} + +// Gui draw rectangle using default raygui plain style with borders +static void GuiDrawRectangle(Rectangle rec, int borderWidth, Color borderColor, Color color) +{ + if (color.a > 0) + { + // Draw rectangle filled with color + DrawRectangle((int)rec.x, (int)rec.y, (int)rec.width, (int)rec.height, GuiFade(color, guiAlpha)); + } + + if (borderWidth > 0) + { + // Draw rectangle border lines with color + DrawRectangle((int)rec.x, (int)rec.y, (int)rec.width, borderWidth, GuiFade(borderColor, guiAlpha)); + DrawRectangle((int)rec.x, (int)rec.y + borderWidth, borderWidth, (int)rec.height - 2*borderWidth, GuiFade(borderColor, guiAlpha)); + DrawRectangle((int)rec.x + (int)rec.width - borderWidth, (int)rec.y + borderWidth, borderWidth, (int)rec.height - 2*borderWidth, GuiFade(borderColor, guiAlpha)); + DrawRectangle((int)rec.x, (int)rec.y + (int)rec.height - borderWidth, (int)rec.width, borderWidth, GuiFade(borderColor, guiAlpha)); + } + +#if defined(RAYGUI_DEBUG_RECS_BOUNDS) + DrawRectangle((int)rec.x, (int)rec.y, (int)rec.width, (int)rec.height, Fade(RED, 0.4f)); +#endif +} + +// Draw tooltip using control bounds +static void GuiTooltip(Rectangle controlRec) +{ + if (!guiLocked && guiTooltip && (guiTooltipPtr != NULL) && !guiControlExclusiveMode) + { + Vector2 textSize = MeasureTextEx(GuiGetFont(), guiTooltipPtr, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), (float)GuiGetStyle(DEFAULT, TEXT_SPACING)); + + if ((controlRec.x + textSize.x + 16) > GetScreenWidth()) controlRec.x -= (textSize.x + 16 - controlRec.width); + + GuiPanel(RAYGUI_CLITERAL(Rectangle){ controlRec.x, controlRec.y + controlRec.height + 4, textSize.x + 16, GuiGetStyle(DEFAULT, TEXT_SIZE) + 8.f }, NULL); + + int textPadding = GuiGetStyle(LABEL, TEXT_PADDING); + int textAlignment = GuiGetStyle(LABEL, TEXT_ALIGNMENT); + GuiSetStyle(LABEL, TEXT_PADDING, 0); + GuiSetStyle(LABEL, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); + GuiLabel(RAYGUI_CLITERAL(Rectangle){ controlRec.x, controlRec.y + controlRec.height + 4, textSize.x + 16, GuiGetStyle(DEFAULT, TEXT_SIZE) + 8.f }, guiTooltipPtr); + GuiSetStyle(LABEL, TEXT_ALIGNMENT, textAlignment); + GuiSetStyle(LABEL, TEXT_PADDING, textPadding); + } +} + +// Split controls text into multiple strings +// Also check for multiple columns (required by GuiToggleGroup()) +static const char **GuiTextSplit(const char *text, char delimiter, int *count, int *textRow) +{ + // NOTE: Current implementation returns a copy of the provided string with '\0' (string end delimiter) + // inserted between strings defined by "delimiter" parameter. No memory is dynamically allocated, + // all used memory is static... it has some limitations: + // 1. Maximum number of possible split strings is set by RAYGUI_TEXTSPLIT_MAX_ITEMS + // 2. Maximum size of text to split is RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE + // NOTE: Those definitions could be externally provided if required + + // TODO: HACK: GuiTextSplit() - Review how textRows are returned to user + // textRow is an externally provided array of integers that stores row number for every splitted string + + #if !defined(RAYGUI_TEXTSPLIT_MAX_ITEMS) + #define RAYGUI_TEXTSPLIT_MAX_ITEMS 128 + #endif + #if !defined(RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE) + #define RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE 1024 + #endif + + static const char *result[RAYGUI_TEXTSPLIT_MAX_ITEMS] = { NULL }; // String pointers array (points to buffer data) + static char buffer[RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE] = { 0 }; // Buffer data (text input copy with '\0' added) + memset(buffer, 0, RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE); + + result[0] = buffer; + int counter = 1; + + if (textRow != NULL) textRow[0] = 0; + + // Count how many substrings we have on text and point to every one + for (int i = 0; i < RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE; i++) + { + buffer[i] = text[i]; + if (buffer[i] == '\0') break; + else if ((buffer[i] == delimiter) || (buffer[i] == '\n')) + { + result[counter] = buffer + i + 1; + + if (textRow != NULL) + { + if (buffer[i] == '\n') textRow[counter] = textRow[counter - 1] + 1; + else textRow[counter] = textRow[counter - 1]; + } + + buffer[i] = '\0'; // Set an end of string at this point + + counter++; + if (counter >= RAYGUI_TEXTSPLIT_MAX_ITEMS) break; + } + } + + *count = counter; + + return result; +} + +// Convert color data from RGB to HSV +// NOTE: Color data should be passed normalized +static Vector3 ConvertRGBtoHSV(Vector3 rgb) +{ + Vector3 hsv = { 0 }; + float min = 0.0f; + float max = 0.0f; + float delta = 0.0f; + + min = (rgb.x < rgb.y)? rgb.x : rgb.y; + min = (min < rgb.z)? min : rgb.z; + + max = (rgb.x > rgb.y)? rgb.x : rgb.y; + max = (max > rgb.z)? max : rgb.z; + + hsv.z = max; // Value + delta = max - min; + + if (delta < 0.00001f) + { + hsv.y = 0.0f; + hsv.x = 0.0f; // Undefined, maybe NAN? + return hsv; + } + + if (max > 0.0f) + { + // NOTE: If max is 0, this divide would cause a crash + hsv.y = (delta/max); // Saturation + } + else + { + // NOTE: If max is 0, then r = g = b = 0, s = 0, h is undefined + hsv.y = 0.0f; + hsv.x = 0.0f; // Undefined, maybe NAN? + return hsv; + } + + // NOTE: Comparing float values could not work properly + if (rgb.x >= max) hsv.x = (rgb.y - rgb.z)/delta; // Between yellow & magenta + else + { + if (rgb.y >= max) hsv.x = 2.0f + (rgb.z - rgb.x)/delta; // Between cyan & yellow + else hsv.x = 4.0f + (rgb.x - rgb.y)/delta; // Between magenta & cyan + } + + hsv.x *= 60.0f; // Convert to degrees + + if (hsv.x < 0.0f) hsv.x += 360.0f; + + return hsv; +} + +// Convert color data from HSV to RGB +// NOTE: Color data should be passed normalized +static Vector3 ConvertHSVtoRGB(Vector3 hsv) +{ + Vector3 rgb = { 0 }; + float hh = 0.0f, p = 0.0f, q = 0.0f, t = 0.0f, ff = 0.0f; + long i = 0; + + // NOTE: Comparing float values could not work properly + if (hsv.y <= 0.0f) + { + rgb.x = hsv.z; + rgb.y = hsv.z; + rgb.z = hsv.z; + return rgb; + } + + hh = hsv.x; + if (hh >= 360.0f) hh = 0.0f; + hh /= 60.0f; + + i = (long)hh; + ff = hh - i; + p = hsv.z*(1.0f - hsv.y); + q = hsv.z*(1.0f - (hsv.y*ff)); + t = hsv.z*(1.0f - (hsv.y*(1.0f - ff))); + + switch (i) + { + case 0: + { + rgb.x = hsv.z; + rgb.y = t; + rgb.z = p; + } break; + case 1: + { + rgb.x = q; + rgb.y = hsv.z; + rgb.z = p; + } break; + case 2: + { + rgb.x = p; + rgb.y = hsv.z; + rgb.z = t; + } break; + case 3: + { + rgb.x = p; + rgb.y = q; + rgb.z = hsv.z; + } break; + case 4: + { + rgb.x = t; + rgb.y = p; + rgb.z = hsv.z; + } break; + case 5: + default: + { + rgb.x = hsv.z; + rgb.y = p; + rgb.z = q; + } break; + } + + return rgb; +} + +// Scroll bar control (used by GuiScrollPanel()) +static int GuiScrollBar(Rectangle bounds, int value, int minValue, int maxValue) +{ + GuiState state = guiState; + + // Is the scrollbar horizontal or vertical? + bool isVertical = (bounds.width > bounds.height)? false : true; + + // The size (width or height depending on scrollbar type) of the spinner buttons + const int spinnerSize = GuiGetStyle(SCROLLBAR, ARROWS_VISIBLE)? + (isVertical? (int)bounds.width - 2*GuiGetStyle(SCROLLBAR, BORDER_WIDTH) : + (int)bounds.height - 2*GuiGetStyle(SCROLLBAR, BORDER_WIDTH)) : 0; + + // Arrow buttons [<] [>] [∧] [∨] + Rectangle arrowUpLeft = { 0 }; + Rectangle arrowDownRight = { 0 }; + + // Actual area of the scrollbar excluding the arrow buttons + Rectangle scrollbar = { 0 }; + + // Slider bar that moves --[///]----- + Rectangle slider = { 0 }; + + // Normalize value + if (value > maxValue) value = maxValue; + if (value < minValue) value = minValue; + + int valueRange = maxValue - minValue; + if (valueRange <= 0) valueRange = 1; + + int sliderSize = GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE); + if (sliderSize < 1) sliderSize = 1; // TODO: Consider a minimum slider size + + // Calculate rectangles for all of the components + arrowUpLeft = RAYGUI_CLITERAL(Rectangle){ + (float)bounds.x + GuiGetStyle(SCROLLBAR, BORDER_WIDTH), + (float)bounds.y + GuiGetStyle(SCROLLBAR, BORDER_WIDTH), + (float)spinnerSize, (float)spinnerSize }; + + if (isVertical) + { + arrowDownRight = RAYGUI_CLITERAL(Rectangle){ (float)bounds.x + GuiGetStyle(SCROLLBAR, BORDER_WIDTH), (float)bounds.y + bounds.height - spinnerSize - GuiGetStyle(SCROLLBAR, BORDER_WIDTH), (float)spinnerSize, (float)spinnerSize }; + scrollbar = RAYGUI_CLITERAL(Rectangle){ bounds.x + GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_PADDING), arrowUpLeft.y + arrowUpLeft.height, bounds.width - 2*(GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_PADDING)), bounds.height - arrowUpLeft.height - arrowDownRight.height - 2*GuiGetStyle(SCROLLBAR, BORDER_WIDTH) }; + + // Make sure the slider won't get outside of the scrollbar + sliderSize = (sliderSize >= scrollbar.height)? ((int)scrollbar.height - 2) : sliderSize; + slider = RAYGUI_CLITERAL(Rectangle){ + bounds.x + GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING), + scrollbar.y + (int)(((float)(value - minValue)/valueRange)*(scrollbar.height - sliderSize)), + bounds.width - 2*(GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING)), + (float)sliderSize }; + } + else // horizontal + { + arrowDownRight = RAYGUI_CLITERAL(Rectangle){ (float)bounds.x + bounds.width - spinnerSize - GuiGetStyle(SCROLLBAR, BORDER_WIDTH), (float)bounds.y + GuiGetStyle(SCROLLBAR, BORDER_WIDTH), (float)spinnerSize, (float)spinnerSize }; + scrollbar = RAYGUI_CLITERAL(Rectangle){ arrowUpLeft.x + arrowUpLeft.width, bounds.y + GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_PADDING), bounds.width - arrowUpLeft.width - arrowDownRight.width - 2*GuiGetStyle(SCROLLBAR, BORDER_WIDTH), bounds.height - 2*(GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_PADDING)) }; + + // Make sure the slider won't get outside of the scrollbar + sliderSize = (sliderSize >= scrollbar.width)? ((int)scrollbar.width - 2) : sliderSize; + slider = RAYGUI_CLITERAL(Rectangle){ + scrollbar.x + (int)(((float)(value - minValue)/valueRange)*(scrollbar.width - sliderSize)), + bounds.y + GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING), + (float)sliderSize, + bounds.height - 2*(GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING)) }; + } + + // Update control + //-------------------------------------------------------------------- + if ((state != STATE_DISABLED) && !guiLocked) + { + Vector2 mousePoint = GetMousePosition(); + + if (guiControlExclusiveMode) // Allows to keep dragging outside of bounds + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON) && + !CheckCollisionPointRec(mousePoint, arrowUpLeft) && + !CheckCollisionPointRec(mousePoint, arrowDownRight)) + { + if (CHECK_BOUNDS_ID(bounds, guiControlExclusiveRec)) + { + state = STATE_PRESSED; + + if (isVertical) value = (int)(((float)(mousePoint.y - scrollbar.y - slider.height/2)*valueRange)/(scrollbar.height - slider.height) + minValue); + else value = (int)(((float)(mousePoint.x - scrollbar.x - slider.width/2)*valueRange)/(scrollbar.width - slider.width) + minValue); + } + } + else + { + guiControlExclusiveMode = false; + guiControlExclusiveRec = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 }; + } + } + else if (CheckCollisionPointRec(mousePoint, bounds)) + { + state = STATE_FOCUSED; + + // Handle mouse wheel + int wheel = (int)GetMouseWheelMove(); + if (wheel != 0) value += wheel; + + // Handle mouse button down + if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) + { + guiControlExclusiveMode = true; + guiControlExclusiveRec = bounds; // Store bounds as an identifier when dragging starts + + // Check arrows click + if (CheckCollisionPointRec(mousePoint, arrowUpLeft)) value -= valueRange/GuiGetStyle(SCROLLBAR, SCROLL_SPEED); + else if (CheckCollisionPointRec(mousePoint, arrowDownRight)) value += valueRange/GuiGetStyle(SCROLLBAR, SCROLL_SPEED); + else if (!CheckCollisionPointRec(mousePoint, slider)) + { + // If click on scrollbar position but not on slider, place slider directly on that position + if (isVertical) value = (int)(((float)(mousePoint.y - scrollbar.y - slider.height/2)*valueRange)/(scrollbar.height - slider.height) + minValue); + else value = (int)(((float)(mousePoint.x - scrollbar.x - slider.width/2)*valueRange)/(scrollbar.width - slider.width) + minValue); + } + + state = STATE_PRESSED; + } + + // Keyboard control on mouse hover scrollbar + /* + if (isVertical) + { + if (IsKeyDown(KEY_DOWN)) value += 5; + else if (IsKeyDown(KEY_UP)) value -= 5; + } + else + { + if (IsKeyDown(KEY_RIGHT)) value += 5; + else if (IsKeyDown(KEY_LEFT)) value -= 5; + } + */ + } + + // Normalize value + if (value > maxValue) value = maxValue; + if (value < minValue) value = minValue; + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + GuiDrawRectangle(bounds, GuiGetStyle(SCROLLBAR, BORDER_WIDTH), GetColor(GuiGetStyle(LISTVIEW, BORDER + state*3)), GetColor(GuiGetStyle(DEFAULT, BORDER_COLOR_DISABLED))); // Draw the background + + GuiDrawRectangle(scrollbar, 0, BLANK, GetColor(GuiGetStyle(BUTTON, BASE_COLOR_NORMAL))); // Draw the scrollbar active area background + GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, BORDER + state*3))); // Draw the slider bar + + // Draw arrows (using icon if available) + if (GuiGetStyle(SCROLLBAR, ARROWS_VISIBLE)) + { +#if defined(RAYGUI_NO_ICONS) + GuiDrawText(isVertical? "^" : "<", + RAYGUI_CLITERAL(Rectangle){ arrowUpLeft.x, arrowUpLeft.y, isVertical? bounds.width : bounds.height, isVertical? bounds.width : bounds.height }, + TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + (state*3)))); + GuiDrawText(isVertical? "v" : ">", + RAYGUI_CLITERAL(Rectangle){ arrowDownRight.x, arrowDownRight.y, isVertical? bounds.width : bounds.height, isVertical? bounds.width : bounds.height }, + TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + (state*3)))); +#else + GuiDrawText(isVertical? "#121#" : "#118#", + RAYGUI_CLITERAL(Rectangle){ arrowUpLeft.x, arrowUpLeft.y, isVertical? bounds.width : bounds.height, isVertical? bounds.width : bounds.height }, + TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(SCROLLBAR, TEXT + state*3))); // ICON_ARROW_UP_FILL / ICON_ARROW_LEFT_FILL + GuiDrawText(isVertical? "#120#" : "#119#", + RAYGUI_CLITERAL(Rectangle){ arrowDownRight.x, arrowDownRight.y, isVertical? bounds.width : bounds.height, isVertical? bounds.width : bounds.height }, + TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(SCROLLBAR, TEXT + state*3))); // ICON_ARROW_DOWN_FILL / ICON_ARROW_RIGHT_FILL +#endif + } + //-------------------------------------------------------------------- + + return value; +} + +// Color fade-in or fade-out, alpha goes from 0.0f to 1.0f +// WARNING: It multiplies current alpha by alpha scale factor +static Color GuiFade(Color color, float alpha) +{ + if (alpha < 0.0f) alpha = 0.0f; + else if (alpha > 1.0f) alpha = 1.0f; + + Color result = { color.r, color.g, color.b, (unsigned char)(color.a*alpha) }; + + return result; +} + +#if defined(RAYGUI_STANDALONE) +// Returns a Color struct from hexadecimal value +static Color GetColor(int hexValue) +{ + Color color; + + color.r = (unsigned char)(hexValue >> 24) & 0xFF; + color.g = (unsigned char)(hexValue >> 16) & 0xFF; + color.b = (unsigned char)(hexValue >> 8) & 0xFF; + color.a = (unsigned char)hexValue & 0xFF; + + return color; +} + +// Returns hexadecimal value for a Color +static int ColorToInt(Color color) +{ + return (((int)color.r << 24) | ((int)color.g << 16) | ((int)color.b << 8) | (int)color.a); +} + +// Check if point is inside rectangle +static bool CheckCollisionPointRec(Vector2 point, Rectangle rec) +{ + bool collision = false; + + if ((point.x >= rec.x) && (point.x <= (rec.x + rec.width)) && + (point.y >= rec.y) && (point.y <= (rec.y + rec.height))) collision = true; + + return collision; +} + +// Formatting of text with variables to 'embed' +static const char *TextFormat(const char *text, ...) +{ + #if !defined(RAYGUI_TEXTFORMAT_MAX_SIZE) + #define RAYGUI_TEXTFORMAT_MAX_SIZE 256 + #endif + + static char buffer[RAYGUI_TEXTFORMAT_MAX_SIZE]; + + va_list args; + va_start(args, text); + vsprintf(buffer, text, args); + va_end(args); + + return buffer; +} + +// Draw rectangle with vertical gradient fill color +// NOTE: This function is only used by GuiColorPicker() +static void DrawRectangleGradientV(int posX, int posY, int width, int height, Color color1, Color color2) +{ + Rectangle bounds = { (float)posX, (float)posY, (float)width, (float)height }; + DrawRectangleGradientEx(bounds, color1, color2, color2, color1); +} + +// Split string into multiple strings +const char **TextSplit(const char *text, char delimiter, int *count) +{ + // NOTE: Current implementation returns a copy of the provided string with '\0' (string end delimiter) + // inserted between strings defined by "delimiter" parameter. No memory is dynamically allocated, + // all used memory is static... it has some limitations: + // 1. Maximum number of possible split strings is set by RAYGUI_TEXTSPLIT_MAX_ITEMS + // 2. Maximum size of text to split is RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE + + #if !defined(RAYGUI_TEXTSPLIT_MAX_ITEMS) + #define RAYGUI_TEXTSPLIT_MAX_ITEMS 128 + #endif + #if !defined(RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE) + #define RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE 1024 + #endif + + static const char *result[RAYGUI_TEXTSPLIT_MAX_ITEMS] = { NULL }; + static char buffer[RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE] = { 0 }; + memset(buffer, 0, RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE); + + result[0] = buffer; + int counter = 0; + + if (text != NULL) + { + counter = 1; + + // Count how many substrings we have on text and point to every one + for (int i = 0; i < RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE; i++) + { + buffer[i] = text[i]; + if (buffer[i] == '\0') break; + else if (buffer[i] == delimiter) + { + buffer[i] = '\0'; // Set an end of string at this point + result[counter] = buffer + i + 1; + counter++; + + if (counter == RAYGUI_TEXTSPLIT_MAX_ITEMS) break; + } + } + } + + *count = counter; + return result; +} + +// Get integer value from text +// NOTE: This function replaces atoi() [stdlib.h] +static int TextToInteger(const char *text) +{ + int value = 0; + int sign = 1; + + if ((text[0] == '+') || (text[0] == '-')) + { + if (text[0] == '-') sign = -1; + text++; + } + + for (int i = 0; ((text[i] >= '0') && (text[i] <= '9')); ++i) value = value*10 + (int)(text[i] - '0'); + + return value*sign; +} + +// Get float value from text +// NOTE: This function replaces atof() [stdlib.h] +// WARNING: Only '.' character is understood as decimal point +static float TextToFloat(const char *text) +{ + float value = 0.0f; + float sign = 1.0f; + + if ((text[0] == '+') || (text[0] == '-')) + { + if (text[0] == '-') sign = -1.0f; + text++; + } + + int i = 0; + for (; ((text[i] >= '0') && (text[i] <= '9')); i++) value = value*10.0f + (float)(text[i] - '0'); + + if (text[i++] != '.') value *= sign; + else + { + float divisor = 10.0f; + for (; ((text[i] >= '0') && (text[i] <= '9')); i++) + { + value += ((float)(text[i] - '0'))/divisor; + divisor = divisor*10.0f; + } + } + + return value; +} + +// Encode codepoint into UTF-8 text (char array size returned as parameter) +static const char *CodepointToUTF8(int codepoint, int *byteSize) +{ + static char utf8[6] = { 0 }; + int size = 0; + + if (codepoint <= 0x7f) + { + utf8[0] = (char)codepoint; + size = 1; + } + else if (codepoint <= 0x7ff) + { + utf8[0] = (char)(((codepoint >> 6) & 0x1f) | 0xc0); + utf8[1] = (char)((codepoint & 0x3f) | 0x80); + size = 2; + } + else if (codepoint <= 0xffff) + { + utf8[0] = (char)(((codepoint >> 12) & 0x0f) | 0xe0); + utf8[1] = (char)(((codepoint >> 6) & 0x3f) | 0x80); + utf8[2] = (char)((codepoint & 0x3f) | 0x80); + size = 3; + } + else if (codepoint <= 0x10ffff) + { + utf8[0] = (char)(((codepoint >> 18) & 0x07) | 0xf0); + utf8[1] = (char)(((codepoint >> 12) & 0x3f) | 0x80); + utf8[2] = (char)(((codepoint >> 6) & 0x3f) | 0x80); + utf8[3] = (char)((codepoint & 0x3f) | 0x80); + size = 4; + } + + *byteSize = size; + + return utf8; +} + +// Get next codepoint in a UTF-8 encoded text, scanning until '\0' is found +// When a invalid UTF-8 byte is encountered we exit as soon as possible and a '?'(0x3f) codepoint is returned +// Total number of bytes processed are returned as a parameter +// NOTE: the standard says U+FFFD should be returned in case of errors +// but that character is not supported by the default font in raylib +static int GetCodepointNext(const char *text, int *codepointSize) +{ + const char *ptr = text; + int codepoint = 0x3f; // Codepoint (defaults to '?') + *codepointSize = 1; + + // Get current codepoint and bytes processed + if (0xf0 == (0xf8 & ptr[0])) + { + // 4 byte UTF-8 codepoint + if (((ptr[1] & 0xC0) ^ 0x80) || ((ptr[2] & 0xC0) ^ 0x80) || ((ptr[3] & 0xC0) ^ 0x80)) { return codepoint; } //10xxxxxx checks + codepoint = ((0x07 & ptr[0]) << 18) | ((0x3f & ptr[1]) << 12) | ((0x3f & ptr[2]) << 6) | (0x3f & ptr[3]); + *codepointSize = 4; + } + else if (0xe0 == (0xf0 & ptr[0])) + { + // 3 byte UTF-8 codepoint */ + if (((ptr[1] & 0xC0) ^ 0x80) || ((ptr[2] & 0xC0) ^ 0x80)) { return codepoint; } //10xxxxxx checks + codepoint = ((0x0f & ptr[0]) << 12) | ((0x3f & ptr[1]) << 6) | (0x3f & ptr[2]); + *codepointSize = 3; + } + else if (0xc0 == (0xe0 & ptr[0])) + { + // 2 byte UTF-8 codepoint + if ((ptr[1] & 0xC0) ^ 0x80) { return codepoint; } //10xxxxxx checks + codepoint = ((0x1f & ptr[0]) << 6) | (0x3f & ptr[1]); + *codepointSize = 2; + } + else if (0x00 == (0x80 & ptr[0])) + { + // 1 byte UTF-8 codepoint + codepoint = ptr[0]; + *codepointSize = 1; + } + + return codepoint; +} +#endif // RAYGUI_STANDALONE + +#endif // RAYGUI_IMPLEMENTATION diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..7176b44 --- /dev/null +++ b/src/main.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include +#include "engine/screen.h" +#include "engine/settings.h" +#include "game/logo.h" +#include "game/menu.h" +#include "game/game.h" + +int main(void) +{ + Settings settings = { + .name = "The Last Hive", + .screenWidth = 1280, + .screenHeight = 720 + }; + + InitWindow(settings.screenWidth, settings.screenHeight, settings.name); + + Screen currentScreen = LOGO; + LogoState logo; + GameState game; + MenuState menu; + + initLogo(&logo); + initMenu(&menu); + initGame(&game); + + while (!WindowShouldClose()) + { + switch (currentScreen) + { + case LOGO: + { + updateLogo(&logo,¤tScreen); + renderLogo(&logo); + }break; + case MENU: + { + updateMenu(&menu, ¤tScreen); + renderMenu(&menu); + }break; + case GAMEPLAY: + { + updateGame(&game); + renderGame(&game); + }break; + default: break; + } + } + cleanupGame(&game); + CloseWindow(); + return 0; +}