From 70530f5055e116c22ab1b433884573944e9c4f64 Mon Sep 17 00:00:00 2001 From: hgn Date: Sun, 14 Apr 2024 14:16:35 +0100 Subject: [PATCH] adjust imgui font system --- .gitignore | 2 + src/fonts/vg_font_thin_3.png | Bin 0 -> 21392 bytes src/fonts/vg_font_thin_3.xcf | Bin 0 -> 232793 bytes vg_build.h | 4 + vg_build_font.h | 148 ++++++++++++++++++++++ vg_console.c | 6 +- vg_engine.c | 5 +- vg_font.h | 22 ++++ vg_imgui.c | 236 ++++++++++++++++++++--------------- vg_imgui.h | 23 ++-- 10 files changed, 321 insertions(+), 125 deletions(-) create mode 100644 src/fonts/vg_font_thin_3.png create mode 100644 src/fonts/vg_font_thin_3.xcf create mode 100644 vg_build_font.h create mode 100644 vg_font.h diff --git a/.gitignore b/.gitignore index a9d0441..9b172f3 100755 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,7 @@ *.so *.dll *.swp +*.gc +*.gh bin/ diff --git a/src/fonts/vg_font_thin_3.png b/src/fonts/vg_font_thin_3.png new file mode 100644 index 0000000000000000000000000000000000000000..1989a4470f6a1be965c685ea4458be15460b10bc GIT binary patch literal 21392 zcmeFZcUV(Rw6L6UE%w}Bj4EO}&`Hpcx zmzI;2R#0Y?mz7sklT}ocQxuj{P*YN301Rx< ztADj6Q?-J6x9lV=VI1HvK-=;x`0ijf#hv(2MM z)xHhnUf`ACdtYN>46+^LpvPfH`n)GtaZx`cE}+k^L)Pyb9zLcWV7I=L6xii<*F&$z z+dWs+NGhY@_L8%uveFOekLT}}(q!f}EFm!e(Rab4YpEz%+x}Y_^``I>l2Xnb$1Y2} zEx32y`^(a>Vdazjy}}g47ozdJdFM@#Xb01se&NRGU)npGHl?acOJ^UX>hvYdMJ9rp z8+A&*t71Enhtxp#`dZUx)-hSFE8B(tijva}ngHLq>1wXD@sZH98OT&vXq{;~=AU;sFB z272Rm&~1~eYA!GzX(v~hvzv67kKg`y0UFw2eoii4Zb8D%ZXQryO%XyPN<!2At@VdSm>PqCk6VzFaF~y`Z=hP3rpRx)Y7BTk zSw=+oH%gF~rpRrE80o?S+=LaS6{TgtSHhqn@*-M)2x|nmx~rLA*87VD<4segNxcLT&{+)!Y%RkHe1qXQl?vAUAjGMQc4+AxjQLEg) zRk^Ql|17c30uQK<-|tckX8#*z5Y+u&%=)*s?dSaN&fgotDE?2n|AzgKzW+vMV40Yx zU52>??>EozvZly>{c5f-7pSY+Z%{!|RYgJB-3{#SuBrr9ba7JxJ3-`}z%EKEvWl** z5N8)Rg};$9^bHJh@^x|BC&eHx4Q0@Aa#B!rlT(6#Rg|1n!HO!XvS0|rT?MQx3sIF< zg{UY&WL5u0!YlyFkV+@-zqe|ilq-XjqLZ?!lAE$JSYB081+1v(CJSazR{*Q1$}1}= z$hs>jK>lovtBaZ*EWpQ!F`Q5zCl5CnKVOgEb?h@-?cy~e;=hnA-2ws`lDJRvx9R+yvp+0q zjLt9^>$ESY3I|#TvZ^hPALCIavjlKV|d3VH8!t3XCqQsxbs!PVWC*7hNF?ZC7$<^vT7E zVQ5@jRl!a!3i4oAc~>Pj7dKfsS0~7S%P1;>Wfj44ivLlw{}NOUnf=M_AF8P#^PiOW zPlUhCh71A!GmSCJGA3=Af6m%}Nj_sp{%`*NG8+Fks}L6cpGy8q{QVzx{SUkTOC0zw zA^(qb{SUkTOC0zwA^(qb{kO5}kALm^-Fz9#^-#vH{v1JHjNuVrbvD+&3`78KfOGL( zqY6d}ho6B}AOIXZzJGy$tZW`eB3qE5$rZLm7S2N|oOX~5JOBs-hL;%3 ziY7xEC^N5&1(yIStrH8)qEQO-aHKrCFS26;iSFqVDs?d3?UP?wt|JlQ2<)zJu@4O= zS5%6qpar6F5eb;$aHbeB`$)YR;$+Cvx}VahAV~g(E@$8Lr!F6dgCCdW`v}_f>fn%t z;HBDX&ddc-!{|FLPoFI7Ot8_nxq<$7%tw^NLVAfI1Af$IWs%CQ(RL+wN_lon0bfRq zuSGBqK99&_^i(qdOXFKekz(snGOMk!*x~}zuK-dX%_2&>P}2{3H}P$stEu#G+97G% zv!{xD=3fVkiUfz0@e4xlcYWsI`E<<&m#&IA)*LrjE`SVfs0n;eEr!Cs-30-f#ZWc< zXW8ipZJa}fN?!%y#m`*@5j>^uBZ6wY2PUXEL{ps?;x}`IvQrur0#JgFUB7K&4UzOF zJgT9Q9&KmWthV7mhd4MeSgD3=tk{f`6DG6}G&r3^B~hNZ zTg^n%c3n025SdP12{>hK+F|ZS_q=tp)ejh<0z_sr4V)%JY`A$^jJSpQ-s4?i)A>hN zb*=6?PB}y60LH#Pv0`uG}vlTTF&1> zMJc^h<0Dm4_eh89$Kw-ZEL!kY1t$~4jeI%?Kb!!7hUI z?T&-k(?$Iqy^`_Q9wKt-@W*PhnZQcei#Imgt|Kc?iu!;u@ttitLWn)`TOAc#l$#$} zRB#Z|_;xsFQc!*1x?wY^C4}h`217UJf1XWV#ZN^!Q$XEUfJ>&WK1%B|u^5-#X{gYG zHtJ4LpcH!wrVaT5x{SM1;I>D_P?5L0HufCm9xtF&4}U>6B}mXW@m8m<({^Hm2|vh) zlsp+2b=oJQj2@bmV9`=Y!EI%l(CuFn5#F0u1`tA@$c^YaUQ`M76ao8ERsaxF1C*L} zLI=KRFJHzsPS-DFh9kANCC99ZZ;P?n5sqRYoi^j0xzmx|42^c|Ou`YIbUqC2*hF*k z0Id;+bq@etsW>yomwiwdTbvrk*uEo%dFAVpKZcEh@|8|TnZt=J96P0 za&YrF5E25^vW4w%^U$5a@Ci(&rHgP4t0Euk^S=q+NB+vWnse&p|y)nddIK zGR3YA_F2*;#aE^`ajL13o9N&Om(DZq{TxBBv}9@ymif=$F-t&4$wg{hH9+tO$ixjf zH{H)p&Za;(ZyhdvpYi>he>><^DSPYg(*2KnOCc%6BfF+On>l>kjnTc|V0JVy$|RPC zOWhVDCM-Emisu`RqdNUNT`SK9fxzEoc|pAfRT5A2Y!&K%Uv84L#JZw}En- zN^vtVQ%_tHB@XK?K_5fr*np4#ps+Ee3QLaGaGf85Yi^x<|0I!*2-`jAmLjyfj*v9n zI9VUehds3t0g=%OjL6*%Y%ZbB2e6OQO$L0*=-`fcGZN7Mmig6gnm32bsZ?=EnV=I( zwX|*4p9*`~F}G>MX8guUdY<|AI4mDi-o?s@2Z}ARc~uo1hhBf#u~F3;gzYqLp(?2Sa;x&pm=EQ|k)(8UwQp!UOy*6haNw0n@Ipgo9}|srwzr0r zvCtUWaaJXa%#U?Z6ej>*zqfxz^V=0Z3w#?=^#3UXtkkoDS~;^-lM?Z^ef7y8<`}J` z(@gJaoKdTUiA-s;0G(?v>;|D81p-<-L7rb9rYRR58<$)N3}eu$ZZC;98dWpBA#&V> z698gW0USbagmflnbEp>+HBCChMyFR@gV>P6Iq* zOh?pL#Dg@qAKBg_j|KN+u88fP#pq(!xdar`tO-83I6B>IxMc_H@Ttwdj2?nVHhnrI z@aDL>l!0|<%OftJ4FZ%4Ij3%xV6BPj-Diwyw22K$Qzd$l1ZFq@WCa4w>Ra50C`S{$ z`h2{jGP93^T6dURA1ZEg>k#yh)pDJet-9*tGppO)IPBjF0CswSSo;N>qD~hz z7(E08iX4IDM`8_QD%7mi)Q*jNwVgWny?BKdXd0V3b?MiLHc3$jx)*3R&kT6>gF3Z) zWHPWn$OOdPE-FtI6^=)$n-I8nSFh7PWZTSI=L`V^x?NsOT{Eo=<)bwXy*G*x8q%=O z%&}ZVNqeEpkN_Z{59k~_v-6N=Vtrzd$~V1EegV@208Sn8gB#oUNO+W(r&#jvOb6_Q zBLy@ojHi5o#sKw!?7*vzuXwXo&}_9zMPLpd?9c&XHdr`tk|8SmT!KuBV%x7Am)JNg z(4jegi_g|6WnZzaH6#Q3wVJlM=kr#FV!AnX7Q-f2EoSrCHX>6onK)Wn_)3GZo@yWb z+4ml$YxpWV;uBkJLF6MERX#KC!KB>`)*y7}#VUjZWeQ9_s;- z#U)XjVcpXtre9%v)0@Tj5knt0%7!{B8cmslsB5KIG6C1nh^KqL>OFcg7cudjjOZdp zq4TocD5E&F-S$pu1EEcG5T7!)N~&9>H)^{E5qUoUf<~h_eJP4}n}anNBv2x7qcIZPt>7Ug#rzZS$G&5I;jdj%iu1RsLCFcDFct ziUWw_jCpYPaMU@>kBBlF#PlwGs3jqsHpa9w#s&SK zHR+V-7`#0fsB9bceezRB@1=(|UzOe{ZW;#IhOKEFh!GG0Cawrq8~08(?{PmNUewJ} z;IifHa}je^?jr<7PLZp6U^P4Khvv5<9ubxsdrv=vu(YtZD#LmL0kNY@hAf{><&V|k zAgjfJnS$z?!zU{Pdj@LCX1G|G7n3X^K^yV2KXNol@Yy<$pYSg^X-n1#1#nsaL0warsp!=4BoWjvOOk+6V&wKh zO8U`;C;)iDsY4N~RvD32m_Ot#@Ng`+bW!)4-_LBl#fhc+m)0xZQ*sw@Yt?n6{2Fn* z)fJ|I4P$|qV+3h|d0T880i%|U+gY(=yY&iR5s?9$e($bYL#EiP|0P+GcV_quj zn1Ij417D*vv*S)ZOF!>mji5{3@7tY5=64|p*Q0HjUuG$&vxUXJ!b z3C31scmRiv#piNKR-ToDN zduF_>d4gQr38$RELw-R=CsxZ-XQu0h6iqOl*i=#jVQ*J0d{Xh28yxw77;d-p%lKE< zyw^6tso5T}TxCih!{D1RtupQjzxasp@}qq2;ujfX2E$o&RY2e}OC&C_F%iDv zY5wS_&$y)8r4!70xkJczSexlxn_-ooEW-g4g-5+M8`Q1xd|UEVftno>%C#C>>xu3iOE7OBvU^_xa{Up;5t07h7!GuAOIkBAR*) zLnEtx-UJ*mr20A_g4gRTE??|j>%?tYrfVW)F1y?@rJLYH6tYR~RGnFRw9!&wp*N89 zwDuuO8P@eS{evQ{fgDNuR(V}$EwvhF(EAzc^Cjvq0Xkq3e$eqHEJyrYU&QOePA{L= zYj&BM#EU0hMa9}z!R~CKYACA_Dh+22`Aj8qOR6quecy@9cGjSqSQWjLrT4%!De1K@ zU*)7M6&0VIsJ?ZJzLQzHffqHA*?Vl+5IKIT!M9r`-0rpd8~yN8-y`caib#n2^RJ)f zHMFJT`;mEs%H5MsLLV)*f$6(tNeOSYB#B(;kE-pPSELZ-qIDIU%RwXY(>;UMcTw#y6eaReLe9*>B^czc-hE11@Xp*mdwcV_I(A z4_pEG_isE;!?WHTP+~x;KJ)LhgSZYrg+xR&mkb$JBDLiPx$K#%x=c!Qcim7v*7MF18JV)`@*-v>I!!8vM%#k*ks4Pj-IhY>jwTBsExa zu<@%{zv+=xM=?!d$iA%!4Y>MKtHaa?yXHnQ*5lL5 zN~!+-Jp0X3lbXgt(+ie7x>`t-&gbw=EZCzD>*18XouR#YgFXf;!3g5#@c6B5-=SP) zRDDI>@%aaX4l49u|C@!V2wLqkp$lf#mL=P9L9>}CtrOzWVLdnVQ%gI5-R>}7Lf}N{ zD`^^bj%{;i0UaE8b2~kxX(6%CFDlZdb$Z*&8S-QiD2#}NaUx$RWKI(Mv03GtKDRWob4<@PtjrBcp?2&8{|^g=)#sJH^}bGco^ zY50y=w5Ow<*wFGpP(||KtM=Po3wynfJ&qp2pZm$;ndAxfxadr&o9oQ9$Lo*>AGmgg zE{2f%)xJ%n%3S;o+~z5pP;bay)V(86x2uRVA}pPl!dp}!%*on8%Apn4E0qo8cAriA z9&EgYVJdx;oc1>Gag%*0P15C)(m4Xci$C_sfQi3G!0S7e_g>86}pZKRwSx8gg-+G&yzZi3~*wH-ZO>iwRTDGuZ3#PZ!$GXv%o3mAHMB8*yLv6UklRqx|_Z65ReUNmq z<_~pc*P?2Pzc6@;MeTIh?LaDIRxf0yGx#hv%6!^I3l$m4d#iZmb_9m9QN$&%c>Em- zdy&>mTa`i&w$C>r%t{gLoJpV~>HzJlV$jqw>GQ7=1G@XO8Pt)bd3*tDIPvM|75E8) z-J5eMM7j3LTBE)85K1J(%xQ@K@XLTitTj@_cugcYxH~L2E7hh z_ttMii2imT-WiwF4m*57Ckf>}HGqiQdEKvO_2h~@sg`^Dn1I1khY3{|3P@fAINN89 z;k#!Y_ddO0*qhMl;~m}+QN7uNsWX$M0f*IriC-aTR?|DfDemkxk97FQIXt`k>JNPg zj$&lzFuc$zJS*M{raDl&fm5qIol!X(RY!qDZ5_cz6l-TingOuo(XZ5QmBlv4)&G$B zh{CZVq3z8g44=|Lm*Vn1c2gbW|}Srh<3YBYg{Vqt{uw$oYG)r@elBzR}N6>S6!=BfAr~Keni(Q;FC8J!t^;fGn!2} zd*(BTK@|J7AyyxF-L7*$6zg>N5ig?9@~LcQppw~dPX#)onF`(8Tg9o2<2+y>EAmza zxv&exaZ~ImB5+yUo`j3|GU;bwf59Q|c2)=e`_?WMzPn2ZBpVA;PZ%J=cUIM>uc$^# z-)(Ssjruz2cfBx}&h49mYF@($~^h{dvl)i!*y&i z-Dzd_fUH`)`e9kO>+1r?s!2b-{CJqFKLAVEJP5GGe9iv4*vk4cx}%GUCuGKCsQMKv zz!R3l43Oq`3j6??>Cl$PKc>rQ%9e}z6Aczdh^n8?Z!d`-Fw5@g;N`Wd^l=8y1@tqG z!$4D~Fk==?Emy)`nr&pwsF@g%uSEqSI}Rl)=MjenLhTG3;)e?f^)$(-H(kdAF9i%W zZlw1|Nsa^WW0{4g1?taH)L@=>52t_cE>2H3uSMD}F)d!O5NXRa+k_{tH<60JNEi)~ zY!ONPcDX1caV0QS@F}O(;0LZnfsn_5EuBi@Hwa8#;nPyV%vi>fH^qCZnlvf3CUoi^ z5x4vtI4VzJpoC~EJ4I+og_%tnq zjUh_whIeyr{OH>CaI4TNd>&$h&UZQU*jZLNcMZ%&E$c^ja)Ti4<@sslsBXF5j15GN zXt?I+5+3cK9eH(2)u>rtfnEoj!K2OeuF# zex>~h?YZ4zSHGqnM_F>MuaiQM81r-?v!l}yCDWMU=U#(eBF9S9p79(tp7Z|BB24#} z+HoBjlQRq{$Y{rQb37cughs7iHspUdtg+|o{rTwQ)nK29%=JuF5XsAYy8d;sdB^x2 zL1U5VK@&kvojJi*ii%~1GX6Y~u{Jgt>1-F|>?gWnDN&(!_+l4~P#({fPrSycu?^Y) z(xQ^}KI29RuZrTrlqJ=97ViSq{N1@M54n!|v~|)Iir7(I{+PHV)D|zZ4|(I@T=8b! zxd>so02J57mPhCMl$&cPwxZLq6h7AB?%6df(wHyzM4+kBlyA2jZPFwYM)Sp7c;aug zB%Bvtr_5a;z7b`%WZeC*YqZcz>HKJ8xCvx%@xiv`qnbz`YTXhk4HX<|#Pe;{VtnF( z^7gftYaEn~y8Bbm|Nw*|_>y6^PBg#=xQwTMr`$4UJ{5PGjTkN(lAkTvap4{u^8Y3qKcC)obN=x$Ye=sgv!D^GykibVKj8EA zsK8x|q)V5acvsuPq^%~l;5AC4Kl?S6&<%#-&(B2>h-{t$|!ml zV@|*Wf=oA%Ms_qwi@lTYUY^ern^sFwrZ#I0Qpk9fqGaE9wcdE7i4gsseFWJakHjMr z0{9)$R?jxOkqOZs9}cbLM8l(Ak|uZJ=k0Q{S%=J4b}5kQt_0yHym zf3cYcD793EzqLMLIA+0b87ur&sAz}JRF#w|o6a8ah#<95#r2w! z^Jb~faicuBwE6Hmp?OiE-Alu0T&c;tu{7XY1%#x_q=!BEtJsdb9yp{IR0|$J>FFnp6F`1%QSHlPHY48gC*K z634ECv-e24_y$q*bMw0pz#mG|wm#t~<_EC)A7RI*V0;tQ-Yc;ErWd^5pYtcuc}!<&g^22iMgN>d=uCwu2)*&Z zB8IuYZ_P?!oC2l4e6xfY$%z?k*A8lA*>~~_|M1%h@t?4ZGMUTc3y+Bo$%HIf^Riis z*AUkyC)e^MbWZ;|q@#a5-dugncCIg32$;*8W1-Y8BygT(0`d)FU`GvJP|hZz@LEAh zHax!~8K-J>=?W8*3ap7=Gdg6S#J zCcfKXrfbXgD|J%`4tp&1Rlv4spYxCcYK(xdNS-dwX?BjMhA{h;T#&;rwdu3dGLp}a3m=DrVZ1}Rjufh7rc z`sj`P;qjjL+HD(w8z)#cbHdO-;&9?5*Qf%l|M9OKC ziwqe9W@Ba<_do5{-%Qwl0u|93CPVl57^rd8>-MIVFd`nMiP8(<)=}%!*V=fR5;-r5 z1#2hnaJQ2E_D$j9=@Bacy>WeI@~akG+iQ)+)UVy6$AQ70qMKYgea6f8OPwfi+lN35 zgiZD`i(?dL#3O@NgVc|%_gPv4?1@^Y;DQMKVWF5#&~2`5zV-&i~brP z=t$J%IkRaJ5^o>3&aO_E_lcf7i!?@MsMVz*1x}3~O}cb6Ch)sRg`ivXqrswXtPFK} z4sP;{UY5D%7;!j_bkZO+X_$E7ytck}(E>WiaT1k5%)?>w8u0Bs1(YCa`*QfU^fp#q z8+CDKS|BbocTnICpT`KHZ&e*e#w&c#nut~v=e2#YHWW(R*yzpmr@shpuBD89{MAS3 z>x`7}L8w0j=4I?%sy}&9Trg7I`0LRv>oC|#+HmTEw4AH$C`Kv~trfKa0o_ha$mkf9 z=F~waOxgRS6>8s`Np`2e{h12eQK90Fx!O6aHW_v2Ch|*SrObcT8c!Q71z(UkhkZwB z%(e}0p=j;aFEkII{^+1hPj<~VpU~(-a?y<-Ag}SWi5}410v@_%cFc|4tm(vs-eQaa zQ}q&m&9hq~#f74EcrcK87as+Z@i8z~1)be{l|~szM3{&>UQp3TSgPj@h;Wqid@NYJ zdOE*~&tWnk>S*CGxnmwTN_V@rcBt*T==p-vbaT_zh_c(K>3png;(!qk0==GoeD&Ed zYFI&Kq=k9bdUzx62n-{e?uj8k@_&>XvtEZcE{}B|$DlXTrBK6R{$OjAnL6r)_RiLh zBGKmQgRtspx*Fl=*0Z7Z)tz@m$Ywmsm}Qnd?%j>kQ2}x^mz4Z81D(Sj1E-Ru3b=B= zvAw@90}5G`<^Qy^>O-*^sJtoWnC9=Yz~XnoDJ^)&9p_tfoKQ|P(O{PS9OZ34z#Jp* zg|;~^Z|zesFBrCRvsE(@^@diIojJ`P^E9+le<~j{yfk2c)`h{+#2E!Ddr~ zB_Ap}1{jrm?Hmqe@`51#opq&v0L_kzNgoEly$IE(q zJjaj5#HuTuMSZ=t(a2sT3W5_0YSv{&P?e+&oBFyx8d}O~j<;l>o*j(*k)pNoOF~a$hNHJv-x?!$`+j`*^i0NlTmDp5zU)<{)eq^tW_upD&X$sA!N7|*YVF&TL*o}obsdDYr1@xB7tu>Qo z8oql*KN?I;d-KQx=;jKT@MFo@nqo^7a?FuX;4(rJURWf=#ysF_L!{B1G(c&2Y~Mb_ zi8Aac!0@6meyaaFkZ~R|^lv75Xsg(993lRDfw^y?QSp>N*Oscnzlr_6`LVn%2K~$_ z;?Kmj{n$DOwR*N;gt4)>l@LJkH8YJ;iaHAxzez8e&m1-b=U69Z!mTRtaJ+bt350r@ z&&-ng0W;z7L8CMnTa|4+r?3osgb-AuGC4=|E)1q*3fS*w`ul7je$AU{>#zcVh& zmE0`f;!hv0FATIZicX$NThEvrC)UXh*Tx33Tlc>UXTR5Hh{r zBsMGGwA8p2jjq1M_ZxoDDMR!TUq^)ps(ntc`|{&l2|PLa4!E-jEjiEuAFcTkhAhv_ zNJJQzRn}*hmL9tfbdf)pq*|w36TBeG^A27@M7dI3mh60wjE`@qfFkcE^B4Xe1KT58r@`NAM zk!QEIn|f;jS4W%^YDWz3LIvulEKVsYdye9DmwhRVo3m#_k8GXj)r>gtYQ*lC8e=)2 zTwx`CJH8=>F{15x5}`J_=mU$b1LCZv9oLcV6%GhH(pQ#?#uH2qvsb0B2T8)OOq!?(TkY+z-H zlcVoPg8~9_fD+N*8~U@uZC^C9j$dmiSG~~zVzVZ&Y&nkU>Q&sA`w+xbSSJ&Z4fs_5 zcw2YK^y<|y^tiz)_W4DZsacl!WxPb=-lzzuhW~JRte*s%PQ&f@{Y=&PApZ+VJ$g`P zJ7=6NK0`N&5k83oF&$cCpM9^}wW!PC(&H7yP=T1^?-O!$a4h|t4A*Nb$NnF{A444r zyzAosfV(59=y)qnAEr-&ar}%q$A5QNhPyTle$iaKGy=7y@yMDqlR{p89RhO2jYNyh zN<^hi^zu`yU)d~ak~Fmr+kTFzT{KvIN-FB%j6~-Oqc<$4(e55%LkA-MNEv#@`sw_! z_Z^hwW(WA-OZ3BS*V`5$1K{bwhY%;r?CmW6B5oB-W^-BdFYcBR>`&<*yUeD|D^eD1 zwVEyRFUk4k)|;hD)HGX!^T*hL$YG3oFXS`zNUBnl#Lgw*ES zU1+C&J%e{y>O?7$t_MhW`A4t@;^Dw_?q3~!WJgrp?@wm&zI3APT-K^SZx9$>Sh*by?BVe zt(MFn$_em)*?|rHU>Od)-><~T(m6RtP*BAOsWNu?E}w0Hl{*EPupLJIYyj&R)i`8p zg$x4Pe=3^b(w~M|tO#pAknFo2n|7-m;YdttTFB6K&m+2E1gdK4h!W)p5I*~BM!L1 z@UB*faP^8G5yeZ3SxzYX)V*7^C3{ATumbj&b}NJH_NKh(4eoEJ8-359(!5KR(~^|a zhEl{3r4i$eW)T$y3(udu@d>5w${QZ!iKwt zE+Nt@R7_*sP84vl6|!5o}t|1L8Dl}dS|V{uD0ybm?Jg6=i^3XHyGZeVp@8=2ye zz`Jn!r7>DanaQyx=KlQcw1JnAtJLwqxB`7D$$4sQ7rhr^gB!zkSRw4cV$2hB^rAVK zvn=Ao2okJK4b0ajR0~a?4YDfg(*_bvpwu*bTm8iZ`y_3ApBAg>o{km6BzW*Q(J1QY zi^nRQ<`2~3YUi~)A2P>&V)lejz2SB5@kuEN9OPpathm$n@k1-K3-jy%hs1(o;+KPQ z0)WS{SC3>2&JG_cczP zM|Fn-X7G%t6?9x&oni7(j#peh?I_wy=51EzX3+|0j8u|)PdvE{J&teuLuTU9D*5Ug z;*aa(##wG5!|@L^&C9Yzc(!eSCfk6;KFv|KT_?>FvrdvT#cTByxaIv=7R`)1R*?u2 zh4Pw@PqLjT&nq;0inOye?nXMfMpU3&BWDnJIsUcfytI&yf-JQVaxFrfk34JsiT$_ZB>z0n+RD4W4}O+635G{BxS`o`CYjiFO0y~=0o~%-nKD9u{Up%8vw^2VJM(gL z=5WfJLl>y0FEdmfm}Pj607b^B+A9{|Z8yism>N*({n=#SUzb+v8Z}t~9TvdFV&LPK z#Jz1bRxUdoy4RuWQX)YAfa%bLUpd-YjuB`0+hDYM=KzUpALq~(tgat(t#2*>d&`W=9u!VNvom_2< ze~|F+_EUd0Z8Im#(0(4hU?W`aQqDz8Bd?)?seyZEEbW&zd5kdHMPi)3j1OSJcb=_9mip$g4E!i2BEKB*&M78=%Lkfaq0UPZtn& zXosYsM`+Lg+E6@PQWKIUs0~l*8+2hUcDow4bK)2INS52~m?r;AzE2X(AC219CoQOV z;)h6Y5vCs-YS_)oZ4TuJR7YL=v2DG&?%)-jo^i`Yi+>n2YrC@@v}(N=$o)yP{W0G2 z$7mjOabPJ!ZJ~Jt`+BWt!KMc@v0*W3=XLz`xW={w0xb&z8RQ+{*_}aEYbu$sN?p$& zCJWA?5cl(ct~sbjSNCP7J&}sLjh9hqK(2a z9=e>sfi>ND0nXLce(MeJ%$xI3aFrX$U)%l7cH8s;F?*s!BRwPOdWoGjIc^~5>IH$@ z%U`Xdjb<`7(tP1Q)46Y!mUnjFod~>HY?C2_yQJQS?3S-MeYT0#X^*za#L2Y1%UL3( zoGw5XZ!e>pAJ1#iLX-v#t;t(j=u(tD7D_h5jEsb3*9tp~p5mkKj2VW4cXl!j; zF}2|9*ZFXgwa53xk)4#q+wI(tW(eYgYjGh&_Oif!?>Q2he?yq55gMQA|nZq!E9 z67^_Ypfh$?gcEa#8XUEQOrP?A6fFp8FkSnc|F&7z5$ABrVQtbPBqpP6?+`3=0?zfv0i9wY#IB(ziFib%9U1P1cIuqCt^e z1Em&cN>GY+UhVWnb^4&Xr;k|I&rc)rE*4cgR;r-d_Ki|cDk<>JoUCkB1=bD5PAD2>om@s3uaPWLSOGtDgIeVInV?iOeky%wfA( z6>rfJf<&x&O&;+lz~l1SbgToJwrzh!*xJe+0o-z8ti#J&oMe|PS`>>d(?=dVd(E_c z+Hs+HB@NkgOOxxe2QoSny86N=5Y&~6u`wK9T&%c7 zk|LC5W^nCom=BdMr9X2>_o@d^A&LKwPfGafejhl~@2RBF>DGeD#jH9jL|{;cUA7&WjtjT_u>LYNK(aU6;v z^~hx27m?~1$MXb*&{o@h?7MRDT73n1ct@d*(*!(;?T9R z)>`3XSo@gk*)f6(%tskHe~$(GTj^39G@KBC;|jwiPimyG4slqs_F6Tje2{ zMmALl8-e58Y7=b_lWX09qkyODB}2`vYxU@jr_DpdKhx80HQ3ioHe)^xRu8?7Dp@cr z(3Pad<(CcRG3HJ`=a5G%)eU>zXG8{G-yP(k`($NI1m3rke;RY=XbfKa0iv9hR$BFe z5-ud3lQZS8Ma0x7*=d&$%_d) zp}CuD8&T9_Lb`d$ksiU=JA0~i4sENN+6#eoLk@Xx`%rlAP29`KoR3+Bo9W^Xu!=4) zeY7q*s@6^)dA@lOgNwo-7+n@PR`6O*qoVqZE>5M_r8{#`MjRE4wZS1rlzZZw2^)7t zib7s;@ql7nc>6G~kITB+=7xTT{Zzj^zIHof^d{=Y+<0T8p*>VUDjP5nyEJ&NRLytc z>%1`<*0qBi8h)rTdcL?l87@v6^qnrS{3~ak&*+KdgfT!rg_iFY`~&B>rOLg$2_#fCzT)6&+Zc?yS-f<+1HNRg5$xw zhy-#*M#_*SmZQ`Ed12kr;MT^<@$1L6mE@J)4_nx`SOaZ!NInBy9f3z?QhiA=vZnffEo^fDa>DtM(y>FA? zI(=r)*!C%xmTNr z4mKCf+FWS3F~|R|uF$lg>8#Vyb)JEz2Ek0`=-OnK>gwLxqeV9w@91|K``9{EKgb-T z+N2+s&wWN$Wno1U5G;-;aC z<#?aSbX#2p9#K)l?e0_9x*WAWgIZ0wj!7vPmM~9fAdEO}`!0HoFg_tI=1#k3ET)))j-ei{*DYaeh3n(Q<|n?W<5zW;XHrpZR0R>Ios z-l$K&oUod_wS9>$OY`$&YxVe5t#|Ft3Oqa%8+tx(OKn(z`)m^8-S1>JPP{WM2meVvzY zD6s*I7d6wjuM!z2fQ$vXBVZo7zCzoNV`~*QjS*vt`OYZL54>hrTEOJf?-jGCuX{1n z`Wj=4-}*#(2F>_b_k`3Q;r?&;LG@N2Dx347ZSK_;B>#n7t@;SfoP%bd zdEp}3`8bW`PPxsgUZ=<;qrY*4n0V7k0}0_`QBzZ2QT2r4>GVT z!{{yjf745j+}C8C7cRFpapJod!MxM`>&|feUU&Qx5dXV&O+RJH_T9iu9z{>ulz`Q* z^ak^PuVZV@EZBWX@3izphK6fO3}U-Ox=jMI1Iwjf#<2JPlbbGcxc4Hv#0|!Vf4%jb z>I{dhvwb6CW&;DCo#Du_`r(%0y~w5{ z#Nfi9kjOr7_Wo&qt{4?5F;4SqI_=>(PiuetcUKNKgMX9e?tcG0>MIk262k^z%iW)* z&3iHb`T2J|q3b5D{U~R5Oum7Gp<&`h?t0D-8tXZa_3S^k!@K8;*(JmC^Y^s#15Hnm zf6V_gVsHETzjX{J`WQ0Af5!DXz4J5u9=GG_-Y<7H3kCh!c|>pj6vorFZU?5@Z)4tm zZ({pA#uJ?^8DIMrGXkqDzTL@p)sNg?^e{7(UC!v2L{0;6t#{GY&*R+Ae7*Opsy#ZZeQxl3sqc@rPvkgxxL#1fl)m4QAW3q4)^T-G@yGywom CS@fR( literal 0 HcmV?d00001 diff --git a/src/fonts/vg_font_thin_3.xcf b/src/fonts/vg_font_thin_3.xcf new file mode 100644 index 0000000000000000000000000000000000000000..8275f06e2acab25ac5f54eafd734097047b36148 GIT binary patch literal 232793 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 literal 0 HcmV?d00001 diff --git a/vg_build.h b/vg_build.h index 7dd34b9..b40ecd3 100644 --- a/vg_build.h +++ b/vg_build.h @@ -9,6 +9,7 @@ #include "vg_opt.h" #include "vg_log.h" #include "vg_string.h" +#include "vg_build_font.h" /* we dont free dynamic vg_strs in this program. so, we dont care.. */ const char *__asan_default_options() { return "detect_leaks=0"; } @@ -448,6 +449,9 @@ vg_engine_default_config = { void vg_add_engine( struct vg_project *proj, struct vg_engine_config *config ) { + /* building assets */ + vg_build_default_font(); + if( !config ) config = &vg_engine_default_config; vg_str config_string; vg_strnull( &config_string, NULL, -1 ); diff --git a/vg_build_font.h b/vg_build_font.h new file mode 100644 index 0000000..5f0fd3b --- /dev/null +++ b/vg_build_font.h @@ -0,0 +1,148 @@ +#include "vg_font.h" + +#define STB_IMAGE_IMPLEMENTATION +#include "submodules/stb/stb_image.h" + +void vg_build_font_face_run( vg_font_face *face, + char first, char last, i16 x, i16 y ) +{ + u32 count = (u32)last - (u32)first; + for( u32 i=0; i<=count; i ++ ) + { + u32 index = (u32)first + i; + face->map[index].x = x+(i*face->cw); + face->map[index].y = y; + } +} + +void vg_build_write_font_face( FILE *fp, vg_font_face *face ) +{ + fprintf( fp, "vg_font_face %s = {\n", face->name ); + fprintf( fp, " .name=\"%s\",\n", face->name ); + fprintf( fp, " .cw=%hd,.ch=%hd,\n", face->cw,face->ch ); + fprintf( fp, " .sx=%hd,.sy=%hd,\n", face->sx,face->sy ); + fprintf( fp, " .baseline=%hd,\n", face->baseline ); + fprintf( fp, " .map={\n" ); + + u32 chars = 0; + + for( u32 i=0; i<256; i ++ ) + { + if( face->map[i].x || face->map[i].y ) + { + chars += fprintf( fp, "[%u]={%hd,%hd},", + i, face->map[i].x, face->map[i].y ); + + if( chars > 80 ) + { + fprintf( fp, "\n" ); + chars = 0; + } + } + } + + fprintf( fp, "\n}};\n\n" ); +} + +void vg_build_font_sheet( FILE *fp, char *name, const char *source ) +{ + int x,y,n; + unsigned char *data = stbi_load( source, &x, &y, &n, 4 ); + + if( !data ) + { + vg_error( "Couldn't open source file\n" ); + return; + } + + fprintf( fp, "vg_font_sheet %s = {\n", name ); + fprintf( fp, " .w=%d, .h=%d,\n", x,y ); + fprintf( fp, " .bitmap={\n" ); + + u32 pixel_max = x*y; + u32 pixel = 0, chars = 0; + while( pixel_max ) + { + u32 buff = 0; + for( int b = 31; b >= 0; b-- ) + { + buff |= data[pixel*4]>128?0x1<= pixel_max ) + { + pixel_max = 0; + break; + } + } + + chars += fprintf( fp, "%#x,", buff ); + if( chars > 80 ) + { + fprintf( fp, "\n" ); + chars = 0; + } + } + + fprintf( fp, "\n}};\n" ); + free( data ); +} + +void vg_build_default_font(void) +{ + FILE *fp = fopen( "vg/vg_default_font.gc", "w" ); + vg_build_font_sheet( fp, "vg_default_font_sheet", + "vg/src/fonts/vg_font_thin_3.png" ); + vg_font_face small = + { + .name = "vgf_default_small", + .cw=8, .ch=14, + .sx=8, .sy=14, + .baseline = 4 + }; + vg_build_font_face_run( &small, '!', '/', 8, 0 ); + vg_build_font_face_run( &small, '[', '`', 128,0 ); + vg_build_font_face_run( &small, '{', '~', 176,0 ); + vg_build_font_face_run( &small, ':', '@', 208,0 ); + vg_build_font_face_run( &small, 'A', 'Z', 0, 14 ); + vg_build_font_face_run( &small, 'a', 'z', 0, 28 ); + vg_build_font_face_run( &small, '0', '9', 208,14 ); + vg_build_write_font_face( fp, &small ); + + vg_font_face large = + { + .name = "vgf_default_large", + .cw=12, .ch=21, + .sx=12, .sy=21, + .baseline=6, + }; + vg_build_font_face_run( &large, '!', '/', 12, 56 ); + vg_build_font_face_run( &large, '[', '`', 192,56 ); + vg_build_font_face_run( &large, '{', '~', 264,56 ); + vg_build_font_face_run( &large, ':', '@', 324,56 ); + vg_build_font_face_run( &large, 'A', 'Z', 0, 77 ); + vg_build_font_face_run( &large, 'a', 'z', 0, 98 ); + vg_build_font_face_run( &large, '0', '9', 312,77 ); + vg_build_write_font_face( fp, &large ); + + vg_font_face title = + { + .name = "vgf_default_title", + .cw=24, .ch=42, + .sx=24, .sy=42, + .baseline=12, + }; + vg_build_font_face_run( &title, '!', '/', 24, 140 ); + vg_build_font_face_run( &title, '[', '_', 384,140 ); + vg_build_font_face_run( &title, '`', '`', 0, 182 ); + vg_build_font_face_run( &title, '{', '~', 24, 182 ); + vg_build_font_face_run( &title, ':', '@', 120,182 ); + vg_build_font_face_run( &title, 'A', 'U', 0, 224 ); + vg_build_font_face_run( &title, 'V', 'Z', 0, 308 ); + vg_build_font_face_run( &title, 'a', 'u', 0, 266 ); + vg_build_font_face_run( &title, 'v', 'z', 0, 350 ); + vg_build_font_face_run( &title, '0', '9', 120,308 ); + vg_build_write_font_face( fp, &title ); + + fclose( fp ); +} diff --git a/vg_console.c b/vg_console.c index ccc39f7..561bb63 100644 --- a/vg_console.c +++ b/vg_console.c @@ -593,7 +593,7 @@ void vg_console_draw(void) SDL_AtomicLock( &vg_log.print_sl ); int ptr = vg_log.log_line_current; - int const fh = vg_ui.font->line_height, log_lines = 32; + int const fh = vg_ui.font->sy, log_lines = 32; int console_lines = VG_MIN( log_lines, vg_log.log_line_count ); ui_rect rect_log = { 0, 0, vg.window_x, log_lines*fh }, @@ -638,9 +638,9 @@ void vg_console_draw(void) ui_rect rect_suggest; rect_copy( rect_input, rect_suggest ); - rect_suggest[0] += 6 + vg_ui.font->spacing*vg_console.suggestion_pastepos; + rect_suggest[0] += 6 + vg_ui.font->sx*vg_console.suggestion_pastepos; rect_suggest[1] += rect_input[3]; - rect_suggest[2] = vg_ui.font->spacing * vg_console.suggestion_maxlen; + rect_suggest[2] = vg_ui.font->sx * vg_console.suggestion_maxlen; rect_suggest[3] = vg_console.suggestion_count * fh; ui_fill( rect_suggest, bg_colour ); diff --git a/vg_engine.c b/vg_engine.c index 0e59528..1723c70 100644 --- a/vg_engine.c +++ b/vg_engine.c @@ -887,7 +887,7 @@ void vg_settings_ui_header( ui_rect inout_panel, const char *name ) bool vg_settings_apply_button( ui_rect inout_panel, bool validated ) { ui_rect last_row; - ui_px height = (vg_ui.font->glyph_height + 18) * k_ui_scale; + ui_px height = (vg_ui.font->sy + 18) * k_ui_scale; ui_split( inout_panel, k_ui_axis_h, -height, k_ui_padding, inout_panel, last_row ); @@ -1130,7 +1130,8 @@ static void vg_settings_gui(void) ui_rect quit_button; ui_split( title, k_ui_axis_v, title[2]-title[3], 2, title, quit_button ); - if( ui_button_text( quit_button, "X", 1 ) == 1 ){ + if( ui_button_text( quit_button, "X", 1 ) == k_ui_button_click ) + { vg_settings_close(); return; } diff --git a/vg_font.h b/vg_font.h new file mode 100644 index 0000000..5fcb29b --- /dev/null +++ b/vg_font.h @@ -0,0 +1,22 @@ +typedef struct vg_font_char vg_font_char; +typedef struct vg_font_face vg_font_face; +typedef struct vg_font_sheet vg_font_sheet; + +struct vg_font_char +{ + i16 x, y; +}; + +struct vg_font_face +{ + const char *name; + i16 cw, ch, sx, sy, baseline; + vg_font_char map[256]; +}; + +struct vg_font_sheet +{ + i16 w, h; + u32 bitmap[]; +}; + diff --git a/vg_imgui.c b/vg_imgui.c index 08209b7..a4af9ae 100644 --- a/vg_imgui.c +++ b/vg_imgui.c @@ -24,26 +24,7 @@ ui_px k_ui_widget_height = 28, k_ui_scale = 1, k_ui_padding = 8; -ui_font vg_ui_font_small = { - .glyph_width = 8, - .glyph_height = 14, - .glyph_baseline = 4, - .line_height = 14, - .sheet_size = 256, - .spacing = 8, - .ascii_start = ' ', - .offset_y = 0 -}, -vg_ui_font_big = { - .glyph_width = 12, - .glyph_height = 21, - .glyph_baseline = 6, - .line_height = 21, - .sheet_size = 256, - .spacing = 10, - .ascii_start = ' ', - .offset_y = 84 -}; +#include "vg/vg_default_font.gc" struct vg_imgui vg_ui = { .scheme = { @@ -82,7 +63,7 @@ struct vg_imgui vg_ui = { [ k_ui_purple + k_ui_brighter ] = UI_RGB( 0xd3869b ), [ k_ui_gray + k_ui_brighter ] = UI_RGB( 0xa89984 ), }, - .font = &vg_ui_font_small, + .font = &vgf_default_small, .colour = {1.0f,1.0f,1.0f,1.0f}, .bg_inverse_ratio = {1,1} }; @@ -97,6 +78,7 @@ static struct vg_shader _shader_ui ={ "layout (location=2) in vec4 a_colour;" "uniform mat3 uPv;" "uniform vec2 uBGInverseRatio;" + "uniform vec2 uInverseFontSheet;" "" "out vec4 aTexCoords;" "out vec4 aColour;" @@ -104,7 +86,7 @@ static struct vg_shader _shader_ui ={ "void main(){" "vec4 proj_pos = vec4( uPv * vec3( a_co, 1.0 ), 1.0 );" "gl_Position = proj_pos;" - "aTexCoords = vec4( a_uv * 0.00390625, " + "aTexCoords = vec4( a_uv * uInverseFontSheet, " " (proj_pos.xy*0.5+0.5) * uBGInverseRatio );" "aColour = a_colour;" "}", @@ -312,28 +294,36 @@ void vg_ui_init(void) */ /* Load default font */ - u32 compressed[] = { - #include "vg/vg_pxfont_thin.h" - }; - u32 pixels = 0, total = 256*256, data = 0; - u8 image[256*256]; + vg_font_sheet *sheet = &vg_default_font_sheet; + u32 pixels = 0, + total = sheet->w*sheet->h, + data = 0; + + vg_linear_clear( vg_mem.scratch ); + u8 *image = vg_linear_alloc( vg_mem.scratch, total ); - while( pixels < total ){ - for( int b = 31; b >= 0; b-- ){ - image[ pixels ++ ] = (compressed[data] & (0x1u << b))? 0xffu: 0x00u; + while( pixels < total ) + { + for( int b = 31; b >= 0; b-- ) + { + image[ pixels ++ ] = (sheet->bitmap[data] & (0x1u << b))? 0xffu: 0x00u; - if( pixels >= total ){ + if( pixels >= total ) + { total = 0; break; } } data++; } + + vg_ui.inverse_font_sheet[0] = 1.0/(f64)sheet->w; + vg_ui.inverse_font_sheet[1] = 1.0/(f64)sheet->h; glGenTextures( 1, &vg_ui.tex_glyphs ); glBindTexture( GL_TEXTURE_2D, vg_ui.tex_glyphs ); - glTexImage2D( GL_TEXTURE_2D, 0, GL_R8, 256, 256, 0, + glTexImage2D( GL_TEXTURE_2D, 0, GL_R8, sheet->w, sheet->h, 0, GL_RED, GL_UNSIGNED_BYTE, image ); VG_CHECK_GL_ERR(); @@ -411,6 +401,8 @@ void ui_flush( enum ui_shader shader, f32 w, f32 h ){ vg_ui.frosting ); glUniform2fv( glGetUniformLocation( _shader_ui.id, "uBGInverseRatio" ), 1, vg_ui.bg_inverse_ratio ); + glUniform2fv( glGetUniformLocation( _shader_ui.id, "uInverseFontSheet" ), + 1, vg_ui.inverse_font_sheet ); } else if( shader == k_ui_shader_image ){ glUseProgram( _shader_ui_image.id ); @@ -604,7 +596,7 @@ ui_px ui_text_line_width( const char *str ) else if( c == '\n' ) break; } - return length * vg_ui.font->spacing; + return length * vg_ui.font->sx; } ui_px ui_text_string_height( const char *str ) @@ -613,11 +605,12 @@ ui_px ui_text_string_height( const char *str ) const char *_c = str; u8 c; - while( (c = *(_c ++)) ){ + while( (c = *(_c ++)) ) + { if( c == '\n' ) height ++; } - return height * 14; + return height * vg_ui.font->sy; } ui_px ui_text_aligned_x( const char *str, ui_rect rect, ui_px scale, @@ -782,18 +775,15 @@ u32 v4f_u32_colour( v4f colour ) return r | (g<<8) | (b<<16) | (a<<24); } -static void ui_text_glyph( const struct ui_font *font, ui_px scale, - u8 glyph, ui_rect out_texcoords ){ - glyph -= font->ascii_start; +static void ui_text_glyph( const struct vg_font_face *ff, + u8 glyph, ui_rect out_texcoords ) +{ + const vg_font_char *ch = &ff->map[ glyph ]; - ui_px per_row = font->sheet_size / font->glyph_width, - column = (ui_px)glyph % per_row, - row = (glyph - column) / per_row; - - out_texcoords[0] = column * font->glyph_width; - out_texcoords[1] = row * font->glyph_height + font->offset_y; - out_texcoords[2] = out_texcoords[0] + font->glyph_width; - out_texcoords[3] = out_texcoords[1] + font->glyph_height; + out_texcoords[0] = ch->x; + out_texcoords[1] = ch->y; + out_texcoords[2] = ch->x + ff->cw; + out_texcoords[3] = ch->y + ff->ch; } u32 ui_opacity( u32 colour, f32 opacity ) @@ -815,12 +805,13 @@ u32 ui_ntext( ui_rect rect, const char *str, u32 len, ui_px scale, text_cursor[0] = ui_text_aligned_x( str, rect, scale, align ); text_cursor[1] = rect[1]; - text_cursor[2] = vg_ui.font->glyph_width*scale; - text_cursor[3] = vg_ui.font->glyph_height*scale; + text_cursor[2] = vg_ui.font->cw*scale; + text_cursor[3] = vg_ui.font->ch*scale; u32 printed_chars = 0; - if( align & (k_ui_align_middle|k_ui_align_bottom) ){ + if( align & (k_ui_align_middle|k_ui_align_bottom) ) + { ui_px height = ui_text_string_height( str ) * scale; if( align & k_ui_align_bottom ) @@ -829,41 +820,50 @@ u32 ui_ntext( ui_rect rect, const char *str, u32 len, ui_px scale, text_cursor[1] += (rect[3]-height)/2; } - while( (c = *(_c ++)) ){ - if( printed_chars >= len ){ + while( (c = *(_c ++)) ) + { + if( printed_chars >= len ) + { printed_chars = 0; - text_cursor[1] += vg_ui.font->line_height*scale; + text_cursor[1] += vg_ui.font->sy*scale; text_cursor[0] = ui_text_aligned_x( _c, rect, scale, align ); - text_cursor[0] -= vg_ui.font->spacing*scale; + text_cursor[0] -= vg_ui.font->sx*scale; ui_rect glyph; - ui_text_glyph( vg_ui.font, scale, '\xb6' /*FIXME*/, glyph ); + ui_text_glyph( vg_ui.font, '\xb6' /*FIXME*/, glyph ); ui_fill_rect( text_cursor, 0x00ffffff, glyph ); - text_cursor[0] += vg_ui.font->spacing*scale; + text_cursor[0] += vg_ui.font->sx*scale; } - if( c == '\n' ){ - text_cursor[1] += vg_ui.font->line_height*scale; + if( c == '\n' ) + { + text_cursor[1] += vg_ui.font->sy*scale; text_cursor[0] = ui_text_aligned_x( _c, rect, scale, align ); printed_chars = 0; continue; } - else if( c >= 33 ){ + else if( c >= 33 ) + { ui_rect glyph; - ui_text_glyph( vg_ui.font, scale, c, glyph ); + ui_text_glyph( vg_ui.font, c, glyph ); ui_rect cursor_clipped; - if( ui_clip( rect, text_cursor, cursor_clipped ) ){ + if( ui_clip( rect, text_cursor, cursor_clipped ) ) + { ui_fill_rect( cursor_clipped, colour, glyph ); } } - else if( c == '\x1B' ){ + else if( c == '\x1B' ) + { /* vt codes */ _c ++; u16 colour_id = 0; - for( int i=0; i<3; i ++ ){ - if( _c[i] ){ - if( _c[i] == 'm' ){ + for( int i=0; i<3; i ++ ) + { + if( _c[i] ) + { + if( _c[i] == 'm' ) + { _c = _c + i + 1; switch( colour_id ){ @@ -884,7 +884,8 @@ u32 ui_ntext( ui_rect rect, const char *str, u32 len, ui_px scale, colour_id |= _c[i] << (i*8); } - else{ + else + { _c = _c +i; break; } @@ -892,13 +893,14 @@ u32 ui_ntext( ui_rect rect, const char *str, u32 len, ui_px scale, continue; } - else if( c == '\t' ){ - text_cursor[0] += vg_ui.font->spacing*scale*4; + else if( c == '\t' ) + { + text_cursor[0] += vg_ui.font->sx*scale*4; printed_chars += 4; continue; } - text_cursor[0] += vg_ui.font->spacing*scale; + text_cursor[0] += vg_ui.font->sx*scale; printed_chars ++; } @@ -911,6 +913,11 @@ void ui_text( ui_rect rect, const char *str, ui_px scale, ui_ntext( rect, str, 1024, scale, align, colour ); } +void ui_font_face( vg_font_face *ff ) +{ + vg_ui.font = ff; +} + /* * Standard layout stuff * ----------------------------------------------------------------------------- @@ -928,14 +935,14 @@ void ui_label( ui_rect rect, const char *text, ui_px size, ui_px gap, ui_rect r ) { ui_rect l; - ui_px width = (ui_text_line_width(text)+vg_ui.font->spacing) * size; + ui_px width = (ui_text_line_width(text)+vg_ui.font->sx) * size; ui_split( rect, k_ui_axis_v, width, gap, l, r ); ui_text( l, text, 1, k_ui_align_middle_left, 0 ); } void ui_standard_widget( ui_rect inout_panel, ui_rect out_rect, ui_px count ) { - ui_px height = (count * vg_ui.font->glyph_height + 18) * k_ui_scale; + ui_px height = (count * vg_ui.font->sy + 18) * k_ui_scale; ui_split( inout_panel, k_ui_axis_h, height, k_ui_padding, out_rect, inout_panel ); } @@ -1122,8 +1129,8 @@ void ui_postrender(void) ui_rect row0, row1, btn; ui_split_ratio( message, k_ui_axis_h, 0.5f, 0, row0, row1 ); - row0[0] += vg_ui.font->spacing; - ui_ntext( row0, vg_ui.modal.message, (box[2]/vg_ui.font->spacing)-2, 1, + row0[0] += vg_ui.font->sx; + ui_ntext( row0, vg_ui.modal.message, (box[2]/vg_ui.font->sx)-2, 1, k_ui_align_left, colour ); rect_copy( row1, btn ); @@ -1877,7 +1884,7 @@ int ui_textbox( ui_rect inout_panel, const char *label, rect_copy( rect, text_rect ); if( flags & UI_TEXTBOX_MULTILINE ) text_rect[3] = rect[3]-16; - else text_rect[3] = vg_ui.font->line_height; + else text_rect[3] = vg_ui.font->sy; text_rect[2] -= 16; ui_rect_center( rect, text_rect ); @@ -1885,41 +1892,47 @@ int ui_textbox( ui_rect inout_panel, const char *label, ui_px wrap_length = 1024; if( flags & UI_TEXTBOX_WRAP ) - wrap_length = text_rect[2] / vg_ui.font->spacing; + wrap_length = text_rect[2] / vg_ui.font->sx; - if( hover ){ + if( hover ) + { vg_ui.cursor = k_ui_cursor_ibeam; } - if( vg_ui.focused_control_id == buf ){ + if( vg_ui.focused_control_id == buf ) + { ui_fill( rect, col_base ); ui_ntext( text_rect, buf, wrap_length, 1, k_ui_align_left, 0 ); - if( !(flags & UI_TEXTBOX_AUTOFOCUS) && ((clickup||clickdown) && !target)){ + if( !(flags & UI_TEXTBOX_AUTOFOCUS) && ((clickup||clickdown) && !target)) + { ui_defocus_all(); } - else{ + else + { vg_ui.focused_control_hit = 1; if( click && target ){ int p0[3] ={ - (vg_ui.mouse_click[0] - text_rect[0]) / vg_ui.font->spacing, - (vg_ui.mouse_click[1] - text_rect[1]) / vg_ui.font->line_height, + (vg_ui.mouse_click[0] - text_rect[0]) / vg_ui.font->sx, + (vg_ui.mouse_click[1] - text_rect[1]) / vg_ui.font->sy, -1 }, p1[3] = { - (vg_ui.mouse[0] - text_rect[0]) / vg_ui.font->spacing, - (vg_ui.mouse[1] - text_rect[1]) / vg_ui.font->line_height, + (vg_ui.mouse[0] - text_rect[0]) / vg_ui.font->sx, + (vg_ui.mouse[1] - text_rect[1]) / vg_ui.font->sy, -1 }; - if( flags & UI_TEXTBOX_MULTILINE ){ + if( flags & UI_TEXTBOX_MULTILINE ) + { _ui_textbox_calc_index_from_grid( p0, wrap_length ); _ui_textbox_calc_index_from_grid( p1, wrap_length ); vg_ui.textbox.cursor_pos = p0[2]; vg_ui.textbox.cursor_user = p1[2]; } - else{ + else + { int max = strlen( buf ); vg_ui.textbox.cursor_pos = VG_MAX( 0, VG_MIN( max, p0[0] )), vg_ui.textbox.cursor_user = VG_MAX( 0, VG_MIN( max, p1[0] )); @@ -1936,28 +1949,32 @@ int ui_textbox( ui_rect inout_panel, const char *label, end = VG_MAX( c0, c1 ), chars = end-start; - if( flags & (UI_TEXTBOX_WRAP|UI_TEXTBOX_MULTILINE) ){ + if( flags & (UI_TEXTBOX_WRAP|UI_TEXTBOX_MULTILINE) ) + { int pos[3], remaining = chars; pos[2] = start; _ui_textbox_index_calc_coords( pos, wrap_length ); - if( start==end ){ - cursor[0] = text_rect[0] + pos[0]*vg_ui.font->spacing-1; + if( start==end ) + { + cursor[0] = text_rect[0] + pos[0]*vg_ui.font->sx-1; cursor[1] = text_rect[1] + pos[1]*14; cursor[2] = 2; cursor[3] = 13; ui_fill( cursor, col_cursor ); rect_copy( cursor, vg_ui.click_fader_end ); } - else{ - while( remaining ){ + else + { + while( remaining ) + { int run = _ui_textbox_run_remaining( pos, wrap_length ); run = VG_MIN( run, remaining ); - cursor[0] = text_rect[0] + pos[0]*vg_ui.font->spacing-1; + cursor[0] = text_rect[0] + pos[0]*vg_ui.font->sx-1; cursor[1] = text_rect[1] + pos[1]*14; - cursor[2] = (float)(run)*(float)vg_ui.font->spacing; + cursor[2] = (float)(run)*(float)vg_ui.font->sx; cursor[3] = 13; ui_fill( cursor, col_cursor ); @@ -1970,20 +1987,24 @@ int ui_textbox( ui_rect inout_panel, const char *label, rect_copy( cursor, vg_ui.click_fader_end ); } } - else{ - cursor[0] = text_rect[0] + start*vg_ui.font->spacing-1; + else + { + cursor[0] = text_rect[0] + start*vg_ui.font->sx-1; cursor[1] = text_rect[1]; cursor[3] = 13; - if( start==end ){ + if( start==end ) + { cursor[2] = 2; } - else{ - cursor[2] = (float)(chars)*(float)vg_ui.font->spacing; + else + { + cursor[2] = (float)(chars)*(float)vg_ui.font->sx; } if( (vg_ui.click_fade_opacity<=0.0f) && - ui_clip( rect, cursor, cursor ) ){ + ui_clip( rect, cursor, cursor ) ) + { ui_fill( cursor, col_cursor ); } @@ -1994,8 +2015,10 @@ int ui_textbox( ui_rect inout_panel, const char *label, return 0; } - if( click || (flags & UI_TEXTBOX_AUTOFOCUS) ){ - if( (target && hover) || (flags & UI_TEXTBOX_AUTOFOCUS) ){ + if( click || (flags & UI_TEXTBOX_AUTOFOCUS) ) + { + if( (target && hover) || (flags & UI_TEXTBOX_AUTOFOCUS) ) + { ui_defocus_all(); ui_fill( rect, col_highlight ); @@ -2012,10 +2035,12 @@ int ui_textbox( ui_rect inout_panel, const char *label, vg_ui.textbox.cursor_pos = 0; vg_ui.textbox.cursor_user = 0; - if( callbacks ){ + if( callbacks ) + { vg_ui.textbox.callbacks = *callbacks; } - else{ + else + { vg_ui.textbox.callbacks.change = NULL; vg_ui.textbox.callbacks.down = NULL; vg_ui.textbox.callbacks.up = NULL; @@ -2028,7 +2053,8 @@ int ui_textbox( ui_rect inout_panel, const char *label, ui_fill( rect, col_base ); - if( hover ){ + if( hover ) + { ui_outline( rect, -1, col_highlight, 0 ); } @@ -2062,7 +2088,8 @@ void ui_tabs( ui_rect inout_panel, ui_rect out_content_panel, ui_rect_pad( out_content_panel, (ui_px[2]){ k_ui_padding, k_ui_padding } ); /* place buttons */ - for( i32 i=0; i