From 3500f657d80f51eb26d53d1d25df8b0e0d050154 Mon Sep 17 00:00:00 2001 From: matthew Date: Sun, 15 Jun 2025 12:01:05 +1000 Subject: [PATCH] first commit --- .ignore | 3 + assets/models/cube.m3d | Bin 0 -> 223 bytes assets/models/test_char.m3d | Bin 0 -> 2403 bytes assets/models/yoda.m3d | Bin 0 -> 15862 bytes assets/shaders/pbr.frag.spv | Bin 0 -> 452 bytes assets/shaders/pbr.vert.spv | Bin 0 -> 1052 bytes assets/textures/cheesoid.png | Bin 0 -> 43329 bytes assets/textures/ham_smoke.png | Bin 0 -> 745367 bytes assets/textures/hamster.png | Bin 0 -> 983879 bytes assets/textures/hog.jpg | Bin 0 -> 121743 bytes assets/textures/patamon.png | Bin 0 -> 43113 bytes assets/textures/pattermon.png | Bin 0 -> 347627 bytes assets/textures/purplemon.png | Bin 0 -> 208887 bytes build-shaders.sh | 32 + build.sh | 87 + external/glad/include/EGL/eglplatform.h | 175 + external/glad/include/KHR/khrplatform.h | 311 + external/glad/include/glad/egl.h | 550 ++ external/glad/include/glad/gl.h | 3644 ++++++++ external/glad/src/egl.c | 397 + external/glad/src/gl.c | 1786 ++++ external/m3d/m3d.h | 6574 +++++++++++++ external/rgfw/RGFW.h | 10838 ++++++++++++++++++++++ external/stb/stb_image.h | 7988 ++++++++++++++++ external/stb/stb_sprintf.h | 1906 ++++ external/xxhash/LICENSE | 26 + external/xxhash/README.md | 274 + external/xxhash/SECURITY.md | 13 + external/xxhash/xxh3.h | 55 + external/xxhash/xxh_x86dispatch.c | 821 ++ external/xxhash/xxh_x86dispatch.h | 93 + external/xxhash/xxhash.c | 42 + external/xxhash/xxhash.h | 7343 +++++++++++++++ src/alloc.cpp | 84 + src/alloc.h | 30 + src/assets.cpp | 482 + src/assets.h | 164 + src/base_types.h | 92 + src/codegen.cpp | 172 + src/codegen.h | 6 + src/codegen_assets.h | 72 + src/entry_linux.cpp | 14 + src/entry_linux.h | 7 + src/os.cpp | 7 + src/os.h | 7 + src/os_linux.cpp | 466 + src/os_linux.h | 176 + src/packer.cpp | 299 + src/packer.h | 41 + src/renderer.cpp | 268 + src/renderer.h | 63 + src/shaders/pbr.frag.glsl | 10 + src/shaders/pbr.vert.glsl | 12 + src/shaders/structures.glsl | 50 + src/util.cpp | 284 + src/util.h | 140 + 56 files changed, 45904 insertions(+) create mode 100644 .ignore create mode 100644 assets/models/cube.m3d create mode 100644 assets/models/test_char.m3d create mode 100644 assets/models/yoda.m3d create mode 100644 assets/shaders/pbr.frag.spv create mode 100644 assets/shaders/pbr.vert.spv create mode 100644 assets/textures/cheesoid.png create mode 100644 assets/textures/ham_smoke.png create mode 100644 assets/textures/hamster.png create mode 100644 assets/textures/hog.jpg create mode 100644 assets/textures/patamon.png create mode 100644 assets/textures/pattermon.png create mode 100644 assets/textures/purplemon.png create mode 100755 build-shaders.sh create mode 100755 build.sh create mode 100644 external/glad/include/EGL/eglplatform.h create mode 100644 external/glad/include/KHR/khrplatform.h create mode 100644 external/glad/include/glad/egl.h create mode 100644 external/glad/include/glad/gl.h create mode 100644 external/glad/src/egl.c create mode 100644 external/glad/src/gl.c create mode 100644 external/m3d/m3d.h create mode 100644 external/rgfw/RGFW.h create mode 100644 external/stb/stb_image.h create mode 100644 external/stb/stb_sprintf.h create mode 100644 external/xxhash/LICENSE create mode 100644 external/xxhash/README.md create mode 100644 external/xxhash/SECURITY.md create mode 100644 external/xxhash/xxh3.h create mode 100644 external/xxhash/xxh_x86dispatch.c create mode 100644 external/xxhash/xxh_x86dispatch.h create mode 100644 external/xxhash/xxhash.c create mode 100644 external/xxhash/xxhash.h create mode 100644 src/alloc.cpp create mode 100644 src/alloc.h create mode 100644 src/assets.cpp create mode 100644 src/assets.h create mode 100644 src/base_types.h create mode 100644 src/codegen.cpp create mode 100644 src/codegen.h create mode 100644 src/codegen_assets.h create mode 100644 src/entry_linux.cpp create mode 100644 src/entry_linux.h create mode 100644 src/os.cpp create mode 100644 src/os.h create mode 100644 src/os_linux.cpp create mode 100644 src/os_linux.h create mode 100644 src/packer.cpp create mode 100644 src/packer.h create mode 100644 src/renderer.cpp create mode 100644 src/renderer.h create mode 100644 src/shaders/pbr.frag.glsl create mode 100644 src/shaders/pbr.vert.glsl create mode 100644 src/shaders/structures.glsl create mode 100644 src/util.cpp create mode 100644 src/util.h diff --git a/.ignore b/.ignore new file mode 100644 index 0000000..20d49d3 --- /dev/null +++ b/.ignore @@ -0,0 +1,3 @@ +external +assets +build diff --git a/assets/models/cube.m3d b/assets/models/cube.m3d new file mode 100644 index 0000000000000000000000000000000000000000..a10dee65ba453115ee57cea1b7c95b67ab3becff GIT binary patch literal 223 zcmV<503iP}L`_fM0001ZUh{BubkSe{fd+eq^E?dB`8oMT3eKfTsSIvKsi_Q(#l@Mq z1q=+%zK#JPbu0`z|9!cP{!1`a{;%e;_+On{@n4+b_T literal 0 HcmV?d00001 diff --git a/assets/models/test_char.m3d b/assets/models/test_char.m3d new file mode 100644 index 0000000000000000000000000000000000000000..ecb623b34e0b56dbe3912411d11de9d795f2bc79 GIT binary patch literal 2403 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 literal 0 HcmV?d00001 diff --git a/assets/textures/cheesoid.png b/assets/textures/cheesoid.png new file mode 100644 index 0000000000000000000000000000000000000000..931d6b48a57520d1246506944304f4be10afc675 GIT binary patch literal 43329 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 {`?dLTZi(|rI>0JsN;Cj$zd&SFNsYDOIT1N#qF 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

qSbEP@qs&Z90>&2~Jog*(_Bo_s%oK74K%C8U} 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�u)h+;Vrk<;m4X#5!`_rCmA>Plu{@Cs(x?8H43A zFI~($WSVLw@CuV7pa!I^FNU(9_2oFf9&O3u{@7p|JJcm{D;cA+)00#Sl454QTrR(S z|K;s=Yp`R>5$p$+j8bl;H>baM82PWBqITQQ&&$n3E;{fum-}`dgw-nkI%B*zQvFXU zxlWATWq~F2;v7ASW)8gYWgGiVN9zNMxJJ-k6GPOD=D083??U8Y-B-9QXdRB$|nNOmp ze#H-}s;2u|=9Y1MOGqrLOmr!cGm$QJv#9K0anJUNZj1{144E;JlflL6O#}l6O(U%M z#gb=1P6#9VLA~Y7q$acrT7xmc)l%`4En~V?oT>X-J2Shf zFpKco_kAt$h(vML!C_=7R<)X$m<|t zcytxWu6@H`Amj*Q2dX*c+uK_W`_>$6=sETK<<|AQ1-f?`$Y=Aef3dr2V@$LgV?-Fv z&D&v@hsjIvq)2V_P|aM~uCal+U7nd6XW#x9sr-CCS&l?ZjGij4Nrx>>hjW8ZJZ2HU zv?(61h9EQNJoMa|!+0$ly%Q(5yh(3KZgt;c=h83Kbm-T2>QxNuP2Y7kuP@evzno*g z^2^2jOO&iuTmD14$jQ*8-T>&OwyFBup+3E}5%lK6$O{Jav#RYn`mfv7H;ul$zHaIG zzyHVoSyt2+em-86sBxTeH>mULC81)DOd?8SOkv*F8bcyZJf;)H)Cy*19%wY6I=5}@ z`{jBKkby8e=j7afrI;e4?yXWM5oU9THuA$}rlfnF%1 z!y&i~{?xrXB6y~!qQw^#+rP!_)xTBRn@V{eV&ya`an5PyrPf2?w?b&>_0=rz@I<^0 zIXX0X3{=9$M zT5jfQ?k?M4~o`P@{&h95tEJnr|${r-5|*IK5C)*7&=uwN*f zZa5c$Na>Des^U>F@pwFtVTsP?=yF0atZ#8Ng`U^zb=x+{8WB#^kXtaf>rPK-6WXp^ zuabjtn(hIyMLCRLZ4hQ&qO* z9t;Jj4{1ytLFs(gS)i<(kpW!TlpUs`1a#}?PSp~x0O7P%^@XApfnQp+=fV5JPBgZd z^@3lw?UFe#lm(GT!@}U{FQNHtcy1swGsDyg30rdqWsXWPCC}P&2nn={;!+%QPSk`2 zWSiSqk9HOmVK(*5TKrn(dkvVWNlxCtjxH1SeSbWj$o(yCU7IE%bGzW{-@kufxb{mhn~hD&f4^yijVcJHM1zoe^RV1aaaDb53u4VWL&S^$NqWq~iDQ z-*2~DjH7fLW6A+94Q6pOCz|J>R*ep&o9qbjC9HlF@>3JhvEb%P)%!`tCp*cqsS`6p zn|n)sfNRu!u&xXGtB9ein=hK>WjR?oE!fzy zFV)PMJ!0I1PMcmg?jAWFlc662U5zluC5+D1MP_L+v>Q zhltSC@_N0Zpr_YQgfC#e?>p?y&(BYQI(2Z}8!kF@_tlzaQ$|dvl^X+6U28!ssID<2 zEU>U3(M};QYi_1Cw|Tu@RW%3m9GN-HE#U#*4@v~ra(WsF%MSdEOwAXKg&)etD^j;} z9}v7>>V(p`lx)jF=ZI2WyiCcmK`RDV`9zdw8do5i+jL@6^tc%;(I-62g=5AEccD>% z_|C2Pci(q+1!Y?1%kIy+2yfda*;z&g15*e02wEJ;F)ZhDxqxgyS`Cin4lc$yns$E- zuU>_d7Yu{1basHs4b*@;WM<#L{{jLoU0%~S4?k|wr%g*;7&YFnojxTSXf8dujbRp39p);&EGp>Iu&pI@C$tXXklX)|X zzh0;P>8QjlLMpM-x2t%+U$9@<+pGWjvhu!wN?e{VJAyxy#e;|Jb1yin!;pj31!!Fz z+BaPq9%DWqk2$A|p=L%#PLH)OUAK85H<3x?P9#IjZJQgiVIaBC&Zep>zEVSx>3Es! zd>&>HL`g^7nVIK2wHNN&8WhaT;SU|4Ix{nIR=kp*i=Ca0t>bpCR{Uwt7g)Td- zQ+hCz`lBCQiNAW5{((9;>Rf#;CGm!<- zlqOfZ$jd43+2WPXtd$Q!c}XHVH7epXSTi#sca@yn)Red?x+1O(B2+pu=NvtX;p)V= zrs`P1m^xDldGmUyTbDG)PT}Y6lRGCG0PZ}S#>EwMyT2*w3z0YN`Kk5+K`^7MVb6sy15EvBx7m_ z`C+aJMdy^~<#G{XQ(J2<+o*-Pt2^lt(h4E7cJ(MZ?@$3w39XMUa^05YQ09H#$8?#Q z+hnfE6l<;ZTpLf-%VA*Qh;eExIO-S9O5zE}kFs|rGY`yJ@k5ambEVEWQEYz9h>o(; zdJsQ{@MarpD_Qa~#wZ3XD2~E^GZx`YA*H5@+QZNn#JFk!wZ+8!Ax5mQuetbO0MS#kz4l+NRJC?Z+J{Btk{ zJXM(4IC3ka@aw4U_>%6ApMU@TcT8g{86_gCl{43@COHo+#H%9${ltsFthEiPI_|oA zVdQmpYgu%S_JdZzxy4X$@J5?2Z>HDxZ=AJv*2W`IODzQh7YTK8a(7k4J)+%2HSQ4+ z4D{+yNPUZl%#Kn~iCIOIowJO{N_2p*&0KP@2r;3!iUZI&9-dpqh}n@G(iGF7{z`Un zVwS~dha$)lI@8LE@#->G_tjPuSYPb~_@a8c*euE5U!1gL+iW|123bH>Nyg_2fkvf2 zy-U5Hm-Q1mlhUa#=H*+Rx%!s=L^htS$xiu2auFZ#w2{Y=oPPQ!pZg%h{e)!O)2#6TkTFXStUEP+cF_WS+kIbEHp@+n9zipe5lli`$lVvcOxe%GtCIdXjIsd93 zt-DVd``Xu9bBujoh@pqEzc0iN-F>oHDxQfF@~qkHCSBRnILVa1)e?k6z~Mfon3?AO z7#RL57M&4`mt&?T=}Ne`A9~{DIJ>)3$5{u&&BA^mg3-E;mF_v(_a`1hAqx(e zsuMkh)FyLhqB(|j%dg$;C42^6GG-uxPQ+74)zz0<)O=86uQKz|r*jO-Huz~J$8iBO zb|Pm|w`ex0M8f8d>L_xC@k>PJ#29FSmUdhK4Y@NB8)e2M2??9J$TVH*?qq64EUHGr z%!0mE*W2yaUw;+hZJQk%D?S27qN>8Wy-yiD#?9S1@EbH_adw|`Fqtds5*B*@_C{>i zef#|J@q9j=Cl7Mljg({(89CSxjZu9Jg#Tm=Q57XMrpMY@dEa*@uCN!hWKsL$@j!WO ziJOsKV-VfLu;%;yZl;&Z<(FT+yE`UvM@-yk-y@OHoXr6wI}8GVjHzZ$Z5Ksk$Pf;_ z2-{SuLmrb8n~^)aV@snoCNtAo?x#t?#~>5-&(Av%Z`%e^DRxmc@-?aMdS zHMt4%K=(%{M^?BW=!g+muexi?T zVd|cB@$vD& zB0PsNgTUsTE^Oq&Y($>aBZ9*<;J5{w=ga}4)G>F^mQ5D{)Y#-Rby3Snj! z+1wolrMnY_EgKT=42hN4yk2j8i)xM{N;A4@1Mq>9t+PwsIX9&-rx-hzndi8^Q%&9L zClU+DU=%e_=FriZ22(08@r9$$RF_VjP`kuHn*(ztqUxOOX^*B)Yn9hgYv49=)7%oa zOU0K@Q420P)7M--_cuK~nX&`BY1I95YPJLs9gTHf43T;sKZlIF5KNJJhyyGhHImjQ z)NR`&qA`c7&BzoacO$n!>`3cjikXU_U`1Gb=)Ne;-2Q~rUMn4LNbrLoz|0xPTx%f% zr;)W(YF9mDv{O0q#BE>F`2Q&>2v)oICX*NBnH~dzxQevUIkoE0^ZzSK!2n z0quOviR{a(S5bN0t}a+V7oSsOZ%Pxlwo6;{CTaLQy(9^-6olFLE#CQpoOg;(9z11o zhz#`uRIBHW-S&)1#6<|1k?20q_rl3FF2Wvvbrvy4k+6B@{Nf^&eUIEDVj|&Qd+YA7 z&+raDDdQL+bDeYFpBa>~wVq6L|NIo@xA(Vgn~(b^kv|`gDdPk6G)EsVD?eV(@h{Iv zWic%7=wVTXUPsauz$5^xlubrH+XU^)nQsWe$cK0iL! zTHD;TwS^kllrgT)R8|_cC=bQV2oVb~M7j{sM#_#F0?(hV8m&THuYC<+V%zs!m|dKO zsOb@yeQEPOE57to35L7FB!WFuVQYK<>p>IKvL>yShr%Dg+SCkbOZc^D2HZh8cb=Pf zjqJ>>1!|F!QRAYqVu~IzqD<$o>^xr%M)CE^X;O9lIp^c?csw3Ogv^X8y_ucJuw!87 zviNa#FngIeWnmOlM8uKyonsm_`;Q{cw3t*xE?H(?DzA>IKMUoc)Z&8rw-iL*)-b42*0xtezFg!&@Bin@-!X7yoF zPQLRw_9DjG(whhAT#nS4>;O@-Q zvlU5b@&sdS+r~Vsc7!4sMY4;KWXIRC!H>fObkcQxe&*aDmK*DZ;?LxO4;r? z0`cs3))&)z=CnESyf6#cJsSfCWI_mIaGY3rTFzSi2eOnHts>2l2wrc77Irrm_Qg(a zb#EdfTB`Q>8DYN5_V)h%_V)IEy;3&l!Q!<|QTy@Z2kgix@`Rdk+Mmy5OLc!f?$5__ z+hiMKuux7LLUV6qD6ZxTcRr=;IahrpM;0Z39$1F^ahkx!R<@JmjD-ckr%(Ul9)Ro% z9_#eR%*5ehb;d~|IZo5Es`PMe&y0YtL`D}eorklR&LAp^4N=oYn^~Choh4)6h^T3Z zIj8Q=keh9YJSQ2QU&J&w9r?nu-Qa+%csw4QvCA%9>*v*Gi4{c=(c0Hh z(jm;5Ozh)U)km2CuZT=w?d~{xOn{&HfuQ2IM&l8D&hq@tL5YB2|q=;cH zMIaJ3<(xBvs|U!3%c^Rn7!+X?Qs7_Q*E&aT6)oQ6HlDPs8OkO*_->7Q!v6CZW=QpR zPXYt7)uk3^=5d{cCyr2iSmEiSF-}Ay@dz*bxU)e0T-HN9ctQBJjC!Jd-%$*gE|aV3 z$|(lLTt$=hM3qsBO3<0TnLBftDRZ>h%Gpc@%v9Tc9EV5mPeDmTIPS#EGNSwxq_auR zp;cw#-jke}=NL|8szYW;*kGK-VwU0pCS;_jfeeNqIl|3|Owe|fz|kOFlLMb?mP7cK zDa`_eD!x6bS8rOf-scow#RV@o*NfrQU*2qnG8nq2T}p($yuON>JV(mDL5EcA-+K9# z&dk-%rLTd{jz?cfDTrCoYRmZbi>xf`r+A~JL+BW0*JD%ID^hvvtf$Y4vObuL%;Kg7 z#mwYpG6$^pZEiBAW$G0PBd_1jts-CcC?E3JtlEpRvO$jFBJfY}gW8Z#a{}ow-K_hv z%!jfsa_OS5BS!VA{DDqzwT8ah7e!Ue>sqJ&B$-m(X{Cs%(|X;dv~mYgUKU&r^_7>r zb)D?*aEpV~#SdTqi}TkPRyXY*pa^iYNb5sMm8q7BuAO7lYd1Sm&4|O?N54rVHdwN{ z=FnoVRT1qP`IHz}qNd!Se(d%?{`mdh|NY+`!K2#^twSV}wY6VH~H{|bL#-xiAMvPD8qN3W8er*-hLiI zZ9R9Umd&Z%Y7^#`9g*0em2}^zC>{BooaQ7&tJ}K-bZO*Vu z`CauyfHrFil%I`&Zi5!~i8a^9fRAECDrf*p0!XPIwfrJzqw63lK|PJp7z0g?G&5Wy z`6}1h7M9D)hbjxZgTzJf5Dp%-S%)pl65$38(>#WoakEqoLlzz>taCp}{*w|sWt1{C zLq%HZ7ee7?c7&wZa4;cu&h|rBdD3EN7|R!vuZ2+@jB_E6o(6PQTi#&EE)aSaW*xej zx!ahducY?p@VJ<}RH+4fdNo~Em;tW&`FN53W?it8?#nIm?2czCp6WL(`kCHBBt=qn z18_~$A);dz#FtlR5_5Rj@iQ)D z`8ZCb2zYb+Z)u}q4~R6#l-LjP!TVaft}9*t@sHn8-n`vzfBDN_Dm%VZH4(kPy)m1d?$4*2KJRzW*5aOa7;MLtQ);T>M{^!m=^=MV6#Mab z%(_nF|)!-iHJR9C@M_pWFQ)dp}2q>3`337 zrQ!YfG(~|nc@*F~jPEf7Mr5iGSjk$$`ig@R(vA=B`@U486%>M`6e142hl0yM8)il{ z2H$SCZZ~uD(K|x1o^S-Y+@g=)#bALXGC|fvD z)ml&jht|f!bS|c|M3qeQx6D8_vufYdrD!$!uB(N8)`pvh*3cvRTo!GY^Dy1EZL58& zD}#MBOKrMrFFT;Gs)TU)f%Sg6YH^6THH=6RL6(cEYBFpPp zZ*OsQnXR42-CT1vl4bc_ja4gmwAUSS=2^`-J?kl}IT}jnD)TsfOal845f(PHYW@47 z-|1}qbepe}N?lrd+;WVORHSE>S{L`GZA&E)lT(a8ki-|%OjR%A7_wU5s`Lpj;NVLk zzqPs3)v>=8Gg?Fb{;-|iekyb7PZeaRmGj%g^5|5NY{c~#5HU6 z?Sy(2_JK>fJ7tu`%tUyM`K%zFJO3J;N?JC@#h;iCE^H6h+VNkoVm^mh&tOcS((erNA6 z<6f>-WcI=mr;AIgxyR#}J2D?RiK{lsPk}Rcs~%n%+z*OXBHV5bD@rrlvz_cm73UsSy_IInJqPDfsKNE$J*W^2~TLV03KMD&}4a1 z2NYfEDnj1oLj+lCmu=$)bCzG{?R5wT50yDGwbXMABXY?PQ7kNjtCyGL>=u-3h{zZs zgP&tpHN+DOQ=wAr<3L^mN}+BNxuEwl3-CWoh#4}FU87mbT8g3Gk<5)Lor;+;aobcd zBYQ+wTMTc}24=q9Zm`iCOA==TMP0h@Va>qe_w;%srCwx%FjI8Wj`KBD;fQDhW=k7d z-TnF&6H{OcbP6$5B4Yx!XqiO*ngD~!x^3Gaja5;NE|14u_=YB+#hcV%$PyGKe2P5k z1Kl6sb3dJx{lG(506JDL|Z3O9hZH#wrrqKVwrImQ?heVSS33?cA*K8H-SQunk}YNLweENd)? zn8+(7Tz)BtMd! zSU9btqgo~;G^~iMf5m`%$ao0p)Mr#JzG5-0<4-9&$u6zBlrkxrh%9@Cmo@=i%{j@O z&+53K9FT62v7aj+xS4T*Ni>x$2}XLe@VfY_mDIU(<31nxxKYJMtg?oFW?c4PUp~{9 z=V#U2|7GT*?1s{0krwgncan2yj{R(8i>l(>AT5 z#7&$`T%uIt6@BV=?}trErpJy4HBw)5obeEA_8Yh0ELCxS4y-}ha!+>j7P@_T=j&qX z{f=#P3D}7nuk!x2b!eh5#$SK`f}QFv`9sm(&uIMw$A*OnL(p0by|Pa6ks=(5R!3&0W=e)Xx6DYdIpEp- z#}#GWd8y#kq)0Q{b?v5V1|#gB|M{Q){O3Ra^{;+Q%GYUdI%XJJWFY8dyRN?;IlK(gZJ5B-_pVRONEC%w^Cvx3#S*!7dcg z6PNOHtOmE}K2_O3+G>v~_tYAa+NCk4(Tu;2IpMct20H#S8B49%70zZK+3=!-346mthc=QEcVi62t*8JaYk)dk!DeC7pz3+?0?#{ z(W*ziIhxYqAbK>0;J&tQpV7gDCzGxuV9BEw3QM7Oa=9eKqkJCK@N&e2)Yyi2ohZQ% z)48uamOX!x!dR$phZe7+s&z&6vREPwQN-UkcMOa z6L60+vr#mvS!;cKe5|#8|NZx0fBp4e{^ei(`+xuM=(_=>HJFFU?RvXiuQJGX%nl)U zCHJ*dohKRsjkyi++wC$hA0L0LdjR|^n@wJ?SI8Y46SP8Y7q@6dX-Ad;Zwks!M1Yt= z0psXlroMxm5c^0Z~?9GZbDD!JjYi?4(fA4q;G>V46CBEn2E3gmV| z52#3gLS0c{lcCP-QN_{s`yHj|xSCavJugkFx4ikhqgB6 zh6+dv%#BQpE-riJmz4PZ_%u^&?WpHCAztKJ-qdE(4L+u)sxGr>N63X)n7pbAj+K{$ z0U!;Mm~&n(+vmpzwqoB+$jz);@dZFGGFv9Ts^--7Xk1@UC&)c$)*urTAN{AgdCe_D z%UVWInG`RCwAzTmEv(O*mCvbGU!06abWf>YqKk}0;}MD+Xi43XE&;Ye4=DPP@ysH5?7-jtbgOh2#n z7+A>?V}iF}W-HUiz!#kTXbYIrF%u3b zMDyq8eTaDA#v0+@h>DUEtI?FWfeeuYtHPwoBc#&hb(j%)nCk8aZpMssje7VH5J`H? zK_N!h0L~gcv%{XlfDKh0^Po0v;fcPvwJjwjsVRxh%&)Z70L6+AQcJ(!mI2uX*~@vq zcq)Ctls%Q){fGlJe2cRbqd!R9qTlOI?8Os!f&e_dW*XWb}|tTQ3* zSf8=J8;u6M?=vx5wx>nx1QQG6Pi~0K5s{+2pt?>P8JXvlMUMs!DF@GH!N*5rnEl6p z{Kvoj+rRzwuYY}ed&877b~m;C`J98r1C2|QNamcZ%Hv9QS^E>?p|;C*Syx&M+bUyN z0tu@6`T2<$Xjy^YEEP+fFBG9uHJ-q?(3GxoQ$0n=rnS~@zy0>Nzx{2DalKwIm&^5f zx#U1+;G=-GM1(VDx@{XXOO8`ZYk)e17j>zrolmOzhHwgFC!|sx!%;YKEJ~+qn;X%g z^>z879A07N7()7&v3b1w2Yo4K6htEPS+5LScD9z_C1A`;Z-I`r$cDg4k2@U zNh|N8H2P~*-5J0ID}_cxE*IH%-uGRIx%XgKOXba#w5(<0>Pyt~#~ z`=X4YueH#pZe$G*u0O_*OeNA*H(gI;mfc=+3S2w_o+B-^8BcmRu|4owdnj%Aq&Lf> z_NS;yTIhxnxhV>vW<7XXnI&w@Xh>vLqJX`=h+=1M7H#3~sT2k?197Z8!v1EFD4mr; zy)?7yYAZyd(@+7KT|2xIXQpFd5 z;hTy-;%u>RZRbmYR*USgz6sv@)gZ{4UKp?>a{s;!>=&vZ8b zYe&9btJZ-Zj!C*4y?|;df^=FIcQzxIL2Qib3?edS7jq*PnM2oNAy_&?;50;b1={0V z*2lP7I?2Z%ocujntWnNv^rbXJve}1wrM{W4loIhYG=&)CWvXtIoQH%2K@&m@DlPf$ z8d+Zi9N}zm&n$5WdTobeW4h3Do0EjS5DH1W^Eq&lf)Z*j#0 zh&bD(P~@}z%m9W#dA5)arOlb6kn6r}{kBv`MQ_`sIP7@H*w27U`+*Hw8f}GgQRoikME!E;M zEq|7;%UUA@{YT?eLwLiFupTblvaw@p$Oc1i9C?DF9RGuwH*tds{H`7?U|9J&MOI z+xp1Sx4ekcO8|JN-nG{L+iweV+hB-PRwW#9-!{y~2s)`eJTo_S1!0Ilm*8y7%uJgw z#R~!yxnN*JN#z$s69|Tpk7z`%LW6|`Fs0Ai?ectF$c@Qwx9jKU-JO`n_Ja}=$WWJvJ^>VG|qh$(PG@Cm@d<9DvKh_hu zlbI5QGfafF87A7}TblhKsbTzc+qP|kYnS$Ul(B~&rACQrW3$&gh14$7q zL(P}kQoUS6vh2pm(V(;-$s+9g{l3=X8M9T1sG{wGQLBfL* zF^Z75R(Oc)A!6t&DW?uNhZ)o@*6!yOzFMCoa`Wa8kZ}Tj#RI^r$d|$=5Roy+iFq)w zy4!QVPBHQU;o>%AXta7)TiW{zNXsZHYoZ${T#ZhgT*A0yVQ?A<2Rs9HrR*G}#xw>G zAp&mfQ--6P44#pAt)1oA98Z5GsqG{_O1MbF6wA}KbIc3g6*Gf~9Zj>NHaca2Q`S_z zV&G{S7KF*nteHSv-d>$-$1iI?%LVlIf=m%P+Kktw+RhVky&sI1k|Og?h&T^uqJ3v}bGzRk&*&|;Q`W)2G%QoHoWN9IgkFP!0gHJA#mn%E)>WKrE(3EC2 zMBHTz+1J8YSM1)>b(wR{xjd|&Z{NP5?Te~z+cxLO!Dxdy@SC-=Es?OhlFT`#Dq2lt zUYa)e)-VZ%h}_x9U4|g_oSBW;#q%L_7|X^YrIi90Gt=wk3YGTx`8meeE>|3pWrIKt zea~vTmfr6l&*wu1V^k`qtP9L6hgecpftZa9H>Vg;_vq7+^dM1}iG4;{bd_({BUcV6 z(JB5|8ma^jQHt}!g7^G^Dpus_FJ<7E=NuxkZQGc0urQP$xtKin=f}qf@;%bj_N?qA z8KO< z*wBf6lCQN?mys7N4D>KtDsPhuAUHfw;1jat3>5aQU1mNEe`PHlV zMVMVghU*^LGM)j_F%r%kf+;&gW+~>5&Js%S0gk`Qz#V;7*pWNL|mCNuj6_MMvfjGigVJ51&&FBj;ZL15_@=| zpF{K{9^6*$M3HgpDccymzK(}H?8vemv7CAb#W$HB!GTsXxsldx0IBt`BaJ=7+YWwC zWRsa$GQX-;fs=)NlFShL@#Dv~O^Ds=^?KPZ7)lW(8f-F%Xr^tkR8hH6I86NJ`EYhO zB%<%%zvBbx?+W{|C)FOWh@4~dtyHh3Gu5fFel1==P$8+*iFk|vf!0#Vs5+6GRm{b< z?Q*-_!vAKz-ENP^Z;=aVTY+A5&SQgkl1%pU=8@vEB6FMDQ+6M+?>qB0Hd*_c1Jyt7 zZnxWw$YBSFusgzer_3z&orbncH3cLh6ynGb=BFvDtx+PX9>${RI;y+0b<*g_jj9sK7}APiy|NNZ z^}za+76LAt9%&eo-7_T9I?JF*rsHy$lkvUe2OuhDMjK02F9sRH!~?ksBI0f=!;+VY z`SZv9@qEf0WJ=5^xm(#_^6m15yaE;>^2<EWfo3Ca#=Ujt2qfO6#N4RV1wHF$Nqq zI3xwl#-_F0Rx`sGdJwa@c?=&qcGwAxo6pmR<3zYNAG=pJeOK#+R+IrysFS$#L)TVu z6%m31PNpJGi5~1Hy>osA3lt!7$oo)3&dl335@73U^i>ZsM(7=^7iJQHvhn6}GVINMAS2bps-rc2yOW(&Zb058-nYP(9p*AKP+ujbj5 ziAT{kMLqDN1T@j3H|)#o<;TR5gYjZ*>d#P8wf}HXTQfB% zsUY+d#O7I9#3am)e>mD? z*OqqLcEsQFg&}^A$K#Jb{~?&|<2B-}1U ze!D<^6bf$A{)qCzva)|Qc8jsXBa8mGfbr%-_Anp538K!5>CM@{+ob%ha_b~?1 z$J^W6$H&L>`MlrnJeY;6kfQI;T5FEUj6v2>4!G8i`(iTW?RMRt&oSijeBST(8(qd= zXCH&cHpUp2%QlBByvJ%uXX4k zHq^VDc?9{*oY+}h+)U?~NNIs1l!8$?=ZRZpM?9YocO$3A{r-GD%#0YQ;^D)Dos>Na zN^St;qqJk_C^eAgNS`LMbVXad0}r7SL!A_7zn(6*N)DH;DbaXqRYq5N!pyvF+rBjF z;l`-yCD?Q2@D#vbct0~^20>|=ZJQk<06Sp)m00+v{l8sx&l2oI*5c`RUzJW z7(;wmpird9>v8NO8rva}OmkSPnUhAFX}ptgsUxn<$HoHWV-YtiV4o;bMI06k9Y9h( zAWQ`^w{QVtn^-lny%8>pMkEb>s(Ua{YjbiRbC?=NhAyoW+x|eW>zzV$wJ``DanG^A0T1!*zP)LC>#=b8ihKz~z z^I=LdvkW2T%k>%$NMT8MgV{`@abdUKx_|K1w$0`5JjB5B%C@LeCL#=#d9kpmhn`bBm52`>&S&f^tT&GbIjBGA zD&q;o%zOl?nVmRt1eB~kf--HyGK`RoX=X&oW=ptCm~r<=rXk8S_70HLhMPy5dMNuJ zKYkQs`0MvyZr59eXw8d5-w?{r&x){`^mW{>xv8=<#^`{qKLr`0r{#j1RxPz5VG=f4bdn zFgI7Go(T(V&=)G@Otg?pq^X;_yW0_?e<58}opXq=s*MrNGQg6YU8Yw||C^Xhofju} zMYo{KWqW^r|NZyhpU*#3*S_zl#ip#VMjdzH2SQ`Ym{PLNY!vJVOYH6a_QxMTINMW* zOkrUnN$T0=93qPBeqqm{)oU%cYa0;4asi)8I)iSbUuB`r}V(m!Bk2v}1ZvZ`8x=5xnr&P~!U-)G@|0>t?{eSk>)z17g(M%aq%`#)mVR! zCh_Mobv>2*mzCVTj{Iv4F>)euvkI>>^K$pV8Y4j^o=(_XFx*hrW2P2;B5`H3QN)fI zMWjs4h$}hCcnojsS|XmCb7e6%X}Y;)UfB;|9VGNxlxh3-|u%Ic4qd=ufNPW z(O-Se`SJ1bcs!5-ICGRROb5z}_0XwikNcw{ebDq4)9sj`ctnP@6K#|dYGNNl=A3Kojf1()qBQy#!<}!p0qEe@Uw_4u^5Co7itI;5NUqoGYI99W zq@oPm%=V`;(-e{GWv$&zpU)>M@pP$dA<8w2yRX-)nIWIGz$%Es=84{v5DsG zcKdvMUay-wN_NPMw{3j?{{G{~4lD8T^To#q5(iTYDfr?0#0&M}|Q{7u01( zVp8+y69VfK>DtwHs)vC7KgQm)*^%VN62;;X)qNv;Y7g07*naREfsAnA!A<>?chD2mC$l zLhWIQsJ(5WIXg`l#`%$c>%n5yG4U0VF=?83Nn%}QQ>BV*idg?4-T*4s(3QQ5&=ap+ zgxo=N`{27(UFyaXGDf~rPh)^KBVy%j3fj_M=bS_~Z6~6lRgsM6E1m0T9oYndC^7(z zh8DFK;CyHK3&srG*lIM zIJlq>J;tW%0B(TzNs0HH>4>VIu#Tyv;?3Js(vN;QWqwli#FbTbPSnYSFVLn>Ih(sP;slZ6=}y5tLw;BgMml-jA7-Bj?Cn{aJ)KB09zx`&FTopD zc6UHY%=Nl1n9#3Zzpm@LZ5ywxubRZjF!RXD$1wzDbygEG?d#XCU%!66-EPOeANLJG z3JE&N1DECQqiwE^CL~N*&ryJelLro;AO!rUKmYl^{rCU&$3On@dc6W(SaXa~GyESP z9{`%bUdMjGfl5T09e#nZnQ6G%V~($9QVO-fFGUZd;%>*Wsa_&%Dq(NBG;)B^xosN` z1CD17Pxlz(^;LiRY0HaxEx>O49+z7v!}5`+swtrvwGMrKxgc;!(_HLu1FasB@B1Ak zh3<@uJ!<)vvn8{N$QX=RONjbze)zuM%`QWP*yo%~G>>D5jAdCa7oT%K4lKC}(^tH> z9zj)?F%Dn_GT|X398{RiF~)4v+3pS+pncod%SzGmezP-i2o26zGKx*^@Idz@xthT; z9~>O0v98@8e2v^*0Nj;RapuD`TdqY{lxV3m4;EL~DqVfy->4T+8gh0xG@DGqELDG9 z41a)bpY zt-MT$2zziyk!qAiWaRH0b2nm^p#usWwag+S!PJHx*{oR?-DWH9AA%6*EqslZ`qMCvb?xuHPXKJ6S=A)?nup;5wp2TZh4zs zd4Q53cV)m@c{L}Ppu{PjKnb11#~3UUZtai}3Ru#VrX{?Hvo(!VpZ5&`GsELsso~Ea zQ!qt8AkIq6&$`KT`YarYkprGvF{l(G3NEUMm!|uD<~&VgAR_SXD7;D5Ca`5NnN^gW z2#g8Bb}q393VU9L9}#oiDJNVI(aUA^t763rqT}6fl-QAIF>HrzXvET1UK9`oy&$7Kr8G9^V*vK(d^+IHT zhN=Q*27^>cBBBa4bsWLZ2Oh_1M^HKus|X9dyu7&k?RNY2@%?_kb5{S9Hzlu*Nc292 zq6QSCPRyi3-N|feYt;a}^h|bWoKM ztlwG|;c_cg!3;*fEAtK=LB*kGQ2VhI6~Ka3Haxte+@gChBh^ zOE_rPD85a+rA%}pEvPbdP^)L}>aJedaw4y!3Rg4{*~CZ4Ko1;6ry2KxRz#FddYOm@ zo#g_MJX9K0Ri_gXO3a1f0p%#w*Mc7vl4s&&RoIw313T>^LQd0)fR+p0x>JS@kTe-p zA9->@I;CZdt2}4SOz1*FJie7Xp^Dj?u7r!c9CH0A>QMu*xwlWMy# zl^reRnC}BB#!p1hv@?{BNBX9F_Uv)by^pxhg6-0Bdct$i2u16DYN^wifgZZU-Fq;? zPDiiTpE;J480P%@^MdJzKB0&DNo^B7fgq)-E&bS6CU=WR(+^a?Vo(qt;J2d8hB{LgZNKbJ9Z~?HQd9nz}3|4E)k8P?i?^)cr2r| zld5p`O2OFf`{o(lW9DtUtAG_~AhAJJ-{0Tw_ieg;+-@_AA$nX@M5+uWLzb}Egg(g7;iE#F|Z6iA-WOxRJp98Ww=P{?P>pI3d&zXJT@un72_6&`|PRuMS$8;zQ zvWAhrU&_Ig6{sSEob|I~sC)1|K`wL8aQX;qU!D7nqc40({_WWaaUOI+I(jYZ@#jPR z--E)*b?OvF!GiV^zDN5+rn6&bp)|`-5~Z`Ps0nf(5+$LydhM(6P$L_&eSCbBLcmqN zefxeK$Ls4WW$(&vO)5E(h%gBCCyMZh2!8kOgE05RI#K`R9?y&RIqSNDmgqR9lZ%Y9 z@1Fg&fe3M*PvF>E4pLk+2`lh9QarI|GvB4MehX0$8KG+#+K)shL!_0Z8!)Ht)M@9u z<5Nj?{nG$EnxQA9C#vQMK1IJ0R>gIYY-(oYhR9O}prYg`1pY*D$z*Kl_9Ide&!kd? znDJ?(Y6;_IlPUwX-+z4~Il^no;b^|bI-Z)Xbjp@v?Q=@Y-d91*g@Cxg&&)A;bQqmG zfhGfCWFzfUiHM0!bN_==S7@AC!W=!mN`r9LNY)yo^re@o!d>A<25vD7W!i@mL0a@s z7gd`FksOEJ?M}qJD(;ala5;?ZMbKnakiGq}RR6))(55x3;zO-@R1>z=u}jivPgic_CYUE31Oc6r`o zcFr4c&Wde{;02inrZlJ6s6`qjxl?pRGU$57FKYso7*I$15d0p2pU%tG(y#B)<{;+NL`~B|jcG$7)FE1<7VQ(L| z?S3N`=QJ1qHsybC|-=Q2zT2kAdYyMHL&LYRd=Ib)PeEG7htIfG>+kPC& zI_|goVZzxI8_{|6#kpRuNXdZJyj(7bvWW=Z&tu9GPRE%A2b9VLxa2tIJZxEsoJ5pK zRL8z;M64PrPoo#GsV>YcvM}=)3P)Gg6~Ze+M0B~V`+m%MfVvO9E}zpCfpSw7bHl8v z%H?v|kE6OL!*-S=lV>R-cKvf6@LK1@a}@LOGKLvlF5~<6+cC|3P`bk(Aukcrstc+& za;B&%&)^$7j$_+*5gE(aw!_?yeMc3@vMjH!ulv5E{t1Qixt%da3&P^cN98%{#N6kx zFGG)Gl22jg@a)>Y@6)D-zevn&EXzC&B;ccg2X<&co5Ch~dI|#Tm?6P*W<$bd$%J^| zFycwkQrV&#nMpRHt#I(OHp^&fk92iV;!kEZ<-0TtrQs~(*DM0<$JC)Bsv-vqv8fCd z6_q&;&N|MnWH1ZeIAUe3>*CDY9bS1|$Fd)XPh;VsW2kb{jEphHi@6^bI#)+r*&C8eMsxNzP`SeR@{#R^nPGkIOY^;&R6n9S5*bUg1dkF_Kk?ImzT@s z`f`17_m7X;_wOH~0t!{GGDqU_>#ys2y}r2HaU8@<;sftg5;wv+T!YQ6gds zDt31lW;-S_<~T}mU0RRkr`tAjbp4*@v&hw%gCHF(a73um6qu2APR=UoB*Z$+V^E0a zoI==O2a%A6SDVY9RTEjts9P+~4JGC^YKfeHZ2B_rvlj@r592anxBTR}c=8PcR57zB zeP)|Dk|yG{g{tZBM39y|b`b6EEbTU+?y5g#Un=cGf@ShV+ZZe&QjvK!EFe(kl)mun z8{S?-9@u?i8%C32Ye*fTdL<{vGK2&@6^ut+Rk=BdvR4l@L=8(mA_N$#dRgh(+phoPvaA;rL2vi__U(g+t}mA_U*2D?S9o#I(U{$c=-75t z43)8@NJ%_3NNILzg}ox@@l?vo_`cn~@cWl9Z~MNFMYnB3)35IzHxWHrCq~#~RCRcI zTu_Tc=|>r3>~k}-qPGM$Uixf?>acoEpX4LFX(BS*d>$37Ff+<(7;NZcF{P%8%MyXU z*w=N8@%Hg?mVwXdbM9l&vFI2)jdbw+zN5%@T~`#+qJ*gApNX`}^PNBw!Bqst?q(|L z93a9A-=;%$1*T?C9DG z`V~J86J{cr^B_8N_~2bG>(w<6cqQHEF^l(i68W5GeAY6V;j>G!lv@qm`MH~8`<)6_ zIN1VQk3`Bqa4cbBGhf#WYx%!q^$DF$+Rf@3q zv^h&*NaC3mPp_YAHh^zF8$Ujxm;HEX%&{s012B$m?D% z>$J0;0oIm)RU#8Q8MZM^1IyLSc$QgYKJ_zJce51Ky&r@Q zRT+ll{F?P_Fw=EiX>~^B2K*_Z!JDrU2RjitlnefsUr_oo1MP&qMOnB6Q4W_wq<)m= ze?TMdqUS}+iF4j+E4PxCN$8donl&8Eg~VqvXL~|VD#wsjlrK}!VsUAB&@?&-6gB{v z5IwpxyVVosV?UW6#u$W>z77KVgVhi`+Ro?EseOQE3ETPnr~q15Sfj)%P@`wrFH(Fg zL(Fh2F`+4vtB6fE^JNH;>lpLchl-nH!xYGssD`hDAz%$Ch>o-}f3iA&lb1FGaFf$F z;buWKTrW|Avmh|fO}6^aPAoKEPPWg=RZA;S0j{nuZA-S%66 zvt#-(_kI8N{nw9=@BjFRe|&v;0fhSa`0yF&XqJp_&=eX@0;@6M$Js=^YQ^2!=M4AQ z-~awI%*+^LUDx~lK98wmx!*T*|0^_UnaJ-M{y<1BIUPkrbPOnB7&GucAaZ@b-#Uw&*_a5`NVg*>wTVb|Mexx*NUsVtmLPGmXu%0h zk#j8j%<_C9A_5w~h+VJO*VosdfBqRzxK7J0IRV*T%yJSZ2_Mr4cgwu!FrU$sHG)H) z)r7G*#fIOSiQ`eDW!)L@w ze7KpL43%ZD>S1%*bYWu}V@&eH=1~TVoP>#m-A6JR!2``1G*{IjV_BECw>RM3zV;<^ z9L?<8w{Nh#sH3NhjE`)2Dw%hrs{6LhY^{WUfBp4W>=l=F^@gJQT-U(jgx|h>zrI|# zG8V?!jbhFzGE!X|OnKK=U2%0w=a10PA4!q>4_oN&{NWF*;it>>2dTmQ{h#z3<45%N z`Np2_fl+etjIu1b=()L^`s(1;q@F7OEi2nrU2C+3rdTJGezj0lRr!$&yqKP{ z$;CG9?r?Cc$QVk~GG-U&hYG84bN1#yJo6R$ubzf3L_d>9{Zl2=)53ca8u;pdAh=Be zN*$bY{kw;?XFpeFE!gh+{H^QyGbE)-d*WvvP_~R+WS#+;nMH3uPcrjNNaBi86A?BsL{02F0w_Bdww{PEIavh|vV;DI=&;5SCTvm_r@YUV7`%%;Mq&iijJ+U{G zS;lxyw|V^M|M%BppYQMQV~j6fzPw!D%uKfX7z<~wj@k)e5J1#NSqXtNTeKby6N{)E zTusZeT(4I&CI9*7pJAUonVf+I0V$4SgN0*e)inp%pc6cO+st^JxE5zpU9CPKHsFBo zAK#E-xU8rF7xD-=0K+{kil;XfwSmC56I zPd5@XpHKLZ5*8V*h55|gh%1B_-f=SnV>TuJ>x!b@TXV73 z>cgq_eP=q?V@*2FFmjt(E22Cd4U=smL&w($*qK0c_NyC7f8Dx6eqr-Fl! ze0+Rdub0{Ym>Ewbq?(x>$7DWAP9zIuq(vkNNBH%0SXobM)}Ky<9HWY|6A_7unXw46b(v3(p0_PoeF7?b5gENt ziU$!5az*=d!3p1=q5}*eF8;xp1v9Fu|LfoW_2~|3Xr3m!?0P)UQ;Y3Z?QcN>a>CQ| zv^lM{4DxL1Wag(M+RQ}Q$)N$wZCR6}VH$H|oVL(|Wm)@+iUuWPdaoS@}Lo#A!XI6;W-O=~W zJ$U`6+hH?TLmiK531=3kNbxo^cQ$y@;I=Q-Qs>WmaHb07_u1k0`oVa~Syi?!3qTAY zX6AcAM2%Xi3L#;R*}-TX-4P5&0vm1Hotck)|J&dG2Ca>-!YMpIN=2=CL0MZJP>R04 zpL2eEe4s1<>Hr=}ly~5_`dE8M&79zPW?t9zvaayU0xP2l8+OJYA0J>l2ZF>1KtJeN zOCD)e708D7k;1Bl(;2ut6Ly{0mvu1nP#McO<}Sixs47zHrkUODcM%z5+4qA;M70Pz zk7zs{ULR&2=~u3Wkk}~dHexv4h{c`e5ml?19%{_dfNqQ-**dO>VnfPg`8Jz8r>!$}%C=j7%k?F_GGriw_# zsBicE(CDBYk5;nR1A4EouYdgGABpJKUw=g=2AtpPx-RQl@>vx>8tgnQs{6jX6IO8! zmzK^b!;dw~%te`Akk?wV$XJFZh%B_7r|tWtgGCUjOD9O|@nAqbQ-ealIPwwea^-r7620~mR~uvRFZbZVKD&&NM#vwqRf2mDa^*C+iAJ(`Tq=OH4J^m+*sgCvAl zB$DHp%sp5$fk1|q*=5u=3aG1cD3kG2vnV;LgqsHI3$4~TPADqqZZO(w$=z>PT-ZLT z>KKbAJVH?^-s}JVkAEwFfVaF!N_^QN8fUPk;x#1-7_7>&DwR}YnkONjK!;FAjfRHM zdR8*1f*C@psdMDS#BGH}j|wK2te^PNq^6Ik(hKqdku%4MDZSWsG{$%tV_BB#<*Fj6 z*5J_5k&#L;&nG|$fCEDgCn`R)8Ewk4N<=6ghcubVyV%vhO2$&_64Q;CfS}83*lr+K ztVq=$*S8O=sKL9>YamDLEJ!++L|v}A70rz0G?pjg$(Ni>;vdeLf>hYfWAyNzvZyKi z%4ZYU7;O#}Gc6DYN^gQf$O-n$Epm5=$Vnb{Mdj#d&)5|NHHA_yEL}iJEJe*!bVsgO zLwJ;Ja@-xDYT8s4u5$M1yD@ zL)s@4Cb}?msV|M_5;2hk>nkz4h>B`9Ph%htvsryyhAM81Im(GpKeVnZDpYEa&CEUQ z!JNl&%yXs0CNOBL`wrGyZaM&mbWg2Sy&Mmfp+f=4+EG;k9&s;lO z)gh|ew(a|YDi$3B!dbtXX2-ryGZt~8xA*sd`lo*qk)MD5`TO_pO{ACC*VnNG-&Plc zWblddCYXF#e zS=Mz~HM3=&6zroKe)zC#H>FuT^%$RlGEbqWPp{9{`uxdh6Mn;C`NPl4>h;rd+wk;% z>)Z3N-bR?|K^5Yn@}L}J)nJ<%&|EwcQFM#}LoCSIFU%+!RG6&7%CV}ISjc&x@vErH zU}7g$L3Nsn4%MNeA_MtyDr1aA#}FNa_B%54KmPS!IJxC&pI6vIbDLh%RuE@qo0dL~ zrBJBlT0P8x6H`E(97^KMb`MLB>RYr%kQ~0D!ol?dvWavt!7rGQD_?zUOG##SMnlTk zR^4oK&Mbv#EQ_ixSiQ{5q}kNH+NR-JoIV~8RdTuyRn=yAq?mcm$I-}FcL_fUw}?cu z&)l8hfX|4nOK`!mI-s96=i=E3THn@moB1i|kM6n-Q2Y!)Kjd%uW9ypJ1h%IrpqR>- zP;K4dUH53l14i~_6m*-gUH||f07*naRMXfDNX4Ew5@$nxB(@A5zvT|xyW{rrNcO!r z=O(WPN;-~IMb|r3WjS-m@O;?&F*7_jHf_!wM(%dIL6Y}lyWMWzzkhuD_RZbK(0$+S zI6TW==A6is_bkopW0GR;U8#A-lDZFoveh0DMUjcqoO9duBV(hQ8JV13>O@qr8I9g5 zDfyUg1meGb{rdCIKmYpcuRxG!t|*U;yOyLs;o1~tj@$s~9N;auB%w6HF3HR+)Mo@1 ztK`<*ku0H_n>~*@q~kCr+A>!RxVEB@Of*#csk#$4g1o`phMldFgDJo%TmOLvD+C#xuq4+83qZ5h=?-7 zNJj=mE@1??eO(YCEmk})pLBUx<@De}@?otsJ+k<%nfaoMrqA_&qLqyo0pzjMvuL8FRbS+_gPGMix<$@(;L3S=^}Fhy)Y|;~+u9C2+3S9L(!#$_ zcYdDy^WD@X&PZS|n$_u56(z-7q=xw-5n|v)QBf9Qst8+JHc{14y@GR@$C)@|1*${g ze(w`mVnKl<9%_&~E-YOJb=K*x>V%q9Ths#31QDmwlK2qigm6K|M{`agMUm`r5GxNB zVwuy#YnOt7I|+>X#9&Jl!z$4rE07Db2v2ipaKaY9*26iMVV}k_l=(QOyI1XVh)yei z?#j9z`2?Mha<7^0?Tq34gf7~i^e(TcstB_o|5>HU_ z_$v@3)dBKYV^})cQ6}Fja==nJgJ*uQdQrVqY#<*=CJ|{E3 zzrSzy`|Wmnd3jmZg@}Y@9>*`g{JQVk^?H>y+G*ZSIzalQbZX@7>{H_2It9afieKk! zV#)}x54$%!J0fdi4D{is83eAa%MsDBAG~m-N+b1(nURqV=AffB4=iB@m@D?DzFq+G zoE#-RlHu=VQ60sDm<^OwVe0mMSFv?nFS-)ZaUAfX1@@5mP_y0eW@yz@#V6by^gVc zeBAIuxT33Uf|iGlB1!u6>Sh z9_)!DOOpAa&E0fjaluCRaF-D@tEyxFxbaC2KWoKltGC57R(SvsRa2by6brg7z^5ou zP7Q}PfSlkYz>%n@`O9Daf`mn8Ui0<-{?5!sL7~9uj;(P>JP}@=L~`gN7QTPn3}tOQ zA_HJ-rAKa>^2?NRt6u>|tLjWXff()91<|Gf4g7`kPg4Y!WgOPw3is-dp; z-QINT)4$CDK5IoYw0WwRr<2ns3&_8LBcHDO!>>vYKOKMmusLx~hlVF>Nh1}PXz^6`l-d-GVRP9LKn--?!IV^WDdZM|V7DNUNLPrh-g!6OIgJRGl=m{Tt5Z?J5#Fw!+ z1^ZDh&WEf`Z(9v+W=d+xBl!71kY(hOU z)W1)7uD`g|tki|N#CMd_f7l_&k52o8pVayDw?A;&bz$gNai7dOTVEe+fGi6LDCFlE z54oSDJw#`?+1rbn?BV@khAJ5VMt3sfnVQ7|g(rm&kvVbXTegwq7(ma3%tW1SyB3u^ z`hy93Ks}{>9Sa;4L~b6;+me1Xi3loFl)M?d3z&s%+t$nL7z0Vol|H2-yn|+D(@37< zZZ#~P=Cg#866W?Po^uk#9=8^3Ns*b|?{_Hu%jHu0!|U~0L52!X_v!Fy$dY8{BB3nL z2eO1kDiJUsLK&xJ)f{bM4mzQAUC_pDT^A9qT`LP|qz{^Vgj@?Pnd$9zbNB1Z1y=mN zZA7$fo2nBFd@39<^aZCyeke7VTaN}CJX9%?8i5vE*qMXB8|UeIVBdFQ7r9)oXCvvV zdCvt45S*DsD#t$E{c^bgh#W@%ER-8lg8S->0{NV+{$?zL$Z0>EQWBaI-O0sVC89Cl zTn_K$Z#2SY79wNj`+f7g6AjMHXn2GD#>dBZ&m8w+f1@-ukXltWTSOu(TYzTfi_&`4 z6m*<1=TxC`ca^HgozKQnE{({#OSp)nn=HZ(`*BdBsGdlG+sCbXbF!csx-T?%QjYBU zm?A{mwreCzi+lK46EmN!6e~e_-}j$?{<-$vsM1@O<>lq&_4W0Bzi;=udGv^?1b|rA zHiaMDC|(7K4u-7Yf9QMoCA%b9Yq#jtV#kfrgV+~4f)A2p0z|}_zf~)?kTU*{i~6n~#f;5j`b_+B1ZxOHg%u1o%kv)qgp*Ut1so@y3h9HksxO15+xACx%Jh;_|Ii4>78-Vt4@cIWh%Tcr#Ih_em&;fd2I-H&Z0w9qBsze0 z5DDL$j=8}sp{1UtHh+12-R^hX{iVC%X<^)^*)?a@mjR zcE}i5jBq2Z>w3H0+)vx)jWZ9AS%`$0RR=Te$Bu3A7`ko8P<5hZS%`ew?zLgy^z)VR zu5puST`lf20v#eozAVeO-RHD1#^tgw`?hV&H0Kdp6gxr8oKr+ml*7%Hi;M*#KB8up zR7jOY*o=gk7xlXzVcS3p#6a+7mR820uiSmkZ49*_Yc%k7Au%ya#5Q1sdQ4^^;%Rf$ zOXUU1P%;*`%k?^zwG>D}tC|99F5xc2OvFRVzf~bu7^C?qt$#-6q=9W^p-i976oe0w zX@aWCEY;C5fpsgSHA9vy`hXJ}Nals^_xovUPU0%5N5Ccg%p3^mDu?=PS>Tc(4$h4V zh~;P2n1_9A1?&~X#2NN|Ulvvw<w+5GnXC}p-09vzOEdXFo`$Rhw8ksW z&pv&!vJ5%qG%`4XkdDL_aiQ={ix7(w4N;pWtU899iwc44ae^Vxbd0F*wOKVWA!f|c zJ&A;fjmV}WHS5fFbK{4{OL*o2D(RO;YRSII>#_?C@p)3tBT+#{WT>$;3ZUtX{4y1cwz zzI=IqdwYF-d;Rj|?d|>T_3h>T?e(%QuP@hiU9ao)a$R0tF8}4f{^Q&G0Ea<%z8h+{ z0anHs*UREm`Yb0=OeS93@9^fBjw9`w_W zc|i4>J9E&=5c#xIeHw<31?=lg58IEDid1aS2E6ab?RGzoqoQmzGVnqb426H?`^U$A z?6>>vzTKzIkK66O-M4*1vd%H*ejLX7J4@gLW?@w0kr}xOyD-^2WXKpwOsG;;7Ba6)aA9VrMaMKRsV-66te2NCL>NtnivMRn-FHk#qia1$b6 zL^l)I6OQOmFfR&`O=c%|RN(*;CHRO8SE92M?2I~SV{oXcE@Ke#g3MH8T^1dReqqNn zJkGWsEDB?Y6#Y~tF>pZAP^!za5Oe)EtAg?jMxE)Bj4Z~~G0Z%cg+%~fRU}+9@koS? z9NGjN^Po>@21o174J3!$K~CNuh$8Mzggu(J8hF|%Ym9)#kY53&rz%GSkrokwt_yvq zARdyW$CZxd?ktLwwRmbC%rbOD^BZOsetCT%=D+{^_hTLert;(&*pFR=k7GafqrCM5 zVlp$I=F^UScQbMq;>)rwm*5g&=4C87MId2OVp-RV=(t>8t}kz*Lv$EXZ0U)d2(5n1 zX)NnBCpgiBQRZwE7Rub6WBO`}3#hm|h8dzDEU3hc9AMlMJEkLOs`3kFac8*JV9}sV zo+EL!(|%0WtT*-N=dbLMXCp`*h*EY5`PP`$m{}sGD%XxQazK~}3f&SWelQrrX2@R0U?3(8Wh$$XNvM^*{dgU%cT4YppgVGr$U?)LyF3XdmKw zQ)5><*V+|*o*^m-pI+a(CBzRsmhDs)Q2})$ryrY{QAw0(ic$m3%rkXNfhT4rN9!aH z;X#BsW@!I>r!jo0RZWS^BWlQ}n?((NVh7LZm+DF;R~K3&m7efxCoUxcz~5km!vMs zczb($eSN)NukY{g@9*#Hx{NWrK8DOJFwmhm-aMtb+0bKCC} znLo&tJ z=_}lo*(7Hb0k=Rb2b(bS%NXmjlxWqdBuJx98oBwHFzs$cY);rJAPe(2CNra*$+m5$ z_LGqFWm!@7?q<`@s5iJf?rUnc2Ez4kDM?S}pmkl53WD3K)I-Fzk=>!Hx7)4Q z2D-aPv+2C5uIoik_aqM;V=S4Y!cK%Dr=NfR8Q^bZH`H8oB2hwgwjHOIFjI3^}sBf_odE zP-TBSnj6n^K6@GK-ujZ|rw&_=ji6HFz%J zr#r7->Hq$Zf9rqSV;L7c@<%>BJhd9b{$anfQoeQk<6#fuLXW()p{HW7oTG43$ZeGA zs1SLxsWl$Wypp@K1cob@9tn$px(V=!p<=@QU_Mlqq3n*d15Uv#RPF6$X7kZOSck>s zvUa5qk0G7!@%4GZ^f~t2ZTF$;(_CYoyRx{?Zo;4D>**D{B?|J+nN4ZaKYHG07v*jX ziRnooEF7F0wO)%f`>L(74UkwexB5 z6f`eWH^y?kUf?shT-Mju*D=P+%gg0*ai_Ppw{;DaP_#H@8oT_DF|b|ctngJ)L{R}^ z041T^*L7jxs+BuaT3BFlzkk2YIp@sYR;{ey!m?rYRs4Hu;-(eO{u#R!PUPjhn zUM?3rGR)f;1Adp1pBmo2^E5MnNFuu5??|ug8_~}q*HyWhZQC7{3Cw)CTp&674k#IO z7xK&)2ClVIIG{3P&1~NfW`>(zL@t*L;y4oNuq-0W&?<|0l8w4gX*_NCGb$V#ZRCCg z*UU18v<8EH6(dK@lUuD8X(bN9L1OuGVtCQu9!9!ksCZQ*ji^X?Z6)geQkYpp#xj;M zES&N&`8dYlt#)_!Wej(?A%qne*C?nNPdpSpNji(rCCWLob4h}}tF*_7^ZfI2%h-XGluy?gN=SeMD$f<(+J$2Zh z$wOkg0Ym%psf}5se8BBOM9?|4vhW5g^Z^+sk?j~`EQ=)}z_KjJ?7&Z)NXJ;$6{HII z5cSl+n#_E^-@kwVjx|zZTsX4(EY4AVTpH&tOGH@l?Fhw)B?`x~qwt_)phg(t)aQj; zf+jthtw&|T+`J^8)XUR{+;wB!!;cJNuef+XflrtCtk8b{le$)y?S4#OAnmq)?-EaE z`26bE>iX^TCr=vh>2kkyr2hNA{Bzgfed$`}T6xRN>!+@TU6NOq@e?$he!CKpdN7g4 z`-?I{CU{xl4kveaVOgSpF+66%?1<=P=A=lpOQwDgh3deSwJe0ZYi2@UZwz#B$_HO4 zLXAW8x-OUXBB+8&cWF``{uqsc^sYrZ8n8};huWin9gn%vagsAP|J>GFYpeKKlAea$ zJ!8ZEus)yO_a%KkLa=7xLLTYi4)~ew%qY5iyfL1c zoE(~j#hg+*1z@#sg1UROfy!V1U?tROcc&4w^RkTfvcmWF^78Wj{{H&%^78UR=IgS& zy}rJ_zAQtT>3Y2kmCL#!(s%4Txevu|$B_t;7h-0f$7H5$+t8!z*ml_3Wmyn@tvj)4 z@K3-Im7K{rl5H~$Bo(#pPJNn06xsR|d1I#=yB-$*u9xe}%N3{*mgc9QzWl>K`~y6) z=;T&r5f`L0I>`#eG7PoE#C7)n=ZO1}E4O zI_E5W4q+GyqYli}FKP%A2h-5u?ng`D!wL8F8+DWh)JQ}<7OYW~pZbIdZfnpIF*B&S znWH$2h{}(@jFrd?bllUB5r{`CMO1^vnIK+md+H7$r2tR4lRwMk(~Inv%SD4ZJlVx1 zv>%`w09hF@_Y=#~uy3op!M<*} zMFeTY<*9M^f_n7GjfH(q-G8k(Z=PLu2kRd*m;87m2ESad>k>6F#5~6G?b|opwkJ12 zdg67?`St79kB<)#uB^wtLg|s0Dm15@WjbZ8upUqrqN>Xn(`;QY_>qTW;;g~wN}x7% zly$BgdfwZ0BiIPZIxqTIz3T17&3({c%v^fX9|26x=I?o4o=4+1zWw~>v$WI!{oqgM z{Jl&3{>}XUo%cVx&_4a7EaqneieH@pZqCh9DTVrkGkLszFU=*E3;sFnlpbAWKRh_0 zVWCX%te-VATnBk$l-+@lLxA)q$(+bwO-pyo**V6YkTgn8#7=x1ho#^Uo#_e)Z4)!A zFnS7$T$gpIs<1{{RJs`b2jT^>FgI#jnXZqRc^=uNqO9zV;!_ zuPW*gq@qZvF>~bbkdq&IUQBtHZHisUgCF-v)VuJzdpQUt`3_&NFF*bClV+$|RhS$- zGluGAT`!mQdbwQI6)p8R#D&6C3p4Z3h|ul(e*d^_w|iONecz6Gptu{MC?dCM$DEGp z=|;*^K$2j>&jQkiy@9y{Bcurz391@dmgTap61k!4<#H9(G4$>24ff{s_2upD?fw1z z?d`3M7AHoWt+~jP^wvHTo)0}6luL~^wW5kL$($tu%nW`+G9H<&_c={?~~9wWkno$B>^^?>Sx81(gW z5fPLgKFe6+Tr7}X_ROXcF=vhQ5#iQoR;EMCxuqq^S;$Bz5z7V@(6Oqru9tGWVfJIt zEZ8)JWzOkHOJ$nJ;cg2mklcYYq6JRCM=u9<&WL%_X`ZDa1%q-%PC4;LFSRTS3u}uH zRNf>8t#&?Tl`QLTV)M{UY)K|(s6o=x2C>Br2c@%!8T9R`8yH3Nd4u0HLnSDiX-m&FzpYQj#pkx^@YU=mt>fEf})A=9lWBagXp>M699^vVw|NbxkT$e8kTFBsc zZi^f1WPSVelc%58w{76Oe;dX=W7Z-fOj!xZ$c`4cBT%Cw;^qhgAwt1SqMAS`k~1u+ z$UJ>uh|g56WaLwdu!0UqV44;kLv^6%uKT%7G55x|BrOnt^u+E?ITBZqA^rkoH!$) z@TCQvIV!gtSTB=1({qdg1S}38Gf2o2GS(;LGxH0K!a?^Sy$#}Xi^@qxX6w(aZKU#u zfWUdqIaJ}CbF|T%hpMQ;AF!PIv{hNA%!g4|kQ6czxtZ+Z3_p*sp%Cy-;{pRg|X^vUCknWg{nqho%2s=BxS$>*Q* zqnoJ>!f(1)>jlY)nmhcal7+Rpnl?OC2|dyxt<*RUOHtM*-k4o$C~+ap7OO=4TPH%N z+t|6H8UtG1+^6|aH59G0I0f@KO?CoVh7&onk_wwM%e12&#EEB^hvhg9R`DQ$aUz=L z@OQFGW_}Z$w4D!>gpzR_7!oXrZQH7zroT!x$YXSvh={{?Qm3WIRY9MG60Z*C`ULkS zfel-I^>o_LKktj7i%!fYSU>&256aCI(Qn?LA)^Q#AOJ~3K~!cg616qq-=(tBC_ujJAO%;n{#}~lfh&H6``f_+uPf*@7u?Xi1vN| z{{8!USrB$itE1?~s>|@Psx0erMfRZwR|!pX_Q}k^`!xW~U+7PpZ_e$_Z1qwiqC(rY z-EQCi^FROda=GmLzAWP(|M4GT;jY)~-~RSDB!|JT5R~jm$kN5BgrvZFH&N7TGM>O? zvtB~PBJ%O^@$K8Xjz!-F^XW1%vvpmGl*j;FZ4w+Gu{`IYGQ3)Bk0BlaeP#n?_<{EQ zxZOV7oru8`^rUl-*4EF~&Phc`U-fzPVcya$|NP&A_pUh^*zYgC++#;<{cqz#q^v{Jn%K zqTKy5A!2L3ADbth&b4!r-4q;wj}X4$GT|7p8aB+xXEz{l=s*k}HrVb& zgbJH7vV9@+^+K)A4{*Oi8#w)HKm)=A0!~96sN+?Rves&1sWamJuJ;L_dui{w<6VUhsB@^jHtnuU;ms zFX8%0tF?M`@$j=3nD!~2BCB@^-#uz6N`8q|sKe*%#dm^NG#>6-N2=e+;`K>vIP--SEbs3GHKaA~J zd|KzJv-JycfV`d`8Fk$G?B@~pI4J89MsGilF>o&h>pf%-Pe5~Fn)z{3 zc(OS~<3x8epRv`%;K$uR2xR8Xl$Syqe+77yzHch3Dladu*ncuJvhJR=o)cJX zkXG4!_NU8A;5o@HoQf=CVPSGB0_qZ7PHfZ-K&_xL#u&>OgU)0xP(T3Om^XIbrX_ga zcQ`L=T1OJDjWL!5yb)RiWJu!_8H^`M6d}d@;rBE2~O6LoctL?iTOf!TGAg`73Do8w8F==uXcCf zNHaqMiD&J0X>7?hq+L08Jzp!utH~BKGwV=<3nZImW8Z~a{rc;-ax0qIv@;h_G8@4% zU&0g0j1fq;^g|!UzHHqisiy9SieFH|ass@w2m}mLgr#ReN^lyu&{0N65k};Wg1Ibq z#~HGuNT|1jw3!b?7U%&A*Gy*_{bbTFSfno4@>D}I2v+$Hu= zOH+TM{_5iWJIC}v?&^zv`_;ewtt0#A`fvaIKWp=6$<#2D!KVg=+b*GQsGzhzay`@& z_Vr&P=xuM&<-3l-HJO=-%i=P&$L=BwsaWpyDlueVnbFTY)+ezy`c^NeqX;-SJ_}iV2!U>rM3lk!oa`DOYmVU>=lYi( zW$sC`^UMv*eM-vg$M+APfCw>Lbg^b4;3TFk-IZ!{G8W`q*4fOhNK3i3GN%d# zjbUc@?Y^U@(djJ<6p|iaB_?!RCg$~WiNNb8HYLxF&nSOJNlnYZ31?p6o_*i3K+Glv ze(r~pAsT?C8Zk-+W&j%ym0t35|8Uadd&A0<`-(c!{p6lBv(9SX$5ui3mNFa)K83a- z=`qxqnmM!K&8b&gEky}l-jx^pWoDLYwp7^&xx>kzb0Naw%7L`kW~MGj4eUa^t4_$$ ze_x0bShKcRwQ4vqpC@|jwlYr0AjZcJnV5kiZ?~Jx)5XZl$c`xNuGwb@98BF7*Pq=k z*VNRc%p}#~=6(wp5OObgZ)S7avMd}s8Jkf%Xw(`kK_vQquU@q@>e8M&qBJ7zUhalx zbJkz|VY^lBKP-u&9~sB~N$Ju)GW6(utDn@0sH<>`+?FbSx@dlKUhWCiJstVad%;#KP>5=K!jM=YY0`$Db6(Z^+0 z7s9w$sa*ia$T13^7iu6Pe1+F|N39v-`_9mV)IZD7dD&B zu0vSmdbt84zP`SC@)&d20TJPCJ7z?kmP`Y~1Pb=k#7yGT?S8-Q#{o)0jL9@xuUD{~ zUf*6{-d-=4%QU;)@3-xqvcY3rRmXCxV}v2WY`e!t!BA0HoZ)09v(e>tk5W{mt$NOJW1 z;_?!TsE`N?uj>V<$ZV=AqY+ckWwNRwPqdQTn0dc%sIQymL~JuWk+F8$#+AU~Ktx1i zXym*OT`$p#8J!h1a}9AM{9cq$5^-?s1XRbeu0%AG8jy*YY1P3QJmK1Dqx@OK=1g{C zwi#NHqwX-mm#=Rx*XwnRLGDBK<@Gw2o-1ePSuGg1!y*Sx4Bc?HijsdHf z5FGmaq|`p)0<%Zwp%fH%CLuS=a-Wf-v2VM(rQ`5SC#~rYjjcN8yxnf__jmhZ;a5gp zAaC1-dh@8xX3mWdkPwxL!M6YfL$v}ip@W*uDroD)XIzJw9rIv9Zn2{RXAG?{h7%iE z&aD)jDrYCg3Ogq!5*5%DJJWGYCs!3B9z(&|L%xDMy^{ZD^d!N! zLAOwq0|Fy>6b98Sm;T}09YwttG)HRChZYibpZ)dwI1gZgnq;4e$5p2M>GgnT9xq*Q zI)sSjSry#1$)iX2dl$8tjbG`J!u08qbpdOU2&&!yxEyC=qZ~X{B{J1$F6S9QiDY(^ z!bBygjH z?Rg*B+8)K{5Wet&h-BQI zUM`o*82Zzfw}1GDpAMTWye!MIMEx~0Eg9`vmQ{rB_f1tPlLSBt%>?ca9b;r2M!4Tp zm4wDv_I>~U@iBwAKvajQj&;?c$2^v0d3}5R?|=O7|MWlp>FxbZ$5__&{r!C`ixY|J z>&tb$T;Tp06-{sZKziJgQdD+7>>E#$gGwS%{LF%9#|-Z2AnY(^hJrulQ6X&4{bYLM zNVAwgM8;UgvWP076hK8(#QkAHl9eWgS;l%=fc8n;UG@`!S#C+yS!7P$?~OOh~K z5);PSZ-H-VIcNVrWAE1FNRDF-;zGJhipZ?$sh*j&p2xlZ|Nk@(+dVVgnQ@Waodovb z5O6B8KeLsUl_?_>a(5C04sHiSRk~p=CNqn0>rF(LrLN0zxm;>pw{1K2gCgXNH@Dl> z-H8dKPw=%YNu$P@>&sS{0VUnLf!y)jR-8DG+^8^P33z0O&YCEWV$jgW=NKfLMj)nO z(69w1X9Hp~U6 zNOv<6=5@VjjCCcV7-S{j{s zK(`EPK%|Lh^bXxgAw|ySKI0g9F`3?Dja37wXIeF34Ye5+^u8Ce_xI6z;{$^ptPvFvxmZjb~H0dlu{%hhp zexCmvv|(`|@rgXNvqLo(ww#eyKbvOo24^#L&RC`HBUn2pHS*A&lExDBL3sc?x9b!+ zVRTfx`?4&h=&~-Na=l!ZS|j}`$8iYr_ix`G+a?1c6SLp%4eu6n7S1q@f`saWBw{6>h{P@vYUn+^{x?WWEa=E}F0>}LM z&wu{QU;g6mm;&E>Klc5<{_DT)AMZbZ{`m3Z2Q#(N7;8IW z>s)h#EvPm7cz`5IDWYd}lZc=KVYV_HJsc9n21F!8+tG1ih?saJUbGD6qZAcbu4GZ2 zo#}jJ+}N@#_`^{k7^*l`XeRV2u<5f+w8vw6JT@q$bzMamRzO@t1oFu`T0fbkEDJ@0 z`JB6t#~hqNfRBBe&`8fgpD=L{!U4)L?25wZt#D!)d2# zt;{hmt#x-|ArQ16xzUaxFu-y!ZT7@|&Cs8*1@m6WWDuW#SK2I4!8m9u&hR%81zBw> zkO>hcETLy^uP>L#Wz3RXsG1&a_!L2wyr231G-bnoHRbc`3nX~5$VQ-2{Bm03&^^VK zzFhsEUV>=09Z$Hf{Q7B+cx2Xdq=?He^!H!jMXq3e+vIF1GsA;SfHLojy9+DHSyhSZ zpK&cB879T579lPoD$G#3$hnuosy^zynwILl!C8xYwBDTy3kmb^4cr}B(E(P-2n9<_ zW^TQco@JvWzG#z>J->j*2%(#2NfMD}XPb_>6P+q1nXK|&bCoawFfW(CqM$TGrYWN6 zd23HNZ4(wCxzh$)UdwG$D8VVOt&jllYZ$L9o&AwbC| zPAKj%DX|Y_m zEWJY1) zxs~y-v$hAm#PSTA$0KVwE5K8~#OZ_7WyE5()+nn5u(PSQKD)fr1f(f3GY=|92}qsR z%fmWQ;Jl2mQgqhi61l3g0>qcVvJCshEFwp5tU;rOo_ZDQIcN~93v6d9om3zB05qwjU+*aw7w0X7LqivEc!z1Uw2T!g zF=0Yu1_=Wfh!i38+!QTLPHrl~KtCu|;9hBIBFBCRm);H^u!tCe4plDVW-Owmkd3?@ z8pehgx$(2@QB`psZnrQ8aaSsrSi_tFMeYW?o%;6)%=ySo=LY+;*ySn(q4g86qf~{@ zx_jQ^S&h=ObP}Hh1}Pk=ZlZL9zFh9hY5DT~h$W8XfH2V@sk32gM1`Tpk6{K#M$ZgCW*&dJH%FF9(@BQuVLsk26Q0Fte=UnS(RRP*SA`A-w)$i`# zzJL4t_;`DJBcf*A$YnI&jAkIL|Ns2Y|J?8QEOla{`{(`R&4Wz2X zw26Rq8r2jcgbd(P${&CFlZgEI@gtX=hjGXO*OKWU2Zong0!ZJEbuu%k~itDA}D13a(yCfneio zI&z@BXY|ykG=)bhmWYxrek?^^w6MtNFIH7@LXS4iI8D*|?D?<&m-rJ4K8+tgemqGR zi+lR~lq8y1%((;;B9Ukbw2^03qC4``>$0?N`;kpEVrC_Hf{?1h>e0wJvrjlOt57mp zq|uP%euj9Cqix5IcEIqrotaS)j*z@Yfvg8|>b)xp!ULxsZIe>#vbcNimisuOZhFS> zJbV>M2+lqp0onHiB(umR?HW%hlvFQnXFGrXu)CO<5bN`=QfAD|*m@m+BC4iuIxkm#fKCtijQyZ|lOnQc>0nNQ-VAob1RzndK}d9e5mtYWoaX~_c*b$h>`;^xl^?jx z@#mwN2EaY1GBUFhXQ@lG?u6Tjf)%3PJ4z4`*h7<%hum>Qm{XEb_cj_iRMR$N`)aL- zJ6^BX+wE3sS=Ne9mh10AAOHBr-~RTu|NPJY z{M+CD_WAjlW|f##GOIKy0F&C~BskKC%Lo^8U2u5Sdc}~(xpg)uk zjiGrSk+WLX%jH_Mk}xZ`-nYjCfoBiiIMo8IY%z;6^-PIbd=|;djP$@-qY;ZE43MZX zaXfODM1*K1_Hi_;2LD{G6+KBgV-VkSyWL)1Uh=%)x$;^XtbrlJV%~*$yKj3tM$7zh zfL@~afd-aZmu1y?1M`q^Z*oP2A@>XIP%&&5L zxm=LUwdXvSOnsTTp}qH{i~6VLs`sW7O)0|Lr(KvLpz~GQH2hFiJ@OKX&(fCT@Z-Z{ zuR|5M2R{XibwkICs=8CMtYg>GLjd68n2?^P4HETuJiw$F6&*mRQ}-@Br3p-o{I}C)SkYwc`5uux{)QY(>0lx+dMDLyW?53X$6T~}rp|ze*vG4n1-(bGW z#6k}lcsw3B6uAE^(8o?i#eW(LA`w;H_gz%c{s<*6s@+UWY2ApW#Vm3URP8apsz=9n zqV4(RQ8ek{$XU$LI$Lliq&_~=tsMuh0t*h^+gdZ!?GPQU^&`mk%|I8DO|fHF#+;N< zj_IRLlv?kA1w@ScJ8U^DuZ$UTF$9=K^2(>o9*x1y!{SFdD@EkR8C85!Ce+8cV0NM` z$fl`Wc$o4j6Zqv#TGC&Cl_&8FY8R1`Kb@oWv%dS18=4iteC_$di8XPSWQsw`kgPM} zm^Z{R{hcFR90?AtwIaJ+bZ}1yfu?~~#m&Uk&4@dZv-v6_BHOkr3mvW25g8)E0MOBo z*1Dku$DKz)iU(<;kV}Nz-QCQMUHE+Jg!wa8#vAyl8r)s;XA+GO5vq3+fC5fY#1B%j z^nM2X=e@|Ua;7Byut@jBj+|Fal{aJs0D{SbSu?_c1a|k_Zu;ewyE*@Me4a?ksOlRL zkc75lrVtRJo!^h18#K5x3uzlb5`RbygSQb}aKoAj;KcBz+AR`+{vZoMtbku)^lzI_AO#rpsLr{913{r9C- zB$q$l-`;-yM3?c)?N&s<%r!ge= z)Fw|7>qI=zFr#gbn24G?F{^VN>bZl&M~9qPGhhy47FIbL9Q32s3z7FOt@Z9L9J~Mk zAOJ~3K~%_X4&f)Tmot+{JNjcgj`n`(S5>XcDyl{6er%K)HX=q8H9)Wpk#HX`)Uov_ zV(TZl;0at(w&5foJ_PRq|J=3>M!MFzAFZ2{bz^$_{Ag|%-FUPnEX_KL)Kd3$w2!_l zOIa4%w{>0U{_rr6NTj9)@7B$FqkbGa@1s&vN4;!g8cp%cB<$DA(ya8}MMpBd_g;gB zCJ$^vq8!nX78|F~l#GIiN;Xi6rDoFahL&kX~xS6e^wApyDT| z?;81%VMnsif80RQK7?vbKZHdx$Q0ESr?!*{mCk}~m}gBc!q&$qFCW!=V`5M~V4B6D z!KVz8J!ima%6GS;Nq7r{>VdF^DVz~9N7Gv^RaLbv=+hH3Iobe27=cL6$XW<$0LaZ9 zQWQ}b!Zx8`CT+CMA?E_D@J@&3`(82M}{2{joyc9GO|pf`)Er0YL!GBOeY}sBO;V;f04{nzd>uUhz#rB zL8PEcgKiE*vFv6VYR%0hh-D;dV`g+@Q=sknF`1{iSv6=>JN(mGd9u?WRvTZ`haj^WD!6OxdzM zMVp0L16le+pp|G+b(F|>Oc$W2Y||0Ir&3BFi!LHs>qsZJ?q=j8-eOv~*4#;iMG9J5C=yJ#gh!-` znG<pqqw$QHooOywWjgCWR8@-*c=4hP zZe1@>k(g;zN`WAhT1qMFy5a;}FU!lzjfsFcipmls;p@8gK8hTK1!FLv2#P97h=Q8Y z1G1RAm#P$ptAX&DIXHoWHed8;-QBL&E38E~`}p`EqHWvm_xrbR-;nSEn)&(m^M5;z z-@bn*A{G7l_VexSr;4`L_T%X8bzNUxUzcS$dawWZ$K`q@k?rviBgeqRv*mGYY5pX& zQWb35IZ3vC*F^SRT5#dkv`kD?KpO50~kfj z;CA=`BKy&f_MxhvVL)4}S;H)A7WJvKAwA~V0n?yK!meQlEylXcFApdQGqCUbvMdM@ zA+L&8DW#eBJ^)0X$Nf0AZ4)q7s;cUai7BdDbd}4pEQJMI2?qeWE~YQizCZT;=)J2l z7-CQm$;{+|=6UQ&QOO}mz4v|JZr6(jb87m)iDnRu>rslsQ9IRpUzSL(6S+4c7Z&Cr z89Mcdq$1+Toh9d@PyL#+jlk_;t@>1C#xYCU;hDq>;+bmLY}6gi(J3MtvJ}sYTS6cs z2i2rzNTq~N>X^RELk%(!(fxjB-9S81b6qSCSv4{%!G?X`6h=C!yHp^?F?`PK6fF8Gn2nMoq<>)8Vw0g*egx& zxbsPmanQQwcKDg0R_kZd`AOF?p}n(~Dk8Am=>Uk0X0`OD5DA`7#4IX#iP>=HJ@;Qq zA@fwukSu@oPk%oD%01Jk17_rfay_&8G7b8gNV@c#mu!-9#fKSsf#e9SjM__ zMEF(Q{UA2!y*F`f8;Af#JN{4|@P?vrn`7j|P+-%hA`S&Pqwt$00voYV>?9LFKO=>r z(vGulZr=VctD53iP9~9|c11L20*$jB1%;}*uB%0|HIxxgn?=Ylj+2(M;T+B4L!WXe z%6XUbC-X6wCBYfFQAemf@gj!M2(g>t{rD4LNb_JiWOu^U7R=O+;N^fl5e_{F$wbik`19w_`{#BXhn5xdY}R!pqGhR<%SD(T_xqpz^rzo{|NZUl?f&t8 z>^lk;zrDViw|(C~KR{B)@@DwASyaJkmdyE@YP661n6dR=F%2D~Dw`_YzVd3}9# z_ifwAJIW$IK0cTkflqAi^>)3zydW?CdV9IuF8KMntjOB@*MI#Ns{LAPKYsqaKOV<% z5OdK%NR(1K?eD2f&723BQrxDnpM7{E!aPJ*h0Z=)@4fkGt`s6#mU6w_L_(N}M6`F? zw(U4JjQPoNAP9G5b)&n3=;JsJX6^kTr&5*KYsGL&nHd$#ouWb`mp4~FkC4-SqL;R+I zM;}T25wA)+mvI3Yq*;11GQm^#QlI)&C9>WoO04m zod#vL;t88Lph>1~kjfmeCZe-Yp+&3Ikt>Ju;DMy`F_}*rY*S}6$K3O@%@kt{#~o7W zK6F(wA)244IgN4-4a!40mc`kP!agbry=S!K*&`+Ag7m2cmILPE&;bm!))QM~OG+}3 zWQRCKP;IQFu#l!Qk*NV+6`Y!JMP@grvq=C_cOG7zT2d&I^}ymD_>!lR*|b487a3tq zOWKacnV1^uPi*W?Or4@W3{IV7W3dV=Q50AMO@df1W3ecG$s6EcqRkV5TT0qQoUCl* z%0KMS!VbCh>Di|)LfxQL9b)I=>W*#Mso}@^D6>N~Zy1`jvA`u?o4|N-asBZ7S zlEjXHVua0y3S|rWpY9-x<*20eZr(?ho1CnB64)@dYAj6hg#yKrM;Zbpe+&<#jCt0B z3gnMJ{&?ITA0MBkC^PN*e!JZ+mz76N1ql~o`uO;`-7ek{Kf@4|<8ocUfBU{J*PlOr zwszE7dus|t6=q;TRdwOLLkzU{E};v~@I#!n9%M9mcE}x&rMGTIy|sNmw#UX{50<53 zMvuFfqPN>siyp1v5VhX!k2^VGRJX|B7IyN-_Gm}DENjuSuItf`f#%zo7esXOK+%}~ z%tNstDW@aO04aogYSB8ToGlSBE*rMTPCTuULRecLf*u9TuW z`03qjT~{rd5I-#?RyYe2p|4uEQfh0>x^acVqoT!&nRn=TVTEes$>&I;07HeSYFf(K zOr%Qm$dyZ!Jcm^%20yfDsVF-bsVUI*g1cSR7 ziK60%G3{)q7k77JoE;KXkBLx_3>G2lDL-@2Ze3S!c?ye@_tx;`10b5g5g;Nrq-7zw zOd^;IAs`+ar12x|4t=N?Z_%BEwUl98$9vlMO|{_kVFfPrIucMm+&>v}90)P1qaE9} z_io_6J%eP-92Lf>-iAY-uOrUIqDx{pGaC*i9k{3nlaom8y+u*J(^DMr6etd?$$S>B z^nS1~%TwAn-{ZQt&yhh5tY+>GzIh)1W{@(2H^ARh=Oa7kK%_3G5xtXb->msKc28}K0BP&jyVwuCy#A@(p^$;&6(NbS9wVL zS!-w6txpq1_o+kU%WCJ{&bOL3ssGRa^?%TLKWEg0e@R;>F3y{q@wkU8Mnps7Bmu98 z2qX8QqGg~%07X?*QK?mlX)caT968>Usxh5bSX5L+i-LF#JIkdMVX3v2T8Kw>3_(v6 z!?xa?sF{t~1KH{bl;f0?1VoPZE?{9LRv|Z7-}m=4=*DEQ^?K+{Vy#!Wnu*kzwy0MZQcj$kK?7MnNu%8gR1H zG|rkMj~qq2KD4Wk#4(P2*8H+LnGN=z?v!_wf;609B6I6z&gRTn=IBJdjb(3r=vMTY z`bd$u6B|*-yu@co6Gj+JFfV|HhmCo0qD8gnWz5m8m}Da&hpX!L1a+ru zm;yJQRGGMxvedO`UDj1qYSovQTdf5Q;oG+D$MM*<$K&zXwo(g-(Ytk3 z#lYbG*xPaR-n5ML9X2XjVRDG2!<`zH3*;(N6rB@{CYz#KYY~z4vfv~lL?WVs(gAav zzPc>6F70Ud`{USmw=tSrMV57~b^Z43+x2?YG@WHs8{hZ!p+IqWDH2>uaEcU%;{HWj z+}+)wxI+o?i6<^_RQ~D>z|id^J0>9XU@In?ETrj9fOVYw5JQ1w~@y< zuJ;^c8Opl0)e2fSwF?q`V*_gVf>X?;<+BP?-V4b9`sG@KnP4^8XkW#wU)XD2jnx`Z z@NGF5c_3!W9{ZTxPlmAjVQ?yIjaDx-)WlSZL8ScSAWy&xYES(K(wf@ZC-tRfA`9cK z1uPGOUwqv7>S72)Ul&V&4TAyXi(JA>+`Lu82K^NMq2kA*fg+ z*&n8>#g&zgp>A==G$Cs%E!`yX`8XnvTeM`S3 zSz&^?AxtP@uCyS;sbPDs%H0BQ(*7|pR;xavHe;oGMUnb6-g&7(9GWe=bXt_pG3heZ zPjRNIcSDSTN?Of0Nj){nwjy+CI@@%niaaTcJf@t8sC~`h__hy3C*LnLX!(gHZWZ&L zk+MUP3ib953)gm1ULG*HiB2yUC(l6e8*5(J5pWSsmI4!oq;f91S40sSy@y2gEWAtL zMx<|0T?+2O<8)ZQ{~P5?ueh;EIgXH}%J$Kx1E(Gzp~PLaWb-}O8kSU;dv?ydYdwHqKS)^d;o~fLZ z)Kr{GioCdAAtOMo{1bsfBgcI zWPn(BAmFSKId43X!h|gN4$qsPke!caMA5rgkJNy?T7ff&ZG8K1{}6eFS{;5D2p|Mx z@&Q>&_{MfQ zw?|A?J40#5%HjqKE2l7)>6WM znQ%A557WO*^^83w2#5k=m|V;)O|@%=oN+trJF`k_plMpSk zdBY-W)W!V(JrSP>?V;@eZHEiZ;_v!$s!TJy>9dhOxpN`k2``v6r%Y4-Ji1XdWeR+> z6#8KD=Yhqf20hn>lZv=)#qD@W&#CmHPC- z8{<8^tQVf;tZdmpPq>01=YRaTxE;UMX<-|Q4$~tmi0*yQ*`U6T=_r>-EwnF=6aK4O z)r2<|JZafQg-m-_*1s9X30$nUbv;c`XTsW~r565WT%|^bGPqCc#iWB}(z`yyoy@!p zggi33zU)<1GO?5n91mvEug}XcAc{GG)Ha$F9vJP%$&FLno(8In!F2e{ zUXrR;7rfC8by#_y;`(dj+t;r(iwd@<*VorR&{tr=0of5iU^MWd)iw)Gm=OK^IVKj3 zgj+w9djlpaDyr%iwPePDbZKOTpR{ti(6Zo5)$XBnc-GX+g(-xKYpDEVA6U4rFRckv zt!(s~K-~l!g6|3w7ZQp-I66A!<^7L{ud8|U_~;Ea(ESULM3^Qsw_aStQ9y6&&F z)xPhX!wM31jK0Fyt_V5TC*jvzXzk=TQa2ZGm~+FBhh+|=aC|AvlR6|qTe0Ua-F2Ph zX-vI=sV5lTamsQ)dW)5##K>~(1-PC6kqSiA!wwJM6>9wkhE*tZ(FbCK5>iimAj$iu zoD99s>Z~9Yd8sb|lX0O=>2Kc6`Y1Ba=%L)1+;I^l?!ER8wIDN#wNn%yYP6V0#w#nA zPrUui(!%5YE%qfN%-;)K>n$D+tbORNuHd#^hw5YlB@=RW?ZitzB+bio+%>(VMo&T_ z@@n-&xH3i~nPnSDVVHZAu4&xiQN}vvm)W_G(W$igb-SJUz6vjX7c}D-{KIfXlbJ75Gh=6{{_pzr z0;+}HU9(UUCgXb5LBMchm7rrdlxcrlu z79Rp_L3#cK%Fc|>`9w!6uGqGvr5xfa&XGlR^VmtOj%`r&YFgFr(19YJfiI9XYt4r^ zSX%v401usm7qyh$;cm(N=Zk$ZdML5TTv+euxB1l1eYOF zC#w2p+)9uoX}^VBhKZ5Kl!^83@5qtfe7ZF#zF>WOK_(&VL3v*Pi9FQ>0>KVk{^ah5 zBkI!JQr1tXbh2B-SD)Dke$s$qQC9a{aDTImDSuqdx~*ZWZPge0Gd^C;6zB_$8tF)N zf82)xbx%YTcuv28={?LOgwO)pJ`C@ymA0b|97i7d%1@zfV;`_4nj`J1(vp&vDgs2H+oOU_;&&uNlopVgyW`B%U zB3#&`xMN%AukP-5VSp0PVIdbe#pu|vb*07rX`QLCxVm{AgX@>Q{&A5odIpU4H3>`` z^(6|`L=((8E#2;dTkt}CvukV2ZCWsHj@0GkX(5~CBx%0qmf|hv9qqcirG%Lmgqomg z>u)oXBdlZLIFV9BK1`RiAjctnNZ&h5>>f<~%7-w;-85^3Fh+K{BhVwiBUO_9-`^Lu z>0++zeqkvxLS11t+`(_R%h}^np&!M6LyUzfz>sZy_V;tP%+0Chh6)v8twiGDMh;RI zP7BE&=Bg~Uzti#wALz`*G8l+Cqa-W4YVt1POQa<&zEUK9B5bZRHKCx{itlQsvmyQB zczi)^F1H7Zck9F!pvnj;5CME&$rjwn|NJNuCoCxXOJ(uD1^rq^pWuN5u_r~ire=o#e z+No*0Vgk+0g zNX@i1=-S>{X3fLjg8yXE^Pfr2&eBLmTQ#^1c7!MH&Vjr$K-gaoOa-TYU~+$6OC z8kpH6?M_6=T>!;qY!diwdKJ|J*BGfwd~bT5hdLe)hwuiC(-bDmMa)NJjUg6#5ibd1 zkyB8>VjUw}C!lU)6Pu)UCznh0bFx4TeqX@BB2OcdJ+XC$pUNXNn&BM2m0H9cX@W-| zC;W8yI%GN7^*%waSSYEzBAvwqR|(#y4mZ!y;={|I-CX78j+%two$H0=UJKLMrjlLivY_C?6vqV|);)3B?y~K7?FDt>?#rI!-G!vad ze}CF{HQYL9)NY9l%I3eY|f?bLW=OxSs@+f69!Xem_wO9W9 zPo`72j7?pG{_q~IDoT4!;>L>UOikcd>=p&BHvBpNFTO3ZSGw!a#5lF4ARDx#!8Mr! zOnYd`Q~kMADsAN@3)tY&qtm_7euG)2@q!@br#rYP5{I_*fzuWc`uP?_uP!(@f!-0t zY{m-D*>fio;cAIT90@3D63J{}$R9^AgIp|*K6KMpptw!S%?J}^G%Sg0y$0lf{nYXYHGwP{9g|S=js=%x&njQK`NrefjGY`4F zv)TVh_hyVyhNejUOZs1j8FU@XE7-jQ8^iXps@D6V5~dQHbcMa}g<#rX=b_YLrlqi0 zc$^q{@#B_5l=}Q;2GMLni~he`6=RJ5shUV#l`HmtmVG;yJIN0vEf{l7mX<1JbYa|P zo=LO>0P#xRZdDn&vZ3`(XrhzY+$IleMF#YQR(g?|%VGOMp>pwGsR;k}xbDlLM>BCJ zGmq}4&>(KK^y((kk3!v1_fa&}cWSLJ+DTIT?7m%wK!P!CBiwHOhU|)56O`OL`;gL) zJH+=k3ry=^Y407{mw|gDCCcV9jwDZ%bNt*aEz8mVPYYm=T^k82tXj{Jb~=+xO$mvL z99<2k=!%79vl~?N-b@I1Gyl7C(SW&uF+A%R7k`-9Ew^A+x1q$bjbC{QZ@zhDmjL2V z#rY>JQ%CXk%w?V_7Ax{=$L_#D@d}fbKlSGxZc))tfIjy2knjcv25e=Y|A-q`WB*xk z&Zka}j2V@ZbpcZ2`*!?>+onbg_v%ftel9RjKh65|f(!w`KOR z_9GnWQ#bA*Tcl=5^VvZ42iK;YNMArtrCZ?y;qnPHyRTXnF8sL6Ds~N*%uL>&^m+^} zB1?vp2w(0n%xCb@b$cKtYHo3Nb#-MdzXU8A?IT=-Jd`}4sRJEimKkMAsWJrhX-M!D zMje=2RoPZ4W3ib}sONnGrxhVzqjIs!0-MEQ>mbH)6>>g`fVl}B6{M_%2KE|(IYwcd z8A{qX*-)(E>GUdG_16f>WDb)-BXr~9-R68pkiK1T1}HvWQ|7aSh7_=i5S6u z5XtAvUJ|1TQAZqc)Ou3vO@9_jfVGx6p;DMwPfqnCmAB{Lw6$I%ta7>fC1W z^7tatrS1fx1D(;V577ndDK#5#5OW6#pH=f(ROH8G{^Rr-GgJ;LEzuNPwEjTCZ(OKy zf;^Y^S(;S^T|${o#a9HBBLJv^;YIQ(PtYouW-;QZCph0R|5qMNYPK(mgH@Ujre<@# znd6izO?;t*784k1qr_#9lGXV=gVG57(t^9TvSHJL=iYoTT))GLVX%bs1N4t(cIvv1 zb6rm}P5jwl*8$5&Qlx?47Gy$bWU3k=)0(1^bn$csv82=$dS~Ac%PkVxWSf+cxDkeb zFW0p&y<>Ae?CbxodGI^|>C6UPAP*Rhantmktgb4xP&%WRtQw|nOGp#d4Ozg7twfkl zgqy7K!(Fl*QmTx8wt1Dz7#1|J7lN z!K>)x`q`N{&2ud1+XNvQOd^6#AT&NX84o2SzKSs#3h)lVqI-hfEZCzrg=N!p^g6v| z)q#9sbZ&;`Vy&zanhjM0KGDRl>XhS2a3ML8Oa98%7*)e42nn)03{h}&Lz1Z1dgzS= z_Yq@iCMvU3=mDV8_YWr-R0!YZCT7@&2M9F9Eiu0x75OQW6LP;BHh7gCu5Qb7+_ckUa=$Jh z-+iTd$Alz#b$l?D=e2V->|6!VPg!wa?p7RoSj&|tNHQxsY31Jc3FCPjsFQdu=}$Q< zs5ua$L3uqruN|Q6%X8YOcp;)%=6vHjIPcPl$@n&;xDM5S=fe}%U?Oi!#K-cZ$$B)q4g?RrB-c0nFWw^ln zp@D<>+cu&FS3c5x zXBNsEkLmA{fG<*98O=A?L5yS}Cm?#G|N$2m&lW#8Oe9jBEHRi@KczuL0Zbh6dq-I$W969R?^!a`; zvH#a?xxeW@E}0VqE6NO#u{^MvB7<-zl+rG7lPgLJ4=YO4O{Jqc1@F1+$(ka|Dl)r$ zz6d>dCk69Wrr_odzQ;yKdSf-`{%p<2UQ>+4&Heo>u7S8sWsU48b}h%h?g7Tvv?l&d3EJ`&t;rV1|W5_ITb7hNP_V0Q+Bvo%){PHs*NS=EzRk~w&J-(>G zaQTZ4w;Mk*S)7S_lwJf2$ihUXI`kpH%vd9AmHnCkwIvd4`DZP~joQrblbMWj&l=1x zktoMap=ek`7F*U~*A8P9+OIDZ@5-C2_Md<{u5;$s_FRkoFRLLK1R-iqiWci+Ui7`6M$cvl?ZS2<0&mZVkXJ#LXNrh;p$8W#WC)oUk~SWZiIr>$ z=A>Kw;~i+Oj@5@K^k>SgEB_;;E!}MdJiU^PVi9dumfU}piXr0s7F%z$)^Y2<(K@{2 z1FadqdK4tHp#MkM0Ovfyf{x5?pVZ~*PIHt1J%vpZA=PzfEY z2fq4E!I2=N^KjqqjC7BfGn@CyY30-}67N~fC}sb_ZZ1A!BzFkG1DPnXbZ_m`r@vE5 zLX&Z)o*L_u>yGuNYdx;ETE2%;$j(_bbGSRZ#4X_^f>Hw#lApT_j=qv{d_(vb%-QzT zt#O`Xgr!Em@4&ZoBC;LseNj*Fr9~dmR=mXQp5v$dIXhmXsh;Qght1#+1YY(zJ7?zS zYdif%lRS&35ZOs0cYf7EkUm+ zaSo|USul605}=aR`tE&$U%FeLxi{u-Mm$GHBm9omeT-6LfMmH;b&}1?;v2fnb(+## zKbz?Hspr3WHWqBKROU{24ur>GjsytknJY*De%l2lB&#velQ=EFEW_J?sT^6vw0JEx zcabGji5lOo`Zkil+i5URFsl);ZYiXDP0<>-uYVc2`@x@!HT3op_{!;D+v zpw#@csN7k{El18zvsn(;LQ7X0XGU#Sl4G2OrXuLKob)IPj!VE7`Clr3SVWAv;J!2y z;C->o%#d#W9=t*6nT?NV$}1G*OyJ)nT~Po;4lr^w zz5|@OMNQILKg`wGkIi>8A`d;FTezGex;x>e`}V%iuTPF=Eo_9n3Lse^s+;l#?GL;wj_Ox-HcW?UHM9{qBngmB4%R$hBqmsT- zs7|^tmZ(s3gDKKam{R2Z_nterMEI}s9n^hL`;{kv>^?jUV6%4W*Ul3b$e#5OnXgm7 zP{66F#cpY!D)STlE@S~eGgx%{sxmg96@3fbpdvj&;m_%JWCKpYtt*%)5$~~M;E@=% z;gcp#Jy=VCdC)6x?k?;ytafo(;A4}jOT@fB(a$u6@Nez@8 zu@bL17+DiJQrE~AUl!?Owlc$!dsyJJOX z`79wt+k=gCywXj}@#g)Db|Lqm+M3Dp`#)P*Qz}>Di1(>wKAla&6wE;e ztw~nehKugHKh#;k(yJO0r|6BF-V-wQyjAvp&J3JD5=sYhu}$gWU;^IvC8_4RpB{qN zQlcsHNrSW4IwB)0V7{569?V*t{9^g|bsnL|0Za7-R=GMF7RRF_vE0b5p9U>vAENM& zA6suIOvj}sKgRyYg1?GvsbrW=til!8S9&(Y)yAx5A1;K-rzmO*MrtmgP2~~A-^cz; zp&fK+g?xl{Ia*gBB^BE1qnSfi=fYF>X^h;5pVAhkxv0K7+j%**lHoT7fnMI9$7@U_ ze0g!7L?QH~k&Uybud`5;I=6I;D>Gi}QZG&WYAs{VY`J;VK~hPKP66+ThL4M^bQxe{ zkw1p%B@MBo4TWQ88MI<%u+({_85-B4)TS}X>u4-D8MB2(&Y$<8x>fC-Ak(|Z!d5Gf zjRm{rLP$SJ=T(-JCGx zdn~3}LU2BTS!B^pu691$eXeNYZ-wac))gqH_IrruqPL?)=GDbpm*bf8dCQKrQ%UjZ z)d{41Xk6V4#P*pjH{_&199zllFnW;Vff48DfM+^OTzg=PEh!T_A#LkRaj<$}C7F)0 z)|^rKW8X3wRTp!UqYuijZ9gG4h^aRXKqqHg0`X(i6q<@aRIDjy+4$cnc!&jKXM@jQhfpDeJ{3vI@3yz=|_# zzWiF|#x9IodkyI&3+}--%2$?7TDhF`Q`ER#TjA~H@Ak#0b8@seiHFa>W}}(~pRuiX z-WRnKS@uqXs-!h$DH6e^g=eB6doyE|mDO2Up?=*77DdM9;T5;qQsqZ2=EHyosJWa! z)0V@vdOxwQGn9l99ALqagjcYv&N*wCf<9>Xog8mZ%xu9A2fN_QHr+jmo|#J_M9t6= zw(jd_{~u4Ckl~_MvE38Rz?cL^GMeeV2Sv3f4=wklI*VZQdRuxk2U5zgFE1Ku`s&)q;-19h zmt;8mI=1m!A6KdBLKZmN*Q=}KFBlZhY9sZUI90L6hNkc4-v4M$4I#a`P_ss3i2+!& zcrP-blKUZv@eUgrX{J!a7*1kpA^s(Co^A}17lHToM6s0I+yPb@3l2fX@#GggrO?DGyBtFEF6I5M|Nyc(t`+id9`==pYTuwH|Elt81 zZ?=9>V7dkwoCq(b>R)>oAJ#hUqoFqJR`1MQfHKp00sglziowo03G3;sq?4J265QF( z6_yY5y^4G2pW%auX5Fjb0PGCx40lJ;ON~ zCRU&KFR%Nau@9Z_VWf1Ti)J57zT$qg2Nn8J3WMf*lOmUNWlohfL);i@+_kB&dq?yE z)Suys?h{2I$s6`JdXh!|LiPkp(oVrbgLrtpHio3R-Kn5#0!H1`k3YgQq;%06+n9bj z88$WVcmT=>;#E4Ag^bDnZ2zYn0*uB${r&cO_2d5jUhyXTU`!a5Ujt zWrk%N_n81NBps&i}|R z???BZrt*NvEfpZ6QID=GUudErAPj&4C@>(6%`Mj!)E{!(tg800Va{{&oY z%C9?ajH1QWs6SP`T_(J>8`K>8^jZ}!WXZI%A3fsL?%d_mTQ!KOGDBG81Bs34y^eH( zh5NjhtgkMm5O+Y{CJtFY6+|@p@l!aw@-xyR)6L;!{8st%NFt=e zdgFe9{FIO8ADP7@fm*c6N_cg?PT7mj1~4C2C|ebjZAXQMmes zqBVDMcYIql6Mwg*>=esc2qBo+g5pJo8G=gm%kTQ_D2<3l1oTBO!;+57Q6_nf0juF- zgivpf9}T&dVZX_~ICY<APj1_VsxxGRVd`zfJO44UQ3&CPr4-&8?!^kW!P zCG$@N=PflB+1)q-`z|9sB%8Yp-)#2>UQ)uSg6TEqK@iUSMf`7*tY62z9H;o;uk$6S z$AZE^vPELS)PEG3g;-PlQdBaIjIu#VNkS9Vq+Bs>Lk|&M5PZ8W?rjvkuqLE*X~ckc zk&Rs@&LYvn%+z%a$>cUo+>-W|!sm!8%wl*SqWIiJ&Ech3hW+v$dWtR}U`{dRRfcv; ze4O3CtCQ!h;+wUBf>YLYm%lA0t3VX0I2P78oRgNYK*6T?ui3coOBzY&OC~iWgG0Wr z=8zPj=#3Fd*=~3O5tQ1Q&!iyYv>$tW*Vlj`-su)eo6i%O`y2C~M`!PWjHk!Dfpzkv zj<|I6#1qbG9rHlDmDh&{KY$D?gf2bOelI$<7$0Fm`00#Xr-L6TeDstx$=?+>3!mR0P2K~;_+ld{rm;Y zvTUC?#>?hEs;39((=bzSkH%8r;;;5l>@`Y}MQanw+l+6?>S5%Q-wEN{k!L?yI%GoB zuEJ=siQjEh&6scv1ehUAL~Lme9R0DXN_U4Q&N)*I&us2K9F_=-CkjYli^f$wH@sse zxwc`r8wC3aW5u6=Eon;C(SFuNHm9tSx$SXf!iuG?M5?wQv?e&L zVMA)2FuQ7Ch4>XhyM58bDX}L1q@q>TC6%&h#-Wx%#ekhMNbiO~!-SI5kfBNYAXwZ< zBPLysjBH}Hzg0XO=}R98mHPlJ)MOsEw5FHxmQd@d??N|PE$!@_uu0$8;p;Oc_q28L z_EyuV#FfG`C!*y|L%M~P{e4eNps~3Bdqb5X7s(dZusOVr7+C#=Kz}Ozp|{H>v~wBk zNT$MnjU~aU{=Ax#VCv!3!7N5L@u&Txu=n$`!PlKLp3+WcFCsCOsl)|4P``e? z++{&}YveGrBvl$@aLI*T5O08St;f^A;ck9;wQ?@ZDkuoQ_=+3wqb<{oig+R znJ^gNq%>!}R3Qu0lfU0kQ1CiqBwJp|%t@=MrB!>;ow+1inKhP&+mr>h;ex62%Ln-> zYE``f_4$tKalNnKeqFW#iYAy(MG0VScSumntDM1#HC(@6bK{ZPzAT^sz&vy;11&W% zBgZYL(3KX)O#-G2?>1fvoz?(w($2 zSG09HM`;w(4WlwUzc};!n1GMa&J~Vb$^* zuPe8=R&D&Zbm~FjR6^X7ONyLHK3@JDh*pC6Ukj0k+ zrTi~s=FJ3zLwEp?w%+_Fmuy4$kidItW;=^D8OfJNKObQ}+v?`EHCfF5MvFTu%@U_e z{1fb=063=hu13S2KkMh77AC>LWexK;=fjILm$)eUw*Ids2MM)&dEwA3Og zfkiVeePQ&kXzh>*>ThIuiBN>KJfsZ9Fc+dp9ychJQq7}#yEBjZQErWJG+*9k?gQ(D z$5f#s>VI`c?PUkL0^SIXu6~i_A2h%spW4`?!-a$Dx-`F%PA^wwUj4kzrPbQ={;p%Q z%0)FtFBjI>qqeVAgn)I!Ntk?23XiN?=#a>#`BK&=e_}XflodU!rG{Q~CJqKt4;#uVLL}ym)1o{ve z;$PF&rGD0gzWd&yq>yBZ>^^wQOsRcTo<=9%f#pW2$qr`e;rBDCaT3`<+l0s5=gd^7 z29dV{-vLH)l4~$7cTz%RZV(iEac-hhL`iDme1em?rT_YsS;}5KSfCJG+%&PyE!ua{I7I&1Ng&z9 z12!Y?HnB}b3~GHQ=C?{=dYH12eX1RqE7* zFeS@+FAfHkil0)VJPh7Gn;=qCIwMG)5}cOSfw-{hS|hTIRO~W5hjsKU_&3v-;#^Ag z=bcV~sJi9nDp&fXQUhlqcSGG@lHL;$3~uZ6RWU+Zr(=0b1owY*?VHx&LHJ^P$c_io zSQfuL|EmA9xg)gQWB^0h+}EtoJ|ceGThC3WL$g2>x4Bq4!ga&`$#6))}x1t zmYGJw*BAXrHMdJ&%KY!Jq^hnLHYd4yuu%k~_S-6o04clh>rK?08Zpu|Q_&eZhPt!Z^((Y$bq-2IpW({4ebqoA52CDcSd^w6=0vGewW~=wdBaT*;x1(N>Ol6`zKxqmwgJxxrZld zG$MjRqKt~;!dU+O=_fer4aRI;z^c@bu0n&U2-AUWTjqC|g^INF*@AP-mj^;h{>ZE>flYF=c1G$T&JfW&mGH7wSo}cJ3v3_kUUd#m6ar z+P;!|DWS>cV+|DrsgAolTPJp9tmON@5% zq`gvOIM{OJ>KrEddGIL1M!_4C0zy|IXkHTIeWU8Ug;5IOQ#>;u-4g=i*Yr5kTMX;B_`?F2}q!holY;9 zNyE6F(*x|>55PgNfemQaEZzHy`VTFK8z>UBeyY8K8sk>V=H*MqQ zRJPQ)tj?;O?!MCc;_++GdB~s>!hl)3-r4@aKp}%eY1%UGlPy1hu+_?{xI>Z(0PzJy?EyJYFkaJzZ?}|UpF{PgowiZec1_>0y1y{& zJ|ED*+~=39QYAEfAn2u~WLF_&8|->IG#R&4A(h*a$H(Byd>^ImK=0Ho_){`zNlhzb z(cU)5Zcf-dR83xa`{t>eyMM=V^NZ;|pI(aphCV;5aEJ<*n|o{w3O7sIb*IntVb4x0 z6S1-<4Mnq|3-LBD9!g6sa+$Bb)nVoU42`G;S#yf^yP}} z{t{o8E}e{0Pb|dU_RuUwMwbTd;YLNOgO83a!5PA9OIvguz9$cChTpKB{Q4iIx#(@o zq7x5R6ecJfy=?x0uk8qEK=-wt+rdivk6fl+E3SwkVj$w)LaD4seT1!1uUiM0*}m*o z25i4J-G>rPhio_oW5!5Dx105m)P*hPkX~$3!?*{3HDHw9Kb60K~ zUH_ysm@8pS8hsecS<4o>qKXp*vs4ezW$77~2a~3IGn>;rtQry$Fcw)%Y0L|Y^N;Z; z%_F)#oP7IAG)aX!bJ!F)dN>uib0RQ#CE^>v>|_BZ_D0iXJ0coNSNb-Ap-k245qYbs zpxoPsPY$+4lc*loaWRotVN1G{OHLUfNSSexmol4nL92RpN&`Pc-0@vE*u^ zrx<+{mVx|r-LAc_!M}A#2#Bm7>~ruBn$snqr5h_b)JugdHZSOf>q;N1`<&lD#dU!@ z-|GidheH6_KJZDLKsJhyUN@mLvc)W>6I+`l3<9wflDtWuNpVPp@6Al;-y10^^77l7 zSp@$T$x+rzH3)mRZ|t!E&8mzhI+&2_c-pDoGbXJo=IdS6%bULy@PryeOM42Lqk zP-=Y0?*rOT!0tekFmln(be6A}b;p^7`|S3BSjmjS35T|W;XEhm&-zn~YkE9qJ(?ZR z^YuL!*}0!5p%jj96qo!;X^^K z2N}Ew9(FA7zvet7W~7MH|MW)v2F(PX2^ULNzZp#Da>nm`dOUqBxpY@4pP*BCPxq1k z{_naK=erq|+PpJYxn`+`#ZsE=*OLO}vC~m{CvJl5xSw(0aoStqU#@)NJdb$RC|5&t z<-H8pF7N!Kgqeh#F;`7T5kbiJA|K%BxLIY}cZqR7CQbCRp0kP2Word;WYIGiUwXfV z2?{I2y2Fy`E%1o6j)xRsTufOR5LEqbDHutuC2ZtC-nMA>*rU@wAmF5$)LWOONP88k z$&=t}$dUraJ=(QlKN+UgIUkx>9VKtZk`^x_>RtQQVm=u3Sy}M)3qfi19yl5OXn5rLZs^ZZ?_OL|0e;V zUOJjU83FzM^`oC?-j5RP5_@vRzc9qWB#8cs{sw+OQ%M(~V!vlEp~wMmb?ca^o0)uq z=@3ls1Fw&l`WLUK404QXjpGh7_n1;5j2>Qw2t!9HIt#OfC_7zk5JU2MdFyv~u4BWH z-P!8av)#&4DaV`on$x|#J-_Z;6@a(qy5hlqw(cqm3{xq zl;Job4z5ucfMy!cG@^&D}FBcTH6Tjlzz9aio85dVvBlX z9h8Z5xO+HFjK}1$h)>;}@JY#T8S3B6%T56C3^nIXx^x;vbI zpD$6`y#1`Rm|CUc$%5vmB1ICJJMh|6Y1tO`z_}S3CkHJY+E1_n>M;I z{Fxjn+5c)>Yn&cJ*jNOinT3M2DgzMIX*wk~P0^!*q=^u_=e&&bDFsOY7IVW9EHh{sE^S6$SGj@7?zD#Plsm7l^;yI#0BLrIP@HzNP`3on@` z=;wH@nbHiYX8pCBKBS_um@R{ZNzJdozjZL0mPg7l;xW3$IP*rV6$kf7=R1D8Jk_1d z)uKC);iB}g8GR0Ex9B>YA}%gx%?Z^T4*MrK=Eh%TPlO^H*!r}Ik}t;ON~&fnN6UOM zr{P2amynaKjqqQF5T8z%k4sm5c}HZ5>v=4J3VT~sbd7sO^L)vI-jC*YVP6-*Be&$! z(L@H%x@*R%04C+$UWtu(`eSY2%eS*hwqL-875Mh@@zL4=7#)zAKfzs_@Y^MTR{^&f znsnuj+b78F!k=3gao-c5M!WE&O$MWdV@>SVhJA^1u)c1$cqIzawp+k60=-r>6m(6KQ^U(k^i0 z8nE4phXgPAgsTkO)mD2}>2@YLj;(~gB=t1=jXVG0NLs5X0_$BBXYyrjE?)!{TwJxP z&$Y+@u2_!$HrTHK(aey2oSK%(hWCrHzNAh`&Fd4fyy&h{I#DI*zvEU+U{_wNfRbF3 zkdPXBe_DTgdg*01t`1b%Jr|L@DT1!CcIVt~J48y#awpqUkItDHcAnO5a&BCu^-Ae#l<>6X9$xd<;cODWQm$fy#D{f7E=uX9M)pKC!=7)5 zI{{P%1>AQ@syALuZLAgy$(7qYmER{$0s@w%{1-1qskzX=8aFfUxy|n-9IB@#{Lvcg1~cqM>>EbxPAetyKIY< z<6=*w7_UF0IIn*w!#hoQ2!m8G;kLG9wY$&u4Mg0->*o=t8-d_v5zOO#N{be{H9O1kgUz=5lJCGy% z7c54KMrkJ>6PVQRr?X%C`(wL-u-47&mQ>%d7_0mP2JSE={t!c1h<9Cys~U5mRb66_ z7iS)Fir{98l~*E#|6E_l|ns@Ym{lmoj;6`Ec5m;s=O}bA14Y9HX|3WT}?bS z?$7`X>g(8Y4m};Y7*S^hemta4lF$yJy~o;gTdi%`AA_zu#^Y{1JFUFaQ_;1TBue=1 z4-_8j!zw?XLB+7lP-zNjeXQ_fKFf!3CEAa<=@#js0-7VdZn#LV-%otL8fJ&l)vICj z9%nH0Q=du0xbW`2lQZ=*Nhr*L=flm=cDSZaRR$DHhgxui+7p@Z$tb-Eus+3NI(5mlvd|2D5^&Q%72NWr$v1STC{KOV~Ksx%Ww+uUAXzXZOW2MXq-`)~Xh zUxt3BY`tx2f#O0?US5B_Has(Zto<=(?d|KUQL*`bq4NGI6s7A>b9c2R4wex~>pLj* zWA5?VgB9?u{0gQyxbzY}OPG7~`;*drjP(K~XdO&@w#a_{WqeWfb z_JdtZol+&5%YZXMPPX;A;mR3~PgyTBqIqI=2mIm$8DpoPL@?(382xNqV2w5fhtf4RO3Iz{X* zm(~nAjVo8zvJn~TpH3Yt_>rg%-Vpxr>?euPJY+OPw-Y>ZGy7uFwXlaI&E27$>@4wbNpJy$G4`-jf_jBFX4ZogPVy=HWBe>+qpF8ZOVLd^ zGwd>mA4ru3y#y(bo1~)dGNiR~8ka83)p7m>El_Y?u3~N2mFGEz7pd`<|H7?L($gj6 zY$DMrO>X{u*i2WW!RLDv>+t;ezkn{#eI|S*+(%-Eexl^5#6!y)>e@Sk2}7-U@%kEj zJUOa8T))!LcDz*4&5uj+*4$G1`_6v-h<|oe+j#Qun|!5P^^hIvSF%BDA}BPst9$?Q z*)_@+IJHFc_#s4=L#)+J|CQ&>hUF3BtgZT55$^jF!AKIDSt6TGA9ururbWF;RCq`R zoS=ZER8I|Q`$S5@p%m$$-QE}1d2(|#WTUi{h|nV0A+Ir#9wRH#)u~q?XOk2!Y+(-_ zr%O-QMGlN(Xkcba1HNc`=Oc#KeoiiKix<8D*`~$1P2}~Brs$MWWh?I&Zt>-44 z28~^gMUWAB4>wOnf`PYtAul*CY=O&T&-{eLlghPn5Dlr)sSxK(Q#O_ttx4tvN@Jx= zGdem_I}?#bQp=x4if>0r2zGgs3vbd#ybU!G@qy_A6Hkj!shU|d3XwN!N?161yT6j( zdjfTXms_rDpGmB1y2|)s$`U|bfxm&*>G2~%3v;Q|SU2^Cl{4eAr{}2zN8XI)Hb;1W zGak3?QwQ=d)MLm3Bm%;PmJ{)Qu$EtAH7La^LQis|x&^-2l`4y;p5*u_#%wo89j#4I zC6%q;a#sltftFf=G=HaI56E1?J_MnW%BUFfpbt?YK$2(Mlb}suj)SABp>u1EgIn^Z<=K`+xJuhJifT#r#RZ zKmL`Y!|I8Kl!2`(mTNbC&I&rZ4w}m)s)i+v2wUgFhzM0cA9lOa+7QqorodRo#?J23 z*4{}O2{aa4>;gPK%?9dx5M&~=@;3AVlBuBQ6X+MPx-LjdWV()stgjj>j(WgnJn%hJ zV!8k+4gOs?SqqN@loQ9e-@i0G^gDm{_+hihVJxsDB%m7PPD&3yoxeC(4*R%!ViJ5J zB&75@(^z?aY2=)|_gkzNiUTzqpQ|gXNK!beM5Yq5b6hUCZ_6!76WjW{#pV5-iXxyA zQP#5N*iin#(@0hE^xw%+yB)~%$4g@I4&S9dbAr3e=GMc=(e|OwzqV}lJz!e`ez+VL z10MC)m)njt2SEFvQaaq6tTFbye4Bg`%h()if4Y0vTzLsBANXAc7XgChQMvCon}0)9 z`i#^a;ZQIF5IPqZj(=5N5wRb=JU$BTXLtAfbpMiy2B%rz(&G5o4ji_CUY*11G*kwM zbzt`noSi!z=G@&GS~W(NGj3tydo@CH7HtMb=-4VH40Uj21gYWrOZa8jzcN=St{#NR z@KHXX_@zmGp!194X3$UW6LEWi<1%%cs|n_FGz zSeQ!7uZP_k-JQXe^($0wm-ijoJn;$ttqLOh>v|##t?JWQf_X1t<=1U>^)uBChWRy> zsD1nGH0Px`?iM`rSbuy(=Zs!3v?KU#!wu?T5lwKG{h1{{D^W3OlUr^bR(#55$<4C< zE>kY`jGQ#cCZ7#yr4Ot3(UQ%|fd9^3H;Uc(4_92a3XzhARI@PWivRo*{IiRLDq|n` zHA`}%o+sMF2erun$;3f3b+RkUIc0sxYyaW0YZPq&$3qR0`XvZ1O|NixItv|nHnj=A zQ1_l^I4hgFU$3$Ko2yq3`BbP_<}RLNmJN&SPV)D?Q67FDYBT;1xW=1Z?MG4$Uuu83 z;5>>_%6fUAX^7?5lh+X%za-~Lr2^AJ&I@`@bB(a3FxDcpD6$pGTpC8ko`H`GPj_S& zoMk&44^mQEzlLf~m`)LJ3}ld;F^wSxHG`?S0)sxOiX~C+q{oU?U6e@H;VWwfqO|DA zapsFRKwLKJbivyeFU|o4IuCfWqrphOfg?<6OWWyV<@*shI=gc6X(_FtleZXXkx*D} zYS)ftq)T~Hi+e{)i-7yZMr!1pdan6dbG!A(Pkonkg*0dt*Az4*fSl zAC5*JtCxy`!cU3loTOP)q{pvb%rEtHXKTvyRkp~T`t?WLqaz+XLAWDP{Yj8O7hhSf zu$Sk+OzTl+CmvAcWH>%-bL>x?e0l%$aIC$|nUM+6BHRftDAqGdCiFR*TMGb)g3X*x z9&9(0^(_Kd%pe)&M)AOVfmP=0O30O-rAb0my{aDeL0>xTNUvmsI!7P=!C|kwX)|WaVO~ zLl)Bje5Y&LV%RD9Ab;)PL=M)|S_d23yJR#3d=h@5Eei*=Y>wAkTRkgD((YPLw=mTd z{09yNkoK9wP`jh`%a}eWzy8N1MMrp6(uLNF9AXB`TYZ01xOM(X@6OL>)YYiEn6lkG zTJRZTrLye#s=*9>zxMp{c z^NhU$8KU9pr~AEZmPM5DdQ+gD3@jnOckOd5PPmNx+~Obn*UESD@n^F>vRF*b_+}b* zGKvS~6qg2PRTE)!)_p)0|FK2)jRK>-LZ_IdKG% z?%M;(&3ebB_E^j<>b;PQ-hMz0u?u@tQIV3CN>sKeNusAzj%mKh*$AQbP+?Izkz<%2 zWHq+Z+)$OCO~mnS+_h!NBiAcJ#+Dnqna@GnVDvc?i6(-S6cJ%yj4iHqft(wy$tw$l zOiti@c2n;II>t%&U^mC-)|xiPB|C0{;W}hDcES?tF>K(6#I8M3j9wf|7BDpw95vwd zmr%uKger9*j|-(kNi7+&+!9#wJENUBNhaVXawPEH;>GjDbF9p-sbS{r78Xk9Qg;~oUUOH{>b@BNCn&uN=GXtAw32#v24%yzG(zN|bY zYTvf*j%lDn2`(lwA@Z2)A)$@mKB?rCBKfS_-`)~77YQxjJfTGpLBM2S1Dnzmktqr+ zX6YgRTG`k?W0)o*wB((Aht+kw&>%wApgsd=Qa;;3e-AKVgC(kgN28JX^zkIiLSEm_ zro74B6WyoR9rE$)ZK zZDk@-GKY*8+GRDYz%Xu;U}L&^hEpHEFRrX5{aPO*>ZIP@oe}l>f7K*>cndrrcy5fs z6>6;LE%*#T)ORLSianpHchep@sLvF4{J7eZ?habL{lV1HZrBmHra0-i7QkKezvODO zYmgDzzG87%2Ss~;qK^=bR0v{MRxW5_M4TKbQ4 zXCP{Tn>g)8lhd(oKd&`#W+3c;GWE6pH|I?CWn51^$i6$m zMv0k_2(cpQWaaNywG3)(ctglL$=Ct2k`Joy{l5Lul;2T#Y)`;Kwbdh{J1wtsINRoO z8*##xd)GS41#&K`=rMT*uAT1Q8|DyN3yIyTNOl*0!K9=Iefjh0=)a8Kw~EN=gM15) z>U(Qrs$inKQXeWa6&A}IV`tEZNptpV>N?W$Tc9gE8nO+2yo`)i#lorj%b_Yg$);vD zDv9OtG8f`hUhFbb1pUH{^MpxN(pAGcNuTA0e$UbfPoCWR2KxRZD#oJz(&x8?IYNTf z1zOPwcWYOud%?;AO72%*?_|9t7rzrU31ARs9gv`sV=yv>E=xp+cucRv;SLrdbim)t zLH#tibTcN92Ws6KiF3-m^?+47%|(cKvL5E+*$^Y6ii*>z7+zXG54P&JHuazf(Y0B4$G?8eb!20rTKg1huDe0?O>GZ%<^MI#-7<3lY)+6ZNaNa4? zsYkoS{PuZ~9@le|B*VCRRxjzgz_J5h%qup?+d*9+u18y>nMQbs6_T}j;9zv(ZCJoX zT$pGx1;Uk#@*YG@rO^U|x6!qSjZZBsrv?+^r>9fD#=M~bnM|z+<~#X)nIIrdNH*Qp zz#u4X>FM`!ir=~PmBK7j!DaF$Em-|lb9R8eHy&*?FNoGJDJ0kR-j zJI3RxaGE$57Nh>~ZJV;i{^6PS^FA2TAp~TZS^mqpe4MPaRM+_98kY%jQxD!p{V*xeKJtC_=08^Rc+@<`_4iM*CBtlEh-dKOVvKAVn3Ev-LvR$TF>hSn? z|J9+r>;=968r&8Y*RM@-r$B^!Vu-t8+x6_|$|j2NCu7knD8p8Vg z(rB9X)Ysrv;C3%px>pfLVhgb%HCB^-(hCKb;Dz+8gD3PZdBGhQgvSe1K!26hOa6Ll zMv4D=a@%sw@fLPDD^^_pwU4xH<*}~^I`bg0S<_TYpXY{BR{+AtzQnPaV^Lk2d|20jK!Df+ zFZNoBS%tr-jUmba&=z~R!$bf4$Wtp=K_pOyR#aOu&N8O}p7d)n!1XTVM3>YVhu_@z ze-;4m%&z=8fcBT~>59Lj{aReAX#9+|L^n4~f4MmQv^?%DdtIqa*1@mFA$0ZZkK#D0 zAm)s}x$Kl5+4@Yb^%2zh!@hObg!018sW#6IS7)dagS(%!m+^2Fz_ym9AtnUy8jI9E ztL+3y1ejPv8tKU7wJ=EUs2urZz(ZW6cH1e(1SZCg446h-07Qg*;oNHZo46QWEVe4= zucz2DPG(qx^0D(dp(>q_*v|OcXwLV|&n!6&deVF22U$LDSq1D2nl-ZMOf;m=YucRQ zs5;;g9;}nkCKp!?%i;a=^5!+rHheKLebG-Z8EgBR)jX$IxJ#|rM#&h1Tu}jkXFQO3 z2sVD1_I|}H@3S2e-`^K@ag`V=>5}dzKlBsRA*ySpZT`ifn535YPf1Eck>SJbS*}7Y zAKqo^9G^w)KrVhrG2XTbps{@MYD}RA9MJ*{^wHIwskU$tA`)^H zU~RXnyy~2MCY*H6E?POeKS?}kPV-tnO|2F)fwrRF3F8ZXJk@e-QtUq3RS$k^M(aOl zq+oTz_d`)|6~VAV{$b_Ox3(U*e+6wS62% zfFiGU$6Vo3W{A%rfw~P-TCHlqU@X;IO2Je1>*edy+Uw(MfS+Hj%&-RJ$l2~tzu~yu zK33i+iV1AWR!TI1Br#WiTI4P+^R_NluRp(Z?-HuJy1F*LH{H(1ZAD~zb8}PwUp`Jq z4gQF~_H~fHl+K9p$6S_o)zdSkg~hXVWYhK?K2t`rg`RC2;A0y`qWcHnhydA$0`=u1 zw!4uMjpzLZ9Il2s9n>BRMrs?5wN%WsS9}j2>sJPs3}HL#5M+L`hX;sJocP#A@`02J zy4@Xoc$g`L@%9CHuv~LKe(5;I2#mNaCdSA?2tucl3`LUe81PL?;8}d@2ZaJmkiJ_1vE;MwpsUm9E?0$ww)Jr(BnhO79u%8gyop+1bHk#jWn2e?X z9BbzduD;)?@C%~J=j=um1;!Ja?3N1V2;ruvgsjuVzuFI`xfe<8-;mW-Le@&_!m3kQ ze6QCwo8L!*6Z05a?2D-4RRU4Y;uAIeCNHY4ZMnLnfx70T&%n9;=#I!zi9K7#b!5vIUzie8G*h6JO4YWPlC4aE<=2J%Mtg{6jn5VHE>NAWoqk{N_c_gxg_R#=Mgir7 zA1_SlNJ$1EeRPmxyj`l49;r}O$?2{P%P&;j6|d<;yh}bJZKXBpo`*Ko_#SJ#V3I3F2G(EGah} zavI$$h;dtgiqoT@&V8vufRB)UwO;8Yk547LNnLKN6{aYEAm5<-t$}>>qNXu4;C)ua z*9)x?$1$dn16YhV+7I_1iW@BY7wBgnO_JVm=^-M^?>l>qjJ%@EyNAkg4N~B$K%ube z-*#V!ctFOMZeL{14a$=utv6tc8bAQQyr8t(GH<)=c6D*TmXH+Nfw7rowplMKe#wmb zdcsQTu=ziuW+&b2@!Cr{@FnaP?Aa*fH`Irk0hr#ZWQRKFy1^*wP6Wl*zp#VfG#mc; zJ*DqhzUFWXvp)wxe=%WWp!SW%A>vw|hQ$}otY3=DIcZ69x^8P~P*$FvO+ku}Tl9bt zx*!Y@G_k-qPB4?SO|6!Mm%dGQkd>3O&hrC(eOSfi9_XNiP-yEQ^YmvJe-FmH;zP+M23J}pK) znk?F!%pDlnKY>&>LYwgQkF00_ud_A zcI5@++j|Ry`K7FM2Np<_IwLEmoY+iVF6+HHkT9L1@K=WKqq+a$vdtXlyWdB^Yix|* z2q{S0xq0UnIQPEFE+f_Xe$h1EJ-&1d#QLhAv(TjL&%eo!VFg)Kp?_C0ydlxC;*k!!E6a@G zPt*w!0j?1;F|8;{%_(t2MGJrFz}F;2Z~oXR5RTbmWsDw3PpFP%M2GI7PSFmgYP3$n zCzZe$Lg9GRKb+yq`-RQP_(!TkQj~grR)*S8pYXF5*6UZwPHzn zs($%Ea8Pg1Xwb6!xNS80SVG7NWxWCx<)@1u zF%>Za_sxwaaKaC^b0{*Z$-soj{Ug~NeRb+YLfg~dQcWc4U)#6EiFbB#H@Ll6wC#Gp%4Njh5T`rmBsK(B(vC>K;*SF< z(ujp1&h-ZX-Ll~0qeN6F{cJURg!piNgN!n`qFR&yNU#lI*V~)|YUO!vT97V1VsvEL zXPyI2SM=Yu|5A0glq|r_BkatC{2c+R+_Z*|FYAwE@f5il9P)FEK8jp!*4+2bJ9A`a z!tl#!Sw?ETe&ovjG~;B*$koxHi5wjfAiO;HLZmgCy#99LYaH#=Yb8PsYkn(Yt&~QA zY#gIBwWcvUeXleEX=Aiyvx*A|`7W9E7Ymc3Z>8ceqDA?Rqt}H+=?x;O+rlLzWhQ_? zXL$tDS@C2J5}sNX6-Y7j%wopoJ{)?|(uY%LndU$ED?@pW95+mCHp%hX zVob}W?!4Vs#>90y>nLp4(xm-q>Go2F1Sjx=)BCOPJ;%XtVa3?mp2*&t&9UjN_^wiq znVHKOP5yb4<)mWSkBS>!qkCZ1Yrll)w;CH1lud}lA6~bUpPraX8RYPZ{=rf#+@h28 z{jO35Gu)EbH=!vkJRg3Ld%d{Sd-I&BZ1hq?Ntcb)JeUL=##g$`BkJ#e^--m|+BW|_ zYg{{R`w+E%+}04Mv+MrlFt^T>rOi|y@oUXBwr)+`*a%GU&45P4pa$gk@e$anXcZW^ z%6sv<-&jzLw*4S}X;n>D9I&>c%pm+R7jQ&$lORK-L?qaFRy%r0O#^n(J}$ltacicx z%l|x=YjeZGgnJhKSf8XnDLdS4_X6#t}?^HPhmU_Mef=ENPvAR@{WM014$Mlg;3 zPC?x(qkwy9tx+u29)?1e$ZsgoHkF&cRNkv8DRxU;PR`qY&=LaRx3|61!!)^jzFm8L zy8NFJ6ySn-&~s{^&b^)^vriOkMx}JiN z6dhBivk7Hm7(ux=W@hevb@3NTM~Q#y3qe=F zzG$doV8yn)5|M`!W|<^HPGc!U<&P~IHfj43G#B&Lz4_wyv8`o=%F`32>9)CI?~-(@ zb!jyeY4vmYY14R2!>VH8{Kx1hdP+J&q$|QLNr4?OCP!jIl1qm6&q#L-Snv+7BhrM^3)`^n zcRRVe?X_oFEQsRNznlr9_P+5sZNrGgeSfX(fbNk$BZ$tlseI|{VgV$O930npXGXeU zq6-Hf58vgMhTys#k=@Cu!{xK&o;p%Fiml%GpIXj596O_=2m3M(wI$oH*$R{oZ%)=_ zzQ@vw%bjc!e1tI;*oaP1obNr^=xWHQ<&+xGisV3rG3NaI{iWgHVmZG2U1sqkdVHho zBA5vw`AN&2rWw+~a^XlCdPbmCwBgWJ6DyCn^xxR1CTr{y6)A$-tweL9=VSHU89O)j zmE5E0Ts2-Iq>;c$py+Z`GZR7CY+nFf+tpikl2tmz%_1@RojGB0m~E)WM|5eE9B(-7 ztnVmB2H)=Wb~|otUfkLA-$Yypk8-8V(5;6T4UlHV|6AuIksCSdZC&bu7db)kjbS*o zekEHuOZamkP5t_6H2;TF7cG%0H@YGB>uoxIT7>(@_1n;C#@*Tp@MC+|@aOl5wi-H^_O!-*x{*PM4ofhpxivu3(c|^$%2IejWPI0}oH7p%jh=Hz zMN(UvQ3ZQqHCD*YlaCK%xtI4PJ4|s@YI_FXpFpa06{k?xQYnKLOiHk08NwN{6`-q| zAsG9o(=EB}c!n&mBceD&X!I}gmeX&61W@`1Q!Yzfp`}g*SwY!lbzE_RzAOfM1|&o2 z675K~;oQ_`ow8(&G26j#PY-$P%T+g1Hjq>>Sb^29eG|4zS1RM*qC z86Uyy(Fctb7#Zg^tiiu0>$eFW3*MS86^QpX*WwGYI*bHyxV!Y>=B7|T8Tc--td-R3>-aIz z*OBSpFO%%FH|K;at%>SxGoP*0rG!|17X*D9TOKV}nAI4;VpBh*px2jH!_-F^=KGpY z?K{mnPYVbfVe!Ix1&O4(qg(4IfGhO|)`CyS&H6pO#eMAGU@nq@3dhL$@677lgT-8n zf4~f8j7N24f;3D|Dfgm_7}mw}m-gi2kyK*u{rP-@y{CCbc!uB7jpw5i-!6W_jf1pw z9iFRX!((D^3Yw~dTQovZMpapDJ*Dw6sv}f4^rv|mzMkbt-gFsTQuiQNxCS-)P?zyq6~E z_UR>@n7716aY~yldPr=oWB3x%a>Pyd&pf6C{k0AMsjr4s0?gerxsf}jZxLKWLTYZF z4N|7`%=VQB`NNQ~-2={?AZ0}SBC=;iTicNl0>W9GU34iL*r=h@@k;sPJ6Ht7$BO*! z9DA{k&mJv&)T9k>M>I~qK&5r-l9}pCA7IzCK#X7#N`L~go4&~m5aRzS5aZX(>8?76ikjlzr&g9w}+sY7`e)`*R6hRR` z1uGLQs>z=NpGcc*BC^UUr!xjIu|<<98q7~d(9tR<%a?=W1@BkWAv5~=w{54C(Q9VY zB7RfiS^{slZ}V__GoxAwOe~{Rf=_jG52sgB+{+I&Y~O*(zlWMsWuVULhY(lllq`ye zj6`fro&p=}VfKz7&Y9m(s6rQ72J?Vw(KG<^(;|;=_5yd)fnSn$00wN3sQeJRADnjH z@wCGZq~;LPGV>v%e3)#KVC}}lsnOIZ*>u|UI(wni`_bR-+%^7oDh|E7%lb53BXAl! z8;JwMnW=A8{247y%V9pxH_i5+?Xeync6<)n)*Sfi**5E7bB=3*kcxU53_W5uvO8b>7~NqMxYYzfX8ZY zWx$reZDXCzLHWalwJ&2IGzFi(DGH);s9(2y!iR%J)HI1r5a#>Ca?zK$yTalY)bg<` zKRn51)yED?`_;U++q}29-s)sUs&_%I528Oox7~;ozPQ=THPv4e#nzwL7G*f1gwfJf z+hZ&sa2*yJ%q>*IWe2?K6ibRO?_a#&+Im0TuKp#jL5@hi8nMRhq@Y+JI{1{O;UOIS z@xJIvNT9T;j)*@|WyXj7NvdkQEizugV!#Z0o-m+;BSB7*?OREYK~uUfIo42fq*UH0 zCi=T?2{EPbEIp@C^y713fNrmPi`SX9b}1-{d^ zYCO9vUwpOv`7=+qg*LT=Pb|=WZnmd68~7H zVaZU-sXN8u-3>CX-P%KuHr8?(;F#c|9n#j#oJ?+%MGA*%i}D6o_m|Yx*Tq=ff(+G? zxxvYsBS)8$&m40;dmg(tMFcTB8Kn^0^7T=L>qH@G8WD^$+)vg7ZR4Vam!!&FKOngi zr43=leBY;HeK5ul1y9g9Lnc!T^zF(IALc3DOIY5BRRdk~`B|l7dGvFCKid^eYlqIc zSH+OYO580zl1xN7vjCU-J3Bs21`3l)$K1nV`V(&Svhw8sZEE&~IKRWOA-(hk02?fm zDPqnTH(GP0C|+b4`$n8ioqd4jOHQnU+to)0OV^uvBolWN-Rafly442DMr@uqq>_vJ zouq+=Uz}&zuTOi;6+qC+7g=ir^QphE{sf3y(SG|7CRJ1*&ZQN)k_;vgUd-&YIYXvo8PU z)@oa6I*FxVMle-efid%F*t=oy&8>rzn{9c+lCq^rbYE8ZZlNqx4$Fc z{Iob%3hMTfYu&{UrRxYz<+`=^yfw^_PnL#i%}1xDzZK#xA(}Ln(OS91;yJa0r)Zwj zpA-aG0m)BMZh(u&D*m^P8`7pd?u@X*LEuLn?)xlR%0SiJFHbJQ6k>!e)14T#b%h0} z#M@vfDWkik%)Aawx`D#E1zLBVq22pJ4d$7by*>I9E2;!;4AOMH9Wa=auYX$PqU1?E zFNsyhG5azIv$j2P!7!gt>DVf6Ik6d^pArCgZSJ7 zOYfyI{(>ThqLmb`_EQElXwZIYlTzACUc!^^rpDCD=uA7WC$jRZ9agVzCu`K|M4NxN z%_-XKR$AUlrRr;E=^iH@pH-|&P{epahN~@jLl=qOOg_2EHt&oNbs1t5xa8gVaWV3g zW_n)}o9OuKuixX0?sT5pd^YsorHH6S(EC!+2dR*s7q2_#7DMmGPY`7(Gq9Kc?f+0j zF%F3E=G%+RM;}`15mLOclOs64(?pm%PpcR1X2czepjI8g-;lNqW;Z;LJ5`Nqm#eFdTz9Ho_x6%>IHUVH%2Gm|H%R!5B;7NV|gFTLCYXL;bBE%0$^ZJjKa1OmPFe|>uL^ZxGxzdGI0 znGWCkt=0>5OYq^F#>J5WRW(VjUd_M#qwwAXAd`C;aH-k-n*;ob zwGxu*n>AY|>OP)7|A;v6Rm<^1Ldv%{bs*(ud8 z@xc5#QC(5%$y{*M7?LWCh*A+^Gx&9h&$7bZ<$}&aw9MJtVX=>@JqWc)v{XTyb%cgK zfaLpK%CgX9YKEI&IgbyK_Y&_icd2kl+|La-^OOx>Iv%uA#7n0ACHIOO=}(=E-&2EU z!n&MedBaVo;f%hwX*Pp6U8YZx#k#%PV4aT3Sg0U(WFq`=n2jPUS(&+Lzg7ZOw9uQ= zyt)ALZL1l&Bs7tfj8TQK!nyIlG``5JFBMO6&0Ai91RLbFc|YN!ElZXiic_?diR`sc z!qtSEx1*+5 zdnR@*#QnRwBLclMVPM}BpU5PV$i=1o^Vu$wk9}oy=EHmt@KCyBB1?Ybl0Yy0O1r8J z9Zb=Wv`wa}l4C8Hc>sSc-x8EU)QU%q+*oH}U+>7@aCP^rE+#Y1EeY%%_?Yt!-7-0+ zP#9(CX6A=uacurxzN&&>X{6HIx z0o-LTd+Y6K+CWt{!hZZkTVuku9J+|dnxzGDlg(_y%`sL43pYTj9yV<|i5?Vq>n~=+ zK6glXZZ~E|4Q8bEL!@UoVwN72#Tl5mlQ5Rcu}(l-LmxsL5uC3Sul!cK{$FEA-qQY@ zI77T^u_B}O&mh?F<~!@o;T^EVdYugbOvLcRi`46LbXQcPR^ckzA)BU*-+FFM!c~+) z)zdy;vj8k5!kZLXn(?OI)E{B$%u+?xiTo2XrrSzOuFSzg`ZQ5Uc0*A9yD+s(-&Y_uX^uCnG^ zWkEC7UGb@~RgQJC&FG*0)h6>(94|ro_d4K?>lbo4?>M4lE!UBgO zxv@ZT?Je1mJ(yZQ944iFnrR({)5+|CI=b0m&&zwD2wu z!9PS*dEe{1-Nau(8eVK#5RPEhhmj9NIkzX82AP9W{p+>*cIiSKr~-U66#TyW!&Q~{ z8HeZc0{`|?RXrL`53v1Q->bknM47)YiQ1<_T15*nHa7uZ?0rSVA8l(1%~jLiUX z*Qi*`UW?43;IGBX;&t?J;|2;-*1^oymNE!_Nc8bLuE=_a3Z=OG6NvScv8|^3g&^IS zi0LaYC7-0XWOCv_(j+*1qt3&SkYQ%2y!aWP$dvcrZc%S*tl-<2x5Cccarg4zO}#+x zh}yRh88g=WEf0L7R^ms&1klXyf0qXAg3fSlr?_#J>5NdJ3!4PH0XU zL?|`*v>6(;x0wz`H`z@&+&I5Bwk?0e-Hit-@J5aRMSaOO5L-BXthrtNJk4cG<^St* z@3?dY^$Lg4c!K%~$d^I3?^oKkpI*rGdJK(>fV6Qi zd2!6xL)&PK;**LoWa&79oao5L?l>T@liYDBY$3Rul#DonTRkZs=<->v7-(NR_4EuB zy>-ui#M9xdK`rc5S6~9;hDBwES@3Z~A<=YgJkRh6IM0SPAR(nYj2-M9dHUXH**6$S z-%8P!A-aw+w;9^@&AF)3~JM*slE{{fkuQ9K= zq_kIAjmVg5l(is-!WNy69@`tBE`2rqV{x2%MGh&hCpZ5(iRcB7WaKJXoL}hk9J8xY zOkv?N1;j-HN`2$II@;0|P0=uy?5%bcb#7{8qd^>P>6Khn4G%Gow0N?r-PhKJaJ7+R zgIIRUY|-1=ihi+W-lJIMou4*mB2QJyBGSgwm0G+5)wipfV?bofVbzC5Qrw)IyA7KV zRl9FjOFNObq_hd@$|n{h>B>8usF5C81xe+z^T%VHCs9CHNM%yxo!rdndtMx|?1z1` z53fv64Nm-9ro7aS_mO6@?_4MEjG%$44}vd)wc!9o^bUo$XM*oq+!pwac=y(E-j~m{ zC}ybdAf^1aYb{UB_Gn(Oc|8P^(od>fn>Hzf4^oUnYGO>cbC(|()njl4U^(3R335G6+=vh(+U^{O5@dY)Ol8du}e@#-6R zf?~!zMt3Ni^ue;vx1+trdZW%bMKz?Y3iVT^r6DAO1O!f+$i%X(L0!@yCecLV{JPcq zW*awBw4o6a@Ee_}6%vux5LUG;8m#5x`(4v2_mGaN6Dy5h(MHFcU}Iiih3$wAI5X2h?PE==q2(&47Kd6^P88 z<8Qdj-=@Trxw%9QPen%Q>GKB1HR=@&JAZHQCIdFWfPAwWc)uew36XM6FR%AofZUyX z0j)L54*zL7e8_iLX31Dz+oFT9z!!iwpo9)(3&oD_->@w`ExIm$6);ScI4d%bCfLZs^KdNOYwDh^;_s z+llg{zLa4+o_e|4Lj4whs@Jfd_Q|bKSibBKNvN`Q`yD}8hOF7$oew#i1fbmwjKDJaf3G$-^X^5kF?XeCrUev+LzxrXr_9vdeM}cNR6d+70=| zv2tfjH?ibB8iGP@bZoe6LtQ?ajxBbX0DDG98%6+d-}a|EszTF|D&ueU6($~YyR4@(1|4F#bnve#$C%-EeQSXE1q zay@@ZAd4w5Ktrnj<4<+=AGn?mrhn?lsvwCj-u_5i)Li*@vhaclxEQ-Q(O*W*HJ`XV z2H)VM%2{hrnw-$Zi-&SYv`oN>(!77&OzRmBYx)JHjoRyuyz-|`Xrwf{qVw+hRnxk+ z4IDVn==@85#27(vP2u8^vc8L$TkdNwDCL>mZKMBFDXygCak*6$UP;l8?ueKshK~gl z0~ik-uPLw5uLsifZ7iIRkbQ#Nu_oM_!HFt-BICj&rhx%F1+$~t!3UZwX_E76A9%d) z1li1(XQLibe&l%5kL_CwEpK@$rb%J=ab+$FdV4Xd@&i{GyBV5OS_(jz(S+nw^MVd4}gkr2aY2&CM3K@#t84{xgz_5B>belE0y zv)A7FVS^N_W2YTi{W8<)K3IsA$sz5^rR`!SrGHPzL{JBoagM?M=TFIYsO7OnMZ?nd ze>X#Mr!wVJ#~z9T!Q{ZXmGyH;9n1$XTmU65Pz1cMZtcw6z`<49t}JDkml(alPotjs znFf54e3@#5$*U#xv$d@5;%igTmTZi>xC`DXzD^gRs?@&^$0?lyc9;yyI*= z6+(}2Rrt&}_)nsjCq@bvN051XdZum51|^RxjA;MYp(P>g-2-agZ|~;7UG?hV*B;)V zA4;JE==^w<{Bn?bxru9?&vp*T23~E3TtL-OOTX!|JY7oRaH^VgGjp_q80a0IC8$=w zF$JJb3?10n8&ZI(XO-XUirF@&ZFQ@b;TU9Un`rd{i}WX8gKmCy-i-GVH)n{kTWYgE zEl89)ZE^I}N!AhWd>B77elDk(3zm<#eWb8hZi@{bZa&JMMJQn!hmXx>?WZ@TX6YoJ zk)Dpcw4&-CvGg~@tG^Pa!C24J+l$8CPm*BG^h0QV7YA9sx*}D zq3ecJnb)QB{nB>!7%O)?#@RxVvNxeMX0X zKAH-7I4a?7ld`3uvLp-Lx6c98`ODoFJu+=L6KA^jae0F!>~ChO!r%8P22(l{2V7aG zt?{v3qKVkH!d-(;^S=?WhRq_ac`sAdWa(RlFvOgSrM}B>zQXxgQflcixNu|DJlJ>gi0KB9Bf9oudFH2-jc{#5PE=_GAvz`L4Rb+ zH*)t@Zqh0u7Gfins#N6r{v)pEK$rv%<@2Yaa(o8uKrku|R(FDUUU;CXt45TL9^S2q z^p@t50VDComZMenULCB91a-1W-lyA|4b9i;0i z-!|C}XZHr^=Bz}lr3#c2x8>qmB76VT*!b&ym|MK?JYxV6m~^Gs3FYjLfgpO)4P|?8 z&9a0gJ>lV>Z6|-Df$zFp_C#4aYP(els0bLdS-QZ~elPwP4?!`WBfdN8WmvsBBwam@ zlvAneHh(pt65{Qvg67OX1#%^qFgfMLdoY6EX?kbv-56qaXS0Ot<4ZX`EQ;% zxW6)dXM(SgxZAnt<`&?micViJdi~Miee5U}xEUm`;Is{39Eyz3=L4sJ2zANm^9|G?1}?>62_fdU`4*3Gy3tG7Zb|A zXz;5+7zHQmfHr$UB*Tz^5pVMF@NjrIa@_tEfSSF8b@u~0<`y$_T@}1t_g)%PG+ZY};KwB@a<>&1adPvxH>ODr1Y)tE!aGB%sZc6$!dOH)9V?kOMRHJ>2JRzQ z{^dNJKrXOn6pN!hibnW=Za>!XbU!YC#eV}7YBtLf9k9GaW*NBY9%`wf7+dTnR_{)- ze{Yewl_{@FbZPst&IE@Qr}XE)?t&tfmCrr9)z&Kdll7w>1=OLNvL*vDTX*-D^vy|P zC!Xq{*_1=$Kfb3tir-RY$oOJb1_orwj+Lc*4eH}v@vwqX)5~e$|5RPf z+xSECdennOZ1OwF#npR7!uoh?^wU}F11EVxP@qG$`@DRQBn4!%tTaD)AFyt zfS{^wQ|9Xpd#rT&Z;dHV9v6A1&rZ^hm)`$HtVwWSKbttXxkq*+cZpQ&qUB-0l{pP zG(W|faEl)vO^^4eeHiI@bEB*Qzw==JdS8!G8B_oLphhYsGga6jMxS-f@|$eXJ9z(q z%(q`D&*rx|D!GVF=rm;1U4DNi|A`d)>}$cgE4OckQRT#!5U1~^rPup@p-8G=YTN(Q z(6kszRqaKl3mqHmw)geh7ZfJrUDprZ`%O5Ktzb3%hXb!|r!5tz9t6!9N7bpMltu^7 z@>L42H|buYv%hq~uc?Kj9PlNj`%k()3=(Au^%Ae3s$o;ya z)!SMltFbr|6;5*Vr5AHlWQ;{%&q0=NI&qoW9Nkov1VQm57u}8wuoJ4fRQW6*q`h^L zN{2+UWU+Ep<=>;w|2m~Va)|ME{Oil#qAr$9G){Hxl?OJJiLa|wP_qJwT{nzR9 zp4clOR(zxq3l#l70K7p%zMhYczf~oXd?{tyU3R{C6)Z~@$oNz`yao5 z|Ni@LznS}`l$6r@`@1v!^2;x(^7H49pFe+GFMq?pk5((AH^?31l|Mc{612@z$~hg! zZf54zTMvKMT7wSa$Hzx0TdhMI2!n=m&Od+t{PykJ_wV07-rjrf*XtGadEm*g&1yYc zK(OpFD;#Jn{N?p}EoD270|l2q-``(DOFFjg!Ya?_^B`iTx3{-_KahUqCHstv zj6<;^2FM|yXXSj#U}fk`j5>{`S~F{nRah7$zh`+RS}e^B`?1e5I5WfQ;oY#p9VNoc z_%(7*TDEN~CB449U~k`__xt?=AP)vXXBEn}ZLhDd01d%U06oK)4tGU#?6uYd%56|_ z2R|Xos*0{GEOMXC;K$M4KkgqNcXxJYcS4R41%hFnY;Ithv}o^NW?gWtbxdw_?`|R@ z#NWPsLmz!>jm&DT&*Omcn+6mr+?|LNvryb1850K<9)oP00`>Y+OnJw*Z;tmJTEF|ge?d^WQe|&t%EYb}TgK%jy zwehgL-dfp)GI4llJnq(-p*;O8T^R3xHms0a$1O)J6pzMd+!YTrJoj2B5H?Nq^r_e? zJ|h8PrqM@fz1CW5ul4NPcf$R`54w+ZDiN{B&!6vq{PjCQxO)_14;P z@MSAy%O#KI2{%V)&kA!^vY;>3O>z7qfFz>PYp6lipg`Px;_P*Oa6OUza3^N1wTdeE zKT+{HI{?U@2-azTJRYbH2k5t13Zk<^EAFEAj$sSor*xUl6)*qXZn9mk7&C$g{dhiq zzPm11FS%lkj7oZ zzQv+RsK+m_)&9_A@(>Tx3?Re&u6Gp2;Y%*%%bUjz!Pa6{_c=n-EYW;A%ru1p!;Hko z!6w89t-#|85~I)Q(7-A@DcAw8|BwIjUuH%RdoeqaNFrv{#6*KVPNGQ>wX-s0aad(| zE$HeC#w-e}vL@BUqAVgZ{t|g`2xV)^kh6DU79|?eD&TAV3_gg+JMsvv*L^>p`~7}@ ze}AuYaFe@>N=k{HRVAf_SOer}&Y2kog+!QXWCMvwR8z`MjLeG@5sMLts*|%KhdXFj zO+pT%Q^z1fGo1~sf+9r~C-1#UN+d)ic+b(;EJ>0QGZC|oqoE=w0EeZarBp~5GYSnS zHFna-uoFaiEC2yR8~ih_AE1^o6PHKX$klFzwQ8b;r+^#n>`}Y02GfP%Yscc)yYP}Qt z?Rw2AlT+_)h$f1fcMPi3oT1J8d^|fw&M>Exd+XNCmT_S;-Hgu`lVEy;nVec}!hE@0 zwypGD!7D$XJFKcZ_ipZ1>j4jg!6EL3L9xeCOWCkdRnz5m#hPxHOWBIB=A0joXKk(a zR$G1UkK;I6tF^Z0UhntEG4i2k88#y7)}0)8LIPEJOe|$5AGNEa)M=2!!!j~8R5p5- zd8(0->#c?@lR>G9nOW^-R_Ca38Ej=*^O!{JP>Zw?QHRO`OUenO>WJv$*f!Z7BE+;a>FiGdx1c0OJ=48&qDXFG}6thpxCP=toE`ZfgayR%JD8kQL ztNr;r_PykM*|wBNtcl1I@T*KwLw9c7_M`6mfnhczDvD`9OzzzP>Cn>dBx26b=kfFX zUTb%!?Q%^}31x97^Koq5UC2u=rQ}jd(tNvIUtV5DzOo3DlMy+Q(ah$Xwb_f^V?X$87vq`0fv>YM``0m&aTJje6NzfV zV!KhvIj15l3QU6kgvou$6!K$(I1suvTW4Q%)*C zit{A2>C%MI|J6?!5t@{M`&m#jP`OCA4&-IXbCK}2iPQdkdKEIpsH=(9qBw8`Lh057t?3a#c9OOHgf~X7ZHmr z9bGzGZSYe})8?5gbf?zm@XR*KSYbI)Rc2-gV*;QMv%9r!$OE^IS@UXUS%rBFP=HAt zA0$acL;7l(^Pyp6WN-aApBtez10{eDNa zLrR)+p`|QjdPP?WPM4?r%cs(^l_re43!5CzEUi6s9n*h%WTkk9^ zl3=8m*oBD4OhGWIBBwh*%MpG$B5$XWVP=U0x0wy_0S#0iI^43T2hf6u;+EI#=Zj3? zN>wTf$=6xZv=9kI&Lk`l4iv>08-}_ys!vXc2?P(oDx&C3UOzrOVj#9K2l4%NBht*_ z_Kuv_C^CTUKpWt&DLf>H!WM@tB4n9ou)>5kA{`%RpH=4L6X%8?^XA={Su`n8x`;TX zoR6VxJJ?CQ3D(tS@d1HyambXA6G@svpfsK+Oa=?HvyscfTdaFM8f&Jl1bum?65>z# z>y? z`D7Jyzuc}V=gZ~t`udu4etUa^4?v|Ouuf8)RR`|gQ%c8i?E4`snv_{0r$&@|ugKKo ztnQw3`u6SH^ZCF~zDwEAIE)?Adk3pm1Eh6b;j8;wGa zj%rl;)KL_<(cXLS=lqGpoHA^UI1y?|%;-1{VJ=D&p^WHFZ`iM!%=KLoAafZ5-ALAilNMtkc4#^C*$|ntrn0d$(3= zN?J;C-$W!OWcJ&dwGYD*#=5meL;N(Ca&dEHHUJyuOyQBTsdaCyKOWDV^X+!K-Cpqc zfQ-X-5mC-c(v2gUoKiaaIjtlrDaUGf zR~8mbL)BWlh_u!#U>5q%s>#F!I?A>g(HFDS+G+4QPQ<;Nb#FY{lWA7aw%(une$;w< zeZ}?$f4p6;tu_P(%)D)z49H@wHx|xb%uh3d+YeiPxm?Vw?x$`%v$Q(qt@Yk<0kQYO z*5L_;umCNx`Pc(4f+cwImaE2I?Y;HhXI$S! zh#Z};(;qRb>g95&6+$>}bAW9F?pLwdDI%iBar90sq*EgrXLd;WLLt|a}^gJNG`glI@h+*q^mXr400YHbP zp29TI)<#R-GjQbUcj7yEhiMHsTC;_DM2T!;@Y_7Xpz0zrH0X@@iPGeAYsl)mSBLHn zHi`h0aqqflpM~pO-ROeS&Vr&Z&UC%m&tLe8^TGfU5em%KjTe8#Q#nY9fe1we7}3l| zjuZ!b+?^6(s^>cA5G?p?85@^%N(Y4ZQBq>Y)E)c@FNLLJJFRcRGfj;9nvSdmaB@FO zA@N2DeoL5DkXwm*$B7o#uJ{umu5qM@%xue8%CMO0|59Xfmwr;8#tEfbB61vk-*aUZ1* zorFQ8r3_-a^9fkZnFyWEsyd(I+^F+e_TKk>w>N74^}qg4|I7dU=fC~+FDlRHu34D{ zb^XY>{QB#!s6wl?{`~nfm-6eczdCtI8f4)xi#VcY!{woFPU;Ar;BO-VDtFL{w`% zrecGLqyWLVs z&*!e1lcwH)Zbx=LM%1K~@u8q0r>z^!;1QK!OP|)P`_4yf15i?N{WQ4^nXSIGfc4OI zswQ!Tk~@a?`kYo0C9uJ3V6u))4gXk~^tpM6c_2<(3iZOH z(F~<9v2fpaat_GFljwas9{2m*$WewA4m#r1QVO6R&^*nW-B|G0y?Lr<)92dO6W@4H zv(7vROp}YaSGZJh_f%)EeadN0E+wMwG!n$0ja8owm+{fz?7}0!$)NVY#+2F-Wyutn zTwXpgRa`vHdeCr#t3Qk;6`EZ~<9=7jXj7#-=h9l8HY6gkv(|YZA`R z28~6AO$1CZO-mP28xJ|<9K^}TkC=YK!^w) zr_EAdKo)F4tWHve{2MPF>-u?=ZSNiDKscEo@j*n?&AU4ZOHyk?(U>O<=hO*f}(mpfcz97i> z{qbv#Jv6iY?(UAsTC=v5V5V_>z1E!MsK?gZkDou&Rx+3GzkHXZsG@j(f4|@FN3H+i zU;c%NSY+F_x3{;SKYm=V*O!-D>rH0j1DB*CZr)nY%YMMsVQZoDhG)78qifJi6ZlN0 zZkddtX}UjZF6ozFzrVe`CDqp4%!s{|gc^x`-!c4?2KXNNvQhm#1M$n{BBQ;Umub%2 zT9erT5i5MTT%P;>`ubw-O$>BJ?}XW#Ybfk9muFK*IYN1xxhnaKs0hp$>_INzeR}nbU7r{9nN^D6)5)Xw)Hzv~f_ghMN*7nCAe_StD5w$)n>Tw*Z8RbI6j1mNzvSKucddL39iq$dv{ZuVg z)!sT0N3%jR(@ALc*&U3H7x-*FjJD*9WQuHr8HaK3TEqJS9Am7j3U#9@xuXTC?I z5Ep*%Ed4xbczo>+E;I7xKD!}?Hzc9Bx_N$S_3YEpfAaMrBmF&1aTm$VWQJPmiCZQ* zT49(iGPm>HPTv&kf0?4uBi7+b7xO3(9=YI<*RhBZaU^KWO^GPMSJ@;-N#!RHxjy(X zVZ4Cc^$Y$?xw-ps?EB*h-=kCP7jKAup!m4R0=PSTzq^h4Bn;ZoGY+;ngeoGuKBwB8 zFJ~uqa%YlMw(GU+yLlyYm=LgrGj~kHL;9GAga!DK$XUe64WpkRP)9`OAxj&3?#sRN z+|Ix^$TY49QsykzFNuB>lAjBE){&5iKtxzrVjy^*V<)P08WD`Lh!Y9qzT8++H_J&s z?)RT>Z@>KM*URl{T-r*V3q?E`>l-zCA zAHhL#cbcVyty_fts`~!^4(*tAmtzXz@PbJob@q5XdOa0xVVdDoYOAO_2;bRS59kAD z77rpV?WOpWnF&h0cNQ8DEoWzzl#adCZoT*3toI%h5qXvw$>du&w1}nSzOX(vCTnZ$b{zXO zP?nSCR8lI(aWJ1MKZwl&Fm2m5+pZaR3TDx4+(qv_x^Y`;AY0Lh3NN3Mo7J4twrv)O zby_z3TWe+N=!dAaYRNQ9Hd9L73_;}cxySm{+V_1Y5@)*HuA-^7-Q04{nzC67k;t&# zfi1${1Zm1+PtBni-HzUK&M@h*nccmV0vZg99Ml8uSC^(PUL^f+&p049<*0P2qnP!U zCJU!Ulk%+f0MFf8MVG_A@B4oA-p#F}44`#47FBb%_%fR%F<4=8C|Q=+=RBb*s}j+1)WXazM5MD$H+l?^ zoe&YU%*OY_y84)FKi(5NKk#>+y0APs&M;H42TnXNj}_jqnVDNkNhRgH<+AlfpKBzz zozT@Va{VmmVu}6i%gF3DXQ{`BMs^Va6>cqPDW0z|J`qO7zwyoZwE={dkS2D1?7;aT zPCv^F-5Ad;$Rxj6UD!I0H)T$}HzP|=c4v*ZzdZ|-)xUH{|dKYst^&-eTNc~t90#I@ERKYjp6*_^`xQmr); zNk~}|QSYEUQBE}SCVfhr1m+9u$Pim#Ap(LeTPd1H86QFs6?GpmQdCn!E)pu=a3SD< zwr%6-Dthlsv|UQKrYf_bs`q-J9D7lh6%nl5?&&L(v&E}r#W)H_kPrh z$w0k#oT<7WX7>Bk89JL}=y45%q>_jPO`yHGu@O-{_TWcTdI0`fC$ux7-?q20{;j@cNe3(1dhCU-mGowU}`HVuGv9LMvh$IRgGtv-*v)&V7h zd6|Y{=D3E91=(ptt|FwLq=IP{IDxg5DLsL00M^tioj^$ zTvnt=MA+La5De(DZbe@h(?DjiIA4B05GO5;KHh|E_5tAloQ&IY!LV|l#kqZ$#;}yCNEd_wgN?8f-OAf_4}VcXyHV8NSy=UiYf`;E-z+Q-8xa(HnbzO-uGj_ zeS5v$ZgD14N(h&s$cRT!N_jjU_s4@}j4DRk4L)TI!%f3F_uf(60?k67wLVP5!rW@_ z{pIB)$R{{vj4Z+?NlAKZy*I$4==F|miR5_i<`&@u+z*GLKaK++)kpC2X@|?~KA8+( zW7gJMx4v!H?eg+?>>rPNZ=+USRbh7FZvXAy{tdKTT4c2SbH6IjTKoQ4TL&*-9VYfU zdX*ufpqg?LW_Qd{6jW~ED3PD|m_Mm$jM_w;uPtSK;!qk&qAtBR&}sG9_x%~&-t0HoG*p{YtZG12z-* z8v~6(QQ`S~)??2(@#ITj)3#D_&bOBvu=sYl)}!wGgNXW+(Vol%FMd~s0+GA$kW)sr zb{Mx=aYbhK@$u8$p!pKvkk8UyW(ImlDRDhS^me&NCv4D5^tzm?WKPO+F_0Mh(=0EIV^E& z!}VYUguC0k1ss$4(@$O!-+_&q_dd8lj!q*!_m~aZz7vsVoZMvA&BVx<1|5}#sQwtW zU}mJJ3@RYk=>=#kg-k0H)d;~;;uR=jc~WQPU)-8v3@HhuQKG&urNk_~cg>?Fjabaj z!oE>uJh#M}D454&Z113QVU}BKBB)!i-VM2vaEZ+1PJI?!nR%q6rN7V5~$`m{{fv?zs8bRk3x}FTOn5FE_j{%GVqF z41mz`!n0!I@p#nzXmc=Hn`#j>#em{I#~eo@9k!|0T2;^SkM7QL>iEaGT>+)4GLiLD zB19mFl#-Ac5o8WKTBv4I%&`8d=G}?pyyH7eox*K@sITW@Vn%guT46Q$%nO2vn{pZmdc&b|BdxnHlBoU@yWjpw*sOXM%` z?0{@&B(1tr2UCzzQstBs(L1ExhPe^#Lse(24|)R9l=bJye{9z{x9^;cqkdwWNb7Bg?#HfJ<%-@kwV```b592Hn0Y&3vo7#f}t zt<5=ss5rz_x;RdF_y9NEdg>Y4dnxHqCU*pegsJ7hbjSdS z%uM9gheIl*2$6~)x+t^QKip45cR>=Mg)S6Z;4jkzwMM@0yBi7t$K>w&{jRDI&T_JH z$+cFdhdb~4@qFyymZpzkI31qYVvM`2v>z2uO;zD6S3C_b`|L7%k&!=@uN+8MZ_s70hti!(VDP;`# zou)%XPTl6-yBjoCQc&hLl{a)&VCS4`ZT(a^Rj~nKR?HEg>I{>n?rD5SPsNkL$=T?i z<2J<&eDVUTae!aaIaaaFxtcJ@A}q|MY&0_fK2ue=HdSTrbriHZQCx)&O=lZf$AtBO``Z-*-BjGXWq+oPWFqc%8Jer)~#AFApQkQO*uB|=6K z8I`k?)<+}qbcIXtNwBbA0L^KyW~N?;N)fsHVJ9G z__`Z%M-lljvnwqF;z+DN&zG$HNn$} z1FfQ5p!KM15F$E`14S)^6sd=5$~pDkx2=@2%}qARVP;KoCgo=G*vo%h%pN@ z_1>6dRq9#SL{lu{uQ>G#! zC>H^t6}7y+Ov`{(6@_GOGIAnsm~GvjvnC$%-%JG4tEqQT<6Xtb>Hcx=t>sdBYeyN|YdQPpG` zOr*{hlf`9%A2N4qtrEEz#FoW-3yWtVBTMVfko_%Sz+YK=@250N+mwI3QzBv~wpsr- zQJ^6<_NmkE=Ijn-CG=`^>&TcHzLXIzJ0st%ABeF*B&ciXE>Fh}x#hKYipvU@`wYHy-lFNt2>gk|sP7JqgT^ zt>;DVXN^DNt$9iOeLCLD>&wM`dBw?xzFzO$dTXsd9uE}2;WhcEgXrkJ5Ygjthm5eQ zV$g-o`cP3q_8Hp||IUTLevVN>0!)czU=|vG;LOQO&X~&8S|b-sg|V(g%+kHj=ZBRQ z07pj40{UzwwLW$W>KugF*xiK0MtP-uN%t@+_GiQpYZYI}OotJT86NQqqS9K&ne?Ea z=k6Jk_XtU)^PSxtyNeM+F=M8YxgXZE+coEH+j1$F?UGY^x!!V0@9*z_``h1Q<%3{A z1`2H=JX&oI)Hovk#!a!v<$3`jCrrn2T(4Jj*T!kwj|1z&%ouoV?m`5@>G^!Nb^w2r zQq1JoC#gW}PDAmOP7NBHZ5hBiHiqw=v~Ju*m^mUcL$poq=4NU3uYA1UpZkHdcWuvq z{PvIk>%aZCQZ{AHWkXIMCKwt?z;mjKMh5`acm#u;l9_vBRzkWvImYC8hw8HR4on8> z(Z$)Bjh)PD-JhJ&jx===-L}Fq2!n{4;%tfvqUttKku#Xltl);3Ip;xP9>>wGlY6&* z)I(I%m1;HjZQDXoug&3pU_`=`4Vx}}dwKC?5c!};-S_IuT(-g_y?51o9Ie~I?#$X7 z4{Tvh&N-Lo^9?j7sraN?n{{hWMEA!-M6TO**)A_HFPaiqx1%22x~e7}d9fgdkzT|z zdbwV2x7+o4z1?m})9dRCMne(NQIFQUKOQ_qQew{_AHhufeu#qU874d$7jVP&FoX4 zC@11yE( zZp~2LlT=k$P{0c+o0pum@YxNA(;i>@!g%ZFy2+MMTVM*s%qj4mNmMe=S9}mm}imTLh=Rh)iD&m|M+7eG8PdMiOPxd28kGYEjFMn3sVOM{Z#mv&LIJ(U!kesF5T_pPW@iGFukJ_ZtX_9F@komK(BbQK8EM0doEvPn%@6&u^HWOwet+KgKL2ElSu?7~ z$b$n_BTve+xaaxYd+*S~grAG{j+rO(V3BjqoKST{M?Lm^uOlJO?Bp|3qbg43PAE1I zVO61&Q__;o(J5<$EvV$6vzpt?dTTv;Uk#?#=hQk97PQFVvR%x22jO=uTVAGXn4P7N zVZSsb&FOl*Mm94RnTS-hTQ~EPQ7!5d>yz~{bIvEL+I#>0{rkS}_xs%!lhS9;DbCUJ zx!2ZYdcp0o)zCqldOFzEtu^c)(2)20hyQm+vRhSOUS5DKd+#j5OZdl&boTIAM9n%v zNX=Q@%Vl%-QU-y9gXHd-lFjUSm~}k=^LY`+{&aV=F`_#{^>QHyM;xHC{C6PW~48thduLsSg1ZRL6~&a0dbDw2>nhP zOjWA2qDL6XZ5op}oZY>vvE9aXs;y_z^8F-i(-<$Rj8IHR*hIWQX2d@116(A6~h&w)xXAWIH zjedxdh84ob1+1r%`O|5QH4K&)oHNVv%+9bw)P0PmSpChq1o2vz=F5kzFa9U^xS)ao zk7n#N98b>WcDq3xz+yar3(*KhSL5QI;;Aq*izm^`wp}ilQi?{$tB52$jy=?l*2g(6 zUIL(x394tUNoy>sIeY6J0%;te9re}BQ?F+vxo03UiSF_0qg8q~R!^2OfE_bOwSf;* z@%3S!OFjQ8b|2zxh#)!SD`{M5yxV$uhk>I{WtZdRl$^H>SD$k(m#vg?z1=kF+sFIM z%ggim+>hfgfB8!QKAK$@c$3HDv0XMO!q9AmBO>%%@Wni6TMY zd+$kd&e=w(;!t?;NsSywh33e5Ym0%KXP7CVt&dFfs2QLkt~rXn$0D!~aW+AgX*izV zI}v7x4>%Qtk~{+pXl~b9MF<0cc~*LuS?{gZu^_6WJQ;a6CPuKaZQE8(78Y-g7JG;= z;9jhEBmc)g{$X=)2oD*WN<_27WolsgS+XQG-^UhexdDCF4N!_kWO zYJMDM-g~>;uJDBjM==OXXF1)rZ4rCaI^-RG{P+Q{^L##|Ees{3A%fUibE2&j5k<(p zI_Zc&L{P~p);o%>+`D7QH@nXT7ZDaE7c*?xJalhH`fBgPD_Lr9zX5O|-t?ljYtvBDc?e+EB`^Sfo&6718`1AS9IYnO@FJ)D$ z6&=V=F=e{Ci+R^1<}95wv3BXz!xP7`8VDw0i8%`qln=hsXa09JhH*S29qCIGPpr9! z%og=Cmq$d_4Sv_A8ZXgoh$J%WM?H?c9Y>$?3lJ$ZnL~P4eq`F5b3z+7MoI}uGc()D z2A&MU?=Ur&%jM61{`2+v!V8LmhFWXw@p#k@8G){vjzO~KiR{Px3n8)T^xY9odhInL zy4B~#R>ZGItUi3F``TT;y6Lc}IJ2P#DKo1O`d{&Dy$;n_S_*=}L_q1r%p~P_raa^i zt(4M7OQeOL@+Hw6YsHu_{P|MhjROkD)BoZ|;}^nteKvZ1xv=3uz}NmW1PUk_2P76p zq>@Y`%|2+Iy zMYj|9+QL!$AV(*-bRu_a#^gpef*BuN=zIrZCU-^^U7uMD9{`3_6;;wA!bCY|QFW&4 z_4@6X@3-5nT(+NYZ%3`jbjUJV7d1V|aSzkE??eUJ9Ng?I_P?X2+GV3!eI?ol)ftm3RZqL^G?B>P^2??~RB)pt+Fc4E7c^nP= za_?P5Jm)^kZpIOHNx8KB|Ksb8wj)V$>_7l!<{m*ZE4$}tre}4|N?#!9ef6sSke>Zu z?QhJE)KgVSGQ!;qfF7;^Zp@k$Pj?+A8H{i@Hv=v%fQxQ6+~-B21VCQblhKV_xsI5BeRs!VqlM% zIbFgoc%NFU%v!E9Vz$|BgRYdeRe+d%-?!FUol}y z*;zcs7`@vfMn-}`IAu&3YKWlY`mNj0;ap3*?YGyLA3uJ4JRf(a;?_#L-CnkBj<-2a zh9-0LVLY&00}k@X58wbj&S&o!1h8$}>+4G&gNXNyj^hxPkN3}hb}53TzTbCj5+DZ3 z#I#R&jY-rk-Y!VZIaflRe0&-4m5#>jf*{$)V`j+qW?@E;8aN3;g_kat{3qVhNi6ut zyd+7Q)8~sZE{ND`l_)|YRXxx1dGzz>K>QR{YuMG>wzXPI5qBTGZ?!Qw2>#aE?Y6g= z5*}R_%*`;0m;jRqlfn0IEDQYI};v{v$66W@r?UNM^jTWct;i2d)r zbd#)poEJq#BD18yV!0MbG#?O3%huUEYa*fqXDK2O7i5u_eXm>Vy(8^jq;L^bMEC*^ zP8;)eHSMQg*57WuQifFX#ASZ)H+!Z-_%(F-&nqbkEE*zTR{93dNB-pie zu^L$CJP3(`^2i5_YYBuhl9?CdU%*^0BS$K`M7wi-bZ*7m>Umi5R3=0@4uVK6NEf?qvuLbo4<8-m|6$7e9-52q=$B+4fD(uDvr;S0$y^su`J(pz>hu zI~1VcL8_Uv6EWJSoQS9hM`9>>d`}XaOc`c8}<9@%xkB%|! z_j?J!+t!+zqLrb{AzEx^$k1V?+2iqWYmlS!=sA6TeSLp_*YLF(q7M}E;E_nui$_uI zcFC~ST6sj`*fZj;8JpsrvB(*T#>p%}FU{x0B5c>BDPUhS>wP41nP&jc zai}_90VppasVy?OI6Ju$;8M&L#;la$ZtNtfnIhN^GymIK`}Xa%)!JH1@e7UyM!Q6~ zW)KxdkV-@*t!=`7zulR?J)aK*V=pf+a4vOg=(ffp*IJYLE>XFU&SDBi8MMj>qnwYG zW8N{ePVTpRYn!`2pXYIOuu7_G&9;35wz%!LZQn#hSUx^Ke*5w9@$tb672#0~!z?f@ zrPgVhg;QC#N=d%K%+NEQmfgoV&J%z2{_(N3w(UDK3-QjXs0t-_)DH=OW{FxqHAA>n zTdTFQOb6*^$MbkR9?#Fm7@b+3&*OI6b9d1)=6LizI&O(gX=}HA>*slXygzQYn~C`b z{mWU$HpT!X-8O5jJsuA((x?Due13fB%=q)?=cnJUlJ{0yDHWkRo**%mBFJ6#uFPk~ zX|wuJ7t(9-G^^3ZdEB?XRzr1QV*S-a5OMZUj-l>{suRgx8*W@xao`xO8-#XMVJac{ zWKex_a@9_L@ig+4p22ve=i}37R8t-DV@0TYlr~*|8|f-3rEIOey}rJ_zLqjuEm55! zh1yiPpAtM~RtlF=%>Co>?ETcC=G4!=ZJW6teMlX{SjPDL_?$Y*VHU<1Q62@5B035jcRsNw#ec>aFX43*k&EJYSh-llkmzNig=!lj) zDKbvU(X`e|E%}0#8Vut`D36@KWj0eBRYH9TY$G!Z6BERh$!2>%zO6^bL!vHXm+WqM^zxQ>Yem?ND|}%)ZhzvjGT4qjx|NsD}#bfK*YAl7PgBCOwf0Tgug< zo~8-!S&KMLStTOkNp}i|XO}oU@e80eHtnTW@V2#9VaB9fba%ycJytUoCT5*NgcB%d z2o%Rc$EC_}uruobSFm{8iYThD}Xf;6|7IaBX zz}j4tq{aBSV1m>XK6vW8IvW(8Ik=^~RJ)3kQ2iYvL)cJ~FOf`n9)}aPZR=z7QMOh~ zt)a*oO<3;d+1*C1?bdb?(Nav6XM3p;dD*s|sGnWOIQw9C5jJ<>`FyYuCk{wzR-%Ma zgjk%W%!Wf4=<4>G*#BCkB`lak;*#R=rOJVpu6|}FGojE?CnKUumlFFp#Lg(2wb6P; z#KeFhrBxP@S}@0D_GA<}&y$M$&%gcc`}gkvj?9d78_FDUVc;Rs7SK}P$w4Fl6X5x} z4U7ZE-##86$Xz14R2Tii!jp#+k@GxpgV++_Cj(;6;BP%Par+lvk||&hRu}+u&GJwX z=jVA6T@!?{MYBOZ!kE4HemqaNnI)NhMGMofW|(WAW_pQ>7SQ=+SZ1W>kV#=ig+P;e z=4(YKPr3@O_3D;I&u>EH^$ZddYH9)EMF^M(3x!I!+T`u+4Jm?-u$Mu$f8WT5HxvvdDhhuZmbkWC{(DUEFIFXHnjPZmI4u^VBfoC=i!uRZR5hYrOD!RWhct9L zIShM*pCu<|!N5rZDsr=h1YPrwwN@uTLatn7QYW*viKqy-TF8hh3!5+#F|n6|0IE%O zC$J!q^F?zpbN%X`AZa;^m;u4fOrKAX*1!M$`{Qxs4#`Fkv@OEEff}E;Hp6{#3&|#C zsNJzkDMIE(iXrTBv0M{X=gm&zEVGIRaWuinf5Ch+Z$LzEZ*PcE$D-R$tDjo_gcbxa z#t;H82*H|#D$6!-_p=WqxQWOpx~%e*OCmH00uJBg(YBZvcV3~HF0;sKCglR_CEc|c z-mu2F3lxQCxfJNnFQU}EL`3-}X|$*C=Tc#xX!VHpAX-RbSw_y#LJa3lW@ZdD$j8b- z-(p+Zl4SRoUmw?hWrp(&{VPPvE2M?e`gyrvh@=$Gs}hkYsGrR@OE>GfrSiY4Z@%#I zS7G;D%5`PadwGYpp58B zw_wSBn}v7odd#n1`4sOhUqc$hHgm#0Re%3e+U2ZoXj=X z>~}x!de*v^89$pS$db?iq^z+1LD04@qhp1&-2$NMp0;ef3Cgg?Bv;h-aOET4M)~;; zx7f)hpGIQ!5z+EtL{ugP{aP+zSVm@cd5s-Hkm0idq$Y?I(-6(vniBYIJCSWB@&i^! z!uS%k1X>lWd)hxR0Fap#-&}?TG7Kb41meYzK%Kec&g=4eeHJDF;&s!eDNbPV>;k25 zj@jYILXT9XTFOb~@`hK1s&b{|Uw1s6f-{__(`SD0#Gs$Q8p6BQ1 zJDUL9xqtwltyFSldoIA-6OUxEtxJKTOnfD*)r7ytq8d^g5?=^|Aq=YbwW3>7;%WO} z2rUe$z+jsLy2WkZ)v8kU%G2g^yTAk+&Uf*1QOdyY7Wj>JHjl-?PE)82f-HlJuHq`F zZQFb_XtdA_lUX?S@tg}b4mr->84FXwTnl(Q26z#i=QK2}d(gqP($p0S(At?73pys@ z_@G!raU`kiz%ND7$dQMK;RKrVCDsEMSGWR&Ow10OTEu+qr$LK<{rkmBrIa!Wp;BX&SV=kAP zriHNqXI8jJc7W0uf!_*H`E?U;pzv*)Jk(|e&&^B+d$P%E-ngLU=+bxTH^JxgfH$%! zzuS$#{0;N34QD2Daas7xNxKPNV9LuH@(Ev{znR_Io^Z4>+jgI}h!t7G9%dr;pWX!kc8g)&NMY28;G|mP8{d$ryq!wY) zK!j~orJNb*e)ESOqQKnz^!xIQBL)tLyYiJHBy!3BCCeIt0bK;Gt#T7-QYpK@TdF!C zK40513x-I&PQE4!hoJBJrUbgo{J&O@8i$H`7s^E8e9fn%86@u zY^Cpk58m9*pFa!lpDxyKPWP@~M8sxFNJ#jd15A;I3aN+~lI%Bz5J`#<*?u`d?KwT2 zfE84OCZL;iQTyul?xx!s$)cQD#Ao+7L#0h+mUzyE!eL&!eqbjvB+}g1sNb}jz78y8 z=w^SP?HSle56%`>(_2L%0g+W49gZ0lNB8sJ)7vzOr+nf;n+$}vr*8E|aQ;}FDsVRXBX-7z|9!X2VoJaSEHWhn z`IKS^+vW8$iA+JvSq~KtYVF-g`M*SBNJi4Tn0YAz!=qKM@=(gsC-p2G?1k?LX~kv! z(3#X~&5T4+>6Sm0nRzP%E~#>`rAgRfmi_DK#-L+=uUGqP{X1b5RwacS|2Fiv8#ew) zitdTLn8<}?0X{6`SW~4r@hNghh_|>AmK}r2K-5@UhNlr8gmn~;tmxu1wZr8FvSG1e zHUqh@?_z0@{S(fpF*pXGj=$Rg&+NsWeMGMadt>tnhZj2b*FH^2Y>GeN7&gs$JcH-+qCP1mxsqQi7QhyP{rSyjgR3Tq+7?;a4-& zW92A)M?DpoS0SS!MWY>V*sUJv_Qv*pn-PgiSe}hEI!swELFlPTCmPZ-oIXiGZ4)fH z{^vWhjI=i2z0)i!bTbysL7{{;Qd^sNBcU)Ho6LM4Jh7^1@8Rg&U~T2g;N{Y%Z_;Ij zl0HttF&g(vq+eal>~|B4u139gnX|5u9kNC&3L?!~rkL;7=t>eWKfHp(4sC*07p-S|JazVl_jC>R zJuZlncF;X86M6BlSxGp;6l_>YdI^tJJ25|SID1&re7gV)O1kT5v(`aH7we=$Rs?l25^8EdGMrcc%BL7)v1^E~ClWhDqLOoDc6meQs_~h3z9L6SrM`kfnps z)Lq+4Df$SY&cJ-v@+OwBPKF?!NBFFL4swI%bc_{MTs5q3m%&j5x=hHCB6RaExz`3 z(UbD=&YyZ%-*N5MkmBuEL&j!^jVfst1WAPDx^rXY_!uZNzw@v9MIavU7JCK}_&DF0 zw(|aS(%oLVX#wpw8S_555i1l+;-uLuNC$B2%D-aH;uGY@RS}P`r%Y9KF#@duROdMlZ;e9!|fIk5UmJ#ZL z7K3Vn{3?1`t4Ztl#UR>SXi1ZSBJwEqRkdZr#q9&``U*Tl-nJXvO$C5Ruu;pW^RAVP zRw5P{0_s>^$!j9{>U%5lzdZ|Q!gjPdjCZ}1W}u} zXv37ue_M)_J9?QZO!1|c!RBA`VlU;9Mx+wiSKik)aoRE#8Y6lgnAL{kQe<#+bE(rps@9wVsFMXcTx>I|Q&$k( zs)z>`v&`+(bX%yYf1jr)!)SGJ9x=Bh&xZn znt2HlEFE5{nDbvc8Ze`uWWTj8Us0nme#peZ6;Sl`QrD+ulND!; z8SQBjh<5hjCD~e39B7Y~{X_0q#M=;?=u#vJz@a>ZqjE(0r=l9Sh7jF=w_8k=(^>As z`H0?xHRk)#35q7a(VIJUn*E^@w=|2)cM)Z*u|3ce%h;1la=~qCumKG1y?GdCtPi1> z>Ioa^n=eXn5pr%ITan=}WM(#>p^tEb`DU1wcgI=@389aVpW}m$qEy!Fd~7D%O+e1M zzV_I-otje9Uc0H$y2}rGIDLLd4|@8qwUX~&l`;CvM~9lzD!Ss@^@qhV1Ofp7G3)7< zr-H9Ei-ajW@tU&x_i5Q+4eP_?j~4_sNd}PSW-@zV*nJdBnCkz0ek;0nSU5(22?T!Q zJJE9g?*(`-u(17GrV$_H?+82mo$=~R=M6~Elc(;ip& z&@IzxiC`S`=zu|^ldwG(lFeyv4Wc=}DkGYqSR7v>jWF8O1m#RP9`!6rxg|&G%y6}~ z+;C)WBuk?C!xO_~6{WN@-;#0PN^e6ZYi*ostBUg@$qf+@NaWNN^FXalKx4p%7Iqko zEHVS{`9oaf`uckPCffINV3B`y5f$l=Xg2K*N?#$iw09Rv=qJW1o>cC6I^IaMN9TE4 z6O5GCy}ahsJ0ss1+11n2uf7OfH#t`p&{`{OIkS~;*_?37F;LVH1p5R%i>b+Wfk7@p z0X%Lw8o>bbAR&c5nL4%I>JnAkrK*Xh%P1 z^HM4)Krlo8*Hv@aRk&zZUAH>bmG*$qMbMHyULAw1ZGP1<3Nt)*ZF0vxOP>vr!B)De zSV$h#IB+-TQ=P5;M8Ye)AIAc=7vxt-K>e%a^!7)lINk=IwEm5NR`}Y?i#J9CSTVSC zznk$qI6N3wv|9--mLE3BrBUsnnGLM)7fBg4#PJE{Ht{S6v|6!Zfl)rO8E0?zWw1mu zQ(sa^n^GhUmE&+%w%LwTaZ*Bi=s)7 zOg-SB#CfDAefqJvl#yRYJI8`DSClAQt-*|$V%@g-R7I<6KUiF}} znSu7Pd#MK+pb)s{xEes-$}stJ;7NHhLnDsz6&n+n<*TPrem9#mbz*IC*sQFh3Sa3) zPSi9hrEAJxr*#9~E6t9uuVo!HkHmj8aIE(WE43jgU+AK~g)Ou_FE+HCjjvAMT@#fl zBa#Xbk0CPpl$IC8zp@v&itmKt53Ypb0X~+6Eh2dmUz95-q#?LQU2!z3wBer*OQBs2 znx7gJ66xVT6FK^ZU)*v3b!OWl*@E!ty0)4q-0lzU>`M2$NjzaMa5MkB-Xg}S3Uem` zX-nf$g|(FwD#7JBi;zNU5e{!R_jSJg=AE^8arCET_W+r>`+J<7R$|(piI^5PHXuTl zrjM0S$I8+(gePLW8OUhH@Cs{I!yI2XlNC^l*EUBi9j2QGN-5so`4iqrJncyQ*Oc?T z6Z8*%gezG71#Nz}6yzgO0ao6WC4zzxGxXt~*YnxNqx+j+{KOZmGxfR_W@Leb+z;jQ zJ^<~w6e$m?C0J~VHiJoj|0%YviaCD}iDcJZ&no$&jm?X?rLU}hJ^_#3&;NjuUH!5D zau*{$?pi0p4VyPELT>xymm$kayGcxn*%|x_%o>;S@avRDFTD07$4Z>XbWNW3ZBE%F_1~kPLtr)!h##x5yQ@bOy6h+q%b^B{=(NJAG zF&qp;vD;yY$H0wSfaOBfzAfJw!UNcN2K;jZGJ>Dw21`0j~R5Q%YuaNS! z0|fe!S{7YxE>+zk$JqllHRQa`V@{^gA z{F+6;anqt=^C@8PnR+=^M}T*(P~@Mtr<82q^5hN??yEONwCLZ@{a_vyav#*!1SF*ny7JlcOSAKd$Y9|;htYvq8fFzBu{}8Asum0i>WsZ&p> z<#6Fjrv5~vy-XAT%=q!~op;e|L=N03qwo!>^STFSl+z$s-!fjcx2Xe0eGcUkBi>y) zNpE5JD(FT`zenL}V;nHMc+9@r(wnG%V7?aC8kvY~!V@D?qF7V909-oHThi0(`E9z_ zJ`m8ip10h63|C^AIv{%W(VY_@A)Tv77HpCLufN|se1U0)-=?xdVmLI4&IC$LgK+@( zFCaI4LI+TUQ*=}GVEj&nD&0O59wNAB&BE$%$$+Oi&k`+o)=zC?!=OJ~Ps=dt6@4_% zz`1YSsVCD%fs{?!o;BxT7qKa~jB9b_T&>1Wr-m>~oGgaF!UM6NGT5_HuiVQ?8W>&@*c>Zj^T>^m z1RoLcI?_yB{qqV8pGx7V6eQ3P3P2XE1<-dUYWMjQEWcc3u4MQtc88nCu zesQ_Eg1n&R3BxIoiZ#1T+_0uEZQV;Z#*m}tt*H`Xh)9soL#++H({BGf#w(vSiWnR! znT4EzcNFsD0SJehY2=AFOe(mZcqp`t6fwIzkI> zB>40yWmk6AVC?#HO>*mC8YxF_gn!F*AQASSs1lby#g~}3zM~lTbI}ZEMz>aSpkvfr zi5&e^ezCuoAfG+z?;oB@MkxGtABvAyT)1ZV9$vk_AoQI7wR7FH=3n?n)}MacO^dWB;;oQI_W3Wd*d_S z(h=gZ6ef{(p8uL>WI!%V;?^-h*+YGx$vH);q{5n|G-Jg9-NO2BIlHv-Zo1FJL7ZvL z^Pj^vS-zec_4Dw&pC%3;R$9$I>R?<NsX{SQzq*CK1%eRl7h?bhRhwcvoeuVvTvUK#{+1CGgcKkpi((r|3w$IrDW!|IZa>bcz z&Vr=NE&utq_~%<*T74Kklov1K9p{bVG!rrmId|`(pyKVqCmVVhVko=Dv{=)$2yX8; zEsUHm@%LdiWv$F`k6=Wx+6Y`N9`R6Mlk7EupZC=lYPZ3Qbq%%W0&i*`0Rw@Vue&zy)zzKY)N(iDXz?&F4=?tLZ`1D5 zmhhGEE39^#`s|}OJm##jTzr{Je&=P*r`VqQ0VaXd(U@~)Wjn*FsO!dEdK6GoyPog= zbOm@f;xcAKOE6TJ^c;Vb?lQQ*%`Xo-b-LTFT?R^GDW?cMB(cdafI6nCguKpvj*cV9vOw!d8K^ZR^EwZm` z7HRfluKILtydK@Lw%Y!+aiIUmD81{s!!&X55BOEkm;7Y4#C!f8Tipb7g{hrV&-d9l zor3l4C=30$N?{>aNAR}v>tdr zW*^~W@^q8Oo(VSfW!nd2}zhB(ND zc@Rjxb0e$FE2XZ>TS{ejBVUsga1Es-jKUm8pw9{mxtIkHkkyk&3` zu;J_nQ*n?IWfzwUPMQ=wOw{r^s z0{m|_y$#52*k>CP-%+x#Ql-x*aFcadaUe+M!qQxkWiPSA2QtQzmjkLmHX=Ao^fsVfRewi${X@^`RphfCjc%N(mQWsg9T zkplTYjxox7=Vwhi{pvHN=>n%&<*^O&JRx^NvmReq!x{Z1;DFx*Xth_`hbA=vl%=5O z3*`2dwS*mSF>$K6s~tiU1w1_uaq*=JAZSV?R7l?-ySuX!>{!#_XgEaf%y%CtL~4A4 zcSk~3-GshU0f+CNaFAn9YolY_DT-LKd;~OtsvEJtfgN8&uKT8IQ%^&?62v9VS*Z?m zlxRKCxh`nV^JTh#{^uqv$lDBsiFR?vN(a=2l@Ew`#|m2ScopZfdlxH_pD$RDLh3qX~k+@hU-?9E{3og+)-v{MSW`K3^cQ;EVC@M58G20)E7K z9L6|j!8G#UmLFJ75IyZ1)_fbVsivjkQu-H9#BM=&DMzRg94Q$t{38yHu!*H<>nu;9 zP#MK0&)8BKyK2ZyfLzh;qZfM_Mk(rq8JvtO*Yu`o&hxSVAENLm_&ZTK7(D2kr!+`C zOguo*9!uEp_T7Lxqqt27D4R;4G}Z1;UO73n740YFCfdQhGh!)B?g#a(ISGrEs;ONB zjyhe`t)`RY4~3cs-Z~8S*i9_0q1pG_N`(HhTE~KKvBna{cRK$T$BY?=- zM(}9Vs8~jXPpm7FC0+jPdE)oN33?pMpVpOh?cm;r@>SBwe{zihY>_=e z1}{BG_W775)1flVP35`H4oY{mx2_Ro3zntM{>v#fHPttIRTP@|p)XyAy-s8L0Xp5m z6{_XQf8IrN;39@kB{MbSm!7y&RnwgL)+_96AU3(FEg3?ZyhzAiD*)k`ZruQfA4Qn^3W0cCnnHJj`Dd=noSUDRkKvDwU1mtX#!13;XP=iKuV@0( zl0}wq8JMAwqA16Cf^l4T+0Y=F6A9LpUp6N8-pK#?2?)MnD@wd`XW;jT0++&cD3=!Q zc~k}d5VpjWq60$K&=8RJPz+DEwOvB1*|fNiC9DFk1My$Yn9Xtu{X6S6zI} z6}sCv%vWtMw5D|}HW_%cBUT{qaT9n0O8Ban`PKhNq+A}alka(P!V>Y!8jIVrlcA&G z6~W;-a<~<*k*g3_2_WvmE6DYm*Ld<-vGyDlO8GZ z(fwG-#K$pp=$EjT2TFV;$N~A(0qD-uVX&|jg^%>YwvG4~FxJ!a<>mb; z;&oB_>eWlgCG}M&lYYio&>-@!vLuA!ZF-qgUcHbDagP4|83p07P&4M}_Pwnz3v>3r zgFoU)9G`urzM8!pT=pKXHy{C1SmH6UHI*(0Bc#V|*9Ut>-R@Az=B!EsOrl6kD$+cB ze)iy=yUf@gQmRT-&5(-gnlaPoU*F!w!x!#0{3V`$ z{hS;cPFOC0Nu^Cq@wmx%YA_Q+=dE_p_wK>^ifB82M;Wd!n}6p*c4NF-qP^J; zME^+4EKy;hc8@ilElMxJ(Y%=2i1yfUE~+yhrSYw@OVfZ#IAw zfY&TSt5RKoQu13saJuW>a0Xsco)UsRsf0O(3`g zJc*ark$;?+8^?S`OLlcx&|UNHrh`zDlBsYsQuu}rZ6y-i{+#VA^W7gFy!2_=@xGY} z-K{8CbZ&XTo`zLg#t!dr4}Bugk_7EH@&rD!F^&Yq#vE<$g|DN zJW#uwo_Nl+rKuX&EbYaZ`T!QV+3{)hIq!ErN?o4+CgA1jHs7maOq;Fl8m1qHi)1qh zd26DGV@vST6b@BnAk{v${OA2FG$|gDrDmq5D7*9`m^Ge53pjAZhk94ubOx*ANQP!# z)JN1z-i}^IG`{r4eSvI-Xw^hCH}h-$u}~!y7);?6QJG5;c(qE+&QC6M4P;pphEdrl zE|D^8Cj^bumVFrMe0mL4X7Js-&W&e~j<9FQ9ghd*4QgtVIyz`4quxneaL*rRpkK8c zA{?rJmH5Ipo4++=KilQ%yoXEWvejnRH3`YhD8>@J1$!Va<+l&5f9b}3n8mi$KZwS< z6b84O*nP zIc_O%;$*8wdXa$U+^yz3b1kW z?usI?ukvmWd$fzgSp0VN^V4Te1Ly>)Ox5NmMVx#aGcYdd^^4>5PF7Xc7IA3d8Y*g`M$8{P!bb=m7`>z&cCYGs;m*2Ize0k zY!Dt;MY$DtYnIg$vew*K;;?DvUV+;vTXn+?&xuL&IbW-e<+f>H0%3Q&suy-6g6xuc zz5CFdYO(K}iAR@R<7BF%oW_%tPi@4?XZ#QgU59c7&%o8?_iP~B$^q_RI!==qE`DpB zBxp0NqiZ#4L@0~M5#b=i6+OfAiQ>I7e^|hBv&zI0dCvsy=ZVjJ9EqBa6Kjya04+V} zc#{3d+O0~;813kHzx#)~N#;_dIZ60Y#4ph^ad=`DhKAxke}q?g-3aVNDL*b;Oyvi? zNERMWF-xQnQJJA*jq{m_0igZXJYJrv8Gp{a6_2b0TuNIDtE2H(Tn#V;gDYAcGNTK2 zdQQ78;kyhWFIiSiT3uUKHVCf12Gh|aeJCC{>VbSmjL8@RfkTh~j1lOE9jly4;M4H} zZ`6XOL8qld`8@DeJc`bAFQM@ApKw^Vl(EJ8XM>!)@o}Yi9;MaqxQi<|-iob~9-)ds zK#-O|{^{QLzs%vrwB{c6HoZG5EdgU!ncxffV#tY4-?BEk0j%CHHYf zmVV;rlTV7flUB+{;t|WsgTFk1A)gbP0Uy=9&(T+p5gu*{(@D)NENUD^D&Kt0utZ_v zrrix*@nPA!_?ybi!4sOwbb@0ruVf&=Un~#b3s&(*jUgLWbcF4G?Vm7On2=X|8?HXq z);^m*`=003k7_@Bfj@WtHW)9Ji8w6@8xmmXxcZ#5rLp3QnfRDWiRH<5)Rm334sw8r z{`-gUce0b^4^u+8``Bthe`u{K(x_2i>+*J=+*NnjN!6vprt;kyk$*$Wl8rH5R-IHs zLOT-H8ypCxvQTK=geQ|l2t)rKqHLAJX9n}FLe|$*zF4A+_~eNnWb)&LvzCUrM}Chi zuIg}HuZO(9GK#J^F}P5#)#FfINi%Bc+#?a+mod`S{y8>SI#J5D5T=yl$xwfId{XMq zd^~5A1ZEd^49IHS99dwfAz195TpK(a6a4owbRV|=3XVS}I4byWM`cEr+@^5uA?WfZ%r5!PYz=JvZj!2jS=ydxO8)DPIS5 z)Q(v>^Vjlu_t8(N0<&D}IQ8*A6l;AaB*UsKa91N@PT99FFexy_GeN zo6)>*W!Rf~>PhTt!j%yDUZ|=?ASDw~SNH0Kf_*IaNGfai&rTZzoS~f>nUrAagM+xR zX-$)jjsuI5F-)8jWFCE(n7RK^PK`_+UaBL&0HQ0bWLJ@&bY!*@TUcV?> z^zGSbS&{rzd9)*zH+29sNGY)-91tCr{0D;tAiDtpuXeWm%wne}-W6SAv2$+pJon9b zxdJq{i13k!%^;dH4HR1F)4%AeJs6DFQ;V%~ z>JUjbH+lB-P!30N6s_!XZsC&(b^U67hwhCTEvcdeZ--_c zlxOOx&P-PW5MB!$;5P%4SKdBt*>PZYC8u(@V&=N873*j)#+T`1g(s2{*+t6Y)|5!# zUfitkJ3~})Zxc`BZB&O63y0HrrChh((gL5MR?wuwJh%0(_O+OZVx}ekevD%ceZ#Xo zp(^E?FefMY+7t17LGyfZ{&aRe%@Z=Cua4gjH|{f?DZNEeM6(_6vrQLxyxphx)tV_FbrQKo1OVq} z8y~dN5}E1DfiZ!5oStGPIB{# zO|P+$SBom`Qzj|TORwM#)vt+O6L8?FGx+u$12`)=`l)ad`c07t3=FOqbbn1&AVZ9Ll0FbPiK0ln(4aJi8^Z_STX3yk!lchaHLJU`fKCQd>}=%2asV==4VDLPjL{Biqp zbuxUgqd6>;hat9bbpatXl@D9WU7C^Bl2;F(f*2jAhfEsmbLoG_%WRn<+G|Z1Oi{s4 z4=|A$2c^iEkUWr7P;$1ebVX$t3pEBR)+{V3R5Y^IoCy|$H?Q3`e?TmrnUw-%X z=1J*4b=`nqxicUFb;AIgxoF}5=SKIt{HcTle2|NWISaI;fMJih)c@foPP%4uXU8%Y zk29|k6W|w zhJPEmYKlH=iThnYU8VzMlT%>JifA^@Fo3l@oHlwh=NyUb7QB{z!lae4j(u- zOwYdU{_z*nun44HgH>JB6>k{Y3H;zHY{inz*|)^ephyKy}GpKYK(h z=Cy6ch1kd{@#%-dQkD_Z>?&dFv60aX<}m4Zj>N(0j)Pq8=3BE4U$E8V?Rc_-Ya^>V z?hcRSc8wh8%y-4^r=823_fH1s-7s;uI|%9$xm>oOrRIm+fnaDWvBeNKBe;Z|dg|cS z+)%!yH*O!s zvDxxoZPl-3a{cY~$FVl|3aJzvw#v2>Bja|BDf{am*`^REZ7+d5{4Xy}B7c7*3jRv- zBcm!fPxU$mVf;Lnj*_=fud*4b_Bnm1V$Xer7-b6bMDo1(L*rkXcRbn9+XMEmLEW9n z4Rq{SPRviyxw2ToDQZ835iFlJqZ-`fZE|t4r+h`iF|u027S?j( z6l)2Dyhvp0l*DT2U6;!KVHbngbcOX4^k-L6@%wGjJTD|AJM!>H%Rnc#f|~Fx>aJ@0 z5(iFS&t<+G)?`Y3oX!WfdXOrC0JjhborNknWiGTYnFm{KP+S`IbJa~?FCsI$Qam5{ zd;8*Po*oEC+;FeP#+kWzPcCMoM`22FrVZv`Mt#WFJ-lkuP%fAPvng&rveH=)zNlnQ zd>pSc;Cs&_GEu*psrk8*t*=R*y{Q>ktT>C>Sd#F)aRN*gA8sF-0rE{vbCq)`v3vBV z?@|ru(@4HKe&;~e1Q24+fxv8_f8*lQzXJ*0i>nLxNmS}`1@UveAkcpj9)8hb^~Y2g=5g!F#*?5v>gd%yQfzPh(O z4Ljnv0}eCMsW606jcBxDOe(Y`z_F&Cw#PqSQg$g2+-HV9&y_Ia&IR%YF?u%a2u(YN z$SNEQXFGvo<$>a{N1Ze&w>i}U+p(>hZ;gTN4yLnjt9LNA!jfCLMLMQ(H#*u@7H-a{ z|Ake>mkuoFmhBJ!MEUl0Tv-QI+2s83!dom~Z7zy)4qZeu-g{_pM{$;|g0(HZl3wEZ z=EO_{L!K?cITpGLOzWJSUNKrb!@x;?p-%PR>1udxiRUkgbO2(^ z%YL!XksJ_Af~|{#3JD&XD&~5$0hZDsC_bngD5~gwePdwLAQZ3Wcxw85ZCWh-DLJzr z+_I>C^&J?s*68~ZVAXw{=nOAWLefCw)y_o^d@Fp`WVTc>nQoZ;oVCN|R%VH`c_SKz zB!+mS+ie|Zzymd|q=WV%3ExlznJD$uq-F29vPo{Z9#lInhrjjrj?jEJPJIeFnwkb` zbYO14MtH4r+d%5(gT_CuAqE6>-V9v1mtJ-_3L_Dn5BW3CLfJO$HVGc(D}WySy6R~B z;XzAx;dr~);El0^<9}eor<6Z>t{7VY`K#_Q+zdZ+6E_nnkfvtwA`bM+$HW7;M|2h{#r1qM0vdgEhaLUPk zJf1zoqp)B(Wp#ph$=P@Wm7V$za}Tb#hlJua7xEIy@lJsk#@Cr)R+4>#n3<3Dgnx(N z%3tghme55wS%MN1#v1BREiwZ7q)uG(!(Enes>w;N_*X<#aK++^5$^FD#O566)?0|~ z4-bpYU9i(9*NvNi&-ZGTVAs60HQ@hB`C~4t`|hb+;tTY@sTOE=9=|=ej5Q5J~hKTQvm7ap0tu)U;6ctR~UQY~!v= z$-c{2Ll5}FB89FZ9i7~ym4sGCuU>Mt`*e5r3RbThC&n{LiQX!S;!IyFIPFC-0)MO_;nfYWh&#( zkP=dvx(UThB1A*a=k&=r5)~AF>B*Ptc(~wzNfrTKw{Cd26^16up`?Kes)f4^X{97b z)Gknr2vyLc3)P=)Ru1DC1G;u@Z}Bn5HZS$ix;NmH>r)L0g$V~PdF5@nZW&c?Fexp| zFcKwqm2kb*Z!aaZ_-5(TB1bDz?*Yj-=<(jBsLD1jZ=ckPzaq8!PQ_uhI z?u4^NY>{|gyL{iQ@}>Sf8RMR%y!DlMwHdbYn)Rq86^cz@c)kWqN`!-=+DP^Zp2z$h?DCN>Az+iC>Ij`^T}%FXAzb z8g1#*Z@79|q?378Y33el}? z7O^5%>Bg;2N>4JswtixF@|*{)jy_=sWlIeB?eZVbm+s341?s1HAih4wq553|;Kc!@ zYUPQR%~D3oHVUNKJChXe`~+OyUs3w2Be9bEnU$hwpXk@Vn9c=4Q4e{DQm>@8wR8+RfRdwsK#*_E9-&8?2FJcl!bEHDNoW6CkW*u_V zzouj%E)jnhht8X+lAG!y7PbtE_pXv=!w4Bj(&lC$1JeoKZiR82tW?b}-gGs$OU;=( zR#rv@{PPztycO26#sST6XB^)71B#Mo$A)X?XqvCNC72X+l14Gm$wU5zw{d_U2O+Vs?w2LiGUz6>im3~Qc@-fzi&-c zQwKhI+GA1Nrbe`|P1Cnz4W7KTmU$cn@1~m$mWB7bj-bgrjcVY*TorNnF+p4o+BP>K9J2Ni_SZG88rh6q^Ig?gIFKoH1qN>Bd4mfmm8eY)c zqiQMImp0bG45_#;lKZfBBK1>e-BNQLiRE#r&d&oZv>QZTL+l)J*TiJ^MKI+HSX&T4 z-Ay#XWDx`9hbMn=4|{LcEw3cG-npPaana9g;jfZ100+M{CpLybpW&7!QidIJZqp(k zgj%!bHlW9Z=Gq)!F96i;(*U%2US3NUp#ql|mHCBmCQZ+o`MQ81OohqswR`x+bYN*v zbct|ZJcZ@IrybxKetx=r{!8<`Bk^yKW~Dnck12^;L^$|$MEJ0(I={IYP_Ue1hd65HxAClpS|hSo;)Oa#{!E|6XXwks#20THnK3&68}bb=5Wt5cZSSjE z>F7^ffr5H`>GaxuD`-OL6QyJ`=|tEI@*1e&pvyN%hLFyB-->O?XZJn|<9ksepXu0b zJifn7e7o|xF_A=~Y3U>2(YzyR`|7$%hZ=6f;ImuNK!o4$+G6EvvnAK|R42thCFNJ> ztg?T?@x#$|jM4186{$kO!OG&Yj9Stl;dFx{LJ@qws2{#WOu@Vf0@IB)q;AB9IC#Gq zjOjAJ;tvUG2wmam8xA57bC8ru!Qo|C4sdu*Ybvy)H6>4OfLPk2(f!y@atMttN-r=( zKl5jM@3wB3l_?^D!+`0xW6lM3N{!il`7L~7zqXA24*bFC>|+yg=cd~E@8K4eYFX@~ z$L9{ZX!GOeeZx989l+I@uD`qWL#)gm(Byct&uvVV#N2){YnMJv#5|b#ca0{~jV7~~ zg=Ti3f-?Dy#*R&{w*v_7!u%=IoC10FPJNfN)2N--#&7`WqD_?%C9el6Pc{dGJ_xhd z+&MJ5|aDT<6|32}9r$cTJ@y-oFF z+VIOZ`-Ez^V#-c<9Ckixi|-0998M)Yv%2)aIiAeVq|okkT>ll%yigkM^J^`CtA*!E zBR=xn;?g{o>k4p6SlB#tqiRQ$d}Kj)*$CKhlwmpSYKq{ZN7{#XvfTk@VF$MT&y0`J zR zU(+mVzUj_VZ;dF~csi{2V-W5DUGs)N*{U|JBDa@CvQ!>YzhTzJW4(-p88$;-Q@1T1 zsR|q=6>lOP_W@dz%KH{mpehV9z`|Z#4B2<0fE2%F+?{$16l};z-&6uNYc?j1F|(gP zBKd5N8Z<8QTORE>Lx{n3ubEw4eKvOrn_#=c* ziKBv0*c$W6)9derOVp^$%JN8O4}o1kA3${`)q|=`c@h20`_(?i$ic5V5lc)I=z3Mr zjeabp%~{aJm%U`7>T=oFAI0qEBR5fgGvYdA>wgR1=Hg8?r@b_OFDeCgErHSvNvXzu zl5Y``aT_-y4!N08{o;GZtbM(*A9Z@^P?Zq{i*@^H&|&h;<4+8V6PpodEEfvKB|IE# z$Hi?wbhm7|($BUtT0IjbECJE)Br5tqEkhYBbnYF_I4%dB%#9aJ478env^FMRg6HgR zkrPpEUjF5#T;KYXOLA|nF(4QHA)hm|0NvbvqKNUu$&~GH3Emo$z`U+hpOu5rgv|0o z>}#i-iS*~#>dSIezgO96H!kF|7fCJ^Q!aU&;xx+704&jUaH1oDD*KA&IiL5(JACJ- zW%z1^hx3TDW^p%V(b=jgn6~0#EinD7ooO6@7iN;fz`(>*ZsNua&jFUnw zB)ocj3=o>=s%ZGr-Hx`Al!v)%m!>#BvytldVp+Z>Zp2Mh`D>9~ku0R*FDVG1?N$>= zHt`p&?-gGuTKMUg2Y(c)!+vM~1H}~i6_y~X_-tY-V>BCo+OI~IOp(=M+m5LkvV3=& zG-v%Hw>K{j=@r}v7fSTC87j+Cf6AsaaQbvOA+E6w&Buh?f+TY2(>&z9#oKU(TRX@mrluhROGLp&sdQAL3>9j4Di*fhfVBh+jk^HoIV7bw;Uv4-wCSCr&dP0@^IUDO6phW$2275-iA$FnB zpBj*b;Jc!(4LUO%q&H*ph9MEzOmr}IFe__lB6^fiqMNy_NvGnfgcFbU+HKdh0W!MZ zKP9J1A~9S!U*0L<_aH$~e9$)y50ptJtak+3zifH6I@DsnkH~LR&NM7W)llo`${*Fb zWWXO2B%c132i=zkJskijyeSDfZdUrLwx-GWb;%#JCui>~H$l8iBp+2ZU=i(@MFV@~qcJZ^4e186Zw#`~AOs>5ltrNL)_~XbVw%*kzCCypm4LPTr zk^1CyU4HrH>$)z;&)U>;B@H@^*_@?O2hiOtqNIqHTX&S?=*)Y`OCd)Q3G$%FCR-8-COD5Dvs3%Lg1NVg;L`Y=P|*K_h=R>I(A zW>mhUBtVs_N=kWImUYR?qB$=s3U1cNzV}2hbyGN{BsnE~Rz;HH<|$`Q2}O4JE>W$m z5p!BHxcf`1qMCD(DIv0LTS#*mk(=3D4T;Hf%9SX9cfe<{XoIiA+{{aBV8wHCIPsEn zT~=al){diq1WKg0X9zxCk8Xa9zV# z?U&#G^4t6S8+t+^ezJAC<_=hl64$x+42{0JGz{pFAgT#f>MF9X+jiOVlDW$=5!Geg zw(DitR!Pa+jQsw1?8kn;f8K7l+wFz`c3dGAWn7V+ggQ&38UQ1yqX9Y(^TkFjD$)xe z{rUX-{P_5|eSY5W_uK9Bu^+WH)bmA769#L17FH%qY&`gvFJBRO>yhBzXNPU12;9kr zaXB;rQAgqqJ;x|>Q}5NdEUc&$PMVtqUWmdXawqF$lVr`@oQc_4SU^-R1EVIQ!U`Sj z9iHBCT0@#CF$;64r8X1MQtP+xx7)`@Yi_l%a7r0)4|Iewvr@|A@u;JFXG&=lF{0v| znK=NFtu=~p!>B2|-ENSaGGc@{iD5Lmdr&Nm$N~`&Hm8h|vN@!b&d!#a^Dy zok$0O(qt_~#+I3Dt>3?Y-}l4M3Q=;W=A8iqLYD_84iUNYF|dq2ILMIHhE*4bDEPYj zdEuwfSJ+!9TKc=c`@6sVf?gUzgmIVZv+njD7siq58lbfqv!2h^F5 zGWE#~<7eA?PLjlsUQEo{Hcc^8VLndS9V0(EfQWcbmRg6Lb!Tgyqlit$*90XmUZ0_9 z;k;T$uvxQKYK=x6%DgTDSfr9niZnwG4ZNqhU8+S*Zy3zt?&rPW4E zrIu3a^>SrZ+sWNw$LN`f+o^NU_MEAYz(X00bZf0gIr2orfSLcxU;gs(@d1Jl=+qxw z%s3}wl_l5^@m)D*C%48Xi5qqU~JX_)`{=byC}5gC*vJmOC^^qkd}dcl5& zFa}B?bs%4OwV~|M%)G*9u?uf-oN<1oL)4I4Z7_g60SbK~=+^r}{?&C2;}c6n=!C$+ghtj&Tb|mU*6yT%YXTwRONQN)#GSIggL32p_SArxx!tX%`BPn&T&cS zhg;!FAQ~;qNI#1R!VIk%vUx;Q%5lHn-C8;JIHw`D{Mm@4XLnpgl*NaW88SfknP-PQ~k!2vMHU%q_#?YG~)ef#!r|MqWx{o9`i z?5B>Y5)o%}B2q!B+C^~m&iVlSFT|itP_5%Q5M&M1S||*-pw^n36BAk}l6PO%z~Iy6 zm8&WnyVc=HlZwN?>!Hzx9Ne9(UzJicZ|WUy*riv*Qb2q@;>(9+yRdiJ)%2C!fvd32wr=gUWu zDy~`F>EQE^RiL40WAn_PEYSVos6|0^U{3)&9v8kh zu-&med^K$8JC@0k$ep@?5JDGjS8ZXS1-heyxy>gT$6d_{-?A4Z4_sB5T$ zS!l#CLIuRgV+;K-7^3NUc?w?6kNF~A(*W-SuX&;j8&1%Qm1Q%=WGk?`8K zjrnYf8eT>Ch`1ZZ7KslWHXW*6rucJ2-9u#9)Uq$7)KD;LjPkVBEVGdLzL%V`WML)| zX=bIC6lARo%JgyQc;FrB2^&k36rL91ME<&;=t-le#)-@f^u0T|5O}-@re14aN)o2y zsMZjGq)|W2Or^C%KBM$P9zh^(+XiwUVAsMXn2)q{yg0{-yF2o^x7&yHKA$JtB%l%V zBZvq;14OWVO&VxJnc1wb4tGFBJ&r?&T5YA2Wm!tCAWmr$DMrA&l;w821x9|B1=!Vb z?B|n=x8UcLKpUBuMMa3&ozsBZ3Xu&^c`XI-{xBwH5vi&)?bTqs>M{}L7ux!{ZQHiw zOztVA?Xn&Rs#Evl*xgMUA485_h`)e=bwM7>ihfqKm5Z#82$78^HFQ_ zegrtBR8fZ9%-V@8m#Nfr7PUVL;+NT&HBhS+JCB)t6k~xW)XX^t+zkhWL2bd@s5hmj z?KPjHak8kjM$Fb)&H-zAY7@ev@4)O%;Mdr+As@^PK#NcrFJ4LvAof49si2z? zk(4wq83M$K+L(&a5pfJdO~e!B+>2?tq2?Xwh+!iK5>H`6(;=1#X#-$J_jPjygJT^X zacm&AeFOr1BvSAwGL<&RxlW@Y?TZ$sVa=GkP5tU(H^zH#lTfub@&I$Hou=Yw>%BU38h^gYl^!A23vWilKL0;{Y*$Xcwc2vg6oEuo%gmP+`u5l6`0Dh4s@F>H*6< zqMK~ZkPRdtB6|h5GYd$M_s64@-CETl5pcR<$^u+sgQv(b{@J3xG-5nq&w|+1gA%uZDcL*r!Yd9&f+mA;(jX= zP9jRmjhd36AsaCp85x&Wg(xrC-I+LP$|<3>?*4cj`*FGUCLAH`+#R{g@J&OZPNI`! zq{bp)WM=ESity*>tqqdGSLyE#$hMic(cmQX3P4H9V&>=uPDF^%0OwFE6Ol51{q1-NA0QhT4m&*m5@<0C_;nZKfZ%Ah?$R4Ranfy zzKJEZX54`j*_u_a>$Y9C&CF_TrIq72j=jLQ+_sHH^FnX(1{X1WT1*R=O~xQ?-wzcv zw^|#spgUDLYGbxx>)-*+z-CH3%C})9e13i&`wnxpwf6Pv*T4U}zyFVa|Le!cM;qJQ z%v1$AE##<~iJdywjv*5}ygfW0KU2C63``gwvC~Q^qGHV;D4UtU-{dgyB)^33ex*qIx1CDo3qI3ahBFND_B%$I-gIC`8GfTC1ujOJx{y z&^xul$&sFISC!#G3A2MU9PY93Q46ND8CY-(o`>eNy}fl}+GR;eQAP~~2NNn>&Db*| z%BX0%9jZ2JcO0!PhX(AE#(a!Ui8RUvW<$g$TtSFCRN!-9pkcqt6hE_p(+fL^n6TG+Cq`H;Va(Z+ zg>;&Ctu4cUcrlx7vUEL?+PK3HN${7O*U?``I&Mcqq-S5~#P!Y=UdWAknIP`sNyAqU zQ8T{fv{Q#GdR{(EwRx!SzAVce@tsT4=E1}X#VcvJN5mv0aYk8G+L7B9d( zh8i~*kFAw+*34sk^E@)Mih}4r3{#A!jZ(zc%xWt~spUY~saXSg4fSArAb6gd1zj$e zlg-$=Y}L`i7)WO#>A4$1l`gY(s_iryCt}w6^m*rV4ulr!I4|pFt$n&5%ql{vOI{FD z%}ISpMEN+}S*m+6%c4a7I1YW#+x3z)<&+xHag;)om&J($^u$;sx1PRiZVsM#AtF1u z@lR}ocV2U+VMq48NH9J7rt*G@m_<^`qDdBI)n(c8lAD=mkF}(AfjV55^?JP~Fqh{A zwe9+{Ee2FJG5!J@(y7k4}|RfSX*FnmZ95VZF5f= zkQvq5tT~gQ%;fv`?+r(fNJm>ROn4*>Z9+mX%X-<~@KCqgt=1;2!P(iMg+(@ zKT*e?hW~@z*vyZkP;a)rfBo{ssxz}O`@WlbZG~CTirL1|ih6Ax8+6tsp%J?sFY_Cp z=<$rDQ9lTsAIhDGk_Ziwmm$d~RY&5~ddC|F@Y-twUzIdBsue_ps*2X$rPjS1B2umG z`vDlYhyc!+P$a>A94#fyIj<|IsfviOkhvq)o07!NAvd>P(G_l?j&`ZT`?5G+JeT4+ zsftf7D36TrAYtuH9Z`|v-8v^2Z-{M~nFzYl1Nc-*Y5RV-$NNuQTIMXH-Ycc#AO|gl z%v2IWZ)T>t3@hiX5ylh6V^R-~Dag7Am@|YAh=8Ic7Ub?Ks!ZLee=v$&me$(m=O^}z zh;+R5u&sGO*#fqhQUdOsr>R3YzqPg>hlJD`9KAA((FmQ!3Wj-#f1?H{-1u5+UQ&0O zgq(VtAnI7DLX8l_5m8o2x*)g{)ayh+#LYCw!iRYhn8Arqka(I-fG*nwOZ4T#q6#{YiPD{N+o1!E|*JE zJ?;+#oQ{K#`b3J;-H-k7f#tw`;t|~4tb~G$WK(Pvnds{(}3Z`)yelcXw;8mSf-Vk4HK7QjTrg)U6zy z9q<&6V6i?9vL`G~*zPaM-;grHL^f5ydoc6x${+-`oZ_=0l5z@NtEydes&KDDO|>8^ z(1?4P3;4+ct7m4%$Yq0VbeJG597v+h?-O|c;av5=hN`yK3zAYwEZocL6fGLAr zR0~=kozNN^z=M?1%LixKi|Q^P@n*9#zRrZEJC)3~Z6$N2l9IwG|NOi^9*?Za2DoB` z_berCt#5T4&B(6-G=fnPbzy4;zv&6RF#cr2j&CC>fmJ(Inm=n$tS_=3wYE8e5N6HT zW-utb%_Jhwod&e%C^emnW4aQV#6C0oT#VsNZ)mX&+6f6ZBv0@A92=mN zf|{gI+p}zEW>k8)dm3yKgKm~5fWcE@H)Ir_{%Qw6+mJ}J)|NqHfNz%?-4Lh@j6+Z&;GjvaTN=AAkMpUw`@K7s$A%b(nRhPUP?@B}_-m zs!k<%JQCkFP_wWp_kG_V`+k3X{rYv=Hag9k9(5lA)ZEAgH7J=G{A4X6A48P)U~|fu zT5pCaBDI#|*rAPww6YBlXQ+@i0G%?T;6%@wC_8LOmHsDy*6vjffy4S#LFjy-^Us@sef=r5+-enN_t`XJQ*ve9Y|LDLjQqHLE6PZq;&9b1${+ zdx;3*aJf$_ZCw|90S3A6hkFx|ecze+^Yb%KE+kct3^)l})gG}3I3SOd8Hko}PgO-r zCJ||FG&-xzY79w(ecwy*_KfKAfmO&kF=r9P1t_H@&MBJCM}BFZHyY59bdo^zbiAs< zHV=JFbVi0~sP=hfBWjKso!R2C6QD^*@xg)dkqsL={M<#5x@{nT0-FI5WG4d#7~Opi zf1I|6nN6TTxXpnL%jWEyZkKX_tPux z5Po>P9zS!B_?G!W&=v=&O|wo!I*Z@f2{b{gV@J`?OjVl9&}qM&bfhsJBBtk^96!&W zeX;B2dG_JGGjnRS2W#EER-3+u4baBZz!Y>R477P+pBW+~pNhGIqy9HUC&ImFc&a6&kGml^v~H@Zq)X1lO0RGOnT7XWh?sqQ1`N1+9EbmGXCr&TL|_|Z&8+Oqn$mi?UanWk ziA9VlrNok;9r4*EWdvUV6(=It(0v2720n}1?e@nXf4slHhohWFUz16xpIYIvtv(FF zNPUjmp16X`{W4)`dg9LGL(e+Ut@ zFbwxj&1#$t9k8L0N^uk;&JoKIm_i+h!&)oi-lz7W-j9*pzr250)2ldh*@@`;_dn}#komHtqkTRek0ob!6Y`X^a?eS%fhfWV zd!1=BYiE_Zjc`{e?>M}w`u6sQW<{zA8H13UvFLAaZ`-nna4B`)9|*)k*&wy;?n#wd zkK<^ntrTl*KOT?|h(|`z8+}eR}Pyq^z=|n$=XZ zs5p_emUFsZH|vbzjhX)Tw?CF;z2EP6qGee$Wsn_Wvz1cHQO&79sdu!TJF`>M!MPik zPuGj|kNv|e-P2GVVW;8tkRufL>#x85{onunzx>O;{PnMYopnh_yjk>94`YZKF_RI> zSDo3Ixi;h4I*@?PNV6mnJ&uE!mStVn_5OKZa)vS8&3A95)W>7@VTHTX?e={kA%d!mLnS@zX0*n@dH{?mY9y5t6O^V8O<|8?7HkAK zUUm+FI$#P>MGh1803rwcGa~fUycxror`>@!jXaaH zzRX5!EqcB}GQ>S+0Tnk7kv{)v)&(!OowqvX?X;g@N4iG^KKdeBjoygJZ+WL>hV z>Y}Y9yxm$$qE2LPy;4Sm+*pWF+e;1$v9B((fVbScfyvB%cBRKzWfs<)mu*eUl9mPS zUfA779?HxTXgPBlQXoNEu?UZbK<-Y$;vOyLK0iM}jp5#_UgrG=S^@n0xZi;ak0tXH z!fXNL=MnydNueUVEQnft|Nb3n9;%KAIECIDFr`#$IqV3f65eo1xz-*qIF7>1(uU8+ z;(|mHwN`LLc;l@V5fwoU;}i!xNKAYLA)pfGov)gjb-duREX%rl`TCUuUfB?=MQXb- zduvrR9kpi3!jx2UPS>|!dBRJu1?o=zZ4g@Zlkw_9%YYlBhi9C|v%q*gbO{{D`0s+wA}pdS)RrL-iSm?^0^I}u6Bu$6rv9cco$A+dhF zUP;6U>s-p2nP@Oo*=TAKssGk`%3}Q5rm1)eE5vO0pc!w2j)SKJ$gDEE2{LjrfN;e7 zU+jYz+l!XgfXu!xLVl6ux2buA+!s8i2^jHen<)P0Lc^aI08=A7^MJJ1fuIha|g zHKpWc5@5%aTCL`hGVagv0!bg%%o*bk`KcpGg=^Rl=cJ{Sa>{5q*59u}OyNa{blwuE zXYWg+2u>k5rmF7jSm>_5cqD1gZ6D%jJ_xg^H2-XqxrxEQ93Sg>1sr7RFiv)6GOswB zeW8Vgv6m>RHggeXVQc0n=pj@Qd(WmbT7ozeqvX=Pp|z!1b8_&6;qAv~wsL{~PM&zhp^OT897)EV{9|kr%9?lT%8C)SmR7yDtdZwLI837og zUc0)toru?MU6zcbcH|C1k4Dclnlu3e?3EPZ)>whpkaP`;MPu7AhfxQR2Vd#KaSi}-^hrYLOWfVZ%Za09LwN_?Ys* z1{dQWk9i_;BIHja`4wUaR_Xk_I@#cD0YOhPQ2 zb6S@5dL<(I__&o)kK_3B&p#iJJ$wW6PYec8=bTq^ZhoS-Lo9S)%Cm%xSK{9&znz64 zbyeDZa@^BXGBb1r0^K)4^|LZ~(FA-NvLVTxiHVhZ7cD0;W>N7{nus(8LAnx4Yc0vr zS_8xlGPab$M5=-#Q)~VB_(-Wc7{jdZ#D}$3BSP*QUQJ$@?3ndmm`#|6Qp)eY|NiT* zzn0d%eftPa(VBq`AfPO>)|hSOI_h|&cag~{W$yL~b}zoDhW#3Qz79&PkZfJL5{sN9 zi%eWwKNqkh@TZp`S*#{a0si@wkQLl(u~;T>Bo5lVtTqAlf(~7zH$?5t--!bJz-YkB z>}V#uEIzru@$CMb4yF+!3;`SI>iKyCByq}&CjqWFx_{+c3nw~P`W#MScOyi2BsF>r+X3enalm@Q_P;sytQ7guwmx+ z@O0q~HZq6vW6$y`zD0f@t&C0k@_Mp1;zIqfJ@M#HW?wI|3YT)&wmuD&#p$xV-Oxy1BfudsK+_KS37UmJYy4Lo1 zJZ`rS0FuIT!jsJHdS~NiFl>p9#5YgiysT@pmQrrD?WM4JQ~lfb?_b{E zmz3P>ejMiZ_U6l)gjrM4#0RtW;)@QPbOK`XWHM^?31j;71M$=h(9BJRn_JuWM5gTA zs&Tg?bMAygJm?-EN7m~F)7t{^J!1Yj=jPt5f$GIawhO@p){qxU1zkU0*@B6Z(l(V^)QbmQxnfZQy{PEX6zJLGz{{F^H zs`~x=_kGVPrR{pDd%?giQ$I}1VerdE2?C9{^|CC0If}^jdVPC)lL`1$3L2Cg?m48Y zh=?i+TPdR6}?epf& zbmpx>cK;~cWvYjr0|_s?$Vc%6HV-}<1@8j*}%aWfgryF}?dI zJsca+Tpg&{x3@Q&O4{%D``g=F#L>~9!OXU8`|Y>i02*=kbzOr$E5^X1vMO*dC}gyW zOeZq$vr#ht8bT81I(EA-oXkNJJAK5O;bTtBGCDx!Y%nb$ZA94G2>esfYSM_x2k7?H zgK((FUdR4Ks0EZ;ePGW~y?7k{!8nV3fxzuY``)HLW$+ku-!3Y(xXwoF<4BVRd)&-c;ZOS^r>_`{09($n2W4A6@aTZsyXEdEdWAWN zO9y%#cMc(r37_*IHfUL*09;0rHzzH_nVvTyA^}L4Lav3m(CNoZZ`B#+Ryp(nMSRYu>^zMWHcgFxcn}~!Z`sr)1b;=?3`cT6jSW7= zwr%_4_`H9VQXcomZ@>O>y0nt4 zoeeAxP-i2;BJ%a?mu=g=e*OA*JU%`?%4opNJ%U9{YUFHU zL@B3c-kO__p0ZP<O>f&<6}jOD?0pQG85A zYwg~On=w;w9|Z*S(nbJYfvKpqx{(`|QrB&n?WdeG{CvdMQJCyxYiG|ec4j7Pm6_c- zJlWmXWvjKmy!!elE%ItH_0(MA}e(n%fkDot2K0ZD^u$c8hCONYF|QNja>#i;(J$T5fmL8U z(c1UJ=pAjGlCUrf^b{@;ab{6%%?7X4lT9N7MWX|O6RRmBJJhFt)(1~$Kzg(9S|`m7X}+A$R_&Z!RWbOuLxs6k;IoG zE(ot^`0*ri_Dy2s>3yf=euc$DJkqlzkG zr&gO2k#O^l*U2dngY~VpZmdXB<;k_}>Dh5OKxolheuvcR^(j_qgxmzjDF(IiQk zIi-^&n|je@>j9SuPLBCUq+uLj!uKxAf)43E;+o-M*H*DR5Y{zRn-UXy&~Bq^Q7I)_ zqR&SZ0zE1jVGu+lLr4Ao*;oSMbe56iAaHiB>q68czO_^W2OBw&U$1XWR9jUM^q)}b z?iK_PGcC(NqAE(%;bHC8fknBDySj z+tzKnT(8$9FT@N6&28J5yCL2&l7sZFwr0&LP~;=~IbX5EL-?F&!Dss~KH@)%Ow5xI ze+{`me;ss_bTS+n`CbxLB8JN(U00EciYgNw`+k&?R7GUlR?xhFRQEWF6A^drV(PAY zr%}V)AIAZHG=Ss~Cg4cK2CL&5XefjeK<;xclDYf#bHQ~H6B1i+C0B%;XUcS)s6%ru38=gm3ae>Pv9cfzZ9 z8Gd-LZO0WlcaFys5zg1`c4Owx&rf{gwrzP?n0ep#kB^Ta-GqM|6A}Xsr!)qJF$Ab7 zL~)qT=Q~9-De?3tV&+Z(=G6IXWdt2rdV-sXh*6%)01?v214GOB*u6yLPAJB0*2z14 z>f&ev7EUyGly)MNUPP##MhNUDM>5VJk4VA!>vPIJRxnOtOb(VQbiur`;WNbK6Sr83w>?=FYMr1V-F^zT%)>LI zm4p1UseimXoGrq%)n=_)t*x0Ir9SqzbDg!CK0}Dk-IPT|4w`(3_={Y|LA1I3Hvj?k>XXx`3duR`ilKuQ# z26Cmf26>HuH%hE(@1fjUE5zNZhU7qPkhwYek~2t&XO46mMKCfd5F>u<-7&~+wRe+Y zYOT1Llb3S9w+ZA*7|K4vt1?J^gRM6tMH}ot-O+N&NQDq5P3y9fQ#s21*jsJr-^0u~ zB^6!r%1%}r;>}|%os3k3oP}t~%kRJc<(IEt+}vvWyxnf!zgsgh-ye^hmR8N0w`!$S zbKj3+FGp<+9W{<}9JQEZq^%Tm5iIxnXZ&|O_Oc(|%&ju{vSbyuR)pQnmaM4h`ttss zR8)n`$l1+!#0e%L$f`+1kG%k6CZcY1HpU=vcb&o{VPj!O`RK2WLmF#QYdwxa9VUNX zs*-bB*LB-2IjuP@Jz*dzrCdu}mL;dePRhbWLdsoIqoq7AOM-m7Ua#A>ZtE({OHSLi zqV)(d3&LIG=+8xN&1!2Etq##tW+YyytGQ>_Is|cuW14Ir8p?Z?*R!nW$$Jkq5O1!n zIrj)n7X$7ry`M(cUqnvqM50L~HS#mrQDTHwLut8!&?XkiAInK1W!<~%)G2?&OlgpMS$J~W%RISqMQ^afRHfJk~3iJ%%oFq z#!1Si#4K$fb(vB0V0-tV$#-nE+bC zY!HR1P_31Em>Y6CX06uJthrP3W@IdEWX=xOaaIOc# zwq~3xqTYOlhc(4SI%Y3UB`%rr+CTag@g8P2WABx^PoZ%lpFcIn=^(<0%*mXLMo;CJ zFPcC2^x5awBu_3D1~|va&mWY`4PvBO8$}1sLNqXtFWWxVvoTsj>z)Cs=-f^bfDDT> zB)d;;&5uF*bCQM=IX_9)&?B*4Yu)!pIgXKEYi5>ILKxBTL1hqtBQzy~DqB+Ni8d!U zr^wpt=y3HCNv(sY4e}@kMuX`zkG@GZpkwnI%Sd^ol$xJ8K}a+bPV2G`PCj4Unh|+9 ztkeSmA*=1}auH%?x!)hhalBnGEP?skKr{&UxK7RNjC)3Gabe|MuV6L|0dHo2b@--ZfAyEz&WZtO$s1hAau z(W7EM-CD81jv;JL*Bg4 zUruEkh`^7JkJg%1Tk^7P+nO?>{zS&?P^?%cRh@V%m`O@0@K{D9prHT5Z|`0)-31T+|0bThP1}eD&R`%)}v49yqIvCXlrze z$j%!n&T$<1S*XT4d6YJX;Kk>CO3lRv<|!EF1ENrCRS|cw)`Y#7=cdO|Zns;l`;t>@ zMTlE-Fd*_^@1m0jhw5OJM`ng59TDkKGjp;?6A@80gS5dmRy|2G;s@}ofh8Mz_3?Nt z%j#3iM#tq-4@2y8MCgAcC72bK4181+2$rMRNKE6XLVXBVvsX%**(jOS_PjtL?tJQW zH}7_yaZlPIq&$|NC zYi6~U;ho}!PlnbkIzkl1g9N_9ra~?v1j3$7yU7G{Yv(xQq59+VYfIr4WI!X9z}C(w zc8A+U^eo6;u8>OeKwsW}+Ca}OWPH^2&Zvu6P8);;Ag$6-N9Ln`Go*u>vbYIF-3%ge zJkkO4{6c<(A!vj74@U?sRm?1n-lH-36zg^#ixtX_e(5DmHLb3?E0=rgsEQp>Wen2@8C<_7Fh*Egyna=BbY!fn_6;9%iBq zq$WOCYdwx5$}mH<#7Pd@w;$F40Tjf~M2_S5_kaKQKmPbbM)_CtbAr%`3g0lNupwb* zV`sYizVG{fr_sd~k02uN@9#NhYj#;L%d&_P6jiOIjg~pE`4S~ zoEr9S)KuY3GE%pw@U&4Kh`ZXDf!2B>kJ&J=4&pj(vSwDRl~%%(jPLrXMW~}*aGuYw zw||I3M+Xa1+RdO65HHT4{!K8INh_drnDJyzVYRf!2blX--VPD7BH{3*gR zuhIPAJb+#=E)e}7Ltdsdig$T(kop_wRZQVu{cr#6e>{_R_)~q3cp;L!F=oKHB zhA>Qda-F|?`SR<`k8!0S5T|{6uUL358fG?18YT!r`7zBadPxKY9D%k}Q|&Wm(sd&N{>dYFxH$L&5U0ERlo5)P*ubppl61 z&g=F1{{H^^@4vslzk^L_-ye9o2r4Yg^7ZT2uV25uzrC-^D$*H)MZ~=a>Ox%+4304^ zNM8g8`;%~)@MoAPj$rUW2r(nms>DLfDPmzQOw)t=jZ+YxZQ58HTSa>7J%czl5!^S3%gmfQfsrG zuN<17C%CB-H9d*S7o8MmI5fetkbDxJKUHtB8~Yx6POi-#6cM7}^Ban=@666c%fg}} ztZq#;p&f{bl9L&nRoGR`J?=`a)}z!?YOMvVj6{s%imqeC)XY?6Sr=CAK;aSNgha*k zxc6MSP2p{R4M6lQG=0|N49>d_o(~NaU}Si8BJCRTzpGVj6(8RfTCa7!%se8Xoe%(^ zz_G`k7B^0Ph`1lu5q}CbA7ag)<2~nK_>^D~VI9eg(`p3$NK7LUL1F|fhlnuGaX>Jn zNZ$<^#X4k~j8OW3)Qb#7$0N29t`%w!7-ol`+n5=B$)|GCF%LdZmPjd`!l|`(l(O&0 z&b{t!e#WZKll*c({JF#J%jHx4mwq^#FYkO&!Tjt5(z6vbf5hDp&gjxgJ-6AeHe_d>z|7>9V>eG%9^%n+iP6k$B`mCHCo56;AK3aUE{?Gr*|4P9o?8Ll-ycxwM4h>G@S>f)iJ~|l_Xc#y z$$9Fh*{sn?@6!9FMwQ=eN`fO7?k^32uBrh3M`R8cs^{jZKokmWAl=+aD%~)m)?uC5 zM^*xrUk>kt$OfRWPa09Fwet{Bw*pm#sN-ooeEngCk8l}0iKt~`V!{+U!z?8y7ENQM zNpoJ-HRZfrHgM38h^XXcL0%6AbZ?d@LPU?p<9@%3Xv!&+w}^lMsP!5^dNK4*VanWE zi^dgUU(P2G{|_m@ppoNLK_7lFGH&syFj95!hF}`;70a^7XwKV>%kfY|PRu?+EX>?W zg{c$)l29jYN}9tgiz0EEQsD@)etv$UXHuQ$u5@(NfH)3W&%-UbUf)nA(iPqaPSjc> z*M{$n1Xdhr9?{%&U4QxI7i@SqNVQfl-5kd;JfkjlQ9aGf`@Xl*M)_(765zaI;Q~oK z)`{2|M`~XWzNi?Md$eNgY8BH%?LBd10-|vsd1N_X) zOw6iDlZLn;*tp1x^T{FN?kF%KqEad|BY?f{$K&zXj{~**unkHnrBr;W`-$pVmW7FN z?wXkhw~A81(tOY{frI8*;Q<@?a)kh~fldqgHfyyXmDY=@h(&+;(+}^N-yp0s$1PxF zi#mDp26H(hC!;8>P?78uMH?qN(A|l=)^_Z`BX$<5oKwzA&Ph`OaK3gwQ}=yGJyuVK z4m$uyD#*!Tu$qs_Y^%j#fujpg1JOr(3+zawCgRyqmBLecmxrl}0d%!8Dk0*ehoFnv z5lD4S30Ra60y=^3afgssvq8pF%-)`3nQ@%sG= z8-(z9{8~F>L#gHdcpOLR@F#1CmBgaN>Ck7oqA)NbN;(TzeP%a{*^V3XbK-Gc4jNiu zer5iF=*gsugZ$&K{%p3+Umf2v-zvr*zcMim#PExK^)dkZ8NI_iFlI*V1~V73s2A!D zbve(84;J=WY7tSA&V* zenvI+3kKe;_J35i>Q+Oew1>Q z>*bPD+SZLBM+UCk0rJ8P9P0AgmRiL{6a+;z-c8#6PlPDJ~TC(Z5-!^KB{eBQb-<~$m@P#_%# z?x+5LoW0AAB*~H`CJ$BfM?_>+-Rhp{?)@wVAP9m>{=)$LPyPS_ehn8KH2d~t-K@+A zcQaKL;o_)>t49`lLFf9gAr+ysA-~ayi@87@g`wqyM%E6a%dzfJn*|u%;u@d_+698Q1 z`$SMPj()O;Y7lyFpAxv4!8CL9C))64-ORRHNtK9uAGL0i&ngB9VsTnKK+v78;~1TY zd+)-PP|tlL(ZrEY$^-&>j6CxjJ4HHG&vBRcNs;ysy-TpV6%-s#yat;@Jth}GYz#&t1%cgKh}mo=c~vX&lgm^a0ixg-mr!eQ_x;#=4741PwH$84 zjl+w8tNHQqVKD=9t@9I+%ViRUT5$DYarS*j{|yc^GrP~?*Yp+N-{0}PDfOw+QwE`< z(uDa!%;eJ(2sY)VpfGjU3_a*08xE z9>2VqJocY%+kb+#`F;_JfkRK}lnKORbg(Z`0}&~nnI?H!wRnI>IahwJ1g4QC%1Dd4 zT<`Md-^Lq+bC6DuM~)d_a3UY0H}Y-UYJD_ouTdiG+2wNSy_YKI(-lC$e0IZdq{Va2 z9y*It!t;E{lJ&s9nH|7a=fU-eFG^;#Ree}06esGVr!;PLyUDHhE~;7!+t}}SEJANh z$jz*o6WI8+TI(jU6yHBSwo+NNf|%>MVd@bxQ*m=lGM#IV2UKxl5-c(((2JI;U`kS@ zIkH@x{LyF`szR0m04(E7D%E;Fc8;+qh?XS8TrwJU>v^tCtW;2 zDr$Nx`m|7X*^h_S8Br~y(QBV3WZ!p|l;np*@l3YP#L(3EG|fEbK+Y2yk&Hams}`e0 zoq6C_U26P$jGW2m`t%`|WmxXMWQ2vL5*)!W;0rwEWt%cCl23TD#wG zBJ}$D3b#>J$5;rciJhHhKbF^0PN%KzDg^gL)%d5$8N7d14c-EC!wa}-7M1N)p zK7GQUyzaE}cjV`UPNvLe5RnRl%9k0;2?ZFZ^b8|qiI`|gWyk`l&e8Cwx~9cYg(K?OG{%v-MbabLvnhx|kK=$-iqBvB*zn1^ z%$Q!+Kka3fX}UlDkm+guNv>Xkn`yD!i5XStp{bs}Vio_~uiVNEL;Nf(>5;~FIYr6P zb~>#QL|O`q^OES@&isr{f~Rw>6-gnGzvizpL6ljSko1}0UXLXrg{oRlv(<)|A**;` zp6TYIMYH-Vd=(=WI0;Ct?8lMnt4$66SVNlePBC(XoN%oqN4%iJRjgJKSVd;_G4gGz z6Y}Yj=V;&hY3m6|Szi4FUVOhX1{|STfcEH~VZ`j>U^smBShvYYMGs%-vFGVNeR|C0 z+`2EyWL>47-@l&5^=&Ks%m4iJhb1ZZ+$VoztQ|#&TE1NC{Lj_Q zGZCEQyhWbwjx!OLDRrFgPB`?rVT>6kQWM&`c}C^|W%Aq0!hMi;k}_%0A%VT&rA~Q$ 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 Rvr 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

-6(J}@!*E!g#V=>ry&E5V?Qzxq-rqH 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

{dufm`K4(=+3ynti4UmB}9; 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�NJWS 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

2mz{O*c*PnDMTM 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

hR~)N%ACjkK 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%0DcgX4X_WJn<*f&uzpp38ZtF70WyNm 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%0A6eLurfWKrnM#OH6YSi=T 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 z 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

  • Qt9<->$MLE=a#Az}t;@j|haYwG2m<&=nGj+eb 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
    xFTjk#K5~s&6o8h6oe6T5} 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

    &oP#5{J)+Dlc7Me?v%DI8A>*YGq*i>h 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 z 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

    >unT2B$KrjbMhqs^pV2FiN8FsP*# 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 V6?Wn=Q|kZ#002ovPDHLkV1k}3_T&Hn literal 0 HcmV?d00001 diff --git a/assets/textures/hog.jpg b/assets/textures/hog.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f1e17cbc825551165ea396a3554b93b5aee5bf0e GIT binary patch literal 121743 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 Z2LLc}6mhVfG_L>v002ovPDHLkV1kH3j7

      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�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�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 @(_t_e-&+c)1Xo7QI;Arl}GkO~O&l&gdfZwU6Z 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 literal 0 HcmV?d00001 diff --git a/build-shaders.sh b/build-shaders.sh new file mode 100755 index 0000000..477aa3a --- /dev/null +++ b/build-shaders.sh @@ -0,0 +1,32 @@ +#!/bin/bash +set -eu + +# glslc +glsl_compile="glslc" +glsl_flags="--target-spv=spv1.6 -std=460" +glsl_stage_vert="-fshader-stage=vert" +glsl_stage_frag="-fshader-stage=frag" +glsl_stage_tesc="-fshader-stage=tesc" +glsl_stage_tese="-fshader-stage=tese" +glsl_stage_geom="-fshader-stage=geom" +glsl_stage_comp="-fshader-stage=comp" +glsl_out="-o./assets/shaders/" + +# SPIR-V +mkdir -p ./assets/shaders + +for file in ./src/shaders/*.glsl; do + base_name=$(basename -- "$file" .glsl) + + case "$base_name" in + *.vert) glsl_stage="${glsl_stage_vert}" ;; + *.frag) glsl_stage="${glsl_stage_frag}" ;; + *.tesc) glsl_stage="${glsl_stage_tesc}" ;; + *.tese) glsl_stage="${glsl_stage_tese}" ;; + *.geom) glsl_stage="${glsl_stage_geom}" ;; + *.comp) glsl_stage="${glsl_stage_comp}" ;; + *) continue ;; + esac + + $glsl_compile $glsl_flags $glsl_stage $file "${glsl_out}${base_name}.spv" +done diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..fdb44f6 --- /dev/null +++ b/build.sh @@ -0,0 +1,87 @@ +#!/bin/bash +set -eu + + +for arg in "$@"; do declare $arg="1"; done +if [ ! -v clang ]; then gcc=1; fi +if [ ! -v release ]; then debug=1; fi +if [ -v debug ]; then echo "[debug mode]"; fi +if [ -v release ]; then echo "[release mode]"; fi +if [ -v gcc ]; then compiler="g++"; echo "[gcc compiler]"; fi +if [ -v clang ]; then compiler="clang++"; echo "[clang compiler]"; fi + +if [ -v shaders ]; then + echo "Bulding shaders..." + /bin/bash ./build-shaders.sh +fi + +# Axle +src="../src/entry_linux.cpp" +includes="-I../src/ -I../external/ -I../external/glad/include" +out="-o" +name="Axle" +linker_cmd=" " +link="-lpthread -lm -lrt -ldl -lxcb -lX11 -lGL -lXrandr" + +# Codegen +codegen_src="../src/codegen.cpp" +codegen_name="Codegen" +codegen_flag="-DBUILD_CODEGEN" + +# Packer +packer_src="../src/packer.cpp" +packer_name="Packer" +packer_flag="-DBUILD_PACKER" + +if [ -x "$(command -v mold)" ]; then + linker_cmd="-fuse-ld=mold" +fi + +# clang +clang_common="${includes} ${linker_cmd} -DCOMPILER_CLANG -std=c++11 -Xclang -flto-visibility-public-std -Wno-write-strings -fdiagnostics-absolute-paths -Wall -Wno-missing-braces -Wno-unused-function -Wno-writable-strings -Wno-unused-value -Wno-unused-variable -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-initializer-overrides -Wno-for-loop-analysis -ferror-limit=60" +clang_debug="$compiler -g -O0 -DBUILD_DEBUG=1 ${clang_common}" +clang_release="$compiler -O2 ${clang_common}" +clang_test="$compiler -O2 -DBUILD_TEST=1 ${clang_common}" + +# gcc +gcc_common="${includes} ${linker_cmd} -DCOMPILER_GCC -std=c++11 -fmax-errors=5 -Wall -Wno-write-strings -Wno-missing-braces -Wno-unused-function -Wno-attributes -Wno-unused-value -Wno-unused-variable -Wno-deprecated-declarations -Wno-unused-but-set-variable -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf -fzero-init-padding-bits=unions" +gcc_debug="$compiler -g -O0 -DBUILD_DEBUG=1 ${gcc_common}" +gcc_release="$compiler -O2 ${gcc_common}" +gcc_test="$compiler -O0 -DBUILD_TEST=1 ${gcc_common}" + +if [ -v gcc ]; then compile_debug="$gcc_debug"; fi +if [ -v gcc ]; then compile_release="$gcc_release"; fi + +if [ -v clang ]; then compile_debug="$clang_debug"; fi +if [ -v clang ]; then compile_release="$clang_release"; fi + +if [ -v debug ]; then compile="$compile_debug"; fi +if [ -v release ]; then compile="$compile_release"; fi + +mkdir -p build + +cd assets + +mkdir -p shaders + +cd ../build + +if [ -v codegen ]; then + echo "Building codegen..." + $compile $codegen_src $codegen_flag $link $out $codegen_name + ./$codegen_name +fi + +if [ -v packer ]; then + echo "Building packer..." + $compile $packer_src $packer_flag $link $out $packer_name +fi + +if [ -v pack ]; then + echo "Packing assets..." + ./$packer_name + ./$codegen_name +fi + +$compile $src $link $out $name + diff --git a/external/glad/include/EGL/eglplatform.h b/external/glad/include/EGL/eglplatform.h new file mode 100644 index 0000000..6786afd --- /dev/null +++ b/external/glad/include/EGL/eglplatform.h @@ -0,0 +1,175 @@ +#ifndef __eglplatform_h_ +#define __eglplatform_h_ + +/* +** Copyright 2007-2020 The Khronos Group Inc. +** SPDX-License-Identifier: Apache-2.0 +*/ + +/* Platform-specific types and definitions for egl.h + * + * Adopters may modify khrplatform.h and this file to suit their platform. + * You are encouraged to submit all modifications to the Khronos group so that + * they can be included in future versions of this file. Please submit changes + * by filing an issue or pull request on the public Khronos EGL Registry, at + * https://www.github.com/KhronosGroup/EGL-Registry/ + */ + +#include + +/* Macros used in EGL function prototype declarations. + * + * EGL functions should be prototyped as: + * + * EGLAPI return-type EGLAPIENTRY eglFunction(arguments); + * typedef return-type (EXPAPIENTRYP PFNEGLFUNCTIONPROC) (arguments); + * + * KHRONOS_APICALL and KHRONOS_APIENTRY are defined in KHR/khrplatform.h + */ + +#ifndef EGLAPI +#define EGLAPI KHRONOS_APICALL +#endif + +#ifndef EGLAPIENTRY +#define EGLAPIENTRY KHRONOS_APIENTRY +#endif +#define EGLAPIENTRYP EGLAPIENTRY* + +/* The types NativeDisplayType, NativeWindowType, and NativePixmapType + * are aliases of window-system-dependent types, such as X Display * or + * Windows Device Context. They must be defined in platform-specific + * code below. The EGL-prefixed versions of Native*Type are the same + * types, renamed in EGL 1.3 so all types in the API start with "EGL". + * + * Khronos STRONGLY RECOMMENDS that you use the default definitions + * provided below, since these changes affect both binary and source + * portability of applications using EGL running on different EGL + * implementations. + */ + +#if defined(EGL_NO_PLATFORM_SPECIFIC_TYPES) + +typedef void *EGLNativeDisplayType; +typedef void *EGLNativePixmapType; +typedef void *EGLNativeWindowType; + +#elif defined(_WIN32) || defined(__VC32__) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) /* Win32 and WinCE */ +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN 1 +#endif +#include + +typedef HDC EGLNativeDisplayType; +typedef HBITMAP EGLNativePixmapType; +typedef HWND EGLNativeWindowType; + +#elif defined(__QNX__) + +typedef khronos_uintptr_t EGLNativeDisplayType; +typedef struct _screen_pixmap* EGLNativePixmapType; /* screen_pixmap_t */ +typedef struct _screen_window* EGLNativeWindowType; /* screen_window_t */ + +#elif defined(__EMSCRIPTEN__) + +typedef int EGLNativeDisplayType; +typedef int EGLNativePixmapType; +typedef int EGLNativeWindowType; + +#elif defined(__WINSCW__) || defined(__SYMBIAN32__) /* Symbian */ + +typedef int EGLNativeDisplayType; +typedef void *EGLNativePixmapType; +typedef void *EGLNativeWindowType; + +#elif defined(WL_EGL_PLATFORM) + +typedef struct wl_display *EGLNativeDisplayType; +typedef struct wl_egl_pixmap *EGLNativePixmapType; +typedef struct wl_egl_window *EGLNativeWindowType; + +#elif defined(__GBM__) + +typedef struct gbm_device *EGLNativeDisplayType; +typedef struct gbm_bo *EGLNativePixmapType; +typedef void *EGLNativeWindowType; + +#elif defined(__ANDROID__) || defined(ANDROID) + +struct ANativeWindow; +struct egl_native_pixmap_t; + +typedef void* EGLNativeDisplayType; +typedef struct egl_native_pixmap_t* EGLNativePixmapType; +typedef struct ANativeWindow* EGLNativeWindowType; + +#elif defined(USE_OZONE) + +typedef intptr_t EGLNativeDisplayType; +typedef intptr_t EGLNativePixmapType; +typedef intptr_t EGLNativeWindowType; + +#elif defined(USE_X11) + +/* X11 (tentative) */ +#include +#include + +typedef Display *EGLNativeDisplayType; +typedef Pixmap EGLNativePixmapType; +typedef Window EGLNativeWindowType; + +#elif defined(__unix__) + +typedef void *EGLNativeDisplayType; +typedef khronos_uintptr_t EGLNativePixmapType; +typedef khronos_uintptr_t EGLNativeWindowType; + +#elif defined(__APPLE__) + +typedef int EGLNativeDisplayType; +typedef void *EGLNativePixmapType; +typedef void *EGLNativeWindowType; + +#elif defined(__HAIKU__) + +#include + +typedef void *EGLNativeDisplayType; +typedef khronos_uintptr_t EGLNativePixmapType; +typedef khronos_uintptr_t EGLNativeWindowType; + +#elif defined(__Fuchsia__) + +typedef void *EGLNativeDisplayType; +typedef khronos_uintptr_t EGLNativePixmapType; +typedef khronos_uintptr_t EGLNativeWindowType; + +#else +#error "Platform not recognized" +#endif + +/* EGL 1.2 types, renamed for consistency in EGL 1.3 */ +typedef EGLNativeDisplayType NativeDisplayType; +typedef EGLNativePixmapType NativePixmapType; +typedef EGLNativeWindowType NativeWindowType; + + +/* Define EGLint. This must be a signed integral type large enough to contain + * all legal attribute names and values passed into and out of EGL, whether + * their type is boolean, bitmask, enumerant (symbolic constant), integer, + * handle, or other. While in general a 32-bit integer will suffice, if + * handles are 64 bit types, then EGLint should be defined as a signed 64-bit + * integer type. + */ +typedef khronos_int32_t EGLint; + + +/* C++ / C typecast macros for special EGL handle values */ +#if defined(__cplusplus) +#define EGL_CAST(type, value) (static_cast(value)) +#else +#define EGL_CAST(type, value) ((type) (value)) +#endif + +#endif /* __eglplatform_h */ diff --git a/external/glad/include/KHR/khrplatform.h b/external/glad/include/KHR/khrplatform.h new file mode 100644 index 0000000..0164644 --- /dev/null +++ b/external/glad/include/KHR/khrplatform.h @@ -0,0 +1,311 @@ +#ifndef __khrplatform_h_ +#define __khrplatform_h_ + +/* +** Copyright (c) 2008-2018 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +/* Khronos platform-specific types and definitions. + * + * The master copy of khrplatform.h is maintained in the Khronos EGL + * Registry repository at https://github.com/KhronosGroup/EGL-Registry + * The last semantic modification to khrplatform.h was at commit ID: + * 67a3e0864c2d75ea5287b9f3d2eb74a745936692 + * + * Adopters may modify this file to suit their platform. Adopters are + * encouraged to submit platform specific modifications to the Khronos + * group so that they can be included in future versions of this file. + * Please submit changes by filing pull requests or issues on + * the EGL Registry repository linked above. + * + * + * See the Implementer's Guidelines for information about where this file + * should be located on your system and for more details of its use: + * http://www.khronos.org/registry/implementers_guide.pdf + * + * This file should be included as + * #include + * by Khronos client API header files that use its types and defines. + * + * The types in khrplatform.h should only be used to define API-specific types. + * + * Types defined in khrplatform.h: + * khronos_int8_t signed 8 bit + * khronos_uint8_t unsigned 8 bit + * khronos_int16_t signed 16 bit + * khronos_uint16_t unsigned 16 bit + * khronos_int32_t signed 32 bit + * khronos_uint32_t unsigned 32 bit + * khronos_int64_t signed 64 bit + * khronos_uint64_t unsigned 64 bit + * khronos_intptr_t signed same number of bits as a pointer + * khronos_uintptr_t unsigned same number of bits as a pointer + * khronos_ssize_t signed size + * khronos_usize_t unsigned size + * khronos_float_t signed 32 bit floating point + * khronos_time_ns_t unsigned 64 bit time in nanoseconds + * khronos_utime_nanoseconds_t unsigned time interval or absolute time in + * nanoseconds + * khronos_stime_nanoseconds_t signed time interval in nanoseconds + * khronos_boolean_enum_t enumerated boolean type. This should + * only be used as a base type when a client API's boolean type is + * an enum. Client APIs which use an integer or other type for + * booleans cannot use this as the base type for their boolean. + * + * Tokens defined in khrplatform.h: + * + * KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values. + * + * KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0. + * KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0. + * + * Calling convention macros defined in this file: + * KHRONOS_APICALL + * KHRONOS_APIENTRY + * KHRONOS_APIATTRIBUTES + * + * These may be used in function prototypes as: + * + * KHRONOS_APICALL void KHRONOS_APIENTRY funcname( + * int arg1, + * int arg2) KHRONOS_APIATTRIBUTES; + */ + +#if defined(__SCITECH_SNAP__) && !defined(KHRONOS_STATIC) +# define KHRONOS_STATIC 1 +#endif + +/*------------------------------------------------------------------------- + * Definition of KHRONOS_APICALL + *------------------------------------------------------------------------- + * This precedes the return type of the function in the function prototype. + */ +#if defined(KHRONOS_STATIC) + /* If the preprocessor constant KHRONOS_STATIC is defined, make the + * header compatible with static linking. */ +# define KHRONOS_APICALL +#elif defined(_WIN32) +# define KHRONOS_APICALL __declspec(dllimport) +#elif defined (__SYMBIAN32__) +# define KHRONOS_APICALL IMPORT_C +#elif defined(__ANDROID__) +# define KHRONOS_APICALL __attribute__((visibility("default"))) +#else +# define KHRONOS_APICALL +#endif + +/*------------------------------------------------------------------------- + * Definition of KHRONOS_APIENTRY + *------------------------------------------------------------------------- + * This follows the return type of the function and precedes the function + * name in the function prototype. + */ +#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__) + /* Win32 but not WinCE */ +# define KHRONOS_APIENTRY __stdcall +#else +# define KHRONOS_APIENTRY +#endif + +/*------------------------------------------------------------------------- + * Definition of KHRONOS_APIATTRIBUTES + *------------------------------------------------------------------------- + * This follows the closing parenthesis of the function prototype arguments. + */ +#if defined (__ARMCC_2__) +#define KHRONOS_APIATTRIBUTES __softfp +#else +#define KHRONOS_APIATTRIBUTES +#endif + +/*------------------------------------------------------------------------- + * basic type definitions + *-----------------------------------------------------------------------*/ +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__) + + +/* + * Using + */ +#include +typedef int32_t khronos_int32_t; +typedef uint32_t khronos_uint32_t; +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 +/* + * To support platform where unsigned long cannot be used interchangeably with + * inptr_t (e.g. CHERI-extended ISAs), we can use the stdint.h intptr_t. + * Ideally, we could just use (u)intptr_t everywhere, but this could result in + * ABI breakage if khronos_uintptr_t is changed from unsigned long to + * unsigned long long or similar (this results in different C++ name mangling). + * To avoid changes for existing platforms, we restrict usage of intptr_t to + * platforms where the size of a pointer is larger than the size of long. + */ +#if defined(__SIZEOF_LONG__) && defined(__SIZEOF_POINTER__) +#if __SIZEOF_POINTER__ > __SIZEOF_LONG__ +#define KHRONOS_USE_INTPTR_T +#endif +#endif + +#elif defined(__VMS ) || defined(__sgi) + +/* + * Using + */ +#include +typedef int32_t khronos_int32_t; +typedef uint32_t khronos_uint32_t; +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif defined(_WIN32) && !defined(__SCITECH_SNAP__) + +/* + * Win32 + */ +typedef __int32 khronos_int32_t; +typedef unsigned __int32 khronos_uint32_t; +typedef __int64 khronos_int64_t; +typedef unsigned __int64 khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif defined(__sun__) || defined(__digital__) + +/* + * Sun or Digital + */ +typedef int khronos_int32_t; +typedef unsigned int khronos_uint32_t; +#if defined(__arch64__) || defined(_LP64) +typedef long int khronos_int64_t; +typedef unsigned long int khronos_uint64_t; +#else +typedef long long int khronos_int64_t; +typedef unsigned long long int khronos_uint64_t; +#endif /* __arch64__ */ +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif 0 + +/* + * Hypothetical platform with no float or int64 support + */ +typedef int khronos_int32_t; +typedef unsigned int khronos_uint32_t; +#define KHRONOS_SUPPORT_INT64 0 +#define KHRONOS_SUPPORT_FLOAT 0 + +#else + +/* + * Generic fallback + */ +#include +typedef int32_t khronos_int32_t; +typedef uint32_t khronos_uint32_t; +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#endif + + +/* + * Types that are (so far) the same on all platforms + */ +typedef signed char khronos_int8_t; +typedef unsigned char khronos_uint8_t; +typedef signed short int khronos_int16_t; +typedef unsigned short int khronos_uint16_t; + +/* + * Types that differ between LLP64 and LP64 architectures - in LLP64, + * pointers are 64 bits, but 'long' is still 32 bits. Win64 appears + * to be the only LLP64 architecture in current use. + */ +#ifdef KHRONOS_USE_INTPTR_T +typedef intptr_t khronos_intptr_t; +typedef uintptr_t khronos_uintptr_t; +#elif defined(_WIN64) +typedef signed long long int khronos_intptr_t; +typedef unsigned long long int khronos_uintptr_t; +#else +typedef signed long int khronos_intptr_t; +typedef unsigned long int khronos_uintptr_t; +#endif + +#if defined(_WIN64) +typedef signed long long int khronos_ssize_t; +typedef unsigned long long int khronos_usize_t; +#else +typedef signed long int khronos_ssize_t; +typedef unsigned long int khronos_usize_t; +#endif + +#if KHRONOS_SUPPORT_FLOAT +/* + * Float type + */ +typedef float khronos_float_t; +#endif + +#if KHRONOS_SUPPORT_INT64 +/* Time types + * + * These types can be used to represent a time interval in nanoseconds or + * an absolute Unadjusted System Time. Unadjusted System Time is the number + * of nanoseconds since some arbitrary system event (e.g. since the last + * time the system booted). The Unadjusted System Time is an unsigned + * 64 bit value that wraps back to 0 every 584 years. Time intervals + * may be either signed or unsigned. + */ +typedef khronos_uint64_t khronos_utime_nanoseconds_t; +typedef khronos_int64_t khronos_stime_nanoseconds_t; +#endif + +/* + * Dummy value used to pad enum types to 32 bits. + */ +#ifndef KHRONOS_MAX_ENUM +#define KHRONOS_MAX_ENUM 0x7FFFFFFF +#endif + +/* + * Enumerated boolean type + * + * Values other than zero should be considered to be true. Therefore + * comparisons should not be made against KHRONOS_TRUE. + */ +typedef enum { + KHRONOS_FALSE = 0, + KHRONOS_TRUE = 1, + KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM +} khronos_boolean_enum_t; + +#endif /* __khrplatform_h_ */ diff --git a/external/glad/include/glad/egl.h b/external/glad/include/glad/egl.h new file mode 100644 index 0000000..b3a104f --- /dev/null +++ b/external/glad/include/glad/egl.h @@ -0,0 +1,550 @@ +/** + * Loader generated by glad 2.0.8 on Sat Jun 7 19:05:25 2025 + * + * SPDX-License-Identifier: (WTFPL OR CC0-1.0) AND Apache-2.0 + * + * Generator: C/C++ + * Specification: egl + * Extensions: 0 + * + * APIs: + * - egl=1.5 + * + * Options: + * - ALIAS = False + * - DEBUG = False + * - HEADER_ONLY = False + * - LOADER = True + * - MX = False + * - ON_DEMAND = False + * + * Commandline: + * --api='egl=1.5' --extensions='' c --loader + * + * Online: + * http://glad.sh/#api=egl%3D1.5&extensions=&generator=c&options=LOADER + * + */ + +#ifndef GLAD_EGL_H_ +#define GLAD_EGL_H_ + + +#define GLAD_EGL +#define GLAD_OPTION_EGL_LOADER + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef GLAD_PLATFORM_H_ +#define GLAD_PLATFORM_H_ + +#ifndef GLAD_PLATFORM_WIN32 + #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__) + #define GLAD_PLATFORM_WIN32 1 + #else + #define GLAD_PLATFORM_WIN32 0 + #endif +#endif + +#ifndef GLAD_PLATFORM_APPLE + #ifdef __APPLE__ + #define GLAD_PLATFORM_APPLE 1 + #else + #define GLAD_PLATFORM_APPLE 0 + #endif +#endif + +#ifndef GLAD_PLATFORM_EMSCRIPTEN + #ifdef __EMSCRIPTEN__ + #define GLAD_PLATFORM_EMSCRIPTEN 1 + #else + #define GLAD_PLATFORM_EMSCRIPTEN 0 + #endif +#endif + +#ifndef GLAD_PLATFORM_UWP + #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY) + #ifdef __has_include + #if __has_include() + #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 + #endif + #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_ + #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 + #endif + #endif + + #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY + #include + #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) + #define GLAD_PLATFORM_UWP 1 + #endif + #endif + + #ifndef GLAD_PLATFORM_UWP + #define GLAD_PLATFORM_UWP 0 + #endif +#endif + +#ifdef __GNUC__ + #define GLAD_GNUC_EXTENSION __extension__ +#else + #define GLAD_GNUC_EXTENSION +#endif + +#define GLAD_UNUSED(x) (void)(x) + +#ifndef GLAD_API_CALL + #if defined(GLAD_API_CALL_EXPORT) + #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__) + #if defined(GLAD_API_CALL_EXPORT_BUILD) + #if defined(__GNUC__) + #define GLAD_API_CALL __attribute__ ((dllexport)) extern + #else + #define GLAD_API_CALL __declspec(dllexport) extern + #endif + #else + #if defined(__GNUC__) + #define GLAD_API_CALL __attribute__ ((dllimport)) extern + #else + #define GLAD_API_CALL __declspec(dllimport) extern + #endif + #endif + #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD) + #define GLAD_API_CALL __attribute__ ((visibility ("default"))) extern + #else + #define GLAD_API_CALL extern + #endif + #else + #define GLAD_API_CALL extern + #endif +#endif + +#ifdef APIENTRY + #define GLAD_API_PTR APIENTRY +#elif GLAD_PLATFORM_WIN32 + #define GLAD_API_PTR __stdcall +#else + #define GLAD_API_PTR +#endif + +#ifndef GLAPI +#define GLAPI GLAD_API_CALL +#endif + +#ifndef GLAPIENTRY +#define GLAPIENTRY GLAD_API_PTR +#endif + +#define GLAD_MAKE_VERSION(major, minor) (major * 10000 + minor) +#define GLAD_VERSION_MAJOR(version) (version / 10000) +#define GLAD_VERSION_MINOR(version) (version % 10000) + +#define GLAD_GENERATOR_VERSION "2.0.8" + +typedef void (*GLADapiproc)(void); + +typedef GLADapiproc (*GLADloadfunc)(const char *name); +typedef GLADapiproc (*GLADuserptrloadfunc)(void *userptr, const char *name); + +typedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...); +typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...); + +#endif /* GLAD_PLATFORM_H_ */ + +#define EGL_ALPHA_FORMAT 0x3088 +#define EGL_ALPHA_FORMAT_NONPRE 0x308B +#define EGL_ALPHA_FORMAT_PRE 0x308C +#define EGL_ALPHA_MASK_SIZE 0x303E +#define EGL_ALPHA_SIZE 0x3021 +#define EGL_BACK_BUFFER 0x3084 +#define EGL_BAD_ACCESS 0x3002 +#define EGL_BAD_ALLOC 0x3003 +#define EGL_BAD_ATTRIBUTE 0x3004 +#define EGL_BAD_CONFIG 0x3005 +#define EGL_BAD_CONTEXT 0x3006 +#define EGL_BAD_CURRENT_SURFACE 0x3007 +#define EGL_BAD_DISPLAY 0x3008 +#define EGL_BAD_MATCH 0x3009 +#define EGL_BAD_NATIVE_PIXMAP 0x300A +#define EGL_BAD_NATIVE_WINDOW 0x300B +#define EGL_BAD_PARAMETER 0x300C +#define EGL_BAD_SURFACE 0x300D +#define EGL_BIND_TO_TEXTURE_RGB 0x3039 +#define EGL_BIND_TO_TEXTURE_RGBA 0x303A +#define EGL_BLUE_SIZE 0x3022 +#define EGL_BUFFER_DESTROYED 0x3095 +#define EGL_BUFFER_PRESERVED 0x3094 +#define EGL_BUFFER_SIZE 0x3020 +#define EGL_CLIENT_APIS 0x308D +#define EGL_CL_EVENT_HANDLE 0x309C +#define EGL_COLORSPACE 0x3087 +#define EGL_COLORSPACE_LINEAR 0x308A +#define EGL_COLORSPACE_sRGB 0x3089 +#define EGL_COLOR_BUFFER_TYPE 0x303F +#define EGL_CONDITION_SATISFIED 0x30F6 +#define EGL_CONFIG_CAVEAT 0x3027 +#define EGL_CONFIG_ID 0x3028 +#define EGL_CONFORMANT 0x3042 +#define EGL_CONTEXT_CLIENT_TYPE 0x3097 +#define EGL_CONTEXT_CLIENT_VERSION 0x3098 +#define EGL_CONTEXT_LOST 0x300E +#define EGL_CONTEXT_MAJOR_VERSION 0x3098 +#define EGL_CONTEXT_MINOR_VERSION 0x30FB +#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT 0x00000001 +#define EGL_CONTEXT_OPENGL_DEBUG 0x31B0 +#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE 0x31B1 +#define EGL_CONTEXT_OPENGL_PROFILE_MASK 0x30FD +#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY 0x31BD +#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS 0x31B2 +#define EGL_CORE_NATIVE_ENGINE 0x305B +#define EGL_DEFAULT_DISPLAY EGL_CAST(EGLNativeDisplayType,0) +#define EGL_DEPTH_SIZE 0x3025 +#define EGL_DISPLAY_SCALING 10000 +#define EGL_DONT_CARE EGL_CAST(EGLint,-1) +#define EGL_DRAW 0x3059 +#define EGL_EXTENSIONS 0x3055 +#define EGL_FALSE 0 +#define EGL_FOREVER 0xFFFFFFFFFFFFFFFF +#define EGL_GL_COLORSPACE 0x309D +#define EGL_GL_COLORSPACE_LINEAR 0x308A +#define EGL_GL_COLORSPACE_SRGB 0x3089 +#define EGL_GL_RENDERBUFFER 0x30B9 +#define EGL_GL_TEXTURE_2D 0x30B1 +#define EGL_GL_TEXTURE_3D 0x30B2 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x30B4 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x30B6 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x30B8 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x30B3 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x30B5 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x30B7 +#define EGL_GL_TEXTURE_LEVEL 0x30BC +#define EGL_GL_TEXTURE_ZOFFSET 0x30BD +#define EGL_GREEN_SIZE 0x3023 +#define EGL_HEIGHT 0x3056 +#define EGL_HORIZONTAL_RESOLUTION 0x3090 +#define EGL_IMAGE_PRESERVED 0x30D2 +#define EGL_LARGEST_PBUFFER 0x3058 +#define EGL_LEVEL 0x3029 +#define EGL_LOSE_CONTEXT_ON_RESET 0x31BF +#define EGL_LUMINANCE_BUFFER 0x308F +#define EGL_LUMINANCE_SIZE 0x303D +#define EGL_MATCH_NATIVE_PIXMAP 0x3041 +#define EGL_MAX_PBUFFER_HEIGHT 0x302A +#define EGL_MAX_PBUFFER_PIXELS 0x302B +#define EGL_MAX_PBUFFER_WIDTH 0x302C +#define EGL_MAX_SWAP_INTERVAL 0x303C +#define EGL_MIN_SWAP_INTERVAL 0x303B +#define EGL_MIPMAP_LEVEL 0x3083 +#define EGL_MIPMAP_TEXTURE 0x3082 +#define EGL_MULTISAMPLE_RESOLVE 0x3099 +#define EGL_MULTISAMPLE_RESOLVE_BOX 0x309B +#define EGL_MULTISAMPLE_RESOLVE_BOX_BIT 0x0200 +#define EGL_MULTISAMPLE_RESOLVE_DEFAULT 0x309A +#define EGL_NATIVE_RENDERABLE 0x302D +#define EGL_NATIVE_VISUAL_ID 0x302E +#define EGL_NATIVE_VISUAL_TYPE 0x302F +#define EGL_NONE 0x3038 +#define EGL_NON_CONFORMANT_CONFIG 0x3051 +#define EGL_NOT_INITIALIZED 0x3001 +#define EGL_NO_CONTEXT EGL_CAST(EGLContext,0) +#define EGL_NO_DISPLAY EGL_CAST(EGLDisplay,0) +#define EGL_NO_IMAGE EGL_CAST(EGLImage,0) +#define EGL_NO_RESET_NOTIFICATION 0x31BE +#define EGL_NO_SURFACE EGL_CAST(EGLSurface,0) +#define EGL_NO_SYNC EGL_CAST(EGLSync,0) +#define EGL_NO_TEXTURE 0x305C +#define EGL_OPENGL_API 0x30A2 +#define EGL_OPENGL_BIT 0x0008 +#define EGL_OPENGL_ES2_BIT 0x0004 +#define EGL_OPENGL_ES3_BIT 0x00000040 +#define EGL_OPENGL_ES_API 0x30A0 +#define EGL_OPENGL_ES_BIT 0x0001 +#define EGL_OPENVG_API 0x30A1 +#define EGL_OPENVG_BIT 0x0002 +#define EGL_OPENVG_IMAGE 0x3096 +#define EGL_PBUFFER_BIT 0x0001 +#define EGL_PIXEL_ASPECT_RATIO 0x3092 +#define EGL_PIXMAP_BIT 0x0002 +#define EGL_READ 0x305A +#define EGL_RED_SIZE 0x3024 +#define EGL_RENDERABLE_TYPE 0x3040 +#define EGL_RENDER_BUFFER 0x3086 +#define EGL_RGB_BUFFER 0x308E +#define EGL_SAMPLES 0x3031 +#define EGL_SAMPLE_BUFFERS 0x3032 +#define EGL_SIGNALED 0x30F2 +#define EGL_SINGLE_BUFFER 0x3085 +#define EGL_SLOW_CONFIG 0x3050 +#define EGL_STENCIL_SIZE 0x3026 +#define EGL_SUCCESS 0x3000 +#define EGL_SURFACE_TYPE 0x3033 +#define EGL_SWAP_BEHAVIOR 0x3093 +#define EGL_SWAP_BEHAVIOR_PRESERVED_BIT 0x0400 +#define EGL_SYNC_CL_EVENT 0x30FE +#define EGL_SYNC_CL_EVENT_COMPLETE 0x30FF +#define EGL_SYNC_CONDITION 0x30F8 +#define EGL_SYNC_FENCE 0x30F9 +#define EGL_SYNC_FLUSH_COMMANDS_BIT 0x0001 +#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE 0x30F0 +#define EGL_SYNC_STATUS 0x30F1 +#define EGL_SYNC_TYPE 0x30F7 +#define EGL_TEXTURE_2D 0x305F +#define EGL_TEXTURE_FORMAT 0x3080 +#define EGL_TEXTURE_RGB 0x305D +#define EGL_TEXTURE_RGBA 0x305E +#define EGL_TEXTURE_TARGET 0x3081 +#define EGL_TIMEOUT_EXPIRED 0x30F5 +#define EGL_TRANSPARENT_BLUE_VALUE 0x3035 +#define EGL_TRANSPARENT_GREEN_VALUE 0x3036 +#define EGL_TRANSPARENT_RED_VALUE 0x3037 +#define EGL_TRANSPARENT_RGB 0x3052 +#define EGL_TRANSPARENT_TYPE 0x3034 +#define EGL_TRUE 1 +#define EGL_UNKNOWN EGL_CAST(EGLint,-1) +#define EGL_UNSIGNALED 0x30F3 +#define EGL_VENDOR 0x3053 +#define EGL_VERSION 0x3054 +#define EGL_VERTICAL_RESOLUTION 0x3091 +#define EGL_VG_ALPHA_FORMAT 0x3088 +#define EGL_VG_ALPHA_FORMAT_NONPRE 0x308B +#define EGL_VG_ALPHA_FORMAT_PRE 0x308C +#define EGL_VG_ALPHA_FORMAT_PRE_BIT 0x0040 +#define EGL_VG_COLORSPACE 0x3087 +#define EGL_VG_COLORSPACE_LINEAR 0x308A +#define EGL_VG_COLORSPACE_LINEAR_BIT 0x0020 +#define EGL_VG_COLORSPACE_sRGB 0x3089 +#define EGL_WIDTH 0x3057 +#define EGL_WINDOW_BIT 0x0004 + + +#include +#include + + + + + + + + + + + +struct AHardwareBuffer; +struct wl_buffer; +struct wl_display; +struct wl_resource; + +typedef unsigned int EGLBoolean; +typedef unsigned int EGLenum; +typedef intptr_t EGLAttribKHR; +typedef intptr_t EGLAttrib; +typedef void *EGLClientBuffer; +typedef void *EGLConfig; +typedef void *EGLContext; +typedef void *EGLDeviceEXT; +typedef void *EGLDisplay; +typedef void *EGLImage; +typedef void *EGLImageKHR; +typedef void *EGLLabelKHR; +typedef void *EGLObjectKHR; +typedef void *EGLOutputLayerEXT; +typedef void *EGLOutputPortEXT; +typedef void *EGLStreamKHR; +typedef void *EGLSurface; +typedef void *EGLSync; +typedef void *EGLSyncKHR; +typedef void *EGLSyncNV; +typedef void (*__eglMustCastToProperFunctionPointerType)(void); +typedef khronos_utime_nanoseconds_t EGLTimeKHR; +typedef khronos_utime_nanoseconds_t EGLTime; +typedef khronos_utime_nanoseconds_t EGLTimeNV; +typedef khronos_utime_nanoseconds_t EGLuint64NV; +typedef khronos_uint64_t EGLuint64KHR; +typedef khronos_stime_nanoseconds_t EGLnsecsANDROID; +typedef int EGLNativeFileDescriptorKHR; +typedef khronos_ssize_t EGLsizeiANDROID; +typedef void (*EGLSetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, const void *value, EGLsizeiANDROID valueSize); +typedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, void *value, EGLsizeiANDROID valueSize); +struct EGLClientPixmapHI { + void *pData; + EGLint iWidth; + EGLint iHeight; + EGLint iStride; +}; +typedef void (GLAD_API_PTR *EGLDEBUGPROCKHR)(EGLenum error,const char *command,EGLint messageType,EGLLabelKHR threadLabel,EGLLabelKHR objectLabel,const char* message); +#define PFNEGLBINDWAYLANDDISPLAYWL PFNEGLBINDWAYLANDDISPLAYWLPROC +#define PFNEGLUNBINDWAYLANDDISPLAYWL PFNEGLUNBINDWAYLANDDISPLAYWLPROC +#define PFNEGLQUERYWAYLANDBUFFERWL PFNEGLQUERYWAYLANDBUFFERWLPROC +#define PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWL PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWLPROC + + +#define EGL_VERSION_1_0 1 +GLAD_API_CALL int GLAD_EGL_VERSION_1_0; +#define EGL_VERSION_1_1 1 +GLAD_API_CALL int GLAD_EGL_VERSION_1_1; +#define EGL_VERSION_1_2 1 +GLAD_API_CALL int GLAD_EGL_VERSION_1_2; +#define EGL_VERSION_1_3 1 +GLAD_API_CALL int GLAD_EGL_VERSION_1_3; +#define EGL_VERSION_1_4 1 +GLAD_API_CALL int GLAD_EGL_VERSION_1_4; +#define EGL_VERSION_1_5 1 +GLAD_API_CALL int GLAD_EGL_VERSION_1_5; + + +typedef EGLBoolean (GLAD_API_PTR *PFNEGLBINDAPIPROC)(EGLenum api); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLBINDTEXIMAGEPROC)(EGLDisplay dpy, EGLSurface surface, EGLint buffer); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLCHOOSECONFIGPROC)(EGLDisplay dpy, const EGLint * attrib_list, EGLConfig * configs, EGLint config_size, EGLint * num_config); +typedef EGLint (GLAD_API_PTR *PFNEGLCLIENTWAITSYNCPROC)(EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLCOPYBUFFERSPROC)(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target); +typedef EGLContext (GLAD_API_PTR *PFNEGLCREATECONTEXTPROC)(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint * attrib_list); +typedef EGLImage (GLAD_API_PTR *PFNEGLCREATEIMAGEPROC)(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib * attrib_list); +typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC)(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint * attrib_list); +typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPBUFFERSURFACEPROC)(EGLDisplay dpy, EGLConfig config, const EGLint * attrib_list); +typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPIXMAPSURFACEPROC)(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint * attrib_list); +typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC)(EGLDisplay dpy, EGLConfig config, void * native_pixmap, const EGLAttrib * attrib_list); +typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPLATFORMWINDOWSURFACEPROC)(EGLDisplay dpy, EGLConfig config, void * native_window, const EGLAttrib * attrib_list); +typedef EGLSync (GLAD_API_PTR *PFNEGLCREATESYNCPROC)(EGLDisplay dpy, EGLenum type, const EGLAttrib * attrib_list); +typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEWINDOWSURFACEPROC)(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint * attrib_list); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYCONTEXTPROC)(EGLDisplay dpy, EGLContext ctx); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYIMAGEPROC)(EGLDisplay dpy, EGLImage image); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYSURFACEPROC)(EGLDisplay dpy, EGLSurface surface); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYSYNCPROC)(EGLDisplay dpy, EGLSync sync); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLGETCONFIGATTRIBPROC)(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint * value); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLGETCONFIGSPROC)(EGLDisplay dpy, EGLConfig * configs, EGLint config_size, EGLint * num_config); +typedef EGLContext (GLAD_API_PTR *PFNEGLGETCURRENTCONTEXTPROC)(void); +typedef EGLDisplay (GLAD_API_PTR *PFNEGLGETCURRENTDISPLAYPROC)(void); +typedef EGLSurface (GLAD_API_PTR *PFNEGLGETCURRENTSURFACEPROC)(EGLint readdraw); +typedef EGLDisplay (GLAD_API_PTR *PFNEGLGETDISPLAYPROC)(EGLNativeDisplayType display_id); +typedef EGLint (GLAD_API_PTR *PFNEGLGETERRORPROC)(void); +typedef EGLDisplay (GLAD_API_PTR *PFNEGLGETPLATFORMDISPLAYPROC)(EGLenum platform, void * native_display, const EGLAttrib * attrib_list); +typedef __eglMustCastToProperFunctionPointerType (GLAD_API_PTR *PFNEGLGETPROCADDRESSPROC)(const char * procname); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLGETSYNCATTRIBPROC)(EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib * value); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLINITIALIZEPROC)(EGLDisplay dpy, EGLint * major, EGLint * minor); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLMAKECURRENTPROC)(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx); +typedef EGLenum (GLAD_API_PTR *PFNEGLQUERYAPIPROC)(void); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLQUERYCONTEXTPROC)(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint * value); +typedef const char * (GLAD_API_PTR *PFNEGLQUERYSTRINGPROC)(EGLDisplay dpy, EGLint name); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLQUERYSURFACEPROC)(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint * value); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLRELEASETEXIMAGEPROC)(EGLDisplay dpy, EGLSurface surface, EGLint buffer); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLRELEASETHREADPROC)(void); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLSURFACEATTRIBPROC)(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLSWAPBUFFERSPROC)(EGLDisplay dpy, EGLSurface surface); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLSWAPINTERVALPROC)(EGLDisplay dpy, EGLint interval); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLTERMINATEPROC)(EGLDisplay dpy); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLWAITCLIENTPROC)(void); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLWAITGLPROC)(void); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLWAITNATIVEPROC)(EGLint engine); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLWAITSYNCPROC)(EGLDisplay dpy, EGLSync sync, EGLint flags); + +GLAD_API_CALL PFNEGLBINDAPIPROC glad_eglBindAPI; +#define eglBindAPI glad_eglBindAPI +GLAD_API_CALL PFNEGLBINDTEXIMAGEPROC glad_eglBindTexImage; +#define eglBindTexImage glad_eglBindTexImage +GLAD_API_CALL PFNEGLCHOOSECONFIGPROC glad_eglChooseConfig; +#define eglChooseConfig glad_eglChooseConfig +GLAD_API_CALL PFNEGLCLIENTWAITSYNCPROC glad_eglClientWaitSync; +#define eglClientWaitSync glad_eglClientWaitSync +GLAD_API_CALL PFNEGLCOPYBUFFERSPROC glad_eglCopyBuffers; +#define eglCopyBuffers glad_eglCopyBuffers +GLAD_API_CALL PFNEGLCREATECONTEXTPROC glad_eglCreateContext; +#define eglCreateContext glad_eglCreateContext +GLAD_API_CALL PFNEGLCREATEIMAGEPROC glad_eglCreateImage; +#define eglCreateImage glad_eglCreateImage +GLAD_API_CALL PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC glad_eglCreatePbufferFromClientBuffer; +#define eglCreatePbufferFromClientBuffer glad_eglCreatePbufferFromClientBuffer +GLAD_API_CALL PFNEGLCREATEPBUFFERSURFACEPROC glad_eglCreatePbufferSurface; +#define eglCreatePbufferSurface glad_eglCreatePbufferSurface +GLAD_API_CALL PFNEGLCREATEPIXMAPSURFACEPROC glad_eglCreatePixmapSurface; +#define eglCreatePixmapSurface glad_eglCreatePixmapSurface +GLAD_API_CALL PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC glad_eglCreatePlatformPixmapSurface; +#define eglCreatePlatformPixmapSurface glad_eglCreatePlatformPixmapSurface +GLAD_API_CALL PFNEGLCREATEPLATFORMWINDOWSURFACEPROC glad_eglCreatePlatformWindowSurface; +#define eglCreatePlatformWindowSurface glad_eglCreatePlatformWindowSurface +GLAD_API_CALL PFNEGLCREATESYNCPROC glad_eglCreateSync; +#define eglCreateSync glad_eglCreateSync +GLAD_API_CALL PFNEGLCREATEWINDOWSURFACEPROC glad_eglCreateWindowSurface; +#define eglCreateWindowSurface glad_eglCreateWindowSurface +GLAD_API_CALL PFNEGLDESTROYCONTEXTPROC glad_eglDestroyContext; +#define eglDestroyContext glad_eglDestroyContext +GLAD_API_CALL PFNEGLDESTROYIMAGEPROC glad_eglDestroyImage; +#define eglDestroyImage glad_eglDestroyImage +GLAD_API_CALL PFNEGLDESTROYSURFACEPROC glad_eglDestroySurface; +#define eglDestroySurface glad_eglDestroySurface +GLAD_API_CALL PFNEGLDESTROYSYNCPROC glad_eglDestroySync; +#define eglDestroySync glad_eglDestroySync +GLAD_API_CALL PFNEGLGETCONFIGATTRIBPROC glad_eglGetConfigAttrib; +#define eglGetConfigAttrib glad_eglGetConfigAttrib +GLAD_API_CALL PFNEGLGETCONFIGSPROC glad_eglGetConfigs; +#define eglGetConfigs glad_eglGetConfigs +GLAD_API_CALL PFNEGLGETCURRENTCONTEXTPROC glad_eglGetCurrentContext; +#define eglGetCurrentContext glad_eglGetCurrentContext +GLAD_API_CALL PFNEGLGETCURRENTDISPLAYPROC glad_eglGetCurrentDisplay; +#define eglGetCurrentDisplay glad_eglGetCurrentDisplay +GLAD_API_CALL PFNEGLGETCURRENTSURFACEPROC glad_eglGetCurrentSurface; +#define eglGetCurrentSurface glad_eglGetCurrentSurface +GLAD_API_CALL PFNEGLGETDISPLAYPROC glad_eglGetDisplay; +#define eglGetDisplay glad_eglGetDisplay +GLAD_API_CALL PFNEGLGETERRORPROC glad_eglGetError; +#define eglGetError glad_eglGetError +GLAD_API_CALL PFNEGLGETPLATFORMDISPLAYPROC glad_eglGetPlatformDisplay; +#define eglGetPlatformDisplay glad_eglGetPlatformDisplay +GLAD_API_CALL PFNEGLGETPROCADDRESSPROC glad_eglGetProcAddress; +#define eglGetProcAddress glad_eglGetProcAddress +GLAD_API_CALL PFNEGLGETSYNCATTRIBPROC glad_eglGetSyncAttrib; +#define eglGetSyncAttrib glad_eglGetSyncAttrib +GLAD_API_CALL PFNEGLINITIALIZEPROC glad_eglInitialize; +#define eglInitialize glad_eglInitialize +GLAD_API_CALL PFNEGLMAKECURRENTPROC glad_eglMakeCurrent; +#define eglMakeCurrent glad_eglMakeCurrent +GLAD_API_CALL PFNEGLQUERYAPIPROC glad_eglQueryAPI; +#define eglQueryAPI glad_eglQueryAPI +GLAD_API_CALL PFNEGLQUERYCONTEXTPROC glad_eglQueryContext; +#define eglQueryContext glad_eglQueryContext +GLAD_API_CALL PFNEGLQUERYSTRINGPROC glad_eglQueryString; +#define eglQueryString glad_eglQueryString +GLAD_API_CALL PFNEGLQUERYSURFACEPROC glad_eglQuerySurface; +#define eglQuerySurface glad_eglQuerySurface +GLAD_API_CALL PFNEGLRELEASETEXIMAGEPROC glad_eglReleaseTexImage; +#define eglReleaseTexImage glad_eglReleaseTexImage +GLAD_API_CALL PFNEGLRELEASETHREADPROC glad_eglReleaseThread; +#define eglReleaseThread glad_eglReleaseThread +GLAD_API_CALL PFNEGLSURFACEATTRIBPROC glad_eglSurfaceAttrib; +#define eglSurfaceAttrib glad_eglSurfaceAttrib +GLAD_API_CALL PFNEGLSWAPBUFFERSPROC glad_eglSwapBuffers; +#define eglSwapBuffers glad_eglSwapBuffers +GLAD_API_CALL PFNEGLSWAPINTERVALPROC glad_eglSwapInterval; +#define eglSwapInterval glad_eglSwapInterval +GLAD_API_CALL PFNEGLTERMINATEPROC glad_eglTerminate; +#define eglTerminate glad_eglTerminate +GLAD_API_CALL PFNEGLWAITCLIENTPROC glad_eglWaitClient; +#define eglWaitClient glad_eglWaitClient +GLAD_API_CALL PFNEGLWAITGLPROC glad_eglWaitGL; +#define eglWaitGL glad_eglWaitGL +GLAD_API_CALL PFNEGLWAITNATIVEPROC glad_eglWaitNative; +#define eglWaitNative glad_eglWaitNative +GLAD_API_CALL PFNEGLWAITSYNCPROC glad_eglWaitSync; +#define eglWaitSync glad_eglWaitSync + + + + + +GLAD_API_CALL int gladLoadEGLUserPtr(EGLDisplay display, GLADuserptrloadfunc load, void *userptr); +GLAD_API_CALL int gladLoadEGL(EGLDisplay display, GLADloadfunc load); + +#ifdef GLAD_EGL + +GLAD_API_CALL int gladLoaderLoadEGL(EGLDisplay display); + +GLAD_API_CALL void gladLoaderUnloadEGL(void); + +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/external/glad/include/glad/gl.h b/external/glad/include/glad/gl.h new file mode 100644 index 0000000..e8e1fa6 --- /dev/null +++ b/external/glad/include/glad/gl.h @@ -0,0 +1,3644 @@ +/** + * Loader generated by glad 2.0.8 on Sat Jun 7 19:05:26 2025 + * + * SPDX-License-Identifier: (WTFPL OR CC0-1.0) AND Apache-2.0 + * + * Generator: C/C++ + * Specification: gl + * Extensions: 0 + * + * APIs: + * - gl:core=4.6 + * + * Options: + * - ALIAS = False + * - DEBUG = False + * - HEADER_ONLY = False + * - LOADER = True + * - MX = False + * - ON_DEMAND = False + * + * Commandline: + * --api='gl:core=4.6' --extensions='' c --loader + * + * Online: + * http://glad.sh/#api=gl%3Acore%3D4.6&extensions=&generator=c&options=LOADER + * + */ + +#ifndef GLAD_GL_H_ +#define GLAD_GL_H_ + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreserved-id-macro" +#endif +#ifdef __gl_h_ + #error OpenGL (gl.h) header already included (API: gl), remove previous include! +#endif +#define __gl_h_ 1 +#ifdef __gl3_h_ + #error OpenGL (gl3.h) header already included (API: gl), remove previous include! +#endif +#define __gl3_h_ 1 +#ifdef __glext_h_ + #error OpenGL (glext.h) header already included (API: gl), remove previous include! +#endif +#define __glext_h_ 1 +#ifdef __gl3ext_h_ + #error OpenGL (gl3ext.h) header already included (API: gl), remove previous include! +#endif +#define __gl3ext_h_ 1 +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +#define GLAD_GL +#define GLAD_OPTION_GL_LOADER + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef GLAD_PLATFORM_H_ +#define GLAD_PLATFORM_H_ + +#ifndef GLAD_PLATFORM_WIN32 + #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__) + #define GLAD_PLATFORM_WIN32 1 + #else + #define GLAD_PLATFORM_WIN32 0 + #endif +#endif + +#ifndef GLAD_PLATFORM_APPLE + #ifdef __APPLE__ + #define GLAD_PLATFORM_APPLE 1 + #else + #define GLAD_PLATFORM_APPLE 0 + #endif +#endif + +#ifndef GLAD_PLATFORM_EMSCRIPTEN + #ifdef __EMSCRIPTEN__ + #define GLAD_PLATFORM_EMSCRIPTEN 1 + #else + #define GLAD_PLATFORM_EMSCRIPTEN 0 + #endif +#endif + +#ifndef GLAD_PLATFORM_UWP + #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY) + #ifdef __has_include + #if __has_include() + #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 + #endif + #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_ + #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 + #endif + #endif + + #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY + #include + #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) + #define GLAD_PLATFORM_UWP 1 + #endif + #endif + + #ifndef GLAD_PLATFORM_UWP + #define GLAD_PLATFORM_UWP 0 + #endif +#endif + +#ifdef __GNUC__ + #define GLAD_GNUC_EXTENSION __extension__ +#else + #define GLAD_GNUC_EXTENSION +#endif + +#define GLAD_UNUSED(x) (void)(x) + +#ifndef GLAD_API_CALL + #if defined(GLAD_API_CALL_EXPORT) + #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__) + #if defined(GLAD_API_CALL_EXPORT_BUILD) + #if defined(__GNUC__) + #define GLAD_API_CALL __attribute__ ((dllexport)) extern + #else + #define GLAD_API_CALL __declspec(dllexport) extern + #endif + #else + #if defined(__GNUC__) + #define GLAD_API_CALL __attribute__ ((dllimport)) extern + #else + #define GLAD_API_CALL __declspec(dllimport) extern + #endif + #endif + #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD) + #define GLAD_API_CALL __attribute__ ((visibility ("default"))) extern + #else + #define GLAD_API_CALL extern + #endif + #else + #define GLAD_API_CALL extern + #endif +#endif + +#ifdef APIENTRY + #define GLAD_API_PTR APIENTRY +#elif GLAD_PLATFORM_WIN32 + #define GLAD_API_PTR __stdcall +#else + #define GLAD_API_PTR +#endif + +#ifndef GLAPI +#define GLAPI GLAD_API_CALL +#endif + +#ifndef GLAPIENTRY +#define GLAPIENTRY GLAD_API_PTR +#endif + +#define GLAD_MAKE_VERSION(major, minor) (major * 10000 + minor) +#define GLAD_VERSION_MAJOR(version) (version / 10000) +#define GLAD_VERSION_MINOR(version) (version % 10000) + +#define GLAD_GENERATOR_VERSION "2.0.8" + +typedef void (*GLADapiproc)(void); + +typedef GLADapiproc (*GLADloadfunc)(const char *name); +typedef GLADapiproc (*GLADuserptrloadfunc)(void *userptr, const char *name); + +typedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...); +typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...); + +#endif /* GLAD_PLATFORM_H_ */ + +#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_ACTIVE_PROGRAM 0x8259 +#define GL_ACTIVE_RESOURCES 0x92F5 +#define GL_ACTIVE_SUBROUTINES 0x8DE5 +#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 +#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 +#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_ACTIVE_VARIABLES 0x9305 +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_ALL_BARRIER_BITS 0xFFFFFFFF +#define GL_ALL_SHADER_BITS 0xFFFFFFFF +#define GL_ALPHA 0x1906 +#define GL_ALREADY_SIGNALED 0x911A +#define GL_ALWAYS 0x0207 +#define GL_AND 0x1501 +#define GL_AND_INVERTED 0x1504 +#define GL_AND_REVERSE 0x1502 +#define GL_ANY_SAMPLES_PASSED 0x8C2F +#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ARRAY_SIZE 0x92FB +#define GL_ARRAY_STRIDE 0x92FE +#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 +#define GL_ATOMIC_COUNTER_BUFFER 0x92C0 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6 +#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 +#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4 +#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7 +#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 +#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_AUTO_GENERATE_MIPMAP 0x8295 +#define GL_BACK 0x0405 +#define GL_BACK_LEFT 0x0402 +#define GL_BACK_RIGHT 0x0403 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_BGRA_INTEGER 0x8D9B +#define GL_BGR_INTEGER 0x8D9A +#define GL_BLEND 0x0BE2 +#define GL_BLEND_COLOR 0x8005 +#define GL_BLEND_DST 0x0BE0 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_EQUATION 0x8009 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_BLEND_EQUATION_RGB 0x8009 +#define GL_BLEND_SRC 0x0BE1 +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLOCK_INDEX 0x92FD +#define GL_BLUE 0x1905 +#define GL_BLUE_INTEGER 0x8D96 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_BUFFER 0x82E0 +#define GL_BUFFER_ACCESS 0x88BB +#define GL_BUFFER_ACCESS_FLAGS 0x911F +#define GL_BUFFER_BINDING 0x9302 +#define GL_BUFFER_DATA_SIZE 0x9303 +#define GL_BUFFER_IMMUTABLE_STORAGE 0x821F +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAP_LENGTH 0x9120 +#define GL_BUFFER_MAP_OFFSET 0x9121 +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_STORAGE_FLAGS 0x8220 +#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 +#define GL_BUFFER_USAGE 0x8765 +#define GL_BUFFER_VARIABLE 0x92E5 +#define GL_BYTE 0x1400 +#define GL_CAVEAT_SUPPORT 0x82B8 +#define GL_CCW 0x0901 +#define GL_CLAMP_READ_COLOR 0x891C +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_CLEAR 0x1500 +#define GL_CLEAR_BUFFER 0x82B4 +#define GL_CLEAR_TEXTURE 0x9365 +#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000 +#define GL_CLIENT_STORAGE_BIT 0x0200 +#define GL_CLIPPING_INPUT_PRIMITIVES 0x82F6 +#define GL_CLIPPING_OUTPUT_PRIMITIVES 0x82F7 +#define GL_CLIP_DEPTH_MODE 0x935D +#define GL_CLIP_DISTANCE0 0x3000 +#define GL_CLIP_DISTANCE1 0x3001 +#define GL_CLIP_DISTANCE2 0x3002 +#define GL_CLIP_DISTANCE3 0x3003 +#define GL_CLIP_DISTANCE4 0x3004 +#define GL_CLIP_DISTANCE5 0x3005 +#define GL_CLIP_DISTANCE6 0x3006 +#define GL_CLIP_DISTANCE7 0x3007 +#define GL_CLIP_ORIGIN 0x935C +#define GL_COLOR 0x1800 +#define GL_COLOR_ATTACHMENT0 0x8CE0 +#define GL_COLOR_ATTACHMENT1 0x8CE1 +#define GL_COLOR_ATTACHMENT10 0x8CEA +#define GL_COLOR_ATTACHMENT11 0x8CEB +#define GL_COLOR_ATTACHMENT12 0x8CEC +#define GL_COLOR_ATTACHMENT13 0x8CED +#define GL_COLOR_ATTACHMENT14 0x8CEE +#define GL_COLOR_ATTACHMENT15 0x8CEF +#define GL_COLOR_ATTACHMENT16 0x8CF0 +#define GL_COLOR_ATTACHMENT17 0x8CF1 +#define GL_COLOR_ATTACHMENT18 0x8CF2 +#define GL_COLOR_ATTACHMENT19 0x8CF3 +#define GL_COLOR_ATTACHMENT2 0x8CE2 +#define GL_COLOR_ATTACHMENT20 0x8CF4 +#define GL_COLOR_ATTACHMENT21 0x8CF5 +#define GL_COLOR_ATTACHMENT22 0x8CF6 +#define GL_COLOR_ATTACHMENT23 0x8CF7 +#define GL_COLOR_ATTACHMENT24 0x8CF8 +#define GL_COLOR_ATTACHMENT25 0x8CF9 +#define GL_COLOR_ATTACHMENT26 0x8CFA +#define GL_COLOR_ATTACHMENT27 0x8CFB +#define GL_COLOR_ATTACHMENT28 0x8CFC +#define GL_COLOR_ATTACHMENT29 0x8CFD +#define GL_COLOR_ATTACHMENT3 0x8CE3 +#define GL_COLOR_ATTACHMENT30 0x8CFE +#define GL_COLOR_ATTACHMENT31 0x8CFF +#define GL_COLOR_ATTACHMENT4 0x8CE4 +#define GL_COLOR_ATTACHMENT5 0x8CE5 +#define GL_COLOR_ATTACHMENT6 0x8CE6 +#define GL_COLOR_ATTACHMENT7 0x8CE7 +#define GL_COLOR_ATTACHMENT8 0x8CE8 +#define GL_COLOR_ATTACHMENT9 0x8CE9 +#define GL_COLOR_BUFFER_BIT 0x00004000 +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_COMPONENTS 0x8283 +#define GL_COLOR_ENCODING 0x8296 +#define GL_COLOR_LOGIC_OP 0x0BF2 +#define GL_COLOR_RENDERABLE 0x8286 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_COMMAND_BARRIER_BIT 0x00000040 +#define GL_COMPARE_REF_TO_TEXTURE 0x884E +#define GL_COMPATIBLE_SUBROUTINES 0x8E4B +#define GL_COMPILE_STATUS 0x8B81 +#define GL_COMPRESSED_R11_EAC 0x9270 +#define GL_COMPRESSED_RED 0x8225 +#define GL_COMPRESSED_RED_RGTC1 0x8DBB +#define GL_COMPRESSED_RG 0x8226 +#define GL_COMPRESSED_RG11_EAC 0x9272 +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGB8_ETC2 0x9274 +#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 +#define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F +#define GL_COMPRESSED_RG_RGTC2 0x8DBD +#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 +#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC +#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 +#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE +#define GL_COMPRESSED_SRGB 0x8C48 +#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 +#define GL_COMPRESSED_SRGB8_ETC2 0x9275 +#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 +#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_COMPUTE_SHADER 0x91B9 +#define GL_COMPUTE_SHADER_BIT 0x00000020 +#define GL_COMPUTE_SHADER_INVOCATIONS 0x82F5 +#define GL_COMPUTE_SUBROUTINE 0x92ED +#define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3 +#define GL_COMPUTE_TEXTURE 0x82A0 +#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 +#define GL_CONDITION_SATISFIED 0x911C +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_CONSTANT_COLOR 0x8001 +#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 +#define GL_CONTEXT_FLAGS 0x821E +#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 +#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001 +#define GL_CONTEXT_FLAG_NO_ERROR_BIT 0x00000008 +#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004 +#define GL_CONTEXT_LOST 0x0507 +#define GL_CONTEXT_PROFILE_MASK 0x9126 +#define GL_CONTEXT_RELEASE_BEHAVIOR 0x82FB +#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82FC +#define GL_COPY 0x1503 +#define GL_COPY_INVERTED 0x150C +#define GL_COPY_READ_BUFFER 0x8F36 +#define GL_COPY_READ_BUFFER_BINDING 0x8F36 +#define GL_COPY_WRITE_BUFFER 0x8F37 +#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 +#define GL_CULL_FACE 0x0B44 +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_CURRENT_QUERY 0x8865 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_CW 0x0900 +#define GL_DEBUG_CALLBACK_FUNCTION 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 +#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D +#define GL_DEBUG_LOGGED_MESSAGES 0x9145 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 +#define GL_DEBUG_OUTPUT 0x92E0 +#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 +#define GL_DEBUG_SEVERITY_HIGH 0x9146 +#define GL_DEBUG_SEVERITY_LOW 0x9148 +#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 +#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B +#define GL_DEBUG_SOURCE_API 0x8246 +#define GL_DEBUG_SOURCE_APPLICATION 0x824A +#define GL_DEBUG_SOURCE_OTHER 0x824B +#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D +#define GL_DEBUG_TYPE_ERROR 0x824C +#define GL_DEBUG_TYPE_MARKER 0x8268 +#define GL_DEBUG_TYPE_OTHER 0x8251 +#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 +#define GL_DEBUG_TYPE_POP_GROUP 0x826A +#define GL_DEBUG_TYPE_PORTABILITY 0x824F +#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E +#define GL_DECR 0x1E03 +#define GL_DECR_WRAP 0x8508 +#define GL_DELETE_STATUS 0x8B80 +#define GL_DEPTH 0x1801 +#define GL_DEPTH24_STENCIL8 0x88F0 +#define GL_DEPTH32F_STENCIL8 0x8CAD +#define GL_DEPTH_ATTACHMENT 0x8D00 +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_DEPTH_CLAMP 0x864F +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_DEPTH_COMPONENT32F 0x8CAC +#define GL_DEPTH_COMPONENTS 0x8284 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_RENDERABLE 0x8287 +#define GL_DEPTH_STENCIL 0x84F9 +#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A +#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA +#define GL_DEPTH_TEST 0x0B71 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE +#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF +#define GL_DITHER 0x0BD0 +#define GL_DONT_CARE 0x1100 +#define GL_DOUBLE 0x140A +#define GL_DOUBLEBUFFER 0x0C32 +#define GL_DOUBLE_MAT2 0x8F46 +#define GL_DOUBLE_MAT2x3 0x8F49 +#define GL_DOUBLE_MAT2x4 0x8F4A +#define GL_DOUBLE_MAT3 0x8F47 +#define GL_DOUBLE_MAT3x2 0x8F4B +#define GL_DOUBLE_MAT3x4 0x8F4C +#define GL_DOUBLE_MAT4 0x8F48 +#define GL_DOUBLE_MAT4x2 0x8F4D +#define GL_DOUBLE_MAT4x3 0x8F4E +#define GL_DOUBLE_VEC2 0x8FFC +#define GL_DOUBLE_VEC3 0x8FFD +#define GL_DOUBLE_VEC4 0x8FFE +#define GL_DRAW_BUFFER 0x0C01 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#define GL_DRAW_BUFFER10 0x882F +#define GL_DRAW_BUFFER11 0x8830 +#define GL_DRAW_BUFFER12 0x8831 +#define GL_DRAW_BUFFER13 0x8832 +#define GL_DRAW_BUFFER14 0x8833 +#define GL_DRAW_BUFFER15 0x8834 +#define GL_DRAW_BUFFER2 0x8827 +#define GL_DRAW_BUFFER3 0x8828 +#define GL_DRAW_BUFFER4 0x8829 +#define GL_DRAW_BUFFER5 0x882A +#define GL_DRAW_BUFFER6 0x882B +#define GL_DRAW_BUFFER7 0x882C +#define GL_DRAW_BUFFER8 0x882D +#define GL_DRAW_BUFFER9 0x882E +#define GL_DRAW_FRAMEBUFFER 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_DRAW_INDIRECT_BUFFER 0x8F3F +#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 +#define GL_DST_ALPHA 0x0304 +#define GL_DST_COLOR 0x0306 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_DYNAMIC_STORAGE_BIT 0x0100 +#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_EQUAL 0x0202 +#define GL_EQUIV 0x1509 +#define GL_EXTENSIONS 0x1F03 +#define GL_FALSE 0 +#define GL_FASTEST 0x1101 +#define GL_FILL 0x1B02 +#define GL_FILTER 0x829A +#define GL_FIRST_VERTEX_CONVENTION 0x8E4D +#define GL_FIXED 0x140C +#define GL_FIXED_ONLY 0x891D +#define GL_FLOAT 0x1406 +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT2x3 0x8B65 +#define GL_FLOAT_MAT2x4 0x8B66 +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT3x2 0x8B67 +#define GL_FLOAT_MAT3x4 0x8B68 +#define GL_FLOAT_MAT4 0x8B5C +#define GL_FLOAT_MAT4x2 0x8B69 +#define GL_FLOAT_MAT4x3 0x8B6A +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_FRACTIONAL_EVEN 0x8E7C +#define GL_FRACTIONAL_ODD 0x8E7B +#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_FRAGMENT_SHADER_BIT 0x00000002 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_FRAGMENT_SHADER_INVOCATIONS 0x82F4 +#define GL_FRAGMENT_SUBROUTINE 0x92EC +#define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2 +#define GL_FRAGMENT_TEXTURE 0x829F +#define GL_FRAMEBUFFER 0x8D40 +#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 +#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 +#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 +#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 +#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 +#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 +#define GL_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_FRAMEBUFFER_BLEND 0x828B +#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GL_FRAMEBUFFER_DEFAULT 0x8218 +#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 +#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 +#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 +#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC +#define GL_FRAMEBUFFER_RENDERABLE 0x8289 +#define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A +#define GL_FRAMEBUFFER_SRGB 0x8DB9 +#define GL_FRAMEBUFFER_UNDEFINED 0x8219 +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD +#define GL_FRONT 0x0404 +#define GL_FRONT_AND_BACK 0x0408 +#define GL_FRONT_FACE 0x0B46 +#define GL_FRONT_LEFT 0x0400 +#define GL_FRONT_RIGHT 0x0401 +#define GL_FULL_SUPPORT 0x82B7 +#define GL_FUNC_ADD 0x8006 +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_FUNC_SUBTRACT 0x800A +#define GL_GEOMETRY_INPUT_TYPE 0x8917 +#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 +#define GL_GEOMETRY_SHADER 0x8DD9 +#define GL_GEOMETRY_SHADER_BIT 0x00000004 +#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F +#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED 0x82F3 +#define GL_GEOMETRY_SUBROUTINE 0x92EB +#define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1 +#define GL_GEOMETRY_TEXTURE 0x829E +#define GL_GEOMETRY_VERTICES_OUT 0x8916 +#define GL_GEQUAL 0x0206 +#define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291 +#define GL_GET_TEXTURE_IMAGE_TYPE 0x8292 +#define GL_GREATER 0x0204 +#define GL_GREEN 0x1904 +#define GL_GREEN_INTEGER 0x8D95 +#define GL_GUILTY_CONTEXT_RESET 0x8253 +#define GL_HALF_FLOAT 0x140B +#define GL_HIGH_FLOAT 0x8DF2 +#define GL_HIGH_INT 0x8DF5 +#define GL_IMAGE_1D 0x904C +#define GL_IMAGE_1D_ARRAY 0x9052 +#define GL_IMAGE_2D 0x904D +#define GL_IMAGE_2D_ARRAY 0x9053 +#define GL_IMAGE_2D_MULTISAMPLE 0x9055 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 +#define GL_IMAGE_2D_RECT 0x904F +#define GL_IMAGE_3D 0x904E +#define GL_IMAGE_BINDING_ACCESS 0x8F3E +#define GL_IMAGE_BINDING_FORMAT 0x906E +#define GL_IMAGE_BINDING_LAYER 0x8F3D +#define GL_IMAGE_BINDING_LAYERED 0x8F3C +#define GL_IMAGE_BINDING_LEVEL 0x8F3B +#define GL_IMAGE_BINDING_NAME 0x8F3A +#define GL_IMAGE_BUFFER 0x9051 +#define GL_IMAGE_CLASS_10_10_10_2 0x82C3 +#define GL_IMAGE_CLASS_11_11_10 0x82C2 +#define GL_IMAGE_CLASS_1_X_16 0x82BE +#define GL_IMAGE_CLASS_1_X_32 0x82BB +#define GL_IMAGE_CLASS_1_X_8 0x82C1 +#define GL_IMAGE_CLASS_2_X_16 0x82BD +#define GL_IMAGE_CLASS_2_X_32 0x82BA +#define GL_IMAGE_CLASS_2_X_8 0x82C0 +#define GL_IMAGE_CLASS_4_X_16 0x82BC +#define GL_IMAGE_CLASS_4_X_32 0x82B9 +#define GL_IMAGE_CLASS_4_X_8 0x82BF +#define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8 +#define GL_IMAGE_CUBE 0x9050 +#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 +#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 +#define GL_IMAGE_PIXEL_FORMAT 0x82A9 +#define GL_IMAGE_PIXEL_TYPE 0x82AA +#define GL_IMAGE_TEXEL_SIZE 0x82A7 +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B +#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A +#define GL_INCR 0x1E02 +#define GL_INCR_WRAP 0x8507 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_INNOCENT_CONTEXT_RESET 0x8254 +#define GL_INT 0x1404 +#define GL_INTERLEAVED_ATTRIBS 0x8C8C +#define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274 +#define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B +#define GL_INTERNALFORMAT_BLUE_SIZE 0x8273 +#define GL_INTERNALFORMAT_BLUE_TYPE 0x827A +#define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275 +#define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C +#define GL_INTERNALFORMAT_GREEN_SIZE 0x8272 +#define GL_INTERNALFORMAT_GREEN_TYPE 0x8279 +#define GL_INTERNALFORMAT_PREFERRED 0x8270 +#define GL_INTERNALFORMAT_RED_SIZE 0x8271 +#define GL_INTERNALFORMAT_RED_TYPE 0x8278 +#define GL_INTERNALFORMAT_SHARED_SIZE 0x8277 +#define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276 +#define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D +#define GL_INTERNALFORMAT_SUPPORTED 0x826F +#define GL_INT_2_10_10_10_REV 0x8D9F +#define GL_INT_IMAGE_1D 0x9057 +#define GL_INT_IMAGE_1D_ARRAY 0x905D +#define GL_INT_IMAGE_2D 0x9058 +#define GL_INT_IMAGE_2D_ARRAY 0x905E +#define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061 +#define GL_INT_IMAGE_2D_RECT 0x905A +#define GL_INT_IMAGE_3D 0x9059 +#define GL_INT_IMAGE_BUFFER 0x905C +#define GL_INT_IMAGE_CUBE 0x905B +#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F +#define GL_INT_SAMPLER_1D 0x8DC9 +#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE +#define GL_INT_SAMPLER_2D 0x8DCA +#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF +#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 +#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C +#define GL_INT_SAMPLER_2D_RECT 0x8DCD +#define GL_INT_SAMPLER_3D 0x8DCB +#define GL_INT_SAMPLER_BUFFER 0x8DD0 +#define GL_INT_SAMPLER_CUBE 0x8DCC +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 +#define GL_INVALID_INDEX 0xFFFFFFFF +#define GL_INVALID_OPERATION 0x0502 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVERT 0x150A +#define GL_ISOLINES 0x8E7A +#define GL_IS_PER_PATCH 0x92E7 +#define GL_IS_ROW_MAJOR 0x9300 +#define GL_KEEP 0x1E00 +#define GL_LAST_VERTEX_CONVENTION 0x8E4E +#define GL_LAYER_PROVOKING_VERTEX 0x825E +#define GL_LEFT 0x0406 +#define GL_LEQUAL 0x0203 +#define GL_LESS 0x0201 +#define GL_LINE 0x1B01 +#define GL_LINEAR 0x2601 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_LINES 0x0001 +#define GL_LINES_ADJACENCY 0x000A +#define GL_LINE_LOOP 0x0002 +#define GL_LINE_SMOOTH 0x0B20 +#define GL_LINE_SMOOTH_HINT 0x0C52 +#define GL_LINE_STRIP 0x0003 +#define GL_LINE_STRIP_ADJACENCY 0x000B +#define GL_LINE_WIDTH 0x0B21 +#define GL_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_LINE_WIDTH_RANGE 0x0B22 +#define GL_LINK_STATUS 0x8B82 +#define GL_LOCATION 0x930E +#define GL_LOCATION_COMPONENT 0x934A +#define GL_LOCATION_INDEX 0x930F +#define GL_LOGIC_OP_MODE 0x0BF0 +#define GL_LOSE_CONTEXT_ON_RESET 0x8252 +#define GL_LOWER_LEFT 0x8CA1 +#define GL_LOW_FLOAT 0x8DF0 +#define GL_LOW_INT 0x8DF3 +#define GL_MAJOR_VERSION 0x821B +#define GL_MANUAL_GENERATE_MIPMAP 0x8294 +#define GL_MAP_COHERENT_BIT 0x0080 +#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 +#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 +#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 +#define GL_MAP_PERSISTENT_BIT 0x0040 +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MATRIX_STRIDE 0x92FF +#define GL_MAX 0x8008 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF +#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC +#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 +#define GL_MAX_CLIP_DISTANCES 0x0D32 +#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF +#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E +#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 +#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 +#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES 0x82FA +#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 +#define GL_MAX_COMBINED_DIMENSIONS 0x8282 +#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 +#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39 +#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 +#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC +#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E +#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E +#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 +#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 +#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 +#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD +#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB +#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 +#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC +#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB +#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 +#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE +#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB +#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_MAX_CULL_DISTANCES 0x82F9 +#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C +#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 +#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 +#define GL_MAX_DEPTH 0x8280 +#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENT_INDEX 0x8D6B +#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 +#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 +#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE +#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C +#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA +#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD +#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 +#define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 +#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 +#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF +#define GL_MAX_HEIGHT 0x827F +#define GL_MAX_IMAGE_SAMPLES 0x906D +#define GL_MAX_IMAGE_UNITS 0x8F38 +#define GL_MAX_INTEGER_SAMPLES 0x9110 +#define GL_MAX_LABEL_LENGTH 0x82E8 +#define GL_MAX_LAYERS 0x8281 +#define GL_MAX_NAME_LENGTH 0x92F6 +#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 +#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8 +#define GL_MAX_PATCH_VERTICES 0x8E7D +#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F +#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 +#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 +#define GL_MAX_SAMPLES 0x8D57 +#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 +#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 +#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE +#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD +#define GL_MAX_SUBROUTINES 0x8DE7 +#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3 +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD +#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB +#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C +#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 +#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8 +#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 +#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 +#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 +#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4 +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE +#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC +#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D +#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 +#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9 +#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 +#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A +#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 +#define GL_MAX_TESS_GEN_LEVEL 0x8E7E +#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 +#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_MAX_TEXTURE_MAX_ANISOTROPY 0x84FF +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 +#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 +#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F +#define GL_MAX_UNIFORM_LOCATIONS 0x826E +#define GL_MAX_VARYING_COMPONENTS 0x8B4B +#define GL_MAX_VARYING_FLOATS 0x8B4B +#define GL_MAX_VARYING_VECTORS 0x8DFC +#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 +#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA +#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 +#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 +#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA +#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 +#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 +#define GL_MAX_VERTEX_STREAMS 0x8E71 +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB +#define GL_MAX_VIEWPORTS 0x825B +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_MAX_WIDTH 0x827E +#define GL_MEDIUM_FLOAT 0x8DF1 +#define GL_MEDIUM_INT 0x8DF4 +#define GL_MIN 0x8007 +#define GL_MINOR_VERSION 0x821C +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B +#define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC +#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E +#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 +#define GL_MIPMAP 0x8293 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_MIRROR_CLAMP_TO_EDGE 0x8743 +#define GL_MULTISAMPLE 0x809D +#define GL_NAME_LENGTH 0x92F9 +#define GL_NAND 0x150E +#define GL_NEAREST 0x2600 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_NEGATIVE_ONE_TO_ONE 0x935E +#define GL_NEVER 0x0200 +#define GL_NICEST 0x1102 +#define GL_NONE 0 +#define GL_NOOP 0x1505 +#define GL_NOR 0x1508 +#define GL_NOTEQUAL 0x0205 +#define GL_NO_ERROR 0 +#define GL_NO_RESET_NOTIFICATION 0x8261 +#define GL_NUM_ACTIVE_VARIABLES 0x9304 +#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_NUM_EXTENSIONS 0x821D +#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE +#define GL_NUM_SAMPLE_COUNTS 0x9380 +#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 +#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 +#define GL_NUM_SPIR_V_EXTENSIONS 0x9554 +#define GL_OBJECT_TYPE 0x9112 +#define GL_OFFSET 0x92FC +#define GL_ONE 1 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB +#define GL_ONE_MINUS_SRC1_COLOR 0x88FA +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_OR 0x1507 +#define GL_OR_INVERTED 0x150D +#define GL_OR_REVERSE 0x150B +#define GL_OUT_OF_MEMORY 0x0505 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D +#define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C +#define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E +#define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_PACK_LSB_FIRST 0x0D01 +#define GL_PACK_ROW_LENGTH 0x0D02 +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_SKIP_PIXELS 0x0D04 +#define GL_PACK_SKIP_ROWS 0x0D03 +#define GL_PACK_SWAP_BYTES 0x0D00 +#define GL_PARAMETER_BUFFER 0x80EE +#define GL_PARAMETER_BUFFER_BINDING 0x80EF +#define GL_PATCHES 0x000E +#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 +#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 +#define GL_PATCH_VERTICES 0x8E72 +#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 +#define GL_PIXEL_PACK_BUFFER 0x88EB +#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED +#define GL_PIXEL_UNPACK_BUFFER 0x88EC +#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF +#define GL_POINT 0x1B00 +#define GL_POINTS 0x0000 +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_POINT_SIZE 0x0B11 +#define GL_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_POINT_SIZE_RANGE 0x0B12 +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 +#define GL_POLYGON_MODE 0x0B40 +#define GL_POLYGON_OFFSET_CLAMP 0x8E1B +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_POLYGON_OFFSET_FILL 0x8037 +#define GL_POLYGON_OFFSET_LINE 0x2A02 +#define GL_POLYGON_OFFSET_POINT 0x2A01 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +#define GL_POLYGON_SMOOTH 0x0B41 +#define GL_POLYGON_SMOOTH_HINT 0x0C53 +#define GL_PRIMITIVES_GENERATED 0x8C87 +#define GL_PRIMITIVES_SUBMITTED 0x82EF +#define GL_PRIMITIVE_RESTART 0x8F9D +#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 +#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 +#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E +#define GL_PROGRAM 0x82E2 +#define GL_PROGRAM_BINARY_FORMATS 0x87FF +#define GL_PROGRAM_BINARY_LENGTH 0x8741 +#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 +#define GL_PROGRAM_INPUT 0x92E3 +#define GL_PROGRAM_OUTPUT 0x92E4 +#define GL_PROGRAM_PIPELINE 0x82E4 +#define GL_PROGRAM_PIPELINE_BINDING 0x825A +#define GL_PROGRAM_POINT_SIZE 0x8642 +#define GL_PROGRAM_SEPARABLE 0x8258 +#define GL_PROVOKING_VERTEX 0x8E4F +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 +#define GL_PROXY_TEXTURE_2D 0x8064 +#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B +#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 +#define GL_QUADS 0x0007 +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C +#define GL_QUERY 0x82E3 +#define GL_QUERY_BUFFER 0x9192 +#define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000 +#define GL_QUERY_BUFFER_BINDING 0x9193 +#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 +#define GL_QUERY_BY_REGION_NO_WAIT_INVERTED 0x8E1A +#define GL_QUERY_BY_REGION_WAIT 0x8E15 +#define GL_QUERY_BY_REGION_WAIT_INVERTED 0x8E19 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_QUERY_NO_WAIT 0x8E14 +#define GL_QUERY_NO_WAIT_INVERTED 0x8E18 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_QUERY_RESULT_NO_WAIT 0x9194 +#define GL_QUERY_TARGET 0x82EA +#define GL_QUERY_WAIT 0x8E13 +#define GL_QUERY_WAIT_INVERTED 0x8E17 +#define GL_R11F_G11F_B10F 0x8C3A +#define GL_R16 0x822A +#define GL_R16F 0x822D +#define GL_R16I 0x8233 +#define GL_R16UI 0x8234 +#define GL_R16_SNORM 0x8F98 +#define GL_R32F 0x822E +#define GL_R32I 0x8235 +#define GL_R32UI 0x8236 +#define GL_R3_G3_B2 0x2A10 +#define GL_R8 0x8229 +#define GL_R8I 0x8231 +#define GL_R8UI 0x8232 +#define GL_R8_SNORM 0x8F94 +#define GL_RASTERIZER_DISCARD 0x8C89 +#define GL_READ_BUFFER 0x0C02 +#define GL_READ_FRAMEBUFFER 0x8CA8 +#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA +#define GL_READ_ONLY 0x88B8 +#define GL_READ_PIXELS 0x828C +#define GL_READ_PIXELS_FORMAT 0x828D +#define GL_READ_PIXELS_TYPE 0x828E +#define GL_READ_WRITE 0x88BA +#define GL_RED 0x1903 +#define GL_RED_INTEGER 0x8D94 +#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B +#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A +#define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309 +#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307 +#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308 +#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 +#define GL_RENDERBUFFER 0x8D41 +#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 +#define GL_RENDERBUFFER_BINDING 0x8CA7 +#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 +#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 +#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 +#define GL_RENDERBUFFER_HEIGHT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 +#define GL_RENDERBUFFER_RED_SIZE 0x8D50 +#define GL_RENDERBUFFER_SAMPLES 0x8CAB +#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 +#define GL_RENDERBUFFER_WIDTH 0x8D42 +#define GL_RENDERER 0x1F01 +#define GL_REPEAT 0x2901 +#define GL_REPLACE 0x1E01 +#define GL_RESET_NOTIFICATION_STRATEGY 0x8256 +#define GL_RG 0x8227 +#define GL_RG16 0x822C +#define GL_RG16F 0x822F +#define GL_RG16I 0x8239 +#define GL_RG16UI 0x823A +#define GL_RG16_SNORM 0x8F99 +#define GL_RG32F 0x8230 +#define GL_RG32I 0x823B +#define GL_RG32UI 0x823C +#define GL_RG8 0x822B +#define GL_RG8I 0x8237 +#define GL_RG8UI 0x8238 +#define GL_RG8_SNORM 0x8F95 +#define GL_RGB 0x1907 +#define GL_RGB10 0x8052 +#define GL_RGB10_A2 0x8059 +#define GL_RGB10_A2UI 0x906F +#define GL_RGB12 0x8053 +#define GL_RGB16 0x8054 +#define GL_RGB16F 0x881B +#define GL_RGB16I 0x8D89 +#define GL_RGB16UI 0x8D77 +#define GL_RGB16_SNORM 0x8F9A +#define GL_RGB32F 0x8815 +#define GL_RGB32I 0x8D83 +#define GL_RGB32UI 0x8D71 +#define GL_RGB4 0x804F +#define GL_RGB5 0x8050 +#define GL_RGB565 0x8D62 +#define GL_RGB5_A1 0x8057 +#define GL_RGB8 0x8051 +#define GL_RGB8I 0x8D8F +#define GL_RGB8UI 0x8D7D +#define GL_RGB8_SNORM 0x8F96 +#define GL_RGB9_E5 0x8C3D +#define GL_RGBA 0x1908 +#define GL_RGBA12 0x805A +#define GL_RGBA16 0x805B +#define GL_RGBA16F 0x881A +#define GL_RGBA16I 0x8D88 +#define GL_RGBA16UI 0x8D76 +#define GL_RGBA16_SNORM 0x8F9B +#define GL_RGBA2 0x8055 +#define GL_RGBA32F 0x8814 +#define GL_RGBA32I 0x8D82 +#define GL_RGBA32UI 0x8D70 +#define GL_RGBA4 0x8056 +#define GL_RGBA8 0x8058 +#define GL_RGBA8I 0x8D8E +#define GL_RGBA8UI 0x8D7C +#define GL_RGBA8_SNORM 0x8F97 +#define GL_RGBA_INTEGER 0x8D99 +#define GL_RGB_INTEGER 0x8D98 +#define GL_RG_INTEGER 0x8228 +#define GL_RIGHT 0x0407 +#define GL_SAMPLER 0x82E6 +#define GL_SAMPLER_1D 0x8B5D +#define GL_SAMPLER_1D_ARRAY 0x8DC0 +#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 +#define GL_SAMPLER_1D_SHADOW 0x8B61 +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_2D_ARRAY 0x8DC1 +#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 +#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 +#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B +#define GL_SAMPLER_2D_RECT 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 +#define GL_SAMPLER_2D_SHADOW 0x8B62 +#define GL_SAMPLER_3D 0x8B5F +#define GL_SAMPLER_BINDING 0x8919 +#define GL_SAMPLER_BUFFER 0x8DC2 +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D +#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLES_PASSED 0x8914 +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_MASK 0x8E51 +#define GL_SAMPLE_MASK_VALUE 0x8E52 +#define GL_SAMPLE_POSITION 0x8E50 +#define GL_SAMPLE_SHADING 0x8C36 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_SEPARATE_ATTRIBS 0x8C8D +#define GL_SET 0x150F +#define GL_SHADER 0x82E1 +#define GL_SHADER_BINARY_FORMATS 0x8DF8 +#define GL_SHADER_BINARY_FORMAT_SPIR_V 0x9551 +#define GL_SHADER_COMPILER 0x8DFA +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 +#define GL_SHADER_IMAGE_ATOMIC 0x82A6 +#define GL_SHADER_IMAGE_LOAD 0x82A4 +#define GL_SHADER_IMAGE_STORE 0x82A5 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000 +#define GL_SHADER_STORAGE_BLOCK 0x92E6 +#define GL_SHADER_STORAGE_BUFFER 0x90D2 +#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 +#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF +#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 +#define GL_SHADER_STORAGE_BUFFER_START 0x90D4 +#define GL_SHADER_TYPE 0x8B4F +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_SHORT 0x1402 +#define GL_SIGNALED 0x9119 +#define GL_SIGNED_NORMALIZED 0x8F9C +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SPIR_V_BINARY 0x9552 +#define GL_SPIR_V_EXTENSIONS 0x9553 +#define GL_SRC1_ALPHA 0x8589 +#define GL_SRC1_COLOR 0x88F9 +#define GL_SRC_ALPHA 0x0302 +#define GL_SRC_ALPHA_SATURATE 0x0308 +#define GL_SRC_COLOR 0x0300 +#define GL_SRGB 0x8C40 +#define GL_SRGB8 0x8C41 +#define GL_SRGB8_ALPHA8 0x8C43 +#define GL_SRGB_ALPHA 0x8C42 +#define GL_SRGB_READ 0x8297 +#define GL_SRGB_WRITE 0x8298 +#define GL_STACK_OVERFLOW 0x0503 +#define GL_STACK_UNDERFLOW 0x0504 +#define GL_STATIC_COPY 0x88E6 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STATIC_READ 0x88E5 +#define GL_STENCIL 0x1802 +#define GL_STENCIL_ATTACHMENT 0x8D20 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_COMPONENTS 0x8285 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_INDEX 0x1901 +#define GL_STENCIL_INDEX1 0x8D46 +#define GL_STENCIL_INDEX16 0x8D49 +#define GL_STENCIL_INDEX4 0x8D47 +#define GL_STENCIL_INDEX8 0x8D48 +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_RENDERABLE 0x8288 +#define GL_STENCIL_TEST 0x0B90 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_STEREO 0x0C33 +#define GL_STREAM_COPY 0x88E2 +#define GL_STREAM_DRAW 0x88E0 +#define GL_STREAM_READ 0x88E1 +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_SYNC_CONDITION 0x9113 +#define GL_SYNC_FENCE 0x9116 +#define GL_SYNC_FLAGS 0x9115 +#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 +#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 +#define GL_SYNC_STATUS 0x9114 +#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 +#define GL_TESS_CONTROL_SHADER 0x8E88 +#define GL_TESS_CONTROL_SHADER_BIT 0x00000008 +#define GL_TESS_CONTROL_SHADER_PATCHES 0x82F1 +#define GL_TESS_CONTROL_SUBROUTINE 0x92E9 +#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF +#define GL_TESS_CONTROL_TEXTURE 0x829C +#define GL_TESS_EVALUATION_SHADER 0x8E87 +#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 +#define GL_TESS_EVALUATION_SHADER_INVOCATIONS 0x82F2 +#define GL_TESS_EVALUATION_SUBROUTINE 0x92EA +#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0 +#define GL_TESS_EVALUATION_TEXTURE 0x829D +#define GL_TESS_GEN_MODE 0x8E76 +#define GL_TESS_GEN_POINT_MODE 0x8E79 +#define GL_TESS_GEN_SPACING 0x8E77 +#define GL_TESS_GEN_VERTEX_ORDER 0x8E78 +#define GL_TEXTURE 0x1702 +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_1D_ARRAY 0x8C18 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_TEXTURE_2D_ARRAY 0x8C1A +#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 +#define GL_TEXTURE_3D 0x806F +#define GL_TEXTURE_ALPHA_SIZE 0x805F +#define GL_TEXTURE_ALPHA_TYPE 0x8C13 +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_BINDING_1D 0x8068 +#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_TEXTURE_BINDING_BUFFER 0x8C2C +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A +#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 +#define GL_TEXTURE_BLUE_SIZE 0x805E +#define GL_TEXTURE_BLUE_TYPE 0x8C12 +#define GL_TEXTURE_BORDER_COLOR 0x1004 +#define GL_TEXTURE_BUFFER 0x8C2A +#define GL_TEXTURE_BUFFER_BINDING 0x8C2A +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D +#define GL_TEXTURE_BUFFER_OFFSET 0x919D +#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F +#define GL_TEXTURE_BUFFER_SIZE 0x919E +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2 +#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3 +#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1 +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_TEXTURE_DEPTH_TYPE 0x8C16 +#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 +#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 +#define GL_TEXTURE_GATHER 0x82A2 +#define GL_TEXTURE_GATHER_SHADOW 0x82A3 +#define GL_TEXTURE_GREEN_SIZE 0x805D +#define GL_TEXTURE_GREEN_TYPE 0x8C11 +#define GL_TEXTURE_HEIGHT 0x1001 +#define GL_TEXTURE_IMAGE_FORMAT 0x828F +#define GL_TEXTURE_IMAGE_TYPE 0x8290 +#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F +#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF +#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MAX_ANISOTROPY 0x84FE +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_RECTANGLE 0x84F5 +#define GL_TEXTURE_RED_SIZE 0x805C +#define GL_TEXTURE_RED_TYPE 0x8C10 +#define GL_TEXTURE_SAMPLES 0x9106 +#define GL_TEXTURE_SHADOW 0x82A1 +#define GL_TEXTURE_SHARED_SIZE 0x8C3F +#define GL_TEXTURE_STENCIL_SIZE 0x88F1 +#define GL_TEXTURE_SWIZZLE_A 0x8E45 +#define GL_TEXTURE_SWIZZLE_B 0x8E44 +#define GL_TEXTURE_SWIZZLE_G 0x8E43 +#define GL_TEXTURE_SWIZZLE_R 0x8E42 +#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 +#define GL_TEXTURE_TARGET 0x1006 +#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 +#define GL_TEXTURE_VIEW 0x82B5 +#define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD +#define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB +#define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE +#define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC +#define GL_TEXTURE_WIDTH 0x1000 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 +#define GL_TIMEOUT_EXPIRED 0x911B +#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFF +#define GL_TIMESTAMP 0x8E28 +#define GL_TIME_ELAPSED 0x88BF +#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C +#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D +#define GL_TRANSFORM_FEEDBACK 0x8E22 +#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 +#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 +#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F +#define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C +#define GL_TRANSFORM_FEEDBACK_OVERFLOW 0x82EC +#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 +#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW 0x82ED +#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 +#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLES_ADJACENCY 0x000C +#define GL_TRIANGLE_FAN 0x0006 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D +#define GL_TRUE 1 +#define GL_TYPE 0x92FA +#define GL_UNDEFINED_VERTEX 0x8260 +#define GL_UNIFORM 0x92E1 +#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C +#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA +#define GL_UNIFORM_BARRIER_BIT 0x00000004 +#define GL_UNIFORM_BLOCK 0x92E2 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 +#define GL_UNIFORM_BLOCK_BINDING 0x8A3F +#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 +#define GL_UNIFORM_BLOCK_INDEX 0x8A3A +#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC +#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 +#define GL_UNIFORM_BUFFER 0x8A11 +#define GL_UNIFORM_BUFFER_BINDING 0x8A28 +#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 +#define GL_UNIFORM_BUFFER_SIZE 0x8A2A +#define GL_UNIFORM_BUFFER_START 0x8A29 +#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E +#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D +#define GL_UNIFORM_NAME_LENGTH 0x8A39 +#define GL_UNIFORM_OFFSET 0x8A3B +#define GL_UNIFORM_SIZE 0x8A38 +#define GL_UNIFORM_TYPE 0x8A37 +#define GL_UNKNOWN_CONTEXT_RESET 0x8255 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 +#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 +#define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A +#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_UNPACK_LSB_FIRST 0x0CF1 +#define GL_UNPACK_ROW_LENGTH 0x0CF2 +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_SKIP_PIXELS 0x0CF4 +#define GL_UNPACK_SKIP_ROWS 0x0CF3 +#define GL_UNPACK_SWAP_BYTES 0x0CF0 +#define GL_UNSIGNALED 0x9118 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_INT 0x1405 +#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_UNSIGNED_INT_24_8 0x84FA +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB +#define GL_UNSIGNED_INT_IMAGE_1D 0x9062 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068 +#define GL_UNSIGNED_INT_IMAGE_2D 0x9063 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C +#define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_3D 0x9064 +#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 +#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A +#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 +#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F +#define GL_UNSIGNED_INT_VEC2 0x8DC6 +#define GL_UNSIGNED_INT_VEC3 0x8DC7 +#define GL_UNSIGNED_INT_VEC4 0x8DC8 +#define GL_UNSIGNED_NORMALIZED 0x8C17 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_VENDOR 0x1F00 +#define GL_VERSION 0x1F02 +#define GL_VERTEX_ARRAY 0x8074 +#define GL_VERTEX_ARRAY_BINDING 0x85B5 +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD +#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_VERTEX_ATTRIB_BINDING 0x82D4 +#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 +#define GL_VERTEX_BINDING_BUFFER 0x8F4F +#define GL_VERTEX_BINDING_DIVISOR 0x82D6 +#define GL_VERTEX_BINDING_OFFSET 0x82D7 +#define GL_VERTEX_BINDING_STRIDE 0x82D8 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_VERTEX_SHADER_BIT 0x00000001 +#define GL_VERTEX_SHADER_INVOCATIONS 0x82F0 +#define GL_VERTEX_SUBROUTINE 0x92E8 +#define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE +#define GL_VERTEX_TEXTURE 0x829B +#define GL_VERTICES_SUBMITTED 0x82EE +#define GL_VIEWPORT 0x0BA2 +#define GL_VIEWPORT_BOUNDS_RANGE 0x825D +#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F +#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C +#define GL_VIEW_CLASS_128_BITS 0x82C4 +#define GL_VIEW_CLASS_16_BITS 0x82CA +#define GL_VIEW_CLASS_24_BITS 0x82C9 +#define GL_VIEW_CLASS_32_BITS 0x82C8 +#define GL_VIEW_CLASS_48_BITS 0x82C7 +#define GL_VIEW_CLASS_64_BITS 0x82C6 +#define GL_VIEW_CLASS_8_BITS 0x82CB +#define GL_VIEW_CLASS_96_BITS 0x82C5 +#define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 +#define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 +#define GL_VIEW_CLASS_RGTC1_RED 0x82D0 +#define GL_VIEW_CLASS_RGTC2_RG 0x82D1 +#define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC +#define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD +#define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE +#define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF +#define GL_VIEW_COMPATIBILITY_CLASS 0x82B6 +#define GL_WAIT_FAILED 0x911D +#define GL_WRITE_ONLY 0x88B9 +#define GL_XOR 0x1506 +#define GL_ZERO 0 +#define GL_ZERO_TO_ONE 0x935F + + +#include +typedef unsigned int GLenum; +typedef unsigned char GLboolean; +typedef unsigned int GLbitfield; +typedef void GLvoid; +typedef khronos_int8_t GLbyte; +typedef khronos_uint8_t GLubyte; +typedef khronos_int16_t GLshort; +typedef khronos_uint16_t GLushort; +typedef int GLint; +typedef unsigned int GLuint; +typedef khronos_int32_t GLclampx; +typedef int GLsizei; +typedef khronos_float_t GLfloat; +typedef khronos_float_t GLclampf; +typedef double GLdouble; +typedef double GLclampd; +typedef void *GLeglClientBufferEXT; +typedef void *GLeglImageOES; +typedef char GLchar; +typedef char GLcharARB; +#ifdef __APPLE__ +typedef void *GLhandleARB; +#else +typedef unsigned int GLhandleARB; +#endif +typedef khronos_uint16_t GLhalf; +typedef khronos_uint16_t GLhalfARB; +typedef khronos_int32_t GLfixed; +#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) +typedef khronos_intptr_t GLintptr; +#else +typedef khronos_intptr_t GLintptr; +#endif +#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) +typedef khronos_intptr_t GLintptrARB; +#else +typedef khronos_intptr_t GLintptrARB; +#endif +#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) +typedef khronos_ssize_t GLsizeiptr; +#else +typedef khronos_ssize_t GLsizeiptr; +#endif +#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) +typedef khronos_ssize_t GLsizeiptrARB; +#else +typedef khronos_ssize_t GLsizeiptrARB; +#endif +typedef khronos_int64_t GLint64; +typedef khronos_int64_t GLint64EXT; +typedef khronos_uint64_t GLuint64; +typedef khronos_uint64_t GLuint64EXT; +typedef struct __GLsync *GLsync; +struct _cl_context; +struct _cl_event; +typedef void (GLAD_API_PTR *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void (GLAD_API_PTR *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void (GLAD_API_PTR *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void (GLAD_API_PTR *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam); +typedef unsigned short GLhalfNV; +typedef GLintptr GLvdpauSurfaceNV; +typedef void (GLAD_API_PTR *GLVULKANPROCNV)(void); + + +#define GL_VERSION_1_0 1 +GLAD_API_CALL int GLAD_GL_VERSION_1_0; +#define GL_VERSION_1_1 1 +GLAD_API_CALL int GLAD_GL_VERSION_1_1; +#define GL_VERSION_1_2 1 +GLAD_API_CALL int GLAD_GL_VERSION_1_2; +#define GL_VERSION_1_3 1 +GLAD_API_CALL int GLAD_GL_VERSION_1_3; +#define GL_VERSION_1_4 1 +GLAD_API_CALL int GLAD_GL_VERSION_1_4; +#define GL_VERSION_1_5 1 +GLAD_API_CALL int GLAD_GL_VERSION_1_5; +#define GL_VERSION_2_0 1 +GLAD_API_CALL int GLAD_GL_VERSION_2_0; +#define GL_VERSION_2_1 1 +GLAD_API_CALL int GLAD_GL_VERSION_2_1; +#define GL_VERSION_3_0 1 +GLAD_API_CALL int GLAD_GL_VERSION_3_0; +#define GL_VERSION_3_1 1 +GLAD_API_CALL int GLAD_GL_VERSION_3_1; +#define GL_VERSION_3_2 1 +GLAD_API_CALL int GLAD_GL_VERSION_3_2; +#define GL_VERSION_3_3 1 +GLAD_API_CALL int GLAD_GL_VERSION_3_3; +#define GL_VERSION_4_0 1 +GLAD_API_CALL int GLAD_GL_VERSION_4_0; +#define GL_VERSION_4_1 1 +GLAD_API_CALL int GLAD_GL_VERSION_4_1; +#define GL_VERSION_4_2 1 +GLAD_API_CALL int GLAD_GL_VERSION_4_2; +#define GL_VERSION_4_3 1 +GLAD_API_CALL int GLAD_GL_VERSION_4_3; +#define GL_VERSION_4_4 1 +GLAD_API_CALL int GLAD_GL_VERSION_4_4; +#define GL_VERSION_4_5 1 +GLAD_API_CALL int GLAD_GL_VERSION_4_5; +#define GL_VERSION_4_6 1 +GLAD_API_CALL int GLAD_GL_VERSION_4_6; + + +typedef void (GLAD_API_PTR *PFNGLACTIVESHADERPROGRAMPROC)(GLuint pipeline, GLuint program); +typedef void (GLAD_API_PTR *PFNGLACTIVETEXTUREPROC)(GLenum texture); +typedef void (GLAD_API_PTR *PFNGLATTACHSHADERPROC)(GLuint program, GLuint shader); +typedef void (GLAD_API_PTR *PFNGLBEGINCONDITIONALRENDERPROC)(GLuint id, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLBEGINQUERYPROC)(GLenum target, GLuint id); +typedef void (GLAD_API_PTR *PFNGLBEGINQUERYINDEXEDPROC)(GLenum target, GLuint index, GLuint id); +typedef void (GLAD_API_PTR *PFNGLBEGINTRANSFORMFEEDBACKPROC)(GLenum primitiveMode); +typedef void (GLAD_API_PTR *PFNGLBINDATTRIBLOCATIONPROC)(GLuint program, GLuint index, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERPROC)(GLenum target, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERBASEPROC)(GLenum target, GLuint index, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERRANGEPROC)(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERSBASEPROC)(GLenum target, GLuint first, GLsizei count, const GLuint * buffers); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERSRANGEPROC)(GLenum target, GLuint first, GLsizei count, const GLuint * buffers, const GLintptr * offsets, const GLsizeiptr * sizes); +typedef void (GLAD_API_PTR *PFNGLBINDFRAGDATALOCATIONPROC)(GLuint program, GLuint color, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)(GLuint program, GLuint colorNumber, GLuint index, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer); +typedef void (GLAD_API_PTR *PFNGLBINDIMAGETEXTUREPROC)(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); +typedef void (GLAD_API_PTR *PFNGLBINDIMAGETEXTURESPROC)(GLuint first, GLsizei count, const GLuint * textures); +typedef void (GLAD_API_PTR *PFNGLBINDPROGRAMPIPELINEPROC)(GLuint pipeline); +typedef void (GLAD_API_PTR *PFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer); +typedef void (GLAD_API_PTR *PFNGLBINDSAMPLERPROC)(GLuint unit, GLuint sampler); +typedef void (GLAD_API_PTR *PFNGLBINDSAMPLERSPROC)(GLuint first, GLsizei count, const GLuint * samplers); +typedef void (GLAD_API_PTR *PFNGLBINDTEXTUREPROC)(GLenum target, GLuint texture); +typedef void (GLAD_API_PTR *PFNGLBINDTEXTUREUNITPROC)(GLuint unit, GLuint texture); +typedef void (GLAD_API_PTR *PFNGLBINDTEXTURESPROC)(GLuint first, GLsizei count, const GLuint * textures); +typedef void (GLAD_API_PTR *PFNGLBINDTRANSFORMFEEDBACKPROC)(GLenum target, GLuint id); +typedef void (GLAD_API_PTR *PFNGLBINDVERTEXARRAYPROC)(GLuint array); +typedef void (GLAD_API_PTR *PFNGLBINDVERTEXBUFFERPROC)(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLBINDVERTEXBUFFERSPROC)(GLuint first, GLsizei count, const GLuint * buffers, const GLintptr * offsets, const GLsizei * strides); +typedef void (GLAD_API_PTR *PFNGLBLENDCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEPROC)(GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEIPROC)(GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONIPROC)(GLuint buf, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCPROC)(GLenum sfactor, GLenum dfactor); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEIPROC)(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCIPROC)(GLuint buf, GLenum src, GLenum dst); +typedef void (GLAD_API_PTR *PFNGLBLITFRAMEBUFFERPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (GLAD_API_PTR *PFNGLBLITNAMEDFRAMEBUFFERPROC)(GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (GLAD_API_PTR *PFNGLBUFFERDATAPROC)(GLenum target, GLsizeiptr size, const void * data, GLenum usage); +typedef void (GLAD_API_PTR *PFNGLBUFFERSTORAGEPROC)(GLenum target, GLsizeiptr size, const void * data, GLbitfield flags); +typedef void (GLAD_API_PTR *PFNGLBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, const void * data); +typedef GLenum (GLAD_API_PTR *PFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target); +typedef GLenum (GLAD_API_PTR *PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC)(GLuint framebuffer, GLenum target); +typedef void (GLAD_API_PTR *PFNGLCLAMPCOLORPROC)(GLenum target, GLenum clamp); +typedef void (GLAD_API_PTR *PFNGLCLEARPROC)(GLbitfield mask); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERDATAPROC)(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void * data); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERSUBDATAPROC)(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void * data); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERFIPROC)(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERFVPROC)(GLenum buffer, GLint drawbuffer, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERIVPROC)(GLenum buffer, GLint drawbuffer, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERUIVPROC)(GLenum buffer, GLint drawbuffer, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLCLEARCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHPROC)(GLdouble depth); +typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHFPROC)(GLfloat d); +typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDBUFFERDATAPROC)(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void * data); +typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDBUFFERSUBDATAPROC)(GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void * data); +typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDFRAMEBUFFERFIPROC)(GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDFRAMEBUFFERFVPROC)(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDFRAMEBUFFERIVPROC)(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC)(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLCLEARSTENCILPROC)(GLint s); +typedef void (GLAD_API_PTR *PFNGLCLEARTEXIMAGEPROC)(GLuint texture, GLint level, GLenum format, GLenum type, const void * data); +typedef void (GLAD_API_PTR *PFNGLCLEARTEXSUBIMAGEPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void * data); +typedef GLenum (GLAD_API_PTR *PFNGLCLIENTWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (GLAD_API_PTR *PFNGLCLIPCONTROLPROC)(GLenum origin, GLenum depth); +typedef void (GLAD_API_PTR *PFNGLCOLORMASKPROC)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +typedef void (GLAD_API_PTR *PFNGLCOLORMASKIPROC)(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (GLAD_API_PTR *PFNGLCOMPILESHADERPROC)(GLuint shader); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE3DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC)(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOPYBUFFERSUBDATAPROC)(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLCOPYIMAGESUBDATAPROC)(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +typedef void (GLAD_API_PTR *PFNGLCOPYNAMEDBUFFERSUBDATAPROC)(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXTURESUBIMAGE1DPROC)(GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXTURESUBIMAGE2DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXTURESUBIMAGE3DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCREATEBUFFERSPROC)(GLsizei n, GLuint * buffers); +typedef void (GLAD_API_PTR *PFNGLCREATEFRAMEBUFFERSPROC)(GLsizei n, GLuint * framebuffers); +typedef GLuint (GLAD_API_PTR *PFNGLCREATEPROGRAMPROC)(void); +typedef void (GLAD_API_PTR *PFNGLCREATEPROGRAMPIPELINESPROC)(GLsizei n, GLuint * pipelines); +typedef void (GLAD_API_PTR *PFNGLCREATEQUERIESPROC)(GLenum target, GLsizei n, GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLCREATERENDERBUFFERSPROC)(GLsizei n, GLuint * renderbuffers); +typedef void (GLAD_API_PTR *PFNGLCREATESAMPLERSPROC)(GLsizei n, GLuint * samplers); +typedef GLuint (GLAD_API_PTR *PFNGLCREATESHADERPROC)(GLenum type); +typedef GLuint (GLAD_API_PTR *PFNGLCREATESHADERPROGRAMVPROC)(GLenum type, GLsizei count, const GLchar *const* strings); +typedef void (GLAD_API_PTR *PFNGLCREATETEXTURESPROC)(GLenum target, GLsizei n, GLuint * textures); +typedef void (GLAD_API_PTR *PFNGLCREATETRANSFORMFEEDBACKSPROC)(GLsizei n, GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLCREATEVERTEXARRAYSPROC)(GLsizei n, GLuint * arrays); +typedef void (GLAD_API_PTR *PFNGLCULLFACEPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGECALLBACKPROC)(GLDEBUGPROC callback, const void * userParam); +typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGECONTROLPROC)(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint * ids, GLboolean enabled); +typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGEINSERTPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar * buf); +typedef void (GLAD_API_PTR *PFNGLDELETEBUFFERSPROC)(GLsizei n, const GLuint * buffers); +typedef void (GLAD_API_PTR *PFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint * framebuffers); +typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMPROC)(GLuint program); +typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMPIPELINESPROC)(GLsizei n, const GLuint * pipelines); +typedef void (GLAD_API_PTR *PFNGLDELETEQUERIESPROC)(GLsizei n, const GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint * renderbuffers); +typedef void (GLAD_API_PTR *PFNGLDELETESAMPLERSPROC)(GLsizei count, const GLuint * samplers); +typedef void (GLAD_API_PTR *PFNGLDELETESHADERPROC)(GLuint shader); +typedef void (GLAD_API_PTR *PFNGLDELETESYNCPROC)(GLsync sync); +typedef void (GLAD_API_PTR *PFNGLDELETETEXTURESPROC)(GLsizei n, const GLuint * textures); +typedef void (GLAD_API_PTR *PFNGLDELETETRANSFORMFEEDBACKSPROC)(GLsizei n, const GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLDELETEVERTEXARRAYSPROC)(GLsizei n, const GLuint * arrays); +typedef void (GLAD_API_PTR *PFNGLDEPTHFUNCPROC)(GLenum func); +typedef void (GLAD_API_PTR *PFNGLDEPTHMASKPROC)(GLboolean flag); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEPROC)(GLdouble n, GLdouble f); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEARRAYVPROC)(GLuint first, GLsizei count, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEINDEXEDPROC)(GLuint index, GLdouble n, GLdouble f); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEFPROC)(GLfloat n, GLfloat f); +typedef void (GLAD_API_PTR *PFNGLDETACHSHADERPROC)(GLuint program, GLuint shader); +typedef void (GLAD_API_PTR *PFNGLDISABLEPROC)(GLenum cap); +typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXARRAYATTRIBPROC)(GLuint vaobj, GLuint index); +typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXATTRIBARRAYPROC)(GLuint index); +typedef void (GLAD_API_PTR *PFNGLDISABLEIPROC)(GLenum target, GLuint index); +typedef void (GLAD_API_PTR *PFNGLDISPATCHCOMPUTEPROC)(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +typedef void (GLAD_API_PTR *PFNGLDISPATCHCOMPUTEINDIRECTPROC)(GLintptr indirect); +typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSPROC)(GLenum mode, GLint first, GLsizei count); +typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINDIRECTPROC)(GLenum mode, const void * indirect); +typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINSTANCEDPROC)(GLenum mode, GLint first, GLsizei count, GLsizei instancecount); +typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC)(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); +typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERPROC)(GLenum buf); +typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERSPROC)(GLsizei n, const GLenum * bufs); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLint basevertex); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINDIRECTPROC)(GLenum mode, GLenum type, const void * indirect); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount, GLuint baseinstance); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount, GLint basevertex); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); +typedef void (GLAD_API_PTR *PFNGLDRAWRANGEELEMENTSPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void * indices); +typedef void (GLAD_API_PTR *PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void * indices, GLint basevertex); +typedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKPROC)(GLenum mode, GLuint id); +typedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC)(GLenum mode, GLuint id, GLsizei instancecount); +typedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC)(GLenum mode, GLuint id, GLuint stream); +typedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC)(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); +typedef void (GLAD_API_PTR *PFNGLENABLEPROC)(GLenum cap); +typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXARRAYATTRIBPROC)(GLuint vaobj, GLuint index); +typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXATTRIBARRAYPROC)(GLuint index); +typedef void (GLAD_API_PTR *PFNGLENABLEIPROC)(GLenum target, GLuint index); +typedef void (GLAD_API_PTR *PFNGLENDCONDITIONALRENDERPROC)(void); +typedef void (GLAD_API_PTR *PFNGLENDQUERYPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLENDQUERYINDEXEDPROC)(GLenum target, GLuint index); +typedef void (GLAD_API_PTR *PFNGLENDTRANSFORMFEEDBACKPROC)(void); +typedef GLsync (GLAD_API_PTR *PFNGLFENCESYNCPROC)(GLenum condition, GLbitfield flags); +typedef void (GLAD_API_PTR *PFNGLFINISHPROC)(void); +typedef void (GLAD_API_PTR *PFNGLFLUSHPROC)(void); +typedef void (GLAD_API_PTR *PFNGLFLUSHMAPPEDBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length); +typedef void (GLAD_API_PTR *PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERPARAMETERIPROC)(GLenum target, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE1DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE3DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAD_API_PTR *PFNGLFRONTFACEPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLGENBUFFERSPROC)(GLsizei n, GLuint * buffers); +typedef void (GLAD_API_PTR *PFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint * framebuffers); +typedef void (GLAD_API_PTR *PFNGLGENPROGRAMPIPELINESPROC)(GLsizei n, GLuint * pipelines); +typedef void (GLAD_API_PTR *PFNGLGENQUERIESPROC)(GLsizei n, GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint * renderbuffers); +typedef void (GLAD_API_PTR *PFNGLGENSAMPLERSPROC)(GLsizei count, GLuint * samplers); +typedef void (GLAD_API_PTR *PFNGLGENTEXTURESPROC)(GLsizei n, GLuint * textures); +typedef void (GLAD_API_PTR *PFNGLGENTRANSFORMFEEDBACKSPROC)(GLsizei n, GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLGENVERTEXARRAYSPROC)(GLsizei n, GLuint * arrays); +typedef void (GLAD_API_PTR *PFNGLGENERATEMIPMAPPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLGENERATETEXTUREMIPMAPPROC)(GLuint texture); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC)(GLuint program, GLuint bufferIndex, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEATTRIBPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETACTIVESUBROUTINENAMEPROC)(GLuint program, GLenum shadertype, GLuint index, GLsizei bufSize, GLsizei * length, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC)(GLuint program, GLenum shadertype, GLuint index, GLsizei bufSize, GLsizei * length, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC)(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint * values); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei * length, GLchar * uniformBlockName); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMBLOCKIVPROC)(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMNAMEPROC)(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei * length, GLchar * uniformName); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMSIVPROC)(GLuint program, GLsizei uniformCount, const GLuint * uniformIndices, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETATTACHEDSHADERSPROC)(GLuint program, GLsizei maxCount, GLsizei * count, GLuint * shaders); +typedef GLint (GLAD_API_PTR *PFNGLGETATTRIBLOCATIONPROC)(GLuint program, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETBOOLEANI_VPROC)(GLenum target, GLuint index, GLboolean * data); +typedef void (GLAD_API_PTR *PFNGLGETBOOLEANVPROC)(GLenum pname, GLboolean * data); +typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERI64VPROC)(GLenum target, GLenum pname, GLint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETBUFFERPOINTERVPROC)(GLenum target, GLenum pname, void ** params); +typedef void (GLAD_API_PTR *PFNGLGETBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, void * data); +typedef void (GLAD_API_PTR *PFNGLGETCOMPRESSEDTEXIMAGEPROC)(GLenum target, GLint level, void * img); +typedef void (GLAD_API_PTR *PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC)(GLuint texture, GLint level, GLsizei bufSize, void * pixels); +typedef void (GLAD_API_PTR *PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void * pixels); +typedef GLuint (GLAD_API_PTR *PFNGLGETDEBUGMESSAGELOGPROC)(GLuint count, GLsizei bufSize, GLenum * sources, GLenum * types, GLuint * ids, GLenum * severities, GLsizei * lengths, GLchar * messageLog); +typedef void (GLAD_API_PTR *PFNGLGETDOUBLEI_VPROC)(GLenum target, GLuint index, GLdouble * data); +typedef void (GLAD_API_PTR *PFNGLGETDOUBLEVPROC)(GLenum pname, GLdouble * data); +typedef GLenum (GLAD_API_PTR *PFNGLGETERRORPROC)(void); +typedef void (GLAD_API_PTR *PFNGLGETFLOATI_VPROC)(GLenum target, GLuint index, GLfloat * data); +typedef void (GLAD_API_PTR *PFNGLGETFLOATVPROC)(GLenum pname, GLfloat * data); +typedef GLint (GLAD_API_PTR *PFNGLGETFRAGDATAINDEXPROC)(GLuint program, const GLchar * name); +typedef GLint (GLAD_API_PTR *PFNGLGETFRAGDATALOCATIONPROC)(GLuint program, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef GLenum (GLAD_API_PTR *PFNGLGETGRAPHICSRESETSTATUSPROC)(void); +typedef void (GLAD_API_PTR *PFNGLGETINTEGER64I_VPROC)(GLenum target, GLuint index, GLint64 * data); +typedef void (GLAD_API_PTR *PFNGLGETINTEGER64VPROC)(GLenum pname, GLint64 * data); +typedef void (GLAD_API_PTR *PFNGLGETINTEGERI_VPROC)(GLenum target, GLuint index, GLint * data); +typedef void (GLAD_API_PTR *PFNGLGETINTEGERVPROC)(GLenum pname, GLint * data); +typedef void (GLAD_API_PTR *PFNGLGETINTERNALFORMATI64VPROC)(GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETINTERNALFORMATIVPROC)(GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETMULTISAMPLEFVPROC)(GLenum pname, GLuint index, GLfloat * val); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERPARAMETERI64VPROC)(GLuint buffer, GLenum pname, GLint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERPARAMETERIVPROC)(GLuint buffer, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERPOINTERVPROC)(GLuint buffer, GLenum pname, void ** params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERSUBDATAPROC)(GLuint buffer, GLintptr offset, GLsizeiptr size, void * data); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLuint framebuffer, GLenum attachment, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC)(GLuint framebuffer, GLenum pname, GLint * param); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC)(GLuint renderbuffer, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei * length, GLchar * label); +typedef void (GLAD_API_PTR *PFNGLGETOBJECTPTRLABELPROC)(const void * ptr, GLsizei bufSize, GLsizei * length, GLchar * label); +typedef void (GLAD_API_PTR *PFNGLGETPOINTERVPROC)(GLenum pname, void ** params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMBINARYPROC)(GLuint program, GLsizei bufSize, GLsizei * length, GLenum * binaryFormat, void * binary); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMINFOLOGPROC)(GLuint program, GLsizei bufSize, GLsizei * length, GLchar * infoLog); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMINTERFACEIVPROC)(GLuint program, GLenum programInterface, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPIPELINEINFOLOGPROC)(GLuint pipeline, GLsizei bufSize, GLsizei * length, GLchar * infoLog); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPIPELINEIVPROC)(GLuint pipeline, GLenum pname, GLint * params); +typedef GLuint (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCEINDEXPROC)(GLuint program, GLenum programInterface, const GLchar * name); +typedef GLint (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCELOCATIONPROC)(GLuint program, GLenum programInterface, const GLchar * name); +typedef GLint (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC)(GLuint program, GLenum programInterface, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCENAMEPROC)(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei * length, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCEIVPROC)(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum * props, GLsizei count, GLsizei * length, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMSTAGEIVPROC)(GLuint program, GLenum shadertype, GLenum pname, GLint * values); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMIVPROC)(GLuint program, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYBUFFEROBJECTI64VPROC)(GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLGETQUERYBUFFEROBJECTIVPROC)(GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLGETQUERYBUFFEROBJECTUI64VPROC)(GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLGETQUERYBUFFEROBJECTUIVPROC)(GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLGETQUERYINDEXEDIVPROC)(GLenum target, GLuint index, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTI64VPROC)(GLuint id, GLenum pname, GLint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTIVPROC)(GLuint id, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTUI64VPROC)(GLuint id, GLenum pname, GLuint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTUIVPROC)(GLuint id, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIIVPROC)(GLuint sampler, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIUIVPROC)(GLuint sampler, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETSHADERINFOLOGPROC)(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * infoLog); +typedef void (GLAD_API_PTR *PFNGLGETSHADERPRECISIONFORMATPROC)(GLenum shadertype, GLenum precisiontype, GLint * range, GLint * precision); +typedef void (GLAD_API_PTR *PFNGLGETSHADERSOURCEPROC)(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * source); +typedef void (GLAD_API_PTR *PFNGLGETSHADERIVPROC)(GLuint shader, GLenum pname, GLint * params); +typedef const GLubyte * (GLAD_API_PTR *PFNGLGETSTRINGPROC)(GLenum name); +typedef const GLubyte * (GLAD_API_PTR *PFNGLGETSTRINGIPROC)(GLenum name, GLuint index); +typedef GLuint (GLAD_API_PTR *PFNGLGETSUBROUTINEINDEXPROC)(GLuint program, GLenum shadertype, const GLchar * name); +typedef GLint (GLAD_API_PTR *PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC)(GLuint program, GLenum shadertype, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETSYNCIVPROC)(GLsync sync, GLenum pname, GLsizei count, GLsizei * length, GLint * values); +typedef void (GLAD_API_PTR *PFNGLGETTEXIMAGEPROC)(GLenum target, GLint level, GLenum format, GLenum type, void * pixels); +typedef void (GLAD_API_PTR *PFNGLGETTEXLEVELPARAMETERFVPROC)(GLenum target, GLint level, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXLEVELPARAMETERIVPROC)(GLenum target, GLint level, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTUREIMAGEPROC)(GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void * pixels); +typedef void (GLAD_API_PTR *PFNGLGETTEXTURELEVELPARAMETERFVPROC)(GLuint texture, GLint level, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTURELEVELPARAMETERIVPROC)(GLuint texture, GLint level, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERIIVPROC)(GLuint texture, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERIUIVPROC)(GLuint texture, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERFVPROC)(GLuint texture, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERIVPROC)(GLuint texture, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTURESUBIMAGEPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void * pixels); +typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKI64_VPROC)(GLuint xfb, GLenum pname, GLuint index, GLint64 * param); +typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKI_VPROC)(GLuint xfb, GLenum pname, GLuint index, GLint * param); +typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKIVPROC)(GLuint xfb, GLenum pname, GLint * param); +typedef GLuint (GLAD_API_PTR *PFNGLGETUNIFORMBLOCKINDEXPROC)(GLuint program, const GLchar * uniformBlockName); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMINDICESPROC)(GLuint program, GLsizei uniformCount, const GLchar *const* uniformNames, GLuint * uniformIndices); +typedef GLint (GLAD_API_PTR *PFNGLGETUNIFORMLOCATIONPROC)(GLuint program, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMSUBROUTINEUIVPROC)(GLenum shadertype, GLint location, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMDVPROC)(GLuint program, GLint location, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMFVPROC)(GLuint program, GLint location, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMIVPROC)(GLuint program, GLint location, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMUIVPROC)(GLuint program, GLint location, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXARRAYINDEXED64IVPROC)(GLuint vaobj, GLuint index, GLenum pname, GLint64 * param); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXARRAYINDEXEDIVPROC)(GLuint vaobj, GLuint index, GLenum pname, GLint * param); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXARRAYIVPROC)(GLuint vaobj, GLenum pname, GLint * param); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIIVPROC)(GLuint index, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIUIVPROC)(GLuint index, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBLDVPROC)(GLuint index, GLenum pname, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVPROC)(GLuint index, GLenum pname, void ** pointer); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBDVPROC)(GLuint index, GLenum pname, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBFVPROC)(GLuint index, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVPROC)(GLuint index, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETNCOMPRESSEDTEXIMAGEPROC)(GLenum target, GLint lod, GLsizei bufSize, void * pixels); +typedef void (GLAD_API_PTR *PFNGLGETNTEXIMAGEPROC)(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void * pixels); +typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMDVPROC)(GLuint program, GLint location, GLsizei bufSize, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMFVPROC)(GLuint program, GLint location, GLsizei bufSize, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMIVPROC)(GLuint program, GLint location, GLsizei bufSize, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMUIVPROC)(GLuint program, GLint location, GLsizei bufSize, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLHINTPROC)(GLenum target, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLINVALIDATEBUFFERSUBDATAPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (GLAD_API_PTR *PFNGLINVALIDATEFRAMEBUFFERPROC)(GLenum target, GLsizei numAttachments, const GLenum * attachments); +typedef void (GLAD_API_PTR *PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC)(GLuint framebuffer, GLsizei numAttachments, const GLenum * attachments); +typedef void (GLAD_API_PTR *PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC)(GLuint framebuffer, GLsizei numAttachments, const GLenum * attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLINVALIDATESUBFRAMEBUFFERPROC)(GLenum target, GLsizei numAttachments, const GLenum * attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLINVALIDATETEXIMAGEPROC)(GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLINVALIDATETEXSUBIMAGEPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); +typedef GLboolean (GLAD_API_PTR *PFNGLISBUFFERPROC)(GLuint buffer); +typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDPROC)(GLenum cap); +typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDIPROC)(GLenum target, GLuint index); +typedef GLboolean (GLAD_API_PTR *PFNGLISFRAMEBUFFERPROC)(GLuint framebuffer); +typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMPROC)(GLuint program); +typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMPIPELINEPROC)(GLuint pipeline); +typedef GLboolean (GLAD_API_PTR *PFNGLISQUERYPROC)(GLuint id); +typedef GLboolean (GLAD_API_PTR *PFNGLISRENDERBUFFERPROC)(GLuint renderbuffer); +typedef GLboolean (GLAD_API_PTR *PFNGLISSAMPLERPROC)(GLuint sampler); +typedef GLboolean (GLAD_API_PTR *PFNGLISSHADERPROC)(GLuint shader); +typedef GLboolean (GLAD_API_PTR *PFNGLISSYNCPROC)(GLsync sync); +typedef GLboolean (GLAD_API_PTR *PFNGLISTEXTUREPROC)(GLuint texture); +typedef GLboolean (GLAD_API_PTR *PFNGLISTRANSFORMFEEDBACKPROC)(GLuint id); +typedef GLboolean (GLAD_API_PTR *PFNGLISVERTEXARRAYPROC)(GLuint array); +typedef void (GLAD_API_PTR *PFNGLLINEWIDTHPROC)(GLfloat width); +typedef void (GLAD_API_PTR *PFNGLLINKPROGRAMPROC)(GLuint program); +typedef void (GLAD_API_PTR *PFNGLLOGICOPPROC)(GLenum opcode); +typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERPROC)(GLenum target, GLenum access); +typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void * (GLAD_API_PTR *PFNGLMAPNAMEDBUFFERPROC)(GLuint buffer, GLenum access); +typedef void * (GLAD_API_PTR *PFNGLMAPNAMEDBUFFERRANGEPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (GLAD_API_PTR *PFNGLMEMORYBARRIERPROC)(GLbitfield barriers); +typedef void (GLAD_API_PTR *PFNGLMEMORYBARRIERBYREGIONPROC)(GLbitfield barriers); +typedef void (GLAD_API_PTR *PFNGLMINSAMPLESHADINGPROC)(GLfloat value); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSPROC)(GLenum mode, const GLint * first, const GLsizei * count, GLsizei drawcount); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSINDIRECTPROC)(GLenum mode, const void * indirect, GLsizei drawcount, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC)(GLenum mode, const void * indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSPROC)(GLenum mode, const GLsizei * count, GLenum type, const void *const* indices, GLsizei drawcount); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, const GLsizei * count, GLenum type, const void *const* indices, GLsizei drawcount, const GLint * basevertex); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSINDIRECTPROC)(GLenum mode, GLenum type, const void * indirect, GLsizei drawcount, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC)(GLenum mode, GLenum type, const void * indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERDATAPROC)(GLuint buffer, GLsizeiptr size, const void * data, GLenum usage); +typedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERSTORAGEPROC)(GLuint buffer, GLsizeiptr size, const void * data, GLbitfield flags); +typedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERSUBDATAPROC)(GLuint buffer, GLintptr offset, GLsizeiptr size, const void * data); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC)(GLuint framebuffer, GLenum buf); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC)(GLuint framebuffer, GLsizei n, const GLenum * bufs); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC)(GLuint framebuffer, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC)(GLuint framebuffer, GLenum src); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC)(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERTEXTUREPROC)(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC)(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAD_API_PTR *PFNGLNAMEDRENDERBUFFERSTORAGEPROC)(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei length, const GLchar * label); +typedef void (GLAD_API_PTR *PFNGLOBJECTPTRLABELPROC)(const void * ptr, GLsizei length, const GLchar * label); +typedef void (GLAD_API_PTR *PFNGLPATCHPARAMETERFVPROC)(GLenum pname, const GLfloat * values); +typedef void (GLAD_API_PTR *PFNGLPATCHPARAMETERIPROC)(GLenum pname, GLint value); +typedef void (GLAD_API_PTR *PFNGLPAUSETRANSFORMFEEDBACKPROC)(void); +typedef void (GLAD_API_PTR *PFNGLPIXELSTOREFPROC)(GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLPIXELSTOREIPROC)(GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFPROC)(GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFVPROC)(GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERIPROC)(GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERIVPROC)(GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLPOINTSIZEPROC)(GLfloat size); +typedef void (GLAD_API_PTR *PFNGLPOLYGONMODEPROC)(GLenum face, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETPROC)(GLfloat factor, GLfloat units); +typedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETCLAMPPROC)(GLfloat factor, GLfloat units, GLfloat clamp); +typedef void (GLAD_API_PTR *PFNGLPOPDEBUGGROUPPROC)(void); +typedef void (GLAD_API_PTR *PFNGLPRIMITIVERESTARTINDEXPROC)(GLuint index); +typedef void (GLAD_API_PTR *PFNGLPROGRAMBINARYPROC)(GLuint program, GLenum binaryFormat, const void * binary, GLsizei length); +typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERIPROC)(GLuint program, GLenum pname, GLint value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1DPROC)(GLuint program, GLint location, GLdouble v0); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1FPROC)(GLuint program, GLint location, GLfloat v0); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1IPROC)(GLuint program, GLint location, GLint v0); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1UIPROC)(GLuint program, GLint location, GLuint v0); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2IPROC)(GLuint program, GLint location, GLint v0, GLint v1); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3IPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4IPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROVOKINGVERTEXPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLPUSHDEBUGGROUPPROC)(GLenum source, GLuint id, GLsizei length, const GLchar * message); +typedef void (GLAD_API_PTR *PFNGLQUERYCOUNTERPROC)(GLuint id, GLenum target); +typedef void (GLAD_API_PTR *PFNGLREADBUFFERPROC)(GLenum src); +typedef void (GLAD_API_PTR *PFNGLREADPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void * pixels); +typedef void (GLAD_API_PTR *PFNGLREADNPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void * data); +typedef void (GLAD_API_PTR *PFNGLRELEASESHADERCOMPILERPROC)(void); +typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLRESUMETRANSFORMFEEDBACKPROC)(void); +typedef void (GLAD_API_PTR *PFNGLSAMPLECOVERAGEPROC)(GLfloat value, GLboolean invert); +typedef void (GLAD_API_PTR *PFNGLSAMPLEMASKIPROC)(GLuint maskNumber, GLbitfield mask); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIIVPROC)(GLuint sampler, GLenum pname, const GLint * param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIUIVPROC)(GLuint sampler, GLenum pname, const GLuint * param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERFPROC)(GLuint sampler, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, const GLfloat * param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIPROC)(GLuint sampler, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, const GLint * param); +typedef void (GLAD_API_PTR *PFNGLSCISSORPROC)(GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLSCISSORARRAYVPROC)(GLuint first, GLsizei count, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLSCISSORINDEXEDPROC)(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLSCISSORINDEXEDVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLSHADERBINARYPROC)(GLsizei count, const GLuint * shaders, GLenum binaryFormat, const void * binary, GLsizei length); +typedef void (GLAD_API_PTR *PFNGLSHADERSOURCEPROC)(GLuint shader, GLsizei count, const GLchar *const* string, const GLint * length); +typedef void (GLAD_API_PTR *PFNGLSHADERSTORAGEBLOCKBINDINGPROC)(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); +typedef void (GLAD_API_PTR *PFNGLSPECIALIZESHADERPROC)(GLuint shader, const GLchar * pEntryPoint, GLuint numSpecializationConstants, const GLuint * pConstantIndex, const GLuint * pConstantValue); +typedef void (GLAD_API_PTR *PFNGLSTENCILFUNCPROC)(GLenum func, GLint ref, GLuint mask); +typedef void (GLAD_API_PTR *PFNGLSTENCILFUNCSEPARATEPROC)(GLenum face, GLenum func, GLint ref, GLuint mask); +typedef void (GLAD_API_PTR *PFNGLSTENCILMASKPROC)(GLuint mask); +typedef void (GLAD_API_PTR *PFNGLSTENCILMASKSEPARATEPROC)(GLenum face, GLuint mask); +typedef void (GLAD_API_PTR *PFNGLSTENCILOPPROC)(GLenum fail, GLenum zfail, GLenum zpass); +typedef void (GLAD_API_PTR *PFNGLSTENCILOPSEPARATEPROC)(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (GLAD_API_PTR *PFNGLTEXBUFFERPROC)(GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLTEXBUFFERRANGEPROC)(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE1DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE2DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE2DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE3DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE3DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, const GLuint * params); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFPROC)(GLenum target, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIPROC)(GLenum target, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE1DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE2DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE2DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE3DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE3DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXTUREBARRIERPROC)(void); +typedef void (GLAD_API_PTR *PFNGLTEXTUREBUFFERPROC)(GLuint texture, GLenum internalformat, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLTEXTUREBUFFERRANGEPROC)(GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIIVPROC)(GLuint texture, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIUIVPROC)(GLuint texture, GLenum pname, const GLuint * params); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERFPROC)(GLuint texture, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERFVPROC)(GLuint texture, GLenum pname, const GLfloat * param); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIPROC)(GLuint texture, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIVPROC)(GLuint texture, GLenum pname, const GLint * param); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE1DPROC)(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE2DPROC)(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC)(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE3DPROC)(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC)(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXTURESUBIMAGE1DPROC)(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXTURESUBIMAGE2DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXTURESUBIMAGE3DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXTUREVIEWPROC)(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +typedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC)(GLuint xfb, GLuint index, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC)(GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKVARYINGSPROC)(GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1DPROC)(GLint location, GLdouble x); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1DVPROC)(GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1FPROC)(GLint location, GLfloat v0); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1FVPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1IPROC)(GLint location, GLint v0); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1IVPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1UIPROC)(GLint location, GLuint v0); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1UIVPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2DPROC)(GLint location, GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2DVPROC)(GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2FPROC)(GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2FVPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2IPROC)(GLint location, GLint v0, GLint v1); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2IVPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2UIPROC)(GLint location, GLuint v0, GLuint v1); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2UIVPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3DPROC)(GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3DVPROC)(GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3FVPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3IPROC)(GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3IVPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3UIVPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4DPROC)(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4DVPROC)(GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4FVPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4IPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4IVPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4UIVPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMBLOCKBINDINGPROC)(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X3DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X4DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X2DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X4DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X2DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X3DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMSUBROUTINESUIVPROC)(GLenum shadertype, GLsizei count, const GLuint * indices); +typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPBUFFERPROC)(GLenum target); +typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPNAMEDBUFFERPROC)(GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMPROC)(GLuint program); +typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMSTAGESPROC)(GLuint pipeline, GLbitfield stages, GLuint program); +typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMPROC)(GLuint program); +typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMPIPELINEPROC)(GLuint pipeline); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYATTRIBBINDINGPROC)(GLuint vaobj, GLuint attribindex, GLuint bindingindex); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYATTRIBFORMATPROC)(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYATTRIBIFORMATPROC)(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYATTRIBLFORMATPROC)(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYBINDINGDIVISORPROC)(GLuint vaobj, GLuint bindingindex, GLuint divisor); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYELEMENTBUFFERPROC)(GLuint vaobj, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXBUFFERPROC)(GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXBUFFERSPROC)(GLuint vaobj, GLuint first, GLsizei count, const GLuint * buffers, const GLintptr * offsets, const GLsizei * strides); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DPROC)(GLuint index, GLdouble x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FPROC)(GLuint index, GLfloat x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SPROC)(GLuint index, GLshort x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DPROC)(GLuint index, GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FPROC)(GLuint index, GLfloat x, GLfloat y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SPROC)(GLuint index, GLshort x, GLshort y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SPROC)(GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NBVPROC)(GLuint index, const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NIVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NSVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBVPROC)(GLuint index, const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUSVPROC)(GLuint index, const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4BVPROC)(GLuint index, const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4IVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBVPROC)(GLuint index, const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4USVPROC)(GLuint index, const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBBINDINGPROC)(GLuint attribindex, GLuint bindingindex); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBDIVISORPROC)(GLuint index, GLuint divisor); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBFORMATPROC)(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1IPROC)(GLuint index, GLint x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1IVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1UIPROC)(GLuint index, GLuint x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1UIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2IPROC)(GLuint index, GLint x, GLint y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2IVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2UIPROC)(GLuint index, GLuint x, GLuint y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2UIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3IPROC)(GLuint index, GLint x, GLint y, GLint z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3IVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3UIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4BVPROC)(GLuint index, const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4IPROC)(GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4IVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4SVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UBVPROC)(GLuint index, const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4USVPROC)(GLuint index, const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBIFORMATPROC)(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBIPOINTERPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL1DPROC)(GLuint index, GLdouble x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL1DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL2DPROC)(GLuint index, GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL2DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL3DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL4DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBLFORMATPROC)(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBLPOINTERPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP1UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP1UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP2UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP2UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP3UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP3UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP4UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP4UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVERTEXBINDINGDIVISORPROC)(GLuint bindingindex, GLuint divisor); +typedef void (GLAD_API_PTR *PFNGLVIEWPORTPROC)(GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLVIEWPORTARRAYVPROC)(GLuint first, GLsizei count, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVIEWPORTINDEXEDFPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (GLAD_API_PTR *PFNGLVIEWPORTINDEXEDFVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); + +GLAD_API_CALL PFNGLACTIVESHADERPROGRAMPROC glad_glActiveShaderProgram; +#define glActiveShaderProgram glad_glActiveShaderProgram +GLAD_API_CALL PFNGLACTIVETEXTUREPROC glad_glActiveTexture; +#define glActiveTexture glad_glActiveTexture +GLAD_API_CALL PFNGLATTACHSHADERPROC glad_glAttachShader; +#define glAttachShader glad_glAttachShader +GLAD_API_CALL PFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender; +#define glBeginConditionalRender glad_glBeginConditionalRender +GLAD_API_CALL PFNGLBEGINQUERYPROC glad_glBeginQuery; +#define glBeginQuery glad_glBeginQuery +GLAD_API_CALL PFNGLBEGINQUERYINDEXEDPROC glad_glBeginQueryIndexed; +#define glBeginQueryIndexed glad_glBeginQueryIndexed +GLAD_API_CALL PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback; +#define glBeginTransformFeedback glad_glBeginTransformFeedback +GLAD_API_CALL PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation; +#define glBindAttribLocation glad_glBindAttribLocation +GLAD_API_CALL PFNGLBINDBUFFERPROC glad_glBindBuffer; +#define glBindBuffer glad_glBindBuffer +GLAD_API_CALL PFNGLBINDBUFFERBASEPROC glad_glBindBufferBase; +#define glBindBufferBase glad_glBindBufferBase +GLAD_API_CALL PFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange; +#define glBindBufferRange glad_glBindBufferRange +GLAD_API_CALL PFNGLBINDBUFFERSBASEPROC glad_glBindBuffersBase; +#define glBindBuffersBase glad_glBindBuffersBase +GLAD_API_CALL PFNGLBINDBUFFERSRANGEPROC glad_glBindBuffersRange; +#define glBindBuffersRange glad_glBindBuffersRange +GLAD_API_CALL PFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation; +#define glBindFragDataLocation glad_glBindFragDataLocation +GLAD_API_CALL PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glad_glBindFragDataLocationIndexed; +#define glBindFragDataLocationIndexed glad_glBindFragDataLocationIndexed +GLAD_API_CALL PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer; +#define glBindFramebuffer glad_glBindFramebuffer +GLAD_API_CALL PFNGLBINDIMAGETEXTUREPROC glad_glBindImageTexture; +#define glBindImageTexture glad_glBindImageTexture +GLAD_API_CALL PFNGLBINDIMAGETEXTURESPROC glad_glBindImageTextures; +#define glBindImageTextures glad_glBindImageTextures +GLAD_API_CALL PFNGLBINDPROGRAMPIPELINEPROC glad_glBindProgramPipeline; +#define glBindProgramPipeline glad_glBindProgramPipeline +GLAD_API_CALL PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer; +#define glBindRenderbuffer glad_glBindRenderbuffer +GLAD_API_CALL PFNGLBINDSAMPLERPROC glad_glBindSampler; +#define glBindSampler glad_glBindSampler +GLAD_API_CALL PFNGLBINDSAMPLERSPROC glad_glBindSamplers; +#define glBindSamplers glad_glBindSamplers +GLAD_API_CALL PFNGLBINDTEXTUREPROC glad_glBindTexture; +#define glBindTexture glad_glBindTexture +GLAD_API_CALL PFNGLBINDTEXTUREUNITPROC glad_glBindTextureUnit; +#define glBindTextureUnit glad_glBindTextureUnit +GLAD_API_CALL PFNGLBINDTEXTURESPROC glad_glBindTextures; +#define glBindTextures glad_glBindTextures +GLAD_API_CALL PFNGLBINDTRANSFORMFEEDBACKPROC glad_glBindTransformFeedback; +#define glBindTransformFeedback glad_glBindTransformFeedback +GLAD_API_CALL PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray; +#define glBindVertexArray glad_glBindVertexArray +GLAD_API_CALL PFNGLBINDVERTEXBUFFERPROC glad_glBindVertexBuffer; +#define glBindVertexBuffer glad_glBindVertexBuffer +GLAD_API_CALL PFNGLBINDVERTEXBUFFERSPROC glad_glBindVertexBuffers; +#define glBindVertexBuffers glad_glBindVertexBuffers +GLAD_API_CALL PFNGLBLENDCOLORPROC glad_glBlendColor; +#define glBlendColor glad_glBlendColor +GLAD_API_CALL PFNGLBLENDEQUATIONPROC glad_glBlendEquation; +#define glBlendEquation glad_glBlendEquation +GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate; +#define glBlendEquationSeparate glad_glBlendEquationSeparate +GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEIPROC glad_glBlendEquationSeparatei; +#define glBlendEquationSeparatei glad_glBlendEquationSeparatei +GLAD_API_CALL PFNGLBLENDEQUATIONIPROC glad_glBlendEquationi; +#define glBlendEquationi glad_glBlendEquationi +GLAD_API_CALL PFNGLBLENDFUNCPROC glad_glBlendFunc; +#define glBlendFunc glad_glBlendFunc +GLAD_API_CALL PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate; +#define glBlendFuncSeparate glad_glBlendFuncSeparate +GLAD_API_CALL PFNGLBLENDFUNCSEPARATEIPROC glad_glBlendFuncSeparatei; +#define glBlendFuncSeparatei glad_glBlendFuncSeparatei +GLAD_API_CALL PFNGLBLENDFUNCIPROC glad_glBlendFunci; +#define glBlendFunci glad_glBlendFunci +GLAD_API_CALL PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer; +#define glBlitFramebuffer glad_glBlitFramebuffer +GLAD_API_CALL PFNGLBLITNAMEDFRAMEBUFFERPROC glad_glBlitNamedFramebuffer; +#define glBlitNamedFramebuffer glad_glBlitNamedFramebuffer +GLAD_API_CALL PFNGLBUFFERDATAPROC glad_glBufferData; +#define glBufferData glad_glBufferData +GLAD_API_CALL PFNGLBUFFERSTORAGEPROC glad_glBufferStorage; +#define glBufferStorage glad_glBufferStorage +GLAD_API_CALL PFNGLBUFFERSUBDATAPROC glad_glBufferSubData; +#define glBufferSubData glad_glBufferSubData +GLAD_API_CALL PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus; +#define glCheckFramebufferStatus glad_glCheckFramebufferStatus +GLAD_API_CALL PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC glad_glCheckNamedFramebufferStatus; +#define glCheckNamedFramebufferStatus glad_glCheckNamedFramebufferStatus +GLAD_API_CALL PFNGLCLAMPCOLORPROC glad_glClampColor; +#define glClampColor glad_glClampColor +GLAD_API_CALL PFNGLCLEARPROC glad_glClear; +#define glClear glad_glClear +GLAD_API_CALL PFNGLCLEARBUFFERDATAPROC glad_glClearBufferData; +#define glClearBufferData glad_glClearBufferData +GLAD_API_CALL PFNGLCLEARBUFFERSUBDATAPROC glad_glClearBufferSubData; +#define glClearBufferSubData glad_glClearBufferSubData +GLAD_API_CALL PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi; +#define glClearBufferfi glad_glClearBufferfi +GLAD_API_CALL PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv; +#define glClearBufferfv glad_glClearBufferfv +GLAD_API_CALL PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv; +#define glClearBufferiv glad_glClearBufferiv +GLAD_API_CALL PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv; +#define glClearBufferuiv glad_glClearBufferuiv +GLAD_API_CALL PFNGLCLEARCOLORPROC glad_glClearColor; +#define glClearColor glad_glClearColor +GLAD_API_CALL PFNGLCLEARDEPTHPROC glad_glClearDepth; +#define glClearDepth glad_glClearDepth +GLAD_API_CALL PFNGLCLEARDEPTHFPROC glad_glClearDepthf; +#define glClearDepthf glad_glClearDepthf +GLAD_API_CALL PFNGLCLEARNAMEDBUFFERDATAPROC glad_glClearNamedBufferData; +#define glClearNamedBufferData glad_glClearNamedBufferData +GLAD_API_CALL PFNGLCLEARNAMEDBUFFERSUBDATAPROC glad_glClearNamedBufferSubData; +#define glClearNamedBufferSubData glad_glClearNamedBufferSubData +GLAD_API_CALL PFNGLCLEARNAMEDFRAMEBUFFERFIPROC glad_glClearNamedFramebufferfi; +#define glClearNamedFramebufferfi glad_glClearNamedFramebufferfi +GLAD_API_CALL PFNGLCLEARNAMEDFRAMEBUFFERFVPROC glad_glClearNamedFramebufferfv; +#define glClearNamedFramebufferfv glad_glClearNamedFramebufferfv +GLAD_API_CALL PFNGLCLEARNAMEDFRAMEBUFFERIVPROC glad_glClearNamedFramebufferiv; +#define glClearNamedFramebufferiv glad_glClearNamedFramebufferiv +GLAD_API_CALL PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC glad_glClearNamedFramebufferuiv; +#define glClearNamedFramebufferuiv glad_glClearNamedFramebufferuiv +GLAD_API_CALL PFNGLCLEARSTENCILPROC glad_glClearStencil; +#define glClearStencil glad_glClearStencil +GLAD_API_CALL PFNGLCLEARTEXIMAGEPROC glad_glClearTexImage; +#define glClearTexImage glad_glClearTexImage +GLAD_API_CALL PFNGLCLEARTEXSUBIMAGEPROC glad_glClearTexSubImage; +#define glClearTexSubImage glad_glClearTexSubImage +GLAD_API_CALL PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync; +#define glClientWaitSync glad_glClientWaitSync +GLAD_API_CALL PFNGLCLIPCONTROLPROC glad_glClipControl; +#define glClipControl glad_glClipControl +GLAD_API_CALL PFNGLCOLORMASKPROC glad_glColorMask; +#define glColorMask glad_glColorMask +GLAD_API_CALL PFNGLCOLORMASKIPROC glad_glColorMaski; +#define glColorMaski glad_glColorMaski +GLAD_API_CALL PFNGLCOMPILESHADERPROC glad_glCompileShader; +#define glCompileShader glad_glCompileShader +GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE1DPROC glad_glCompressedTexImage1D; +#define glCompressedTexImage1D glad_glCompressedTexImage1D +GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D; +#define glCompressedTexImage2D glad_glCompressedTexImage2D +GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE3DPROC glad_glCompressedTexImage3D; +#define glCompressedTexImage3D glad_glCompressedTexImage3D +GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glad_glCompressedTexSubImage1D; +#define glCompressedTexSubImage1D glad_glCompressedTexSubImage1D +GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D; +#define glCompressedTexSubImage2D glad_glCompressedTexSubImage2D +GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D; +#define glCompressedTexSubImage3D glad_glCompressedTexSubImage3D +GLAD_API_CALL PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC glad_glCompressedTextureSubImage1D; +#define glCompressedTextureSubImage1D glad_glCompressedTextureSubImage1D +GLAD_API_CALL PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC glad_glCompressedTextureSubImage2D; +#define glCompressedTextureSubImage2D glad_glCompressedTextureSubImage2D +GLAD_API_CALL PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC glad_glCompressedTextureSubImage3D; +#define glCompressedTextureSubImage3D glad_glCompressedTextureSubImage3D +GLAD_API_CALL PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData; +#define glCopyBufferSubData glad_glCopyBufferSubData +GLAD_API_CALL PFNGLCOPYIMAGESUBDATAPROC glad_glCopyImageSubData; +#define glCopyImageSubData glad_glCopyImageSubData +GLAD_API_CALL PFNGLCOPYNAMEDBUFFERSUBDATAPROC glad_glCopyNamedBufferSubData; +#define glCopyNamedBufferSubData glad_glCopyNamedBufferSubData +GLAD_API_CALL PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D; +#define glCopyTexImage1D glad_glCopyTexImage1D +GLAD_API_CALL PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D; +#define glCopyTexImage2D glad_glCopyTexImage2D +GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D; +#define glCopyTexSubImage1D glad_glCopyTexSubImage1D +GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D; +#define glCopyTexSubImage2D glad_glCopyTexSubImage2D +GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D; +#define glCopyTexSubImage3D glad_glCopyTexSubImage3D +GLAD_API_CALL PFNGLCOPYTEXTURESUBIMAGE1DPROC glad_glCopyTextureSubImage1D; +#define glCopyTextureSubImage1D glad_glCopyTextureSubImage1D +GLAD_API_CALL PFNGLCOPYTEXTURESUBIMAGE2DPROC glad_glCopyTextureSubImage2D; +#define glCopyTextureSubImage2D glad_glCopyTextureSubImage2D +GLAD_API_CALL PFNGLCOPYTEXTURESUBIMAGE3DPROC glad_glCopyTextureSubImage3D; +#define glCopyTextureSubImage3D glad_glCopyTextureSubImage3D +GLAD_API_CALL PFNGLCREATEBUFFERSPROC glad_glCreateBuffers; +#define glCreateBuffers glad_glCreateBuffers +GLAD_API_CALL PFNGLCREATEFRAMEBUFFERSPROC glad_glCreateFramebuffers; +#define glCreateFramebuffers glad_glCreateFramebuffers +GLAD_API_CALL PFNGLCREATEPROGRAMPROC glad_glCreateProgram; +#define glCreateProgram glad_glCreateProgram +GLAD_API_CALL PFNGLCREATEPROGRAMPIPELINESPROC glad_glCreateProgramPipelines; +#define glCreateProgramPipelines glad_glCreateProgramPipelines +GLAD_API_CALL PFNGLCREATEQUERIESPROC glad_glCreateQueries; +#define glCreateQueries glad_glCreateQueries +GLAD_API_CALL PFNGLCREATERENDERBUFFERSPROC glad_glCreateRenderbuffers; +#define glCreateRenderbuffers glad_glCreateRenderbuffers +GLAD_API_CALL PFNGLCREATESAMPLERSPROC glad_glCreateSamplers; +#define glCreateSamplers glad_glCreateSamplers +GLAD_API_CALL PFNGLCREATESHADERPROC glad_glCreateShader; +#define glCreateShader glad_glCreateShader +GLAD_API_CALL PFNGLCREATESHADERPROGRAMVPROC glad_glCreateShaderProgramv; +#define glCreateShaderProgramv glad_glCreateShaderProgramv +GLAD_API_CALL PFNGLCREATETEXTURESPROC glad_glCreateTextures; +#define glCreateTextures glad_glCreateTextures +GLAD_API_CALL PFNGLCREATETRANSFORMFEEDBACKSPROC glad_glCreateTransformFeedbacks; +#define glCreateTransformFeedbacks glad_glCreateTransformFeedbacks +GLAD_API_CALL PFNGLCREATEVERTEXARRAYSPROC glad_glCreateVertexArrays; +#define glCreateVertexArrays glad_glCreateVertexArrays +GLAD_API_CALL PFNGLCULLFACEPROC glad_glCullFace; +#define glCullFace glad_glCullFace +GLAD_API_CALL PFNGLDEBUGMESSAGECALLBACKPROC glad_glDebugMessageCallback; +#define glDebugMessageCallback glad_glDebugMessageCallback +GLAD_API_CALL PFNGLDEBUGMESSAGECONTROLPROC glad_glDebugMessageControl; +#define glDebugMessageControl glad_glDebugMessageControl +GLAD_API_CALL PFNGLDEBUGMESSAGEINSERTPROC glad_glDebugMessageInsert; +#define glDebugMessageInsert glad_glDebugMessageInsert +GLAD_API_CALL PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers; +#define glDeleteBuffers glad_glDeleteBuffers +GLAD_API_CALL PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers; +#define glDeleteFramebuffers glad_glDeleteFramebuffers +GLAD_API_CALL PFNGLDELETEPROGRAMPROC glad_glDeleteProgram; +#define glDeleteProgram glad_glDeleteProgram +GLAD_API_CALL PFNGLDELETEPROGRAMPIPELINESPROC glad_glDeleteProgramPipelines; +#define glDeleteProgramPipelines glad_glDeleteProgramPipelines +GLAD_API_CALL PFNGLDELETEQUERIESPROC glad_glDeleteQueries; +#define glDeleteQueries glad_glDeleteQueries +GLAD_API_CALL PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers; +#define glDeleteRenderbuffers glad_glDeleteRenderbuffers +GLAD_API_CALL PFNGLDELETESAMPLERSPROC glad_glDeleteSamplers; +#define glDeleteSamplers glad_glDeleteSamplers +GLAD_API_CALL PFNGLDELETESHADERPROC glad_glDeleteShader; +#define glDeleteShader glad_glDeleteShader +GLAD_API_CALL PFNGLDELETESYNCPROC glad_glDeleteSync; +#define glDeleteSync glad_glDeleteSync +GLAD_API_CALL PFNGLDELETETEXTURESPROC glad_glDeleteTextures; +#define glDeleteTextures glad_glDeleteTextures +GLAD_API_CALL PFNGLDELETETRANSFORMFEEDBACKSPROC glad_glDeleteTransformFeedbacks; +#define glDeleteTransformFeedbacks glad_glDeleteTransformFeedbacks +GLAD_API_CALL PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays; +#define glDeleteVertexArrays glad_glDeleteVertexArrays +GLAD_API_CALL PFNGLDEPTHFUNCPROC glad_glDepthFunc; +#define glDepthFunc glad_glDepthFunc +GLAD_API_CALL PFNGLDEPTHMASKPROC glad_glDepthMask; +#define glDepthMask glad_glDepthMask +GLAD_API_CALL PFNGLDEPTHRANGEPROC glad_glDepthRange; +#define glDepthRange glad_glDepthRange +GLAD_API_CALL PFNGLDEPTHRANGEARRAYVPROC glad_glDepthRangeArrayv; +#define glDepthRangeArrayv glad_glDepthRangeArrayv +GLAD_API_CALL PFNGLDEPTHRANGEINDEXEDPROC glad_glDepthRangeIndexed; +#define glDepthRangeIndexed glad_glDepthRangeIndexed +GLAD_API_CALL PFNGLDEPTHRANGEFPROC glad_glDepthRangef; +#define glDepthRangef glad_glDepthRangef +GLAD_API_CALL PFNGLDETACHSHADERPROC glad_glDetachShader; +#define glDetachShader glad_glDetachShader +GLAD_API_CALL PFNGLDISABLEPROC glad_glDisable; +#define glDisable glad_glDisable +GLAD_API_CALL PFNGLDISABLEVERTEXARRAYATTRIBPROC glad_glDisableVertexArrayAttrib; +#define glDisableVertexArrayAttrib glad_glDisableVertexArrayAttrib +GLAD_API_CALL PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray; +#define glDisableVertexAttribArray glad_glDisableVertexAttribArray +GLAD_API_CALL PFNGLDISABLEIPROC glad_glDisablei; +#define glDisablei glad_glDisablei +GLAD_API_CALL PFNGLDISPATCHCOMPUTEPROC glad_glDispatchCompute; +#define glDispatchCompute glad_glDispatchCompute +GLAD_API_CALL PFNGLDISPATCHCOMPUTEINDIRECTPROC glad_glDispatchComputeIndirect; +#define glDispatchComputeIndirect glad_glDispatchComputeIndirect +GLAD_API_CALL PFNGLDRAWARRAYSPROC glad_glDrawArrays; +#define glDrawArrays glad_glDrawArrays +GLAD_API_CALL PFNGLDRAWARRAYSINDIRECTPROC glad_glDrawArraysIndirect; +#define glDrawArraysIndirect glad_glDrawArraysIndirect +GLAD_API_CALL PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced; +#define glDrawArraysInstanced glad_glDrawArraysInstanced +GLAD_API_CALL PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC glad_glDrawArraysInstancedBaseInstance; +#define glDrawArraysInstancedBaseInstance glad_glDrawArraysInstancedBaseInstance +GLAD_API_CALL PFNGLDRAWBUFFERPROC glad_glDrawBuffer; +#define glDrawBuffer glad_glDrawBuffer +GLAD_API_CALL PFNGLDRAWBUFFERSPROC glad_glDrawBuffers; +#define glDrawBuffers glad_glDrawBuffers +GLAD_API_CALL PFNGLDRAWELEMENTSPROC glad_glDrawElements; +#define glDrawElements glad_glDrawElements +GLAD_API_CALL PFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex; +#define glDrawElementsBaseVertex glad_glDrawElementsBaseVertex +GLAD_API_CALL PFNGLDRAWELEMENTSINDIRECTPROC glad_glDrawElementsIndirect; +#define glDrawElementsIndirect glad_glDrawElementsIndirect +GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced; +#define glDrawElementsInstanced glad_glDrawElementsInstanced +GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC glad_glDrawElementsInstancedBaseInstance; +#define glDrawElementsInstancedBaseInstance glad_glDrawElementsInstancedBaseInstance +GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex; +#define glDrawElementsInstancedBaseVertex glad_glDrawElementsInstancedBaseVertex +GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC glad_glDrawElementsInstancedBaseVertexBaseInstance; +#define glDrawElementsInstancedBaseVertexBaseInstance glad_glDrawElementsInstancedBaseVertexBaseInstance +GLAD_API_CALL PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements; +#define glDrawRangeElements glad_glDrawRangeElements +GLAD_API_CALL PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex; +#define glDrawRangeElementsBaseVertex glad_glDrawRangeElementsBaseVertex +GLAD_API_CALL PFNGLDRAWTRANSFORMFEEDBACKPROC glad_glDrawTransformFeedback; +#define glDrawTransformFeedback glad_glDrawTransformFeedback +GLAD_API_CALL PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC glad_glDrawTransformFeedbackInstanced; +#define glDrawTransformFeedbackInstanced glad_glDrawTransformFeedbackInstanced +GLAD_API_CALL PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC glad_glDrawTransformFeedbackStream; +#define glDrawTransformFeedbackStream glad_glDrawTransformFeedbackStream +GLAD_API_CALL PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC glad_glDrawTransformFeedbackStreamInstanced; +#define glDrawTransformFeedbackStreamInstanced glad_glDrawTransformFeedbackStreamInstanced +GLAD_API_CALL PFNGLENABLEPROC glad_glEnable; +#define glEnable glad_glEnable +GLAD_API_CALL PFNGLENABLEVERTEXARRAYATTRIBPROC glad_glEnableVertexArrayAttrib; +#define glEnableVertexArrayAttrib glad_glEnableVertexArrayAttrib +GLAD_API_CALL PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray; +#define glEnableVertexAttribArray glad_glEnableVertexAttribArray +GLAD_API_CALL PFNGLENABLEIPROC glad_glEnablei; +#define glEnablei glad_glEnablei +GLAD_API_CALL PFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender; +#define glEndConditionalRender glad_glEndConditionalRender +GLAD_API_CALL PFNGLENDQUERYPROC glad_glEndQuery; +#define glEndQuery glad_glEndQuery +GLAD_API_CALL PFNGLENDQUERYINDEXEDPROC glad_glEndQueryIndexed; +#define glEndQueryIndexed glad_glEndQueryIndexed +GLAD_API_CALL PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback; +#define glEndTransformFeedback glad_glEndTransformFeedback +GLAD_API_CALL PFNGLFENCESYNCPROC glad_glFenceSync; +#define glFenceSync glad_glFenceSync +GLAD_API_CALL PFNGLFINISHPROC glad_glFinish; +#define glFinish glad_glFinish +GLAD_API_CALL PFNGLFLUSHPROC glad_glFlush; +#define glFlush glad_glFlush +GLAD_API_CALL PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange; +#define glFlushMappedBufferRange glad_glFlushMappedBufferRange +GLAD_API_CALL PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC glad_glFlushMappedNamedBufferRange; +#define glFlushMappedNamedBufferRange glad_glFlushMappedNamedBufferRange +GLAD_API_CALL PFNGLFRAMEBUFFERPARAMETERIPROC glad_glFramebufferParameteri; +#define glFramebufferParameteri glad_glFramebufferParameteri +GLAD_API_CALL PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer; +#define glFramebufferRenderbuffer glad_glFramebufferRenderbuffer +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture; +#define glFramebufferTexture glad_glFramebufferTexture +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D; +#define glFramebufferTexture1D glad_glFramebufferTexture1D +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D; +#define glFramebufferTexture2D glad_glFramebufferTexture2D +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D; +#define glFramebufferTexture3D glad_glFramebufferTexture3D +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer; +#define glFramebufferTextureLayer glad_glFramebufferTextureLayer +GLAD_API_CALL PFNGLFRONTFACEPROC glad_glFrontFace; +#define glFrontFace glad_glFrontFace +GLAD_API_CALL PFNGLGENBUFFERSPROC glad_glGenBuffers; +#define glGenBuffers glad_glGenBuffers +GLAD_API_CALL PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers; +#define glGenFramebuffers glad_glGenFramebuffers +GLAD_API_CALL PFNGLGENPROGRAMPIPELINESPROC glad_glGenProgramPipelines; +#define glGenProgramPipelines glad_glGenProgramPipelines +GLAD_API_CALL PFNGLGENQUERIESPROC glad_glGenQueries; +#define glGenQueries glad_glGenQueries +GLAD_API_CALL PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers; +#define glGenRenderbuffers glad_glGenRenderbuffers +GLAD_API_CALL PFNGLGENSAMPLERSPROC glad_glGenSamplers; +#define glGenSamplers glad_glGenSamplers +GLAD_API_CALL PFNGLGENTEXTURESPROC glad_glGenTextures; +#define glGenTextures glad_glGenTextures +GLAD_API_CALL PFNGLGENTRANSFORMFEEDBACKSPROC glad_glGenTransformFeedbacks; +#define glGenTransformFeedbacks glad_glGenTransformFeedbacks +GLAD_API_CALL PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays; +#define glGenVertexArrays glad_glGenVertexArrays +GLAD_API_CALL PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap; +#define glGenerateMipmap glad_glGenerateMipmap +GLAD_API_CALL PFNGLGENERATETEXTUREMIPMAPPROC glad_glGenerateTextureMipmap; +#define glGenerateTextureMipmap glad_glGenerateTextureMipmap +GLAD_API_CALL PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC glad_glGetActiveAtomicCounterBufferiv; +#define glGetActiveAtomicCounterBufferiv glad_glGetActiveAtomicCounterBufferiv +GLAD_API_CALL PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib; +#define glGetActiveAttrib glad_glGetActiveAttrib +GLAD_API_CALL PFNGLGETACTIVESUBROUTINENAMEPROC glad_glGetActiveSubroutineName; +#define glGetActiveSubroutineName glad_glGetActiveSubroutineName +GLAD_API_CALL PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC glad_glGetActiveSubroutineUniformName; +#define glGetActiveSubroutineUniformName glad_glGetActiveSubroutineUniformName +GLAD_API_CALL PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC glad_glGetActiveSubroutineUniformiv; +#define glGetActiveSubroutineUniformiv glad_glGetActiveSubroutineUniformiv +GLAD_API_CALL PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform; +#define glGetActiveUniform glad_glGetActiveUniform +GLAD_API_CALL PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName; +#define glGetActiveUniformBlockName glad_glGetActiveUniformBlockName +GLAD_API_CALL PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv; +#define glGetActiveUniformBlockiv glad_glGetActiveUniformBlockiv +GLAD_API_CALL PFNGLGETACTIVEUNIFORMNAMEPROC glad_glGetActiveUniformName; +#define glGetActiveUniformName glad_glGetActiveUniformName +GLAD_API_CALL PFNGLGETACTIVEUNIFORMSIVPROC glad_glGetActiveUniformsiv; +#define glGetActiveUniformsiv glad_glGetActiveUniformsiv +GLAD_API_CALL PFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders; +#define glGetAttachedShaders glad_glGetAttachedShaders +GLAD_API_CALL PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation; +#define glGetAttribLocation glad_glGetAttribLocation +GLAD_API_CALL PFNGLGETBOOLEANI_VPROC glad_glGetBooleani_v; +#define glGetBooleani_v glad_glGetBooleani_v +GLAD_API_CALL PFNGLGETBOOLEANVPROC glad_glGetBooleanv; +#define glGetBooleanv glad_glGetBooleanv +GLAD_API_CALL PFNGLGETBUFFERPARAMETERI64VPROC glad_glGetBufferParameteri64v; +#define glGetBufferParameteri64v glad_glGetBufferParameteri64v +GLAD_API_CALL PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv; +#define glGetBufferParameteriv glad_glGetBufferParameteriv +GLAD_API_CALL PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv; +#define glGetBufferPointerv glad_glGetBufferPointerv +GLAD_API_CALL PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData; +#define glGetBufferSubData glad_glGetBufferSubData +GLAD_API_CALL PFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage; +#define glGetCompressedTexImage glad_glGetCompressedTexImage +GLAD_API_CALL PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC glad_glGetCompressedTextureImage; +#define glGetCompressedTextureImage glad_glGetCompressedTextureImage +GLAD_API_CALL PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC glad_glGetCompressedTextureSubImage; +#define glGetCompressedTextureSubImage glad_glGetCompressedTextureSubImage +GLAD_API_CALL PFNGLGETDEBUGMESSAGELOGPROC glad_glGetDebugMessageLog; +#define glGetDebugMessageLog glad_glGetDebugMessageLog +GLAD_API_CALL PFNGLGETDOUBLEI_VPROC glad_glGetDoublei_v; +#define glGetDoublei_v glad_glGetDoublei_v +GLAD_API_CALL PFNGLGETDOUBLEVPROC glad_glGetDoublev; +#define glGetDoublev glad_glGetDoublev +GLAD_API_CALL PFNGLGETERRORPROC glad_glGetError; +#define glGetError glad_glGetError +GLAD_API_CALL PFNGLGETFLOATI_VPROC glad_glGetFloati_v; +#define glGetFloati_v glad_glGetFloati_v +GLAD_API_CALL PFNGLGETFLOATVPROC glad_glGetFloatv; +#define glGetFloatv glad_glGetFloatv +GLAD_API_CALL PFNGLGETFRAGDATAINDEXPROC glad_glGetFragDataIndex; +#define glGetFragDataIndex glad_glGetFragDataIndex +GLAD_API_CALL PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation; +#define glGetFragDataLocation glad_glGetFragDataLocation +GLAD_API_CALL PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv; +#define glGetFramebufferAttachmentParameteriv glad_glGetFramebufferAttachmentParameteriv +GLAD_API_CALL PFNGLGETFRAMEBUFFERPARAMETERIVPROC glad_glGetFramebufferParameteriv; +#define glGetFramebufferParameteriv glad_glGetFramebufferParameteriv +GLAD_API_CALL PFNGLGETGRAPHICSRESETSTATUSPROC glad_glGetGraphicsResetStatus; +#define glGetGraphicsResetStatus glad_glGetGraphicsResetStatus +GLAD_API_CALL PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v; +#define glGetInteger64i_v glad_glGetInteger64i_v +GLAD_API_CALL PFNGLGETINTEGER64VPROC glad_glGetInteger64v; +#define glGetInteger64v glad_glGetInteger64v +GLAD_API_CALL PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v; +#define glGetIntegeri_v glad_glGetIntegeri_v +GLAD_API_CALL PFNGLGETINTEGERVPROC glad_glGetIntegerv; +#define glGetIntegerv glad_glGetIntegerv +GLAD_API_CALL PFNGLGETINTERNALFORMATI64VPROC glad_glGetInternalformati64v; +#define glGetInternalformati64v glad_glGetInternalformati64v +GLAD_API_CALL PFNGLGETINTERNALFORMATIVPROC glad_glGetInternalformativ; +#define glGetInternalformativ glad_glGetInternalformativ +GLAD_API_CALL PFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv; +#define glGetMultisamplefv glad_glGetMultisamplefv +GLAD_API_CALL PFNGLGETNAMEDBUFFERPARAMETERI64VPROC glad_glGetNamedBufferParameteri64v; +#define glGetNamedBufferParameteri64v glad_glGetNamedBufferParameteri64v +GLAD_API_CALL PFNGLGETNAMEDBUFFERPARAMETERIVPROC glad_glGetNamedBufferParameteriv; +#define glGetNamedBufferParameteriv glad_glGetNamedBufferParameteriv +GLAD_API_CALL PFNGLGETNAMEDBUFFERPOINTERVPROC glad_glGetNamedBufferPointerv; +#define glGetNamedBufferPointerv glad_glGetNamedBufferPointerv +GLAD_API_CALL PFNGLGETNAMEDBUFFERSUBDATAPROC glad_glGetNamedBufferSubData; +#define glGetNamedBufferSubData glad_glGetNamedBufferSubData +GLAD_API_CALL PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetNamedFramebufferAttachmentParameteriv; +#define glGetNamedFramebufferAttachmentParameteriv glad_glGetNamedFramebufferAttachmentParameteriv +GLAD_API_CALL PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC glad_glGetNamedFramebufferParameteriv; +#define glGetNamedFramebufferParameteriv glad_glGetNamedFramebufferParameteriv +GLAD_API_CALL PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC glad_glGetNamedRenderbufferParameteriv; +#define glGetNamedRenderbufferParameteriv glad_glGetNamedRenderbufferParameteriv +GLAD_API_CALL PFNGLGETOBJECTLABELPROC glad_glGetObjectLabel; +#define glGetObjectLabel glad_glGetObjectLabel +GLAD_API_CALL PFNGLGETOBJECTPTRLABELPROC glad_glGetObjectPtrLabel; +#define glGetObjectPtrLabel glad_glGetObjectPtrLabel +GLAD_API_CALL PFNGLGETPOINTERVPROC glad_glGetPointerv; +#define glGetPointerv glad_glGetPointerv +GLAD_API_CALL PFNGLGETPROGRAMBINARYPROC glad_glGetProgramBinary; +#define glGetProgramBinary glad_glGetProgramBinary +GLAD_API_CALL PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog; +#define glGetProgramInfoLog glad_glGetProgramInfoLog +GLAD_API_CALL PFNGLGETPROGRAMINTERFACEIVPROC glad_glGetProgramInterfaceiv; +#define glGetProgramInterfaceiv glad_glGetProgramInterfaceiv +GLAD_API_CALL PFNGLGETPROGRAMPIPELINEINFOLOGPROC glad_glGetProgramPipelineInfoLog; +#define glGetProgramPipelineInfoLog glad_glGetProgramPipelineInfoLog +GLAD_API_CALL PFNGLGETPROGRAMPIPELINEIVPROC glad_glGetProgramPipelineiv; +#define glGetProgramPipelineiv glad_glGetProgramPipelineiv +GLAD_API_CALL PFNGLGETPROGRAMRESOURCEINDEXPROC glad_glGetProgramResourceIndex; +#define glGetProgramResourceIndex glad_glGetProgramResourceIndex +GLAD_API_CALL PFNGLGETPROGRAMRESOURCELOCATIONPROC glad_glGetProgramResourceLocation; +#define glGetProgramResourceLocation glad_glGetProgramResourceLocation +GLAD_API_CALL PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC glad_glGetProgramResourceLocationIndex; +#define glGetProgramResourceLocationIndex glad_glGetProgramResourceLocationIndex +GLAD_API_CALL PFNGLGETPROGRAMRESOURCENAMEPROC glad_glGetProgramResourceName; +#define glGetProgramResourceName glad_glGetProgramResourceName +GLAD_API_CALL PFNGLGETPROGRAMRESOURCEIVPROC glad_glGetProgramResourceiv; +#define glGetProgramResourceiv glad_glGetProgramResourceiv +GLAD_API_CALL PFNGLGETPROGRAMSTAGEIVPROC glad_glGetProgramStageiv; +#define glGetProgramStageiv glad_glGetProgramStageiv +GLAD_API_CALL PFNGLGETPROGRAMIVPROC glad_glGetProgramiv; +#define glGetProgramiv glad_glGetProgramiv +GLAD_API_CALL PFNGLGETQUERYBUFFEROBJECTI64VPROC glad_glGetQueryBufferObjecti64v; +#define glGetQueryBufferObjecti64v glad_glGetQueryBufferObjecti64v +GLAD_API_CALL PFNGLGETQUERYBUFFEROBJECTIVPROC glad_glGetQueryBufferObjectiv; +#define glGetQueryBufferObjectiv glad_glGetQueryBufferObjectiv +GLAD_API_CALL PFNGLGETQUERYBUFFEROBJECTUI64VPROC glad_glGetQueryBufferObjectui64v; +#define glGetQueryBufferObjectui64v glad_glGetQueryBufferObjectui64v +GLAD_API_CALL PFNGLGETQUERYBUFFEROBJECTUIVPROC glad_glGetQueryBufferObjectuiv; +#define glGetQueryBufferObjectuiv glad_glGetQueryBufferObjectuiv +GLAD_API_CALL PFNGLGETQUERYINDEXEDIVPROC glad_glGetQueryIndexediv; +#define glGetQueryIndexediv glad_glGetQueryIndexediv +GLAD_API_CALL PFNGLGETQUERYOBJECTI64VPROC glad_glGetQueryObjecti64v; +#define glGetQueryObjecti64v glad_glGetQueryObjecti64v +GLAD_API_CALL PFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv; +#define glGetQueryObjectiv glad_glGetQueryObjectiv +GLAD_API_CALL PFNGLGETQUERYOBJECTUI64VPROC glad_glGetQueryObjectui64v; +#define glGetQueryObjectui64v glad_glGetQueryObjectui64v +GLAD_API_CALL PFNGLGETQUERYOBJECTUIVPROC glad_glGetQueryObjectuiv; +#define glGetQueryObjectuiv glad_glGetQueryObjectuiv +GLAD_API_CALL PFNGLGETQUERYIVPROC glad_glGetQueryiv; +#define glGetQueryiv glad_glGetQueryiv +GLAD_API_CALL PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv; +#define glGetRenderbufferParameteriv glad_glGetRenderbufferParameteriv +GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIIVPROC glad_glGetSamplerParameterIiv; +#define glGetSamplerParameterIiv glad_glGetSamplerParameterIiv +GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIUIVPROC glad_glGetSamplerParameterIuiv; +#define glGetSamplerParameterIuiv glad_glGetSamplerParameterIuiv +GLAD_API_CALL PFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv; +#define glGetSamplerParameterfv glad_glGetSamplerParameterfv +GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv; +#define glGetSamplerParameteriv glad_glGetSamplerParameteriv +GLAD_API_CALL PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog; +#define glGetShaderInfoLog glad_glGetShaderInfoLog +GLAD_API_CALL PFNGLGETSHADERPRECISIONFORMATPROC glad_glGetShaderPrecisionFormat; +#define glGetShaderPrecisionFormat glad_glGetShaderPrecisionFormat +GLAD_API_CALL PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource; +#define glGetShaderSource glad_glGetShaderSource +GLAD_API_CALL PFNGLGETSHADERIVPROC glad_glGetShaderiv; +#define glGetShaderiv glad_glGetShaderiv +GLAD_API_CALL PFNGLGETSTRINGPROC glad_glGetString; +#define glGetString glad_glGetString +GLAD_API_CALL PFNGLGETSTRINGIPROC glad_glGetStringi; +#define glGetStringi glad_glGetStringi +GLAD_API_CALL PFNGLGETSUBROUTINEINDEXPROC glad_glGetSubroutineIndex; +#define glGetSubroutineIndex glad_glGetSubroutineIndex +GLAD_API_CALL PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC glad_glGetSubroutineUniformLocation; +#define glGetSubroutineUniformLocation glad_glGetSubroutineUniformLocation +GLAD_API_CALL PFNGLGETSYNCIVPROC glad_glGetSynciv; +#define glGetSynciv glad_glGetSynciv +GLAD_API_CALL PFNGLGETTEXIMAGEPROC glad_glGetTexImage; +#define glGetTexImage glad_glGetTexImage +GLAD_API_CALL PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv; +#define glGetTexLevelParameterfv glad_glGetTexLevelParameterfv +GLAD_API_CALL PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv; +#define glGetTexLevelParameteriv glad_glGetTexLevelParameteriv +GLAD_API_CALL PFNGLGETTEXPARAMETERIIVPROC glad_glGetTexParameterIiv; +#define glGetTexParameterIiv glad_glGetTexParameterIiv +GLAD_API_CALL PFNGLGETTEXPARAMETERIUIVPROC glad_glGetTexParameterIuiv; +#define glGetTexParameterIuiv glad_glGetTexParameterIuiv +GLAD_API_CALL PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv; +#define glGetTexParameterfv glad_glGetTexParameterfv +GLAD_API_CALL PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv; +#define glGetTexParameteriv glad_glGetTexParameteriv +GLAD_API_CALL PFNGLGETTEXTUREIMAGEPROC glad_glGetTextureImage; +#define glGetTextureImage glad_glGetTextureImage +GLAD_API_CALL PFNGLGETTEXTURELEVELPARAMETERFVPROC glad_glGetTextureLevelParameterfv; +#define glGetTextureLevelParameterfv glad_glGetTextureLevelParameterfv +GLAD_API_CALL PFNGLGETTEXTURELEVELPARAMETERIVPROC glad_glGetTextureLevelParameteriv; +#define glGetTextureLevelParameteriv glad_glGetTextureLevelParameteriv +GLAD_API_CALL PFNGLGETTEXTUREPARAMETERIIVPROC glad_glGetTextureParameterIiv; +#define glGetTextureParameterIiv glad_glGetTextureParameterIiv +GLAD_API_CALL PFNGLGETTEXTUREPARAMETERIUIVPROC glad_glGetTextureParameterIuiv; +#define glGetTextureParameterIuiv glad_glGetTextureParameterIuiv +GLAD_API_CALL PFNGLGETTEXTUREPARAMETERFVPROC glad_glGetTextureParameterfv; +#define glGetTextureParameterfv glad_glGetTextureParameterfv +GLAD_API_CALL PFNGLGETTEXTUREPARAMETERIVPROC glad_glGetTextureParameteriv; +#define glGetTextureParameteriv glad_glGetTextureParameteriv +GLAD_API_CALL PFNGLGETTEXTURESUBIMAGEPROC glad_glGetTextureSubImage; +#define glGetTextureSubImage glad_glGetTextureSubImage +GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying; +#define glGetTransformFeedbackVarying glad_glGetTransformFeedbackVarying +GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKI64_VPROC glad_glGetTransformFeedbacki64_v; +#define glGetTransformFeedbacki64_v glad_glGetTransformFeedbacki64_v +GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKI_VPROC glad_glGetTransformFeedbacki_v; +#define glGetTransformFeedbacki_v glad_glGetTransformFeedbacki_v +GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKIVPROC glad_glGetTransformFeedbackiv; +#define glGetTransformFeedbackiv glad_glGetTransformFeedbackiv +GLAD_API_CALL PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex; +#define glGetUniformBlockIndex glad_glGetUniformBlockIndex +GLAD_API_CALL PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices; +#define glGetUniformIndices glad_glGetUniformIndices +GLAD_API_CALL PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation; +#define glGetUniformLocation glad_glGetUniformLocation +GLAD_API_CALL PFNGLGETUNIFORMSUBROUTINEUIVPROC glad_glGetUniformSubroutineuiv; +#define glGetUniformSubroutineuiv glad_glGetUniformSubroutineuiv +GLAD_API_CALL PFNGLGETUNIFORMDVPROC glad_glGetUniformdv; +#define glGetUniformdv glad_glGetUniformdv +GLAD_API_CALL PFNGLGETUNIFORMFVPROC glad_glGetUniformfv; +#define glGetUniformfv glad_glGetUniformfv +GLAD_API_CALL PFNGLGETUNIFORMIVPROC glad_glGetUniformiv; +#define glGetUniformiv glad_glGetUniformiv +GLAD_API_CALL PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv; +#define glGetUniformuiv glad_glGetUniformuiv +GLAD_API_CALL PFNGLGETVERTEXARRAYINDEXED64IVPROC glad_glGetVertexArrayIndexed64iv; +#define glGetVertexArrayIndexed64iv glad_glGetVertexArrayIndexed64iv +GLAD_API_CALL PFNGLGETVERTEXARRAYINDEXEDIVPROC glad_glGetVertexArrayIndexediv; +#define glGetVertexArrayIndexediv glad_glGetVertexArrayIndexediv +GLAD_API_CALL PFNGLGETVERTEXARRAYIVPROC glad_glGetVertexArrayiv; +#define glGetVertexArrayiv glad_glGetVertexArrayiv +GLAD_API_CALL PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv; +#define glGetVertexAttribIiv glad_glGetVertexAttribIiv +GLAD_API_CALL PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv; +#define glGetVertexAttribIuiv glad_glGetVertexAttribIuiv +GLAD_API_CALL PFNGLGETVERTEXATTRIBLDVPROC glad_glGetVertexAttribLdv; +#define glGetVertexAttribLdv glad_glGetVertexAttribLdv +GLAD_API_CALL PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv; +#define glGetVertexAttribPointerv glad_glGetVertexAttribPointerv +GLAD_API_CALL PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv; +#define glGetVertexAttribdv glad_glGetVertexAttribdv +GLAD_API_CALL PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv; +#define glGetVertexAttribfv glad_glGetVertexAttribfv +GLAD_API_CALL PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv; +#define glGetVertexAttribiv glad_glGetVertexAttribiv +GLAD_API_CALL PFNGLGETNCOMPRESSEDTEXIMAGEPROC glad_glGetnCompressedTexImage; +#define glGetnCompressedTexImage glad_glGetnCompressedTexImage +GLAD_API_CALL PFNGLGETNTEXIMAGEPROC glad_glGetnTexImage; +#define glGetnTexImage glad_glGetnTexImage +GLAD_API_CALL PFNGLGETNUNIFORMDVPROC glad_glGetnUniformdv; +#define glGetnUniformdv glad_glGetnUniformdv +GLAD_API_CALL PFNGLGETNUNIFORMFVPROC glad_glGetnUniformfv; +#define glGetnUniformfv glad_glGetnUniformfv +GLAD_API_CALL PFNGLGETNUNIFORMIVPROC glad_glGetnUniformiv; +#define glGetnUniformiv glad_glGetnUniformiv +GLAD_API_CALL PFNGLGETNUNIFORMUIVPROC glad_glGetnUniformuiv; +#define glGetnUniformuiv glad_glGetnUniformuiv +GLAD_API_CALL PFNGLHINTPROC glad_glHint; +#define glHint glad_glHint +GLAD_API_CALL PFNGLINVALIDATEBUFFERDATAPROC glad_glInvalidateBufferData; +#define glInvalidateBufferData glad_glInvalidateBufferData +GLAD_API_CALL PFNGLINVALIDATEBUFFERSUBDATAPROC glad_glInvalidateBufferSubData; +#define glInvalidateBufferSubData glad_glInvalidateBufferSubData +GLAD_API_CALL PFNGLINVALIDATEFRAMEBUFFERPROC glad_glInvalidateFramebuffer; +#define glInvalidateFramebuffer glad_glInvalidateFramebuffer +GLAD_API_CALL PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC glad_glInvalidateNamedFramebufferData; +#define glInvalidateNamedFramebufferData glad_glInvalidateNamedFramebufferData +GLAD_API_CALL PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC glad_glInvalidateNamedFramebufferSubData; +#define glInvalidateNamedFramebufferSubData glad_glInvalidateNamedFramebufferSubData +GLAD_API_CALL PFNGLINVALIDATESUBFRAMEBUFFERPROC glad_glInvalidateSubFramebuffer; +#define glInvalidateSubFramebuffer glad_glInvalidateSubFramebuffer +GLAD_API_CALL PFNGLINVALIDATETEXIMAGEPROC glad_glInvalidateTexImage; +#define glInvalidateTexImage glad_glInvalidateTexImage +GLAD_API_CALL PFNGLINVALIDATETEXSUBIMAGEPROC glad_glInvalidateTexSubImage; +#define glInvalidateTexSubImage glad_glInvalidateTexSubImage +GLAD_API_CALL PFNGLISBUFFERPROC glad_glIsBuffer; +#define glIsBuffer glad_glIsBuffer +GLAD_API_CALL PFNGLISENABLEDPROC glad_glIsEnabled; +#define glIsEnabled glad_glIsEnabled +GLAD_API_CALL PFNGLISENABLEDIPROC glad_glIsEnabledi; +#define glIsEnabledi glad_glIsEnabledi +GLAD_API_CALL PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer; +#define glIsFramebuffer glad_glIsFramebuffer +GLAD_API_CALL PFNGLISPROGRAMPROC glad_glIsProgram; +#define glIsProgram glad_glIsProgram +GLAD_API_CALL PFNGLISPROGRAMPIPELINEPROC glad_glIsProgramPipeline; +#define glIsProgramPipeline glad_glIsProgramPipeline +GLAD_API_CALL PFNGLISQUERYPROC glad_glIsQuery; +#define glIsQuery glad_glIsQuery +GLAD_API_CALL PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer; +#define glIsRenderbuffer glad_glIsRenderbuffer +GLAD_API_CALL PFNGLISSAMPLERPROC glad_glIsSampler; +#define glIsSampler glad_glIsSampler +GLAD_API_CALL PFNGLISSHADERPROC glad_glIsShader; +#define glIsShader glad_glIsShader +GLAD_API_CALL PFNGLISSYNCPROC glad_glIsSync; +#define glIsSync glad_glIsSync +GLAD_API_CALL PFNGLISTEXTUREPROC glad_glIsTexture; +#define glIsTexture glad_glIsTexture +GLAD_API_CALL PFNGLISTRANSFORMFEEDBACKPROC glad_glIsTransformFeedback; +#define glIsTransformFeedback glad_glIsTransformFeedback +GLAD_API_CALL PFNGLISVERTEXARRAYPROC glad_glIsVertexArray; +#define glIsVertexArray glad_glIsVertexArray +GLAD_API_CALL PFNGLLINEWIDTHPROC glad_glLineWidth; +#define glLineWidth glad_glLineWidth +GLAD_API_CALL PFNGLLINKPROGRAMPROC glad_glLinkProgram; +#define glLinkProgram glad_glLinkProgram +GLAD_API_CALL PFNGLLOGICOPPROC glad_glLogicOp; +#define glLogicOp glad_glLogicOp +GLAD_API_CALL PFNGLMAPBUFFERPROC glad_glMapBuffer; +#define glMapBuffer glad_glMapBuffer +GLAD_API_CALL PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange; +#define glMapBufferRange glad_glMapBufferRange +GLAD_API_CALL PFNGLMAPNAMEDBUFFERPROC glad_glMapNamedBuffer; +#define glMapNamedBuffer glad_glMapNamedBuffer +GLAD_API_CALL PFNGLMAPNAMEDBUFFERRANGEPROC glad_glMapNamedBufferRange; +#define glMapNamedBufferRange glad_glMapNamedBufferRange +GLAD_API_CALL PFNGLMEMORYBARRIERPROC glad_glMemoryBarrier; +#define glMemoryBarrier glad_glMemoryBarrier +GLAD_API_CALL PFNGLMEMORYBARRIERBYREGIONPROC glad_glMemoryBarrierByRegion; +#define glMemoryBarrierByRegion glad_glMemoryBarrierByRegion +GLAD_API_CALL PFNGLMINSAMPLESHADINGPROC glad_glMinSampleShading; +#define glMinSampleShading glad_glMinSampleShading +GLAD_API_CALL PFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays; +#define glMultiDrawArrays glad_glMultiDrawArrays +GLAD_API_CALL PFNGLMULTIDRAWARRAYSINDIRECTPROC glad_glMultiDrawArraysIndirect; +#define glMultiDrawArraysIndirect glad_glMultiDrawArraysIndirect +GLAD_API_CALL PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC glad_glMultiDrawArraysIndirectCount; +#define glMultiDrawArraysIndirectCount glad_glMultiDrawArraysIndirectCount +GLAD_API_CALL PFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements; +#define glMultiDrawElements glad_glMultiDrawElements +GLAD_API_CALL PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex; +#define glMultiDrawElementsBaseVertex glad_glMultiDrawElementsBaseVertex +GLAD_API_CALL PFNGLMULTIDRAWELEMENTSINDIRECTPROC glad_glMultiDrawElementsIndirect; +#define glMultiDrawElementsIndirect glad_glMultiDrawElementsIndirect +GLAD_API_CALL PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC glad_glMultiDrawElementsIndirectCount; +#define glMultiDrawElementsIndirectCount glad_glMultiDrawElementsIndirectCount +GLAD_API_CALL PFNGLNAMEDBUFFERDATAPROC glad_glNamedBufferData; +#define glNamedBufferData glad_glNamedBufferData +GLAD_API_CALL PFNGLNAMEDBUFFERSTORAGEPROC glad_glNamedBufferStorage; +#define glNamedBufferStorage glad_glNamedBufferStorage +GLAD_API_CALL PFNGLNAMEDBUFFERSUBDATAPROC glad_glNamedBufferSubData; +#define glNamedBufferSubData glad_glNamedBufferSubData +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC glad_glNamedFramebufferDrawBuffer; +#define glNamedFramebufferDrawBuffer glad_glNamedFramebufferDrawBuffer +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC glad_glNamedFramebufferDrawBuffers; +#define glNamedFramebufferDrawBuffers glad_glNamedFramebufferDrawBuffers +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC glad_glNamedFramebufferParameteri; +#define glNamedFramebufferParameteri glad_glNamedFramebufferParameteri +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC glad_glNamedFramebufferReadBuffer; +#define glNamedFramebufferReadBuffer glad_glNamedFramebufferReadBuffer +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC glad_glNamedFramebufferRenderbuffer; +#define glNamedFramebufferRenderbuffer glad_glNamedFramebufferRenderbuffer +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERTEXTUREPROC glad_glNamedFramebufferTexture; +#define glNamedFramebufferTexture glad_glNamedFramebufferTexture +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC glad_glNamedFramebufferTextureLayer; +#define glNamedFramebufferTextureLayer glad_glNamedFramebufferTextureLayer +GLAD_API_CALL PFNGLNAMEDRENDERBUFFERSTORAGEPROC glad_glNamedRenderbufferStorage; +#define glNamedRenderbufferStorage glad_glNamedRenderbufferStorage +GLAD_API_CALL PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glNamedRenderbufferStorageMultisample; +#define glNamedRenderbufferStorageMultisample glad_glNamedRenderbufferStorageMultisample +GLAD_API_CALL PFNGLOBJECTLABELPROC glad_glObjectLabel; +#define glObjectLabel glad_glObjectLabel +GLAD_API_CALL PFNGLOBJECTPTRLABELPROC glad_glObjectPtrLabel; +#define glObjectPtrLabel glad_glObjectPtrLabel +GLAD_API_CALL PFNGLPATCHPARAMETERFVPROC glad_glPatchParameterfv; +#define glPatchParameterfv glad_glPatchParameterfv +GLAD_API_CALL PFNGLPATCHPARAMETERIPROC glad_glPatchParameteri; +#define glPatchParameteri glad_glPatchParameteri +GLAD_API_CALL PFNGLPAUSETRANSFORMFEEDBACKPROC glad_glPauseTransformFeedback; +#define glPauseTransformFeedback glad_glPauseTransformFeedback +GLAD_API_CALL PFNGLPIXELSTOREFPROC glad_glPixelStoref; +#define glPixelStoref glad_glPixelStoref +GLAD_API_CALL PFNGLPIXELSTOREIPROC glad_glPixelStorei; +#define glPixelStorei glad_glPixelStorei +GLAD_API_CALL PFNGLPOINTPARAMETERFPROC glad_glPointParameterf; +#define glPointParameterf glad_glPointParameterf +GLAD_API_CALL PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv; +#define glPointParameterfv glad_glPointParameterfv +GLAD_API_CALL PFNGLPOINTPARAMETERIPROC glad_glPointParameteri; +#define glPointParameteri glad_glPointParameteri +GLAD_API_CALL PFNGLPOINTPARAMETERIVPROC glad_glPointParameteriv; +#define glPointParameteriv glad_glPointParameteriv +GLAD_API_CALL PFNGLPOINTSIZEPROC glad_glPointSize; +#define glPointSize glad_glPointSize +GLAD_API_CALL PFNGLPOLYGONMODEPROC glad_glPolygonMode; +#define glPolygonMode glad_glPolygonMode +GLAD_API_CALL PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset; +#define glPolygonOffset glad_glPolygonOffset +GLAD_API_CALL PFNGLPOLYGONOFFSETCLAMPPROC glad_glPolygonOffsetClamp; +#define glPolygonOffsetClamp glad_glPolygonOffsetClamp +GLAD_API_CALL PFNGLPOPDEBUGGROUPPROC glad_glPopDebugGroup; +#define glPopDebugGroup glad_glPopDebugGroup +GLAD_API_CALL PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex; +#define glPrimitiveRestartIndex glad_glPrimitiveRestartIndex +GLAD_API_CALL PFNGLPROGRAMBINARYPROC glad_glProgramBinary; +#define glProgramBinary glad_glProgramBinary +GLAD_API_CALL PFNGLPROGRAMPARAMETERIPROC glad_glProgramParameteri; +#define glProgramParameteri glad_glProgramParameteri +GLAD_API_CALL PFNGLPROGRAMUNIFORM1DPROC glad_glProgramUniform1d; +#define glProgramUniform1d glad_glProgramUniform1d +GLAD_API_CALL PFNGLPROGRAMUNIFORM1DVPROC glad_glProgramUniform1dv; +#define glProgramUniform1dv glad_glProgramUniform1dv +GLAD_API_CALL PFNGLPROGRAMUNIFORM1FPROC glad_glProgramUniform1f; +#define glProgramUniform1f glad_glProgramUniform1f +GLAD_API_CALL PFNGLPROGRAMUNIFORM1FVPROC glad_glProgramUniform1fv; +#define glProgramUniform1fv glad_glProgramUniform1fv +GLAD_API_CALL PFNGLPROGRAMUNIFORM1IPROC glad_glProgramUniform1i; +#define glProgramUniform1i glad_glProgramUniform1i +GLAD_API_CALL PFNGLPROGRAMUNIFORM1IVPROC glad_glProgramUniform1iv; +#define glProgramUniform1iv glad_glProgramUniform1iv +GLAD_API_CALL PFNGLPROGRAMUNIFORM1UIPROC glad_glProgramUniform1ui; +#define glProgramUniform1ui glad_glProgramUniform1ui +GLAD_API_CALL PFNGLPROGRAMUNIFORM1UIVPROC glad_glProgramUniform1uiv; +#define glProgramUniform1uiv glad_glProgramUniform1uiv +GLAD_API_CALL PFNGLPROGRAMUNIFORM2DPROC glad_glProgramUniform2d; +#define glProgramUniform2d glad_glProgramUniform2d +GLAD_API_CALL PFNGLPROGRAMUNIFORM2DVPROC glad_glProgramUniform2dv; +#define glProgramUniform2dv glad_glProgramUniform2dv +GLAD_API_CALL PFNGLPROGRAMUNIFORM2FPROC glad_glProgramUniform2f; +#define glProgramUniform2f glad_glProgramUniform2f +GLAD_API_CALL PFNGLPROGRAMUNIFORM2FVPROC glad_glProgramUniform2fv; +#define glProgramUniform2fv glad_glProgramUniform2fv +GLAD_API_CALL PFNGLPROGRAMUNIFORM2IPROC glad_glProgramUniform2i; +#define glProgramUniform2i glad_glProgramUniform2i +GLAD_API_CALL PFNGLPROGRAMUNIFORM2IVPROC glad_glProgramUniform2iv; +#define glProgramUniform2iv glad_glProgramUniform2iv +GLAD_API_CALL PFNGLPROGRAMUNIFORM2UIPROC glad_glProgramUniform2ui; +#define glProgramUniform2ui glad_glProgramUniform2ui +GLAD_API_CALL PFNGLPROGRAMUNIFORM2UIVPROC glad_glProgramUniform2uiv; +#define glProgramUniform2uiv glad_glProgramUniform2uiv +GLAD_API_CALL PFNGLPROGRAMUNIFORM3DPROC glad_glProgramUniform3d; +#define glProgramUniform3d glad_glProgramUniform3d +GLAD_API_CALL PFNGLPROGRAMUNIFORM3DVPROC glad_glProgramUniform3dv; +#define glProgramUniform3dv glad_glProgramUniform3dv +GLAD_API_CALL PFNGLPROGRAMUNIFORM3FPROC glad_glProgramUniform3f; +#define glProgramUniform3f glad_glProgramUniform3f +GLAD_API_CALL PFNGLPROGRAMUNIFORM3FVPROC glad_glProgramUniform3fv; +#define glProgramUniform3fv glad_glProgramUniform3fv +GLAD_API_CALL PFNGLPROGRAMUNIFORM3IPROC glad_glProgramUniform3i; +#define glProgramUniform3i glad_glProgramUniform3i +GLAD_API_CALL PFNGLPROGRAMUNIFORM3IVPROC glad_glProgramUniform3iv; +#define glProgramUniform3iv glad_glProgramUniform3iv +GLAD_API_CALL PFNGLPROGRAMUNIFORM3UIPROC glad_glProgramUniform3ui; +#define glProgramUniform3ui glad_glProgramUniform3ui +GLAD_API_CALL PFNGLPROGRAMUNIFORM3UIVPROC glad_glProgramUniform3uiv; +#define glProgramUniform3uiv glad_glProgramUniform3uiv +GLAD_API_CALL PFNGLPROGRAMUNIFORM4DPROC glad_glProgramUniform4d; +#define glProgramUniform4d glad_glProgramUniform4d +GLAD_API_CALL PFNGLPROGRAMUNIFORM4DVPROC glad_glProgramUniform4dv; +#define glProgramUniform4dv glad_glProgramUniform4dv +GLAD_API_CALL PFNGLPROGRAMUNIFORM4FPROC glad_glProgramUniform4f; +#define glProgramUniform4f glad_glProgramUniform4f +GLAD_API_CALL PFNGLPROGRAMUNIFORM4FVPROC glad_glProgramUniform4fv; +#define glProgramUniform4fv glad_glProgramUniform4fv +GLAD_API_CALL PFNGLPROGRAMUNIFORM4IPROC glad_glProgramUniform4i; +#define glProgramUniform4i glad_glProgramUniform4i +GLAD_API_CALL PFNGLPROGRAMUNIFORM4IVPROC glad_glProgramUniform4iv; +#define glProgramUniform4iv glad_glProgramUniform4iv +GLAD_API_CALL PFNGLPROGRAMUNIFORM4UIPROC glad_glProgramUniform4ui; +#define glProgramUniform4ui glad_glProgramUniform4ui +GLAD_API_CALL PFNGLPROGRAMUNIFORM4UIVPROC glad_glProgramUniform4uiv; +#define glProgramUniform4uiv glad_glProgramUniform4uiv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2DVPROC glad_glProgramUniformMatrix2dv; +#define glProgramUniformMatrix2dv glad_glProgramUniformMatrix2dv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2FVPROC glad_glProgramUniformMatrix2fv; +#define glProgramUniformMatrix2fv glad_glProgramUniformMatrix2fv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC glad_glProgramUniformMatrix2x3dv; +#define glProgramUniformMatrix2x3dv glad_glProgramUniformMatrix2x3dv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC glad_glProgramUniformMatrix2x3fv; +#define glProgramUniformMatrix2x3fv glad_glProgramUniformMatrix2x3fv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC glad_glProgramUniformMatrix2x4dv; +#define glProgramUniformMatrix2x4dv glad_glProgramUniformMatrix2x4dv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC glad_glProgramUniformMatrix2x4fv; +#define glProgramUniformMatrix2x4fv glad_glProgramUniformMatrix2x4fv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3DVPROC glad_glProgramUniformMatrix3dv; +#define glProgramUniformMatrix3dv glad_glProgramUniformMatrix3dv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3FVPROC glad_glProgramUniformMatrix3fv; +#define glProgramUniformMatrix3fv glad_glProgramUniformMatrix3fv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC glad_glProgramUniformMatrix3x2dv; +#define glProgramUniformMatrix3x2dv glad_glProgramUniformMatrix3x2dv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC glad_glProgramUniformMatrix3x2fv; +#define glProgramUniformMatrix3x2fv glad_glProgramUniformMatrix3x2fv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC glad_glProgramUniformMatrix3x4dv; +#define glProgramUniformMatrix3x4dv glad_glProgramUniformMatrix3x4dv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC glad_glProgramUniformMatrix3x4fv; +#define glProgramUniformMatrix3x4fv glad_glProgramUniformMatrix3x4fv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4DVPROC glad_glProgramUniformMatrix4dv; +#define glProgramUniformMatrix4dv glad_glProgramUniformMatrix4dv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4FVPROC glad_glProgramUniformMatrix4fv; +#define glProgramUniformMatrix4fv glad_glProgramUniformMatrix4fv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC glad_glProgramUniformMatrix4x2dv; +#define glProgramUniformMatrix4x2dv glad_glProgramUniformMatrix4x2dv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC glad_glProgramUniformMatrix4x2fv; +#define glProgramUniformMatrix4x2fv glad_glProgramUniformMatrix4x2fv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC glad_glProgramUniformMatrix4x3dv; +#define glProgramUniformMatrix4x3dv glad_glProgramUniformMatrix4x3dv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC glad_glProgramUniformMatrix4x3fv; +#define glProgramUniformMatrix4x3fv glad_glProgramUniformMatrix4x3fv +GLAD_API_CALL PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex; +#define glProvokingVertex glad_glProvokingVertex +GLAD_API_CALL PFNGLPUSHDEBUGGROUPPROC glad_glPushDebugGroup; +#define glPushDebugGroup glad_glPushDebugGroup +GLAD_API_CALL PFNGLQUERYCOUNTERPROC glad_glQueryCounter; +#define glQueryCounter glad_glQueryCounter +GLAD_API_CALL PFNGLREADBUFFERPROC glad_glReadBuffer; +#define glReadBuffer glad_glReadBuffer +GLAD_API_CALL PFNGLREADPIXELSPROC glad_glReadPixels; +#define glReadPixels glad_glReadPixels +GLAD_API_CALL PFNGLREADNPIXELSPROC glad_glReadnPixels; +#define glReadnPixels glad_glReadnPixels +GLAD_API_CALL PFNGLRELEASESHADERCOMPILERPROC glad_glReleaseShaderCompiler; +#define glReleaseShaderCompiler glad_glReleaseShaderCompiler +GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage; +#define glRenderbufferStorage glad_glRenderbufferStorage +GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample; +#define glRenderbufferStorageMultisample glad_glRenderbufferStorageMultisample +GLAD_API_CALL PFNGLRESUMETRANSFORMFEEDBACKPROC glad_glResumeTransformFeedback; +#define glResumeTransformFeedback glad_glResumeTransformFeedback +GLAD_API_CALL PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage; +#define glSampleCoverage glad_glSampleCoverage +GLAD_API_CALL PFNGLSAMPLEMASKIPROC glad_glSampleMaski; +#define glSampleMaski glad_glSampleMaski +GLAD_API_CALL PFNGLSAMPLERPARAMETERIIVPROC glad_glSamplerParameterIiv; +#define glSamplerParameterIiv glad_glSamplerParameterIiv +GLAD_API_CALL PFNGLSAMPLERPARAMETERIUIVPROC glad_glSamplerParameterIuiv; +#define glSamplerParameterIuiv glad_glSamplerParameterIuiv +GLAD_API_CALL PFNGLSAMPLERPARAMETERFPROC glad_glSamplerParameterf; +#define glSamplerParameterf glad_glSamplerParameterf +GLAD_API_CALL PFNGLSAMPLERPARAMETERFVPROC glad_glSamplerParameterfv; +#define glSamplerParameterfv glad_glSamplerParameterfv +GLAD_API_CALL PFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri; +#define glSamplerParameteri glad_glSamplerParameteri +GLAD_API_CALL PFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv; +#define glSamplerParameteriv glad_glSamplerParameteriv +GLAD_API_CALL PFNGLSCISSORPROC glad_glScissor; +#define glScissor glad_glScissor +GLAD_API_CALL PFNGLSCISSORARRAYVPROC glad_glScissorArrayv; +#define glScissorArrayv glad_glScissorArrayv +GLAD_API_CALL PFNGLSCISSORINDEXEDPROC glad_glScissorIndexed; +#define glScissorIndexed glad_glScissorIndexed +GLAD_API_CALL PFNGLSCISSORINDEXEDVPROC glad_glScissorIndexedv; +#define glScissorIndexedv glad_glScissorIndexedv +GLAD_API_CALL PFNGLSHADERBINARYPROC glad_glShaderBinary; +#define glShaderBinary glad_glShaderBinary +GLAD_API_CALL PFNGLSHADERSOURCEPROC glad_glShaderSource; +#define glShaderSource glad_glShaderSource +GLAD_API_CALL PFNGLSHADERSTORAGEBLOCKBINDINGPROC glad_glShaderStorageBlockBinding; +#define glShaderStorageBlockBinding glad_glShaderStorageBlockBinding +GLAD_API_CALL PFNGLSPECIALIZESHADERPROC glad_glSpecializeShader; +#define glSpecializeShader glad_glSpecializeShader +GLAD_API_CALL PFNGLSTENCILFUNCPROC glad_glStencilFunc; +#define glStencilFunc glad_glStencilFunc +GLAD_API_CALL PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate; +#define glStencilFuncSeparate glad_glStencilFuncSeparate +GLAD_API_CALL PFNGLSTENCILMASKPROC glad_glStencilMask; +#define glStencilMask glad_glStencilMask +GLAD_API_CALL PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate; +#define glStencilMaskSeparate glad_glStencilMaskSeparate +GLAD_API_CALL PFNGLSTENCILOPPROC glad_glStencilOp; +#define glStencilOp glad_glStencilOp +GLAD_API_CALL PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate; +#define glStencilOpSeparate glad_glStencilOpSeparate +GLAD_API_CALL PFNGLTEXBUFFERPROC glad_glTexBuffer; +#define glTexBuffer glad_glTexBuffer +GLAD_API_CALL PFNGLTEXBUFFERRANGEPROC glad_glTexBufferRange; +#define glTexBufferRange glad_glTexBufferRange +GLAD_API_CALL PFNGLTEXIMAGE1DPROC glad_glTexImage1D; +#define glTexImage1D glad_glTexImage1D +GLAD_API_CALL PFNGLTEXIMAGE2DPROC glad_glTexImage2D; +#define glTexImage2D glad_glTexImage2D +GLAD_API_CALL PFNGLTEXIMAGE2DMULTISAMPLEPROC glad_glTexImage2DMultisample; +#define glTexImage2DMultisample glad_glTexImage2DMultisample +GLAD_API_CALL PFNGLTEXIMAGE3DPROC glad_glTexImage3D; +#define glTexImage3D glad_glTexImage3D +GLAD_API_CALL PFNGLTEXIMAGE3DMULTISAMPLEPROC glad_glTexImage3DMultisample; +#define glTexImage3DMultisample glad_glTexImage3DMultisample +GLAD_API_CALL PFNGLTEXPARAMETERIIVPROC glad_glTexParameterIiv; +#define glTexParameterIiv glad_glTexParameterIiv +GLAD_API_CALL PFNGLTEXPARAMETERIUIVPROC glad_glTexParameterIuiv; +#define glTexParameterIuiv glad_glTexParameterIuiv +GLAD_API_CALL PFNGLTEXPARAMETERFPROC glad_glTexParameterf; +#define glTexParameterf glad_glTexParameterf +GLAD_API_CALL PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv; +#define glTexParameterfv glad_glTexParameterfv +GLAD_API_CALL PFNGLTEXPARAMETERIPROC glad_glTexParameteri; +#define glTexParameteri glad_glTexParameteri +GLAD_API_CALL PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv; +#define glTexParameteriv glad_glTexParameteriv +GLAD_API_CALL PFNGLTEXSTORAGE1DPROC glad_glTexStorage1D; +#define glTexStorage1D glad_glTexStorage1D +GLAD_API_CALL PFNGLTEXSTORAGE2DPROC glad_glTexStorage2D; +#define glTexStorage2D glad_glTexStorage2D +GLAD_API_CALL PFNGLTEXSTORAGE2DMULTISAMPLEPROC glad_glTexStorage2DMultisample; +#define glTexStorage2DMultisample glad_glTexStorage2DMultisample +GLAD_API_CALL PFNGLTEXSTORAGE3DPROC glad_glTexStorage3D; +#define glTexStorage3D glad_glTexStorage3D +GLAD_API_CALL PFNGLTEXSTORAGE3DMULTISAMPLEPROC glad_glTexStorage3DMultisample; +#define glTexStorage3DMultisample glad_glTexStorage3DMultisample +GLAD_API_CALL PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D; +#define glTexSubImage1D glad_glTexSubImage1D +GLAD_API_CALL PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D; +#define glTexSubImage2D glad_glTexSubImage2D +GLAD_API_CALL PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D; +#define glTexSubImage3D glad_glTexSubImage3D +GLAD_API_CALL PFNGLTEXTUREBARRIERPROC glad_glTextureBarrier; +#define glTextureBarrier glad_glTextureBarrier +GLAD_API_CALL PFNGLTEXTUREBUFFERPROC glad_glTextureBuffer; +#define glTextureBuffer glad_glTextureBuffer +GLAD_API_CALL PFNGLTEXTUREBUFFERRANGEPROC glad_glTextureBufferRange; +#define glTextureBufferRange glad_glTextureBufferRange +GLAD_API_CALL PFNGLTEXTUREPARAMETERIIVPROC glad_glTextureParameterIiv; +#define glTextureParameterIiv glad_glTextureParameterIiv +GLAD_API_CALL PFNGLTEXTUREPARAMETERIUIVPROC glad_glTextureParameterIuiv; +#define glTextureParameterIuiv glad_glTextureParameterIuiv +GLAD_API_CALL PFNGLTEXTUREPARAMETERFPROC glad_glTextureParameterf; +#define glTextureParameterf glad_glTextureParameterf +GLAD_API_CALL PFNGLTEXTUREPARAMETERFVPROC glad_glTextureParameterfv; +#define glTextureParameterfv glad_glTextureParameterfv +GLAD_API_CALL PFNGLTEXTUREPARAMETERIPROC glad_glTextureParameteri; +#define glTextureParameteri glad_glTextureParameteri +GLAD_API_CALL PFNGLTEXTUREPARAMETERIVPROC glad_glTextureParameteriv; +#define glTextureParameteriv glad_glTextureParameteriv +GLAD_API_CALL PFNGLTEXTURESTORAGE1DPROC glad_glTextureStorage1D; +#define glTextureStorage1D glad_glTextureStorage1D +GLAD_API_CALL PFNGLTEXTURESTORAGE2DPROC glad_glTextureStorage2D; +#define glTextureStorage2D glad_glTextureStorage2D +GLAD_API_CALL PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC glad_glTextureStorage2DMultisample; +#define glTextureStorage2DMultisample glad_glTextureStorage2DMultisample +GLAD_API_CALL PFNGLTEXTURESTORAGE3DPROC glad_glTextureStorage3D; +#define glTextureStorage3D glad_glTextureStorage3D +GLAD_API_CALL PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC glad_glTextureStorage3DMultisample; +#define glTextureStorage3DMultisample glad_glTextureStorage3DMultisample +GLAD_API_CALL PFNGLTEXTURESUBIMAGE1DPROC glad_glTextureSubImage1D; +#define glTextureSubImage1D glad_glTextureSubImage1D +GLAD_API_CALL PFNGLTEXTURESUBIMAGE2DPROC glad_glTextureSubImage2D; +#define glTextureSubImage2D glad_glTextureSubImage2D +GLAD_API_CALL PFNGLTEXTURESUBIMAGE3DPROC glad_glTextureSubImage3D; +#define glTextureSubImage3D glad_glTextureSubImage3D +GLAD_API_CALL PFNGLTEXTUREVIEWPROC glad_glTextureView; +#define glTextureView glad_glTextureView +GLAD_API_CALL PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC glad_glTransformFeedbackBufferBase; +#define glTransformFeedbackBufferBase glad_glTransformFeedbackBufferBase +GLAD_API_CALL PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC glad_glTransformFeedbackBufferRange; +#define glTransformFeedbackBufferRange glad_glTransformFeedbackBufferRange +GLAD_API_CALL PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings; +#define glTransformFeedbackVaryings glad_glTransformFeedbackVaryings +GLAD_API_CALL PFNGLUNIFORM1DPROC glad_glUniform1d; +#define glUniform1d glad_glUniform1d +GLAD_API_CALL PFNGLUNIFORM1DVPROC glad_glUniform1dv; +#define glUniform1dv glad_glUniform1dv +GLAD_API_CALL PFNGLUNIFORM1FPROC glad_glUniform1f; +#define glUniform1f glad_glUniform1f +GLAD_API_CALL PFNGLUNIFORM1FVPROC glad_glUniform1fv; +#define glUniform1fv glad_glUniform1fv +GLAD_API_CALL PFNGLUNIFORM1IPROC glad_glUniform1i; +#define glUniform1i glad_glUniform1i +GLAD_API_CALL PFNGLUNIFORM1IVPROC glad_glUniform1iv; +#define glUniform1iv glad_glUniform1iv +GLAD_API_CALL PFNGLUNIFORM1UIPROC glad_glUniform1ui; +#define glUniform1ui glad_glUniform1ui +GLAD_API_CALL PFNGLUNIFORM1UIVPROC glad_glUniform1uiv; +#define glUniform1uiv glad_glUniform1uiv +GLAD_API_CALL PFNGLUNIFORM2DPROC glad_glUniform2d; +#define glUniform2d glad_glUniform2d +GLAD_API_CALL PFNGLUNIFORM2DVPROC glad_glUniform2dv; +#define glUniform2dv glad_glUniform2dv +GLAD_API_CALL PFNGLUNIFORM2FPROC glad_glUniform2f; +#define glUniform2f glad_glUniform2f +GLAD_API_CALL PFNGLUNIFORM2FVPROC glad_glUniform2fv; +#define glUniform2fv glad_glUniform2fv +GLAD_API_CALL PFNGLUNIFORM2IPROC glad_glUniform2i; +#define glUniform2i glad_glUniform2i +GLAD_API_CALL PFNGLUNIFORM2IVPROC glad_glUniform2iv; +#define glUniform2iv glad_glUniform2iv +GLAD_API_CALL PFNGLUNIFORM2UIPROC glad_glUniform2ui; +#define glUniform2ui glad_glUniform2ui +GLAD_API_CALL PFNGLUNIFORM2UIVPROC glad_glUniform2uiv; +#define glUniform2uiv glad_glUniform2uiv +GLAD_API_CALL PFNGLUNIFORM3DPROC glad_glUniform3d; +#define glUniform3d glad_glUniform3d +GLAD_API_CALL PFNGLUNIFORM3DVPROC glad_glUniform3dv; +#define glUniform3dv glad_glUniform3dv +GLAD_API_CALL PFNGLUNIFORM3FPROC glad_glUniform3f; +#define glUniform3f glad_glUniform3f +GLAD_API_CALL PFNGLUNIFORM3FVPROC glad_glUniform3fv; +#define glUniform3fv glad_glUniform3fv +GLAD_API_CALL PFNGLUNIFORM3IPROC glad_glUniform3i; +#define glUniform3i glad_glUniform3i +GLAD_API_CALL PFNGLUNIFORM3IVPROC glad_glUniform3iv; +#define glUniform3iv glad_glUniform3iv +GLAD_API_CALL PFNGLUNIFORM3UIPROC glad_glUniform3ui; +#define glUniform3ui glad_glUniform3ui +GLAD_API_CALL PFNGLUNIFORM3UIVPROC glad_glUniform3uiv; +#define glUniform3uiv glad_glUniform3uiv +GLAD_API_CALL PFNGLUNIFORM4DPROC glad_glUniform4d; +#define glUniform4d glad_glUniform4d +GLAD_API_CALL PFNGLUNIFORM4DVPROC glad_glUniform4dv; +#define glUniform4dv glad_glUniform4dv +GLAD_API_CALL PFNGLUNIFORM4FPROC glad_glUniform4f; +#define glUniform4f glad_glUniform4f +GLAD_API_CALL PFNGLUNIFORM4FVPROC glad_glUniform4fv; +#define glUniform4fv glad_glUniform4fv +GLAD_API_CALL PFNGLUNIFORM4IPROC glad_glUniform4i; +#define glUniform4i glad_glUniform4i +GLAD_API_CALL PFNGLUNIFORM4IVPROC glad_glUniform4iv; +#define glUniform4iv glad_glUniform4iv +GLAD_API_CALL PFNGLUNIFORM4UIPROC glad_glUniform4ui; +#define glUniform4ui glad_glUniform4ui +GLAD_API_CALL PFNGLUNIFORM4UIVPROC glad_glUniform4uiv; +#define glUniform4uiv glad_glUniform4uiv +GLAD_API_CALL PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding; +#define glUniformBlockBinding glad_glUniformBlockBinding +GLAD_API_CALL PFNGLUNIFORMMATRIX2DVPROC glad_glUniformMatrix2dv; +#define glUniformMatrix2dv glad_glUniformMatrix2dv +GLAD_API_CALL PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv; +#define glUniformMatrix2fv glad_glUniformMatrix2fv +GLAD_API_CALL PFNGLUNIFORMMATRIX2X3DVPROC glad_glUniformMatrix2x3dv; +#define glUniformMatrix2x3dv glad_glUniformMatrix2x3dv +GLAD_API_CALL PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv; +#define glUniformMatrix2x3fv glad_glUniformMatrix2x3fv +GLAD_API_CALL PFNGLUNIFORMMATRIX2X4DVPROC glad_glUniformMatrix2x4dv; +#define glUniformMatrix2x4dv glad_glUniformMatrix2x4dv +GLAD_API_CALL PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv; +#define glUniformMatrix2x4fv glad_glUniformMatrix2x4fv +GLAD_API_CALL PFNGLUNIFORMMATRIX3DVPROC glad_glUniformMatrix3dv; +#define glUniformMatrix3dv glad_glUniformMatrix3dv +GLAD_API_CALL PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv; +#define glUniformMatrix3fv glad_glUniformMatrix3fv +GLAD_API_CALL PFNGLUNIFORMMATRIX3X2DVPROC glad_glUniformMatrix3x2dv; +#define glUniformMatrix3x2dv glad_glUniformMatrix3x2dv +GLAD_API_CALL PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv; +#define glUniformMatrix3x2fv glad_glUniformMatrix3x2fv +GLAD_API_CALL PFNGLUNIFORMMATRIX3X4DVPROC glad_glUniformMatrix3x4dv; +#define glUniformMatrix3x4dv glad_glUniformMatrix3x4dv +GLAD_API_CALL PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv; +#define glUniformMatrix3x4fv glad_glUniformMatrix3x4fv +GLAD_API_CALL PFNGLUNIFORMMATRIX4DVPROC glad_glUniformMatrix4dv; +#define glUniformMatrix4dv glad_glUniformMatrix4dv +GLAD_API_CALL PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv; +#define glUniformMatrix4fv glad_glUniformMatrix4fv +GLAD_API_CALL PFNGLUNIFORMMATRIX4X2DVPROC glad_glUniformMatrix4x2dv; +#define glUniformMatrix4x2dv glad_glUniformMatrix4x2dv +GLAD_API_CALL PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv; +#define glUniformMatrix4x2fv glad_glUniformMatrix4x2fv +GLAD_API_CALL PFNGLUNIFORMMATRIX4X3DVPROC glad_glUniformMatrix4x3dv; +#define glUniformMatrix4x3dv glad_glUniformMatrix4x3dv +GLAD_API_CALL PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv; +#define glUniformMatrix4x3fv glad_glUniformMatrix4x3fv +GLAD_API_CALL PFNGLUNIFORMSUBROUTINESUIVPROC glad_glUniformSubroutinesuiv; +#define glUniformSubroutinesuiv glad_glUniformSubroutinesuiv +GLAD_API_CALL PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer; +#define glUnmapBuffer glad_glUnmapBuffer +GLAD_API_CALL PFNGLUNMAPNAMEDBUFFERPROC glad_glUnmapNamedBuffer; +#define glUnmapNamedBuffer glad_glUnmapNamedBuffer +GLAD_API_CALL PFNGLUSEPROGRAMPROC glad_glUseProgram; +#define glUseProgram glad_glUseProgram +GLAD_API_CALL PFNGLUSEPROGRAMSTAGESPROC glad_glUseProgramStages; +#define glUseProgramStages glad_glUseProgramStages +GLAD_API_CALL PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram; +#define glValidateProgram glad_glValidateProgram +GLAD_API_CALL PFNGLVALIDATEPROGRAMPIPELINEPROC glad_glValidateProgramPipeline; +#define glValidateProgramPipeline glad_glValidateProgramPipeline +GLAD_API_CALL PFNGLVERTEXARRAYATTRIBBINDINGPROC glad_glVertexArrayAttribBinding; +#define glVertexArrayAttribBinding glad_glVertexArrayAttribBinding +GLAD_API_CALL PFNGLVERTEXARRAYATTRIBFORMATPROC glad_glVertexArrayAttribFormat; +#define glVertexArrayAttribFormat glad_glVertexArrayAttribFormat +GLAD_API_CALL PFNGLVERTEXARRAYATTRIBIFORMATPROC glad_glVertexArrayAttribIFormat; +#define glVertexArrayAttribIFormat glad_glVertexArrayAttribIFormat +GLAD_API_CALL PFNGLVERTEXARRAYATTRIBLFORMATPROC glad_glVertexArrayAttribLFormat; +#define glVertexArrayAttribLFormat glad_glVertexArrayAttribLFormat +GLAD_API_CALL PFNGLVERTEXARRAYBINDINGDIVISORPROC glad_glVertexArrayBindingDivisor; +#define glVertexArrayBindingDivisor glad_glVertexArrayBindingDivisor +GLAD_API_CALL PFNGLVERTEXARRAYELEMENTBUFFERPROC glad_glVertexArrayElementBuffer; +#define glVertexArrayElementBuffer glad_glVertexArrayElementBuffer +GLAD_API_CALL PFNGLVERTEXARRAYVERTEXBUFFERPROC glad_glVertexArrayVertexBuffer; +#define glVertexArrayVertexBuffer glad_glVertexArrayVertexBuffer +GLAD_API_CALL PFNGLVERTEXARRAYVERTEXBUFFERSPROC glad_glVertexArrayVertexBuffers; +#define glVertexArrayVertexBuffers glad_glVertexArrayVertexBuffers +GLAD_API_CALL PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d; +#define glVertexAttrib1d glad_glVertexAttrib1d +GLAD_API_CALL PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv; +#define glVertexAttrib1dv glad_glVertexAttrib1dv +GLAD_API_CALL PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f; +#define glVertexAttrib1f glad_glVertexAttrib1f +GLAD_API_CALL PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv; +#define glVertexAttrib1fv glad_glVertexAttrib1fv +GLAD_API_CALL PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s; +#define glVertexAttrib1s glad_glVertexAttrib1s +GLAD_API_CALL PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv; +#define glVertexAttrib1sv glad_glVertexAttrib1sv +GLAD_API_CALL PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d; +#define glVertexAttrib2d glad_glVertexAttrib2d +GLAD_API_CALL PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv; +#define glVertexAttrib2dv glad_glVertexAttrib2dv +GLAD_API_CALL PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f; +#define glVertexAttrib2f glad_glVertexAttrib2f +GLAD_API_CALL PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv; +#define glVertexAttrib2fv glad_glVertexAttrib2fv +GLAD_API_CALL PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s; +#define glVertexAttrib2s glad_glVertexAttrib2s +GLAD_API_CALL PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv; +#define glVertexAttrib2sv glad_glVertexAttrib2sv +GLAD_API_CALL PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d; +#define glVertexAttrib3d glad_glVertexAttrib3d +GLAD_API_CALL PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv; +#define glVertexAttrib3dv glad_glVertexAttrib3dv +GLAD_API_CALL PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f; +#define glVertexAttrib3f glad_glVertexAttrib3f +GLAD_API_CALL PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv; +#define glVertexAttrib3fv glad_glVertexAttrib3fv +GLAD_API_CALL PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s; +#define glVertexAttrib3s glad_glVertexAttrib3s +GLAD_API_CALL PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv; +#define glVertexAttrib3sv glad_glVertexAttrib3sv +GLAD_API_CALL PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv; +#define glVertexAttrib4Nbv glad_glVertexAttrib4Nbv +GLAD_API_CALL PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv; +#define glVertexAttrib4Niv glad_glVertexAttrib4Niv +GLAD_API_CALL PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv; +#define glVertexAttrib4Nsv glad_glVertexAttrib4Nsv +GLAD_API_CALL PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub; +#define glVertexAttrib4Nub glad_glVertexAttrib4Nub +GLAD_API_CALL PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv; +#define glVertexAttrib4Nubv glad_glVertexAttrib4Nubv +GLAD_API_CALL PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv; +#define glVertexAttrib4Nuiv glad_glVertexAttrib4Nuiv +GLAD_API_CALL PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv; +#define glVertexAttrib4Nusv glad_glVertexAttrib4Nusv +GLAD_API_CALL PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv; +#define glVertexAttrib4bv glad_glVertexAttrib4bv +GLAD_API_CALL PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d; +#define glVertexAttrib4d glad_glVertexAttrib4d +GLAD_API_CALL PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv; +#define glVertexAttrib4dv glad_glVertexAttrib4dv +GLAD_API_CALL PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f; +#define glVertexAttrib4f glad_glVertexAttrib4f +GLAD_API_CALL PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv; +#define glVertexAttrib4fv glad_glVertexAttrib4fv +GLAD_API_CALL PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv; +#define glVertexAttrib4iv glad_glVertexAttrib4iv +GLAD_API_CALL PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s; +#define glVertexAttrib4s glad_glVertexAttrib4s +GLAD_API_CALL PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv; +#define glVertexAttrib4sv glad_glVertexAttrib4sv +GLAD_API_CALL PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv; +#define glVertexAttrib4ubv glad_glVertexAttrib4ubv +GLAD_API_CALL PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv; +#define glVertexAttrib4uiv glad_glVertexAttrib4uiv +GLAD_API_CALL PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv; +#define glVertexAttrib4usv glad_glVertexAttrib4usv +GLAD_API_CALL PFNGLVERTEXATTRIBBINDINGPROC glad_glVertexAttribBinding; +#define glVertexAttribBinding glad_glVertexAttribBinding +GLAD_API_CALL PFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor; +#define glVertexAttribDivisor glad_glVertexAttribDivisor +GLAD_API_CALL PFNGLVERTEXATTRIBFORMATPROC glad_glVertexAttribFormat; +#define glVertexAttribFormat glad_glVertexAttribFormat +GLAD_API_CALL PFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i; +#define glVertexAttribI1i glad_glVertexAttribI1i +GLAD_API_CALL PFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv; +#define glVertexAttribI1iv glad_glVertexAttribI1iv +GLAD_API_CALL PFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui; +#define glVertexAttribI1ui glad_glVertexAttribI1ui +GLAD_API_CALL PFNGLVERTEXATTRIBI1UIVPROC glad_glVertexAttribI1uiv; +#define glVertexAttribI1uiv glad_glVertexAttribI1uiv +GLAD_API_CALL PFNGLVERTEXATTRIBI2IPROC glad_glVertexAttribI2i; +#define glVertexAttribI2i glad_glVertexAttribI2i +GLAD_API_CALL PFNGLVERTEXATTRIBI2IVPROC glad_glVertexAttribI2iv; +#define glVertexAttribI2iv glad_glVertexAttribI2iv +GLAD_API_CALL PFNGLVERTEXATTRIBI2UIPROC glad_glVertexAttribI2ui; +#define glVertexAttribI2ui glad_glVertexAttribI2ui +GLAD_API_CALL PFNGLVERTEXATTRIBI2UIVPROC glad_glVertexAttribI2uiv; +#define glVertexAttribI2uiv glad_glVertexAttribI2uiv +GLAD_API_CALL PFNGLVERTEXATTRIBI3IPROC glad_glVertexAttribI3i; +#define glVertexAttribI3i glad_glVertexAttribI3i +GLAD_API_CALL PFNGLVERTEXATTRIBI3IVPROC glad_glVertexAttribI3iv; +#define glVertexAttribI3iv glad_glVertexAttribI3iv +GLAD_API_CALL PFNGLVERTEXATTRIBI3UIPROC glad_glVertexAttribI3ui; +#define glVertexAttribI3ui glad_glVertexAttribI3ui +GLAD_API_CALL PFNGLVERTEXATTRIBI3UIVPROC glad_glVertexAttribI3uiv; +#define glVertexAttribI3uiv glad_glVertexAttribI3uiv +GLAD_API_CALL PFNGLVERTEXATTRIBI4BVPROC glad_glVertexAttribI4bv; +#define glVertexAttribI4bv glad_glVertexAttribI4bv +GLAD_API_CALL PFNGLVERTEXATTRIBI4IPROC glad_glVertexAttribI4i; +#define glVertexAttribI4i glad_glVertexAttribI4i +GLAD_API_CALL PFNGLVERTEXATTRIBI4IVPROC glad_glVertexAttribI4iv; +#define glVertexAttribI4iv glad_glVertexAttribI4iv +GLAD_API_CALL PFNGLVERTEXATTRIBI4SVPROC glad_glVertexAttribI4sv; +#define glVertexAttribI4sv glad_glVertexAttribI4sv +GLAD_API_CALL PFNGLVERTEXATTRIBI4UBVPROC glad_glVertexAttribI4ubv; +#define glVertexAttribI4ubv glad_glVertexAttribI4ubv +GLAD_API_CALL PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui; +#define glVertexAttribI4ui glad_glVertexAttribI4ui +GLAD_API_CALL PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv; +#define glVertexAttribI4uiv glad_glVertexAttribI4uiv +GLAD_API_CALL PFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv; +#define glVertexAttribI4usv glad_glVertexAttribI4usv +GLAD_API_CALL PFNGLVERTEXATTRIBIFORMATPROC glad_glVertexAttribIFormat; +#define glVertexAttribIFormat glad_glVertexAttribIFormat +GLAD_API_CALL PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer; +#define glVertexAttribIPointer glad_glVertexAttribIPointer +GLAD_API_CALL PFNGLVERTEXATTRIBL1DPROC glad_glVertexAttribL1d; +#define glVertexAttribL1d glad_glVertexAttribL1d +GLAD_API_CALL PFNGLVERTEXATTRIBL1DVPROC glad_glVertexAttribL1dv; +#define glVertexAttribL1dv glad_glVertexAttribL1dv +GLAD_API_CALL PFNGLVERTEXATTRIBL2DPROC glad_glVertexAttribL2d; +#define glVertexAttribL2d glad_glVertexAttribL2d +GLAD_API_CALL PFNGLVERTEXATTRIBL2DVPROC glad_glVertexAttribL2dv; +#define glVertexAttribL2dv glad_glVertexAttribL2dv +GLAD_API_CALL PFNGLVERTEXATTRIBL3DPROC glad_glVertexAttribL3d; +#define glVertexAttribL3d glad_glVertexAttribL3d +GLAD_API_CALL PFNGLVERTEXATTRIBL3DVPROC glad_glVertexAttribL3dv; +#define glVertexAttribL3dv glad_glVertexAttribL3dv +GLAD_API_CALL PFNGLVERTEXATTRIBL4DPROC glad_glVertexAttribL4d; +#define glVertexAttribL4d glad_glVertexAttribL4d +GLAD_API_CALL PFNGLVERTEXATTRIBL4DVPROC glad_glVertexAttribL4dv; +#define glVertexAttribL4dv glad_glVertexAttribL4dv +GLAD_API_CALL PFNGLVERTEXATTRIBLFORMATPROC glad_glVertexAttribLFormat; +#define glVertexAttribLFormat glad_glVertexAttribLFormat +GLAD_API_CALL PFNGLVERTEXATTRIBLPOINTERPROC glad_glVertexAttribLPointer; +#define glVertexAttribLPointer glad_glVertexAttribLPointer +GLAD_API_CALL PFNGLVERTEXATTRIBP1UIPROC glad_glVertexAttribP1ui; +#define glVertexAttribP1ui glad_glVertexAttribP1ui +GLAD_API_CALL PFNGLVERTEXATTRIBP1UIVPROC glad_glVertexAttribP1uiv; +#define glVertexAttribP1uiv glad_glVertexAttribP1uiv +GLAD_API_CALL PFNGLVERTEXATTRIBP2UIPROC glad_glVertexAttribP2ui; +#define glVertexAttribP2ui glad_glVertexAttribP2ui +GLAD_API_CALL PFNGLVERTEXATTRIBP2UIVPROC glad_glVertexAttribP2uiv; +#define glVertexAttribP2uiv glad_glVertexAttribP2uiv +GLAD_API_CALL PFNGLVERTEXATTRIBP3UIPROC glad_glVertexAttribP3ui; +#define glVertexAttribP3ui glad_glVertexAttribP3ui +GLAD_API_CALL PFNGLVERTEXATTRIBP3UIVPROC glad_glVertexAttribP3uiv; +#define glVertexAttribP3uiv glad_glVertexAttribP3uiv +GLAD_API_CALL PFNGLVERTEXATTRIBP4UIPROC glad_glVertexAttribP4ui; +#define glVertexAttribP4ui glad_glVertexAttribP4ui +GLAD_API_CALL PFNGLVERTEXATTRIBP4UIVPROC glad_glVertexAttribP4uiv; +#define glVertexAttribP4uiv glad_glVertexAttribP4uiv +GLAD_API_CALL PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer; +#define glVertexAttribPointer glad_glVertexAttribPointer +GLAD_API_CALL PFNGLVERTEXBINDINGDIVISORPROC glad_glVertexBindingDivisor; +#define glVertexBindingDivisor glad_glVertexBindingDivisor +GLAD_API_CALL PFNGLVIEWPORTPROC glad_glViewport; +#define glViewport glad_glViewport +GLAD_API_CALL PFNGLVIEWPORTARRAYVPROC glad_glViewportArrayv; +#define glViewportArrayv glad_glViewportArrayv +GLAD_API_CALL PFNGLVIEWPORTINDEXEDFPROC glad_glViewportIndexedf; +#define glViewportIndexedf glad_glViewportIndexedf +GLAD_API_CALL PFNGLVIEWPORTINDEXEDFVPROC glad_glViewportIndexedfv; +#define glViewportIndexedfv glad_glViewportIndexedfv +GLAD_API_CALL PFNGLWAITSYNCPROC glad_glWaitSync; +#define glWaitSync glad_glWaitSync + + + + + +GLAD_API_CALL int gladLoadGLUserPtr( GLADuserptrloadfunc load, void *userptr); +GLAD_API_CALL int gladLoadGL( GLADloadfunc load); + + +#ifdef GLAD_GL + +GLAD_API_CALL int gladLoaderLoadGL(void); +GLAD_API_CALL void gladLoaderUnloadGL(void); + +#endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/external/glad/src/egl.c b/external/glad/src/egl.c new file mode 100644 index 0000000..18a697e --- /dev/null +++ b/external/glad/src/egl.c @@ -0,0 +1,397 @@ +/** + * SPDX-License-Identifier: (WTFPL OR CC0-1.0) AND Apache-2.0 + */ +#include +#include +#include +#include + +#ifndef GLAD_IMPL_UTIL_C_ +#define GLAD_IMPL_UTIL_C_ + +#ifdef _MSC_VER +#define GLAD_IMPL_UTIL_SSCANF sscanf_s +#else +#define GLAD_IMPL_UTIL_SSCANF sscanf +#endif + +#endif /* GLAD_IMPL_UTIL_C_ */ + +#ifdef __cplusplus +extern "C" { +#endif + + + +int GLAD_EGL_VERSION_1_0 = 0; +int GLAD_EGL_VERSION_1_1 = 0; +int GLAD_EGL_VERSION_1_2 = 0; +int GLAD_EGL_VERSION_1_3 = 0; +int GLAD_EGL_VERSION_1_4 = 0; +int GLAD_EGL_VERSION_1_5 = 0; + + + +PFNEGLBINDAPIPROC glad_eglBindAPI = NULL; +PFNEGLBINDTEXIMAGEPROC glad_eglBindTexImage = NULL; +PFNEGLCHOOSECONFIGPROC glad_eglChooseConfig = NULL; +PFNEGLCLIENTWAITSYNCPROC glad_eglClientWaitSync = NULL; +PFNEGLCOPYBUFFERSPROC glad_eglCopyBuffers = NULL; +PFNEGLCREATECONTEXTPROC glad_eglCreateContext = NULL; +PFNEGLCREATEIMAGEPROC glad_eglCreateImage = NULL; +PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC glad_eglCreatePbufferFromClientBuffer = NULL; +PFNEGLCREATEPBUFFERSURFACEPROC glad_eglCreatePbufferSurface = NULL; +PFNEGLCREATEPIXMAPSURFACEPROC glad_eglCreatePixmapSurface = NULL; +PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC glad_eglCreatePlatformPixmapSurface = NULL; +PFNEGLCREATEPLATFORMWINDOWSURFACEPROC glad_eglCreatePlatformWindowSurface = NULL; +PFNEGLCREATESYNCPROC glad_eglCreateSync = NULL; +PFNEGLCREATEWINDOWSURFACEPROC glad_eglCreateWindowSurface = NULL; +PFNEGLDESTROYCONTEXTPROC glad_eglDestroyContext = NULL; +PFNEGLDESTROYIMAGEPROC glad_eglDestroyImage = NULL; +PFNEGLDESTROYSURFACEPROC glad_eglDestroySurface = NULL; +PFNEGLDESTROYSYNCPROC glad_eglDestroySync = NULL; +PFNEGLGETCONFIGATTRIBPROC glad_eglGetConfigAttrib = NULL; +PFNEGLGETCONFIGSPROC glad_eglGetConfigs = NULL; +PFNEGLGETCURRENTCONTEXTPROC glad_eglGetCurrentContext = NULL; +PFNEGLGETCURRENTDISPLAYPROC glad_eglGetCurrentDisplay = NULL; +PFNEGLGETCURRENTSURFACEPROC glad_eglGetCurrentSurface = NULL; +PFNEGLGETDISPLAYPROC glad_eglGetDisplay = NULL; +PFNEGLGETERRORPROC glad_eglGetError = NULL; +PFNEGLGETPLATFORMDISPLAYPROC glad_eglGetPlatformDisplay = NULL; +PFNEGLGETPROCADDRESSPROC glad_eglGetProcAddress = NULL; +PFNEGLGETSYNCATTRIBPROC glad_eglGetSyncAttrib = NULL; +PFNEGLINITIALIZEPROC glad_eglInitialize = NULL; +PFNEGLMAKECURRENTPROC glad_eglMakeCurrent = NULL; +PFNEGLQUERYAPIPROC glad_eglQueryAPI = NULL; +PFNEGLQUERYCONTEXTPROC glad_eglQueryContext = NULL; +PFNEGLQUERYSTRINGPROC glad_eglQueryString = NULL; +PFNEGLQUERYSURFACEPROC glad_eglQuerySurface = NULL; +PFNEGLRELEASETEXIMAGEPROC glad_eglReleaseTexImage = NULL; +PFNEGLRELEASETHREADPROC glad_eglReleaseThread = NULL; +PFNEGLSURFACEATTRIBPROC glad_eglSurfaceAttrib = NULL; +PFNEGLSWAPBUFFERSPROC glad_eglSwapBuffers = NULL; +PFNEGLSWAPINTERVALPROC glad_eglSwapInterval = NULL; +PFNEGLTERMINATEPROC glad_eglTerminate = NULL; +PFNEGLWAITCLIENTPROC glad_eglWaitClient = NULL; +PFNEGLWAITGLPROC glad_eglWaitGL = NULL; +PFNEGLWAITNATIVEPROC glad_eglWaitNative = NULL; +PFNEGLWAITSYNCPROC glad_eglWaitSync = NULL; + + +static void glad_egl_load_EGL_VERSION_1_0( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_EGL_VERSION_1_0) return; + glad_eglChooseConfig = (PFNEGLCHOOSECONFIGPROC) load(userptr, "eglChooseConfig"); + glad_eglCopyBuffers = (PFNEGLCOPYBUFFERSPROC) load(userptr, "eglCopyBuffers"); + glad_eglCreateContext = (PFNEGLCREATECONTEXTPROC) load(userptr, "eglCreateContext"); + glad_eglCreatePbufferSurface = (PFNEGLCREATEPBUFFERSURFACEPROC) load(userptr, "eglCreatePbufferSurface"); + glad_eglCreatePixmapSurface = (PFNEGLCREATEPIXMAPSURFACEPROC) load(userptr, "eglCreatePixmapSurface"); + glad_eglCreateWindowSurface = (PFNEGLCREATEWINDOWSURFACEPROC) load(userptr, "eglCreateWindowSurface"); + glad_eglDestroyContext = (PFNEGLDESTROYCONTEXTPROC) load(userptr, "eglDestroyContext"); + glad_eglDestroySurface = (PFNEGLDESTROYSURFACEPROC) load(userptr, "eglDestroySurface"); + glad_eglGetConfigAttrib = (PFNEGLGETCONFIGATTRIBPROC) load(userptr, "eglGetConfigAttrib"); + glad_eglGetConfigs = (PFNEGLGETCONFIGSPROC) load(userptr, "eglGetConfigs"); + glad_eglGetCurrentDisplay = (PFNEGLGETCURRENTDISPLAYPROC) load(userptr, "eglGetCurrentDisplay"); + glad_eglGetCurrentSurface = (PFNEGLGETCURRENTSURFACEPROC) load(userptr, "eglGetCurrentSurface"); + glad_eglGetDisplay = (PFNEGLGETDISPLAYPROC) load(userptr, "eglGetDisplay"); + glad_eglGetError = (PFNEGLGETERRORPROC) load(userptr, "eglGetError"); + glad_eglGetProcAddress = (PFNEGLGETPROCADDRESSPROC) load(userptr, "eglGetProcAddress"); + glad_eglInitialize = (PFNEGLINITIALIZEPROC) load(userptr, "eglInitialize"); + glad_eglMakeCurrent = (PFNEGLMAKECURRENTPROC) load(userptr, "eglMakeCurrent"); + glad_eglQueryContext = (PFNEGLQUERYCONTEXTPROC) load(userptr, "eglQueryContext"); + glad_eglQueryString = (PFNEGLQUERYSTRINGPROC) load(userptr, "eglQueryString"); + glad_eglQuerySurface = (PFNEGLQUERYSURFACEPROC) load(userptr, "eglQuerySurface"); + glad_eglSwapBuffers = (PFNEGLSWAPBUFFERSPROC) load(userptr, "eglSwapBuffers"); + glad_eglTerminate = (PFNEGLTERMINATEPROC) load(userptr, "eglTerminate"); + glad_eglWaitGL = (PFNEGLWAITGLPROC) load(userptr, "eglWaitGL"); + glad_eglWaitNative = (PFNEGLWAITNATIVEPROC) load(userptr, "eglWaitNative"); +} +static void glad_egl_load_EGL_VERSION_1_1( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_EGL_VERSION_1_1) return; + glad_eglBindTexImage = (PFNEGLBINDTEXIMAGEPROC) load(userptr, "eglBindTexImage"); + glad_eglReleaseTexImage = (PFNEGLRELEASETEXIMAGEPROC) load(userptr, "eglReleaseTexImage"); + glad_eglSurfaceAttrib = (PFNEGLSURFACEATTRIBPROC) load(userptr, "eglSurfaceAttrib"); + glad_eglSwapInterval = (PFNEGLSWAPINTERVALPROC) load(userptr, "eglSwapInterval"); +} +static void glad_egl_load_EGL_VERSION_1_2( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_EGL_VERSION_1_2) return; + glad_eglBindAPI = (PFNEGLBINDAPIPROC) load(userptr, "eglBindAPI"); + glad_eglCreatePbufferFromClientBuffer = (PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC) load(userptr, "eglCreatePbufferFromClientBuffer"); + glad_eglQueryAPI = (PFNEGLQUERYAPIPROC) load(userptr, "eglQueryAPI"); + glad_eglReleaseThread = (PFNEGLRELEASETHREADPROC) load(userptr, "eglReleaseThread"); + glad_eglWaitClient = (PFNEGLWAITCLIENTPROC) load(userptr, "eglWaitClient"); +} +static void glad_egl_load_EGL_VERSION_1_4( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_EGL_VERSION_1_4) return; + glad_eglGetCurrentContext = (PFNEGLGETCURRENTCONTEXTPROC) load(userptr, "eglGetCurrentContext"); +} +static void glad_egl_load_EGL_VERSION_1_5( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_EGL_VERSION_1_5) return; + glad_eglClientWaitSync = (PFNEGLCLIENTWAITSYNCPROC) load(userptr, "eglClientWaitSync"); + glad_eglCreateImage = (PFNEGLCREATEIMAGEPROC) load(userptr, "eglCreateImage"); + glad_eglCreatePlatformPixmapSurface = (PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC) load(userptr, "eglCreatePlatformPixmapSurface"); + glad_eglCreatePlatformWindowSurface = (PFNEGLCREATEPLATFORMWINDOWSURFACEPROC) load(userptr, "eglCreatePlatformWindowSurface"); + glad_eglCreateSync = (PFNEGLCREATESYNCPROC) load(userptr, "eglCreateSync"); + glad_eglDestroyImage = (PFNEGLDESTROYIMAGEPROC) load(userptr, "eglDestroyImage"); + glad_eglDestroySync = (PFNEGLDESTROYSYNCPROC) load(userptr, "eglDestroySync"); + glad_eglGetPlatformDisplay = (PFNEGLGETPLATFORMDISPLAYPROC) load(userptr, "eglGetPlatformDisplay"); + glad_eglGetSyncAttrib = (PFNEGLGETSYNCATTRIBPROC) load(userptr, "eglGetSyncAttrib"); + glad_eglWaitSync = (PFNEGLWAITSYNCPROC) load(userptr, "eglWaitSync"); +} + + + +static int glad_egl_get_extensions(EGLDisplay display, const char **extensions) { + *extensions = eglQueryString(display, EGL_EXTENSIONS); + + return extensions != NULL; +} + +static int glad_egl_has_extension(const char *extensions, const char *ext) { + const char *loc; + const char *terminator; + if(extensions == NULL) { + return 0; + } + while(1) { + loc = strstr(extensions, ext); + if(loc == NULL) { + return 0; + } + terminator = loc + strlen(ext); + if((loc == extensions || *(loc - 1) == ' ') && + (*terminator == ' ' || *terminator == '\0')) { + return 1; + } + extensions = terminator; + } +} + +static GLADapiproc glad_egl_get_proc_from_userptr(void *userptr, const char *name) { + return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name); +} + +static int glad_egl_find_extensions_egl(EGLDisplay display) { + const char *extensions; + if (!glad_egl_get_extensions(display, &extensions)) return 0; + + GLAD_UNUSED(&glad_egl_has_extension); + + return 1; +} + +static int glad_egl_find_core_egl(EGLDisplay display) { + int major, minor; + const char *version; + + if (display == NULL) { + display = EGL_NO_DISPLAY; /* this is usually NULL, better safe than sorry */ + } + if (display == EGL_NO_DISPLAY) { + display = eglGetCurrentDisplay(); + } +#ifdef EGL_VERSION_1_4 + if (display == EGL_NO_DISPLAY) { + display = eglGetDisplay(EGL_DEFAULT_DISPLAY); + } +#endif +#ifndef EGL_VERSION_1_5 + if (display == EGL_NO_DISPLAY) { + return 0; + } +#endif + + version = eglQueryString(display, EGL_VERSION); + (void) eglGetError(); + + if (version == NULL) { + major = 1; + minor = 0; + } else { + GLAD_IMPL_UTIL_SSCANF(version, "%d.%d", &major, &minor); + } + + GLAD_EGL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1; + GLAD_EGL_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1; + GLAD_EGL_VERSION_1_2 = (major == 1 && minor >= 2) || major > 1; + GLAD_EGL_VERSION_1_3 = (major == 1 && minor >= 3) || major > 1; + GLAD_EGL_VERSION_1_4 = (major == 1 && minor >= 4) || major > 1; + GLAD_EGL_VERSION_1_5 = (major == 1 && minor >= 5) || major > 1; + + return GLAD_MAKE_VERSION(major, minor); +} + +int gladLoadEGLUserPtr(EGLDisplay display, GLADuserptrloadfunc load, void* userptr) { + int version; + eglGetDisplay = (PFNEGLGETDISPLAYPROC) load(userptr, "eglGetDisplay"); + eglGetCurrentDisplay = (PFNEGLGETCURRENTDISPLAYPROC) load(userptr, "eglGetCurrentDisplay"); + eglQueryString = (PFNEGLQUERYSTRINGPROC) load(userptr, "eglQueryString"); + eglGetError = (PFNEGLGETERRORPROC) load(userptr, "eglGetError"); + if (eglGetDisplay == NULL || eglGetCurrentDisplay == NULL || eglQueryString == NULL || eglGetError == NULL) return 0; + + version = glad_egl_find_core_egl(display); + if (!version) return 0; + glad_egl_load_EGL_VERSION_1_0(load, userptr); + glad_egl_load_EGL_VERSION_1_1(load, userptr); + glad_egl_load_EGL_VERSION_1_2(load, userptr); + glad_egl_load_EGL_VERSION_1_4(load, userptr); + glad_egl_load_EGL_VERSION_1_5(load, userptr); + + if (!glad_egl_find_extensions_egl(display)) return 0; + + + return version; +} + +int gladLoadEGL(EGLDisplay display, GLADloadfunc load) { + return gladLoadEGLUserPtr(display, glad_egl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load); +} + + + +#ifdef GLAD_EGL + +#ifndef GLAD_LOADER_LIBRARY_C_ +#define GLAD_LOADER_LIBRARY_C_ + +#include +#include + +#if GLAD_PLATFORM_WIN32 +#include +#else +#include +#endif + + +static void* glad_get_dlopen_handle(const char *lib_names[], int length) { + void *handle = NULL; + int i; + + for (i = 0; i < length; ++i) { +#if GLAD_PLATFORM_WIN32 + #if GLAD_PLATFORM_UWP + size_t buffer_size = (strlen(lib_names[i]) + 1) * sizeof(WCHAR); + LPWSTR buffer = (LPWSTR) malloc(buffer_size); + if (buffer != NULL) { + int ret = MultiByteToWideChar(CP_ACP, 0, lib_names[i], -1, buffer, buffer_size); + if (ret != 0) { + handle = (void*) LoadPackagedLibrary(buffer, 0); + } + free((void*) buffer); + } + #else + handle = (void*) LoadLibraryA(lib_names[i]); + #endif +#else + handle = dlopen(lib_names[i], RTLD_LAZY | RTLD_LOCAL); +#endif + if (handle != NULL) { + return handle; + } + } + + return NULL; +} + +static void glad_close_dlopen_handle(void* handle) { + if (handle != NULL) { +#if GLAD_PLATFORM_WIN32 + FreeLibrary((HMODULE) handle); +#else + dlclose(handle); +#endif + } +} + +static GLADapiproc glad_dlsym_handle(void* handle, const char *name) { + if (handle == NULL) { + return NULL; + } + +#if GLAD_PLATFORM_WIN32 + return (GLADapiproc) GetProcAddress((HMODULE) handle, name); +#else + return GLAD_GNUC_EXTENSION (GLADapiproc) dlsym(handle, name); +#endif +} + +#endif /* GLAD_LOADER_LIBRARY_C_ */ + +struct _glad_egl_userptr { + void *handle; + PFNEGLGETPROCADDRESSPROC get_proc_address_ptr; +}; + +static GLADapiproc glad_egl_get_proc(void *vuserptr, const char* name) { + struct _glad_egl_userptr userptr = *(struct _glad_egl_userptr*) vuserptr; + GLADapiproc result = NULL; + + result = glad_dlsym_handle(userptr.handle, name); + if (result == NULL) { + result = GLAD_GNUC_EXTENSION (GLADapiproc) userptr.get_proc_address_ptr(name); + } + + return result; +} + +static void* _egl_handle = NULL; + +static void* glad_egl_dlopen_handle(void) { +#if GLAD_PLATFORM_APPLE + static const char *NAMES[] = {"libEGL.dylib"}; +#elif GLAD_PLATFORM_WIN32 + static const char *NAMES[] = {"libEGL.dll", "EGL.dll"}; +#else + static const char *NAMES[] = {"libEGL.so.1", "libEGL.so"}; +#endif + + if (_egl_handle == NULL) { + _egl_handle = glad_get_dlopen_handle(NAMES, sizeof(NAMES) / sizeof(NAMES[0])); + } + + return _egl_handle; +} + +static struct _glad_egl_userptr glad_egl_build_userptr(void *handle) { + struct _glad_egl_userptr userptr; + userptr.handle = handle; + userptr.get_proc_address_ptr = (PFNEGLGETPROCADDRESSPROC) glad_dlsym_handle(handle, "eglGetProcAddress"); + return userptr; +} + +int gladLoaderLoadEGL(EGLDisplay display) { + int version = 0; + void *handle = NULL; + int did_load = 0; + struct _glad_egl_userptr userptr; + + did_load = _egl_handle == NULL; + handle = glad_egl_dlopen_handle(); + if (handle != NULL) { + userptr = glad_egl_build_userptr(handle); + + if (userptr.get_proc_address_ptr != NULL) { + version = gladLoadEGLUserPtr(display, glad_egl_get_proc, &userptr); + } + + if (!version && did_load) { + gladLoaderUnloadEGL(); + } + } + + return version; +} + + +void gladLoaderUnloadEGL(void) { + if (_egl_handle != NULL) { + glad_close_dlopen_handle(_egl_handle); + _egl_handle = NULL; + } +} + +#endif /* GLAD_EGL */ + +#ifdef __cplusplus +} +#endif diff --git a/external/glad/src/gl.c b/external/glad/src/gl.c new file mode 100644 index 0000000..4589f48 --- /dev/null +++ b/external/glad/src/gl.c @@ -0,0 +1,1786 @@ +/** + * SPDX-License-Identifier: (WTFPL OR CC0-1.0) AND Apache-2.0 + */ +#include +#include +#include +#include + +#ifndef GLAD_IMPL_UTIL_C_ +#define GLAD_IMPL_UTIL_C_ + +#ifdef _MSC_VER +#define GLAD_IMPL_UTIL_SSCANF sscanf_s +#else +#define GLAD_IMPL_UTIL_SSCANF sscanf +#endif + +#endif /* GLAD_IMPL_UTIL_C_ */ + +#ifdef __cplusplus +extern "C" { +#endif + + + +int GLAD_GL_VERSION_1_0 = 0; +int GLAD_GL_VERSION_1_1 = 0; +int GLAD_GL_VERSION_1_2 = 0; +int GLAD_GL_VERSION_1_3 = 0; +int GLAD_GL_VERSION_1_4 = 0; +int GLAD_GL_VERSION_1_5 = 0; +int GLAD_GL_VERSION_2_0 = 0; +int GLAD_GL_VERSION_2_1 = 0; +int GLAD_GL_VERSION_3_0 = 0; +int GLAD_GL_VERSION_3_1 = 0; +int GLAD_GL_VERSION_3_2 = 0; +int GLAD_GL_VERSION_3_3 = 0; +int GLAD_GL_VERSION_4_0 = 0; +int GLAD_GL_VERSION_4_1 = 0; +int GLAD_GL_VERSION_4_2 = 0; +int GLAD_GL_VERSION_4_3 = 0; +int GLAD_GL_VERSION_4_4 = 0; +int GLAD_GL_VERSION_4_5 = 0; +int GLAD_GL_VERSION_4_6 = 0; + + + +PFNGLACTIVESHADERPROGRAMPROC glad_glActiveShaderProgram = NULL; +PFNGLACTIVETEXTUREPROC glad_glActiveTexture = NULL; +PFNGLATTACHSHADERPROC glad_glAttachShader = NULL; +PFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender = NULL; +PFNGLBEGINQUERYPROC glad_glBeginQuery = NULL; +PFNGLBEGINQUERYINDEXEDPROC glad_glBeginQueryIndexed = NULL; +PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback = NULL; +PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation = NULL; +PFNGLBINDBUFFERPROC glad_glBindBuffer = NULL; +PFNGLBINDBUFFERBASEPROC glad_glBindBufferBase = NULL; +PFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange = NULL; +PFNGLBINDBUFFERSBASEPROC glad_glBindBuffersBase = NULL; +PFNGLBINDBUFFERSRANGEPROC glad_glBindBuffersRange = NULL; +PFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation = NULL; +PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glad_glBindFragDataLocationIndexed = NULL; +PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer = NULL; +PFNGLBINDIMAGETEXTUREPROC glad_glBindImageTexture = NULL; +PFNGLBINDIMAGETEXTURESPROC glad_glBindImageTextures = NULL; +PFNGLBINDPROGRAMPIPELINEPROC glad_glBindProgramPipeline = NULL; +PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer = NULL; +PFNGLBINDSAMPLERPROC glad_glBindSampler = NULL; +PFNGLBINDSAMPLERSPROC glad_glBindSamplers = NULL; +PFNGLBINDTEXTUREPROC glad_glBindTexture = NULL; +PFNGLBINDTEXTUREUNITPROC glad_glBindTextureUnit = NULL; +PFNGLBINDTEXTURESPROC glad_glBindTextures = NULL; +PFNGLBINDTRANSFORMFEEDBACKPROC glad_glBindTransformFeedback = NULL; +PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray = NULL; +PFNGLBINDVERTEXBUFFERPROC glad_glBindVertexBuffer = NULL; +PFNGLBINDVERTEXBUFFERSPROC glad_glBindVertexBuffers = NULL; +PFNGLBLENDCOLORPROC glad_glBlendColor = NULL; +PFNGLBLENDEQUATIONPROC glad_glBlendEquation = NULL; +PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate = NULL; +PFNGLBLENDEQUATIONSEPARATEIPROC glad_glBlendEquationSeparatei = NULL; +PFNGLBLENDEQUATIONIPROC glad_glBlendEquationi = NULL; +PFNGLBLENDFUNCPROC glad_glBlendFunc = NULL; +PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate = NULL; +PFNGLBLENDFUNCSEPARATEIPROC glad_glBlendFuncSeparatei = NULL; +PFNGLBLENDFUNCIPROC glad_glBlendFunci = NULL; +PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer = NULL; +PFNGLBLITNAMEDFRAMEBUFFERPROC glad_glBlitNamedFramebuffer = NULL; +PFNGLBUFFERDATAPROC glad_glBufferData = NULL; +PFNGLBUFFERSTORAGEPROC glad_glBufferStorage = NULL; +PFNGLBUFFERSUBDATAPROC glad_glBufferSubData = NULL; +PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus = NULL; +PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC glad_glCheckNamedFramebufferStatus = NULL; +PFNGLCLAMPCOLORPROC glad_glClampColor = NULL; +PFNGLCLEARPROC glad_glClear = NULL; +PFNGLCLEARBUFFERDATAPROC glad_glClearBufferData = NULL; +PFNGLCLEARBUFFERSUBDATAPROC glad_glClearBufferSubData = NULL; +PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi = NULL; +PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv = NULL; +PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv = NULL; +PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv = NULL; +PFNGLCLEARCOLORPROC glad_glClearColor = NULL; +PFNGLCLEARDEPTHPROC glad_glClearDepth = NULL; +PFNGLCLEARDEPTHFPROC glad_glClearDepthf = NULL; +PFNGLCLEARNAMEDBUFFERDATAPROC glad_glClearNamedBufferData = NULL; +PFNGLCLEARNAMEDBUFFERSUBDATAPROC glad_glClearNamedBufferSubData = NULL; +PFNGLCLEARNAMEDFRAMEBUFFERFIPROC glad_glClearNamedFramebufferfi = NULL; +PFNGLCLEARNAMEDFRAMEBUFFERFVPROC glad_glClearNamedFramebufferfv = NULL; +PFNGLCLEARNAMEDFRAMEBUFFERIVPROC glad_glClearNamedFramebufferiv = NULL; +PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC glad_glClearNamedFramebufferuiv = NULL; +PFNGLCLEARSTENCILPROC glad_glClearStencil = NULL; +PFNGLCLEARTEXIMAGEPROC glad_glClearTexImage = NULL; +PFNGLCLEARTEXSUBIMAGEPROC glad_glClearTexSubImage = NULL; +PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync = NULL; +PFNGLCLIPCONTROLPROC glad_glClipControl = NULL; +PFNGLCOLORMASKPROC glad_glColorMask = NULL; +PFNGLCOLORMASKIPROC glad_glColorMaski = NULL; +PFNGLCOMPILESHADERPROC glad_glCompileShader = NULL; +PFNGLCOMPRESSEDTEXIMAGE1DPROC glad_glCompressedTexImage1D = NULL; +PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D = NULL; +PFNGLCOMPRESSEDTEXIMAGE3DPROC glad_glCompressedTexImage3D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glad_glCompressedTexSubImage1D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D = NULL; +PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC glad_glCompressedTextureSubImage1D = NULL; +PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC glad_glCompressedTextureSubImage2D = NULL; +PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC glad_glCompressedTextureSubImage3D = NULL; +PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData = NULL; +PFNGLCOPYIMAGESUBDATAPROC glad_glCopyImageSubData = NULL; +PFNGLCOPYNAMEDBUFFERSUBDATAPROC glad_glCopyNamedBufferSubData = NULL; +PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D = NULL; +PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D = NULL; +PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D = NULL; +PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D = NULL; +PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D = NULL; +PFNGLCOPYTEXTURESUBIMAGE1DPROC glad_glCopyTextureSubImage1D = NULL; +PFNGLCOPYTEXTURESUBIMAGE2DPROC glad_glCopyTextureSubImage2D = NULL; +PFNGLCOPYTEXTURESUBIMAGE3DPROC glad_glCopyTextureSubImage3D = NULL; +PFNGLCREATEBUFFERSPROC glad_glCreateBuffers = NULL; +PFNGLCREATEFRAMEBUFFERSPROC glad_glCreateFramebuffers = NULL; +PFNGLCREATEPROGRAMPROC glad_glCreateProgram = NULL; +PFNGLCREATEPROGRAMPIPELINESPROC glad_glCreateProgramPipelines = NULL; +PFNGLCREATEQUERIESPROC glad_glCreateQueries = NULL; +PFNGLCREATERENDERBUFFERSPROC glad_glCreateRenderbuffers = NULL; +PFNGLCREATESAMPLERSPROC glad_glCreateSamplers = NULL; +PFNGLCREATESHADERPROC glad_glCreateShader = NULL; +PFNGLCREATESHADERPROGRAMVPROC glad_glCreateShaderProgramv = NULL; +PFNGLCREATETEXTURESPROC glad_glCreateTextures = NULL; +PFNGLCREATETRANSFORMFEEDBACKSPROC glad_glCreateTransformFeedbacks = NULL; +PFNGLCREATEVERTEXARRAYSPROC glad_glCreateVertexArrays = NULL; +PFNGLCULLFACEPROC glad_glCullFace = NULL; +PFNGLDEBUGMESSAGECALLBACKPROC glad_glDebugMessageCallback = NULL; +PFNGLDEBUGMESSAGECONTROLPROC glad_glDebugMessageControl = NULL; +PFNGLDEBUGMESSAGEINSERTPROC glad_glDebugMessageInsert = NULL; +PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers = NULL; +PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers = NULL; +PFNGLDELETEPROGRAMPROC glad_glDeleteProgram = NULL; +PFNGLDELETEPROGRAMPIPELINESPROC glad_glDeleteProgramPipelines = NULL; +PFNGLDELETEQUERIESPROC glad_glDeleteQueries = NULL; +PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers = NULL; +PFNGLDELETESAMPLERSPROC glad_glDeleteSamplers = NULL; +PFNGLDELETESHADERPROC glad_glDeleteShader = NULL; +PFNGLDELETESYNCPROC glad_glDeleteSync = NULL; +PFNGLDELETETEXTURESPROC glad_glDeleteTextures = NULL; +PFNGLDELETETRANSFORMFEEDBACKSPROC glad_glDeleteTransformFeedbacks = NULL; +PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays = NULL; +PFNGLDEPTHFUNCPROC glad_glDepthFunc = NULL; +PFNGLDEPTHMASKPROC glad_glDepthMask = NULL; +PFNGLDEPTHRANGEPROC glad_glDepthRange = NULL; +PFNGLDEPTHRANGEARRAYVPROC glad_glDepthRangeArrayv = NULL; +PFNGLDEPTHRANGEINDEXEDPROC glad_glDepthRangeIndexed = NULL; +PFNGLDEPTHRANGEFPROC glad_glDepthRangef = NULL; +PFNGLDETACHSHADERPROC glad_glDetachShader = NULL; +PFNGLDISABLEPROC glad_glDisable = NULL; +PFNGLDISABLEVERTEXARRAYATTRIBPROC glad_glDisableVertexArrayAttrib = NULL; +PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray = NULL; +PFNGLDISABLEIPROC glad_glDisablei = NULL; +PFNGLDISPATCHCOMPUTEPROC glad_glDispatchCompute = NULL; +PFNGLDISPATCHCOMPUTEINDIRECTPROC glad_glDispatchComputeIndirect = NULL; +PFNGLDRAWARRAYSPROC glad_glDrawArrays = NULL; +PFNGLDRAWARRAYSINDIRECTPROC glad_glDrawArraysIndirect = NULL; +PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced = NULL; +PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC glad_glDrawArraysInstancedBaseInstance = NULL; +PFNGLDRAWBUFFERPROC glad_glDrawBuffer = NULL; +PFNGLDRAWBUFFERSPROC glad_glDrawBuffers = NULL; +PFNGLDRAWELEMENTSPROC glad_glDrawElements = NULL; +PFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex = NULL; +PFNGLDRAWELEMENTSINDIRECTPROC glad_glDrawElementsIndirect = NULL; +PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced = NULL; +PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC glad_glDrawElementsInstancedBaseInstance = NULL; +PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex = NULL; +PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC glad_glDrawElementsInstancedBaseVertexBaseInstance = NULL; +PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements = NULL; +PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex = NULL; +PFNGLDRAWTRANSFORMFEEDBACKPROC glad_glDrawTransformFeedback = NULL; +PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC glad_glDrawTransformFeedbackInstanced = NULL; +PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC glad_glDrawTransformFeedbackStream = NULL; +PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC glad_glDrawTransformFeedbackStreamInstanced = NULL; +PFNGLENABLEPROC glad_glEnable = NULL; +PFNGLENABLEVERTEXARRAYATTRIBPROC glad_glEnableVertexArrayAttrib = NULL; +PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray = NULL; +PFNGLENABLEIPROC glad_glEnablei = NULL; +PFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender = NULL; +PFNGLENDQUERYPROC glad_glEndQuery = NULL; +PFNGLENDQUERYINDEXEDPROC glad_glEndQueryIndexed = NULL; +PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback = NULL; +PFNGLFENCESYNCPROC glad_glFenceSync = NULL; +PFNGLFINISHPROC glad_glFinish = NULL; +PFNGLFLUSHPROC glad_glFlush = NULL; +PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange = NULL; +PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC glad_glFlushMappedNamedBufferRange = NULL; +PFNGLFRAMEBUFFERPARAMETERIPROC glad_glFramebufferParameteri = NULL; +PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer = NULL; +PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture = NULL; +PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D = NULL; +PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D = NULL; +PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D = NULL; +PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer = NULL; +PFNGLFRONTFACEPROC glad_glFrontFace = NULL; +PFNGLGENBUFFERSPROC glad_glGenBuffers = NULL; +PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers = NULL; +PFNGLGENPROGRAMPIPELINESPROC glad_glGenProgramPipelines = NULL; +PFNGLGENQUERIESPROC glad_glGenQueries = NULL; +PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers = NULL; +PFNGLGENSAMPLERSPROC glad_glGenSamplers = NULL; +PFNGLGENTEXTURESPROC glad_glGenTextures = NULL; +PFNGLGENTRANSFORMFEEDBACKSPROC glad_glGenTransformFeedbacks = NULL; +PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays = NULL; +PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap = NULL; +PFNGLGENERATETEXTUREMIPMAPPROC glad_glGenerateTextureMipmap = NULL; +PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC glad_glGetActiveAtomicCounterBufferiv = NULL; +PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib = NULL; +PFNGLGETACTIVESUBROUTINENAMEPROC glad_glGetActiveSubroutineName = NULL; +PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC glad_glGetActiveSubroutineUniformName = NULL; +PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC glad_glGetActiveSubroutineUniformiv = NULL; +PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform = NULL; +PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName = NULL; +PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv = NULL; +PFNGLGETACTIVEUNIFORMNAMEPROC glad_glGetActiveUniformName = NULL; +PFNGLGETACTIVEUNIFORMSIVPROC glad_glGetActiveUniformsiv = NULL; +PFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders = NULL; +PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation = NULL; +PFNGLGETBOOLEANI_VPROC glad_glGetBooleani_v = NULL; +PFNGLGETBOOLEANVPROC glad_glGetBooleanv = NULL; +PFNGLGETBUFFERPARAMETERI64VPROC glad_glGetBufferParameteri64v = NULL; +PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv = NULL; +PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv = NULL; +PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData = NULL; +PFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage = NULL; +PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC glad_glGetCompressedTextureImage = NULL; +PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC glad_glGetCompressedTextureSubImage = NULL; +PFNGLGETDEBUGMESSAGELOGPROC glad_glGetDebugMessageLog = NULL; +PFNGLGETDOUBLEI_VPROC glad_glGetDoublei_v = NULL; +PFNGLGETDOUBLEVPROC glad_glGetDoublev = NULL; +PFNGLGETERRORPROC glad_glGetError = NULL; +PFNGLGETFLOATI_VPROC glad_glGetFloati_v = NULL; +PFNGLGETFLOATVPROC glad_glGetFloatv = NULL; +PFNGLGETFRAGDATAINDEXPROC glad_glGetFragDataIndex = NULL; +PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation = NULL; +PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv = NULL; +PFNGLGETFRAMEBUFFERPARAMETERIVPROC glad_glGetFramebufferParameteriv = NULL; +PFNGLGETGRAPHICSRESETSTATUSPROC glad_glGetGraphicsResetStatus = NULL; +PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v = NULL; +PFNGLGETINTEGER64VPROC glad_glGetInteger64v = NULL; +PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v = NULL; +PFNGLGETINTEGERVPROC glad_glGetIntegerv = NULL; +PFNGLGETINTERNALFORMATI64VPROC glad_glGetInternalformati64v = NULL; +PFNGLGETINTERNALFORMATIVPROC glad_glGetInternalformativ = NULL; +PFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv = NULL; +PFNGLGETNAMEDBUFFERPARAMETERI64VPROC glad_glGetNamedBufferParameteri64v = NULL; +PFNGLGETNAMEDBUFFERPARAMETERIVPROC glad_glGetNamedBufferParameteriv = NULL; +PFNGLGETNAMEDBUFFERPOINTERVPROC glad_glGetNamedBufferPointerv = NULL; +PFNGLGETNAMEDBUFFERSUBDATAPROC glad_glGetNamedBufferSubData = NULL; +PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetNamedFramebufferAttachmentParameteriv = NULL; +PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC glad_glGetNamedFramebufferParameteriv = NULL; +PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC glad_glGetNamedRenderbufferParameteriv = NULL; +PFNGLGETOBJECTLABELPROC glad_glGetObjectLabel = NULL; +PFNGLGETOBJECTPTRLABELPROC glad_glGetObjectPtrLabel = NULL; +PFNGLGETPOINTERVPROC glad_glGetPointerv = NULL; +PFNGLGETPROGRAMBINARYPROC glad_glGetProgramBinary = NULL; +PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog = NULL; +PFNGLGETPROGRAMINTERFACEIVPROC glad_glGetProgramInterfaceiv = NULL; +PFNGLGETPROGRAMPIPELINEINFOLOGPROC glad_glGetProgramPipelineInfoLog = NULL; +PFNGLGETPROGRAMPIPELINEIVPROC glad_glGetProgramPipelineiv = NULL; +PFNGLGETPROGRAMRESOURCEINDEXPROC glad_glGetProgramResourceIndex = NULL; +PFNGLGETPROGRAMRESOURCELOCATIONPROC glad_glGetProgramResourceLocation = NULL; +PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC glad_glGetProgramResourceLocationIndex = NULL; +PFNGLGETPROGRAMRESOURCENAMEPROC glad_glGetProgramResourceName = NULL; +PFNGLGETPROGRAMRESOURCEIVPROC glad_glGetProgramResourceiv = NULL; +PFNGLGETPROGRAMSTAGEIVPROC glad_glGetProgramStageiv = NULL; +PFNGLGETPROGRAMIVPROC glad_glGetProgramiv = NULL; +PFNGLGETQUERYBUFFEROBJECTI64VPROC glad_glGetQueryBufferObjecti64v = NULL; +PFNGLGETQUERYBUFFEROBJECTIVPROC glad_glGetQueryBufferObjectiv = NULL; +PFNGLGETQUERYBUFFEROBJECTUI64VPROC glad_glGetQueryBufferObjectui64v = NULL; +PFNGLGETQUERYBUFFEROBJECTUIVPROC glad_glGetQueryBufferObjectuiv = NULL; +PFNGLGETQUERYINDEXEDIVPROC glad_glGetQueryIndexediv = NULL; +PFNGLGETQUERYOBJECTI64VPROC glad_glGetQueryObjecti64v = NULL; +PFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv = NULL; +PFNGLGETQUERYOBJECTUI64VPROC glad_glGetQueryObjectui64v = NULL; +PFNGLGETQUERYOBJECTUIVPROC glad_glGetQueryObjectuiv = NULL; +PFNGLGETQUERYIVPROC glad_glGetQueryiv = NULL; +PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv = NULL; +PFNGLGETSAMPLERPARAMETERIIVPROC glad_glGetSamplerParameterIiv = NULL; +PFNGLGETSAMPLERPARAMETERIUIVPROC glad_glGetSamplerParameterIuiv = NULL; +PFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv = NULL; +PFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv = NULL; +PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog = NULL; +PFNGLGETSHADERPRECISIONFORMATPROC glad_glGetShaderPrecisionFormat = NULL; +PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource = NULL; +PFNGLGETSHADERIVPROC glad_glGetShaderiv = NULL; +PFNGLGETSTRINGPROC glad_glGetString = NULL; +PFNGLGETSTRINGIPROC glad_glGetStringi = NULL; +PFNGLGETSUBROUTINEINDEXPROC glad_glGetSubroutineIndex = NULL; +PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC glad_glGetSubroutineUniformLocation = NULL; +PFNGLGETSYNCIVPROC glad_glGetSynciv = NULL; +PFNGLGETTEXIMAGEPROC glad_glGetTexImage = NULL; +PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv = NULL; +PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv = NULL; +PFNGLGETTEXPARAMETERIIVPROC glad_glGetTexParameterIiv = NULL; +PFNGLGETTEXPARAMETERIUIVPROC glad_glGetTexParameterIuiv = NULL; +PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv = NULL; +PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv = NULL; +PFNGLGETTEXTUREIMAGEPROC glad_glGetTextureImage = NULL; +PFNGLGETTEXTURELEVELPARAMETERFVPROC glad_glGetTextureLevelParameterfv = NULL; +PFNGLGETTEXTURELEVELPARAMETERIVPROC glad_glGetTextureLevelParameteriv = NULL; +PFNGLGETTEXTUREPARAMETERIIVPROC glad_glGetTextureParameterIiv = NULL; +PFNGLGETTEXTUREPARAMETERIUIVPROC glad_glGetTextureParameterIuiv = NULL; +PFNGLGETTEXTUREPARAMETERFVPROC glad_glGetTextureParameterfv = NULL; +PFNGLGETTEXTUREPARAMETERIVPROC glad_glGetTextureParameteriv = NULL; +PFNGLGETTEXTURESUBIMAGEPROC glad_glGetTextureSubImage = NULL; +PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying = NULL; +PFNGLGETTRANSFORMFEEDBACKI64_VPROC glad_glGetTransformFeedbacki64_v = NULL; +PFNGLGETTRANSFORMFEEDBACKI_VPROC glad_glGetTransformFeedbacki_v = NULL; +PFNGLGETTRANSFORMFEEDBACKIVPROC glad_glGetTransformFeedbackiv = NULL; +PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex = NULL; +PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices = NULL; +PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation = NULL; +PFNGLGETUNIFORMSUBROUTINEUIVPROC glad_glGetUniformSubroutineuiv = NULL; +PFNGLGETUNIFORMDVPROC glad_glGetUniformdv = NULL; +PFNGLGETUNIFORMFVPROC glad_glGetUniformfv = NULL; +PFNGLGETUNIFORMIVPROC glad_glGetUniformiv = NULL; +PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv = NULL; +PFNGLGETVERTEXARRAYINDEXED64IVPROC glad_glGetVertexArrayIndexed64iv = NULL; +PFNGLGETVERTEXARRAYINDEXEDIVPROC glad_glGetVertexArrayIndexediv = NULL; +PFNGLGETVERTEXARRAYIVPROC glad_glGetVertexArrayiv = NULL; +PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv = NULL; +PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv = NULL; +PFNGLGETVERTEXATTRIBLDVPROC glad_glGetVertexAttribLdv = NULL; +PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv = NULL; +PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv = NULL; +PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv = NULL; +PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv = NULL; +PFNGLGETNCOMPRESSEDTEXIMAGEPROC glad_glGetnCompressedTexImage = NULL; +PFNGLGETNTEXIMAGEPROC glad_glGetnTexImage = NULL; +PFNGLGETNUNIFORMDVPROC glad_glGetnUniformdv = NULL; +PFNGLGETNUNIFORMFVPROC glad_glGetnUniformfv = NULL; +PFNGLGETNUNIFORMIVPROC glad_glGetnUniformiv = NULL; +PFNGLGETNUNIFORMUIVPROC glad_glGetnUniformuiv = NULL; +PFNGLHINTPROC glad_glHint = NULL; +PFNGLINVALIDATEBUFFERDATAPROC glad_glInvalidateBufferData = NULL; +PFNGLINVALIDATEBUFFERSUBDATAPROC glad_glInvalidateBufferSubData = NULL; +PFNGLINVALIDATEFRAMEBUFFERPROC glad_glInvalidateFramebuffer = NULL; +PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC glad_glInvalidateNamedFramebufferData = NULL; +PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC glad_glInvalidateNamedFramebufferSubData = NULL; +PFNGLINVALIDATESUBFRAMEBUFFERPROC glad_glInvalidateSubFramebuffer = NULL; +PFNGLINVALIDATETEXIMAGEPROC glad_glInvalidateTexImage = NULL; +PFNGLINVALIDATETEXSUBIMAGEPROC glad_glInvalidateTexSubImage = NULL; +PFNGLISBUFFERPROC glad_glIsBuffer = NULL; +PFNGLISENABLEDPROC glad_glIsEnabled = NULL; +PFNGLISENABLEDIPROC glad_glIsEnabledi = NULL; +PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer = NULL; +PFNGLISPROGRAMPROC glad_glIsProgram = NULL; +PFNGLISPROGRAMPIPELINEPROC glad_glIsProgramPipeline = NULL; +PFNGLISQUERYPROC glad_glIsQuery = NULL; +PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer = NULL; +PFNGLISSAMPLERPROC glad_glIsSampler = NULL; +PFNGLISSHADERPROC glad_glIsShader = NULL; +PFNGLISSYNCPROC glad_glIsSync = NULL; +PFNGLISTEXTUREPROC glad_glIsTexture = NULL; +PFNGLISTRANSFORMFEEDBACKPROC glad_glIsTransformFeedback = NULL; +PFNGLISVERTEXARRAYPROC glad_glIsVertexArray = NULL; +PFNGLLINEWIDTHPROC glad_glLineWidth = NULL; +PFNGLLINKPROGRAMPROC glad_glLinkProgram = NULL; +PFNGLLOGICOPPROC glad_glLogicOp = NULL; +PFNGLMAPBUFFERPROC glad_glMapBuffer = NULL; +PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange = NULL; +PFNGLMAPNAMEDBUFFERPROC glad_glMapNamedBuffer = NULL; +PFNGLMAPNAMEDBUFFERRANGEPROC glad_glMapNamedBufferRange = NULL; +PFNGLMEMORYBARRIERPROC glad_glMemoryBarrier = NULL; +PFNGLMEMORYBARRIERBYREGIONPROC glad_glMemoryBarrierByRegion = NULL; +PFNGLMINSAMPLESHADINGPROC glad_glMinSampleShading = NULL; +PFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays = NULL; +PFNGLMULTIDRAWARRAYSINDIRECTPROC glad_glMultiDrawArraysIndirect = NULL; +PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC glad_glMultiDrawArraysIndirectCount = NULL; +PFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements = NULL; +PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTPROC glad_glMultiDrawElementsIndirect = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC glad_glMultiDrawElementsIndirectCount = NULL; +PFNGLNAMEDBUFFERDATAPROC glad_glNamedBufferData = NULL; +PFNGLNAMEDBUFFERSTORAGEPROC glad_glNamedBufferStorage = NULL; +PFNGLNAMEDBUFFERSUBDATAPROC glad_glNamedBufferSubData = NULL; +PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC glad_glNamedFramebufferDrawBuffer = NULL; +PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC glad_glNamedFramebufferDrawBuffers = NULL; +PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC glad_glNamedFramebufferParameteri = NULL; +PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC glad_glNamedFramebufferReadBuffer = NULL; +PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC glad_glNamedFramebufferRenderbuffer = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTUREPROC glad_glNamedFramebufferTexture = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC glad_glNamedFramebufferTextureLayer = NULL; +PFNGLNAMEDRENDERBUFFERSTORAGEPROC glad_glNamedRenderbufferStorage = NULL; +PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glNamedRenderbufferStorageMultisample = NULL; +PFNGLOBJECTLABELPROC glad_glObjectLabel = NULL; +PFNGLOBJECTPTRLABELPROC glad_glObjectPtrLabel = NULL; +PFNGLPATCHPARAMETERFVPROC glad_glPatchParameterfv = NULL; +PFNGLPATCHPARAMETERIPROC glad_glPatchParameteri = NULL; +PFNGLPAUSETRANSFORMFEEDBACKPROC glad_glPauseTransformFeedback = NULL; +PFNGLPIXELSTOREFPROC glad_glPixelStoref = NULL; +PFNGLPIXELSTOREIPROC glad_glPixelStorei = NULL; +PFNGLPOINTPARAMETERFPROC glad_glPointParameterf = NULL; +PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv = NULL; +PFNGLPOINTPARAMETERIPROC glad_glPointParameteri = NULL; +PFNGLPOINTPARAMETERIVPROC glad_glPointParameteriv = NULL; +PFNGLPOINTSIZEPROC glad_glPointSize = NULL; +PFNGLPOLYGONMODEPROC glad_glPolygonMode = NULL; +PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset = NULL; +PFNGLPOLYGONOFFSETCLAMPPROC glad_glPolygonOffsetClamp = NULL; +PFNGLPOPDEBUGGROUPPROC glad_glPopDebugGroup = NULL; +PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex = NULL; +PFNGLPROGRAMBINARYPROC glad_glProgramBinary = NULL; +PFNGLPROGRAMPARAMETERIPROC glad_glProgramParameteri = NULL; +PFNGLPROGRAMUNIFORM1DPROC glad_glProgramUniform1d = NULL; +PFNGLPROGRAMUNIFORM1DVPROC glad_glProgramUniform1dv = NULL; +PFNGLPROGRAMUNIFORM1FPROC glad_glProgramUniform1f = NULL; +PFNGLPROGRAMUNIFORM1FVPROC glad_glProgramUniform1fv = NULL; +PFNGLPROGRAMUNIFORM1IPROC glad_glProgramUniform1i = NULL; +PFNGLPROGRAMUNIFORM1IVPROC glad_glProgramUniform1iv = NULL; +PFNGLPROGRAMUNIFORM1UIPROC glad_glProgramUniform1ui = NULL; +PFNGLPROGRAMUNIFORM1UIVPROC glad_glProgramUniform1uiv = NULL; +PFNGLPROGRAMUNIFORM2DPROC glad_glProgramUniform2d = NULL; +PFNGLPROGRAMUNIFORM2DVPROC glad_glProgramUniform2dv = NULL; +PFNGLPROGRAMUNIFORM2FPROC glad_glProgramUniform2f = NULL; +PFNGLPROGRAMUNIFORM2FVPROC glad_glProgramUniform2fv = NULL; +PFNGLPROGRAMUNIFORM2IPROC glad_glProgramUniform2i = NULL; +PFNGLPROGRAMUNIFORM2IVPROC glad_glProgramUniform2iv = NULL; +PFNGLPROGRAMUNIFORM2UIPROC glad_glProgramUniform2ui = NULL; +PFNGLPROGRAMUNIFORM2UIVPROC glad_glProgramUniform2uiv = NULL; +PFNGLPROGRAMUNIFORM3DPROC glad_glProgramUniform3d = NULL; +PFNGLPROGRAMUNIFORM3DVPROC glad_glProgramUniform3dv = NULL; +PFNGLPROGRAMUNIFORM3FPROC glad_glProgramUniform3f = NULL; +PFNGLPROGRAMUNIFORM3FVPROC glad_glProgramUniform3fv = NULL; +PFNGLPROGRAMUNIFORM3IPROC glad_glProgramUniform3i = NULL; +PFNGLPROGRAMUNIFORM3IVPROC glad_glProgramUniform3iv = NULL; +PFNGLPROGRAMUNIFORM3UIPROC glad_glProgramUniform3ui = NULL; +PFNGLPROGRAMUNIFORM3UIVPROC glad_glProgramUniform3uiv = NULL; +PFNGLPROGRAMUNIFORM4DPROC glad_glProgramUniform4d = NULL; +PFNGLPROGRAMUNIFORM4DVPROC glad_glProgramUniform4dv = NULL; +PFNGLPROGRAMUNIFORM4FPROC glad_glProgramUniform4f = NULL; +PFNGLPROGRAMUNIFORM4FVPROC glad_glProgramUniform4fv = NULL; +PFNGLPROGRAMUNIFORM4IPROC glad_glProgramUniform4i = NULL; +PFNGLPROGRAMUNIFORM4IVPROC glad_glProgramUniform4iv = NULL; +PFNGLPROGRAMUNIFORM4UIPROC glad_glProgramUniform4ui = NULL; +PFNGLPROGRAMUNIFORM4UIVPROC glad_glProgramUniform4uiv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2DVPROC glad_glProgramUniformMatrix2dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2FVPROC glad_glProgramUniformMatrix2fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC glad_glProgramUniformMatrix2x3dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC glad_glProgramUniformMatrix2x3fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC glad_glProgramUniformMatrix2x4dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC glad_glProgramUniformMatrix2x4fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3DVPROC glad_glProgramUniformMatrix3dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3FVPROC glad_glProgramUniformMatrix3fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC glad_glProgramUniformMatrix3x2dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC glad_glProgramUniformMatrix3x2fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC glad_glProgramUniformMatrix3x4dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC glad_glProgramUniformMatrix3x4fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4DVPROC glad_glProgramUniformMatrix4dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4FVPROC glad_glProgramUniformMatrix4fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC glad_glProgramUniformMatrix4x2dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC glad_glProgramUniformMatrix4x2fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC glad_glProgramUniformMatrix4x3dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC glad_glProgramUniformMatrix4x3fv = NULL; +PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex = NULL; +PFNGLPUSHDEBUGGROUPPROC glad_glPushDebugGroup = NULL; +PFNGLQUERYCOUNTERPROC glad_glQueryCounter = NULL; +PFNGLREADBUFFERPROC glad_glReadBuffer = NULL; +PFNGLREADPIXELSPROC glad_glReadPixels = NULL; +PFNGLREADNPIXELSPROC glad_glReadnPixels = NULL; +PFNGLRELEASESHADERCOMPILERPROC glad_glReleaseShaderCompiler = NULL; +PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage = NULL; +PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample = NULL; +PFNGLRESUMETRANSFORMFEEDBACKPROC glad_glResumeTransformFeedback = NULL; +PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage = NULL; +PFNGLSAMPLEMASKIPROC glad_glSampleMaski = NULL; +PFNGLSAMPLERPARAMETERIIVPROC glad_glSamplerParameterIiv = NULL; +PFNGLSAMPLERPARAMETERIUIVPROC glad_glSamplerParameterIuiv = NULL; +PFNGLSAMPLERPARAMETERFPROC glad_glSamplerParameterf = NULL; +PFNGLSAMPLERPARAMETERFVPROC glad_glSamplerParameterfv = NULL; +PFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri = NULL; +PFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv = NULL; +PFNGLSCISSORPROC glad_glScissor = NULL; +PFNGLSCISSORARRAYVPROC glad_glScissorArrayv = NULL; +PFNGLSCISSORINDEXEDPROC glad_glScissorIndexed = NULL; +PFNGLSCISSORINDEXEDVPROC glad_glScissorIndexedv = NULL; +PFNGLSHADERBINARYPROC glad_glShaderBinary = NULL; +PFNGLSHADERSOURCEPROC glad_glShaderSource = NULL; +PFNGLSHADERSTORAGEBLOCKBINDINGPROC glad_glShaderStorageBlockBinding = NULL; +PFNGLSPECIALIZESHADERPROC glad_glSpecializeShader = NULL; +PFNGLSTENCILFUNCPROC glad_glStencilFunc = NULL; +PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate = NULL; +PFNGLSTENCILMASKPROC glad_glStencilMask = NULL; +PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate = NULL; +PFNGLSTENCILOPPROC glad_glStencilOp = NULL; +PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate = NULL; +PFNGLTEXBUFFERPROC glad_glTexBuffer = NULL; +PFNGLTEXBUFFERRANGEPROC glad_glTexBufferRange = NULL; +PFNGLTEXIMAGE1DPROC glad_glTexImage1D = NULL; +PFNGLTEXIMAGE2DPROC glad_glTexImage2D = NULL; +PFNGLTEXIMAGE2DMULTISAMPLEPROC glad_glTexImage2DMultisample = NULL; +PFNGLTEXIMAGE3DPROC glad_glTexImage3D = NULL; +PFNGLTEXIMAGE3DMULTISAMPLEPROC glad_glTexImage3DMultisample = NULL; +PFNGLTEXPARAMETERIIVPROC glad_glTexParameterIiv = NULL; +PFNGLTEXPARAMETERIUIVPROC glad_glTexParameterIuiv = NULL; +PFNGLTEXPARAMETERFPROC glad_glTexParameterf = NULL; +PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv = NULL; +PFNGLTEXPARAMETERIPROC glad_glTexParameteri = NULL; +PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv = NULL; +PFNGLTEXSTORAGE1DPROC glad_glTexStorage1D = NULL; +PFNGLTEXSTORAGE2DPROC glad_glTexStorage2D = NULL; +PFNGLTEXSTORAGE2DMULTISAMPLEPROC glad_glTexStorage2DMultisample = NULL; +PFNGLTEXSTORAGE3DPROC glad_glTexStorage3D = NULL; +PFNGLTEXSTORAGE3DMULTISAMPLEPROC glad_glTexStorage3DMultisample = NULL; +PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D = NULL; +PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D = NULL; +PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D = NULL; +PFNGLTEXTUREBARRIERPROC glad_glTextureBarrier = NULL; +PFNGLTEXTUREBUFFERPROC glad_glTextureBuffer = NULL; +PFNGLTEXTUREBUFFERRANGEPROC glad_glTextureBufferRange = NULL; +PFNGLTEXTUREPARAMETERIIVPROC glad_glTextureParameterIiv = NULL; +PFNGLTEXTUREPARAMETERIUIVPROC glad_glTextureParameterIuiv = NULL; +PFNGLTEXTUREPARAMETERFPROC glad_glTextureParameterf = NULL; +PFNGLTEXTUREPARAMETERFVPROC glad_glTextureParameterfv = NULL; +PFNGLTEXTUREPARAMETERIPROC glad_glTextureParameteri = NULL; +PFNGLTEXTUREPARAMETERIVPROC glad_glTextureParameteriv = NULL; +PFNGLTEXTURESTORAGE1DPROC glad_glTextureStorage1D = NULL; +PFNGLTEXTURESTORAGE2DPROC glad_glTextureStorage2D = NULL; +PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC glad_glTextureStorage2DMultisample = NULL; +PFNGLTEXTURESTORAGE3DPROC glad_glTextureStorage3D = NULL; +PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC glad_glTextureStorage3DMultisample = NULL; +PFNGLTEXTURESUBIMAGE1DPROC glad_glTextureSubImage1D = NULL; +PFNGLTEXTURESUBIMAGE2DPROC glad_glTextureSubImage2D = NULL; +PFNGLTEXTURESUBIMAGE3DPROC glad_glTextureSubImage3D = NULL; +PFNGLTEXTUREVIEWPROC glad_glTextureView = NULL; +PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC glad_glTransformFeedbackBufferBase = NULL; +PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC glad_glTransformFeedbackBufferRange = NULL; +PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings = NULL; +PFNGLUNIFORM1DPROC glad_glUniform1d = NULL; +PFNGLUNIFORM1DVPROC glad_glUniform1dv = NULL; +PFNGLUNIFORM1FPROC glad_glUniform1f = NULL; +PFNGLUNIFORM1FVPROC glad_glUniform1fv = NULL; +PFNGLUNIFORM1IPROC glad_glUniform1i = NULL; +PFNGLUNIFORM1IVPROC glad_glUniform1iv = NULL; +PFNGLUNIFORM1UIPROC glad_glUniform1ui = NULL; +PFNGLUNIFORM1UIVPROC glad_glUniform1uiv = NULL; +PFNGLUNIFORM2DPROC glad_glUniform2d = NULL; +PFNGLUNIFORM2DVPROC glad_glUniform2dv = NULL; +PFNGLUNIFORM2FPROC glad_glUniform2f = NULL; +PFNGLUNIFORM2FVPROC glad_glUniform2fv = NULL; +PFNGLUNIFORM2IPROC glad_glUniform2i = NULL; +PFNGLUNIFORM2IVPROC glad_glUniform2iv = NULL; +PFNGLUNIFORM2UIPROC glad_glUniform2ui = NULL; +PFNGLUNIFORM2UIVPROC glad_glUniform2uiv = NULL; +PFNGLUNIFORM3DPROC glad_glUniform3d = NULL; +PFNGLUNIFORM3DVPROC glad_glUniform3dv = NULL; +PFNGLUNIFORM3FPROC glad_glUniform3f = NULL; +PFNGLUNIFORM3FVPROC glad_glUniform3fv = NULL; +PFNGLUNIFORM3IPROC glad_glUniform3i = NULL; +PFNGLUNIFORM3IVPROC glad_glUniform3iv = NULL; +PFNGLUNIFORM3UIPROC glad_glUniform3ui = NULL; +PFNGLUNIFORM3UIVPROC glad_glUniform3uiv = NULL; +PFNGLUNIFORM4DPROC glad_glUniform4d = NULL; +PFNGLUNIFORM4DVPROC glad_glUniform4dv = NULL; +PFNGLUNIFORM4FPROC glad_glUniform4f = NULL; +PFNGLUNIFORM4FVPROC glad_glUniform4fv = NULL; +PFNGLUNIFORM4IPROC glad_glUniform4i = NULL; +PFNGLUNIFORM4IVPROC glad_glUniform4iv = NULL; +PFNGLUNIFORM4UIPROC glad_glUniform4ui = NULL; +PFNGLUNIFORM4UIVPROC glad_glUniform4uiv = NULL; +PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding = NULL; +PFNGLUNIFORMMATRIX2DVPROC glad_glUniformMatrix2dv = NULL; +PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv = NULL; +PFNGLUNIFORMMATRIX2X3DVPROC glad_glUniformMatrix2x3dv = NULL; +PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv = NULL; +PFNGLUNIFORMMATRIX2X4DVPROC glad_glUniformMatrix2x4dv = NULL; +PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv = NULL; +PFNGLUNIFORMMATRIX3DVPROC glad_glUniformMatrix3dv = NULL; +PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv = NULL; +PFNGLUNIFORMMATRIX3X2DVPROC glad_glUniformMatrix3x2dv = NULL; +PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv = NULL; +PFNGLUNIFORMMATRIX3X4DVPROC glad_glUniformMatrix3x4dv = NULL; +PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv = NULL; +PFNGLUNIFORMMATRIX4DVPROC glad_glUniformMatrix4dv = NULL; +PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv = NULL; +PFNGLUNIFORMMATRIX4X2DVPROC glad_glUniformMatrix4x2dv = NULL; +PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv = NULL; +PFNGLUNIFORMMATRIX4X3DVPROC glad_glUniformMatrix4x3dv = NULL; +PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv = NULL; +PFNGLUNIFORMSUBROUTINESUIVPROC glad_glUniformSubroutinesuiv = NULL; +PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer = NULL; +PFNGLUNMAPNAMEDBUFFERPROC glad_glUnmapNamedBuffer = NULL; +PFNGLUSEPROGRAMPROC glad_glUseProgram = NULL; +PFNGLUSEPROGRAMSTAGESPROC glad_glUseProgramStages = NULL; +PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram = NULL; +PFNGLVALIDATEPROGRAMPIPELINEPROC glad_glValidateProgramPipeline = NULL; +PFNGLVERTEXARRAYATTRIBBINDINGPROC glad_glVertexArrayAttribBinding = NULL; +PFNGLVERTEXARRAYATTRIBFORMATPROC glad_glVertexArrayAttribFormat = NULL; +PFNGLVERTEXARRAYATTRIBIFORMATPROC glad_glVertexArrayAttribIFormat = NULL; +PFNGLVERTEXARRAYATTRIBLFORMATPROC glad_glVertexArrayAttribLFormat = NULL; +PFNGLVERTEXARRAYBINDINGDIVISORPROC glad_glVertexArrayBindingDivisor = NULL; +PFNGLVERTEXARRAYELEMENTBUFFERPROC glad_glVertexArrayElementBuffer = NULL; +PFNGLVERTEXARRAYVERTEXBUFFERPROC glad_glVertexArrayVertexBuffer = NULL; +PFNGLVERTEXARRAYVERTEXBUFFERSPROC glad_glVertexArrayVertexBuffers = NULL; +PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d = NULL; +PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv = NULL; +PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f = NULL; +PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv = NULL; +PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s = NULL; +PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv = NULL; +PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d = NULL; +PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv = NULL; +PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f = NULL; +PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv = NULL; +PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s = NULL; +PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv = NULL; +PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d = NULL; +PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv = NULL; +PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f = NULL; +PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv = NULL; +PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s = NULL; +PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv = NULL; +PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv = NULL; +PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv = NULL; +PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv = NULL; +PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub = NULL; +PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv = NULL; +PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv = NULL; +PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv = NULL; +PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv = NULL; +PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d = NULL; +PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv = NULL; +PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f = NULL; +PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv = NULL; +PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv = NULL; +PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s = NULL; +PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv = NULL; +PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv = NULL; +PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv = NULL; +PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv = NULL; +PFNGLVERTEXATTRIBBINDINGPROC glad_glVertexAttribBinding = NULL; +PFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor = NULL; +PFNGLVERTEXATTRIBFORMATPROC glad_glVertexAttribFormat = NULL; +PFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i = NULL; +PFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv = NULL; +PFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui = NULL; +PFNGLVERTEXATTRIBI1UIVPROC glad_glVertexAttribI1uiv = NULL; +PFNGLVERTEXATTRIBI2IPROC glad_glVertexAttribI2i = NULL; +PFNGLVERTEXATTRIBI2IVPROC glad_glVertexAttribI2iv = NULL; +PFNGLVERTEXATTRIBI2UIPROC glad_glVertexAttribI2ui = NULL; +PFNGLVERTEXATTRIBI2UIVPROC glad_glVertexAttribI2uiv = NULL; +PFNGLVERTEXATTRIBI3IPROC glad_glVertexAttribI3i = NULL; +PFNGLVERTEXATTRIBI3IVPROC glad_glVertexAttribI3iv = NULL; +PFNGLVERTEXATTRIBI3UIPROC glad_glVertexAttribI3ui = NULL; +PFNGLVERTEXATTRIBI3UIVPROC glad_glVertexAttribI3uiv = NULL; +PFNGLVERTEXATTRIBI4BVPROC glad_glVertexAttribI4bv = NULL; +PFNGLVERTEXATTRIBI4IPROC glad_glVertexAttribI4i = NULL; +PFNGLVERTEXATTRIBI4IVPROC glad_glVertexAttribI4iv = NULL; +PFNGLVERTEXATTRIBI4SVPROC glad_glVertexAttribI4sv = NULL; +PFNGLVERTEXATTRIBI4UBVPROC glad_glVertexAttribI4ubv = NULL; +PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui = NULL; +PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv = NULL; +PFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv = NULL; +PFNGLVERTEXATTRIBIFORMATPROC glad_glVertexAttribIFormat = NULL; +PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer = NULL; +PFNGLVERTEXATTRIBL1DPROC glad_glVertexAttribL1d = NULL; +PFNGLVERTEXATTRIBL1DVPROC glad_glVertexAttribL1dv = NULL; +PFNGLVERTEXATTRIBL2DPROC glad_glVertexAttribL2d = NULL; +PFNGLVERTEXATTRIBL2DVPROC glad_glVertexAttribL2dv = NULL; +PFNGLVERTEXATTRIBL3DPROC glad_glVertexAttribL3d = NULL; +PFNGLVERTEXATTRIBL3DVPROC glad_glVertexAttribL3dv = NULL; +PFNGLVERTEXATTRIBL4DPROC glad_glVertexAttribL4d = NULL; +PFNGLVERTEXATTRIBL4DVPROC glad_glVertexAttribL4dv = NULL; +PFNGLVERTEXATTRIBLFORMATPROC glad_glVertexAttribLFormat = NULL; +PFNGLVERTEXATTRIBLPOINTERPROC glad_glVertexAttribLPointer = NULL; +PFNGLVERTEXATTRIBP1UIPROC glad_glVertexAttribP1ui = NULL; +PFNGLVERTEXATTRIBP1UIVPROC glad_glVertexAttribP1uiv = NULL; +PFNGLVERTEXATTRIBP2UIPROC glad_glVertexAttribP2ui = NULL; +PFNGLVERTEXATTRIBP2UIVPROC glad_glVertexAttribP2uiv = NULL; +PFNGLVERTEXATTRIBP3UIPROC glad_glVertexAttribP3ui = NULL; +PFNGLVERTEXATTRIBP3UIVPROC glad_glVertexAttribP3uiv = NULL; +PFNGLVERTEXATTRIBP4UIPROC glad_glVertexAttribP4ui = NULL; +PFNGLVERTEXATTRIBP4UIVPROC glad_glVertexAttribP4uiv = NULL; +PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer = NULL; +PFNGLVERTEXBINDINGDIVISORPROC glad_glVertexBindingDivisor = NULL; +PFNGLVIEWPORTPROC glad_glViewport = NULL; +PFNGLVIEWPORTARRAYVPROC glad_glViewportArrayv = NULL; +PFNGLVIEWPORTINDEXEDFPROC glad_glViewportIndexedf = NULL; +PFNGLVIEWPORTINDEXEDFVPROC glad_glViewportIndexedfv = NULL; +PFNGLWAITSYNCPROC glad_glWaitSync = NULL; + + +static void glad_gl_load_GL_VERSION_1_0( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_1_0) return; + glad_glBlendFunc = (PFNGLBLENDFUNCPROC) load(userptr, "glBlendFunc"); + glad_glClear = (PFNGLCLEARPROC) load(userptr, "glClear"); + glad_glClearColor = (PFNGLCLEARCOLORPROC) load(userptr, "glClearColor"); + glad_glClearDepth = (PFNGLCLEARDEPTHPROC) load(userptr, "glClearDepth"); + glad_glClearStencil = (PFNGLCLEARSTENCILPROC) load(userptr, "glClearStencil"); + glad_glColorMask = (PFNGLCOLORMASKPROC) load(userptr, "glColorMask"); + glad_glCullFace = (PFNGLCULLFACEPROC) load(userptr, "glCullFace"); + glad_glDepthFunc = (PFNGLDEPTHFUNCPROC) load(userptr, "glDepthFunc"); + glad_glDepthMask = (PFNGLDEPTHMASKPROC) load(userptr, "glDepthMask"); + glad_glDepthRange = (PFNGLDEPTHRANGEPROC) load(userptr, "glDepthRange"); + glad_glDisable = (PFNGLDISABLEPROC) load(userptr, "glDisable"); + glad_glDrawBuffer = (PFNGLDRAWBUFFERPROC) load(userptr, "glDrawBuffer"); + glad_glEnable = (PFNGLENABLEPROC) load(userptr, "glEnable"); + glad_glFinish = (PFNGLFINISHPROC) load(userptr, "glFinish"); + glad_glFlush = (PFNGLFLUSHPROC) load(userptr, "glFlush"); + glad_glFrontFace = (PFNGLFRONTFACEPROC) load(userptr, "glFrontFace"); + glad_glGetBooleanv = (PFNGLGETBOOLEANVPROC) load(userptr, "glGetBooleanv"); + glad_glGetDoublev = (PFNGLGETDOUBLEVPROC) load(userptr, "glGetDoublev"); + glad_glGetError = (PFNGLGETERRORPROC) load(userptr, "glGetError"); + glad_glGetFloatv = (PFNGLGETFLOATVPROC) load(userptr, "glGetFloatv"); + glad_glGetIntegerv = (PFNGLGETINTEGERVPROC) load(userptr, "glGetIntegerv"); + glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString"); + glad_glGetTexImage = (PFNGLGETTEXIMAGEPROC) load(userptr, "glGetTexImage"); + glad_glGetTexLevelParameterfv = (PFNGLGETTEXLEVELPARAMETERFVPROC) load(userptr, "glGetTexLevelParameterfv"); + glad_glGetTexLevelParameteriv = (PFNGLGETTEXLEVELPARAMETERIVPROC) load(userptr, "glGetTexLevelParameteriv"); + glad_glGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC) load(userptr, "glGetTexParameterfv"); + glad_glGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC) load(userptr, "glGetTexParameteriv"); + glad_glHint = (PFNGLHINTPROC) load(userptr, "glHint"); + glad_glIsEnabled = (PFNGLISENABLEDPROC) load(userptr, "glIsEnabled"); + glad_glLineWidth = (PFNGLLINEWIDTHPROC) load(userptr, "glLineWidth"); + glad_glLogicOp = (PFNGLLOGICOPPROC) load(userptr, "glLogicOp"); + glad_glPixelStoref = (PFNGLPIXELSTOREFPROC) load(userptr, "glPixelStoref"); + glad_glPixelStorei = (PFNGLPIXELSTOREIPROC) load(userptr, "glPixelStorei"); + glad_glPointSize = (PFNGLPOINTSIZEPROC) load(userptr, "glPointSize"); + glad_glPolygonMode = (PFNGLPOLYGONMODEPROC) load(userptr, "glPolygonMode"); + glad_glReadBuffer = (PFNGLREADBUFFERPROC) load(userptr, "glReadBuffer"); + glad_glReadPixels = (PFNGLREADPIXELSPROC) load(userptr, "glReadPixels"); + glad_glScissor = (PFNGLSCISSORPROC) load(userptr, "glScissor"); + glad_glStencilFunc = (PFNGLSTENCILFUNCPROC) load(userptr, "glStencilFunc"); + glad_glStencilMask = (PFNGLSTENCILMASKPROC) load(userptr, "glStencilMask"); + glad_glStencilOp = (PFNGLSTENCILOPPROC) load(userptr, "glStencilOp"); + glad_glTexImage1D = (PFNGLTEXIMAGE1DPROC) load(userptr, "glTexImage1D"); + glad_glTexImage2D = (PFNGLTEXIMAGE2DPROC) load(userptr, "glTexImage2D"); + glad_glTexParameterf = (PFNGLTEXPARAMETERFPROC) load(userptr, "glTexParameterf"); + glad_glTexParameterfv = (PFNGLTEXPARAMETERFVPROC) load(userptr, "glTexParameterfv"); + glad_glTexParameteri = (PFNGLTEXPARAMETERIPROC) load(userptr, "glTexParameteri"); + glad_glTexParameteriv = (PFNGLTEXPARAMETERIVPROC) load(userptr, "glTexParameteriv"); + glad_glViewport = (PFNGLVIEWPORTPROC) load(userptr, "glViewport"); +} +static void glad_gl_load_GL_VERSION_1_1( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_1_1) return; + glad_glBindTexture = (PFNGLBINDTEXTUREPROC) load(userptr, "glBindTexture"); + glad_glCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC) load(userptr, "glCopyTexImage1D"); + glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC) load(userptr, "glCopyTexImage2D"); + glad_glCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC) load(userptr, "glCopyTexSubImage1D"); + glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC) load(userptr, "glCopyTexSubImage2D"); + glad_glDeleteTextures = (PFNGLDELETETEXTURESPROC) load(userptr, "glDeleteTextures"); + glad_glDrawArrays = (PFNGLDRAWARRAYSPROC) load(userptr, "glDrawArrays"); + glad_glDrawElements = (PFNGLDRAWELEMENTSPROC) load(userptr, "glDrawElements"); + glad_glGenTextures = (PFNGLGENTEXTURESPROC) load(userptr, "glGenTextures"); + glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv"); + glad_glIsTexture = (PFNGLISTEXTUREPROC) load(userptr, "glIsTexture"); + glad_glPolygonOffset = (PFNGLPOLYGONOFFSETPROC) load(userptr, "glPolygonOffset"); + glad_glTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC) load(userptr, "glTexSubImage1D"); + glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC) load(userptr, "glTexSubImage2D"); +} +static void glad_gl_load_GL_VERSION_1_2( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_1_2) return; + glad_glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC) load(userptr, "glCopyTexSubImage3D"); + glad_glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC) load(userptr, "glDrawRangeElements"); + glad_glTexImage3D = (PFNGLTEXIMAGE3DPROC) load(userptr, "glTexImage3D"); + glad_glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC) load(userptr, "glTexSubImage3D"); +} +static void glad_gl_load_GL_VERSION_1_3( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_1_3) return; + glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC) load(userptr, "glActiveTexture"); + glad_glCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC) load(userptr, "glCompressedTexImage1D"); + glad_glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC) load(userptr, "glCompressedTexImage2D"); + glad_glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC) load(userptr, "glCompressedTexImage3D"); + glad_glCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) load(userptr, "glCompressedTexSubImage1D"); + glad_glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) load(userptr, "glCompressedTexSubImage2D"); + glad_glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) load(userptr, "glCompressedTexSubImage3D"); + glad_glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC) load(userptr, "glGetCompressedTexImage"); + glad_glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC) load(userptr, "glSampleCoverage"); +} +static void glad_gl_load_GL_VERSION_1_4( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_1_4) return; + glad_glBlendColor = (PFNGLBLENDCOLORPROC) load(userptr, "glBlendColor"); + glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC) load(userptr, "glBlendEquation"); + glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC) load(userptr, "glBlendFuncSeparate"); + glad_glMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC) load(userptr, "glMultiDrawArrays"); + glad_glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC) load(userptr, "glMultiDrawElements"); + glad_glPointParameterf = (PFNGLPOINTPARAMETERFPROC) load(userptr, "glPointParameterf"); + glad_glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC) load(userptr, "glPointParameterfv"); + glad_glPointParameteri = (PFNGLPOINTPARAMETERIPROC) load(userptr, "glPointParameteri"); + glad_glPointParameteriv = (PFNGLPOINTPARAMETERIVPROC) load(userptr, "glPointParameteriv"); +} +static void glad_gl_load_GL_VERSION_1_5( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_1_5) return; + glad_glBeginQuery = (PFNGLBEGINQUERYPROC) load(userptr, "glBeginQuery"); + glad_glBindBuffer = (PFNGLBINDBUFFERPROC) load(userptr, "glBindBuffer"); + glad_glBufferData = (PFNGLBUFFERDATAPROC) load(userptr, "glBufferData"); + glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC) load(userptr, "glBufferSubData"); + glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC) load(userptr, "glDeleteBuffers"); + glad_glDeleteQueries = (PFNGLDELETEQUERIESPROC) load(userptr, "glDeleteQueries"); + glad_glEndQuery = (PFNGLENDQUERYPROC) load(userptr, "glEndQuery"); + glad_glGenBuffers = (PFNGLGENBUFFERSPROC) load(userptr, "glGenBuffers"); + glad_glGenQueries = (PFNGLGENQUERIESPROC) load(userptr, "glGenQueries"); + glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC) load(userptr, "glGetBufferParameteriv"); + glad_glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC) load(userptr, "glGetBufferPointerv"); + glad_glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC) load(userptr, "glGetBufferSubData"); + glad_glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC) load(userptr, "glGetQueryObjectiv"); + glad_glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC) load(userptr, "glGetQueryObjectuiv"); + glad_glGetQueryiv = (PFNGLGETQUERYIVPROC) load(userptr, "glGetQueryiv"); + glad_glIsBuffer = (PFNGLISBUFFERPROC) load(userptr, "glIsBuffer"); + glad_glIsQuery = (PFNGLISQUERYPROC) load(userptr, "glIsQuery"); + glad_glMapBuffer = (PFNGLMAPBUFFERPROC) load(userptr, "glMapBuffer"); + glad_glUnmapBuffer = (PFNGLUNMAPBUFFERPROC) load(userptr, "glUnmapBuffer"); +} +static void glad_gl_load_GL_VERSION_2_0( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_2_0) return; + glad_glAttachShader = (PFNGLATTACHSHADERPROC) load(userptr, "glAttachShader"); + glad_glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC) load(userptr, "glBindAttribLocation"); + glad_glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC) load(userptr, "glBlendEquationSeparate"); + glad_glCompileShader = (PFNGLCOMPILESHADERPROC) load(userptr, "glCompileShader"); + glad_glCreateProgram = (PFNGLCREATEPROGRAMPROC) load(userptr, "glCreateProgram"); + glad_glCreateShader = (PFNGLCREATESHADERPROC) load(userptr, "glCreateShader"); + glad_glDeleteProgram = (PFNGLDELETEPROGRAMPROC) load(userptr, "glDeleteProgram"); + glad_glDeleteShader = (PFNGLDELETESHADERPROC) load(userptr, "glDeleteShader"); + glad_glDetachShader = (PFNGLDETACHSHADERPROC) load(userptr, "glDetachShader"); + glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC) load(userptr, "glDisableVertexAttribArray"); + glad_glDrawBuffers = (PFNGLDRAWBUFFERSPROC) load(userptr, "glDrawBuffers"); + glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC) load(userptr, "glEnableVertexAttribArray"); + glad_glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC) load(userptr, "glGetActiveAttrib"); + glad_glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC) load(userptr, "glGetActiveUniform"); + glad_glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC) load(userptr, "glGetAttachedShaders"); + glad_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC) load(userptr, "glGetAttribLocation"); + glad_glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC) load(userptr, "glGetProgramInfoLog"); + glad_glGetProgramiv = (PFNGLGETPROGRAMIVPROC) load(userptr, "glGetProgramiv"); + glad_glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC) load(userptr, "glGetShaderInfoLog"); + glad_glGetShaderSource = (PFNGLGETSHADERSOURCEPROC) load(userptr, "glGetShaderSource"); + glad_glGetShaderiv = (PFNGLGETSHADERIVPROC) load(userptr, "glGetShaderiv"); + glad_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) load(userptr, "glGetUniformLocation"); + glad_glGetUniformfv = (PFNGLGETUNIFORMFVPROC) load(userptr, "glGetUniformfv"); + glad_glGetUniformiv = (PFNGLGETUNIFORMIVPROC) load(userptr, "glGetUniformiv"); + glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) load(userptr, "glGetVertexAttribPointerv"); + glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC) load(userptr, "glGetVertexAttribdv"); + glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) load(userptr, "glGetVertexAttribfv"); + glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) load(userptr, "glGetVertexAttribiv"); + glad_glIsProgram = (PFNGLISPROGRAMPROC) load(userptr, "glIsProgram"); + glad_glIsShader = (PFNGLISSHADERPROC) load(userptr, "glIsShader"); + glad_glLinkProgram = (PFNGLLINKPROGRAMPROC) load(userptr, "glLinkProgram"); + glad_glShaderSource = (PFNGLSHADERSOURCEPROC) load(userptr, "glShaderSource"); + glad_glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC) load(userptr, "glStencilFuncSeparate"); + glad_glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC) load(userptr, "glStencilMaskSeparate"); + glad_glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC) load(userptr, "glStencilOpSeparate"); + glad_glUniform1f = (PFNGLUNIFORM1FPROC) load(userptr, "glUniform1f"); + glad_glUniform1fv = (PFNGLUNIFORM1FVPROC) load(userptr, "glUniform1fv"); + glad_glUniform1i = (PFNGLUNIFORM1IPROC) load(userptr, "glUniform1i"); + glad_glUniform1iv = (PFNGLUNIFORM1IVPROC) load(userptr, "glUniform1iv"); + glad_glUniform2f = (PFNGLUNIFORM2FPROC) load(userptr, "glUniform2f"); + glad_glUniform2fv = (PFNGLUNIFORM2FVPROC) load(userptr, "glUniform2fv"); + glad_glUniform2i = (PFNGLUNIFORM2IPROC) load(userptr, "glUniform2i"); + glad_glUniform2iv = (PFNGLUNIFORM2IVPROC) load(userptr, "glUniform2iv"); + glad_glUniform3f = (PFNGLUNIFORM3FPROC) load(userptr, "glUniform3f"); + glad_glUniform3fv = (PFNGLUNIFORM3FVPROC) load(userptr, "glUniform3fv"); + glad_glUniform3i = (PFNGLUNIFORM3IPROC) load(userptr, "glUniform3i"); + glad_glUniform3iv = (PFNGLUNIFORM3IVPROC) load(userptr, "glUniform3iv"); + glad_glUniform4f = (PFNGLUNIFORM4FPROC) load(userptr, "glUniform4f"); + glad_glUniform4fv = (PFNGLUNIFORM4FVPROC) load(userptr, "glUniform4fv"); + glad_glUniform4i = (PFNGLUNIFORM4IPROC) load(userptr, "glUniform4i"); + glad_glUniform4iv = (PFNGLUNIFORM4IVPROC) load(userptr, "glUniform4iv"); + glad_glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC) load(userptr, "glUniformMatrix2fv"); + glad_glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC) load(userptr, "glUniformMatrix3fv"); + glad_glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC) load(userptr, "glUniformMatrix4fv"); + glad_glUseProgram = (PFNGLUSEPROGRAMPROC) load(userptr, "glUseProgram"); + glad_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC) load(userptr, "glValidateProgram"); + glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC) load(userptr, "glVertexAttrib1d"); + glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC) load(userptr, "glVertexAttrib1dv"); + glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) load(userptr, "glVertexAttrib1f"); + glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) load(userptr, "glVertexAttrib1fv"); + glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC) load(userptr, "glVertexAttrib1s"); + glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC) load(userptr, "glVertexAttrib1sv"); + glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC) load(userptr, "glVertexAttrib2d"); + glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC) load(userptr, "glVertexAttrib2dv"); + glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) load(userptr, "glVertexAttrib2f"); + glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) load(userptr, "glVertexAttrib2fv"); + glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC) load(userptr, "glVertexAttrib2s"); + glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC) load(userptr, "glVertexAttrib2sv"); + glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC) load(userptr, "glVertexAttrib3d"); + glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC) load(userptr, "glVertexAttrib3dv"); + glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) load(userptr, "glVertexAttrib3f"); + glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) load(userptr, "glVertexAttrib3fv"); + glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC) load(userptr, "glVertexAttrib3s"); + glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC) load(userptr, "glVertexAttrib3sv"); + glad_glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC) load(userptr, "glVertexAttrib4Nbv"); + glad_glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC) load(userptr, "glVertexAttrib4Niv"); + glad_glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC) load(userptr, "glVertexAttrib4Nsv"); + glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC) load(userptr, "glVertexAttrib4Nub"); + glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC) load(userptr, "glVertexAttrib4Nubv"); + glad_glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC) load(userptr, "glVertexAttrib4Nuiv"); + glad_glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC) load(userptr, "glVertexAttrib4Nusv"); + glad_glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC) load(userptr, "glVertexAttrib4bv"); + glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC) load(userptr, "glVertexAttrib4d"); + glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC) load(userptr, "glVertexAttrib4dv"); + glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) load(userptr, "glVertexAttrib4f"); + glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) load(userptr, "glVertexAttrib4fv"); + glad_glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC) load(userptr, "glVertexAttrib4iv"); + glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC) load(userptr, "glVertexAttrib4s"); + glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC) load(userptr, "glVertexAttrib4sv"); + glad_glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC) load(userptr, "glVertexAttrib4ubv"); + glad_glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC) load(userptr, "glVertexAttrib4uiv"); + glad_glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC) load(userptr, "glVertexAttrib4usv"); + glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) load(userptr, "glVertexAttribPointer"); +} +static void glad_gl_load_GL_VERSION_2_1( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_2_1) return; + glad_glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC) load(userptr, "glUniformMatrix2x3fv"); + glad_glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC) load(userptr, "glUniformMatrix2x4fv"); + glad_glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC) load(userptr, "glUniformMatrix3x2fv"); + glad_glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC) load(userptr, "glUniformMatrix3x4fv"); + glad_glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC) load(userptr, "glUniformMatrix4x2fv"); + glad_glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC) load(userptr, "glUniformMatrix4x3fv"); +} +static void glad_gl_load_GL_VERSION_3_0( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_3_0) return; + glad_glBeginConditionalRender = (PFNGLBEGINCONDITIONALRENDERPROC) load(userptr, "glBeginConditionalRender"); + glad_glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC) load(userptr, "glBeginTransformFeedback"); + glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC) load(userptr, "glBindBufferBase"); + glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) load(userptr, "glBindBufferRange"); + glad_glBindFragDataLocation = (PFNGLBINDFRAGDATALOCATIONPROC) load(userptr, "glBindFragDataLocation"); + glad_glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) load(userptr, "glBindFramebuffer"); + glad_glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) load(userptr, "glBindRenderbuffer"); + glad_glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC) load(userptr, "glBindVertexArray"); + glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) load(userptr, "glBlitFramebuffer"); + glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckFramebufferStatus"); + glad_glClampColor = (PFNGLCLAMPCOLORPROC) load(userptr, "glClampColor"); + glad_glClearBufferfi = (PFNGLCLEARBUFFERFIPROC) load(userptr, "glClearBufferfi"); + glad_glClearBufferfv = (PFNGLCLEARBUFFERFVPROC) load(userptr, "glClearBufferfv"); + glad_glClearBufferiv = (PFNGLCLEARBUFFERIVPROC) load(userptr, "glClearBufferiv"); + glad_glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC) load(userptr, "glClearBufferuiv"); + glad_glColorMaski = (PFNGLCOLORMASKIPROC) load(userptr, "glColorMaski"); + glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) load(userptr, "glDeleteFramebuffers"); + glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) load(userptr, "glDeleteRenderbuffers"); + glad_glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC) load(userptr, "glDeleteVertexArrays"); + glad_glDisablei = (PFNGLDISABLEIPROC) load(userptr, "glDisablei"); + glad_glEnablei = (PFNGLENABLEIPROC) load(userptr, "glEnablei"); + glad_glEndConditionalRender = (PFNGLENDCONDITIONALRENDERPROC) load(userptr, "glEndConditionalRender"); + glad_glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC) load(userptr, "glEndTransformFeedback"); + glad_glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC) load(userptr, "glFlushMappedBufferRange"); + glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glFramebufferRenderbuffer"); + glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC) load(userptr, "glFramebufferTexture1D"); + glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) load(userptr, "glFramebufferTexture2D"); + glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC) load(userptr, "glFramebufferTexture3D"); + glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer"); + glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) load(userptr, "glGenFramebuffers"); + glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) load(userptr, "glGenRenderbuffers"); + glad_glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC) load(userptr, "glGenVertexArrays"); + glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) load(userptr, "glGenerateMipmap"); + glad_glGetBooleani_v = (PFNGLGETBOOLEANI_VPROC) load(userptr, "glGetBooleani_v"); + glad_glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC) load(userptr, "glGetFragDataLocation"); + glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetFramebufferAttachmentParameteriv"); + glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC) load(userptr, "glGetIntegeri_v"); + glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetRenderbufferParameteriv"); + glad_glGetStringi = (PFNGLGETSTRINGIPROC) load(userptr, "glGetStringi"); + glad_glGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC) load(userptr, "glGetTexParameterIiv"); + glad_glGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC) load(userptr, "glGetTexParameterIuiv"); + glad_glGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) load(userptr, "glGetTransformFeedbackVarying"); + glad_glGetUniformuiv = (PFNGLGETUNIFORMUIVPROC) load(userptr, "glGetUniformuiv"); + glad_glGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC) load(userptr, "glGetVertexAttribIiv"); + glad_glGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC) load(userptr, "glGetVertexAttribIuiv"); + glad_glIsEnabledi = (PFNGLISENABLEDIPROC) load(userptr, "glIsEnabledi"); + glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) load(userptr, "glIsFramebuffer"); + glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) load(userptr, "glIsRenderbuffer"); + glad_glIsVertexArray = (PFNGLISVERTEXARRAYPROC) load(userptr, "glIsVertexArray"); + glad_glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC) load(userptr, "glMapBufferRange"); + glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) load(userptr, "glRenderbufferStorage"); + glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glRenderbufferStorageMultisample"); + glad_glTexParameterIiv = (PFNGLTEXPARAMETERIIVPROC) load(userptr, "glTexParameterIiv"); + glad_glTexParameterIuiv = (PFNGLTEXPARAMETERIUIVPROC) load(userptr, "glTexParameterIuiv"); + glad_glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC) load(userptr, "glTransformFeedbackVaryings"); + glad_glUniform1ui = (PFNGLUNIFORM1UIPROC) load(userptr, "glUniform1ui"); + glad_glUniform1uiv = (PFNGLUNIFORM1UIVPROC) load(userptr, "glUniform1uiv"); + glad_glUniform2ui = (PFNGLUNIFORM2UIPROC) load(userptr, "glUniform2ui"); + glad_glUniform2uiv = (PFNGLUNIFORM2UIVPROC) load(userptr, "glUniform2uiv"); + glad_glUniform3ui = (PFNGLUNIFORM3UIPROC) load(userptr, "glUniform3ui"); + glad_glUniform3uiv = (PFNGLUNIFORM3UIVPROC) load(userptr, "glUniform3uiv"); + glad_glUniform4ui = (PFNGLUNIFORM4UIPROC) load(userptr, "glUniform4ui"); + glad_glUniform4uiv = (PFNGLUNIFORM4UIVPROC) load(userptr, "glUniform4uiv"); + glad_glVertexAttribI1i = (PFNGLVERTEXATTRIBI1IPROC) load(userptr, "glVertexAttribI1i"); + glad_glVertexAttribI1iv = (PFNGLVERTEXATTRIBI1IVPROC) load(userptr, "glVertexAttribI1iv"); + glad_glVertexAttribI1ui = (PFNGLVERTEXATTRIBI1UIPROC) load(userptr, "glVertexAttribI1ui"); + glad_glVertexAttribI1uiv = (PFNGLVERTEXATTRIBI1UIVPROC) load(userptr, "glVertexAttribI1uiv"); + glad_glVertexAttribI2i = (PFNGLVERTEXATTRIBI2IPROC) load(userptr, "glVertexAttribI2i"); + glad_glVertexAttribI2iv = (PFNGLVERTEXATTRIBI2IVPROC) load(userptr, "glVertexAttribI2iv"); + glad_glVertexAttribI2ui = (PFNGLVERTEXATTRIBI2UIPROC) load(userptr, "glVertexAttribI2ui"); + glad_glVertexAttribI2uiv = (PFNGLVERTEXATTRIBI2UIVPROC) load(userptr, "glVertexAttribI2uiv"); + glad_glVertexAttribI3i = (PFNGLVERTEXATTRIBI3IPROC) load(userptr, "glVertexAttribI3i"); + glad_glVertexAttribI3iv = (PFNGLVERTEXATTRIBI3IVPROC) load(userptr, "glVertexAttribI3iv"); + glad_glVertexAttribI3ui = (PFNGLVERTEXATTRIBI3UIPROC) load(userptr, "glVertexAttribI3ui"); + glad_glVertexAttribI3uiv = (PFNGLVERTEXATTRIBI3UIVPROC) load(userptr, "glVertexAttribI3uiv"); + glad_glVertexAttribI4bv = (PFNGLVERTEXATTRIBI4BVPROC) load(userptr, "glVertexAttribI4bv"); + glad_glVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC) load(userptr, "glVertexAttribI4i"); + glad_glVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC) load(userptr, "glVertexAttribI4iv"); + glad_glVertexAttribI4sv = (PFNGLVERTEXATTRIBI4SVPROC) load(userptr, "glVertexAttribI4sv"); + glad_glVertexAttribI4ubv = (PFNGLVERTEXATTRIBI4UBVPROC) load(userptr, "glVertexAttribI4ubv"); + glad_glVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC) load(userptr, "glVertexAttribI4ui"); + glad_glVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC) load(userptr, "glVertexAttribI4uiv"); + glad_glVertexAttribI4usv = (PFNGLVERTEXATTRIBI4USVPROC) load(userptr, "glVertexAttribI4usv"); + glad_glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC) load(userptr, "glVertexAttribIPointer"); +} +static void glad_gl_load_GL_VERSION_3_1( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_3_1) return; + glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC) load(userptr, "glBindBufferBase"); + glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) load(userptr, "glBindBufferRange"); + glad_glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC) load(userptr, "glCopyBufferSubData"); + glad_glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC) load(userptr, "glDrawArraysInstanced"); + glad_glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC) load(userptr, "glDrawElementsInstanced"); + glad_glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) load(userptr, "glGetActiveUniformBlockName"); + glad_glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC) load(userptr, "glGetActiveUniformBlockiv"); + glad_glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC) load(userptr, "glGetActiveUniformName"); + glad_glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC) load(userptr, "glGetActiveUniformsiv"); + glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC) load(userptr, "glGetIntegeri_v"); + glad_glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC) load(userptr, "glGetUniformBlockIndex"); + glad_glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC) load(userptr, "glGetUniformIndices"); + glad_glPrimitiveRestartIndex = (PFNGLPRIMITIVERESTARTINDEXPROC) load(userptr, "glPrimitiveRestartIndex"); + glad_glTexBuffer = (PFNGLTEXBUFFERPROC) load(userptr, "glTexBuffer"); + glad_glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC) load(userptr, "glUniformBlockBinding"); +} +static void glad_gl_load_GL_VERSION_3_2( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_3_2) return; + glad_glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC) load(userptr, "glClientWaitSync"); + glad_glDeleteSync = (PFNGLDELETESYNCPROC) load(userptr, "glDeleteSync"); + glad_glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC) load(userptr, "glDrawElementsBaseVertex"); + glad_glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) load(userptr, "glDrawElementsInstancedBaseVertex"); + glad_glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) load(userptr, "glDrawRangeElementsBaseVertex"); + glad_glFenceSync = (PFNGLFENCESYNCPROC) load(userptr, "glFenceSync"); + glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC) load(userptr, "glFramebufferTexture"); + glad_glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC) load(userptr, "glGetBufferParameteri64v"); + glad_glGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC) load(userptr, "glGetInteger64i_v"); + glad_glGetInteger64v = (PFNGLGETINTEGER64VPROC) load(userptr, "glGetInteger64v"); + glad_glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC) load(userptr, "glGetMultisamplefv"); + glad_glGetSynciv = (PFNGLGETSYNCIVPROC) load(userptr, "glGetSynciv"); + glad_glIsSync = (PFNGLISSYNCPROC) load(userptr, "glIsSync"); + glad_glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) load(userptr, "glMultiDrawElementsBaseVertex"); + glad_glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC) load(userptr, "glProvokingVertex"); + glad_glSampleMaski = (PFNGLSAMPLEMASKIPROC) load(userptr, "glSampleMaski"); + glad_glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC) load(userptr, "glTexImage2DMultisample"); + glad_glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC) load(userptr, "glTexImage3DMultisample"); + glad_glWaitSync = (PFNGLWAITSYNCPROC) load(userptr, "glWaitSync"); +} +static void glad_gl_load_GL_VERSION_3_3( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_3_3) return; + glad_glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) load(userptr, "glBindFragDataLocationIndexed"); + glad_glBindSampler = (PFNGLBINDSAMPLERPROC) load(userptr, "glBindSampler"); + glad_glDeleteSamplers = (PFNGLDELETESAMPLERSPROC) load(userptr, "glDeleteSamplers"); + glad_glGenSamplers = (PFNGLGENSAMPLERSPROC) load(userptr, "glGenSamplers"); + glad_glGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC) load(userptr, "glGetFragDataIndex"); + glad_glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC) load(userptr, "glGetQueryObjecti64v"); + glad_glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC) load(userptr, "glGetQueryObjectui64v"); + glad_glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC) load(userptr, "glGetSamplerParameterIiv"); + glad_glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC) load(userptr, "glGetSamplerParameterIuiv"); + glad_glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC) load(userptr, "glGetSamplerParameterfv"); + glad_glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC) load(userptr, "glGetSamplerParameteriv"); + glad_glIsSampler = (PFNGLISSAMPLERPROC) load(userptr, "glIsSampler"); + glad_glQueryCounter = (PFNGLQUERYCOUNTERPROC) load(userptr, "glQueryCounter"); + glad_glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC) load(userptr, "glSamplerParameterIiv"); + glad_glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC) load(userptr, "glSamplerParameterIuiv"); + glad_glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC) load(userptr, "glSamplerParameterf"); + glad_glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC) load(userptr, "glSamplerParameterfv"); + glad_glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC) load(userptr, "glSamplerParameteri"); + glad_glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC) load(userptr, "glSamplerParameteriv"); + glad_glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC) load(userptr, "glVertexAttribDivisor"); + glad_glVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC) load(userptr, "glVertexAttribP1ui"); + glad_glVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC) load(userptr, "glVertexAttribP1uiv"); + glad_glVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC) load(userptr, "glVertexAttribP2ui"); + glad_glVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC) load(userptr, "glVertexAttribP2uiv"); + glad_glVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC) load(userptr, "glVertexAttribP3ui"); + glad_glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC) load(userptr, "glVertexAttribP3uiv"); + glad_glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC) load(userptr, "glVertexAttribP4ui"); + glad_glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC) load(userptr, "glVertexAttribP4uiv"); +} +static void glad_gl_load_GL_VERSION_4_0( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_4_0) return; + glad_glBeginQueryIndexed = (PFNGLBEGINQUERYINDEXEDPROC) load(userptr, "glBeginQueryIndexed"); + glad_glBindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC) load(userptr, "glBindTransformFeedback"); + glad_glBlendEquationSeparatei = (PFNGLBLENDEQUATIONSEPARATEIPROC) load(userptr, "glBlendEquationSeparatei"); + glad_glBlendEquationi = (PFNGLBLENDEQUATIONIPROC) load(userptr, "glBlendEquationi"); + glad_glBlendFuncSeparatei = (PFNGLBLENDFUNCSEPARATEIPROC) load(userptr, "glBlendFuncSeparatei"); + glad_glBlendFunci = (PFNGLBLENDFUNCIPROC) load(userptr, "glBlendFunci"); + glad_glDeleteTransformFeedbacks = (PFNGLDELETETRANSFORMFEEDBACKSPROC) load(userptr, "glDeleteTransformFeedbacks"); + glad_glDrawArraysIndirect = (PFNGLDRAWARRAYSINDIRECTPROC) load(userptr, "glDrawArraysIndirect"); + glad_glDrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC) load(userptr, "glDrawElementsIndirect"); + glad_glDrawTransformFeedback = (PFNGLDRAWTRANSFORMFEEDBACKPROC) load(userptr, "glDrawTransformFeedback"); + glad_glDrawTransformFeedbackStream = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) load(userptr, "glDrawTransformFeedbackStream"); + glad_glEndQueryIndexed = (PFNGLENDQUERYINDEXEDPROC) load(userptr, "glEndQueryIndexed"); + glad_glGenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC) load(userptr, "glGenTransformFeedbacks"); + glad_glGetActiveSubroutineName = (PFNGLGETACTIVESUBROUTINENAMEPROC) load(userptr, "glGetActiveSubroutineName"); + glad_glGetActiveSubroutineUniformName = (PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) load(userptr, "glGetActiveSubroutineUniformName"); + glad_glGetActiveSubroutineUniformiv = (PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) load(userptr, "glGetActiveSubroutineUniformiv"); + glad_glGetProgramStageiv = (PFNGLGETPROGRAMSTAGEIVPROC) load(userptr, "glGetProgramStageiv"); + glad_glGetQueryIndexediv = (PFNGLGETQUERYINDEXEDIVPROC) load(userptr, "glGetQueryIndexediv"); + glad_glGetSubroutineIndex = (PFNGLGETSUBROUTINEINDEXPROC) load(userptr, "glGetSubroutineIndex"); + glad_glGetSubroutineUniformLocation = (PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) load(userptr, "glGetSubroutineUniformLocation"); + glad_glGetUniformSubroutineuiv = (PFNGLGETUNIFORMSUBROUTINEUIVPROC) load(userptr, "glGetUniformSubroutineuiv"); + glad_glGetUniformdv = (PFNGLGETUNIFORMDVPROC) load(userptr, "glGetUniformdv"); + glad_glIsTransformFeedback = (PFNGLISTRANSFORMFEEDBACKPROC) load(userptr, "glIsTransformFeedback"); + glad_glMinSampleShading = (PFNGLMINSAMPLESHADINGPROC) load(userptr, "glMinSampleShading"); + glad_glPatchParameterfv = (PFNGLPATCHPARAMETERFVPROC) load(userptr, "glPatchParameterfv"); + glad_glPatchParameteri = (PFNGLPATCHPARAMETERIPROC) load(userptr, "glPatchParameteri"); + glad_glPauseTransformFeedback = (PFNGLPAUSETRANSFORMFEEDBACKPROC) load(userptr, "glPauseTransformFeedback"); + glad_glResumeTransformFeedback = (PFNGLRESUMETRANSFORMFEEDBACKPROC) load(userptr, "glResumeTransformFeedback"); + glad_glUniform1d = (PFNGLUNIFORM1DPROC) load(userptr, "glUniform1d"); + glad_glUniform1dv = (PFNGLUNIFORM1DVPROC) load(userptr, "glUniform1dv"); + glad_glUniform2d = (PFNGLUNIFORM2DPROC) load(userptr, "glUniform2d"); + glad_glUniform2dv = (PFNGLUNIFORM2DVPROC) load(userptr, "glUniform2dv"); + glad_glUniform3d = (PFNGLUNIFORM3DPROC) load(userptr, "glUniform3d"); + glad_glUniform3dv = (PFNGLUNIFORM3DVPROC) load(userptr, "glUniform3dv"); + glad_glUniform4d = (PFNGLUNIFORM4DPROC) load(userptr, "glUniform4d"); + glad_glUniform4dv = (PFNGLUNIFORM4DVPROC) load(userptr, "glUniform4dv"); + glad_glUniformMatrix2dv = (PFNGLUNIFORMMATRIX2DVPROC) load(userptr, "glUniformMatrix2dv"); + glad_glUniformMatrix2x3dv = (PFNGLUNIFORMMATRIX2X3DVPROC) load(userptr, "glUniformMatrix2x3dv"); + glad_glUniformMatrix2x4dv = (PFNGLUNIFORMMATRIX2X4DVPROC) load(userptr, "glUniformMatrix2x4dv"); + glad_glUniformMatrix3dv = (PFNGLUNIFORMMATRIX3DVPROC) load(userptr, "glUniformMatrix3dv"); + glad_glUniformMatrix3x2dv = (PFNGLUNIFORMMATRIX3X2DVPROC) load(userptr, "glUniformMatrix3x2dv"); + glad_glUniformMatrix3x4dv = (PFNGLUNIFORMMATRIX3X4DVPROC) load(userptr, "glUniformMatrix3x4dv"); + glad_glUniformMatrix4dv = (PFNGLUNIFORMMATRIX4DVPROC) load(userptr, "glUniformMatrix4dv"); + glad_glUniformMatrix4x2dv = (PFNGLUNIFORMMATRIX4X2DVPROC) load(userptr, "glUniformMatrix4x2dv"); + glad_glUniformMatrix4x3dv = (PFNGLUNIFORMMATRIX4X3DVPROC) load(userptr, "glUniformMatrix4x3dv"); + glad_glUniformSubroutinesuiv = (PFNGLUNIFORMSUBROUTINESUIVPROC) load(userptr, "glUniformSubroutinesuiv"); +} +static void glad_gl_load_GL_VERSION_4_1( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_4_1) return; + glad_glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC) load(userptr, "glActiveShaderProgram"); + glad_glBindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC) load(userptr, "glBindProgramPipeline"); + glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC) load(userptr, "glClearDepthf"); + glad_glCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC) load(userptr, "glCreateShaderProgramv"); + glad_glDeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC) load(userptr, "glDeleteProgramPipelines"); + glad_glDepthRangeArrayv = (PFNGLDEPTHRANGEARRAYVPROC) load(userptr, "glDepthRangeArrayv"); + glad_glDepthRangeIndexed = (PFNGLDEPTHRANGEINDEXEDPROC) load(userptr, "glDepthRangeIndexed"); + glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC) load(userptr, "glDepthRangef"); + glad_glGenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC) load(userptr, "glGenProgramPipelines"); + glad_glGetDoublei_v = (PFNGLGETDOUBLEI_VPROC) load(userptr, "glGetDoublei_v"); + glad_glGetFloati_v = (PFNGLGETFLOATI_VPROC) load(userptr, "glGetFloati_v"); + glad_glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC) load(userptr, "glGetProgramBinary"); + glad_glGetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC) load(userptr, "glGetProgramPipelineInfoLog"); + glad_glGetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC) load(userptr, "glGetProgramPipelineiv"); + glad_glGetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC) load(userptr, "glGetShaderPrecisionFormat"); + glad_glGetVertexAttribLdv = (PFNGLGETVERTEXATTRIBLDVPROC) load(userptr, "glGetVertexAttribLdv"); + glad_glIsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC) load(userptr, "glIsProgramPipeline"); + glad_glProgramBinary = (PFNGLPROGRAMBINARYPROC) load(userptr, "glProgramBinary"); + glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri"); + glad_glProgramUniform1d = (PFNGLPROGRAMUNIFORM1DPROC) load(userptr, "glProgramUniform1d"); + glad_glProgramUniform1dv = (PFNGLPROGRAMUNIFORM1DVPROC) load(userptr, "glProgramUniform1dv"); + glad_glProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC) load(userptr, "glProgramUniform1f"); + glad_glProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC) load(userptr, "glProgramUniform1fv"); + glad_glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC) load(userptr, "glProgramUniform1i"); + glad_glProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC) load(userptr, "glProgramUniform1iv"); + glad_glProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC) load(userptr, "glProgramUniform1ui"); + glad_glProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC) load(userptr, "glProgramUniform1uiv"); + glad_glProgramUniform2d = (PFNGLPROGRAMUNIFORM2DPROC) load(userptr, "glProgramUniform2d"); + glad_glProgramUniform2dv = (PFNGLPROGRAMUNIFORM2DVPROC) load(userptr, "glProgramUniform2dv"); + glad_glProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC) load(userptr, "glProgramUniform2f"); + glad_glProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC) load(userptr, "glProgramUniform2fv"); + glad_glProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC) load(userptr, "glProgramUniform2i"); + glad_glProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC) load(userptr, "glProgramUniform2iv"); + glad_glProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC) load(userptr, "glProgramUniform2ui"); + glad_glProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC) load(userptr, "glProgramUniform2uiv"); + glad_glProgramUniform3d = (PFNGLPROGRAMUNIFORM3DPROC) load(userptr, "glProgramUniform3d"); + glad_glProgramUniform3dv = (PFNGLPROGRAMUNIFORM3DVPROC) load(userptr, "glProgramUniform3dv"); + glad_glProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC) load(userptr, "glProgramUniform3f"); + glad_glProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC) load(userptr, "glProgramUniform3fv"); + glad_glProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC) load(userptr, "glProgramUniform3i"); + glad_glProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC) load(userptr, "glProgramUniform3iv"); + glad_glProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC) load(userptr, "glProgramUniform3ui"); + glad_glProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC) load(userptr, "glProgramUniform3uiv"); + glad_glProgramUniform4d = (PFNGLPROGRAMUNIFORM4DPROC) load(userptr, "glProgramUniform4d"); + glad_glProgramUniform4dv = (PFNGLPROGRAMUNIFORM4DVPROC) load(userptr, "glProgramUniform4dv"); + glad_glProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC) load(userptr, "glProgramUniform4f"); + glad_glProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC) load(userptr, "glProgramUniform4fv"); + glad_glProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC) load(userptr, "glProgramUniform4i"); + glad_glProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC) load(userptr, "glProgramUniform4iv"); + glad_glProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC) load(userptr, "glProgramUniform4ui"); + glad_glProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC) load(userptr, "glProgramUniform4uiv"); + glad_glProgramUniformMatrix2dv = (PFNGLPROGRAMUNIFORMMATRIX2DVPROC) load(userptr, "glProgramUniformMatrix2dv"); + glad_glProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC) load(userptr, "glProgramUniformMatrix2fv"); + glad_glProgramUniformMatrix2x3dv = (PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) load(userptr, "glProgramUniformMatrix2x3dv"); + glad_glProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) load(userptr, "glProgramUniformMatrix2x3fv"); + glad_glProgramUniformMatrix2x4dv = (PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) load(userptr, "glProgramUniformMatrix2x4dv"); + glad_glProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) load(userptr, "glProgramUniformMatrix2x4fv"); + glad_glProgramUniformMatrix3dv = (PFNGLPROGRAMUNIFORMMATRIX3DVPROC) load(userptr, "glProgramUniformMatrix3dv"); + glad_glProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC) load(userptr, "glProgramUniformMatrix3fv"); + glad_glProgramUniformMatrix3x2dv = (PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) load(userptr, "glProgramUniformMatrix3x2dv"); + glad_glProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) load(userptr, "glProgramUniformMatrix3x2fv"); + glad_glProgramUniformMatrix3x4dv = (PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) load(userptr, "glProgramUniformMatrix3x4dv"); + glad_glProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) load(userptr, "glProgramUniformMatrix3x4fv"); + glad_glProgramUniformMatrix4dv = (PFNGLPROGRAMUNIFORMMATRIX4DVPROC) load(userptr, "glProgramUniformMatrix4dv"); + glad_glProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC) load(userptr, "glProgramUniformMatrix4fv"); + glad_glProgramUniformMatrix4x2dv = (PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) load(userptr, "glProgramUniformMatrix4x2dv"); + glad_glProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) load(userptr, "glProgramUniformMatrix4x2fv"); + glad_glProgramUniformMatrix4x3dv = (PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) load(userptr, "glProgramUniformMatrix4x3dv"); + glad_glProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) load(userptr, "glProgramUniformMatrix4x3fv"); + glad_glReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC) load(userptr, "glReleaseShaderCompiler"); + glad_glScissorArrayv = (PFNGLSCISSORARRAYVPROC) load(userptr, "glScissorArrayv"); + glad_glScissorIndexed = (PFNGLSCISSORINDEXEDPROC) load(userptr, "glScissorIndexed"); + glad_glScissorIndexedv = (PFNGLSCISSORINDEXEDVPROC) load(userptr, "glScissorIndexedv"); + glad_glShaderBinary = (PFNGLSHADERBINARYPROC) load(userptr, "glShaderBinary"); + glad_glUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC) load(userptr, "glUseProgramStages"); + glad_glValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC) load(userptr, "glValidateProgramPipeline"); + glad_glVertexAttribL1d = (PFNGLVERTEXATTRIBL1DPROC) load(userptr, "glVertexAttribL1d"); + glad_glVertexAttribL1dv = (PFNGLVERTEXATTRIBL1DVPROC) load(userptr, "glVertexAttribL1dv"); + glad_glVertexAttribL2d = (PFNGLVERTEXATTRIBL2DPROC) load(userptr, "glVertexAttribL2d"); + glad_glVertexAttribL2dv = (PFNGLVERTEXATTRIBL2DVPROC) load(userptr, "glVertexAttribL2dv"); + glad_glVertexAttribL3d = (PFNGLVERTEXATTRIBL3DPROC) load(userptr, "glVertexAttribL3d"); + glad_glVertexAttribL3dv = (PFNGLVERTEXATTRIBL3DVPROC) load(userptr, "glVertexAttribL3dv"); + glad_glVertexAttribL4d = (PFNGLVERTEXATTRIBL4DPROC) load(userptr, "glVertexAttribL4d"); + glad_glVertexAttribL4dv = (PFNGLVERTEXATTRIBL4DVPROC) load(userptr, "glVertexAttribL4dv"); + glad_glVertexAttribLPointer = (PFNGLVERTEXATTRIBLPOINTERPROC) load(userptr, "glVertexAttribLPointer"); + glad_glViewportArrayv = (PFNGLVIEWPORTARRAYVPROC) load(userptr, "glViewportArrayv"); + glad_glViewportIndexedf = (PFNGLVIEWPORTINDEXEDFPROC) load(userptr, "glViewportIndexedf"); + glad_glViewportIndexedfv = (PFNGLVIEWPORTINDEXEDFVPROC) load(userptr, "glViewportIndexedfv"); +} +static void glad_gl_load_GL_VERSION_4_2( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_4_2) return; + glad_glBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC) load(userptr, "glBindImageTexture"); + glad_glDrawArraysInstancedBaseInstance = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) load(userptr, "glDrawArraysInstancedBaseInstance"); + glad_glDrawElementsInstancedBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) load(userptr, "glDrawElementsInstancedBaseInstance"); + glad_glDrawElementsInstancedBaseVertexBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) load(userptr, "glDrawElementsInstancedBaseVertexBaseInstance"); + glad_glDrawTransformFeedbackInstanced = (PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) load(userptr, "glDrawTransformFeedbackInstanced"); + glad_glDrawTransformFeedbackStreamInstanced = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) load(userptr, "glDrawTransformFeedbackStreamInstanced"); + glad_glGetActiveAtomicCounterBufferiv = (PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) load(userptr, "glGetActiveAtomicCounterBufferiv"); + glad_glGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC) load(userptr, "glGetInternalformativ"); + glad_glMemoryBarrier = (PFNGLMEMORYBARRIERPROC) load(userptr, "glMemoryBarrier"); + glad_glTexStorage1D = (PFNGLTEXSTORAGE1DPROC) load(userptr, "glTexStorage1D"); + glad_glTexStorage2D = (PFNGLTEXSTORAGE2DPROC) load(userptr, "glTexStorage2D"); + glad_glTexStorage3D = (PFNGLTEXSTORAGE3DPROC) load(userptr, "glTexStorage3D"); +} +static void glad_gl_load_GL_VERSION_4_3( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_4_3) return; + glad_glBindVertexBuffer = (PFNGLBINDVERTEXBUFFERPROC) load(userptr, "glBindVertexBuffer"); + glad_glClearBufferData = (PFNGLCLEARBUFFERDATAPROC) load(userptr, "glClearBufferData"); + glad_glClearBufferSubData = (PFNGLCLEARBUFFERSUBDATAPROC) load(userptr, "glClearBufferSubData"); + glad_glCopyImageSubData = (PFNGLCOPYIMAGESUBDATAPROC) load(userptr, "glCopyImageSubData"); + glad_glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC) load(userptr, "glDebugMessageCallback"); + glad_glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC) load(userptr, "glDebugMessageControl"); + glad_glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC) load(userptr, "glDebugMessageInsert"); + glad_glDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC) load(userptr, "glDispatchCompute"); + glad_glDispatchComputeIndirect = (PFNGLDISPATCHCOMPUTEINDIRECTPROC) load(userptr, "glDispatchComputeIndirect"); + glad_glFramebufferParameteri = (PFNGLFRAMEBUFFERPARAMETERIPROC) load(userptr, "glFramebufferParameteri"); + glad_glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC) load(userptr, "glGetDebugMessageLog"); + glad_glGetFramebufferParameteriv = (PFNGLGETFRAMEBUFFERPARAMETERIVPROC) load(userptr, "glGetFramebufferParameteriv"); + glad_glGetInternalformati64v = (PFNGLGETINTERNALFORMATI64VPROC) load(userptr, "glGetInternalformati64v"); + glad_glGetObjectLabel = (PFNGLGETOBJECTLABELPROC) load(userptr, "glGetObjectLabel"); + glad_glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC) load(userptr, "glGetObjectPtrLabel"); + glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv"); + glad_glGetProgramInterfaceiv = (PFNGLGETPROGRAMINTERFACEIVPROC) load(userptr, "glGetProgramInterfaceiv"); + glad_glGetProgramResourceIndex = (PFNGLGETPROGRAMRESOURCEINDEXPROC) load(userptr, "glGetProgramResourceIndex"); + glad_glGetProgramResourceLocation = (PFNGLGETPROGRAMRESOURCELOCATIONPROC) load(userptr, "glGetProgramResourceLocation"); + glad_glGetProgramResourceLocationIndex = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) load(userptr, "glGetProgramResourceLocationIndex"); + glad_glGetProgramResourceName = (PFNGLGETPROGRAMRESOURCENAMEPROC) load(userptr, "glGetProgramResourceName"); + glad_glGetProgramResourceiv = (PFNGLGETPROGRAMRESOURCEIVPROC) load(userptr, "glGetProgramResourceiv"); + glad_glInvalidateBufferData = (PFNGLINVALIDATEBUFFERDATAPROC) load(userptr, "glInvalidateBufferData"); + glad_glInvalidateBufferSubData = (PFNGLINVALIDATEBUFFERSUBDATAPROC) load(userptr, "glInvalidateBufferSubData"); + glad_glInvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC) load(userptr, "glInvalidateFramebuffer"); + glad_glInvalidateSubFramebuffer = (PFNGLINVALIDATESUBFRAMEBUFFERPROC) load(userptr, "glInvalidateSubFramebuffer"); + glad_glInvalidateTexImage = (PFNGLINVALIDATETEXIMAGEPROC) load(userptr, "glInvalidateTexImage"); + glad_glInvalidateTexSubImage = (PFNGLINVALIDATETEXSUBIMAGEPROC) load(userptr, "glInvalidateTexSubImage"); + glad_glMultiDrawArraysIndirect = (PFNGLMULTIDRAWARRAYSINDIRECTPROC) load(userptr, "glMultiDrawArraysIndirect"); + glad_glMultiDrawElementsIndirect = (PFNGLMULTIDRAWELEMENTSINDIRECTPROC) load(userptr, "glMultiDrawElementsIndirect"); + glad_glObjectLabel = (PFNGLOBJECTLABELPROC) load(userptr, "glObjectLabel"); + glad_glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC) load(userptr, "glObjectPtrLabel"); + glad_glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC) load(userptr, "glPopDebugGroup"); + glad_glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC) load(userptr, "glPushDebugGroup"); + glad_glShaderStorageBlockBinding = (PFNGLSHADERSTORAGEBLOCKBINDINGPROC) load(userptr, "glShaderStorageBlockBinding"); + glad_glTexBufferRange = (PFNGLTEXBUFFERRANGEPROC) load(userptr, "glTexBufferRange"); + glad_glTexStorage2DMultisample = (PFNGLTEXSTORAGE2DMULTISAMPLEPROC) load(userptr, "glTexStorage2DMultisample"); + glad_glTexStorage3DMultisample = (PFNGLTEXSTORAGE3DMULTISAMPLEPROC) load(userptr, "glTexStorage3DMultisample"); + glad_glTextureView = (PFNGLTEXTUREVIEWPROC) load(userptr, "glTextureView"); + glad_glVertexAttribBinding = (PFNGLVERTEXATTRIBBINDINGPROC) load(userptr, "glVertexAttribBinding"); + glad_glVertexAttribFormat = (PFNGLVERTEXATTRIBFORMATPROC) load(userptr, "glVertexAttribFormat"); + glad_glVertexAttribIFormat = (PFNGLVERTEXATTRIBIFORMATPROC) load(userptr, "glVertexAttribIFormat"); + glad_glVertexAttribLFormat = (PFNGLVERTEXATTRIBLFORMATPROC) load(userptr, "glVertexAttribLFormat"); + glad_glVertexBindingDivisor = (PFNGLVERTEXBINDINGDIVISORPROC) load(userptr, "glVertexBindingDivisor"); +} +static void glad_gl_load_GL_VERSION_4_4( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_4_4) return; + glad_glBindBuffersBase = (PFNGLBINDBUFFERSBASEPROC) load(userptr, "glBindBuffersBase"); + glad_glBindBuffersRange = (PFNGLBINDBUFFERSRANGEPROC) load(userptr, "glBindBuffersRange"); + glad_glBindImageTextures = (PFNGLBINDIMAGETEXTURESPROC) load(userptr, "glBindImageTextures"); + glad_glBindSamplers = (PFNGLBINDSAMPLERSPROC) load(userptr, "glBindSamplers"); + glad_glBindTextures = (PFNGLBINDTEXTURESPROC) load(userptr, "glBindTextures"); + glad_glBindVertexBuffers = (PFNGLBINDVERTEXBUFFERSPROC) load(userptr, "glBindVertexBuffers"); + glad_glBufferStorage = (PFNGLBUFFERSTORAGEPROC) load(userptr, "glBufferStorage"); + glad_glClearTexImage = (PFNGLCLEARTEXIMAGEPROC) load(userptr, "glClearTexImage"); + glad_glClearTexSubImage = (PFNGLCLEARTEXSUBIMAGEPROC) load(userptr, "glClearTexSubImage"); +} +static void glad_gl_load_GL_VERSION_4_5( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_4_5) return; + glad_glBindTextureUnit = (PFNGLBINDTEXTUREUNITPROC) load(userptr, "glBindTextureUnit"); + glad_glBlitNamedFramebuffer = (PFNGLBLITNAMEDFRAMEBUFFERPROC) load(userptr, "glBlitNamedFramebuffer"); + glad_glCheckNamedFramebufferStatus = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckNamedFramebufferStatus"); + glad_glClearNamedBufferData = (PFNGLCLEARNAMEDBUFFERDATAPROC) load(userptr, "glClearNamedBufferData"); + glad_glClearNamedBufferSubData = (PFNGLCLEARNAMEDBUFFERSUBDATAPROC) load(userptr, "glClearNamedBufferSubData"); + glad_glClearNamedFramebufferfi = (PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) load(userptr, "glClearNamedFramebufferfi"); + glad_glClearNamedFramebufferfv = (PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) load(userptr, "glClearNamedFramebufferfv"); + glad_glClearNamedFramebufferiv = (PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) load(userptr, "glClearNamedFramebufferiv"); + glad_glClearNamedFramebufferuiv = (PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) load(userptr, "glClearNamedFramebufferuiv"); + glad_glClipControl = (PFNGLCLIPCONTROLPROC) load(userptr, "glClipControl"); + glad_glCompressedTextureSubImage1D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) load(userptr, "glCompressedTextureSubImage1D"); + glad_glCompressedTextureSubImage2D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) load(userptr, "glCompressedTextureSubImage2D"); + glad_glCompressedTextureSubImage3D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) load(userptr, "glCompressedTextureSubImage3D"); + glad_glCopyNamedBufferSubData = (PFNGLCOPYNAMEDBUFFERSUBDATAPROC) load(userptr, "glCopyNamedBufferSubData"); + glad_glCopyTextureSubImage1D = (PFNGLCOPYTEXTURESUBIMAGE1DPROC) load(userptr, "glCopyTextureSubImage1D"); + glad_glCopyTextureSubImage2D = (PFNGLCOPYTEXTURESUBIMAGE2DPROC) load(userptr, "glCopyTextureSubImage2D"); + glad_glCopyTextureSubImage3D = (PFNGLCOPYTEXTURESUBIMAGE3DPROC) load(userptr, "glCopyTextureSubImage3D"); + glad_glCreateBuffers = (PFNGLCREATEBUFFERSPROC) load(userptr, "glCreateBuffers"); + glad_glCreateFramebuffers = (PFNGLCREATEFRAMEBUFFERSPROC) load(userptr, "glCreateFramebuffers"); + glad_glCreateProgramPipelines = (PFNGLCREATEPROGRAMPIPELINESPROC) load(userptr, "glCreateProgramPipelines"); + glad_glCreateQueries = (PFNGLCREATEQUERIESPROC) load(userptr, "glCreateQueries"); + glad_glCreateRenderbuffers = (PFNGLCREATERENDERBUFFERSPROC) load(userptr, "glCreateRenderbuffers"); + glad_glCreateSamplers = (PFNGLCREATESAMPLERSPROC) load(userptr, "glCreateSamplers"); + glad_glCreateTextures = (PFNGLCREATETEXTURESPROC) load(userptr, "glCreateTextures"); + glad_glCreateTransformFeedbacks = (PFNGLCREATETRANSFORMFEEDBACKSPROC) load(userptr, "glCreateTransformFeedbacks"); + glad_glCreateVertexArrays = (PFNGLCREATEVERTEXARRAYSPROC) load(userptr, "glCreateVertexArrays"); + glad_glDisableVertexArrayAttrib = (PFNGLDISABLEVERTEXARRAYATTRIBPROC) load(userptr, "glDisableVertexArrayAttrib"); + glad_glEnableVertexArrayAttrib = (PFNGLENABLEVERTEXARRAYATTRIBPROC) load(userptr, "glEnableVertexArrayAttrib"); + glad_glFlushMappedNamedBufferRange = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) load(userptr, "glFlushMappedNamedBufferRange"); + glad_glGenerateTextureMipmap = (PFNGLGENERATETEXTUREMIPMAPPROC) load(userptr, "glGenerateTextureMipmap"); + glad_glGetCompressedTextureImage = (PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) load(userptr, "glGetCompressedTextureImage"); + glad_glGetCompressedTextureSubImage = (PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) load(userptr, "glGetCompressedTextureSubImage"); + glad_glGetGraphicsResetStatus = (PFNGLGETGRAPHICSRESETSTATUSPROC) load(userptr, "glGetGraphicsResetStatus"); + glad_glGetNamedBufferParameteri64v = (PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) load(userptr, "glGetNamedBufferParameteri64v"); + glad_glGetNamedBufferParameteriv = (PFNGLGETNAMEDBUFFERPARAMETERIVPROC) load(userptr, "glGetNamedBufferParameteriv"); + glad_glGetNamedBufferPointerv = (PFNGLGETNAMEDBUFFERPOINTERVPROC) load(userptr, "glGetNamedBufferPointerv"); + glad_glGetNamedBufferSubData = (PFNGLGETNAMEDBUFFERSUBDATAPROC) load(userptr, "glGetNamedBufferSubData"); + glad_glGetNamedFramebufferAttachmentParameteriv = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetNamedFramebufferAttachmentParameteriv"); + glad_glGetNamedFramebufferParameteriv = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) load(userptr, "glGetNamedFramebufferParameteriv"); + glad_glGetNamedRenderbufferParameteriv = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetNamedRenderbufferParameteriv"); + glad_glGetQueryBufferObjecti64v = (PFNGLGETQUERYBUFFEROBJECTI64VPROC) load(userptr, "glGetQueryBufferObjecti64v"); + glad_glGetQueryBufferObjectiv = (PFNGLGETQUERYBUFFEROBJECTIVPROC) load(userptr, "glGetQueryBufferObjectiv"); + glad_glGetQueryBufferObjectui64v = (PFNGLGETQUERYBUFFEROBJECTUI64VPROC) load(userptr, "glGetQueryBufferObjectui64v"); + glad_glGetQueryBufferObjectuiv = (PFNGLGETQUERYBUFFEROBJECTUIVPROC) load(userptr, "glGetQueryBufferObjectuiv"); + glad_glGetTextureImage = (PFNGLGETTEXTUREIMAGEPROC) load(userptr, "glGetTextureImage"); + glad_glGetTextureLevelParameterfv = (PFNGLGETTEXTURELEVELPARAMETERFVPROC) load(userptr, "glGetTextureLevelParameterfv"); + glad_glGetTextureLevelParameteriv = (PFNGLGETTEXTURELEVELPARAMETERIVPROC) load(userptr, "glGetTextureLevelParameteriv"); + glad_glGetTextureParameterIiv = (PFNGLGETTEXTUREPARAMETERIIVPROC) load(userptr, "glGetTextureParameterIiv"); + glad_glGetTextureParameterIuiv = (PFNGLGETTEXTUREPARAMETERIUIVPROC) load(userptr, "glGetTextureParameterIuiv"); + glad_glGetTextureParameterfv = (PFNGLGETTEXTUREPARAMETERFVPROC) load(userptr, "glGetTextureParameterfv"); + glad_glGetTextureParameteriv = (PFNGLGETTEXTUREPARAMETERIVPROC) load(userptr, "glGetTextureParameteriv"); + glad_glGetTextureSubImage = (PFNGLGETTEXTURESUBIMAGEPROC) load(userptr, "glGetTextureSubImage"); + glad_glGetTransformFeedbacki64_v = (PFNGLGETTRANSFORMFEEDBACKI64_VPROC) load(userptr, "glGetTransformFeedbacki64_v"); + glad_glGetTransformFeedbacki_v = (PFNGLGETTRANSFORMFEEDBACKI_VPROC) load(userptr, "glGetTransformFeedbacki_v"); + glad_glGetTransformFeedbackiv = (PFNGLGETTRANSFORMFEEDBACKIVPROC) load(userptr, "glGetTransformFeedbackiv"); + glad_glGetVertexArrayIndexed64iv = (PFNGLGETVERTEXARRAYINDEXED64IVPROC) load(userptr, "glGetVertexArrayIndexed64iv"); + glad_glGetVertexArrayIndexediv = (PFNGLGETVERTEXARRAYINDEXEDIVPROC) load(userptr, "glGetVertexArrayIndexediv"); + glad_glGetVertexArrayiv = (PFNGLGETVERTEXARRAYIVPROC) load(userptr, "glGetVertexArrayiv"); + glad_glGetnCompressedTexImage = (PFNGLGETNCOMPRESSEDTEXIMAGEPROC) load(userptr, "glGetnCompressedTexImage"); + glad_glGetnTexImage = (PFNGLGETNTEXIMAGEPROC) load(userptr, "glGetnTexImage"); + glad_glGetnUniformdv = (PFNGLGETNUNIFORMDVPROC) load(userptr, "glGetnUniformdv"); + glad_glGetnUniformfv = (PFNGLGETNUNIFORMFVPROC) load(userptr, "glGetnUniformfv"); + glad_glGetnUniformiv = (PFNGLGETNUNIFORMIVPROC) load(userptr, "glGetnUniformiv"); + glad_glGetnUniformuiv = (PFNGLGETNUNIFORMUIVPROC) load(userptr, "glGetnUniformuiv"); + glad_glInvalidateNamedFramebufferData = (PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) load(userptr, "glInvalidateNamedFramebufferData"); + glad_glInvalidateNamedFramebufferSubData = (PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) load(userptr, "glInvalidateNamedFramebufferSubData"); + glad_glMapNamedBuffer = (PFNGLMAPNAMEDBUFFERPROC) load(userptr, "glMapNamedBuffer"); + glad_glMapNamedBufferRange = (PFNGLMAPNAMEDBUFFERRANGEPROC) load(userptr, "glMapNamedBufferRange"); + glad_glMemoryBarrierByRegion = (PFNGLMEMORYBARRIERBYREGIONPROC) load(userptr, "glMemoryBarrierByRegion"); + glad_glNamedBufferData = (PFNGLNAMEDBUFFERDATAPROC) load(userptr, "glNamedBufferData"); + glad_glNamedBufferStorage = (PFNGLNAMEDBUFFERSTORAGEPROC) load(userptr, "glNamedBufferStorage"); + glad_glNamedBufferSubData = (PFNGLNAMEDBUFFERSUBDATAPROC) load(userptr, "glNamedBufferSubData"); + glad_glNamedFramebufferDrawBuffer = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) load(userptr, "glNamedFramebufferDrawBuffer"); + glad_glNamedFramebufferDrawBuffers = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) load(userptr, "glNamedFramebufferDrawBuffers"); + glad_glNamedFramebufferParameteri = (PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) load(userptr, "glNamedFramebufferParameteri"); + glad_glNamedFramebufferReadBuffer = (PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) load(userptr, "glNamedFramebufferReadBuffer"); + glad_glNamedFramebufferRenderbuffer = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glNamedFramebufferRenderbuffer"); + glad_glNamedFramebufferTexture = (PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) load(userptr, "glNamedFramebufferTexture"); + glad_glNamedFramebufferTextureLayer = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glNamedFramebufferTextureLayer"); + glad_glNamedRenderbufferStorage = (PFNGLNAMEDRENDERBUFFERSTORAGEPROC) load(userptr, "glNamedRenderbufferStorage"); + glad_glNamedRenderbufferStorageMultisample = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glNamedRenderbufferStorageMultisample"); + glad_glReadnPixels = (PFNGLREADNPIXELSPROC) load(userptr, "glReadnPixels"); + glad_glTextureBarrier = (PFNGLTEXTUREBARRIERPROC) load(userptr, "glTextureBarrier"); + glad_glTextureBuffer = (PFNGLTEXTUREBUFFERPROC) load(userptr, "glTextureBuffer"); + glad_glTextureBufferRange = (PFNGLTEXTUREBUFFERRANGEPROC) load(userptr, "glTextureBufferRange"); + glad_glTextureParameterIiv = (PFNGLTEXTUREPARAMETERIIVPROC) load(userptr, "glTextureParameterIiv"); + glad_glTextureParameterIuiv = (PFNGLTEXTUREPARAMETERIUIVPROC) load(userptr, "glTextureParameterIuiv"); + glad_glTextureParameterf = (PFNGLTEXTUREPARAMETERFPROC) load(userptr, "glTextureParameterf"); + glad_glTextureParameterfv = (PFNGLTEXTUREPARAMETERFVPROC) load(userptr, "glTextureParameterfv"); + glad_glTextureParameteri = (PFNGLTEXTUREPARAMETERIPROC) load(userptr, "glTextureParameteri"); + glad_glTextureParameteriv = (PFNGLTEXTUREPARAMETERIVPROC) load(userptr, "glTextureParameteriv"); + glad_glTextureStorage1D = (PFNGLTEXTURESTORAGE1DPROC) load(userptr, "glTextureStorage1D"); + glad_glTextureStorage2D = (PFNGLTEXTURESTORAGE2DPROC) load(userptr, "glTextureStorage2D"); + glad_glTextureStorage2DMultisample = (PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) load(userptr, "glTextureStorage2DMultisample"); + glad_glTextureStorage3D = (PFNGLTEXTURESTORAGE3DPROC) load(userptr, "glTextureStorage3D"); + glad_glTextureStorage3DMultisample = (PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) load(userptr, "glTextureStorage3DMultisample"); + glad_glTextureSubImage1D = (PFNGLTEXTURESUBIMAGE1DPROC) load(userptr, "glTextureSubImage1D"); + glad_glTextureSubImage2D = (PFNGLTEXTURESUBIMAGE2DPROC) load(userptr, "glTextureSubImage2D"); + glad_glTextureSubImage3D = (PFNGLTEXTURESUBIMAGE3DPROC) load(userptr, "glTextureSubImage3D"); + glad_glTransformFeedbackBufferBase = (PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) load(userptr, "glTransformFeedbackBufferBase"); + glad_glTransformFeedbackBufferRange = (PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) load(userptr, "glTransformFeedbackBufferRange"); + glad_glUnmapNamedBuffer = (PFNGLUNMAPNAMEDBUFFERPROC) load(userptr, "glUnmapNamedBuffer"); + glad_glVertexArrayAttribBinding = (PFNGLVERTEXARRAYATTRIBBINDINGPROC) load(userptr, "glVertexArrayAttribBinding"); + glad_glVertexArrayAttribFormat = (PFNGLVERTEXARRAYATTRIBFORMATPROC) load(userptr, "glVertexArrayAttribFormat"); + glad_glVertexArrayAttribIFormat = (PFNGLVERTEXARRAYATTRIBIFORMATPROC) load(userptr, "glVertexArrayAttribIFormat"); + glad_glVertexArrayAttribLFormat = (PFNGLVERTEXARRAYATTRIBLFORMATPROC) load(userptr, "glVertexArrayAttribLFormat"); + glad_glVertexArrayBindingDivisor = (PFNGLVERTEXARRAYBINDINGDIVISORPROC) load(userptr, "glVertexArrayBindingDivisor"); + glad_glVertexArrayElementBuffer = (PFNGLVERTEXARRAYELEMENTBUFFERPROC) load(userptr, "glVertexArrayElementBuffer"); + glad_glVertexArrayVertexBuffer = (PFNGLVERTEXARRAYVERTEXBUFFERPROC) load(userptr, "glVertexArrayVertexBuffer"); + glad_glVertexArrayVertexBuffers = (PFNGLVERTEXARRAYVERTEXBUFFERSPROC) load(userptr, "glVertexArrayVertexBuffers"); +} +static void glad_gl_load_GL_VERSION_4_6( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_4_6) return; + glad_glMultiDrawArraysIndirectCount = (PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC) load(userptr, "glMultiDrawArraysIndirectCount"); + glad_glMultiDrawElementsIndirectCount = (PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC) load(userptr, "glMultiDrawElementsIndirectCount"); + glad_glPolygonOffsetClamp = (PFNGLPOLYGONOFFSETCLAMPPROC) load(userptr, "glPolygonOffsetClamp"); + glad_glSpecializeShader = (PFNGLSPECIALIZESHADERPROC) load(userptr, "glSpecializeShader"); +} + + + +static void glad_gl_free_extensions(char **exts_i) { + if (exts_i != NULL) { + unsigned int index; + for(index = 0; exts_i[index]; index++) { + free((void *) (exts_i[index])); + } + free((void *)exts_i); + exts_i = NULL; + } +} +static int glad_gl_get_extensions( const char **out_exts, char ***out_exts_i) { +#if defined(GL_ES_VERSION_3_0) || defined(GL_VERSION_3_0) + if (glad_glGetStringi != NULL && glad_glGetIntegerv != NULL) { + unsigned int index = 0; + unsigned int num_exts_i = 0; + char **exts_i = NULL; + glad_glGetIntegerv(GL_NUM_EXTENSIONS, (int*) &num_exts_i); + exts_i = (char **) malloc((num_exts_i + 1) * (sizeof *exts_i)); + if (exts_i == NULL) { + return 0; + } + for(index = 0; index < num_exts_i; index++) { + const char *gl_str_tmp = (const char*) glad_glGetStringi(GL_EXTENSIONS, index); + size_t len = strlen(gl_str_tmp) + 1; + + char *local_str = (char*) malloc(len * sizeof(char)); + if(local_str == NULL) { + exts_i[index] = NULL; + glad_gl_free_extensions(exts_i); + return 0; + } + + memcpy(local_str, gl_str_tmp, len * sizeof(char)); + exts_i[index] = local_str; + } + exts_i[index] = NULL; + + *out_exts_i = exts_i; + + return 1; + } +#else + GLAD_UNUSED(out_exts_i); +#endif + if (glad_glGetString == NULL) { + return 0; + } + *out_exts = (const char *)glad_glGetString(GL_EXTENSIONS); + return 1; +} +static int glad_gl_has_extension(const char *exts, char **exts_i, const char *ext) { + if(exts_i) { + unsigned int index; + for(index = 0; exts_i[index]; index++) { + const char *e = exts_i[index]; + if(strcmp(e, ext) == 0) { + return 1; + } + } + } else { + const char *extensions; + const char *loc; + const char *terminator; + extensions = exts; + if(extensions == NULL || ext == NULL) { + return 0; + } + while(1) { + loc = strstr(extensions, ext); + if(loc == NULL) { + return 0; + } + terminator = loc + strlen(ext); + if((loc == extensions || *(loc - 1) == ' ') && + (*terminator == ' ' || *terminator == '\0')) { + return 1; + } + extensions = terminator; + } + } + return 0; +} + +static GLADapiproc glad_gl_get_proc_from_userptr(void *userptr, const char* name) { + return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name); +} + +static int glad_gl_find_extensions_gl(void) { + const char *exts = NULL; + char **exts_i = NULL; + if (!glad_gl_get_extensions(&exts, &exts_i)) return 0; + + GLAD_UNUSED(&glad_gl_has_extension); + + glad_gl_free_extensions(exts_i); + + return 1; +} + +static int glad_gl_find_core_gl(void) { + int i; + const char* version; + const char* prefixes[] = { + "OpenGL ES-CM ", + "OpenGL ES-CL ", + "OpenGL ES ", + "OpenGL SC ", + NULL + }; + int major = 0; + int minor = 0; + version = (const char*) glad_glGetString(GL_VERSION); + if (!version) return 0; + for (i = 0; prefixes[i]; i++) { + const size_t length = strlen(prefixes[i]); + if (strncmp(version, prefixes[i], length) == 0) { + version += length; + break; + } + } + + GLAD_IMPL_UTIL_SSCANF(version, "%d.%d", &major, &minor); + + GLAD_GL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1; + GLAD_GL_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1; + GLAD_GL_VERSION_1_2 = (major == 1 && minor >= 2) || major > 1; + GLAD_GL_VERSION_1_3 = (major == 1 && minor >= 3) || major > 1; + GLAD_GL_VERSION_1_4 = (major == 1 && minor >= 4) || major > 1; + GLAD_GL_VERSION_1_5 = (major == 1 && minor >= 5) || major > 1; + GLAD_GL_VERSION_2_0 = (major == 2 && minor >= 0) || major > 2; + GLAD_GL_VERSION_2_1 = (major == 2 && minor >= 1) || major > 2; + GLAD_GL_VERSION_3_0 = (major == 3 && minor >= 0) || major > 3; + GLAD_GL_VERSION_3_1 = (major == 3 && minor >= 1) || major > 3; + GLAD_GL_VERSION_3_2 = (major == 3 && minor >= 2) || major > 3; + GLAD_GL_VERSION_3_3 = (major == 3 && minor >= 3) || major > 3; + GLAD_GL_VERSION_4_0 = (major == 4 && minor >= 0) || major > 4; + GLAD_GL_VERSION_4_1 = (major == 4 && minor >= 1) || major > 4; + GLAD_GL_VERSION_4_2 = (major == 4 && minor >= 2) || major > 4; + GLAD_GL_VERSION_4_3 = (major == 4 && minor >= 3) || major > 4; + GLAD_GL_VERSION_4_4 = (major == 4 && minor >= 4) || major > 4; + GLAD_GL_VERSION_4_5 = (major == 4 && minor >= 5) || major > 4; + GLAD_GL_VERSION_4_6 = (major == 4 && minor >= 6) || major > 4; + + return GLAD_MAKE_VERSION(major, minor); +} + +int gladLoadGLUserPtr( GLADuserptrloadfunc load, void *userptr) { + int version; + + glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString"); + if(glad_glGetString == NULL) return 0; + version = glad_gl_find_core_gl(); + + glad_gl_load_GL_VERSION_1_0(load, userptr); + glad_gl_load_GL_VERSION_1_1(load, userptr); + glad_gl_load_GL_VERSION_1_2(load, userptr); + glad_gl_load_GL_VERSION_1_3(load, userptr); + glad_gl_load_GL_VERSION_1_4(load, userptr); + glad_gl_load_GL_VERSION_1_5(load, userptr); + glad_gl_load_GL_VERSION_2_0(load, userptr); + glad_gl_load_GL_VERSION_2_1(load, userptr); + glad_gl_load_GL_VERSION_3_0(load, userptr); + glad_gl_load_GL_VERSION_3_1(load, userptr); + glad_gl_load_GL_VERSION_3_2(load, userptr); + glad_gl_load_GL_VERSION_3_3(load, userptr); + glad_gl_load_GL_VERSION_4_0(load, userptr); + glad_gl_load_GL_VERSION_4_1(load, userptr); + glad_gl_load_GL_VERSION_4_2(load, userptr); + glad_gl_load_GL_VERSION_4_3(load, userptr); + glad_gl_load_GL_VERSION_4_4(load, userptr); + glad_gl_load_GL_VERSION_4_5(load, userptr); + glad_gl_load_GL_VERSION_4_6(load, userptr); + + if (!glad_gl_find_extensions_gl()) return 0; + + + + return version; +} + + +int gladLoadGL( GLADloadfunc load) { + return gladLoadGLUserPtr( glad_gl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load); +} + + + + + +#ifdef GLAD_GL + +#ifndef GLAD_LOADER_LIBRARY_C_ +#define GLAD_LOADER_LIBRARY_C_ + +#include +#include + +#if GLAD_PLATFORM_WIN32 +#include +#else +#include +#endif + + +static void* glad_get_dlopen_handle(const char *lib_names[], int length) { + void *handle = NULL; + int i; + + for (i = 0; i < length; ++i) { +#if GLAD_PLATFORM_WIN32 + #if GLAD_PLATFORM_UWP + size_t buffer_size = (strlen(lib_names[i]) + 1) * sizeof(WCHAR); + LPWSTR buffer = (LPWSTR) malloc(buffer_size); + if (buffer != NULL) { + int ret = MultiByteToWideChar(CP_ACP, 0, lib_names[i], -1, buffer, buffer_size); + if (ret != 0) { + handle = (void*) LoadPackagedLibrary(buffer, 0); + } + free((void*) buffer); + } + #else + handle = (void*) LoadLibraryA(lib_names[i]); + #endif +#else + handle = dlopen(lib_names[i], RTLD_LAZY | RTLD_LOCAL); +#endif + if (handle != NULL) { + return handle; + } + } + + return NULL; +} + +static void glad_close_dlopen_handle(void* handle) { + if (handle != NULL) { +#if GLAD_PLATFORM_WIN32 + FreeLibrary((HMODULE) handle); +#else + dlclose(handle); +#endif + } +} + +static GLADapiproc glad_dlsym_handle(void* handle, const char *name) { + if (handle == NULL) { + return NULL; + } + +#if GLAD_PLATFORM_WIN32 + return (GLADapiproc) GetProcAddress((HMODULE) handle, name); +#else + return GLAD_GNUC_EXTENSION (GLADapiproc) dlsym(handle, name); +#endif +} + +#endif /* GLAD_LOADER_LIBRARY_C_ */ + +typedef void* (GLAD_API_PTR *GLADglprocaddrfunc)(const char*); +struct _glad_gl_userptr { + void *handle; + GLADglprocaddrfunc gl_get_proc_address_ptr; +}; + +static GLADapiproc glad_gl_get_proc(void *vuserptr, const char *name) { + struct _glad_gl_userptr userptr = *(struct _glad_gl_userptr*) vuserptr; + GLADapiproc result = NULL; + + if(userptr.gl_get_proc_address_ptr != NULL) { + result = GLAD_GNUC_EXTENSION (GLADapiproc) userptr.gl_get_proc_address_ptr(name); + } + if(result == NULL) { + result = glad_dlsym_handle(userptr.handle, name); + } + + return result; +} + +static void* _glad_GL_loader_handle = NULL; + +static void* glad_gl_dlopen_handle(void) { +#if GLAD_PLATFORM_APPLE + static const char *NAMES[] = { + "../Frameworks/OpenGL.framework/OpenGL", + "/Library/Frameworks/OpenGL.framework/OpenGL", + "/System/Library/Frameworks/OpenGL.framework/OpenGL", + "/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL" + }; +#elif GLAD_PLATFORM_WIN32 + static const char *NAMES[] = {"opengl32.dll"}; +#else + static const char *NAMES[] = { + #if defined(__CYGWIN__) + "libGL-1.so", + #endif + "libGL.so.1", + "libGL.so" + }; +#endif + + if (_glad_GL_loader_handle == NULL) { + _glad_GL_loader_handle = glad_get_dlopen_handle(NAMES, sizeof(NAMES) / sizeof(NAMES[0])); + } + + return _glad_GL_loader_handle; +} + +static struct _glad_gl_userptr glad_gl_build_userptr(void *handle) { + struct _glad_gl_userptr userptr; + + userptr.handle = handle; +#if GLAD_PLATFORM_APPLE || defined(__HAIKU__) + userptr.gl_get_proc_address_ptr = NULL; +#elif GLAD_PLATFORM_WIN32 + userptr.gl_get_proc_address_ptr = + (GLADglprocaddrfunc) glad_dlsym_handle(handle, "wglGetProcAddress"); +#else + userptr.gl_get_proc_address_ptr = + (GLADglprocaddrfunc) glad_dlsym_handle(handle, "glXGetProcAddressARB"); +#endif + + return userptr; +} + +int gladLoaderLoadGL(void) { + int version = 0; + void *handle; + int did_load = 0; + struct _glad_gl_userptr userptr; + + did_load = _glad_GL_loader_handle == NULL; + handle = glad_gl_dlopen_handle(); + if (handle) { + userptr = glad_gl_build_userptr(handle); + + version = gladLoadGLUserPtr(glad_gl_get_proc, &userptr); + + if (did_load) { + gladLoaderUnloadGL(); + } + } + + return version; +} + + + +void gladLoaderUnloadGL(void) { + if (_glad_GL_loader_handle != NULL) { + glad_close_dlopen_handle(_glad_GL_loader_handle); + _glad_GL_loader_handle = NULL; + } +} + +#endif /* GLAD_GL */ + +#ifdef __cplusplus +} +#endif diff --git a/external/m3d/m3d.h b/external/m3d/m3d.h new file mode 100644 index 0000000..8bba183 --- /dev/null +++ b/external/m3d/m3d.h @@ -0,0 +1,6574 @@ +/* + * m3d.h + * https://gitlab.com/bztsrc/model3d + * + * Copyright (C) 2020 bzt (bztsrc@gitlab) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * @brief ANSI C89 / C++11 single header importer / exporter SDK for the Model 3D (.M3D) format + * https://gitlab.com/bztsrc/model3d + * + * PNG decompressor included from (with minor modifications to make it C89 valid): + * stb_image - v2.13 - public domain image loader - http://nothings.org/stb_image.h + * + * @version: 1.0.0 + */ + +#ifndef _M3D_H_ +#define _M3D_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/*** configuration ***/ +#ifndef M3D_MALLOC +# define M3D_MALLOC(sz) malloc(sz) +#endif +#ifndef M3D_REALLOC +# define M3D_REALLOC(p,nsz) realloc(p,nsz) +#endif +#ifndef M3D_FREE +# define M3D_FREE(p) free(p) +#endif +#ifndef M3D_LOG +# define M3D_LOG(x) +#endif +#ifndef M3D_APIVERSION +#define M3D_APIVERSION 0x0100 +#ifndef M3D_DOUBLE +typedef float M3D_FLOAT; +#ifndef M3D_EPSILON +/* carefully choosen for IEEE 754 don't change */ +#define M3D_EPSILON ((M3D_FLOAT)1e-7) +#endif +#else +typedef double M3D_FLOAT; +#ifndef M3D_EPSILON +#define M3D_EPSILON ((M3D_FLOAT)1e-14) +#endif +#endif +#if !defined(M3D_SMALLINDEX) +typedef uint32_t M3D_INDEX; +typedef uint16_t M3D_VOXEL; +#define M3D_UNDEF 0xffffffff +#define M3D_INDEXMAX 0xfffffffe +#define M3D_VOXUNDEF 0xffff +#define M3D_VOXCLEAR 0xfffe +#else +typedef uint16_t M3D_INDEX; +typedef uint8_t M3D_VOXEL; +#define M3D_UNDEF 0xffff +#define M3D_INDEXMAX 0xfffe +#define M3D_VOXUNDEF 0xff +#define M3D_VOXCLEAR 0xfe +#endif +#define M3D_NOTDEFINED 0xffffffff +#ifndef M3D_NUMBONE +#define M3D_NUMBONE 4 +#endif +#ifndef M3D_BONEMAXLEVEL +#define M3D_BONEMAXLEVEL 64 +#endif +#ifndef _MSC_VER +#ifndef _inline +#define _inline __inline__ +#endif +#define _pack __attribute__((packed)) +#define _unused __attribute__((unused)) +#else +#define _inline +#define _pack +#define _unused __pragma(warning(suppress:4100)) +#endif +#ifndef __cplusplus +#define _register register +#else +#define _register +#endif + +/*** File format structures ***/ + +/** + * M3D file format structure + * 3DMO m3dchunk_t file header chunk, may followed by compressed data + * PRVW preview chunk (optional) + * HEAD m3dhdr_t model header chunk + * n x m3dchunk_t more chunks follow + * CMAP color map chunk (optional) + * TMAP texture map chunk (optional) + * VRTS vertex data chunk (optional if it's a material library) + * BONE bind-pose skeleton, bone hierarchy chunk (optional) + * n x m3db_t contains propably more, but at least one bone + * n x m3ds_t skin group records + * MTRL* material chunk(s), can be more (optional) + * n x m3dp_t each material contains propapbly more, but at least one property + * the properties are configurable with a static array, see m3d_propertytypes + * n x m3dchunk_t at least one, but maybe more face chunks + * PROC* procedural face, or + * MESH* triangle mesh (vertex index list) or + * VOXT, VOXD* voxel image (converted to mesh) or + * SHPE* mathematical shapes like parameterized surfaces + * LBLS* annotation label chunks, can be more (optional) + * ACTN* action chunk(s), animation-pose skeletons, can be more (optional) + * n x m3dfr_t each action contains probably more, but at least one frame + * n x m3dtr_t each frame contains probably more, but at least one transformation + * ASET* inlined asset chunk(s), can be more (optional) + * OMD3 end chunk + * + * Typical chunks for a game engine: 3DMO, HEAD, CMAP, TMAP, VRTS, BONE, MTRL, MESH, ACTN, OMD3 + * Typical chunks for distibution: 3DMO, PRVW, HEAD, CMAP, TMAP, VRTS, BONE, MTRL, MESH, ACTN, ASET, OMD3 + * Typical chunks for voxel image: 3DMO, HEAD, CMAP, MTRL, VOXT, VOXD, VOXD, VOXD, OMD3 + * Typical chunks for CAD software: 3DMO, PRVW, HEAD, CMAP, TMAP, VRTS, MTRL, SHPE, LBLS, OMD3 + */ +#ifdef _MSC_VER +#pragma pack(push) +#pragma pack(1) +#endif + +typedef struct { + char magic[4]; + uint32_t length; + float scale; /* deliberately not M3D_FLOAT */ + uint32_t types; +} _pack m3dhdr_t; + +typedef struct { + char magic[4]; + uint32_t length; +} _pack m3dchunk_t; + +#ifdef _MSC_VER +#pragma pack(pop) +#endif + +/*** in-memory model structure ***/ + +/* textmap entry */ +typedef struct { + M3D_FLOAT u; + M3D_FLOAT v; +} m3dti_t; +#define m3d_textureindex_t m3dti_t + +/* texture */ +typedef struct { + char *name; /* texture name */ + uint8_t *d; /* pixels data */ + uint16_t w; /* width */ + uint16_t h; /* height */ + uint8_t f; /* format, 1 = grayscale, 2 = grayscale+alpha, 3 = rgb, 4 = rgba */ +} m3dtx_t; +#define m3d_texturedata_t m3dtx_t + +typedef struct { + M3D_INDEX vertexid; + M3D_FLOAT weight; +} m3dw_t; +#define m3d_weight_t m3dw_t + +/* bone entry */ +typedef struct { + M3D_INDEX parent; /* parent bone index */ + char *name; /* name for this bone */ + M3D_INDEX pos; /* vertex index position */ + M3D_INDEX ori; /* vertex index orientation (quaternion) */ + M3D_INDEX numweight; /* number of controlled vertices */ + m3dw_t *weight; /* weights for those vertices */ + M3D_FLOAT mat4[16]; /* transformation matrix */ +} m3db_t; +#define m3d_bone_t m3db_t + +/* skin: bone per vertex entry */ +typedef struct { + M3D_INDEX boneid[M3D_NUMBONE]; + M3D_FLOAT weight[M3D_NUMBONE]; +} m3ds_t; +#define m3d_skin_t m3ds_t + +/* vertex entry */ +typedef struct { + M3D_FLOAT x; /* 3D coordinates and weight */ + M3D_FLOAT y; + M3D_FLOAT z; + M3D_FLOAT w; + uint32_t color; /* default vertex color */ + M3D_INDEX skinid; /* skin index */ +#ifdef M3D_VERTEXTYPE + uint8_t type; +#endif +} m3dv_t; +#define m3d_vertex_t m3dv_t + +/* material property formats */ +enum { + m3dpf_color, + m3dpf_uint8, + m3dpf_uint16, + m3dpf_uint32, + m3dpf_float, + m3dpf_map +}; +typedef struct { + uint8_t format; + uint8_t id; +#ifdef M3D_ASCII +#define M3D_PROPERTYDEF(f,i,n) { (f), (i), (char*)(n) } + char *key; +#endif +#ifndef M3D_ASCII +#define M3D_PROPERTYDEF(f,i,n) { (f), (i) } +#endif +} m3dpd_t; + +/* material property types */ +/* You shouldn't change the first 8 display and first 4 physical property. Assign the rest as you like. */ +enum { + m3dp_Kd = 0, /* scalar display properties */ + m3dp_Ka, + m3dp_Ks, + m3dp_Ns, + m3dp_Ke, + m3dp_Tf, + m3dp_Km, + m3dp_d, + m3dp_il, + + m3dp_Pr = 64, /* scalar physical properties */ + m3dp_Pm, + m3dp_Ps, + m3dp_Ni, + m3dp_Nt, + + m3dp_map_Kd = 128, /* textured display map properties */ + m3dp_map_Ka, + m3dp_map_Ks, + m3dp_map_Ns, + m3dp_map_Ke, + m3dp_map_Tf, + m3dp_map_Km, /* bump map */ + m3dp_map_D, + m3dp_map_N, /* normal map */ + + m3dp_map_Pr = 192, /* textured physical map properties */ + m3dp_map_Pm, + m3dp_map_Ps, + m3dp_map_Ni, + m3dp_map_Nt +}; +enum { /* aliases */ + m3dp_bump = m3dp_map_Km, + m3dp_map_il = m3dp_map_N, + m3dp_refl = m3dp_map_Pm +}; + +/* material property */ +typedef struct { + uint8_t type; /* property type, see "m3dp_*" enumeration */ + union { + uint32_t color; /* if value is a color, m3dpf_color */ + uint32_t num; /* if value is a number, m3dpf_uint8, m3pf_uint16, m3dpf_uint32 */ + float fnum; /* if value is a floating point number, m3dpf_float */ + M3D_INDEX textureid; /* if value is a texture, m3dpf_map */ + } value; +} m3dp_t; +#define m3d_property_t m3dp_t + +/* material entry */ +typedef struct { + char *name; /* name of the material */ + uint8_t numprop; /* number of properties */ + m3dp_t *prop; /* properties array */ +} m3dm_t; +#define m3d_material_t m3dm_t + +/* face entry */ +typedef struct { + M3D_INDEX materialid; /* material index */ + M3D_INDEX vertex[3]; /* 3D points of the triangle in CCW order */ + M3D_INDEX normal[3]; /* normal vectors */ + M3D_INDEX texcoord[3]; /* UV coordinates */ +#ifdef M3D_VERTEXMAX + M3D_INDEX paramid; /* parameter index */ + M3D_INDEX vertmax[3]; /* maximum 3D points of the triangle in CCW order */ +#endif +} m3df_t; +#define m3d_face_t m3df_t + +typedef struct { + uint16_t count; + char *name; +} m3dvi_t; +#define m3d_voxelitem_t m3dvi_t +#define m3d_parameter_t m3dvi_t + +/* voxel types (voxel palette) */ +typedef struct { + char *name; /* technical name of the voxel */ + uint8_t rotation; /* rotation info */ + uint16_t voxshape; /* voxel shape */ + M3D_INDEX materialid; /* material index */ + uint32_t color; /* default voxel color */ + M3D_INDEX skinid; /* skin index */ + uint8_t numitem; /* number of sub-voxels */ + m3dvi_t *item; /* list of sub-voxels */ +} m3dvt_t; +#define m3d_voxeltype_t m3dvt_t + +/* voxel data blocks */ +typedef struct { + char *name; /* name of the block */ + int32_t x, y, z; /* position */ + uint32_t w, h, d; /* dimension */ + uint8_t uncertain; /* probability */ + uint8_t groupid; /* block group id */ + M3D_VOXEL *data; /* voxel data, indices to voxel type */ +} m3dvx_t; +#define m3d_voxel_t m3dvx_t + +/* shape command types. must match the row in m3d_commandtypes */ +enum { + /* special commands */ + m3dc_use = 0, /* use material */ + m3dc_inc, /* include another shape */ + m3dc_mesh, /* include part of polygon mesh */ + /* approximations */ + m3dc_div, /* subdivision by constant resolution for both u, v */ + m3dc_sub, /* subdivision by constant, different for u and v */ + m3dc_len, /* spacial subdivision by maxlength */ + m3dc_dist, /* subdivision by maxdistance and maxangle */ + /* modifiers */ + m3dc_degu, /* degree for both u, v */ + m3dc_deg, /* separate degree for u and v */ + m3dc_rangeu, /* range for u */ + m3dc_range, /* range for u and v */ + m3dc_paru, /* u parameters (knots) */ + m3dc_parv, /* v parameters */ + m3dc_trim, /* outer trimming curve */ + m3dc_hole, /* inner trimming curve */ + m3dc_scrv, /* spacial curve */ + m3dc_sp, /* special points */ + /* helper curves */ + m3dc_bez1, /* Bezier 1D */ + m3dc_bsp1, /* B-spline 1D */ + m3dc_bez2, /* bezier 2D */ + m3dc_bsp2, /* B-spline 2D */ + /* surfaces */ + m3dc_bezun, /* Bezier 3D with control, UV, normal */ + m3dc_bezu, /* with control and UV */ + m3dc_bezn, /* with control and normal */ + m3dc_bez, /* control points only */ + m3dc_nurbsun, /* B-spline 3D */ + m3dc_nurbsu, + m3dc_nurbsn, + m3dc_nurbs, + m3dc_conn, /* connect surfaces */ + /* geometrical */ + m3dc_line, + m3dc_polygon, + m3dc_circle, + m3dc_cylinder, + m3dc_shpere, + m3dc_torus, + m3dc_cone, + m3dc_cube +}; + +/* shape command argument types */ +enum { + m3dcp_mi_t = 1, /* material index */ + m3dcp_hi_t, /* shape index */ + m3dcp_fi_t, /* face index */ + m3dcp_ti_t, /* texture map index */ + m3dcp_vi_t, /* vertex index */ + m3dcp_qi_t, /* vertex index for quaternions */ + m3dcp_vc_t, /* coordinate or radius, float scalar */ + m3dcp_i1_t, /* int8 scalar */ + m3dcp_i2_t, /* int16 scalar */ + m3dcp_i4_t, /* int32 scalar */ + m3dcp_va_t /* variadic arguments */ +}; + +#define M3D_CMDMAXARG 8 /* if you increase this, add more arguments to the macro below */ +typedef struct { +#ifdef M3D_ASCII +#define M3D_CMDDEF(t,n,p,a,b,c,d,e,f,g,h) { (char*)(n), (p), { (a), (b), (c), (d), (e), (f), (g), (h) } } + char *key; +#endif +#ifndef M3D_ASCII +#define M3D_CMDDEF(t,n,p,a,b,c,d,e,f,g,h) { (p), { (a), (b), (c), (d), (e), (f), (g), (h) } } +#endif + uint8_t p; + uint8_t a[M3D_CMDMAXARG]; +} m3dcd_t; + +/* shape command */ +typedef struct { + uint16_t type; /* shape type */ + uint32_t *arg; /* arguments array */ +} m3dc_t; +#define m3d_shapecommand_t m3dc_t + +/* shape entry */ +typedef struct { + char *name; /* name of the mathematical shape */ + M3D_INDEX group; /* group this shape belongs to or -1 */ + uint32_t numcmd; /* number of commands */ + m3dc_t *cmd; /* commands array */ +} m3dh_t; +#define m3d_shape_t m3dh_t + +/* label entry */ +typedef struct { + char *name; /* name of the annotation layer or NULL */ + char *lang; /* language code or NULL */ + char *text; /* the label text */ + uint32_t color; /* color */ + M3D_INDEX vertexid; /* the vertex the label refers to */ +} m3dl_t; +#define m3d_label_t m3dl_t + +/* frame transformations / working copy skeleton entry */ +typedef struct { + M3D_INDEX boneid; /* selects a node in bone hierarchy */ + M3D_INDEX pos; /* vertex index new position */ + M3D_INDEX ori; /* vertex index new orientation (quaternion) */ +} m3dtr_t; +#define m3d_transform_t m3dtr_t + +/* animation frame entry */ +typedef struct { + uint32_t msec; /* frame's position on the timeline, timestamp */ + M3D_INDEX numtransform; /* number of transformations in this frame */ + m3dtr_t *transform; /* transformations */ +} m3dfr_t; +#define m3d_frame_t m3dfr_t + +/* model action entry */ +typedef struct { + char *name; /* name of the action */ + uint32_t durationmsec; /* duration in millisec (1/1000 sec) */ + M3D_INDEX numframe; /* number of frames in this animation */ + m3dfr_t *frame; /* frames array */ +} m3da_t; +#define m3d_action_t m3da_t + +/* inlined asset */ +typedef struct { + char *name; /* asset name (same pointer as in texture[].name) */ + uint8_t *data; /* compressed asset data */ + uint32_t length; /* compressed data length */ +} m3di_t; +#define m3d_inlinedasset_t m3di_t + +/*** in-memory model structure ***/ +#define M3D_FLG_FREERAW (1<<0) +#define M3D_FLG_FREESTR (1<<1) +#define M3D_FLG_MTLLIB (1<<2) +#define M3D_FLG_GENNORM (1<<3) + +typedef struct { + m3dhdr_t *raw; /* pointer to raw data */ + char flags; /* internal flags */ + signed char errcode; /* returned error code */ + char vc_s, vi_s, si_s, ci_s, ti_s, bi_s, nb_s, sk_s, fc_s, hi_s, fi_s, vd_s, vp_s; /* decoded sizes for types */ + char *name; /* name of the model, like "Utah teapot" */ + char *license; /* usage condition or license, like "MIT", "LGPL" or "BSD-3clause" */ + char *author; /* nickname, email, homepage or github URL etc. */ + char *desc; /* comments, descriptions. May contain '\n' newline character */ + M3D_FLOAT scale; /* the model's bounding cube's size in SI meters */ + M3D_INDEX numcmap; + uint32_t *cmap; /* color map */ + M3D_INDEX numtmap; + m3dti_t *tmap; /* texture map indices */ + M3D_INDEX numtexture; + m3dtx_t *texture; /* uncompressed textures */ + M3D_INDEX numbone; + m3db_t *bone; /* bone hierarchy */ + M3D_INDEX numvertex; + m3dv_t *vertex; /* vertex data */ + M3D_INDEX numskin; + m3ds_t *skin; /* skin data */ + M3D_INDEX nummaterial; + m3dm_t *material; /* material list */ +#ifdef M3D_VERTEXMAX + M3D_INDEX numparam; + m3dvi_t *param; /* parameters and their values list */ +#endif + M3D_INDEX numface; + m3df_t *face; /* model face, polygon (triangle) mesh */ + M3D_INDEX numvoxtype; + m3dvt_t *voxtype; /* model face, voxel types */ + M3D_INDEX numvoxel; + m3dvx_t *voxel; /* model face, cubes compressed into voxels */ + M3D_INDEX numshape; + m3dh_t *shape; /* model face, shape commands */ + M3D_INDEX numlabel; + m3dl_t *label; /* annotation labels */ + M3D_INDEX numaction; + m3da_t *action; /* action animations */ + M3D_INDEX numinlined; + m3di_t *inlined; /* inlined assets */ + M3D_INDEX numextra; + m3dchunk_t **extra; /* unknown chunks, application / engine specific data probably */ + m3di_t preview; /* preview chunk */ +} m3d_t; + +/*** export parameters ***/ +#define M3D_EXP_INT8 0 +#define M3D_EXP_INT16 1 +#define M3D_EXP_FLOAT 2 +#define M3D_EXP_DOUBLE 3 + +#define M3D_EXP_NOCMAP (1<<0) +#define M3D_EXP_NOMATERIAL (1<<1) +#define M3D_EXP_NOFACE (1<<2) +#define M3D_EXP_NONORMAL (1<<3) +#define M3D_EXP_NOTXTCRD (1<<4) +#define M3D_EXP_FLIPTXTCRD (1<<5) +#define M3D_EXP_NORECALC (1<<6) +#define M3D_EXP_IDOSUCK (1<<7) +#define M3D_EXP_NOBONE (1<<8) +#define M3D_EXP_NOACTION (1<<9) +#define M3D_EXP_INLINE (1<<10) +#define M3D_EXP_EXTRA (1<<11) +#define M3D_EXP_NOZLIB (1<<14) +#define M3D_EXP_ASCII (1<<15) +#define M3D_EXP_NOVRTMAX (1<<16) + +/*** error codes ***/ +#define M3D_SUCCESS 0 +#define M3D_ERR_ALLOC -1 +#define M3D_ERR_BADFILE -2 +#define M3D_ERR_UNIMPL -65 +#define M3D_ERR_UNKPROP -66 +#define M3D_ERR_UNKMESH -67 +#define M3D_ERR_UNKIMG -68 +#define M3D_ERR_UNKFRAME -69 +#define M3D_ERR_UNKCMD -70 +#define M3D_ERR_UNKVOX -71 +#define M3D_ERR_TRUNC -72 +#define M3D_ERR_CMAP -73 +#define M3D_ERR_TMAP -74 +#define M3D_ERR_VRTS -75 +#define M3D_ERR_BONE -76 +#define M3D_ERR_MTRL -77 +#define M3D_ERR_SHPE -78 +#define M3D_ERR_VOXT -79 + +#define M3D_ERR_ISFATAL(x) ((x) < 0 && (x) > -65) + +/* callbacks */ +typedef unsigned char *(*m3dread_t)(char *filename, unsigned int *size); /* read file contents into buffer */ +typedef void (*m3dfree_t)(void *buffer); /* free file contents buffer */ +typedef int (*m3dtxsc_t)(const char *name, const void *script, uint32_t len, m3dtx_t *output); /* interpret texture script */ +typedef int (*m3dprsc_t)(const char *name, const void *script, uint32_t len, m3d_t *model); /* interpret surface script */ +#endif /* ifndef M3D_APIVERSION */ + +/*** C prototypes ***/ +/* import / export */ +m3d_t *m3d_load(unsigned char *data, m3dread_t readfilecb, m3dfree_t freecb, m3d_t *mtllib); +unsigned char *m3d_save(m3d_t *model, int quality, int flags, unsigned int *size); +void m3d_free(m3d_t *model); +/* generate animation pose skeleton */ +m3dtr_t *m3d_frame(m3d_t *model, M3D_INDEX actionid, M3D_INDEX frameid, m3dtr_t *skeleton); +m3db_t *m3d_pose(m3d_t *model, M3D_INDEX actionid, uint32_t msec); + +/* private prototypes used by both importer and exporter */ +char *_m3d_safestr(char *in, int morelines); + +/*** C implementation ***/ +#ifdef M3D_IMPLEMENTATION +#if !defined(M3D_NOIMPORTER) || defined(M3D_EXPORTER) +/* material property definitions */ +static m3dpd_t m3d_propertytypes[] = { + M3D_PROPERTYDEF(m3dpf_color, m3dp_Kd, "Kd"), /* diffuse color */ + M3D_PROPERTYDEF(m3dpf_color, m3dp_Ka, "Ka"), /* ambient color */ + M3D_PROPERTYDEF(m3dpf_color, m3dp_Ks, "Ks"), /* specular color */ + M3D_PROPERTYDEF(m3dpf_float, m3dp_Ns, "Ns"), /* specular exponent */ + M3D_PROPERTYDEF(m3dpf_color, m3dp_Ke, "Ke"), /* emissive (emitting light of this color) */ + M3D_PROPERTYDEF(m3dpf_color, m3dp_Tf, "Tf"), /* transmission color */ + M3D_PROPERTYDEF(m3dpf_float, m3dp_Km, "Km"), /* bump strength */ + M3D_PROPERTYDEF(m3dpf_float, m3dp_d, "d"), /* dissolve (transparency) */ + M3D_PROPERTYDEF(m3dpf_uint8, m3dp_il, "il"), /* illumination model (informational, ignored by PBR-shaders) */ + + M3D_PROPERTYDEF(m3dpf_float, m3dp_Pr, "Pr"), /* roughness */ + M3D_PROPERTYDEF(m3dpf_float, m3dp_Pm, "Pm"), /* metallic, also reflection */ + M3D_PROPERTYDEF(m3dpf_float, m3dp_Ps, "Ps"), /* sheen */ + M3D_PROPERTYDEF(m3dpf_float, m3dp_Ni, "Ni"), /* index of refraction (optical density) */ + M3D_PROPERTYDEF(m3dpf_float, m3dp_Nt, "Nt"), /* thickness of face in millimeter, for printing */ + + /* aliases, note that "map_*" aliases are handled automatically */ + M3D_PROPERTYDEF(m3dpf_map, m3dp_map_Km, "bump"), + M3D_PROPERTYDEF(m3dpf_map, m3dp_map_N, "map_N"),/* as normal map has no scalar version, it's counterpart is 'il' */ + M3D_PROPERTYDEF(m3dpf_map, m3dp_map_Pm, "refl") +}; +/* shape command definitions. if more commands start with the same string, the longer must come first */ +static m3dcd_t m3d_commandtypes[] = { + /* technical */ + M3D_CMDDEF(m3dc_use, "use", 1, m3dcp_mi_t, 0, 0, 0, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_inc, "inc", 3, m3dcp_hi_t, m3dcp_vi_t, m3dcp_qi_t, m3dcp_vi_t, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_mesh, "mesh", 1, m3dcp_fi_t, m3dcp_fi_t, m3dcp_vi_t, m3dcp_qi_t, m3dcp_vi_t, 0, 0, 0), + /* approximations */ + M3D_CMDDEF(m3dc_div, "div", 1, m3dcp_vc_t, 0, 0, 0, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_sub, "sub", 2, m3dcp_vc_t, m3dcp_vc_t, 0, 0, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_len, "len", 1, m3dcp_vc_t, 0, 0, 0, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_dist, "dist", 2, m3dcp_vc_t, m3dcp_vc_t, 0, 0, 0, 0, 0, 0), + /* modifiers */ + M3D_CMDDEF(m3dc_degu, "degu", 1, m3dcp_i1_t, 0, 0, 0, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_deg, "deg", 2, m3dcp_i1_t, m3dcp_i1_t, 0, 0, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_rangeu, "rangeu", 1, m3dcp_ti_t, 0, 0, 0, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_range, "range", 2, m3dcp_ti_t, m3dcp_ti_t, 0, 0, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_paru, "paru", 2, m3dcp_va_t, m3dcp_vc_t, 0, 0, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_parv, "parv", 2, m3dcp_va_t, m3dcp_vc_t, 0, 0, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_trim, "trim", 3, m3dcp_va_t, m3dcp_ti_t, m3dcp_i2_t, 0, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_hole, "hole", 3, m3dcp_va_t, m3dcp_ti_t, m3dcp_i2_t, 0, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_scrv, "scrv", 3, m3dcp_va_t, m3dcp_ti_t, m3dcp_i2_t, 0, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_sp, "sp", 2, m3dcp_va_t, m3dcp_vi_t, 0, 0, 0, 0, 0, 0), + /* helper curves */ + M3D_CMDDEF(m3dc_bez1, "bez1", 2, m3dcp_va_t, m3dcp_vi_t, 0, 0, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_bsp1, "bsp1", 2, m3dcp_va_t, m3dcp_vi_t, 0, 0, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_bez2, "bez2", 2, m3dcp_va_t, m3dcp_vi_t, 0, 0, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_bsp2, "bsp2", 2, m3dcp_va_t, m3dcp_vi_t, 0, 0, 0, 0, 0, 0), + /* surfaces */ + M3D_CMDDEF(m3dc_bezun, "bezun", 4, m3dcp_va_t, m3dcp_vi_t, m3dcp_ti_t, m3dcp_vi_t, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_bezu, "bezu", 3, m3dcp_va_t, m3dcp_vi_t, m3dcp_ti_t, 0, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_bezn, "bezn", 3, m3dcp_va_t, m3dcp_vi_t, m3dcp_vi_t, 0, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_bez, "bez", 2, m3dcp_va_t, m3dcp_vi_t, 0, 0, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_nurbsun, "nurbsun", 4, m3dcp_va_t, m3dcp_vi_t, m3dcp_ti_t, m3dcp_vi_t, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_nurbsu, "nurbsu", 3, m3dcp_va_t, m3dcp_vi_t, m3dcp_ti_t, 0, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_nurbsn, "nurbsn", 3, m3dcp_va_t, m3dcp_vi_t, m3dcp_vi_t, 0, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_nurbs, "nurbs", 2, m3dcp_va_t, m3dcp_vi_t, 0, 0, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_conn, "conn", 6, m3dcp_i2_t, m3dcp_ti_t, m3dcp_i2_t, m3dcp_i2_t, m3dcp_ti_t, m3dcp_i2_t, 0, 0), + /* geometrical */ + M3D_CMDDEF(m3dc_line, "line", 2, m3dcp_va_t, m3dcp_vi_t, 0, 0, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_polygon, "polygon", 2, m3dcp_va_t, m3dcp_vi_t, 0, 0, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_circle, "circle", 3, m3dcp_vi_t, m3dcp_qi_t, m3dcp_vc_t, 0, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_cylinder,"cylinder",6, m3dcp_vi_t, m3dcp_qi_t, m3dcp_vc_t, m3dcp_vi_t, m3dcp_qi_t, m3dcp_vc_t, 0, 0), + M3D_CMDDEF(m3dc_shpere, "shpere", 2, m3dcp_vi_t, m3dcp_vc_t, 0, 0, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_torus, "torus", 4, m3dcp_vi_t, m3dcp_qi_t, m3dcp_vc_t, m3dcp_vc_t, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_cone, "cone", 3, m3dcp_vi_t, m3dcp_vi_t, m3dcp_vi_t, 0, 0, 0, 0, 0), + M3D_CMDDEF(m3dc_cube, "cube", 3, m3dcp_vi_t, m3dcp_vi_t, m3dcp_vi_t, 0, 0, 0, 0, 0) +}; +#endif + +#include +#include + +/* we'll need this with M3D_NOTEXTURE */ +char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header); + +#ifndef M3D_NOTEXTURE +#if !defined(M3D_NOIMPORTER) && !defined(STBI_INCLUDE_STB_IMAGE_H) +/* PNG decompressor from + + stb_image - v2.23 - public domain image loader - http://nothings.org/stb_image.h +*/ +static const char *_m3dstbi__g_failure_reason; + +enum +{ + STBI_default = 0, + + STBI_grey = 1, + STBI_grey_alpha = 2, + STBI_rgb = 3, + STBI_rgb_alpha = 4 +}; + +enum +{ + STBI__SCAN_load=0, + STBI__SCAN_type, + STBI__SCAN_header +}; + +typedef unsigned short _m3dstbi_us; + +typedef uint16_t _m3dstbi__uint16; +typedef int16_t _m3dstbi__int16; +typedef uint32_t _m3dstbi__uint32; +typedef int32_t _m3dstbi__int32; + +typedef struct +{ + _m3dstbi__uint32 img_x, img_y; + int img_n, img_out_n; + + void *io_user_data; + + int read_from_callbacks; + int buflen; + unsigned char buffer_start[128]; + + unsigned char *img_buffer, *img_buffer_end; + unsigned char *img_buffer_original, *img_buffer_original_end; +} _m3dstbi__context; + +typedef struct +{ + int bits_per_channel; + int num_channels; + int channel_order; +} _m3dstbi__result_info; + +#define STBI_ASSERT(v) +#define STBI_NOTUSED(v) (void)sizeof(v) +#define STBI__BYTECAST(x) ((unsigned char) ((x) & 255)) +#define STBI_MALLOC(sz) M3D_MALLOC(sz) +#define STBI_REALLOC(p,newsz) M3D_REALLOC(p,newsz) +#define STBI_FREE(p) M3D_FREE(p) +#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) + +_inline static unsigned char _m3dstbi__get8(_m3dstbi__context *s) +{ + if (s->img_buffer < s->img_buffer_end) + return *s->img_buffer++; + return 0; +} + +_inline static int _m3dstbi__at_eof(_m3dstbi__context *s) +{ + return s->img_buffer >= s->img_buffer_end; +} + +static void _m3dstbi__skip(_m3dstbi__context *s, int n) +{ + if (n < 0) { + s->img_buffer = s->img_buffer_end; + return; + } + s->img_buffer += n; +} + +static int _m3dstbi__getn(_m3dstbi__context *s, unsigned char *buffer, int n) +{ + if (s->img_buffer+n <= s->img_buffer_end) { + memcpy(buffer, s->img_buffer, n); + s->img_buffer += n; + return 1; + } else + return 0; +} + +static int _m3dstbi__get16be(_m3dstbi__context *s) +{ + int z = _m3dstbi__get8(s); + return (z << 8) + _m3dstbi__get8(s); +} + +static _m3dstbi__uint32 _m3dstbi__get32be(_m3dstbi__context *s) +{ + _m3dstbi__uint32 z = _m3dstbi__get16be(s); + return (z << 16) + _m3dstbi__get16be(s); +} + +#define _m3dstbi__err(x,y) _m3dstbi__errstr(y) +static int _m3dstbi__errstr(const char *str) +{ + _m3dstbi__g_failure_reason = str; + return 0; +} + +_inline static void *_m3dstbi__malloc(size_t size) +{ + return STBI_MALLOC(size); +} + +static int _m3dstbi__addsizes_valid(int a, int b) +{ + if (b < 0) return 0; + return a <= 2147483647 - b; +} + +static int _m3dstbi__mul2sizes_valid(int a, int b) +{ + if (a < 0 || b < 0) return 0; + if (b == 0) return 1; + return a <= 2147483647/b; +} + +static int _m3dstbi__mad2sizes_valid(int a, int b, int add) +{ + return _m3dstbi__mul2sizes_valid(a, b) && _m3dstbi__addsizes_valid(a*b, add); +} + +static int _m3dstbi__mad3sizes_valid(int a, int b, int c, int add) +{ + return _m3dstbi__mul2sizes_valid(a, b) && _m3dstbi__mul2sizes_valid(a*b, c) && + _m3dstbi__addsizes_valid(a*b*c, add); +} + +static void *_m3dstbi__malloc_mad2(int a, int b, int add) +{ + if (!_m3dstbi__mad2sizes_valid(a, b, add)) return NULL; + return _m3dstbi__malloc(a*b + add); +} + +static void *_m3dstbi__malloc_mad3(int a, int b, int c, int add) +{ + if (!_m3dstbi__mad3sizes_valid(a, b, c, add)) return NULL; + return _m3dstbi__malloc(a*b*c + add); +} + +static unsigned char _m3dstbi__compute_y(int r, int g, int b) +{ + return (unsigned char) (((r*77) + (g*150) + (29*b)) >> 8); +} + +static unsigned char *_m3dstbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + unsigned char *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (unsigned char *) _m3dstbi__malloc_mad3(req_comp, x, y, 0); + if (good == NULL) { + STBI_FREE(data); + _m3dstbi__err("outofmem", "Out of memory"); + return NULL; + } + + for (j=0; j < (int) y; ++j) { + unsigned char *src = data + j * x * img_n ; + unsigned char *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0], dest[1]=255; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; } break; + STBI__CASE(3,1) { dest[0]=_m3dstbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=_m3dstbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; } break; + STBI__CASE(4,1) { dest[0]=_m3dstbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=_m3dstbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; } break; + default: STBI_ASSERT(0); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} + +static _m3dstbi__uint16 _m3dstbi__compute_y_16(int r, int g, int b) +{ + return (_m3dstbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8); +} + +static _m3dstbi__uint16 *_m3dstbi__convert_format16(_m3dstbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + _m3dstbi__uint16 *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (_m3dstbi__uint16 *) _m3dstbi__malloc(req_comp * x * y * 2); + if (good == NULL) { + STBI_FREE(data); + _m3dstbi__err("outofmem", "Out of memory"); + return NULL; + } + + for (j=0; j < (int) y; ++j) { + _m3dstbi__uint16 *src = data + j * x * img_n ; + _m3dstbi__uint16 *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0], dest[1]=0xffff; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=0xffff; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=0xffff; } break; + STBI__CASE(3,1) { dest[0]=_m3dstbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=_m3dstbi__compute_y_16(src[0],src[1],src[2]), dest[1] = 0xffff; } break; + STBI__CASE(4,1) { dest[0]=_m3dstbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=_m3dstbi__compute_y_16(src[0],src[1],src[2]), dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; } break; + default: STBI_ASSERT(0); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} + +#define STBI__ZFAST_BITS 9 +#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) + +typedef struct +{ + _m3dstbi__uint16 fast[1 << STBI__ZFAST_BITS]; + _m3dstbi__uint16 firstcode[16]; + int maxcode[17]; + _m3dstbi__uint16 firstsymbol[16]; + unsigned char size[288]; + _m3dstbi__uint16 value[288]; +} _m3dstbi__zhuffman; + +_inline static int _m3dstbi__bitreverse16(int n) +{ + n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); + n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); + n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); + n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); + return n; +} + +_inline static int _m3dstbi__bit_reverse(int v, int bits) +{ + STBI_ASSERT(bits <= 16); + return _m3dstbi__bitreverse16(v) >> (16-bits); +} + +static int _m3dstbi__zbuild_huffman(_m3dstbi__zhuffman *z, unsigned char *sizelist, int num) +{ + int i,k=0; + int code, next_code[16], sizes[17]; + + memset(sizes, 0, sizeof(sizes)); + memset(z->fast, 0, sizeof(z->fast)); + for (i=0; i < num; ++i) + ++sizes[sizelist[i]]; + sizes[0] = 0; + for (i=1; i < 16; ++i) + if (sizes[i] > (1 << i)) + return _m3dstbi__err("bad sizes", "Corrupt PNG"); + code = 0; + for (i=1; i < 16; ++i) { + next_code[i] = code; + z->firstcode[i] = (_m3dstbi__uint16) code; + z->firstsymbol[i] = (_m3dstbi__uint16) k; + code = (code + sizes[i]); + if (sizes[i]) + if (code-1 >= (1 << i)) return _m3dstbi__err("bad codelengths","Corrupt PNG"); + z->maxcode[i] = code << (16-i); + code <<= 1; + k += sizes[i]; + } + z->maxcode[16] = 0x10000; + for (i=0; i < num; ++i) { + int s = sizelist[i]; + if (s) { + int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; + _m3dstbi__uint16 fastv = (_m3dstbi__uint16) ((s << 9) | i); + z->size [c] = (unsigned char ) s; + z->value[c] = (_m3dstbi__uint16) i; + if (s <= STBI__ZFAST_BITS) { + int j = _m3dstbi__bit_reverse(next_code[s],s); + while (j < (1 << STBI__ZFAST_BITS)) { + z->fast[j] = fastv; + j += (1 << s); + } + } + ++next_code[s]; + } + } + return 1; +} + +typedef struct +{ + unsigned char *zbuffer, *zbuffer_end; + int num_bits; + _m3dstbi__uint32 code_buffer; + + char *zout; + char *zout_start; + char *zout_end; + int z_expandable; + + _m3dstbi__zhuffman z_length, z_distance; +} _m3dstbi__zbuf; + +_inline static unsigned char _m3dstbi__zget8(_m3dstbi__zbuf *z) +{ + if (z->zbuffer >= z->zbuffer_end) return 0; + return *z->zbuffer++; +} + +static void _m3dstbi__fill_bits(_m3dstbi__zbuf *z) +{ + do { + STBI_ASSERT(z->code_buffer < (1U << z->num_bits)); + z->code_buffer |= (unsigned int) _m3dstbi__zget8(z) << z->num_bits; + z->num_bits += 8; + } while (z->num_bits <= 24); +} + +_inline static unsigned int _m3dstbi__zreceive(_m3dstbi__zbuf *z, int n) +{ + unsigned int k; + if (z->num_bits < n) _m3dstbi__fill_bits(z); + k = z->code_buffer & ((1 << n) - 1); + z->code_buffer >>= n; + z->num_bits -= n; + return k; +} + +static int _m3dstbi__zhuffman_decode_slowpath(_m3dstbi__zbuf *a, _m3dstbi__zhuffman *z) +{ + int b,s,k; + k = _m3dstbi__bit_reverse(a->code_buffer, 16); + for (s=STBI__ZFAST_BITS+1; ; ++s) + if (k < z->maxcode[s]) + break; + if (s == 16) return -1; + b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; + STBI_ASSERT(z->size[b] == s); + a->code_buffer >>= s; + a->num_bits -= s; + return z->value[b]; +} + +_inline static int _m3dstbi__zhuffman_decode(_m3dstbi__zbuf *a, _m3dstbi__zhuffman *z) +{ + int b,s; + if (a->num_bits < 16) _m3dstbi__fill_bits(a); + b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; + if (b) { + s = b >> 9; + a->code_buffer >>= s; + a->num_bits -= s; + return b & 511; + } + return _m3dstbi__zhuffman_decode_slowpath(a, z); +} + +static int _m3dstbi__zexpand(_m3dstbi__zbuf *z, char *zout, int n) +{ + char *q; + int cur, limit, old_limit; + z->zout = zout; + if (!z->z_expandable) return _m3dstbi__err("output buffer limit","Corrupt PNG"); + cur = (int) (z->zout - z->zout_start); + limit = old_limit = (int) (z->zout_end - z->zout_start); + while (cur + n > limit) + limit *= 2; + q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); + STBI_NOTUSED(old_limit); + if (q == NULL) return _m3dstbi__err("outofmem", "Out of memory"); + z->zout_start = q; + z->zout = q + cur; + z->zout_end = q + limit; + return 1; +} + +static int _m3dstbi__zlength_base[31] = { + 3,4,5,6,7,8,9,10,11,13, + 15,17,19,23,27,31,35,43,51,59, + 67,83,99,115,131,163,195,227,258,0,0 }; + +static int _m3dstbi__zlength_extra[31]= +{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; + +static int _m3dstbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, +257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; + +static int _m3dstbi__zdist_extra[32] = +{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +static int _m3dstbi__parse_huffman_block(_m3dstbi__zbuf *a) +{ + char *zout = a->zout; + for(;;) { + int z = _m3dstbi__zhuffman_decode(a, &a->z_length); + if (z < 256) { + if (z < 0) return _m3dstbi__err("bad huffman code","Corrupt PNG"); + if (zout >= a->zout_end) { + if (!_m3dstbi__zexpand(a, zout, 1)) return 0; + zout = a->zout; + } + *zout++ = (char) z; + } else { + unsigned char *p; + int len,dist; + if (z == 256) { + a->zout = zout; + return 1; + } + z -= 257; + len = _m3dstbi__zlength_base[z]; + if (_m3dstbi__zlength_extra[z]) len += _m3dstbi__zreceive(a, _m3dstbi__zlength_extra[z]); + z = _m3dstbi__zhuffman_decode(a, &a->z_distance); + if (z < 0) return _m3dstbi__err("bad huffman code","Corrupt PNG"); + dist = _m3dstbi__zdist_base[z]; + if (_m3dstbi__zdist_extra[z]) dist += _m3dstbi__zreceive(a, _m3dstbi__zdist_extra[z]); + if (zout - a->zout_start < dist) return _m3dstbi__err("bad dist","Corrupt PNG"); + if (zout + len > a->zout_end) { + if (!_m3dstbi__zexpand(a, zout, len)) return 0; + zout = a->zout; + } + p = (unsigned char *) (zout - dist); + if (dist == 1) { + unsigned char v = *p; + if (len) { do *zout++ = v; while (--len); } + } else { + if (len) { do *zout++ = *p++; while (--len); } + } + } + } +} + +static int _m3dstbi__compute_huffman_codes(_m3dstbi__zbuf *a) +{ + static unsigned char length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + _m3dstbi__zhuffman z_codelength; + unsigned char lencodes[286+32+137]; + unsigned char codelength_sizes[19]; + int i,n; + + int hlit = _m3dstbi__zreceive(a,5) + 257; + int hdist = _m3dstbi__zreceive(a,5) + 1; + int hclen = _m3dstbi__zreceive(a,4) + 4; + int ntot = hlit + hdist; + + memset(codelength_sizes, 0, sizeof(codelength_sizes)); + for (i=0; i < hclen; ++i) { + int s = _m3dstbi__zreceive(a,3); + codelength_sizes[length_dezigzag[i]] = (unsigned char) s; + } + if (!_m3dstbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; + + n = 0; + while (n < ntot) { + int c = _m3dstbi__zhuffman_decode(a, &z_codelength); + if (c < 0 || c >= 19) return _m3dstbi__err("bad codelengths", "Corrupt PNG"); + if (c < 16) + lencodes[n++] = (unsigned char) c; + else { + unsigned char fill = 0; + if (c == 16) { + c = _m3dstbi__zreceive(a,2)+3; + if (n == 0) return _m3dstbi__err("bad codelengths", "Corrupt PNG"); + fill = lencodes[n-1]; + } else if (c == 17) + c = _m3dstbi__zreceive(a,3)+3; + else { + STBI_ASSERT(c == 18); + c = _m3dstbi__zreceive(a,7)+11; + } + if (ntot - n < c) return _m3dstbi__err("bad codelengths", "Corrupt PNG"); + memset(lencodes+n, fill, c); + n += c; + } + } + if (n != ntot) return _m3dstbi__err("bad codelengths","Corrupt PNG"); + if (!_m3dstbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; + if (!_m3dstbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; + return 1; +} + +_inline static int _m3dstbi__parse_uncompressed_block(_m3dstbi__zbuf *a) +{ + unsigned char header[4]; + int len,nlen,k; + if (a->num_bits & 7) + _m3dstbi__zreceive(a, a->num_bits & 7); + k = 0; + while (a->num_bits > 0) { + header[k++] = (unsigned char) (a->code_buffer & 255); + a->code_buffer >>= 8; + a->num_bits -= 8; + } + STBI_ASSERT(a->num_bits == 0); + while (k < 4) + header[k++] = _m3dstbi__zget8(a); + len = header[1] * 256 + header[0]; + nlen = header[3] * 256 + header[2]; + if (nlen != (len ^ 0xffff)) return _m3dstbi__err("zlib corrupt","Corrupt PNG"); + if (a->zbuffer + len > a->zbuffer_end) return _m3dstbi__err("read past buffer","Corrupt PNG"); + if (a->zout + len > a->zout_end) + if (!_m3dstbi__zexpand(a, a->zout, len)) return 0; + memcpy(a->zout, a->zbuffer, len); + a->zbuffer += len; + a->zout += len; + return 1; +} + +static int _m3dstbi__parse_zlib_header(_m3dstbi__zbuf *a) +{ + int cmf = _m3dstbi__zget8(a); + int cm = cmf & 15; + /* int cinfo = cmf >> 4; */ + int flg = _m3dstbi__zget8(a); + if ((cmf*256+flg) % 31 != 0) return _m3dstbi__err("bad zlib header","Corrupt PNG"); + if (flg & 32) return _m3dstbi__err("no preset dict","Corrupt PNG"); + if (cm != 8) return _m3dstbi__err("bad compression","Corrupt PNG"); + return 1; +} + +static unsigned char _m3dstbi__zdefault_length[288], _m3dstbi__zdefault_distance[32]; +static void _m3dstbi__init_zdefaults(void) +{ + int i; + for (i=0; i <= 143; ++i) _m3dstbi__zdefault_length[i] = 8; + for ( ; i <= 255; ++i) _m3dstbi__zdefault_length[i] = 9; + for ( ; i <= 279; ++i) _m3dstbi__zdefault_length[i] = 7; + for ( ; i <= 287; ++i) _m3dstbi__zdefault_length[i] = 8; + + for (i=0; i <= 31; ++i) _m3dstbi__zdefault_distance[i] = 5; +} + +static int _m3dstbi__parse_zlib(_m3dstbi__zbuf *a, int parse_header) +{ + int final, type; + if (parse_header) + if (!_m3dstbi__parse_zlib_header(a)) return 0; + a->num_bits = 0; + a->code_buffer = 0; + do { + final = _m3dstbi__zreceive(a,1); + type = _m3dstbi__zreceive(a,2); + if (type == 0) { + if (!_m3dstbi__parse_uncompressed_block(a)) return 0; + } else if (type == 3) { + return 0; + } else { + if (type == 1) { + if (!_m3dstbi__zbuild_huffman(&a->z_length , _m3dstbi__zdefault_length , 288)) return 0; + if (!_m3dstbi__zbuild_huffman(&a->z_distance, _m3dstbi__zdefault_distance, 32)) return 0; + } else { + if (!_m3dstbi__compute_huffman_codes(a)) return 0; + } + if (!_m3dstbi__parse_huffman_block(a)) return 0; + } + } while (!final); + return 1; +} + +static int _m3dstbi__do_zlib(_m3dstbi__zbuf *a, char *obuf, int olen, int exp, int parse_header) +{ + a->zout_start = obuf; + a->zout = obuf; + a->zout_end = obuf + olen; + a->z_expandable = exp; + _m3dstbi__init_zdefaults(); + return _m3dstbi__parse_zlib(a, parse_header); +} + +char *_m3dstbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) +{ + _m3dstbi__zbuf a; + char *p = (char *) _m3dstbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (unsigned char *) buffer; + a.zbuffer_end = (unsigned char *) buffer + len; + if (_m3dstbi__do_zlib(&a, p, initial_size, 1, parse_header)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +typedef struct +{ + _m3dstbi__uint32 length; + _m3dstbi__uint32 type; +} _m3dstbi__pngchunk; + +static _m3dstbi__pngchunk _m3dstbi__get_chunk_header(_m3dstbi__context *s) +{ + _m3dstbi__pngchunk c; + c.length = _m3dstbi__get32be(s); + c.type = _m3dstbi__get32be(s); + return c; +} + +_inline static int _m3dstbi__check_png_header(_m3dstbi__context *s) +{ + static unsigned char png_sig[8] = { 137,80,78,71,13,10,26,10 }; + int i; + for (i=0; i < 8; ++i) + if (_m3dstbi__get8(s) != png_sig[i]) return _m3dstbi__err("bad png sig","Not a PNG"); + return 1; +} + +typedef struct +{ + _m3dstbi__context *s; + unsigned char *idata, *expanded, *out; + int depth; +} _m3dstbi__png; + + +enum { + STBI__F_none=0, + STBI__F_sub=1, + STBI__F_up=2, + STBI__F_avg=3, + STBI__F_paeth=4, + STBI__F_avg_first, + STBI__F_paeth_first +}; + +static unsigned char first_row_filter[5] = +{ + STBI__F_none, + STBI__F_sub, + STBI__F_none, + STBI__F_avg_first, + STBI__F_paeth_first +}; + +static int _m3dstbi__paeth(int a, int b, int c) +{ + int p = a + b - c; + int pa = abs(p-a); + int pb = abs(p-b); + int pc = abs(p-c); + if (pa <= pb && pa <= pc) return a; + if (pb <= pc) return b; + return c; +} + +static unsigned char _m3dstbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; + +static int _m3dstbi__create_png_image_raw(_m3dstbi__png *a, unsigned char *raw, _m3dstbi__uint32 raw_len, int out_n, _m3dstbi__uint32 x, _m3dstbi__uint32 y, int depth, int color) +{ + int bytes = (depth == 16? 2 : 1); + _m3dstbi__context *s = a->s; + _m3dstbi__uint32 i,j,stride = x*out_n*bytes; + _m3dstbi__uint32 img_len, img_width_bytes; + int k; + int img_n = s->img_n; + + int output_bytes = out_n*bytes; + int filter_bytes = img_n*bytes; + int width = x; + + STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); + a->out = (unsigned char *) _m3dstbi__malloc_mad3(x, y, output_bytes, 0); + if (!a->out) return _m3dstbi__err("outofmem", "Out of memory"); + + if (!_m3dstbi__mad3sizes_valid(img_n, x, depth, 7)) return _m3dstbi__err("too large", "Corrupt PNG"); + img_width_bytes = (((img_n * x * depth) + 7) >> 3); + img_len = (img_width_bytes + 1) * y; + if (s->img_x == x && s->img_y == y) { + if (raw_len != img_len) return _m3dstbi__err("not enough pixels","Corrupt PNG"); + } else { + if (raw_len < img_len) return _m3dstbi__err("not enough pixels","Corrupt PNG"); + } + + for (j=0; j < y; ++j) { + unsigned char *cur = a->out + stride*j; + unsigned char *prior = cur - stride; + int filter = *raw++; + + if (filter > 4) + return _m3dstbi__err("invalid filter","Corrupt PNG"); + + if (depth < 8) { + STBI_ASSERT(img_width_bytes <= x); + cur += x*out_n - img_width_bytes; + filter_bytes = 1; + width = img_width_bytes; + } + prior = cur - stride; + + if (j == 0) filter = first_row_filter[filter]; + + for (k=0; k < filter_bytes; ++k) { + switch (filter) { + case STBI__F_none : cur[k] = raw[k]; break; + case STBI__F_sub : cur[k] = raw[k]; break; + case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; + case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); break; + case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + _m3dstbi__paeth(0,prior[k],0)); break; + case STBI__F_avg_first : cur[k] = raw[k]; break; + case STBI__F_paeth_first: cur[k] = raw[k]; break; + } + } + + if (depth == 8) { + if (img_n != out_n) + cur[img_n] = 255; + raw += img_n; + cur += out_n; + prior += out_n; + } else if (depth == 16) { + if (img_n != out_n) { + cur[filter_bytes] = 255; + cur[filter_bytes+1] = 255; + } + raw += filter_bytes; + cur += output_bytes; + prior += output_bytes; + } else { + raw += 1; + cur += 1; + prior += 1; + } + + if (depth < 8 || img_n == out_n) { + int nk = (width - 1)*filter_bytes; + #define STBI__CASE(f) \ + case f: \ + for (k=0; k < nk; ++k) + switch (filter) { + case STBI__F_none: memcpy(cur, raw, nk); break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); } break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); } break; + STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + _m3dstbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); } break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); } break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + _m3dstbi__paeth(cur[k-filter_bytes],0,0)); } break; + } + #undef STBI__CASE + raw += nk; + } else { + STBI_ASSERT(img_n+1 == out_n); + #define STBI__CASE(f) \ + case f: \ + for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \ + for (k=0; k < filter_bytes; ++k) + switch (filter) { + STBI__CASE(STBI__F_none) { cur[k] = raw[k]; } break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); } break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); } break; + STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + _m3dstbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); } break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); } break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + _m3dstbi__paeth(cur[k- output_bytes],0,0)); } break; + } + #undef STBI__CASE + + if (depth == 16) { + cur = a->out + stride*j; + for (i=0; i < x; ++i,cur+=output_bytes) { + cur[filter_bytes+1] = 255; + } + } + } + } + + if (depth < 8) { + for (j=0; j < y; ++j) { + unsigned char *cur = a->out + stride*j; + unsigned char *in = a->out + stride*j + x*out_n - img_width_bytes; + unsigned char scale = (color == 0) ? _m3dstbi__depth_scale_table[depth] : 1; + + if (depth == 4) { + for (k=x*img_n; k >= 2; k-=2, ++in) { + *cur++ = scale * ((*in >> 4) ); + *cur++ = scale * ((*in ) & 0x0f); + } + if (k > 0) *cur++ = scale * ((*in >> 4) ); + } else if (depth == 2) { + for (k=x*img_n; k >= 4; k-=4, ++in) { + *cur++ = scale * ((*in >> 6) ); + *cur++ = scale * ((*in >> 4) & 0x03); + *cur++ = scale * ((*in >> 2) & 0x03); + *cur++ = scale * ((*in ) & 0x03); + } + if (k > 0) *cur++ = scale * ((*in >> 6) ); + if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03); + if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03); + } else if (depth == 1) { + for (k=x*img_n; k >= 8; k-=8, ++in) { + *cur++ = scale * ((*in >> 7) ); + *cur++ = scale * ((*in >> 6) & 0x01); + *cur++ = scale * ((*in >> 5) & 0x01); + *cur++ = scale * ((*in >> 4) & 0x01); + *cur++ = scale * ((*in >> 3) & 0x01); + *cur++ = scale * ((*in >> 2) & 0x01); + *cur++ = scale * ((*in >> 1) & 0x01); + *cur++ = scale * ((*in ) & 0x01); + } + if (k > 0) *cur++ = scale * ((*in >> 7) ); + if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01); + if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01); + if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01); + if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01); + if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01); + if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01); + } + if (img_n != out_n) { + int q; + cur = a->out + stride*j; + if (img_n == 1) { + for (q=x-1; q >= 0; --q) { + cur[q*2+1] = 255; + cur[q*2+0] = cur[q]; + } + } else { + STBI_ASSERT(img_n == 3); + for (q=x-1; q >= 0; --q) { + cur[q*4+3] = 255; + cur[q*4+2] = cur[q*3+2]; + cur[q*4+1] = cur[q*3+1]; + cur[q*4+0] = cur[q*3+0]; + } + } + } + } + } else if (depth == 16) { + unsigned char *cur = a->out; + _m3dstbi__uint16 *cur16 = (_m3dstbi__uint16*)cur; + + for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) { + *cur16 = (cur[0] << 8) | cur[1]; + } + } + + return 1; +} + +static int _m3dstbi__create_png_image(_m3dstbi__png *a, unsigned char *image_data, _m3dstbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced) +{ + int bytes = (depth == 16 ? 2 : 1); + int out_bytes = out_n * bytes; + unsigned char *final; + int p; + if (!interlaced) + return _m3dstbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); + + final = (unsigned char *) _m3dstbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); + for (p=0; p < 7; ++p) { + int xorig[] = { 0,4,0,2,0,1,0 }; + int yorig[] = { 0,0,4,0,2,0,1 }; + int xspc[] = { 8,8,4,4,2,2,1 }; + int yspc[] = { 8,8,8,4,4,2,2 }; + int i,j,x,y; + x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; + y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; + if (x && y) { + _m3dstbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y; + if (!_m3dstbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) { + STBI_FREE(final); + return 0; + } + for (j=0; j < y; ++j) { + for (i=0; i < x; ++i) { + int out_y = j*yspc[p]+yorig[p]; + int out_x = i*xspc[p]+xorig[p]; + memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes, + a->out + (j*x+i)*out_bytes, out_bytes); + } + } + STBI_FREE(a->out); + image_data += img_len; + image_data_len -= img_len; + } + } + a->out = final; + + return 1; +} + +static int _m3dstbi__compute_transparency(_m3dstbi__png *z, unsigned char tc[3], int out_n) +{ + _m3dstbi__context *s = z->s; + _m3dstbi__uint32 i, pixel_count = s->img_x * s->img_y; + unsigned char *p = z->out; + + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i=0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 255); + p += 2; + } + } else { + for (i=0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int _m3dstbi__compute_transparency16(_m3dstbi__png *z, _m3dstbi__uint16 tc[3], int out_n) +{ + _m3dstbi__context *s = z->s; + _m3dstbi__uint32 i, pixel_count = s->img_x * s->img_y; + _m3dstbi__uint16 *p = (_m3dstbi__uint16*) z->out; + + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i = 0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 65535); + p += 2; + } + } else { + for (i = 0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int _m3dstbi__expand_png_palette(_m3dstbi__png *a, unsigned char *palette, int len, int pal_img_n) +{ + _m3dstbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; + unsigned char *p, *temp_out, *orig = a->out; + + p = (unsigned char *) _m3dstbi__malloc_mad2(pixel_count, pal_img_n, 0); + if (p == NULL) return _m3dstbi__err("outofmem", "Out of memory"); + + temp_out = p; + + if (pal_img_n == 3) { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p += 3; + } + } else { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p[3] = palette[n+3]; + p += 4; + } + } + STBI_FREE(a->out); + a->out = temp_out; + + STBI_NOTUSED(len); + + return 1; +} + +#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d)) + +static int _m3dstbi__parse_png_file(_m3dstbi__png *z, int scan, int req_comp) +{ + unsigned char palette[1024], pal_img_n=0; + unsigned char has_trans=0, tc[3]; + _m3dstbi__uint16 tc16[3]; + _m3dstbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; + int first=1,k,interlace=0, color=0; + _m3dstbi__context *s = z->s; + + z->expanded = NULL; + z->idata = NULL; + z->out = NULL; + + if (!_m3dstbi__check_png_header(s)) return 0; + + if (scan == STBI__SCAN_type) return 1; + + for (;;) { + _m3dstbi__pngchunk c = _m3dstbi__get_chunk_header(s); + switch (c.type) { + case STBI__PNG_TYPE('C','g','B','I'): + _m3dstbi__skip(s, c.length); + break; + case STBI__PNG_TYPE('I','H','D','R'): { + int comp,filter; + if (!first) return _m3dstbi__err("multiple IHDR","Corrupt PNG"); + first = 0; + if (c.length != 13) return _m3dstbi__err("bad IHDR len","Corrupt PNG"); + s->img_x = _m3dstbi__get32be(s); if (s->img_x > (1 << 24)) return _m3dstbi__err("too large","Very large image (corrupt?)"); + s->img_y = _m3dstbi__get32be(s); if (s->img_y > (1 << 24)) return _m3dstbi__err("too large","Very large image (corrupt?)"); + z->depth = _m3dstbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return _m3dstbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only"); + color = _m3dstbi__get8(s); if (color > 6) return _m3dstbi__err("bad ctype","Corrupt PNG"); + if (color == 3 && z->depth == 16) return _m3dstbi__err("bad ctype","Corrupt PNG"); + if (color == 3) pal_img_n = 3; else if (color & 1) return _m3dstbi__err("bad ctype","Corrupt PNG"); + comp = _m3dstbi__get8(s); if (comp) return _m3dstbi__err("bad comp method","Corrupt PNG"); + filter= _m3dstbi__get8(s); if (filter) return _m3dstbi__err("bad filter method","Corrupt PNG"); + interlace = _m3dstbi__get8(s); if (interlace>1) return _m3dstbi__err("bad interlace method","Corrupt PNG"); + if (!s->img_x || !s->img_y) return _m3dstbi__err("0-pixel image","Corrupt PNG"); + if (!pal_img_n) { + s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); + if ((1 << 30) / s->img_x / s->img_n < s->img_y) return _m3dstbi__err("too large", "Image too large to decode"); + if (scan == STBI__SCAN_header) return 1; + } else { + s->img_n = 1; + if ((1 << 30) / s->img_x / 4 < s->img_y) return _m3dstbi__err("too large","Corrupt PNG"); + } + break; + } + + case STBI__PNG_TYPE('P','L','T','E'): { + if (first) return _m3dstbi__err("first not IHDR", "Corrupt PNG"); + if (c.length > 256*3) return _m3dstbi__err("invalid PLTE","Corrupt PNG"); + pal_len = c.length / 3; + if (pal_len * 3 != c.length) return _m3dstbi__err("invalid PLTE","Corrupt PNG"); + for (i=0; i < pal_len; ++i) { + palette[i*4+0] = _m3dstbi__get8(s); + palette[i*4+1] = _m3dstbi__get8(s); + palette[i*4+2] = _m3dstbi__get8(s); + palette[i*4+3] = 255; + } + break; + } + + case STBI__PNG_TYPE('t','R','N','S'): { + if (first) return _m3dstbi__err("first not IHDR", "Corrupt PNG"); + if (z->idata) return _m3dstbi__err("tRNS after IDAT","Corrupt PNG"); + if (pal_img_n) { + if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; } + if (pal_len == 0) return _m3dstbi__err("tRNS before PLTE","Corrupt PNG"); + if (c.length > pal_len) return _m3dstbi__err("bad tRNS len","Corrupt PNG"); + pal_img_n = 4; + for (i=0; i < c.length; ++i) + palette[i*4+3] = _m3dstbi__get8(s); + } else { + if (!(s->img_n & 1)) return _m3dstbi__err("tRNS with alpha","Corrupt PNG"); + if (c.length != (_m3dstbi__uint32) s->img_n*2) return _m3dstbi__err("bad tRNS len","Corrupt PNG"); + has_trans = 1; + if (z->depth == 16) { + for (k = 0; k < s->img_n; ++k) tc16[k] = (_m3dstbi__uint16)_m3dstbi__get16be(s); + } else { + for (k = 0; k < s->img_n; ++k) tc[k] = (unsigned char)(_m3dstbi__get16be(s) & 255) * _m3dstbi__depth_scale_table[z->depth]; + } + } + break; + } + + case STBI__PNG_TYPE('I','D','A','T'): { + if (first) return _m3dstbi__err("first not IHDR", "Corrupt PNG"); + if (pal_img_n && !pal_len) return _m3dstbi__err("no PLTE","Corrupt PNG"); + if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; } + if ((int)(ioff + c.length) < (int)ioff) return 0; + if (ioff + c.length > idata_limit) { + _m3dstbi__uint32 idata_limit_old = idata_limit; + unsigned char *p; + if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; + while (ioff + c.length > idata_limit) + idata_limit *= 2; + STBI_NOTUSED(idata_limit_old); + p = (unsigned char *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return _m3dstbi__err("outofmem", "Out of memory"); + z->idata = p; + } + if (!_m3dstbi__getn(s, z->idata+ioff,c.length)) return _m3dstbi__err("outofdata","Corrupt PNG"); + ioff += c.length; + break; + } + + case STBI__PNG_TYPE('I','E','N','D'): { + _m3dstbi__uint32 raw_len, bpl; + if (first) return _m3dstbi__err("first not IHDR", "Corrupt PNG"); + if (scan != STBI__SCAN_load) return 1; + if (z->idata == NULL) return _m3dstbi__err("no IDAT","Corrupt PNG"); + bpl = (s->img_x * z->depth + 7) / 8; + raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; + z->expanded = (unsigned char *) _m3dstbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, 1); + if (z->expanded == NULL) return 0; + STBI_FREE(z->idata); z->idata = NULL; + if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) + s->img_out_n = s->img_n+1; + else + s->img_out_n = s->img_n; + if (!_m3dstbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0; + if (has_trans) { + if (z->depth == 16) { + if (!_m3dstbi__compute_transparency16(z, tc16, s->img_out_n)) return 0; + } else { + if (!_m3dstbi__compute_transparency(z, tc, s->img_out_n)) return 0; + } + } + if (pal_img_n) { + s->img_n = pal_img_n; + s->img_out_n = pal_img_n; + if (req_comp >= 3) s->img_out_n = req_comp; + if (!_m3dstbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) + return 0; + } else if (has_trans) { + ++s->img_n; + } + STBI_FREE(z->expanded); z->expanded = NULL; + return 1; + } + + default: + if (first) return _m3dstbi__err("first not IHDR", "Corrupt PNG"); + if ((c.type & (1 << 29)) == 0) { + return _m3dstbi__err("invalid_chunk", "PNG not supported: unknown PNG chunk type"); + } + _m3dstbi__skip(s, c.length); + break; + } + _m3dstbi__get32be(s); + } +} + +static void *_m3dstbi__do_png(_m3dstbi__png *p, int *x, int *y, int *n, int req_comp, _m3dstbi__result_info *ri) +{ + void *result=NULL; + if (req_comp < 0 || req_comp > 4) { _m3dstbi__err("bad req_comp", "Internal error"); return NULL; } + if (_m3dstbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { + if (p->depth < 8) + ri->bits_per_channel = 8; + else + ri->bits_per_channel = p->depth; + result = p->out; + p->out = NULL; + if (req_comp && req_comp != p->s->img_out_n) { + if (ri->bits_per_channel == 8) + result = _m3dstbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + else + result = _m3dstbi__convert_format16((_m3dstbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + p->s->img_out_n = req_comp; + if (result == NULL) return result; + } + *x = p->s->img_x; + *y = p->s->img_y; + if (n) *n = p->s->img_n; + } + STBI_FREE(p->out); p->out = NULL; + STBI_FREE(p->expanded); p->expanded = NULL; + STBI_FREE(p->idata); p->idata = NULL; + + return result; +} + +static void *_m3dstbi__png_load(_m3dstbi__context *s, int *x, int *y, int *comp, int req_comp, _m3dstbi__result_info *ri) +{ + _m3dstbi__png p; + p.s = s; + return _m3dstbi__do_png(&p, x,y,comp,req_comp, ri); +} +#define stbi__context _m3dstbi__context +#define stbi__result_info _m3dstbi__result_info +#define stbi__png_load _m3dstbi__png_load +#define stbi_zlib_decode_malloc_guesssize_headerflag _m3dstbi_zlib_decode_malloc_guesssize_headerflag +#endif +#if !defined(M3D_NOIMPORTER) && defined(STBI_INCLUDE_STB_IMAGE_H) && !defined(STB_IMAGE_IMPLEMENTATION) +#error "stb_image.h included without STB_IMAGE_IMPLEMENTATION. Sorry, we need some stuff defined inside the ifguard for proper integration" +#endif +#else +#if !defined(STBI_INCLUDE_STB_IMAGE_H) || defined(STBI_NO_ZLIB) +#error "stb_image.h not included or STBI_NO_ZLIB defined. Sorry, we need its zlib implementation for proper integration" +#endif +#endif /* M3D_NOTEXTURE */ + +#if defined(M3D_EXPORTER) && !defined(INCLUDE_STB_IMAGE_WRITE_H) +/* zlib_compressor from + + stb_image_write - v1.13 - public domain - http://nothings.org/stb/stb_image_write.h +*/ +typedef unsigned char _m3dstbiw__uc; +typedef unsigned short _m3dstbiw__us; + +typedef uint16_t _m3dstbiw__uint16; +typedef int16_t _m3dstbiw__int16; +typedef uint32_t _m3dstbiw__uint32; +typedef int32_t _m3dstbiw__int32; + +#define STBIW_MALLOC(s) M3D_MALLOC(s) +#define STBIW_REALLOC(p,ns) M3D_REALLOC(p,ns) +#define STBIW_REALLOC_SIZED(p,oldsz,newsz) STBIW_REALLOC(p,newsz) +#define STBIW_FREE M3D_FREE +#define STBIW_MEMMOVE memmove +#define STBIW_UCHAR (uint8_t) +#define STBIW_ASSERT(x) +#define _m3dstbiw___sbraw(a) ((int *) (a) - 2) +#define _m3dstbiw___sbm(a) _m3dstbiw___sbraw(a)[0] +#define _m3dstbiw___sbn(a) _m3dstbiw___sbraw(a)[1] + +#define _m3dstbiw___sbneedgrow(a,n) ((a)==0 || _m3dstbiw___sbn(a)+n >= _m3dstbiw___sbm(a)) +#define _m3dstbiw___sbmaybegrow(a,n) (_m3dstbiw___sbneedgrow(a,(n)) ? _m3dstbiw___sbgrow(a,n) : 0) +#define _m3dstbiw___sbgrow(a,n) _m3dstbiw___sbgrowf((void **) &(a), (n), sizeof(*(a))) + +#define _m3dstbiw___sbpush(a, v) (_m3dstbiw___sbmaybegrow(a,1), (a)[_m3dstbiw___sbn(a)++] = (v)) +#define _m3dstbiw___sbcount(a) ((a) ? _m3dstbiw___sbn(a) : 0) +#define _m3dstbiw___sbfree(a) ((a) ? STBIW_FREE(_m3dstbiw___sbraw(a)),0 : 0) + +static void *_m3dstbiw___sbgrowf(void **arr, int increment, int itemsize) +{ + int m = *arr ? 2*_m3dstbiw___sbm(*arr)+increment : increment+1; + void *p = STBIW_REALLOC_SIZED(*arr ? _m3dstbiw___sbraw(*arr) : 0, *arr ? (_m3dstbiw___sbm(*arr)*itemsize + sizeof(int)*2) : 0, itemsize * m + sizeof(int)*2); + STBIW_ASSERT(p); + if (p) { + if (!*arr) ((int *) p)[1] = 0; + *arr = (void *) ((int *) p + 2); + _m3dstbiw___sbm(*arr) = m; + } + return *arr; +} + +static unsigned char *_m3dstbiw___zlib_flushf(unsigned char *data, unsigned int *bitbuffer, int *bitcount) +{ + while (*bitcount >= 8) { + _m3dstbiw___sbpush(data, STBIW_UCHAR(*bitbuffer)); + *bitbuffer >>= 8; + *bitcount -= 8; + } + return data; +} + +static int _m3dstbiw___zlib_bitrev(int code, int codebits) +{ + int res=0; + while (codebits--) { + res = (res << 1) | (code & 1); + code >>= 1; + } + return res; +} + +static unsigned int _m3dstbiw___zlib_countm(unsigned char *a, unsigned char *b, int limit) +{ + int i; + for (i=0; i < limit && i < 258; ++i) + if (a[i] != b[i]) break; + return i; +} + +static unsigned int _m3dstbiw___zhash(unsigned char *data) +{ + _m3dstbiw__uint32 hash = data[0] + (data[1] << 8) + (data[2] << 16); + hash ^= hash << 3; + hash += hash >> 5; + hash ^= hash << 4; + hash += hash >> 17; + hash ^= hash << 25; + hash += hash >> 6; + return hash; +} + +#define _m3dstbiw___zlib_flush() (out = _m3dstbiw___zlib_flushf(out, &bitbuf, &bitcount)) +#define _m3dstbiw___zlib_add(code,codebits) \ + (bitbuf |= (code) << bitcount, bitcount += (codebits), _m3dstbiw___zlib_flush()) +#define _m3dstbiw___zlib_huffa(b,c) _m3dstbiw___zlib_add(_m3dstbiw___zlib_bitrev(b,c),c) +#define _m3dstbiw___zlib_huff1(n) _m3dstbiw___zlib_huffa(0x30 + (n), 8) +#define _m3dstbiw___zlib_huff2(n) _m3dstbiw___zlib_huffa(0x190 + (n)-144, 9) +#define _m3dstbiw___zlib_huff3(n) _m3dstbiw___zlib_huffa(0 + (n)-256,7) +#define _m3dstbiw___zlib_huff4(n) _m3dstbiw___zlib_huffa(0xc0 + (n)-280,8) +#define _m3dstbiw___zlib_huff(n) ((n) <= 143 ? _m3dstbiw___zlib_huff1(n) : (n) <= 255 ? _m3dstbiw___zlib_huff2(n) : (n) <= 279 ? _m3dstbiw___zlib_huff3(n) : _m3dstbiw___zlib_huff4(n)) +#define _m3dstbiw___zlib_huffb(n) ((n) <= 143 ? _m3dstbiw___zlib_huff1(n) : _m3dstbiw___zlib_huff2(n)) + +#define _m3dstbiw___ZHASH 16384 + +unsigned char * _m3dstbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality) +{ + static unsigned short lengthc[] = { 3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258, 259 }; + static unsigned char lengtheb[]= { 0,0,0,0,0,0,0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 }; + static unsigned short distc[] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577, 32768 }; + static unsigned char disteb[] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 }; + unsigned int bitbuf=0; + int i,j, bitcount=0; + unsigned char *out = NULL; + unsigned char ***hash_table = (unsigned char***) STBIW_MALLOC(_m3dstbiw___ZHASH * sizeof(char**)); + if (hash_table == NULL) + return NULL; + if (quality < 5) quality = 5; + + _m3dstbiw___sbpush(out, 0x78); + _m3dstbiw___sbpush(out, 0x5e); + _m3dstbiw___zlib_add(1,1); + _m3dstbiw___zlib_add(1,2); + + for (i=0; i < _m3dstbiw___ZHASH; ++i) + hash_table[i] = NULL; + + i=0; + while (i < data_len-3) { + int h = _m3dstbiw___zhash(data+i)&(_m3dstbiw___ZHASH-1), best=3; + unsigned char *bestloc = 0; + unsigned char **hlist = hash_table[h]; + int n = _m3dstbiw___sbcount(hlist); + for (j=0; j < n; ++j) { + if (hlist[j]-data > i-32768) { + int d = _m3dstbiw___zlib_countm(hlist[j], data+i, data_len-i); + if (d >= best) best=d,bestloc=hlist[j]; + } + } + if (hash_table[h] && _m3dstbiw___sbn(hash_table[h]) == 2*quality) { + STBIW_MEMMOVE(hash_table[h], hash_table[h]+quality, sizeof(hash_table[h][0])*quality); + _m3dstbiw___sbn(hash_table[h]) = quality; + } + _m3dstbiw___sbpush(hash_table[h],data+i); + + if (bestloc) { + h = _m3dstbiw___zhash(data+i+1)&(_m3dstbiw___ZHASH-1); + hlist = hash_table[h]; + n = _m3dstbiw___sbcount(hlist); + for (j=0; j < n; ++j) { + if (hlist[j]-data > i-32767) { + int e = _m3dstbiw___zlib_countm(hlist[j], data+i+1, data_len-i-1); + if (e > best) { + bestloc = NULL; + break; + } + } + } + } + + if (bestloc) { + int d = (int) (data+i - bestloc); + STBIW_ASSERT(d <= 32767 && best <= 258); + for (j=0; best > lengthc[j+1]-1; ++j); + _m3dstbiw___zlib_huff(j+257); + if (lengtheb[j]) _m3dstbiw___zlib_add(best - lengthc[j], lengtheb[j]); + for (j=0; d > distc[j+1]-1; ++j); + _m3dstbiw___zlib_add(_m3dstbiw___zlib_bitrev(j,5),5); + if (disteb[j]) _m3dstbiw___zlib_add(d - distc[j], disteb[j]); + i += best; + } else { + _m3dstbiw___zlib_huffb(data[i]); + ++i; + } + } + for (;i < data_len; ++i) + _m3dstbiw___zlib_huffb(data[i]); + _m3dstbiw___zlib_huff(256); + while (bitcount) + _m3dstbiw___zlib_add(0,1); + + for (i=0; i < _m3dstbiw___ZHASH; ++i) + (void) _m3dstbiw___sbfree(hash_table[i]); + STBIW_FREE(hash_table); + + { + unsigned int s1=1, s2=0; + int blocklen = (int) (data_len % 5552); + j=0; + while (j < data_len) { + for (i=0; i < blocklen; ++i) s1 += data[j+i], s2 += s1; + s1 %= 65521, s2 %= 65521; + j += blocklen; + blocklen = 5552; + } + _m3dstbiw___sbpush(out, STBIW_UCHAR(s2 >> 8)); + _m3dstbiw___sbpush(out, STBIW_UCHAR(s2)); + _m3dstbiw___sbpush(out, STBIW_UCHAR(s1 >> 8)); + _m3dstbiw___sbpush(out, STBIW_UCHAR(s1)); + } + *out_len = _m3dstbiw___sbn(out); + STBIW_MEMMOVE(_m3dstbiw___sbraw(out), out, *out_len); + return (unsigned char *) _m3dstbiw___sbraw(out); +} +#define stbi_zlib_compress _m3dstbi_zlib_compress +#else +unsigned char * _m3dstbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality); +#endif + +#define M3D_CHUNKMAGIC(m, a,b,c,d) ((m)[0]==(a) && (m)[1]==(b) && (m)[2]==(c) && (m)[3]==(d)) + +#ifdef M3D_ASCII +#include /* get sprintf */ +#include /* sprintf and strtod cares about number locale */ +#endif +#ifdef M3D_PROFILING +#include +#endif + +#if !defined(M3D_NOIMPORTER) && defined(M3D_ASCII) +/* helper functions for the ASCII parser */ +static char *_m3d_findarg(char *s) { + while(s && *s && *s != ' ' && *s != '\t' && *s != '\r' && *s != '\n') s++; + while(s && *s && (*s == ' ' || *s == '\t')) s++; + return s; +} +static char *_m3d_findnl(char *s) { + while(s && *s && *s != '\r' && *s != '\n') s++; + if(*s == '\r') s++; + if(*s == '\n') s++; + return s; +} +static char *_m3d_gethex(char *s, uint32_t *ret) +{ + if(*s == '#') s++; + *ret = 0; + for(; *s; s++) { + if(*s >= '0' && *s <= '9') { *ret <<= 4; *ret += (uint32_t)(*s-'0'); } + else if(*s >= 'a' && *s <= 'f') { *ret <<= 4; *ret += (uint32_t)(*s-'a'+10); } + else if(*s >= 'A' && *s <= 'F') { *ret <<= 4; *ret += (uint32_t)(*s-'A'+10); } + else break; + } + return _m3d_findarg(s); +} +static char *_m3d_getint(char *s, uint32_t *ret) +{ + char *e = s; + if(!s || !*s || *s == '\r' || *s == '\n') return s; + for(; *e >= '0' && *e <= '9'; e++); + *ret = atoi(s); + return e; +} +static char *_m3d_getfloat(char *s, M3D_FLOAT *ret) +{ + char *e = s; + if(!s || !*s || *s == '\r' || *s == '\n') return s; + for(; *e == '-' || *e == '+' || *e == '.' || (*e >= '0' && *e <= '9') || *e == 'e' || *e == 'E'; e++); + *ret = (M3D_FLOAT)strtod(s, NULL); + return _m3d_findarg(e); +} +#endif +#if !defined(M3D_NODUP) && (!defined(M3D_NOIMPORTER) || defined(M3D_ASCII) || defined(M3D_EXPORTER)) +/* helper function to create safe strings */ +char *_m3d_safestr(char *in, int morelines) +{ + char *out, *o, *i = in; + int l; + if(!in || !*in) { + out = (char*)M3D_MALLOC(1); + if(!out) return NULL; + out[0] =0; + } else { + for(o = in, l = 0; *o && ((morelines & 1) || (*o != '\r' && *o != '\n')) && l < 256; o++, l++); + out = o = (char*)M3D_MALLOC(l+1); + if(!out) return NULL; + while(*i == ' ' || *i == '\t' || *i == '\r' || (morelines && *i == '\n')) i++; + for(; *i && (morelines || (*i != '\r' && *i != '\n')); i++) { + if(*i == '\r') continue; + if(*i == '\n') { + if(morelines >= 3 && o > out && *(o-1) == '\n') break; + if(i > in && *(i-1) == '\n') continue; + if(morelines & 1) { + if(morelines == 1) *o++ = '\r'; + *o++ = '\n'; + } else + break; + } else + if(*i == ' ' || *i == '\t') { + *o++ = morelines? ' ' : '_'; + } else + *o++ = !morelines && (*i == '/' || *i == '\\') ? '_' : *i; + } + for(; o > out && (*(o-1) == ' ' || *(o-1) == '\t' || *(o-1) == '\r' || *(o-1) == '\n'); o--); + *o = 0; + out = (char*)M3D_REALLOC(out, (uintptr_t)o - (uintptr_t)out + 1); + } + return out; +} +#endif +#ifndef M3D_NOIMPORTER +/* helper function to load and decode/generate a texture */ +M3D_INDEX _m3d_gettx(m3d_t *model, m3dread_t readfilecb, m3dfree_t freecb, char *fn) +{ + unsigned int i, len = 0; + unsigned char *buff = NULL; + char *fn2; +#ifndef M3D_NOTEXTURE + unsigned int w, h; + stbi__context s; + stbi__result_info ri; +#endif + + /* failsafe */ + if(!fn || !*fn) return M3D_UNDEF; + /* do we have loaded this texture already? */ + for(i = 0; i < model->numtexture; i++) + if(!strcmp(fn, model->texture[i].name)) return i; + /* see if it's inlined in the model */ + if(model->inlined) { + for(i = 0; i < model->numinlined; i++) + if(!strcmp(fn, model->inlined[i].name)) { + buff = model->inlined[i].data; + len = model->inlined[i].length; + freecb = NULL; + break; + } + } + /* try to load from external source */ + if(!buff && readfilecb) { + i = (unsigned int)strlen(fn); + if(i < 5 || fn[i - 4] != '.') { + fn2 = (char*)M3D_MALLOC(i + 5); + if(!fn2) { model->errcode = M3D_ERR_ALLOC; return M3D_UNDEF; } + memcpy(fn2, fn, i); + memcpy(fn2+i, ".png", 5); + buff = (*readfilecb)(fn2, &len); + M3D_FREE(fn2); + } + if(!buff) { + buff = (*readfilecb)(fn, &len); + if(!buff) return M3D_UNDEF; + } + } + /* add to textures array */ + i = model->numtexture++; + model->texture = (m3dtx_t*)M3D_REALLOC(model->texture, model->numtexture * sizeof(m3dtx_t)); + if(!model->texture) { + if(buff && freecb) (*freecb)(buff); + model->errcode = M3D_ERR_ALLOC; + model->numtexture = 0; + return M3D_UNDEF; + } + memset(&model->texture[i], 0, sizeof(m3dtx_t)); + model->texture[i].name = fn; + if(buff) { + if(buff[0] == 0x89 && buff[1] == 'P' && buff[2] == 'N' && buff[3] == 'G') { +#ifndef M3D_NOTEXTURE + /* return pixel buffer of the decoded texture */ + memset(&s, 0, sizeof(s)); + memset(&ri, 0, sizeof(ri)); + s.img_buffer = s.img_buffer_original = (unsigned char *) buff; + s.img_buffer_end = s.img_buffer_original_end = (unsigned char *) buff+len; + /* don't use model->texture[i].w directly, it's a uint16_t */ + w = h = len = 0; + ri.bits_per_channel = 8; + model->texture[i].d = (uint8_t*)stbi__png_load(&s, (int*)&w, (int*)&h, (int*)&len, 0, &ri); + model->texture[i].w = w; + model->texture[i].h = h; + model->texture[i].f = (uint8_t)len; +#else + /* return only the raw undecoded texture */ + if((model->texture[i].d = (uint8_t*)M3D_MALLOC(len))) { + memcpy(model->texture[i].d, buff, len); + model->texture[i].w = len & 0xffff; + model->texture[i].h = (len >> 16) & 0xffff; + model->texture[i].f = 0; + } else + model->errcode = M3D_ERR_ALLOC; +#endif + } else { +#ifdef M3D_TX_INTERP + if((model->errcode = M3D_TX_INTERP(fn, buff, len, &model->texture[i])) != M3D_SUCCESS) { + M3D_LOG("Unable to generate texture"); + M3D_LOG(fn); + } +#else + M3D_LOG("Unimplemented interpreter"); + M3D_LOG(fn); +#endif + } + if(freecb) (*freecb)(buff); + } + if(!model->texture[i].d) + model->errcode = M3D_ERR_UNKIMG; + return i; +} + +/* helper function to load and generate a procedural surface */ +void _m3d_getpr(m3d_t *model, _unused m3dread_t readfilecb, _unused m3dfree_t freecb, _unused char *fn) +{ +#ifdef M3D_PR_INTERP + unsigned int i, len = 0; + unsigned char *buff = readfilecb && fn && *fn ? (*readfilecb)(fn, &len) : NULL; + + if(!buff && fn && *fn && model->inlined) { + for(i = 0; i < model->numinlined; i++) + if(!strcmp(fn, model->inlined[i].name)) { + buff = model->inlined[i].data; + len = model->inlined[i].length; + freecb = NULL; + break; + } + } + if(!buff || !len || (model->errcode = M3D_PR_INTERP(fn, buff, len, model)) != M3D_SUCCESS) { + M3D_LOG("Unable to generate procedural surface"); + M3D_LOG(fn); + model->errcode = M3D_ERR_UNKIMG; + } + if(freecb && buff) (*freecb)(buff); +#else + (void)readfilecb; + (void)freecb; + (void)fn; + M3D_LOG("Unimplemented interpreter"); + M3D_LOG(fn); + model->errcode = M3D_ERR_UNIMPL; +#endif +} +/* helpers to read indices from data stream */ +#define M3D_GETSTR(x) do{offs=0;data=_m3d_getidx(data,model->si_s,&offs);x=offs?((char*)model->raw+16+offs):NULL;}while(0) +_inline static unsigned char *_m3d_getidx(unsigned char *data, char type, M3D_INDEX *idx) +{ + switch(type) { + case 1: *idx = data[0] > 253 ? (int8_t)data[0] : data[0]; data++; break; + case 2: *idx = *((uint16_t*)data) > 65533 ? *((int16_t*)data) : *((uint16_t*)data); data += 2; break; + case 4: *idx = *((int32_t*)data); data += 4; break; + } + return data; +} + +#ifndef M3D_NOANIMATION +/* multiply 4 x 4 matrices. Do not use float *r[16] as argument, because some compilers misinterpret that as + * 16 pointers each pointing to a float, but we need a single pointer to 16 floats. */ +void _m3d_mul(M3D_FLOAT *r, M3D_FLOAT *a, M3D_FLOAT *b) +{ + r[ 0] = b[ 0] * a[ 0] + b[ 4] * a[ 1] + b[ 8] * a[ 2] + b[12] * a[ 3]; + r[ 1] = b[ 1] * a[ 0] + b[ 5] * a[ 1] + b[ 9] * a[ 2] + b[13] * a[ 3]; + r[ 2] = b[ 2] * a[ 0] + b[ 6] * a[ 1] + b[10] * a[ 2] + b[14] * a[ 3]; + r[ 3] = b[ 3] * a[ 0] + b[ 7] * a[ 1] + b[11] * a[ 2] + b[15] * a[ 3]; + r[ 4] = b[ 0] * a[ 4] + b[ 4] * a[ 5] + b[ 8] * a[ 6] + b[12] * a[ 7]; + r[ 5] = b[ 1] * a[ 4] + b[ 5] * a[ 5] + b[ 9] * a[ 6] + b[13] * a[ 7]; + r[ 6] = b[ 2] * a[ 4] + b[ 6] * a[ 5] + b[10] * a[ 6] + b[14] * a[ 7]; + r[ 7] = b[ 3] * a[ 4] + b[ 7] * a[ 5] + b[11] * a[ 6] + b[15] * a[ 7]; + r[ 8] = b[ 0] * a[ 8] + b[ 4] * a[ 9] + b[ 8] * a[10] + b[12] * a[11]; + r[ 9] = b[ 1] * a[ 8] + b[ 5] * a[ 9] + b[ 9] * a[10] + b[13] * a[11]; + r[10] = b[ 2] * a[ 8] + b[ 6] * a[ 9] + b[10] * a[10] + b[14] * a[11]; + r[11] = b[ 3] * a[ 8] + b[ 7] * a[ 9] + b[11] * a[10] + b[15] * a[11]; + r[12] = b[ 0] * a[12] + b[ 4] * a[13] + b[ 8] * a[14] + b[12] * a[15]; + r[13] = b[ 1] * a[12] + b[ 5] * a[13] + b[ 9] * a[14] + b[13] * a[15]; + r[14] = b[ 2] * a[12] + b[ 6] * a[13] + b[10] * a[14] + b[14] * a[15]; + r[15] = b[ 3] * a[12] + b[ 7] * a[13] + b[11] * a[14] + b[15] * a[15]; +} +/* calculate 4 x 4 matrix inverse */ +void _m3d_inv(M3D_FLOAT *m) +{ + M3D_FLOAT r[16]; + M3D_FLOAT det = + m[ 0]*m[ 5]*m[10]*m[15] - m[ 0]*m[ 5]*m[11]*m[14] + m[ 0]*m[ 6]*m[11]*m[13] - m[ 0]*m[ 6]*m[ 9]*m[15] + + m[ 0]*m[ 7]*m[ 9]*m[14] - m[ 0]*m[ 7]*m[10]*m[13] - m[ 1]*m[ 6]*m[11]*m[12] + m[ 1]*m[ 6]*m[ 8]*m[15] + - m[ 1]*m[ 7]*m[ 8]*m[14] + m[ 1]*m[ 7]*m[10]*m[12] - m[ 1]*m[ 4]*m[10]*m[15] + m[ 1]*m[ 4]*m[11]*m[14] + + m[ 2]*m[ 7]*m[ 8]*m[13] - m[ 2]*m[ 7]*m[ 9]*m[12] + m[ 2]*m[ 4]*m[ 9]*m[15] - m[ 2]*m[ 4]*m[11]*m[13] + + m[ 2]*m[ 5]*m[11]*m[12] - m[ 2]*m[ 5]*m[ 8]*m[15] - m[ 3]*m[ 4]*m[ 9]*m[14] + m[ 3]*m[ 4]*m[10]*m[13] + - m[ 3]*m[ 5]*m[10]*m[12] + m[ 3]*m[ 5]*m[ 8]*m[14] - m[ 3]*m[ 6]*m[ 8]*m[13] + m[ 3]*m[ 6]*m[ 9]*m[12]; + if(det == (M3D_FLOAT)0.0 || det == (M3D_FLOAT)-0.0) det = (M3D_FLOAT)1.0; else det = (M3D_FLOAT)1.0 / det; + r[ 0] = det *(m[ 5]*(m[10]*m[15] - m[11]*m[14]) + m[ 6]*(m[11]*m[13] - m[ 9]*m[15]) + m[ 7]*(m[ 9]*m[14] - m[10]*m[13])); + r[ 1] = -det*(m[ 1]*(m[10]*m[15] - m[11]*m[14]) + m[ 2]*(m[11]*m[13] - m[ 9]*m[15]) + m[ 3]*(m[ 9]*m[14] - m[10]*m[13])); + r[ 2] = det *(m[ 1]*(m[ 6]*m[15] - m[ 7]*m[14]) + m[ 2]*(m[ 7]*m[13] - m[ 5]*m[15]) + m[ 3]*(m[ 5]*m[14] - m[ 6]*m[13])); + r[ 3] = -det*(m[ 1]*(m[ 6]*m[11] - m[ 7]*m[10]) + m[ 2]*(m[ 7]*m[ 9] - m[ 5]*m[11]) + m[ 3]*(m[ 5]*m[10] - m[ 6]*m[ 9])); + r[ 4] = -det*(m[ 4]*(m[10]*m[15] - m[11]*m[14]) + m[ 6]*(m[11]*m[12] - m[ 8]*m[15]) + m[ 7]*(m[ 8]*m[14] - m[10]*m[12])); + r[ 5] = det *(m[ 0]*(m[10]*m[15] - m[11]*m[14]) + m[ 2]*(m[11]*m[12] - m[ 8]*m[15]) + m[ 3]*(m[ 8]*m[14] - m[10]*m[12])); + r[ 6] = -det*(m[ 0]*(m[ 6]*m[15] - m[ 7]*m[14]) + m[ 2]*(m[ 7]*m[12] - m[ 4]*m[15]) + m[ 3]*(m[ 4]*m[14] - m[ 6]*m[12])); + r[ 7] = det *(m[ 0]*(m[ 6]*m[11] - m[ 7]*m[10]) + m[ 2]*(m[ 7]*m[ 8] - m[ 4]*m[11]) + m[ 3]*(m[ 4]*m[10] - m[ 6]*m[ 8])); + r[ 8] = det *(m[ 4]*(m[ 9]*m[15] - m[11]*m[13]) + m[ 5]*(m[11]*m[12] - m[ 8]*m[15]) + m[ 7]*(m[ 8]*m[13] - m[ 9]*m[12])); + r[ 9] = -det*(m[ 0]*(m[ 9]*m[15] - m[11]*m[13]) + m[ 1]*(m[11]*m[12] - m[ 8]*m[15]) + m[ 3]*(m[ 8]*m[13] - m[ 9]*m[12])); + r[10] = det *(m[ 0]*(m[ 5]*m[15] - m[ 7]*m[13]) + m[ 1]*(m[ 7]*m[12] - m[ 4]*m[15]) + m[ 3]*(m[ 4]*m[13] - m[ 5]*m[12])); + r[11] = -det*(m[ 0]*(m[ 5]*m[11] - m[ 7]*m[ 9]) + m[ 1]*(m[ 7]*m[ 8] - m[ 4]*m[11]) + m[ 3]*(m[ 4]*m[ 9] - m[ 5]*m[ 8])); + r[12] = -det*(m[ 4]*(m[ 9]*m[14] - m[10]*m[13]) + m[ 5]*(m[10]*m[12] - m[ 8]*m[14]) + m[ 6]*(m[ 8]*m[13] - m[ 9]*m[12])); + r[13] = det *(m[ 0]*(m[ 9]*m[14] - m[10]*m[13]) + m[ 1]*(m[10]*m[12] - m[ 8]*m[14]) + m[ 2]*(m[ 8]*m[13] - m[ 9]*m[12])); + r[14] = -det*(m[ 0]*(m[ 5]*m[14] - m[ 6]*m[13]) + m[ 1]*(m[ 6]*m[12] - m[ 4]*m[14]) + m[ 2]*(m[ 4]*m[13] - m[ 5]*m[12])); + r[15] = det *(m[ 0]*(m[ 5]*m[10] - m[ 6]*m[ 9]) + m[ 1]*(m[ 6]*m[ 8] - m[ 4]*m[10]) + m[ 2]*(m[ 4]*m[ 9] - m[ 5]*m[ 8])); + memcpy(m, &r, sizeof(r)); +} +/* compose a coloumn major 4 x 4 matrix from vec3 position and vec4 orientation/rotation quaternion */ +void _m3d_mat(M3D_FLOAT *r, m3dv_t *p, m3dv_t *q) +{ + if(q->x == (M3D_FLOAT)0.0 && q->y == (M3D_FLOAT)0.0 && q->z >=(M3D_FLOAT) 0.7071065 && q->z <= (M3D_FLOAT)0.7071075 && + q->w == (M3D_FLOAT)0.0) { + r[ 1] = r[ 2] = r[ 4] = r[ 6] = r[ 8] = r[ 9] = (M3D_FLOAT)0.0; + r[ 0] = r[ 5] = r[10] = (M3D_FLOAT)-1.0; + } else { + r[ 0] = 1 - 2 * (q->y * q->y + q->z * q->z); if(r[ 0]>-M3D_EPSILON && r[ 0]x * q->y - q->z * q->w); if(r[ 1]>-M3D_EPSILON && r[ 1]x * q->z + q->y * q->w); if(r[ 2]>-M3D_EPSILON && r[ 2]x * q->y + q->z * q->w); if(r[ 4]>-M3D_EPSILON && r[ 4]x * q->x + q->z * q->z); if(r[ 5]>-M3D_EPSILON && r[ 5]y * q->z - q->x * q->w); if(r[ 6]>-M3D_EPSILON && r[ 6]x * q->z - q->y * q->w); if(r[ 8]>-M3D_EPSILON && r[ 8]y * q->z + q->x * q->w); if(r[ 9]>-M3D_EPSILON && r[ 9]x * q->x + q->y * q->y); if(r[10]>-M3D_EPSILON && r[10]x; r[ 7] = p->y; r[11] = p->z; + r[12] = 0; r[13] = 0; r[14] = 0; r[15] = 1; +} +#endif +#if !defined(M3D_NOANIMATION) || !defined(M3D_NONORMALS) +/* portable fast inverse square root calculation. returns 1/sqrt(x) */ +static M3D_FLOAT _m3d_rsq(M3D_FLOAT x) +{ +#ifdef M3D_DOUBLE + return ((M3D_FLOAT)15.0/(M3D_FLOAT)8.0) + ((M3D_FLOAT)-5.0/(M3D_FLOAT)4.0)*x + ((M3D_FLOAT)3.0/(M3D_FLOAT)8.0)*x*x; +#else + /* John Carmack's */ + float x2 = x * 0.5f; + uint32_t *i = (uint32_t*)&x; + *i = (0x5f3759df - (*i >> 1)); + return x * (1.5f - (x2 * x * x)); +#endif +} +#endif + +/** + * Function to decode a Model 3D into in-memory format + */ +m3d_t *m3d_load(unsigned char *data, m3dread_t readfilecb, m3dfree_t freecb, m3d_t *mtllib) +{ + unsigned char *end, *chunk, *buff, weights[8]; + unsigned int i, j, k, l, n, am, len = 0, reclen, offs; +#ifndef M3D_NOVOXELS + int32_t min_x, min_y, min_z, max_x, max_y, max_z, sx, sy, sz, x, y, z; + M3D_INDEX edge[8], enorm; +#endif + char *name, *lang; + float f; + m3d_t *model; + M3D_INDEX mi; +#ifdef M3D_VERTEXMAX + M3D_INDEX pi; +#endif + M3D_FLOAT w; + m3dcd_t *cd; + m3dtx_t *tx; + m3dh_t *h; + m3dm_t *m; + m3da_t *a; + m3di_t *t; +#ifndef M3D_NONORMALS + char neednorm = 0; + m3dv_t *norm = NULL, *v0, *v1, *v2, va, vb; +#endif +#ifndef M3D_NOANIMATION + M3D_FLOAT r[16]; +#endif +#if !defined(M3D_NOWEIGHTS) || !defined(M3D_NOANIMATION) + m3db_t *b; +#endif +#ifndef M3D_NOWEIGHTS + m3ds_t *sk; +#endif +#ifdef M3D_ASCII + m3ds_t s; + M3D_INDEX bi[M3D_BONEMAXLEVEL+1], level; + const char *ol; + char *ptr, *pe, *fn; +#endif +#ifdef M3D_PROFILING + struct timeval tv0, tv1, tvd; + gettimeofday(&tv0, NULL); +#endif + + if(!data || (!M3D_CHUNKMAGIC(data, '3','D','M','O') +#ifdef M3D_ASCII + && !M3D_CHUNKMAGIC(data, '3','d','m','o') +#endif + )) return NULL; + model = (m3d_t*)M3D_MALLOC(sizeof(m3d_t)); + if(!model) { + M3D_LOG("Out of memory"); + return NULL; + } + memset(model, 0, sizeof(m3d_t)); + + if(mtllib) { + model->nummaterial = mtllib->nummaterial; + model->material = mtllib->material; + model->numtexture = mtllib->numtexture; + model->texture = mtllib->texture; + model->flags |= M3D_FLG_MTLLIB; + } +#ifdef M3D_ASCII + /* ASCII variant? */ + if(M3D_CHUNKMAGIC(data, '3','d','m','o')) { + model->errcode = M3D_ERR_BADFILE; + model->flags |= M3D_FLG_FREESTR; + model->raw = (m3dhdr_t*)data; + ptr = (char*)data; + ol = setlocale(LC_NUMERIC, NULL); + setlocale(LC_NUMERIC, "C"); + /* parse header. Don't use sscanf, that's incredibly slow */ + ptr = _m3d_findarg(ptr); + if(!*ptr || *ptr == '\r' || *ptr == '\n') goto asciiend; + pe = _m3d_findnl(ptr); + model->scale = (float)strtod(ptr, NULL); ptr = pe; + if(model->scale <= (M3D_FLOAT)0.0) model->scale = (M3D_FLOAT)1.0; + model->name = _m3d_safestr(ptr, 2); ptr = _m3d_findnl(ptr); + if(!*ptr) goto asciiend; + model->license = _m3d_safestr(ptr, 2); ptr = _m3d_findnl(ptr); + if(!*ptr) goto asciiend; + model->author = _m3d_safestr(ptr, 2); ptr = _m3d_findnl(ptr); + if(!*ptr) goto asciiend; + if(*ptr != '\r' && *ptr != '\n') + model->desc = _m3d_safestr(ptr, 3); + while(*ptr) { + while(*ptr && *ptr!='\n') ptr++; + ptr++; if(*ptr=='\r') ptr++; + if(*ptr == '\n') break; + } + + /* the main chunk reader loop */ + while(*ptr) { + while(*ptr && (*ptr == '\r' || *ptr == '\n')) ptr++; + if(!*ptr || (ptr[0]=='E' && ptr[1]=='n' && ptr[2]=='d')) break; + /* make sure there's at least one data row */ + pe = ptr; ptr = _m3d_findnl(ptr); + if(!*ptr || *ptr == '\r' || *ptr == '\n') goto asciiend; + /* Preview chunk */ + if(!memcmp(pe, "Preview", 7)) { + if(readfilecb) { + pe = _m3d_safestr(ptr, 0); + if(!pe || !*pe) goto asciiend; + model->preview.data = (*readfilecb)(pe, &model->preview.length); + M3D_FREE(pe); + } + while(*ptr && *ptr != '\r' && *ptr != '\n') + ptr = _m3d_findnl(ptr); + } else + /* texture map chunk */ + if(!memcmp(pe, "Textmap", 7)) { + if(model->tmap) { M3D_LOG("More texture map chunks, should be unique"); goto asciiend; } + while(*ptr && *ptr != '\r' && *ptr != '\n') { + i = model->numtmap++; + model->tmap = (m3dti_t*)M3D_REALLOC(model->tmap, model->numtmap * sizeof(m3dti_t)); + if(!model->tmap) goto memerr; + ptr = _m3d_getfloat(ptr, &model->tmap[i].u); + if(!*ptr || *ptr == '\r' || *ptr == '\n') goto asciiend; + _m3d_getfloat(ptr, &model->tmap[i].v); + ptr = _m3d_findnl(ptr); + } + } else + /* vertex chunk */ + if(!memcmp(pe, "Vertex", 6)) { + if(model->vertex) { M3D_LOG("More vertex chunks, should be unique"); goto asciiend; } + while(*ptr && *ptr != '\r' && *ptr != '\n') { + i = model->numvertex++; + model->vertex = (m3dv_t*)M3D_REALLOC(model->vertex, model->numvertex * sizeof(m3dv_t)); + if(!model->vertex) goto memerr; + memset(&model->vertex[i], 0, sizeof(m3dv_t)); + model->vertex[i].skinid = M3D_UNDEF; + model->vertex[i].color = 0; + model->vertex[i].w = (M3D_FLOAT)1.0; + ptr = _m3d_getfloat(ptr, &model->vertex[i].x); + if(!*ptr || *ptr == '\r' || *ptr == '\n') goto asciiend; + ptr = _m3d_getfloat(ptr, &model->vertex[i].y); + if(!*ptr || *ptr == '\r' || *ptr == '\n') goto asciiend; + ptr = _m3d_getfloat(ptr, &model->vertex[i].z); + if(!*ptr || *ptr == '\r' || *ptr == '\n') goto asciiend; + ptr = _m3d_getfloat(ptr, &model->vertex[i].w); + if(!*ptr) goto asciiend; + if(*ptr == '#') { + ptr = _m3d_gethex(ptr, &model->vertex[i].color); + if(!*ptr) goto asciiend; + } + /* parse skin */ + memset(&s, 0, sizeof(m3ds_t)); + for(j = 0, w = (M3D_FLOAT)0.0; j < M3D_NUMBONE && *ptr && *ptr != '\r' && *ptr != '\n'; j++) { + ptr = _m3d_findarg(ptr); + if(!*ptr || *ptr == '\r' || *ptr == '\n') goto asciiend; + ptr = _m3d_getint(ptr, &k); + s.boneid[j] = (M3D_INDEX)k; + if(*ptr == ':') { + ptr++; + ptr = _m3d_getfloat(ptr, &s.weight[j]); + w += s.weight[j]; + } else if(!j) + s.weight[j] = (M3D_FLOAT)1.0; + if(!*ptr) goto asciiend; + } + if(s.boneid[0] != M3D_UNDEF && s.weight[0] > (M3D_FLOAT)0.0) { + if(w != (M3D_FLOAT)1.0 && w != (M3D_FLOAT)0.0) + for(j = 0; j < M3D_NUMBONE && s.weight[j] > (M3D_FLOAT)0.0; j++) + s.weight[j] /= w; + k = M3D_NOTDEFINED; + if(model->skin) { + for(j = 0; j < model->numskin; j++) + if(!memcmp(&model->skin[j], &s, sizeof(m3ds_t))) { k = j; break; } + } + if(k == M3D_NOTDEFINED) { + k = model->numskin++; + model->skin = (m3ds_t*)M3D_REALLOC(model->skin, model->numskin * sizeof(m3ds_t)); + if(!model->skin) goto memerr; + memcpy(&model->skin[k], &s, sizeof(m3ds_t)); + } + model->vertex[i].skinid = (M3D_INDEX)k; + } + ptr = _m3d_findnl(ptr); + } + } else + /* Skeleton, bone hierarchy */ + if(!memcmp(pe, "Bones", 5)) { + if(model->bone) { M3D_LOG("More bones chunks, should be unique"); goto asciiend; } + bi[0] = M3D_UNDEF; + while(*ptr && *ptr != '\r' && *ptr != '\n') { + i = model->numbone++; + model->bone = (m3db_t*)M3D_REALLOC(model->bone, model->numbone * sizeof(m3db_t)); + if(!model->bone) goto memerr; + for(level = 0; *ptr == '/'; ptr++, level++); + if(level > M3D_BONEMAXLEVEL || !*ptr || *ptr == '\r' || *ptr == '\n') goto asciiend; + bi[level+1] = i; + model->bone[i].numweight = 0; + model->bone[i].weight = NULL; + model->bone[i].parent = bi[level]; + ptr = _m3d_getint(ptr, &k); + ptr = _m3d_findarg(ptr); + if(!*ptr || *ptr == '\r' || *ptr == '\n') goto asciiend; + model->bone[i].pos = (M3D_INDEX)k; + ptr = _m3d_getint(ptr, &k); + ptr = _m3d_findarg(ptr); + if(!*ptr || *ptr == '\r' || *ptr == '\n') goto asciiend; + model->bone[i].ori = (M3D_INDEX)k; + model->vertex[k].skinid = M3D_INDEXMAX; + pe = _m3d_safestr(ptr, 0); + if(!pe || !*pe) goto asciiend; + model->bone[i].name = pe; + ptr = _m3d_findnl(ptr); + } + } else + /* material chunk */ + if(!memcmp(pe, "Material", 8)) { + pe = _m3d_findarg(pe); + if(!*pe || *pe == '\r' || *pe == '\n') goto asciiend; + pe = _m3d_safestr(pe, 0); + if(!pe || !*pe) goto asciiend; + for(i = 0; i < model->nummaterial; i++) + if(!strcmp(pe, model->material[i].name)) { + M3D_LOG("Multiple definitions for material"); + M3D_LOG(pe); + M3D_FREE(pe); + pe = NULL; + while(*ptr && *ptr != '\r' && *ptr != '\n') ptr = _m3d_findnl(ptr); + break; + } + if(!pe) continue; + i = model->nummaterial++; + if(model->flags & M3D_FLG_MTLLIB) { + m = model->material; + model->material = (m3dm_t*)M3D_MALLOC(model->nummaterial * sizeof(m3dm_t)); + if(!model->material) goto memerr; + memcpy(model->material, m, (model->nummaterial - 1) * sizeof(m3dm_t)); + if(model->texture) { + tx = model->texture; + model->texture = (m3dtx_t*)M3D_MALLOC(model->numtexture * sizeof(m3dtx_t)); + if(!model->texture) goto memerr; + memcpy(model->texture, tx, model->numtexture * sizeof(m3dm_t)); + } + model->flags &= ~M3D_FLG_MTLLIB; + } else { + model->material = (m3dm_t*)M3D_REALLOC(model->material, model->nummaterial * sizeof(m3dm_t)); + if(!model->material) goto memerr; + } + m = &model->material[i]; + m->name = pe; + m->numprop = 0; + m->prop = NULL; + while(*ptr && *ptr != '\r' && *ptr != '\n') { + k = n = 256; + if(*ptr == 'm' && *(ptr+1) == 'a' && *(ptr+2) == 'p' && *(ptr+3) == '_') { + k = m3dpf_map; + ptr += 4; + } + for(j = 0; j < sizeof(m3d_propertytypes)/sizeof(m3d_propertytypes[0]); j++) + if(!memcmp(ptr, m3d_propertytypes[j].key, strlen(m3d_propertytypes[j].key))) { + n = m3d_propertytypes[j].id; + if(k != m3dpf_map) k = m3d_propertytypes[j].format; + break; + } + if(n != 256 && k != 256) { + ptr = _m3d_findarg(ptr); + if(!*ptr || *ptr == '\r' || *ptr == '\n') goto asciiend; + j = m->numprop++; + m->prop = (m3dp_t*)M3D_REALLOC(m->prop, m->numprop * sizeof(m3dp_t)); + if(!m->prop) goto memerr; + m->prop[j].type = n + (k == m3dpf_map && n < 128 ? 128 : 0); + switch(k) { + case m3dpf_color: ptr = _m3d_gethex(ptr, &m->prop[j].value.color); break; + case m3dpf_uint8: + case m3dpf_uint16: + case m3dpf_uint32: ptr = _m3d_getint(ptr, &m->prop[j].value.num); break; + case m3dpf_float: ptr = _m3d_getfloat(ptr, &m->prop[j].value.fnum); break; + case m3dpf_map: + pe = _m3d_safestr(ptr, 0); + if(!pe || !*pe) goto asciiend; + m->prop[j].value.textureid = _m3d_gettx(model, readfilecb, freecb, pe); + if(model->errcode == M3D_ERR_ALLOC) { M3D_FREE(pe); goto memerr; } + /* this error code only returned if readfilecb was specified */ + if(m->prop[j].value.textureid == M3D_UNDEF) { + M3D_LOG("Texture not found"); + M3D_LOG(pe); + m->numprop--; + } + M3D_FREE(pe); + break; + } + } else { + M3D_LOG("Unknown material property in"); + M3D_LOG(m->name); + model->errcode = M3D_ERR_UNKPROP; + } + ptr = _m3d_findnl(ptr); + } + if(!m->numprop) model->nummaterial--; + } else + /* procedural */ + if(!memcmp(pe, "Procedural", 10)) { + pe = _m3d_safestr(ptr, 0); + _m3d_getpr(model, readfilecb, freecb, pe); + M3D_FREE(pe); + while(*ptr && *ptr != '\r' && *ptr != '\n') ptr = _m3d_findnl(ptr); + } else + /* mesh */ + if(!memcmp(pe, "Mesh", 4)) { + mi = M3D_UNDEF; +#ifdef M3D_VERTEXMAX + pi = M3D_UNDEF; +#endif + while(*ptr && *ptr != '\r' && *ptr != '\n') { + if(*ptr == 'u') { + ptr = _m3d_findarg(ptr); + if(!*ptr) goto asciiend; + mi = M3D_UNDEF; + if(*ptr != '\r' && *ptr != '\n') { + pe = _m3d_safestr(ptr, 0); + if(!pe || !*pe) goto asciiend; + for(j = 0; j < model->nummaterial; j++) + if(!strcmp(pe, model->material[j].name)) { mi = (M3D_INDEX)j; break; } + if(mi == M3D_UNDEF && !(model->flags & M3D_FLG_MTLLIB)) { + mi = model->nummaterial++; + model->material = (m3dm_t*)M3D_REALLOC(model->material, model->nummaterial * sizeof(m3dm_t)); + if(!model->material) goto memerr; + model->material[mi].name = pe; + model->material[mi].numprop = 1; + model->material[mi].prop = NULL; + } else + M3D_FREE(pe); + } + } else + if(*ptr == 'p') { + ptr = _m3d_findarg(ptr); + if(!*ptr) goto asciiend; +#ifdef M3D_VERTEXMAX + pi = M3D_UNDEF; + if(*ptr != '\r' && *ptr != '\n') { + pe = _m3d_safestr(ptr, 0); + if(!pe || !*pe) goto asciiend; + for(j = 0; j < model->numparam; j++) + if(!strcmp(pe, model->param[j].name)) { pi = (M3D_INDEX)j; break; } + if(pi == M3D_UNDEF) { + pi = model->numparam++; + model->param = (m3dvi_t*)M3D_REALLOC(model->param, model->numparam * sizeof(m3dvi_t)); + if(!model->param) goto memerr; + model->param[pi].name = pe; + model->param[pi].count = 0; + } else + M3D_FREE(pe); + } +#endif + } else { + i = model->numface++; + model->face = (m3df_t*)M3D_REALLOC(model->face, model->numface * sizeof(m3df_t)); + if(!model->face) goto memerr; + memset(&model->face[i], 255, sizeof(m3df_t)); /* set all index to -1 by default */ + model->face[i].materialid = mi; +#ifdef M3D_VERTEXMAX + model->face[i].paramid = pi; +#endif + /* hardcoded triangles. */ + for(j = 0; j < 3; j++) { + /* vertex */ + ptr = _m3d_getint(ptr, &k); + model->face[i].vertex[j] = (M3D_INDEX)k; + if(!*ptr) goto asciiend; + if(*ptr == '/') { + ptr++; + if(*ptr != '/') { + /* texcoord */ + ptr = _m3d_getint(ptr, &k); + model->face[i].texcoord[j] = (M3D_INDEX)k; + if(!*ptr) goto asciiend; + } + if(*ptr == '/') { + ptr++; + /* normal */ + ptr = _m3d_getint(ptr, &k); + model->face[i].normal[j] = (M3D_INDEX)k; + if(!*ptr) goto asciiend; + } + if(*ptr == '/') { + ptr++; + /* maximum */ + ptr = _m3d_getint(ptr, &k); +#ifdef M3D_VERTEXMAX + model->face[i].vertmax[j] = (M3D_INDEX)k; +#endif + if(!*ptr) goto asciiend; + } + } +#ifndef M3D_NONORMALS + if(model->face[i].normal[j] == M3D_UNDEF) neednorm = 1; +#endif + ptr = _m3d_findarg(ptr); + } + } + ptr = _m3d_findnl(ptr); + } + } else + /* voxel types chunk */ + if(!memcmp(pe, "VoxTypes", 8) || !memcmp(pe, "Voxtypes", 8)) { + if(model->voxtype) { M3D_LOG("More voxel types chunks, should be unique"); goto asciiend; } + while(*ptr && *ptr != '\r' && *ptr != '\n') { + i = model->numvoxtype++; + model->voxtype = (m3dvt_t*)M3D_REALLOC(model->voxtype, model->numvoxtype * sizeof(m3dvt_t)); + if(!model->voxtype) goto memerr; + memset(&model->voxtype[i], 0, sizeof(m3dvt_t)); + model->voxtype[i].materialid = M3D_UNDEF; + model->voxtype[i].skinid = M3D_UNDEF; + ptr = _m3d_gethex(ptr, &model->voxtype[i].color); + if(!*ptr) goto asciiend; + if(*ptr == '/') { + ptr = _m3d_gethex(ptr, &k); + model->voxtype[i].rotation = k; + if(!*ptr) goto asciiend; + if(*ptr == '/') { + ptr = _m3d_gethex(ptr, &k); + model->voxtype[i].voxshape = k; + if(!*ptr) goto asciiend; + } + } + while(*ptr == ' ' || *ptr == '\t') ptr++; + if(*ptr == '\r' || *ptr == '\n') { ptr = _m3d_findnl(ptr); continue; } + /* name */ + if(*ptr != '-') { + pe = _m3d_safestr(ptr, 0); + if(!pe || !*pe) goto asciiend; + model->voxtype[i].name = pe; + for(j = 0; j < model->nummaterial; j++) + if(!strcmp(pe, model->material[j].name)) { model->voxtype[i].materialid = (M3D_INDEX)j; break; } + } + ptr = _m3d_findarg(ptr); + /* parse skin */ + memset(&s, 0, sizeof(m3ds_t)); + for(j = 0, w = (M3D_FLOAT)0.0; j < M3D_NUMBONE && *ptr && *ptr != '{' && *ptr != '\r' && *ptr != '\n'; j++) { + ptr = _m3d_getint(ptr, &k); + s.boneid[j] = (M3D_INDEX)k; + if(*ptr == ':') { + ptr++; + ptr = _m3d_getfloat(ptr, &s.weight[j]); + w += s.weight[j]; + } else if(!j) + s.weight[j] = (M3D_FLOAT)1.0; + if(!*ptr) goto asciiend; + ptr = _m3d_findarg(ptr); + } + if(s.boneid[0] != M3D_UNDEF && s.weight[0] > (M3D_FLOAT)0.0) { + if(w != (M3D_FLOAT)1.0 && w != (M3D_FLOAT)0.0) + for(j = 0; j < M3D_NUMBONE && s.weight[j] > (M3D_FLOAT)0.0; j++) + s.weight[j] /= w; + k = M3D_NOTDEFINED; + if(model->skin) { + for(j = 0; j < model->numskin; j++) + if(!memcmp(&model->skin[j], &s, sizeof(m3ds_t))) { k = j; break; } + } + if(k == M3D_NOTDEFINED) { + k = model->numskin++; + model->skin = (m3ds_t*)M3D_REALLOC(model->skin, model->numskin * sizeof(m3ds_t)); + if(!model->skin) goto memerr; + memcpy(&model->skin[k], &s, sizeof(m3ds_t)); + } + model->voxtype[i].skinid = (M3D_INDEX)k; + } + /* parse item list */ + if(*ptr == '{') { + while(*ptr == '{' || *ptr == ' ' || *ptr == '\t') ptr++; + while(*ptr && *ptr != '}' && *ptr != '\r' && *ptr != '\n') { + ptr = _m3d_getint(ptr, &k); + ptr = _m3d_findarg(ptr); + if(!*ptr || *ptr == '}' || *ptr == '\r' || *ptr == '\n') goto asciiend; + pe = _m3d_safestr(ptr, 0); + if(!pe || !*pe) goto asciiend; + ptr = _m3d_findarg(ptr); + j = model->voxtype[i].numitem++; + model->voxtype[i].item = (m3dvi_t*)M3D_REALLOC(model->voxtype[i].item, + model->voxtype[i].numitem * sizeof(m3dvi_t)); + if(!model->voxtype[i].item) goto memerr; + model->voxtype[i].item[j].count = k; + model->voxtype[i].item[j].name = pe; + } + if(*ptr != '}') goto asciiend; + } + ptr = _m3d_findnl(ptr); + } + } else + /* voxel data */ + if(!memcmp(pe, "Voxel", 5)) { + if(!model->voxtype) { M3D_LOG("No voxel type chunk before voxel data"); goto asciiend; } + pe = _m3d_findarg(pe); + if(!*pe) goto asciiend; + if(*pe == '\r' || *pe == '\n') pe = NULL; + else pe = _m3d_safestr(pe, 0); + i = model->numvoxel++; + model->voxel = (m3dvx_t*)M3D_REALLOC(model->voxel, model->numvoxel * sizeof(m3dvx_t)); + if(!model->voxel) goto memerr; + memset(&model->voxel[i], 0, sizeof(m3dvx_t)); + model->voxel[i].name = pe; + k = l = 0; + while(*ptr && *ptr != '\r' && *ptr != '\n') { + switch(*ptr) { + case 'u': + ptr = _m3d_findarg(ptr); + if(!*ptr || *ptr == '\r' || *ptr == '\n') goto asciiend; + ptr = _m3d_getint(ptr, &n); + model->voxel[i].uncertain = ((n > 0 && n < 256 ? n : 0) * 255) / 100; + ptr = _m3d_findarg(ptr); + if(*ptr && *ptr != '\r' && *ptr != '\n') { + ptr = _m3d_getint(ptr, &n); + model->voxel[i].groupid = n > 0 && n < 256 ? n : 0; + } + break; + case 'p': + ptr = _m3d_findarg(ptr); + if(!*ptr || *ptr == '\r' || *ptr == '\n') goto asciiend; + ptr = _m3d_getint(ptr, &n); + model->voxel[i].x = n; + ptr = _m3d_findarg(ptr); + if(!*ptr || *ptr == '\r' || *ptr == '\n') goto asciiend; + ptr = _m3d_getint(ptr, &n); + model->voxel[i].y = n; + ptr = _m3d_findarg(ptr); + if(!*ptr || *ptr == '\r' || *ptr == '\n') goto asciiend; + ptr = _m3d_getint(ptr, &n); + model->voxel[i].z = n; + break; + case 'd': + ptr = _m3d_findarg(ptr); + if(!*ptr || *ptr == '\r' || *ptr == '\n') goto asciiend; + ptr = _m3d_getint(ptr, &n); + model->voxel[i].w = n; + ptr = _m3d_findarg(ptr); + if(!*ptr || *ptr == '\r' || *ptr == '\n') goto asciiend; + ptr = _m3d_getint(ptr, &n); + model->voxel[i].h = n; + ptr = _m3d_findarg(ptr); + if(!*ptr || *ptr == '\r' || *ptr == '\n') goto asciiend; + ptr = _m3d_getint(ptr, &n); + model->voxel[i].d = n; + break; + case 'l': + if(model->voxel[i].data) { l++; k = 0; } + else { + if(!model->voxel[i].w || !model->voxel[i].h || !model->voxel[i].d) { + M3D_LOG("No voxel dimension before layer data"); + goto asciiend; + } + model->voxel[i].data = (M3D_VOXEL*)M3D_MALLOC( + model->voxel[i].w * model->voxel[i].h * model->voxel[i].d * sizeof(M3D_VOXEL)); + if(!model->voxel[i].data) goto memerr; + } + break; + default: + if(!model->voxel[i].data || l >= model->voxel[i].h || k >= model->voxel[i].d) { + M3D_LOG("Missing voxel attributes or out of bound data"); + goto asciiend; + } + for(n = l * model->voxel[i].w * model->voxel[i].d + k * model->voxel[i].w; + j < model->voxel[i].w && *ptr && *ptr != '\r' && *ptr != '\n'; j++) { + ptr = _m3d_getint(ptr, &am); + if(am >= model->numvoxtype) goto asciiend; + model->voxel[i].data[n + j] = am; + } + k++; + break; + } + ptr = _m3d_findnl(ptr); + } + } else + /* mathematical shape */ + if(!memcmp(pe, "Shape", 5)) { + pe = _m3d_findarg(pe); + if(!*pe || *pe == '\r' || *pe == '\n') goto asciiend; + pe = _m3d_safestr(pe, 0); + if(!pe || !*pe) goto asciiend; + i = model->numshape++; + model->shape = (m3dh_t*)M3D_REALLOC(model->shape, model->numshape * sizeof(m3ds_t)); + if(!model->shape) goto memerr; + h = &model->shape[i]; + h->name = pe; + h->group = M3D_UNDEF; + h->numcmd = 0; + h->cmd = NULL; + while(*ptr && *ptr != '\r' && *ptr != '\n') { + if(!memcmp(ptr, "group", 5)) { + ptr = _m3d_findarg(ptr); + ptr = _m3d_getint(ptr, &h->group); + ptr = _m3d_findnl(ptr); + if(h->group != M3D_UNDEF && h->group >= model->numbone) { + M3D_LOG("Unknown bone id as shape group in shape"); + M3D_LOG(pe); + h->group = M3D_UNDEF; + model->errcode = M3D_ERR_SHPE; + } + continue; + } + for(cd = NULL, k = 0; k < (unsigned int)(sizeof(m3d_commandtypes)/sizeof(m3d_commandtypes[0])); k++) { + j = (unsigned int)strlen(m3d_commandtypes[k].key); + if(!memcmp(ptr, m3d_commandtypes[k].key, j) && (ptr[j] == ' ' || ptr[j] == '\r' || ptr[j] == '\n')) + { cd = &m3d_commandtypes[k]; break; } + } + if(cd) { + j = h->numcmd++; + h->cmd = (m3dc_t*)M3D_REALLOC(h->cmd, h->numcmd * sizeof(m3dc_t)); + if(!h->cmd) goto memerr; + h->cmd[j].type = k; + h->cmd[j].arg = (uint32_t*)M3D_MALLOC(cd->p * sizeof(uint32_t)); + if(!h->cmd[j].arg) goto memerr; + memset(h->cmd[j].arg, 0, cd->p * sizeof(uint32_t)); + for(k = n = 0, l = cd->p; k < l; k++) { + ptr = _m3d_findarg(ptr); + if(!*ptr) goto asciiend; + if(*ptr == '[') { + ptr = _m3d_findarg(ptr + 1); + if(!*ptr) goto asciiend; + } + if(*ptr == ']' || *ptr == '\r' || *ptr == '\n') break; + switch(cd->a[((k - n) % (cd->p - n)) + n]) { + case m3dcp_mi_t: + mi = M3D_UNDEF; + if(*ptr != '\r' && *ptr != '\n') { + pe = _m3d_safestr(ptr, 0); + if(!pe || !*pe) goto asciiend; + for(n = 0; n < model->nummaterial; n++) + if(!strcmp(pe, model->material[n].name)) { mi = (M3D_INDEX)n; break; } + if(mi == M3D_UNDEF && !(model->flags & M3D_FLG_MTLLIB)) { + mi = model->nummaterial++; + model->material = (m3dm_t*)M3D_REALLOC(model->material, + model->nummaterial * sizeof(m3dm_t)); + if(!model->material) goto memerr; + model->material[mi].name = pe; + model->material[mi].numprop = 1; + model->material[mi].prop = NULL; + } else + M3D_FREE(pe); + } + h->cmd[j].arg[k] = mi; + break; + case m3dcp_vc_t: +#ifdef M3D_DOUBLE + _m3d_getfloat(ptr, &w); f = w; + memcpy(&h->cmd[j].arg[k], &f, 4); +#else + _m3d_getfloat(ptr, (float*)&h->cmd[j].arg[k]); +#endif + break; + case m3dcp_va_t: + ptr = _m3d_getint(ptr, &h->cmd[j].arg[k]); + n = k + 1; l += (h->cmd[j].arg[k] - 1) * (cd->p - k - 1); + h->cmd[j].arg = (uint32_t*)M3D_REALLOC(h->cmd[j].arg, l * sizeof(uint32_t)); + if(!h->cmd[j].arg) goto memerr; + memset(&h->cmd[j].arg[k + 1], 0, (l - k - 1) * sizeof(uint32_t)); + break; + case m3dcp_qi_t: + ptr = _m3d_getint(ptr, &h->cmd[j].arg[k]); + model->vertex[h->cmd[i].arg[k]].skinid = M3D_INDEXMAX; + break; + default: + ptr = _m3d_getint(ptr, &h->cmd[j].arg[k]); + break; + } + } + } else { + M3D_LOG("Unknown shape command in"); + M3D_LOG(h->name); + model->errcode = M3D_ERR_UNKCMD; + } + ptr = _m3d_findnl(ptr); + } + if(!h->numcmd) model->numshape--; + } else + /* annotation labels */ + if(!memcmp(pe, "Labels", 6)) { + pe = _m3d_findarg(pe); + if(!*pe) goto asciiend; + if(*pe == '\r' || *pe == '\n') pe = NULL; + else pe = _m3d_safestr(pe, 0); + k = 0; fn = NULL; + while(*ptr && *ptr != '\r' && *ptr != '\n') { + if(*ptr == 'c') { + ptr = _m3d_findarg(ptr); + if(!*pe || *pe == '\r' || *pe == '\n') goto asciiend; + ptr = _m3d_gethex(ptr, &k); + } else + if(*ptr == 'l') { + ptr = _m3d_findarg(ptr); + if(!*pe || *pe == '\r' || *pe == '\n') goto asciiend; + fn = _m3d_safestr(ptr, 2); + } else { + i = model->numlabel++; + model->label = (m3dl_t*)M3D_REALLOC(model->label, model->numlabel * sizeof(m3dl_t)); + if(!model->label) goto memerr; + model->label[i].name = pe; + model->label[i].lang = fn; + model->label[i].color = k; + ptr = _m3d_getint(ptr, &j); + model->label[i].vertexid = (M3D_INDEX)j; + ptr = _m3d_findarg(ptr); + if(!*pe || *pe == '\r' || *pe == '\n') goto asciiend; + model->label[i].text = _m3d_safestr(ptr, 2); + } + ptr = _m3d_findnl(ptr); + } + } else + /* action */ + if(!memcmp(pe, "Action", 6)) { + pe = _m3d_findarg(pe); + if(!*pe || *pe == '\r' || *pe == '\n') goto asciiend; + pe = _m3d_getint(pe, &k); + pe = _m3d_findarg(pe); + if(!*pe || *pe == '\r' || *pe == '\n') goto asciiend; + pe = _m3d_safestr(pe, 0); + if(!pe || !*pe) goto asciiend; + i = model->numaction++; + model->action = (m3da_t*)M3D_REALLOC(model->action, model->numaction * sizeof(m3da_t)); + if(!model->action) goto memerr; + a = &model->action[i]; + a->name = pe; + a->durationmsec = k; + /* skip the first frame marker as there's always at least one frame */ + a->numframe = 1; + a->frame = (m3dfr_t*)M3D_MALLOC(sizeof(m3dfr_t)); + if(!a->frame) goto memerr; + a->frame[0].msec = 0; + a->frame[0].numtransform = 0; + a->frame[0].transform = NULL; + i = 0; + if(*ptr == 'f') + ptr = _m3d_findnl(ptr); + while(*ptr && *ptr != '\r' && *ptr != '\n') { + if(*ptr == 'f') { + i = a->numframe++; + a->frame = (m3dfr_t*)M3D_REALLOC(a->frame, a->numframe * sizeof(m3dfr_t)); + if(!a->frame) goto memerr; + ptr = _m3d_findarg(ptr); + ptr = _m3d_getint(ptr, &a->frame[i].msec); + a->frame[i].numtransform = 0; + a->frame[i].transform = NULL; + } else { + j = a->frame[i].numtransform++; + a->frame[i].transform = (m3dtr_t*)M3D_REALLOC(a->frame[i].transform, + a->frame[i].numtransform * sizeof(m3dtr_t)); + if(!a->frame[i].transform) goto memerr; + ptr = _m3d_getint(ptr, &k); + ptr = _m3d_findarg(ptr); + if(!*ptr || *ptr == '\r' || *ptr == '\n') goto asciiend; + a->frame[i].transform[j].boneid = (M3D_INDEX)k; + ptr = _m3d_getint(ptr, &k); + ptr = _m3d_findarg(ptr); + if(!*ptr || *ptr == '\r' || *ptr == '\n') goto asciiend; + a->frame[i].transform[j].pos = (M3D_INDEX)k; + ptr = _m3d_getint(ptr, &k); + if(!*ptr || *ptr == '\r' || *ptr == '\n') goto asciiend; + a->frame[i].transform[j].ori = (M3D_INDEX)k; + model->vertex[k].skinid = M3D_INDEXMAX; + } + ptr = _m3d_findnl(ptr); + } + } else + /* inlined assets chunk */ + if(!memcmp(pe, "Assets", 6)) { + while(*ptr && *ptr != '\r' && *ptr != '\n') { + if(readfilecb) { + pe = _m3d_safestr(ptr, 2); + if(!pe || !*pe) goto asciiend; + i = model->numinlined++; + model->inlined = (m3di_t*)M3D_REALLOC(model->inlined, model->numinlined * sizeof(m3di_t)); + if(!model->inlined) goto memerr; + t = &model->inlined[i]; + model->inlined[i].data = (*readfilecb)(pe, &model->inlined[i].length); + if(model->inlined[i].data) { + fn = strrchr(pe, '.'); + if(fn && (fn[1] == 'p' || fn[1] == 'P') && (fn[2] == 'n' || fn[2] == 'N') && + (fn[3] == 'g' || fn[3] == 'G')) *fn = 0; + fn = strrchr(pe, '/'); + if(!fn) fn = strrchr(pe, '\\'); + if(!fn) fn = pe; else fn++; + model->inlined[i].name = _m3d_safestr(fn, 0); + } else + model->numinlined--; + M3D_FREE(pe); + } + ptr = _m3d_findnl(ptr); + } + } else + /* extra chunks */ + if(!memcmp(pe, "Extra", 5)) { + pe = _m3d_findarg(pe); + if(!*pe || *pe == '\r' || *pe == '\n') goto asciiend; + buff = (unsigned char*)_m3d_findnl(ptr); + k = ((uint32_t)((uintptr_t)buff - (uintptr_t)ptr) / 3) + 1; + i = model->numextra++; + model->extra = (m3dchunk_t**)M3D_REALLOC(model->extra, model->numextra * sizeof(m3dchunk_t*)); + if(!model->extra) goto memerr; + model->extra[i] = (m3dchunk_t*)M3D_MALLOC(k + sizeof(m3dchunk_t)); + if(!model->extra[i]) goto memerr; + memcpy(&model->extra[i]->magic, pe, 4); + model->extra[i]->length = sizeof(m3dchunk_t); + pe = (char*)model->extra[i] + sizeof(m3dchunk_t); + while(*ptr && *ptr != '\r' && *ptr != '\n') { + ptr = _m3d_gethex(ptr, &k); + *pe++ = (uint8_t)k; + model->extra[i]->length++; + } + } else + goto asciiend; + } + model->errcode = M3D_SUCCESS; +asciiend: + setlocale(LC_NUMERIC, ol); + goto postprocess; + } +#endif + /* Binary variant */ + len = ((m3dhdr_t*)data)->length - 8; + data += 8; + if(M3D_CHUNKMAGIC(data, 'P','R','V','W')) { + /* optional preview chunk */ + model->preview.length = ((m3dchunk_t*)data)->length; + model->preview.data = data + sizeof(m3dchunk_t); + data += model->preview.length; + len -= model->preview.length; + } + if(!M3D_CHUNKMAGIC(data, 'H','E','A','D')) { + buff = (unsigned char *)stbi_zlib_decode_malloc_guesssize_headerflag((const char*)data, len, 4096, (int*)&len, 1); + if(!buff || !len || !M3D_CHUNKMAGIC(buff, 'H','E','A','D')) { + if(buff) M3D_FREE(buff); + M3D_FREE(model); + return NULL; + } + buff = (unsigned char*)M3D_REALLOC(buff, len); + model->flags |= M3D_FLG_FREERAW; /* mark that we have to free the raw buffer */ + data = buff; +#ifdef M3D_PROFILING + gettimeofday(&tv1, NULL); + tvd.tv_sec = tv1.tv_sec - tv0.tv_sec; + tvd.tv_usec = tv1.tv_usec - tv0.tv_usec; + if(tvd.tv_usec < 0) { tvd.tv_sec--; tvd.tv_usec += 1000000L; } + printf(" Deflate model %ld.%06ld sec\n", tvd.tv_sec, tvd.tv_usec); + memcpy(&tv0, &tv1, sizeof(struct timeval)); +#endif + } + model->raw = (m3dhdr_t*)data; + end = data + len; + + /* parse header */ + data += sizeof(m3dhdr_t); + M3D_LOG((char*)data); + model->name = (char*)data; + for(; data < end && *data; data++) {}; data++; + model->license = (char*)data; + for(; data < end && *data; data++) {}; data++; + model->author = (char*)data; + for(; data < end && *data; data++) {}; data++; + model->desc = (char*)data; + chunk = (unsigned char*)model->raw + model->raw->length; + model->scale = (M3D_FLOAT)model->raw->scale; + if(model->scale <= (M3D_FLOAT)0.0) model->scale = (M3D_FLOAT)1.0; + model->vc_s = 1 << ((model->raw->types >> 0) & 3); /* vertex coordinate size */ + model->vi_s = 1 << ((model->raw->types >> 2) & 3); /* vertex index size */ + model->si_s = 1 << ((model->raw->types >> 4) & 3); /* string offset size */ + model->ci_s = 1 << ((model->raw->types >> 6) & 3); /* color index size */ + model->ti_s = 1 << ((model->raw->types >> 8) & 3); /* tmap index size */ + model->bi_s = 1 << ((model->raw->types >>10) & 3); /* bone index size */ + model->nb_s = 1 << ((model->raw->types >>12) & 3); /* number of bones per vertex */ + model->sk_s = 1 << ((model->raw->types >>14) & 3); /* skin index size */ + model->fc_s = 1 << ((model->raw->types >>16) & 3); /* frame counter size */ + model->hi_s = 1 << ((model->raw->types >>18) & 3); /* shape index size */ + model->fi_s = 1 << ((model->raw->types >>20) & 3); /* face index size */ + model->vd_s = 1 << ((model->raw->types >>22) & 3); /* voxel dimension size */ + model->vp_s = 1 << ((model->raw->types >>24) & 3); /* voxel pixel size */ + if(model->ci_s == 8) model->ci_s = 0; /* optional indices */ + if(model->ti_s == 8) model->ti_s = 0; + if(model->bi_s == 8) model->bi_s = 0; + if(model->sk_s == 8) model->sk_s = 0; + if(model->fc_s == 8) model->fc_s = 0; + if(model->hi_s == 8) model->hi_s = 0; + if(model->fi_s == 8) model->fi_s = 0; + + /* variable limit checks */ + if(sizeof(M3D_FLOAT) == 4 && model->vc_s > 4) { + M3D_LOG("Double precision coordinates not supported, truncating to float..."); + model->errcode = M3D_ERR_TRUNC; + } + if((sizeof(M3D_INDEX) == 2 && (model->vi_s > 2 || model->si_s > 2 || model->ci_s > 2 || model->ti_s > 2 || + model->bi_s > 2 || model->sk_s > 2 || model->fc_s > 2 || model->hi_s > 2 || model->fi_s > 2)) || + (sizeof(M3D_VOXEL) < (size_t)model->vp_s && model->vp_s != 8)) { + M3D_LOG("32 bit indices not supported, unable to load model"); + M3D_FREE(model); + return NULL; + } + if(model->vi_s > 4 || model->si_s > 4 || model->vp_s == 4) { + M3D_LOG("Invalid index size, unable to load model"); + M3D_FREE(model); + return NULL; + } + if(!M3D_CHUNKMAGIC(end - 4, 'O','M','D','3')) { + M3D_LOG("Missing end chunk"); + M3D_FREE(model); + return NULL; + } + if(model->nb_s > M3D_NUMBONE) { + M3D_LOG("Model has more bones per vertex than what importer was configured to support"); + model->errcode = M3D_ERR_TRUNC; + } + + /* look for inlined assets in advance, material and procedural chunks may need them */ + buff = chunk; + while(buff < end && !M3D_CHUNKMAGIC(buff, 'O','M','D','3')) { + data = buff; + len = ((m3dchunk_t*)data)->length; + buff += len; + if(len < sizeof(m3dchunk_t) || buff >= end) { + M3D_LOG("Invalid chunk size"); + break; + } + len -= sizeof(m3dchunk_t) + model->si_s; + + /* inlined assets */ + if(M3D_CHUNKMAGIC(data, 'A','S','E','T') && len > 0) { + M3D_LOG("Inlined asset"); + i = model->numinlined++; + model->inlined = (m3di_t*)M3D_REALLOC(model->inlined, model->numinlined * sizeof(m3di_t)); + if(!model->inlined) { +memerr: M3D_LOG("Out of memory"); + model->errcode = M3D_ERR_ALLOC; + return model; + } + data += sizeof(m3dchunk_t); + t = &model->inlined[i]; + M3D_GETSTR(t->name); + M3D_LOG(t->name); + t->data = (uint8_t*)data; + t->length = len; + } + } + + /* parse chunks */ + while(chunk < end && !M3D_CHUNKMAGIC(chunk, 'O','M','D','3')) { + data = chunk; + len = ((m3dchunk_t*)chunk)->length; + chunk += len; + if(len < sizeof(m3dchunk_t) || chunk >= end) { + M3D_LOG("Invalid chunk size"); + break; + } + len -= sizeof(m3dchunk_t); + + /* color map */ + if(M3D_CHUNKMAGIC(data, 'C','M','A','P')) { + M3D_LOG("Color map"); + if(model->cmap) { M3D_LOG("More color map chunks, should be unique"); model->errcode = M3D_ERR_CMAP; continue; } + if(!model->ci_s) { M3D_LOG("Color map chunk, shouldn't be any"); model->errcode = M3D_ERR_CMAP; continue; } + model->numcmap = len / sizeof(uint32_t); + model->cmap = (uint32_t*)(data + sizeof(m3dchunk_t)); + } else + /* texture map */ + if(M3D_CHUNKMAGIC(data, 'T','M','A','P')) { + M3D_LOG("Texture map"); + if(model->tmap) { M3D_LOG("More texture map chunks, should be unique"); model->errcode = M3D_ERR_TMAP; continue; } + if(!model->ti_s) { M3D_LOG("Texture map chunk, shouldn't be any"); model->errcode = M3D_ERR_TMAP; continue; } + reclen = model->vc_s + model->vc_s; + model->numtmap = len / reclen; + model->tmap = (m3dti_t*)M3D_MALLOC(model->numtmap * sizeof(m3dti_t)); + if(!model->tmap) goto memerr; + for(i = 0, data += sizeof(m3dchunk_t); data < chunk; i++) { + switch(model->vc_s) { + case 1: + model->tmap[i].u = (M3D_FLOAT)((uint8_t)data[0]) / (M3D_FLOAT)255.0; + model->tmap[i].v = (M3D_FLOAT)((uint8_t)data[1]) / (M3D_FLOAT)255.0; + break; + case 2: + model->tmap[i].u = (M3D_FLOAT)(*((uint16_t*)(data+0))) / (M3D_FLOAT)65535.0; + model->tmap[i].v = (M3D_FLOAT)(*((uint16_t*)(data+2))) / (M3D_FLOAT)65535.0; + break; + case 4: + model->tmap[i].u = (M3D_FLOAT)(*((float*)(data+0))); + model->tmap[i].v = (M3D_FLOAT)(*((float*)(data+4))); + break; + case 8: + model->tmap[i].u = (M3D_FLOAT)(*((double*)(data+0))); + model->tmap[i].v = (M3D_FLOAT)(*((double*)(data+8))); + break; + } + data += reclen; + } + } else + /* vertex list */ + if(M3D_CHUNKMAGIC(data, 'V','R','T','S')) { + M3D_LOG("Vertex list"); + if(model->vertex) { M3D_LOG("More vertex chunks, should be unique"); model->errcode = M3D_ERR_VRTS; continue; } + if(model->ci_s && model->ci_s < 4 && !model->cmap) model->errcode = M3D_ERR_CMAP; + reclen = model->ci_s + model->sk_s + 4 * model->vc_s; + model->numvertex = len / reclen; + model->vertex = (m3dv_t*)M3D_MALLOC(model->numvertex * sizeof(m3dv_t)); + if(!model->vertex) goto memerr; + memset(model->vertex, 0, model->numvertex * sizeof(m3dv_t)); + for(i = 0, data += sizeof(m3dchunk_t); data < chunk && i < model->numvertex; i++) { + switch(model->vc_s) { + case 1: + model->vertex[i].x = (M3D_FLOAT)((int8_t)data[0]) / (M3D_FLOAT)127.0; + model->vertex[i].y = (M3D_FLOAT)((int8_t)data[1]) / (M3D_FLOAT)127.0; + model->vertex[i].z = (M3D_FLOAT)((int8_t)data[2]) / (M3D_FLOAT)127.0; + model->vertex[i].w = (M3D_FLOAT)((int8_t)data[3]) / (M3D_FLOAT)127.0; + data += 4; + break; + case 2: + model->vertex[i].x = (M3D_FLOAT)(*((int16_t*)(data+0))) / (M3D_FLOAT)32767.0; + model->vertex[i].y = (M3D_FLOAT)(*((int16_t*)(data+2))) / (M3D_FLOAT)32767.0; + model->vertex[i].z = (M3D_FLOAT)(*((int16_t*)(data+4))) / (M3D_FLOAT)32767.0; + model->vertex[i].w = (M3D_FLOAT)(*((int16_t*)(data+6))) / (M3D_FLOAT)32767.0; + data += 8; + break; + case 4: + model->vertex[i].x = (M3D_FLOAT)(*((float*)(data+0))); + model->vertex[i].y = (M3D_FLOAT)(*((float*)(data+4))); + model->vertex[i].z = (M3D_FLOAT)(*((float*)(data+8))); + model->vertex[i].w = (M3D_FLOAT)(*((float*)(data+12))); + data += 16; + break; + case 8: + model->vertex[i].x = (M3D_FLOAT)(*((double*)(data+0))); + model->vertex[i].y = (M3D_FLOAT)(*((double*)(data+8))); + model->vertex[i].z = (M3D_FLOAT)(*((double*)(data+16))); + model->vertex[i].w = (M3D_FLOAT)(*((double*)(data+24))); + data += 32; + break; + } + switch(model->ci_s) { + case 1: model->vertex[i].color = model->cmap ? model->cmap[data[0]] : 0; data++; break; + case 2: model->vertex[i].color = model->cmap ? model->cmap[*((uint16_t*)data)] : 0; data += 2; break; + case 4: model->vertex[i].color = *((uint32_t*)data); data += 4; break; + /* case 8: break; */ + } + model->vertex[i].skinid = M3D_UNDEF; + data = _m3d_getidx(data, model->sk_s, &model->vertex[i].skinid); + } + } else + /* skeleton: bone hierarchy and skin */ + if(M3D_CHUNKMAGIC(data, 'B','O','N','E')) { + M3D_LOG("Skeleton"); + if(model->bone) { M3D_LOG("More bone chunks, should be unique"); model->errcode = M3D_ERR_BONE; continue; } + if(!model->bi_s) { M3D_LOG("Bone chunk, shouldn't be any"); model->errcode=M3D_ERR_BONE; continue; } + if(!model->vertex) { M3D_LOG("No vertex chunk before bones"); model->errcode = M3D_ERR_VRTS; break; } + data += sizeof(m3dchunk_t); + model->numbone = 0; + data = _m3d_getidx(data, model->bi_s, &model->numbone); + if(model->numbone) { + model->bone = (m3db_t*)M3D_MALLOC(model->numbone * sizeof(m3db_t)); + if(!model->bone) goto memerr; + } + model->numskin = 0; + data = _m3d_getidx(data, model->sk_s, &model->numskin); + /* read bone hierarchy */ + for(i = 0; data < chunk && i < model->numbone; i++) { + data = _m3d_getidx(data, model->bi_s, &model->bone[i].parent); + M3D_GETSTR(model->bone[i].name); + data = _m3d_getidx(data, model->vi_s, &model->bone[i].pos); + data = _m3d_getidx(data, model->vi_s, &model->bone[i].ori); + model->bone[i].numweight = 0; + model->bone[i].weight = NULL; + } + if(i != model->numbone) { M3D_LOG("Truncated bone chunk"); model->numbone = i; model->numskin = 0; model->errcode = M3D_ERR_BONE; } + /* read skin definitions */ + if(model->numskin) { + model->skin = (m3ds_t*)M3D_MALLOC(model->numskin * sizeof(m3ds_t)); + if(!model->skin) goto memerr; + for(i = 0; data < chunk && i < model->numskin; i++) { + for(j = 0; j < M3D_NUMBONE; j++) { + model->skin[i].boneid[j] = M3D_UNDEF; + model->skin[i].weight[j] = (M3D_FLOAT)0.0; + } + memset(&weights, 0, sizeof(weights)); + if(model->nb_s == 1) weights[0] = 255; + else { + memcpy(&weights, data, model->nb_s); + data += model->nb_s; + } + for(j = 0, w = (M3D_FLOAT)0.0; j < (unsigned int)model->nb_s; j++) { + if(weights[j]) { + if(j >= M3D_NUMBONE) + data += model->bi_s; + else { + model->skin[i].weight[j] = (M3D_FLOAT)(weights[j]) / (M3D_FLOAT)255.0; + w += model->skin[i].weight[j]; + data = _m3d_getidx(data, model->bi_s, &model->skin[i].boneid[j]); + } + } + } + /* this can occur if model has more bones than what the importer is configured to handle */ + if(w != (M3D_FLOAT)1.0 && w != (M3D_FLOAT)0.0) { + for(j = 0; j < M3D_NUMBONE; j++) + model->skin[i].weight[j] /= w; + } + } + if(i != model->numskin) { M3D_LOG("Truncated skin in bone chunk"); model->numskin = i; model->errcode = M3D_ERR_BONE; } + } + } else + /* material */ + if(M3D_CHUNKMAGIC(data, 'M','T','R','L')) { + data += sizeof(m3dchunk_t); + M3D_GETSTR(name); + M3D_LOG("Material"); + M3D_LOG(name); + if(model->ci_s < 4 && !model->numcmap) model->errcode = M3D_ERR_CMAP; + for(i = 0; i < model->nummaterial; i++) + if(!strcmp(name, model->material[i].name)) { + model->errcode = M3D_ERR_MTRL; + M3D_LOG("Multiple definitions for material"); + M3D_LOG(name); + name = NULL; + break; + } + if(name) { + i = model->nummaterial++; + if(model->flags & M3D_FLG_MTLLIB) { + m = model->material; + model->material = (m3dm_t*)M3D_MALLOC(model->nummaterial * sizeof(m3dm_t)); + if(!model->material) goto memerr; + memcpy(model->material, m, (model->nummaterial - 1) * sizeof(m3dm_t)); + if(model->texture) { + tx = model->texture; + model->texture = (m3dtx_t*)M3D_MALLOC(model->numtexture * sizeof(m3dtx_t)); + if(!model->texture) goto memerr; + memcpy(model->texture, tx, model->numtexture * sizeof(m3dm_t)); + } + model->flags &= ~M3D_FLG_MTLLIB; + } else { + model->material = (m3dm_t*)M3D_REALLOC(model->material, model->nummaterial * sizeof(m3dm_t)); + if(!model->material) goto memerr; + } + m = &model->material[i]; + m->numprop = 0; + m->name = name; + m->prop = (m3dp_t*)M3D_MALLOC((len / 2) * sizeof(m3dp_t)); + if(!m->prop) goto memerr; + while(data < chunk) { + i = m->numprop++; + m->prop[i].type = *data++; + m->prop[i].value.num = 0; + if(m->prop[i].type >= 128) + k = m3dpf_map; + else { + for(k = 256, j = 0; j < sizeof(m3d_propertytypes)/sizeof(m3d_propertytypes[0]); j++) + if(m->prop[i].type == m3d_propertytypes[j].id) { k = m3d_propertytypes[j].format; break; } + } + switch(k) { + case m3dpf_color: + switch(model->ci_s) { + case 1: m->prop[i].value.color = model->cmap ? model->cmap[data[0]] : 0; data++; break; + case 2: m->prop[i].value.color = model->cmap ? model->cmap[*((uint16_t*)data)] : 0; data += 2; break; + case 4: m->prop[i].value.color = *((uint32_t*)data); data += 4; break; + } + break; + + case m3dpf_uint8: m->prop[i].value.num = *data++; break; + case m3dpf_uint16:m->prop[i].value.num = *((uint16_t*)data); data += 2; break; + case m3dpf_uint32:m->prop[i].value.num = *((uint32_t*)data); data += 4; break; + case m3dpf_float: m->prop[i].value.fnum = *((float*)data); data += 4; break; + + case m3dpf_map: + M3D_GETSTR(name); + m->prop[i].value.textureid = _m3d_gettx(model, readfilecb, freecb, name); + if(model->errcode == M3D_ERR_ALLOC) goto memerr; + /* this error code only returned if readfilecb was specified */ + if(m->prop[i].value.textureid == M3D_UNDEF) { + M3D_LOG("Texture not found"); + M3D_LOG(m->name); + m->numprop--; + } + break; + + default: + M3D_LOG("Unknown material property in"); + M3D_LOG(m->name); + model->errcode = M3D_ERR_UNKPROP; + data = chunk; + break; + } + } + m->prop = (m3dp_t*)M3D_REALLOC(m->prop, m->numprop * sizeof(m3dp_t)); + if(!m->prop) goto memerr; + } + } else + /* face */ + if(M3D_CHUNKMAGIC(data, 'P','R','O','C')) { + /* procedural surface */ + M3D_GETSTR(name); + M3D_LOG("Procedural surface"); + M3D_LOG(name); + _m3d_getpr(model, readfilecb, freecb, name); + } else + if(M3D_CHUNKMAGIC(data, 'M','E','S','H')) { + M3D_LOG("Mesh data"); + if(!model->vertex) { M3D_LOG("No vertex chunk before mesh"); model->errcode = M3D_ERR_VRTS; } + /* mesh */ + data += sizeof(m3dchunk_t); + mi = M3D_UNDEF; +#ifdef M3D_VERTEXMAX + pi = M3D_UNDEF; +#endif + am = model->numface; + while(data < chunk) { + k = *data++; + n = k >> 4; + k &= 15; + if(!n) { + if(!k) { + /* use material */ + mi = M3D_UNDEF; + M3D_GETSTR(name); + if(name) { + for(j = 0; j < model->nummaterial; j++) + if(!strcmp(name, model->material[j].name)) { + mi = (M3D_INDEX)j; + break; + } + if(mi == M3D_UNDEF) model->errcode = M3D_ERR_MTRL; + } + } else { + /* use parameter */ + M3D_GETSTR(name); +#ifdef M3D_VERTEXMAX + pi = M3D_UNDEF; + if(name) { + for(j = 0; j < model->numparam; j++) + if(!strcmp(name, model->param[j].name)) { + pi = (M3D_INDEX)j; + break; + } + if(pi == M3D_UNDEF) { + pi = model->numparam++; + model->param = (m3dvi_t*)M3D_REALLOC(model->param, model->numparam * sizeof(m3dvi_t)); + if(!model->param) goto memerr; + model->param[pi].name = name; + model->param[pi].count = 0; + } + } +#endif + } + continue; + } + if(n != 3) { M3D_LOG("Only triangle mesh supported for now"); model->errcode = M3D_ERR_UNKMESH; return model; } + i = model->numface++; + if(model->numface > am) { + am = model->numface + 4095; + model->face = (m3df_t*)M3D_REALLOC(model->face, am * sizeof(m3df_t)); + if(!model->face) goto memerr; + } + memset(&model->face[i], 255, sizeof(m3df_t)); /* set all index to -1 by default */ + model->face[i].materialid = mi; +#ifdef M3D_VERTEXMAX + model->face[i].paramid = pi; +#endif + for(j = 0; data < chunk && j < n; j++) { + /* vertex */ + data = _m3d_getidx(data, model->vi_s, &model->face[i].vertex[j]); + /* texcoord */ + if(k & 1) + data = _m3d_getidx(data, model->ti_s, &model->face[i].texcoord[j]); + /* normal */ + if(k & 2) + data = _m3d_getidx(data, model->vi_s, &model->face[i].normal[j]); +#ifndef M3D_NONORMALS + if(model->face[i].normal[j] == M3D_UNDEF) neednorm = 1; +#endif + /* maximum */ + if(k & 4) +#ifdef M3D_VERTEXMAX + data = _m3d_getidx(data, model->vi_s, &model->face[i].vertmax[j]); +#else + data += model->vi_s; +#endif + } + if(j != n) { M3D_LOG("Invalid mesh"); model->numface = 0; model->errcode = M3D_ERR_UNKMESH; return model; } + } + model->face = (m3df_t*)M3D_REALLOC(model->face, model->numface * sizeof(m3df_t)); + } else + if(M3D_CHUNKMAGIC(data, 'V','O','X','T')) { + /* voxel types */ + M3D_LOG("Voxel types list"); + if(model->voxtype) { M3D_LOG("More voxel type chunks, should be unique"); model->errcode = M3D_ERR_VOXT; continue; } + if(model->ci_s && model->ci_s < 4 && !model->cmap) model->errcode = M3D_ERR_CMAP; + reclen = model->ci_s + model->si_s + 3 + model->sk_s; + k = len / reclen; + model->voxtype = (m3dvt_t*)M3D_MALLOC(k * sizeof(m3dvt_t)); + if(!model->voxtype) goto memerr; + memset(model->voxtype, 0, k * sizeof(m3dvt_t)); + model->numvoxtype = 0; + for(i = 0, data += sizeof(m3dchunk_t); data < chunk && i < k; i++) { + switch(model->ci_s) { + case 1: model->voxtype[i].color = model->cmap ? model->cmap[data[0]] : 0; data++; break; + case 2: model->voxtype[i].color = model->cmap ? model->cmap[*((uint16_t*)data)] : 0; data += 2; break; + case 4: model->voxtype[i].color = *((uint32_t*)data); data += 4; break; + /* case 8: break; */ + } + M3D_GETSTR(name); + model->voxtype[i].materialid = M3D_UNDEF; + if(name) { + model->voxtype[i].name = name; +/* + for(j = 0; j < model->nummaterial; j++) + if(!strcmp(name, model->material[j].name)) { + model->voxtype[i].materialid = (M3D_INDEX)j; + break; + } +*/ + } + j = *data++; + model->voxtype[i].rotation = j & 0xBF; + model->voxtype[i].voxshape = ((j & 0x40) << 2) | *data++; + model->voxtype[i].numitem = *data++; + model->voxtype[i].skinid = M3D_UNDEF; + data = _m3d_getidx(data, model->sk_s, &model->voxtype[i].skinid); + if(model->voxtype[i].numitem) { + model->voxtype[i].item = (m3dvi_t*)M3D_MALLOC(model->voxtype[i].numitem * sizeof(m3dvi_t)); + if(!model->voxtype[i].item) goto memerr; + memset(model->voxtype[i].item, 0, model->voxtype[i].numitem * sizeof(m3dvi_t)); + for(j = 0; j < model->voxtype[i].numitem; j++) { + model->voxtype[i].item[j].count = *data++; + model->voxtype[i].item[j].count |= (*data++) << 8; + M3D_GETSTR(model->voxtype[i].item[j].name); + } + } + } + model->numvoxtype = i; + if(k != model->numvoxtype) { + model->voxtype = (m3dvt_t*)M3D_REALLOC(model->voxtype, model->numvoxtype * sizeof(m3dvt_t)); + if(!model->voxtype) goto memerr; + } + } else + if(M3D_CHUNKMAGIC(data, 'V','O','X','D')) { + /* voxel data */ + data += sizeof(m3dchunk_t); + M3D_GETSTR(name); + M3D_LOG("Voxel Data Layer"); + M3D_LOG(name); + if(model->vd_s > 4 || model->vp_s > 2) { M3D_LOG("No voxel index size"); model->errcode = M3D_ERR_UNKVOX; continue; } + if(!model->voxtype) { M3D_LOG("No voxel type chunk before voxel data"); model->errcode = M3D_ERR_VOXT; } + i = model->numvoxel++; + model->voxel = (m3dvx_t*)M3D_REALLOC(model->voxel, model->numvoxel * sizeof(m3dvx_t)); + if(!model->voxel) goto memerr; + memset(&model->voxel[i], 0, sizeof(m3dvx_t)); + model->voxel[i].name = name; + switch(model->vd_s) { + case 1: + model->voxel[i].x = (int32_t)((int8_t)data[0]); + model->voxel[i].y = (int32_t)((int8_t)data[1]); + model->voxel[i].z = (int32_t)((int8_t)data[2]); + model->voxel[i].w = (uint32_t)(data[3]); + model->voxel[i].h = (uint32_t)(data[4]); + model->voxel[i].d = (uint32_t)(data[5]); + data += 6; + break; + case 2: + model->voxel[i].x = (int32_t)(*((int16_t*)(data+0))); + model->voxel[i].y = (int32_t)(*((int16_t*)(data+2))); + model->voxel[i].z = (int32_t)(*((int16_t*)(data+4))); + model->voxel[i].w = (uint32_t)(*((uint16_t*)(data+6))); + model->voxel[i].h = (uint32_t)(*((uint16_t*)(data+8))); + model->voxel[i].d = (uint32_t)(*((uint16_t*)(data+10))); + data += 12; + break; + case 4: + model->voxel[i].x = *((int32_t*)(data+0)); + model->voxel[i].y = *((int32_t*)(data+4)); + model->voxel[i].z = *((int32_t*)(data+8)); + model->voxel[i].w = *((uint32_t*)(data+12)); + model->voxel[i].h = *((uint32_t*)(data+16)); + model->voxel[i].d = *((uint32_t*)(data+20)); + data += 24; + break; + } + model->voxel[i].uncertain = *data++; + model->voxel[i].groupid = *data++; + k = model->voxel[i].w * model->voxel[i].h * model->voxel[i].d; + model->voxel[i].data = (M3D_VOXEL*)M3D_MALLOC(k * sizeof(M3D_VOXEL)); + if(!model->voxel[i].data) goto memerr; + memset(model->voxel[i].data, 0xff, k * sizeof(M3D_VOXEL)); + for(j = 0; data < chunk && j < k;) { + l = ((*data++) & 0x7F) + 1; + if(data[-1] & 0x80) { + data = _m3d_getidx(data, model->vp_s, &mi); + while(l-- && j < k) model->voxel[i].data[j++] = (M3D_VOXEL)mi; + } else + while(l-- && j < k) { + data = _m3d_getidx(data, model->vp_s, &mi); + model->voxel[i].data[j++] = (M3D_VOXEL)mi; + } + } + } else + if(M3D_CHUNKMAGIC(data, 'S','H','P','E')) { + /* mathematical shape */ + data += sizeof(m3dchunk_t); + M3D_GETSTR(name); + M3D_LOG("Mathematical Shape"); + M3D_LOG(name); + i = model->numshape++; + model->shape = (m3dh_t*)M3D_REALLOC(model->shape, model->numshape * sizeof(m3dh_t)); + if(!model->shape) goto memerr; + h = &model->shape[i]; + h->numcmd = 0; + h->cmd = NULL; + h->name = name; + h->group = M3D_UNDEF; + data = _m3d_getidx(data, model->bi_s, &h->group); + if(h->group != M3D_UNDEF && h->group >= model->numbone) { + M3D_LOG("Unknown bone id as shape group in shape"); + M3D_LOG(name); + h->group = M3D_UNDEF; + model->errcode = M3D_ERR_SHPE; + } + while(data < chunk) { + i = h->numcmd++; + h->cmd = (m3dc_t*)M3D_REALLOC(h->cmd, h->numcmd * sizeof(m3dc_t)); + if(!h->cmd) goto memerr; + h->cmd[i].type = *data++; + if(h->cmd[i].type & 0x80) { + h->cmd[i].type &= 0x7F; + h->cmd[i].type |= (*data++ << 7); + } + if(h->cmd[i].type >= (unsigned int)(sizeof(m3d_commandtypes)/sizeof(m3d_commandtypes[0]))) { + M3D_LOG("Unknown shape command in"); + M3D_LOG(h->name); + model->errcode = M3D_ERR_UNKCMD; + break; + } + cd = &m3d_commandtypes[h->cmd[i].type]; + h->cmd[i].arg = (uint32_t*)M3D_MALLOC(cd->p * sizeof(uint32_t)); + if(!h->cmd[i].arg) goto memerr; + memset(h->cmd[i].arg, 0, cd->p * sizeof(uint32_t)); + for(k = n = 0, l = cd->p; k < l; k++) + switch(cd->a[((k - n) % (cd->p - n)) + n]) { + case m3dcp_mi_t: + h->cmd[i].arg[k] = M3D_NOTDEFINED; + M3D_GETSTR(name); + if(name) { + for(n = 0; n < model->nummaterial; n++) + if(!strcmp(name, model->material[n].name)) { + h->cmd[i].arg[k] = n; + break; + } + if(h->cmd[i].arg[k] == M3D_NOTDEFINED) model->errcode = M3D_ERR_MTRL; + } + break; + case m3dcp_vc_t: + f = 0.0f; + switch(model->vc_s) { + case 1: f = (float)((int8_t)data[0]) / 127; break; + case 2: f = (float)(*((int16_t*)(data+0))) / 32767; break; + case 4: f = (float)(*((float*)(data+0))); break; + case 8: f = (float)(*((double*)(data+0))); break; + } + memcpy(&h->cmd[i].arg[k], &f, 4); + data += model->vc_s; + break; + case m3dcp_hi_t: data = _m3d_getidx(data, model->hi_s, &h->cmd[i].arg[k]); break; + case m3dcp_fi_t: data = _m3d_getidx(data, model->fi_s, &h->cmd[i].arg[k]); break; + case m3dcp_ti_t: data = _m3d_getidx(data, model->ti_s, &h->cmd[i].arg[k]); break; + case m3dcp_qi_t: + case m3dcp_vi_t: data = _m3d_getidx(data, model->vi_s, &h->cmd[i].arg[k]); break; + case m3dcp_i1_t: data = _m3d_getidx(data, 1, &h->cmd[i].arg[k]); break; + case m3dcp_i2_t: data = _m3d_getidx(data, 2, &h->cmd[i].arg[k]); break; + case m3dcp_i4_t: data = _m3d_getidx(data, 4, &h->cmd[i].arg[k]); break; + case m3dcp_va_t: data = _m3d_getidx(data, 4, &h->cmd[i].arg[k]); + n = k + 1; l += (h->cmd[i].arg[k] - 1) * (cd->p - k - 1); + h->cmd[i].arg = (uint32_t*)M3D_REALLOC(h->cmd[i].arg, l * sizeof(uint32_t)); + if(!h->cmd[i].arg) goto memerr; + memset(&h->cmd[i].arg[k + 1], 0, (l - k - 1) * sizeof(uint32_t)); + break; + } + } + } else + /* annotation label list */ + if(M3D_CHUNKMAGIC(data, 'L','B','L','S')) { + data += sizeof(m3dchunk_t); + M3D_GETSTR(name); + M3D_GETSTR(lang); + M3D_LOG("Label list"); + if(name) { M3D_LOG(name); } + if(lang) { M3D_LOG(lang); } + if(model->ci_s && model->ci_s < 4 && !model->cmap) model->errcode = M3D_ERR_CMAP; + k = 0; + switch(model->ci_s) { + case 1: k = model->cmap ? model->cmap[data[0]] : 0; data++; break; + case 2: k = model->cmap ? model->cmap[*((uint16_t*)data)] : 0; data += 2; break; + case 4: k = *((uint32_t*)data); data += 4; break; + /* case 8: break; */ + } + reclen = model->vi_s + model->si_s; + i = model->numlabel; model->numlabel += len / reclen; + model->label = (m3dl_t*)M3D_REALLOC(model->label, model->numlabel * sizeof(m3dl_t)); + if(!model->label) goto memerr; + memset(&model->label[i], 0, (model->numlabel - i) * sizeof(m3dl_t)); + for(; data < chunk && i < model->numlabel; i++) { + model->label[i].name = name; + model->label[i].lang = lang; + model->label[i].color = k; + data = _m3d_getidx(data, model->vi_s, &model->label[i].vertexid); + M3D_GETSTR(model->label[i].text); + } + } else + /* action */ + if(M3D_CHUNKMAGIC(data, 'A','C','T','N')) { + M3D_LOG("Action"); + i = model->numaction++; + model->action = (m3da_t*)M3D_REALLOC(model->action, model->numaction * sizeof(m3da_t)); + if(!model->action) goto memerr; + a = &model->action[i]; + data += sizeof(m3dchunk_t); + M3D_GETSTR(a->name); + M3D_LOG(a->name); + a->numframe = *((uint16_t*)data); data += 2; + if(a->numframe < 1) { + model->numaction--; + } else { + a->durationmsec = *((uint32_t*)data); data += 4; + a->frame = (m3dfr_t*)M3D_MALLOC(a->numframe * sizeof(m3dfr_t)); + if(!a->frame) goto memerr; + for(i = 0; data < chunk && i < a->numframe; i++) { + a->frame[i].msec = *((uint32_t*)data); data += 4; + a->frame[i].numtransform = 0; a->frame[i].transform = NULL; + data = _m3d_getidx(data, model->fc_s, &a->frame[i].numtransform); + if(a->frame[i].numtransform > 0) { + a->frame[i].transform = (m3dtr_t*)M3D_MALLOC(a->frame[i].numtransform * sizeof(m3dtr_t)); + for(j = 0; j < a->frame[i].numtransform; j++) { + data = _m3d_getidx(data, model->bi_s, &a->frame[i].transform[j].boneid); + data = _m3d_getidx(data, model->vi_s, &a->frame[i].transform[j].pos); + data = _m3d_getidx(data, model->vi_s, &a->frame[i].transform[j].ori); + } + } + } + } + } else { + i = model->numextra++; + model->extra = (m3dchunk_t**)M3D_REALLOC(model->extra, model->numextra * sizeof(m3dchunk_t*)); + if(!model->extra) goto memerr; + model->extra[i] = (m3dchunk_t*)data; + } + } + /* calculate normals, normalize skin weights, create bone/vertex cross-references and calculate transform matrices */ +#ifdef M3D_ASCII +postprocess: +#endif + if(model) { + M3D_LOG("Post-process"); +#ifdef M3D_PROFILING + gettimeofday(&tv1, NULL); + tvd.tv_sec = tv1.tv_sec - tv0.tv_sec; + tvd.tv_usec = tv1.tv_usec - tv0.tv_usec; + if(tvd.tv_usec < 0) { tvd.tv_sec--; tvd.tv_usec += 1000000L; } + printf(" Parsing chunks %ld.%06ld sec\n", tvd.tv_sec, tvd.tv_usec); +#endif +#ifndef M3D_NOVOXELS + if(model->numvoxel && model->voxel) { + M3D_LOG("Converting voxels into vertices and mesh"); + /* add normals */ + enorm = model->numvertex; model->numvertex += 6; + model->vertex = (m3dv_t*)M3D_REALLOC(model->vertex, model->numvertex * sizeof(m3dv_t)); + if(!model->vertex) goto memerr; + memset(&model->vertex[enorm], 0, 6 * sizeof(m3dv_t)); + for(l = 0; l < 6; l++) + model->vertex[enorm+l].skinid = M3D_UNDEF; + model->vertex[enorm+0].y = (M3D_FLOAT)-1.0; + model->vertex[enorm+1].z = (M3D_FLOAT)-1.0; + model->vertex[enorm+2].x = (M3D_FLOAT)-1.0; + model->vertex[enorm+3].y = (M3D_FLOAT)1.0; + model->vertex[enorm+4].z = (M3D_FLOAT)1.0; + model->vertex[enorm+5].x = (M3D_FLOAT)1.0; + /* this is a fast, not so memory efficient version, only basic face culling used */ + min_x = min_y = min_z = 2147483647L; + max_x = max_y = max_z = -2147483647L; + for(i = 0; i < model->numvoxel; i++) { + if(model->voxel[i].x + (int32_t)model->voxel[i].w > max_x) max_x = model->voxel[i].x + (int32_t)model->voxel[i].w; + if(model->voxel[i].x < min_x) min_x = model->voxel[i].x; + if(model->voxel[i].y + (int32_t)model->voxel[i].h > max_y) max_y = model->voxel[i].y + (int32_t)model->voxel[i].h; + if(model->voxel[i].y < min_y) min_y = model->voxel[i].y; + if(model->voxel[i].z + (int32_t)model->voxel[i].d > max_z) max_z = model->voxel[i].z + (int32_t)model->voxel[i].d; + if(model->voxel[i].z < min_z) min_z = model->voxel[i].z; + } + i = (-min_x > max_x ? -min_x : max_x); + j = (-min_y > max_y ? -min_y : max_y); + k = (-min_z > max_z ? -min_z : max_z); + if(j > i) i = j; + if(k > i) i = k; + if(i <= 1) i = 1; + w = (M3D_FLOAT)1.0 / (M3D_FLOAT)i; + if(i >= 254) model->vc_s = 2; + if(i >= 65534) model->vc_s = 4; + for(i = 0; i < model->numvoxel; i++) { + sx = model->voxel[i].w; sz = model->voxel[i].d; sy = model->voxel[i].h; + for(y = 0, j = 0; y < sy; y++) + for(z = 0; z < sz; z++) + for(x = 0; x < sx; x++, j++) + if(model->voxel[i].data[j] < model->numvoxtype) { + k = 0; + /* 16__32 ____ + * /| /| /|2 /| + *64_128 | /_8_/ 32 + * | 1_|_2 |4|_|_| + * |/ |/ |/ 1|/ + * 4___8 |16_| */ + k = n = am = 0; + if(!y || model->voxel[i].data[j - sx*sz] >= model->numvoxtype) { n++; am |= 1; k |= 1|2|4|8; } + if(!z || model->voxel[i].data[j - sx] >= model->numvoxtype) { n++; am |= 2; k |= 1|2|16|32; } + if(!x || model->voxel[i].data[j - 1] >= model->numvoxtype) { n++; am |= 4; k |= 1|4|16|64; } + if(y == sy-1 || model->voxel[i].data[j + sx*sz] >= model->numvoxtype) { n++; am |= 8; k |= 16|32|64|128; } + if(z == sz-1 || model->voxel[i].data[j + sx] >= model->numvoxtype) { n++; am |= 16; k |= 4|8|64|128; } + if(x == sx-1 || model->voxel[i].data[j + 1] >= model->numvoxtype) { n++; am |= 32; k |= 2|8|32|128; } + if(k) { + memset(edge, 255, sizeof(edge)); + for(l = 0, len = 1, reclen = model->numvertex; l < 8; l++, len <<= 1) + if(k & len) edge[l] = model->numvertex++; + model->vertex = (m3dv_t*)M3D_REALLOC(model->vertex, model->numvertex * sizeof(m3dv_t)); + if(!model->vertex) goto memerr; + memset(&model->vertex[reclen], 0, (model->numvertex-reclen) * sizeof(m3dv_t)); + for(l = reclen; l < model->numvertex; l++) { + model->vertex[l].skinid = model->voxtype[model->voxel[i].data[j]].skinid; + model->vertex[l].color = model->voxtype[model->voxel[i].data[j]].color; + } + l = reclen; + if(k & 1) { + model->vertex[l].x = (model->voxel[i].x + x) * w; + model->vertex[l].y = (model->voxel[i].y + y) * w; + model->vertex[l].z = (model->voxel[i].z + z) * w; + l++; + } + if(k & 2) { + model->vertex[l].x = (model->voxel[i].x + x + 1) * w; + model->vertex[l].y = (model->voxel[i].y + y) * w; + model->vertex[l].z = (model->voxel[i].z + z) * w; + l++; + } + if(k & 4) { + model->vertex[l].x = (model->voxel[i].x + x) * w; + model->vertex[l].y = (model->voxel[i].y + y) * w; + model->vertex[l].z = (model->voxel[i].z + z + 1) * w; + l++; + } + if(k & 8) { + model->vertex[l].x = (model->voxel[i].x + x + 1) * w; + model->vertex[l].y = (model->voxel[i].y + y) * w; + model->vertex[l].z = (model->voxel[i].z + z + 1) * w; + l++; + } + if(k & 16) { + model->vertex[l].x = (model->voxel[i].x + x) * w; + model->vertex[l].y = (model->voxel[i].y + y + 1) * w; + model->vertex[l].z = (model->voxel[i].z + z) * w; + l++; + } + if(k & 32) { + model->vertex[l].x = (model->voxel[i].x + x + 1) * w; + model->vertex[l].y = (model->voxel[i].y + y + 1) * w; + model->vertex[l].z = (model->voxel[i].z + z) * w; + l++; + } + if(k & 64) { + model->vertex[l].x = (model->voxel[i].x + x) * w; + model->vertex[l].y = (model->voxel[i].y + y + 1) * w; + model->vertex[l].z = (model->voxel[i].z + z + 1) * w; + l++; + } + if(k & 128) { + model->vertex[l].x = (model->voxel[i].x + x + 1) * w; + model->vertex[l].y = (model->voxel[i].y + y + 1) * w; + model->vertex[l].z = (model->voxel[i].z + z + 1) * w; + l++; + } + n <<= 1; + l = model->numface; model->numface += n; + model->face = (m3df_t*)M3D_REALLOC(model->face, model->numface * sizeof(m3df_t)); + if(!model->face) goto memerr; + memset(&model->face[l], 255, n * sizeof(m3df_t)); + for(reclen = l; reclen < model->numface; reclen++) + model->face[reclen].materialid = model->voxtype[model->voxel[i].data[j]].materialid; + if(am & 1) { /* bottom */ + model->face[l].vertex[0] = edge[0]; model->face[l].vertex[1] = edge[1]; model->face[l].vertex[2] = edge[2]; + model->face[l+1].vertex[0] = edge[2]; model->face[l+1].vertex[1] = edge[1]; model->face[l+1].vertex[2] = edge[3]; + model->face[l].normal[0] = model->face[l].normal[1] = model->face[l].normal[2] = + model->face[l+1].normal[0] = model->face[l+1].normal[1] = model->face[l+1].normal[2] = enorm; + l += 2; + } + if(am & 2) { /* north */ + model->face[l].vertex[0] = edge[0]; model->face[l].vertex[1] = edge[4]; model->face[l].vertex[2] = edge[1]; + model->face[l+1].vertex[0] = edge[1]; model->face[l+1].vertex[1] = edge[4]; model->face[l+1].vertex[2] = edge[5]; + model->face[l].normal[0] = model->face[l].normal[1] = model->face[l].normal[2] = + model->face[l+1].normal[0] = model->face[l+1].normal[1] = model->face[l+1].normal[2] = enorm+1; + l += 2; + } + if(am & 4) { /* west */ + model->face[l].vertex[0] = edge[0]; model->face[l].vertex[1] = edge[2]; model->face[l].vertex[2] = edge[4]; + model->face[l+1].vertex[0] = edge[2]; model->face[l+1].vertex[1] = edge[6]; model->face[l+1].vertex[2] = edge[4]; + model->face[l].normal[0] = model->face[l].normal[1] = model->face[l].normal[2] = + model->face[l+1].normal[0] = model->face[l+1].normal[1] = model->face[l+1].normal[2] = enorm+2; + l += 2; + } + if(am & 8) { /* top */ + model->face[l].vertex[0] = edge[4]; model->face[l].vertex[1] = edge[6]; model->face[l].vertex[2] = edge[5]; + model->face[l+1].vertex[0] = edge[5]; model->face[l+1].vertex[1] = edge[6]; model->face[l+1].vertex[2] = edge[7]; + model->face[l].normal[0] = model->face[l].normal[1] = model->face[l].normal[2] = + model->face[l+1].normal[0] = model->face[l+1].normal[1] = model->face[l+1].normal[2] = enorm+3; + l += 2; + } + if(am & 16) { /* south */ + model->face[l].vertex[0] = edge[2]; model->face[l].vertex[1] = edge[7]; model->face[l].vertex[2] = edge[6]; + model->face[l+1].vertex[0] = edge[7]; model->face[l+1].vertex[1] = edge[2]; model->face[l+1].vertex[2] = edge[3]; + model->face[l].normal[0] = model->face[l].normal[1] = model->face[l].normal[2] = + model->face[l+1].normal[0] = model->face[l+1].normal[1] = model->face[l+1].normal[2] = enorm+4; + l += 2; + } + if(am & 32) { /* east */ + model->face[l].vertex[0] = edge[1]; model->face[l].vertex[1] = edge[5]; model->face[l].vertex[2] = edge[7]; + model->face[l+1].vertex[0] = edge[1]; model->face[l+1].vertex[1] = edge[7]; model->face[l+1].vertex[2] = edge[3]; + model->face[l].normal[0] = model->face[l].normal[1] = model->face[l].normal[2] = + model->face[l+1].normal[0] = model->face[l+1].normal[1] = model->face[l+1].normal[2] = enorm+5; + l += 2; + } + } + } + } + } +#endif +#ifndef M3D_NONORMALS + if(model->numface && model->face && neednorm) { + /* if they are missing, calculate triangle normals into a temporary buffer */ + norm = (m3dv_t*)M3D_MALLOC(model->numface * sizeof(m3dv_t)); + if(!norm) goto memerr; + for(i = 0, n = model->numvertex; i < model->numface; i++) + if(model->face[i].normal[0] == M3D_UNDEF) { + v0 = &model->vertex[model->face[i].vertex[0]]; + v1 = &model->vertex[model->face[i].vertex[1]]; + v2 = &model->vertex[model->face[i].vertex[2]]; + va.x = v1->x - v0->x; va.y = v1->y - v0->y; va.z = v1->z - v0->z; + vb.x = v2->x - v0->x; vb.y = v2->y - v0->y; vb.z = v2->z - v0->z; + v0 = &norm[i]; + v0->x = (va.y * vb.z) - (va.z * vb.y); + v0->y = (va.z * vb.x) - (va.x * vb.z); + v0->z = (va.x * vb.y) - (va.y * vb.x); + w = _m3d_rsq((v0->x * v0->x) + (v0->y * v0->y) + (v0->z * v0->z)); + v0->x *= w; v0->y *= w; v0->z *= w; + model->face[i].normal[0] = model->face[i].vertex[0] + n; + model->face[i].normal[1] = model->face[i].vertex[1] + n; + model->face[i].normal[2] = model->face[i].vertex[2] + n; + } + /* this is the fast way, we don't care if a normal is repeated in model->vertex */ + M3D_LOG("Generating normals"); + model->flags |= M3D_FLG_GENNORM; + model->numvertex <<= 1; + model->vertex = (m3dv_t*)M3D_REALLOC(model->vertex, model->numvertex * sizeof(m3dv_t)); + if(!model->vertex) goto memerr; + memset(&model->vertex[n], 0, n * sizeof(m3dv_t)); + for(i = 0; i < model->numface; i++) + for(j = 0; j < 3; j++) { + v0 = &model->vertex[model->face[i].vertex[j] + n]; + v0->x += norm[i].x; + v0->y += norm[i].y; + v0->z += norm[i].z; + } + /* for each vertex, take the average of the temporary normals and use that */ + for(i = 0, v0 = &model->vertex[n]; i < n; i++, v0++) { + w = _m3d_rsq((v0->x * v0->x) + (v0->y * v0->y) + (v0->z * v0->z)); + v0->x *= w; v0->y *= w; v0->z *= w; + v0->skinid = M3D_UNDEF; + } + M3D_FREE(norm); + } +#endif + if(model->numbone && model->bone && model->numskin && model->skin && model->numvertex && model->vertex) { +#ifndef M3D_NOWEIGHTS + M3D_LOG("Generating weight cross-reference"); + for(i = 0; i < model->numvertex; i++) { + if(model->vertex[i].skinid < model->numskin) { + sk = &model->skin[model->vertex[i].skinid]; + w = (M3D_FLOAT)0.0; + for(j = 0; j < M3D_NUMBONE && sk->boneid[j] != M3D_UNDEF && sk->weight[j] > (M3D_FLOAT)0.0; j++) + w += sk->weight[j]; + for(j = 0; j < M3D_NUMBONE && sk->boneid[j] != M3D_UNDEF && sk->weight[j] > (M3D_FLOAT)0.0; j++) { + sk->weight[j] /= w; + b = &model->bone[sk->boneid[j]]; + k = b->numweight++; + b->weight = (m3dw_t*)M3D_REALLOC(b->weight, b->numweight * sizeof(m3da_t)); + if(!b->weight) goto memerr; + b->weight[k].vertexid = i; + b->weight[k].weight = sk->weight[j]; + } + } + } +#endif +#ifndef M3D_NOANIMATION + M3D_LOG("Calculating bone transformation matrices"); + for(i = 0; i < model->numbone; i++) { + b = &model->bone[i]; + if(model->bone[i].parent == M3D_UNDEF) { + _m3d_mat((M3D_FLOAT*)&b->mat4, &model->vertex[b->pos], &model->vertex[b->ori]); + } else { + _m3d_mat((M3D_FLOAT*)&r, &model->vertex[b->pos], &model->vertex[b->ori]); + _m3d_mul((M3D_FLOAT*)&b->mat4, (M3D_FLOAT*)&model->bone[b->parent].mat4, (M3D_FLOAT*)&r); + } + } + for(i = 0; i < model->numbone; i++) + _m3d_inv((M3D_FLOAT*)&model->bone[i].mat4); +#endif + } +#ifdef M3D_PROFILING + gettimeofday(&tv0, NULL); + tvd.tv_sec = tv0.tv_sec - tv1.tv_sec; + tvd.tv_usec = tv0.tv_usec - tv1.tv_usec; + if(tvd.tv_usec < 0) { tvd.tv_sec--; tvd.tv_usec += 1000000L; } + printf(" Post-process %ld.%06ld sec\n", tvd.tv_sec, tvd.tv_usec); +#endif + } + return model; +} + +/** + * Calculates skeletons for animation frames, returns a working copy (should be freed after use) + */ +m3dtr_t *m3d_frame(m3d_t *model, M3D_INDEX actionid, M3D_INDEX frameid, m3dtr_t *skeleton) +{ + unsigned int i; + M3D_INDEX s = frameid; + m3dfr_t *fr; + + if(!model || !model->numbone || !model->bone || (actionid != M3D_UNDEF && (!model->action || + actionid >= model->numaction || frameid >= model->action[actionid].numframe))) { + model->errcode = M3D_ERR_UNKFRAME; + return skeleton; + } + model->errcode = M3D_SUCCESS; + if(!skeleton) { + skeleton = (m3dtr_t*)M3D_MALLOC(model->numbone * sizeof(m3dtr_t)); + if(!skeleton) { + model->errcode = M3D_ERR_ALLOC; + return NULL; + } + goto gen; + } + if(actionid == M3D_UNDEF || !frameid) { +gen: s = 0; + for(i = 0; i < model->numbone; i++) { + skeleton[i].boneid = i; + skeleton[i].pos = model->bone[i].pos; + skeleton[i].ori = model->bone[i].ori; + } + } + if(actionid < model->numaction && (frameid || !model->action[actionid].frame[0].msec)) { + for(; s <= frameid; s++) { + fr = &model->action[actionid].frame[s]; + for(i = 0; i < fr->numtransform; i++) { + skeleton[fr->transform[i].boneid].pos = fr->transform[i].pos; + skeleton[fr->transform[i].boneid].ori = fr->transform[i].ori; + } + } + } + return skeleton; +} + +#ifndef M3D_NOANIMATION +/** + * Returns interpolated animation-pose, a working copy (should be freed after use) + */ +m3db_t *m3d_pose(m3d_t *model, M3D_INDEX actionid, uint32_t msec) +{ + unsigned int i, j, l; + M3D_FLOAT r[16], t, c, d, s; + m3db_t *ret; + m3dv_t *v, *p, *f; + m3dtr_t *tmp; + m3dfr_t *fr; + + if(!model || !model->numbone || !model->bone) { + model->errcode = M3D_ERR_UNKFRAME; + return NULL; + } + ret = (m3db_t*)M3D_MALLOC(model->numbone * sizeof(m3db_t)); + if(!ret) { + model->errcode = M3D_ERR_ALLOC; + return NULL; + } + memcpy(ret, model->bone, model->numbone * sizeof(m3db_t)); + for(i = 0; i < model->numbone; i++) + _m3d_inv((M3D_FLOAT*)&ret[i].mat4); + if(!model->action || actionid >= model->numaction) { + model->errcode = M3D_ERR_UNKFRAME; + return ret; + } + msec %= model->action[actionid].durationmsec; + model->errcode = M3D_SUCCESS; + fr = &model->action[actionid].frame[0]; + for(j = l = 0; j < model->action[actionid].numframe && model->action[actionid].frame[j].msec <= msec; j++) { + fr = &model->action[actionid].frame[j]; + l = fr->msec; + for(i = 0; i < fr->numtransform; i++) { + ret[fr->transform[i].boneid].pos = fr->transform[i].pos; + ret[fr->transform[i].boneid].ori = fr->transform[i].ori; + } + } + if(l != msec) { + model->vertex = (m3dv_t*)M3D_REALLOC(model->vertex, (model->numvertex + 2 * model->numbone) * sizeof(m3dv_t)); + if(!model->vertex) { + M3D_FREE(ret); + model->errcode = M3D_ERR_ALLOC; + return NULL; + } + tmp = (m3dtr_t*)M3D_MALLOC(model->numbone * sizeof(m3dtr_t)); + if(tmp) { + for(i = 0; i < model->numbone; i++) { + tmp[i].pos = ret[i].pos; + tmp[i].ori = ret[i].ori; + } + fr = &model->action[actionid].frame[j % model->action[actionid].numframe]; + t = l >= fr->msec ? (M3D_FLOAT)1.0 : (M3D_FLOAT)(msec - l) / (M3D_FLOAT)(fr->msec - l); + for(i = 0; i < fr->numtransform; i++) { + tmp[fr->transform[i].boneid].pos = fr->transform[i].pos; + tmp[fr->transform[i].boneid].ori = fr->transform[i].ori; + } + for(i = 0, j = model->numvertex; i < model->numbone; i++) { + /* interpolation of position */ + if(ret[i].pos != tmp[i].pos) { + p = &model->vertex[ret[i].pos]; + f = &model->vertex[tmp[i].pos]; + v = &model->vertex[j]; + v->x = p->x + t * (f->x - p->x); + v->y = p->y + t * (f->y - p->y); + v->z = p->z + t * (f->z - p->z); + ret[i].pos = j++; + } + /* interpolation of orientation */ + if(ret[i].ori != tmp[i].ori) { + p = &model->vertex[ret[i].ori]; + f = &model->vertex[tmp[i].ori]; + v = &model->vertex[j]; + d = p->w * f->w + p->x * f->x + p->y * f->y + p->z * f->z; + if(d < 0) { d = -d; s = (M3D_FLOAT)-1.0; } else s = (M3D_FLOAT)1.0; +#if 0 + /* don't use SLERP, requires two more variables, libm linkage and it is slow (but nice) */ + a = (M3D_FLOAT)1.0 - t; b = t; + if(d < (M3D_FLOAT)0.999999) { c = acosf(d); b = 1 / sinf(c); a = sinf(a * c) * b; b *= sinf(t * c) * s; } + v->x = p->x * a + f->x * b; + v->y = p->y * a + f->y * b; + v->z = p->z * a + f->z * b; + v->w = p->w * a + f->w * b; +#else + /* approximated NLERP, original approximation by Arseny Kapoulkine, heavily optimized by me */ + c = t - (M3D_FLOAT)0.5; t += t * c * (t - (M3D_FLOAT)1.0) * (((M3D_FLOAT)1.0904 + d * ((M3D_FLOAT)-3.2452 + + d * ((M3D_FLOAT)3.55645 - d * (M3D_FLOAT)1.43519))) * c * c + ((M3D_FLOAT)0.848013 + d * + ((M3D_FLOAT)-1.06021 + d * (M3D_FLOAT)0.215638))); + v->x = p->x + t * (s * f->x - p->x); + v->y = p->y + t * (s * f->y - p->y); + v->z = p->z + t * (s * f->z - p->z); + v->w = p->w + t * (s * f->w - p->w); + d = _m3d_rsq(v->w * v->w + v->x * v->x + v->y * v->y + v->z * v->z); + v->x *= d; v->y *= d; v->z *= d; v->w *= d; +#endif + ret[i].ori = j++; + } + } + M3D_FREE(tmp); + } + } + for(i = 0; i < model->numbone; i++) { + if(ret[i].parent == M3D_UNDEF) { + _m3d_mat((M3D_FLOAT*)&ret[i].mat4, &model->vertex[ret[i].pos], &model->vertex[ret[i].ori]); + } else { + _m3d_mat((M3D_FLOAT*)&r, &model->vertex[ret[i].pos], &model->vertex[ret[i].ori]); + _m3d_mul((M3D_FLOAT*)&ret[i].mat4, (M3D_FLOAT*)&ret[ret[i].parent].mat4, (M3D_FLOAT*)&r); + } + } + return ret; +} + +#endif /* M3D_NOANIMATION */ + +#endif /* M3D_IMPLEMENTATION */ + +#if !defined(M3D_NODUP) && (!defined(M3D_NOIMPORTER) || defined(M3D_EXPORTER)) +/** + * Free the in-memory model + */ +void m3d_free(m3d_t *model) +{ + unsigned int i, j; + + if(!model) return; +#ifdef M3D_ASCII + /* if model imported from ASCII, we have to free all strings as well */ + if(model->flags & M3D_FLG_FREESTR) { + if(model->name) M3D_FREE(model->name); + if(model->license) M3D_FREE(model->license); + if(model->author) M3D_FREE(model->author); + if(model->desc) M3D_FREE(model->desc); + if(model->bone) + for(i = 0; i < model->numbone; i++) + if(model->bone[i].name) + M3D_FREE(model->bone[i].name); + if(model->shape) + for(i = 0; i < model->numshape; i++) + if(model->shape[i].name) + M3D_FREE(model->shape[i].name); + if(model->numvoxtype) + for(i = 0; i < model->numvoxtype; i++) { + if(model->voxtype[i].name) + M3D_FREE(model->voxtype[i].name); + for(j = 0; j < model->voxtype[i].numitem; j++) + if(model->voxtype[i].item[j].name) + M3D_FREE(model->voxtype[i].item[j].name); + } + if(model->numvoxel) + for(i = 0; i < model->numvoxel; i++) + if(model->voxel[i].name) + M3D_FREE(model->voxel[i].name); + if(model->material) + for(i = 0; i < model->nummaterial; i++) + if(model->material[i].name) + M3D_FREE(model->material[i].name); + if(model->action) + for(i = 0; i < model->numaction; i++) + if(model->action[i].name) + M3D_FREE(model->action[i].name); + if(model->texture) + for(i = 0; i < model->numtexture; i++) + if(model->texture[i].name) + M3D_FREE(model->texture[i].name); + if(model->inlined) + for(i = 0; i < model->numinlined; i++) { + if(model->inlined[i].name) + M3D_FREE(model->inlined[i].name); + if(model->inlined[i].data) + M3D_FREE(model->inlined[i].data); + } + if(model->extra) + for(i = 0; i < model->numextra; i++) + if(model->extra[i]) + M3D_FREE(model->extra[i]); + if(model->label) + for(i = 0; i < model->numlabel; i++) { + if(model->label[i].name) { + for(j = i + 1; j < model->numlabel; j++) + if(model->label[j].name == model->label[i].name) + model->label[j].name = NULL; + M3D_FREE(model->label[i].name); + } + if(model->label[i].lang) { + for(j = i + 1; j < model->numlabel; j++) + if(model->label[j].lang == model->label[i].lang) + model->label[j].lang = NULL; + M3D_FREE(model->label[i].lang); + } + if(model->label[i].text) + M3D_FREE(model->label[i].text); + } + if(model->preview.data) + M3D_FREE(model->preview.data); + } +#endif + if(model->flags & M3D_FLG_FREERAW) M3D_FREE(model->raw); + + if(model->tmap) M3D_FREE(model->tmap); + if(model->bone) { + for(i = 0; i < model->numbone; i++) + if(model->bone[i].weight) + M3D_FREE(model->bone[i].weight); + M3D_FREE(model->bone); + } + if(model->skin) M3D_FREE(model->skin); + if(model->vertex) M3D_FREE(model->vertex); + if(model->face) M3D_FREE(model->face); + if(model->voxtype) { + for(i = 0; i < model->numvoxtype; i++) + if(model->voxtype[i].item) + M3D_FREE(model->voxtype[i].item); + M3D_FREE(model->voxtype); + } + if(model->voxel) { + for(i = 0; i < model->numvoxel; i++) + if(model->voxel[i].data) + M3D_FREE(model->voxel[i].data); + M3D_FREE(model->voxel); + } + if(model->shape) { + for(i = 0; i < model->numshape; i++) { + if(model->shape[i].cmd) { + for(j = 0; j < model->shape[i].numcmd; j++) + if(model->shape[i].cmd[j].arg) M3D_FREE(model->shape[i].cmd[j].arg); + M3D_FREE(model->shape[i].cmd); + } + } + M3D_FREE(model->shape); + } + if(model->material && !(model->flags & M3D_FLG_MTLLIB)) { + for(i = 0; i < model->nummaterial; i++) + if(model->material[i].prop) M3D_FREE(model->material[i].prop); + M3D_FREE(model->material); + } + if(model->texture) { + for(i = 0; i < model->numtexture; i++) + if(model->texture[i].d) M3D_FREE(model->texture[i].d); + M3D_FREE(model->texture); + } + if(model->action) { + for(i = 0; i < model->numaction; i++) { + if(model->action[i].frame) { + for(j = 0; j < model->action[i].numframe; j++) + if(model->action[i].frame[j].transform) M3D_FREE(model->action[i].frame[j].transform); + M3D_FREE(model->action[i].frame); + } + } + M3D_FREE(model->action); + } + if(model->label) M3D_FREE(model->label); + if(model->inlined) M3D_FREE(model->inlined); + if(model->extra) M3D_FREE(model->extra); + M3D_FREE(model); +} +#endif + +#ifdef M3D_EXPORTER +typedef struct { + char *str; + uint32_t offs; +} m3dstr_t; + +typedef struct { + m3dti_t data; + M3D_INDEX oldidx; + M3D_INDEX newidx; +} m3dtisave_t; + +typedef struct { + m3dv_t data; + M3D_INDEX oldidx; + M3D_INDEX newidx; + unsigned char norm; +} m3dvsave_t; + +typedef struct { + m3ds_t data; + M3D_INDEX oldidx; + M3D_INDEX newidx; +} m3dssave_t; + +typedef struct { + m3df_t data; + int group; + uint8_t opacity; +} m3dfsave_t; + +/* create unique list of strings */ +static m3dstr_t *_m3d_addstr(m3dstr_t *str, uint32_t *numstr, char *s) +{ + uint32_t i; + if(!s || !*s) return str; + if(str) { + for(i = 0; i < *numstr; i++) + if(str[i].str == s || !strcmp(str[i].str, s)) return str; + } + str = (m3dstr_t*)M3D_REALLOC(str, ((*numstr) + 1) * sizeof(m3dstr_t)); + str[*numstr].str = s; + str[*numstr].offs = 0; + (*numstr)++; + return str; +} + +/* add strings to header */ +m3dhdr_t *_m3d_addhdr(m3dhdr_t *h, m3dstr_t *s) +{ + int i; + char *safe = _m3d_safestr(s->str, 0); + i = (int)strlen(safe); + h = (m3dhdr_t*)M3D_REALLOC(h, h->length + i+1); + if(!h) { M3D_FREE(safe); return NULL; } + memcpy((uint8_t*)h + h->length, safe, i+1); + s->offs = h->length - 16; + h->length += i+1; + M3D_FREE(safe); + return h; +} + +/* return offset of string */ +static uint32_t _m3d_stridx(m3dstr_t *str, uint32_t numstr, char *s) +{ + uint32_t i; + char *safe; + if(!s || !*s) return 0; + if(str) { + safe = _m3d_safestr(s, 0); + if(!safe) return 0; + if(!*safe) { + M3D_FREE(safe); + return 0; + } + for(i = 0; i < numstr; i++) + if(!strcmp(str[i].str, s)) { + M3D_FREE(safe); + return str[i].offs; + } + M3D_FREE(safe); + } + return 0; +} + +/* compare to faces by their material */ +static int _m3d_facecmp(const void *a, const void *b) { + const m3dfsave_t *A = (const m3dfsave_t*)a, *B = (const m3dfsave_t*)b; + return A->group != B->group ? A->group - B->group : (A->opacity != B->opacity ? (int)B->opacity - (int)A->opacity : + (int)A->data.materialid - (int)B->data.materialid); +} +/* compare face groups */ +static int _m3d_grpcmp(const void *a, const void *b) { return *((uint32_t*)a) - *((uint32_t*)b); } +/* compare UVs */ +static int _m3d_ticmp(const void *a, const void *b) { return memcmp(a, b, sizeof(m3dti_t)); } +/* compare skin groups */ +static int _m3d_skincmp(const void *a, const void *b) { return memcmp(a, b, sizeof(m3ds_t)); } +/* compare vertices */ +static int _m3d_vrtxcmp(const void *a, const void *b) { + int c = memcmp(a, b, 3 * sizeof(M3D_FLOAT)); + if(c) return c; + c = ((m3dvsave_t*)a)->norm - ((m3dvsave_t*)b)->norm; + if(c) return c; + return memcmp(a, b, sizeof(m3dv_t)); +} +/* compare labels */ +static _inline int _m3d_strcmp(char *a, char *b) +{ + if(a == NULL && b != NULL) return -1; + if(a != NULL && b == NULL) return 1; + if(a == NULL && b == NULL) return 0; + return strcmp(a, b); +} +static int _m3d_lblcmp(const void *a, const void *b) { + const m3dl_t *A = (const m3dl_t*)a, *B = (const m3dl_t*)b; + int c = _m3d_strcmp(A->lang, B->lang); + if(!c) c = _m3d_strcmp(A->name, B->name); + if(!c) c = _m3d_strcmp(A->text, B->text); + return c; +} +/* compare two colors by HSV value */ +_inline static int _m3d_cmapcmp(const void *a, const void *b) +{ + uint8_t *A = (uint8_t*)a, *B = (uint8_t*)b; + _register int m, vA, vB; + /* get HSV value for A */ + m = A[2] < A[1]? A[2] : A[1]; if(A[0] < m) m = A[0]; + vA = A[2] > A[1]? A[2] : A[1]; if(A[0] > vA) vA = A[0]; + /* get HSV value for B */ + m = B[2] < B[1]? B[2] : B[1]; if(B[0] < m) m = B[0]; + vB = B[2] > B[1]? B[2] : B[1]; if(B[0] > vB) vB = B[0]; + return vA - vB; +} + +/* create sorted list of colors */ +static uint32_t *_m3d_addcmap(uint32_t *cmap, uint32_t *numcmap, uint32_t color) +{ + uint32_t i; + if(cmap) { + for(i = 0; i < *numcmap; i++) + if(cmap[i] == color) return cmap; + } + cmap = (uint32_t*)M3D_REALLOC(cmap, ((*numcmap) + 1) * sizeof(uint32_t)); + for(i = 0; i < *numcmap && _m3d_cmapcmp(&color, &cmap[i]) > 0; i++); + if(i < *numcmap) memmove(&cmap[i+1], &cmap[i], ((*numcmap) - i)*sizeof(uint32_t)); + cmap[i] = color; + (*numcmap)++; + return cmap; +} + +/* look up a color and return its index */ +static uint32_t _m3d_cmapidx(uint32_t *cmap, uint32_t numcmap, uint32_t color) +{ + uint32_t i; + if(numcmap >= 65536) + return color; + for(i = 0; i < numcmap; i++) + if(cmap[i] == color) return i; + return 0; +} + +/* add index to output */ +static unsigned char *_m3d_addidx(unsigned char *out, char type, uint32_t idx) { + switch(type) { + case 1: *out++ = (uint8_t)(idx); break; + case 2: *((uint16_t*)out) = (uint16_t)(idx); out += 2; break; + case 4: *((uint32_t*)out) = (uint32_t)(idx); out += 4; break; + /* case 0: case 8: break; */ + } + return out; +} + +/* round a vertex position */ +static void _m3d_round(int quality, m3dv_t *src, m3dv_t *dst) +{ + _register int t; + /* copy additional attributes */ + if(src != dst) memcpy(dst, src, sizeof(m3dv_t)); + /* round according to quality */ + switch(quality) { + case M3D_EXP_INT8: + t = (int)(src->x * 127 + (src->x >= 0 ? (M3D_FLOAT)0.5 : (M3D_FLOAT)-0.5)); dst->x = (M3D_FLOAT)t / (M3D_FLOAT)127.0; + t = (int)(src->y * 127 + (src->y >= 0 ? (M3D_FLOAT)0.5 : (M3D_FLOAT)-0.5)); dst->y = (M3D_FLOAT)t / (M3D_FLOAT)127.0; + t = (int)(src->z * 127 + (src->z >= 0 ? (M3D_FLOAT)0.5 : (M3D_FLOAT)-0.5)); dst->z = (M3D_FLOAT)t / (M3D_FLOAT)127.0; + t = (int)(src->w * 127 + (src->w >= 0 ? (M3D_FLOAT)0.5 : (M3D_FLOAT)-0.5)); dst->w = (M3D_FLOAT)t / (M3D_FLOAT)127.0; + break; + case M3D_EXP_INT16: + t = (int)(src->x * 32767 + (src->x >= 0 ? (M3D_FLOAT)0.5 : (M3D_FLOAT)-0.5)); dst->x = (M3D_FLOAT)t / (M3D_FLOAT)32767.0; + t = (int)(src->y * 32767 + (src->y >= 0 ? (M3D_FLOAT)0.5 : (M3D_FLOAT)-0.5)); dst->y = (M3D_FLOAT)t / (M3D_FLOAT)32767.0; + t = (int)(src->z * 32767 + (src->z >= 0 ? (M3D_FLOAT)0.5 : (M3D_FLOAT)-0.5)); dst->z = (M3D_FLOAT)t / (M3D_FLOAT)32767.0; + t = (int)(src->w * 32767 + (src->w >= 0 ? (M3D_FLOAT)0.5 : (M3D_FLOAT)-0.5)); dst->w = (M3D_FLOAT)t / (M3D_FLOAT)32767.0; + break; + } + if(dst->x == (M3D_FLOAT)-0.0) dst->x = (M3D_FLOAT)0.0; + if(dst->y == (M3D_FLOAT)-0.0) dst->y = (M3D_FLOAT)0.0; + if(dst->z == (M3D_FLOAT)-0.0) dst->z = (M3D_FLOAT)0.0; + if(dst->w == (M3D_FLOAT)-0.0) dst->w = (M3D_FLOAT)0.0; +} + +#ifdef M3D_ASCII +/* add a bone to ascii output */ +static char *_m3d_prtbone(char *ptr, m3db_t *bone, M3D_INDEX numbone, M3D_INDEX parent, uint32_t level, M3D_INDEX *vrtxidx) +{ + uint32_t i, j; + char *sn; + + if(level > M3D_BONEMAXLEVEL || !bone) return ptr; + for(i = 0; i < numbone; i++) { + if(bone[i].parent == parent) { + for(j = 0; j < level; j++) *ptr++ = '/'; + sn = _m3d_safestr(bone[i].name, 0); + ptr += sprintf(ptr, "%d %d %s\r\n", vrtxidx[bone[i].pos], vrtxidx[bone[i].ori], sn); + M3D_FREE(sn); + ptr = _m3d_prtbone(ptr, bone, numbone, i, level + 1, vrtxidx); + } + } + return ptr; +} +#endif + +/** + * Function to encode an in-memory model into on storage Model 3D format + */ +unsigned char *m3d_save(m3d_t *model, int quality, int flags, unsigned int *size) +{ +#ifdef M3D_ASCII + const char *ol; + char *ptr; +#endif + char vc_s, vi_s, si_s, ci_s, ti_s, bi_s, nb_s, sk_s, fc_s, hi_s, fi_s, vd_s, vp_s; + char *sn = NULL, *sl = NULL, *sa = NULL, *sd = NULL; + unsigned char *out = NULL, *z = NULL, weights[M3D_NUMBONE < 8 ? 8 : M3D_NUMBONE], *norm = NULL; + unsigned int i, j, k, l, n, o, len, chunklen, *length; + int maxvox = 0, minvox = 0; + M3D_FLOAT scale = (M3D_FLOAT)0.0, min_x, max_x, min_y, max_y, min_z, max_z, mw; + M3D_INDEX last, *vrtxidx = NULL, *mtrlidx = NULL, *tmapidx = NULL, *skinidx = NULL; +#ifdef M3D_VERTEXMAX + M3D_INDEX lastp; +#endif + uint32_t idx, numcmap = 0, *cmap = NULL, numvrtx = 0, maxvrtx = 0, numtmap = 0, maxtmap = 0, numproc = 0; + uint32_t numskin = 0, maxskin = 0, numstr = 0, maxt = 0, maxbone = 0, numgrp = 0, maxgrp = 0, *grpidx = NULL; + uint8_t *opa = NULL; + m3dcd_t *cd; + m3dc_t *cmd; + m3dstr_t *str = NULL; + m3dvsave_t *vrtx = NULL, vertex; + m3dtisave_t *tmap = NULL, tcoord; + m3dssave_t *skin = NULL, sk; + m3dfsave_t *face = NULL; + m3dhdr_t *h = NULL; + m3dm_t *m; + m3da_t *a; + + if(!model) { + if(size) *size = 0; + return NULL; + } + model->errcode = M3D_SUCCESS; +#ifdef M3D_ASCII + if(flags & M3D_EXP_ASCII) quality = M3D_EXP_DOUBLE; +#endif + vrtxidx = (M3D_INDEX*)M3D_MALLOC(model->numvertex * sizeof(M3D_INDEX)); + if(!vrtxidx) goto memerr; + memset(vrtxidx, 255, model->numvertex * sizeof(M3D_INDEX)); + if(model->numvertex && !(flags & M3D_EXP_NONORMAL)){ + norm = (unsigned char*)M3D_MALLOC(model->numvertex * sizeof(unsigned char)); + if(!norm) goto memerr; + memset(norm, 0, model->numvertex * sizeof(unsigned char)); + } + if(model->nummaterial && !(flags & M3D_EXP_NOMATERIAL)) { + mtrlidx = (M3D_INDEX*)M3D_MALLOC(model->nummaterial * sizeof(M3D_INDEX)); + if(!mtrlidx) goto memerr; + memset(mtrlidx, 255, model->nummaterial * sizeof(M3D_INDEX)); + opa = (uint8_t*)M3D_MALLOC(model->nummaterial * 2 * sizeof(M3D_INDEX)); + if(!opa) goto memerr; + memset(opa, 255, model->nummaterial * 2 * sizeof(M3D_INDEX)); + } + if(model->numtmap && !(flags & M3D_EXP_NOTXTCRD)) { + tmapidx = (M3D_INDEX*)M3D_MALLOC(model->numtmap * sizeof(M3D_INDEX)); + if(!tmapidx) goto memerr; + memset(tmapidx, 255, model->numtmap * sizeof(M3D_INDEX)); + } + /** collect array elements that are actually referenced **/ + if(!(flags & M3D_EXP_NOFACE)) { + /* face */ + if(model->numface && model->face) { + M3D_LOG("Processing mesh face"); + face = (m3dfsave_t*)M3D_MALLOC(model->numface * sizeof(m3dfsave_t)); + if(!face) goto memerr; + for(i = 0; i < model->numface; i++) { + memcpy(&face[i].data, &model->face[i], sizeof(m3df_t)); + face[i].group = 0; + face[i].opacity = 255; + if(!(flags & M3D_EXP_NOMATERIAL) && model->face[i].materialid < model->nummaterial) { + if(model->material[model->face[i].materialid].numprop) { + mtrlidx[model->face[i].materialid] = 0; + if(opa[model->face[i].materialid * 2]) { + m = &model->material[model->face[i].materialid]; + for(j = 0; j < m->numprop; j++) + if(m->prop[j].type == m3dp_Kd) { + opa[model->face[i].materialid * 2 + 1] = ((uint8_t*)&m->prop[j].value.color)[3]; + break; + } + for(j = 0; j < m->numprop; j++) + if(m->prop[j].type == m3dp_d) { + opa[model->face[i].materialid * 2 + 1] = (uint8_t)(m->prop[j].value.fnum * 255); + break; + } + opa[model->face[i].materialid * 2] = 0; + } + face[i].opacity = opa[model->face[i].materialid * 2 + 1]; + } else + face[i].data.materialid = M3D_UNDEF; + } + for(j = 0; j < 3; j++) { + k = model->face[i].vertex[j]; + if(k < model->numvertex) + vrtxidx[k] = 0; + if(!(flags & M3D_EXP_NOCMAP)) { + cmap = _m3d_addcmap(cmap, &numcmap, model->vertex[k].color); + if(!cmap) goto memerr; + } + k = model->face[i].normal[j]; + if(k < model->numvertex && !(flags & M3D_EXP_NONORMAL)) { + vrtxidx[k] = 0; + norm[k] = 1; + } + k = model->face[i].texcoord[j]; + if(k < model->numtmap && !(flags & M3D_EXP_NOTXTCRD)) + tmapidx[k] = 0; +#ifdef M3D_VERTEXMAX + k = model->face[i].vertmax[j]; + if(k < model->numvertex && !(flags & M3D_EXP_NOVRTMAX)) + vrtxidx[k] = 0; +#endif + } + /* convert from CW to CCW */ + if(flags & M3D_EXP_IDOSUCK) { + j = face[i].data.vertex[1]; + face[i].data.vertex[1] = face[i].data.vertex[2]; + face[i].data.vertex[2] = j; + j = face[i].data.normal[1]; + face[i].data.normal[1] = face[i].data.normal[2]; + face[i].data.normal[2] = j; + j = face[i].data.texcoord[1]; + face[i].data.texcoord[1] = face[i].data.texcoord[2]; + face[i].data.texcoord[2] = j; +#ifdef M3D_VERTEXMAX + j = face[i].data.vertmax[1]; + face[i].data.vertmax[1] = face[i].data.vertmax[2]; + face[i].data.vertmax[2] = j; +#endif + } + } + } + if((model->numvoxtype && model->voxtype) || (model->numvoxel && model->voxel)) { + M3D_LOG("Processing voxel face"); + for(i = 0; i < model->numvoxtype; i++) { + str = _m3d_addstr(str, &numstr, model->voxtype[i].name); + if(model->voxtype[i].name && !str) goto memerr; + if(!(flags & M3D_EXP_NOCMAP)) { + cmap = _m3d_addcmap(cmap, &numcmap, model->voxtype[i].color); + if(!cmap) goto memerr; + } + for(j = 0; j < model->voxtype[i].numitem; j++) { + str = _m3d_addstr(str, &numstr, model->voxtype[i].item[j].name); + if(model->voxtype[i].item[j].name && !str) goto memerr; + } + } + for(i = 0; i < model->numvoxel; i++) { + str = _m3d_addstr(str, &numstr, model->voxel[i].name); + if(model->voxel[i].name && !str) goto memerr; + if(model->voxel[i].x < minvox) minvox = model->voxel[i].x; + if(model->voxel[i].x + (int)model->voxel[i].w > maxvox) maxvox = model->voxel[i].x + model->voxel[i].w; + if(model->voxel[i].y < minvox) minvox = model->voxel[i].y; + if(model->voxel[i].y + (int)model->voxel[i].h > maxvox) maxvox = model->voxel[i].y + model->voxel[i].h; + if(model->voxel[i].z < minvox) minvox = model->voxel[i].z; + if(model->voxel[i].z + (int)model->voxel[i].d > maxvox) maxvox = model->voxel[i].z + model->voxel[i].d; + } + } + if(model->numshape && model->shape) { + M3D_LOG("Processing shape face"); + for(i = 0; i < model->numshape; i++) { + if(!model->shape[i].numcmd) continue; + str = _m3d_addstr(str, &numstr, model->shape[i].name); + if(model->shape[i].name && !str) goto memerr; + for(j = 0; j < model->shape[i].numcmd; j++) { + cmd = &model->shape[i].cmd[j]; + if(cmd->type >= (unsigned int)(sizeof(m3d_commandtypes)/sizeof(m3d_commandtypes[0])) || !cmd->arg) + continue; + if(cmd->type == m3dc_mesh) { + if(numgrp + 2 < maxgrp) { + maxgrp += 1024; + grpidx = (uint32_t*)M3D_REALLOC(grpidx, maxgrp * sizeof(uint32_t)); + if(!grpidx) goto memerr; + if(!numgrp) { + grpidx[0] = 0; + grpidx[1] = model->numface; + numgrp += 2; + } + } + grpidx[numgrp + 0] = cmd->arg[0]; + grpidx[numgrp + 1] = cmd->arg[0] + cmd->arg[1]; + numgrp += 2; + } + cd = &m3d_commandtypes[cmd->type]; + for(k = n = 0, l = cd->p; k < l; k++) + switch(cd->a[((k - n) % (cd->p - n)) + n]) { + case m3dcp_mi_t: + if(!(flags & M3D_EXP_NOMATERIAL) && cmd->arg[k] < model->nummaterial) + mtrlidx[cmd->arg[k]] = 0; + break; + case m3dcp_ti_t: + if(!(flags & M3D_EXP_NOTXTCRD) && cmd->arg[k] < model->numtmap) + tmapidx[cmd->arg[k]] = 0; + break; + case m3dcp_qi_t: + case m3dcp_vi_t: + if(cmd->arg[k] < model->numvertex) + vrtxidx[cmd->arg[k]] = 0; + break; + case m3dcp_va_t: + n = k + 1; l += (cmd->arg[k] - 1) * (cd->p - k - 1); + break; + } + } + } + } + if(model->numface && face) { + if(numgrp && grpidx) { + qsort(grpidx, numgrp, sizeof(uint32_t), _m3d_grpcmp); + for(i = j = 0; i < model->numface && j < numgrp; i++) { + while(j < numgrp && grpidx[j] < i) j++; + face[i].group = j; + } + } + qsort(face, model->numface, sizeof(m3dfsave_t), _m3d_facecmp); + } + if(grpidx) { M3D_FREE(grpidx); grpidx = NULL; } + if(model->numlabel && model->label) { + M3D_LOG("Processing annotation labels"); + for(i = 0; i < model->numlabel; i++) { + str = _m3d_addstr(str, &numstr, model->label[i].name); + str = _m3d_addstr(str, &numstr, model->label[i].lang); + str = _m3d_addstr(str, &numstr, model->label[i].text); + if(!(flags & M3D_EXP_NOCMAP)) { + cmap = _m3d_addcmap(cmap, &numcmap, model->label[i].color); + if(!cmap) goto memerr; + } + if(model->label[i].vertexid < model->numvertex) + vrtxidx[model->label[i].vertexid] = 0; + } + qsort(model->label, model->numlabel, sizeof(m3dl_t), _m3d_lblcmp); + } + } else if(!(flags & M3D_EXP_NOMATERIAL)) { + /* without a face, simply add all materials, because it can be an mtllib */ + for(i = 0; i < model->nummaterial; i++) + mtrlidx[i] = i; + } + /* bind-pose skeleton */ + if(model->numbone && model->bone && !(flags & M3D_EXP_NOBONE)) { + M3D_LOG("Processing bones"); + for(i = 0; i < model->numbone; i++) { + str = _m3d_addstr(str, &numstr, model->bone[i].name); + if(!str) goto memerr; + k = model->bone[i].pos; + if(k < model->numvertex) + vrtxidx[k] = 0; + k = model->bone[i].ori; + if(k < model->numvertex) + vrtxidx[k] = 0; + } + } + /* actions, animated skeleton poses */ + if(model->numaction && model->action && !(flags & M3D_EXP_NOACTION)) { + M3D_LOG("Processing action list"); + for(j = 0; j < model->numaction; j++) { + a = &model->action[j]; + str = _m3d_addstr(str, &numstr, a->name); + if(!str) goto memerr; + if(a->numframe > 65535) a->numframe = 65535; + for(i = 0; i < a->numframe; i++) { + for(l = 0; l < a->frame[i].numtransform; l++) { + k = a->frame[i].transform[l].pos; + if(k < model->numvertex) + vrtxidx[k] = 0; + k = a->frame[i].transform[l].ori; + if(k < model->numvertex) + vrtxidx[k] = 0; + } + if(l > maxt) maxt = l; + } + } + } + /* add colors to color map and texture names to string table */ + if(!(flags & M3D_EXP_NOMATERIAL)) { + M3D_LOG("Processing materials"); + for(i = k = 0; i < model->nummaterial; i++) { + if(mtrlidx[i] == M3D_UNDEF || !model->material[i].numprop) continue; + mtrlidx[i] = k++; + m = &model->material[i]; + str = _m3d_addstr(str, &numstr, m->name); + if(!str) goto memerr; + if(m->prop) + for(j = 0; j < m->numprop; j++) { + if(!(flags & M3D_EXP_NOCMAP) && m->prop[j].type < 128) { + for(l = 0; l < sizeof(m3d_propertytypes)/sizeof(m3d_propertytypes[0]); l++) { + if(m->prop[j].type == m3d_propertytypes[l].id && m3d_propertytypes[l].format == m3dpf_color) { + ((uint8_t*)&m->prop[j].value.color)[3] = opa[i * 2 + 1]; + cmap = _m3d_addcmap(cmap, &numcmap, m->prop[j].value.color); + if(!cmap) goto memerr; + break; + } + } + } + if(m->prop[j].type >= 128 && m->prop[j].value.textureid < model->numtexture && + model->texture[m->prop[j].value.textureid].name) { + str = _m3d_addstr(str, &numstr, model->texture[m->prop[j].value.textureid].name); + if(!str) goto memerr; + } + } + } + } + /* if there's only one black color, don't store it */ + if(numcmap == 1 && cmap && !cmap[0]) numcmap = 0; + + /** compress lists **/ + if(model->numtmap && !(flags & M3D_EXP_NOTXTCRD)) { + M3D_LOG("Compressing tmap"); + tmap = (m3dtisave_t*)M3D_MALLOC(model->numtmap * sizeof(m3dtisave_t)); + if(!tmap) goto memerr; + for(i = 0; i < model->numtmap; i++) { + if(tmapidx[i] == M3D_UNDEF) continue; + switch(quality) { + case M3D_EXP_INT8: + l = (unsigned int)(model->tmap[i].u * 255); tcoord.data.u = (M3D_FLOAT)l / (M3D_FLOAT)255.0; + l = (unsigned int)(model->tmap[i].v * 255); tcoord.data.v = (M3D_FLOAT)l / (M3D_FLOAT)255.0; + break; + case M3D_EXP_INT16: + l = (unsigned int)(model->tmap[i].u * 65535); tcoord.data.u = (M3D_FLOAT)l / (M3D_FLOAT)65535.0; + l = (unsigned int)(model->tmap[i].v * 65535); tcoord.data.v = (M3D_FLOAT)l / (M3D_FLOAT)65535.0; + break; + default: + tcoord.data.u = model->tmap[i].u; + tcoord.data.v = model->tmap[i].v; + break; + } + if(flags & M3D_EXP_FLIPTXTCRD) + tcoord.data.v = (M3D_FLOAT)1.0 - tcoord.data.v; + tcoord.oldidx = i; + memcpy(&tmap[numtmap++], &tcoord, sizeof(m3dtisave_t)); + } + if(numtmap) { + qsort(tmap, numtmap, sizeof(m3dtisave_t), _m3d_ticmp); + memcpy(&tcoord.data, &tmap[0], sizeof(m3dti_t)); + for(i = 0; i < numtmap; i++) { + if(memcmp(&tcoord.data, &tmap[i].data, sizeof(m3dti_t))) { + memcpy(&tcoord.data, &tmap[i].data, sizeof(m3dti_t)); + maxtmap++; + } + tmap[i].newidx = maxtmap; + tmapidx[tmap[i].oldidx] = maxtmap; + } + maxtmap++; + } + } + if(model->numskin && model->skin && !(flags & M3D_EXP_NOBONE)) { + M3D_LOG("Compressing skin"); + skinidx = (M3D_INDEX*)M3D_MALLOC(model->numskin * sizeof(M3D_INDEX)); + if(!skinidx) goto memerr; + skin = (m3dssave_t*)M3D_MALLOC(model->numskin * sizeof(m3dssave_t)); + if(!skin) goto memerr; + memset(skinidx, 255, model->numskin * sizeof(M3D_INDEX)); + for(i = 0; i < model->numvertex; i++) { + if(vrtxidx[i] != M3D_UNDEF && model->vertex[i].skinid < model->numskin) + skinidx[model->vertex[i].skinid] = 0; + } + for(i = 0; i < model->numskin; i++) { + if(skinidx[i] == M3D_UNDEF) continue; + memset(&sk, 0, sizeof(m3dssave_t)); + for(j = 0, min_x = (M3D_FLOAT)0.0; j < M3D_NUMBONE && model->skin[i].boneid[j] != M3D_UNDEF; j++) { + sk.data.boneid[j] = model->skin[i].boneid[j]; + sk.data.weight[j] = model->skin[i].weight[j] > (M3D_FLOAT)0.0 ? model->skin[i].weight[j] : (M3D_FLOAT)0.01; + min_x += sk.data.weight[j]; + } + if(j > maxbone) maxbone = j; + if(min_x != (M3D_FLOAT)1.0 && min_x != (M3D_FLOAT)0.0) + for(j = 0; j < M3D_NUMBONE && sk.data.weight[j] > (M3D_FLOAT)0.0; j++) + sk.data.weight[j] /= min_x; + sk.oldidx = i; + memcpy(&skin[numskin++], &sk, sizeof(m3dssave_t)); + } + if(numskin) { + qsort(skin, numskin, sizeof(m3dssave_t), _m3d_skincmp); + memcpy(&sk.data, &skin[0].data, sizeof(m3ds_t)); + for(i = 0; i < numskin; i++) { + if(memcmp(&sk.data, &skin[i].data, sizeof(m3ds_t))) { + memcpy(&sk.data, &skin[i].data, sizeof(m3ds_t)); + maxskin++; + } + skin[i].newidx = maxskin; + skinidx[skin[i].oldidx] = maxskin; + } + maxskin++; + } + } + + M3D_LOG("Compressing vertex list"); + min_x = min_y = min_z = (M3D_FLOAT)1e10; + max_x = max_y = max_z = (M3D_FLOAT)-1e10; + if(vrtxidx) { + vrtx = (m3dvsave_t*)M3D_MALLOC(model->numvertex * sizeof(m3dvsave_t)); + if(!vrtx) goto memerr; + for(i = numvrtx = 0; i < model->numvertex; i++) { + if(vrtxidx[i] == M3D_UNDEF) continue; + _m3d_round(quality, &model->vertex[i], &vertex.data); + vertex.norm = norm ? norm[i] : 0; + if(vertex.data.skinid != M3D_INDEXMAX && !vertex.norm) { + vertex.data.skinid = vertex.data.skinid != M3D_UNDEF && skinidx ? skinidx[vertex.data.skinid] : M3D_UNDEF; + if(vertex.data.x > max_x) max_x = vertex.data.x; + if(vertex.data.x < min_x) min_x = vertex.data.x; + if(vertex.data.y > max_y) max_y = vertex.data.y; + if(vertex.data.y < min_y) min_y = vertex.data.y; + if(vertex.data.z > max_z) max_z = vertex.data.z; + if(vertex.data.z < min_z) min_z = vertex.data.z; + } +#ifdef M3D_VERTEXTYPE + vertex.data.type = 0; +#endif + vertex.oldidx = i; + memcpy(&vrtx[numvrtx++], &vertex, sizeof(m3dvsave_t)); + } + if(numvrtx) { + qsort(vrtx, numvrtx, sizeof(m3dvsave_t), _m3d_vrtxcmp); + memcpy(&vertex.data, &vrtx[0].data, sizeof(m3dv_t)); + for(i = 0; i < numvrtx; i++) { + if(memcmp(&vertex.data, &vrtx[i].data, vrtx[i].norm ? 3 * sizeof(M3D_FLOAT) : sizeof(m3dv_t))) { + memcpy(&vertex.data, &vrtx[i].data, sizeof(m3dv_t)); + maxvrtx++; + } + vrtx[i].newidx = maxvrtx; + vrtxidx[vrtx[i].oldidx] = maxvrtx; + } + maxvrtx++; + } + } + if(norm) { M3D_FREE(norm); norm = NULL; } + + /* normalize to bounding cube */ + if(numvrtx && !(flags & M3D_EXP_NORECALC)) { + M3D_LOG("Normalizing coordinates"); + if(min_x < (M3D_FLOAT)0.0) min_x = -min_x; + if(max_x < (M3D_FLOAT)0.0) max_x = -max_x; + if(min_y < (M3D_FLOAT)0.0) min_y = -min_y; + if(max_y < (M3D_FLOAT)0.0) max_y = -max_y; + if(min_z < (M3D_FLOAT)0.0) min_z = -min_z; + if(max_z < (M3D_FLOAT)0.0) max_z = -max_z; + scale = min_x; + if(max_x > scale) scale = max_x; + if(min_y > scale) scale = min_y; + if(max_y > scale) scale = max_y; + if(min_z > scale) scale = min_z; + if(max_z > scale) scale = max_z; + if(scale <= (M3D_FLOAT)0.0) scale = (M3D_FLOAT)1.0; + if(scale != (M3D_FLOAT)1.0) { + for(i = 0; i < numvrtx; i++) { + if(vrtx[i].data.skinid == M3D_INDEXMAX) continue; + vrtx[i].data.x /= scale; + vrtx[i].data.y /= scale; + vrtx[i].data.z /= scale; + } + } + } + if(model->scale > (M3D_FLOAT)0.0) scale = model->scale; + if(scale <= (M3D_FLOAT)0.0) scale = (M3D_FLOAT)1.0; + + /* meta info */ + sn = _m3d_safestr(model->name && *model->name ? model->name : (char*)"(noname)", 2); + sl = _m3d_safestr(model->license ? model->license : (char*)"MIT", 2); + sa = _m3d_safestr(model->author ? model->author : getenv("LOGNAME"), 2); + if(!sn || !sl || !sa) { +memerr: if(vrtxidx) M3D_FREE(vrtxidx); + if(mtrlidx) M3D_FREE(mtrlidx); + if(tmapidx) M3D_FREE(tmapidx); + if(skinidx) M3D_FREE(skinidx); + if(grpidx) M3D_FREE(grpidx); + if(norm) M3D_FREE(norm); + if(face) M3D_FREE(face); + if(cmap) M3D_FREE(cmap); + if(tmap) M3D_FREE(tmap); + if(skin) M3D_FREE(skin); + if(str) M3D_FREE(str); + if(vrtx) M3D_FREE(vrtx); + if(sn) M3D_FREE(sn); + if(sl) M3D_FREE(sl); + if(sa) M3D_FREE(sa); + if(sd) M3D_FREE(sd); + if(out) M3D_FREE(out); + if(opa) M3D_FREE(opa); + if(h) M3D_FREE(h); + M3D_LOG("Out of memory"); + model->errcode = M3D_ERR_ALLOC; + return NULL; + } + + M3D_LOG("Serializing model"); +#ifdef M3D_ASCII + if(flags & M3D_EXP_ASCII) { + /* use CRLF to make model creators on Win happy... */ + sd = _m3d_safestr(model->desc, 1); + if(!sd) goto memerr; + ol = setlocale(LC_NUMERIC, NULL); + setlocale(LC_NUMERIC, "C"); + /* header */ + len = 64 + (unsigned int)(strlen(sn) + strlen(sl) + strlen(sa) + strlen(sd)); + out = (unsigned char*)M3D_MALLOC(len); + if(!out) { setlocale(LC_NUMERIC, ol); goto memerr; } + ptr = (char*)out; + ptr += sprintf(ptr, "3dmodel %g\r\n%s\r\n%s\r\n%s\r\n%s\r\n\r\n", scale, + sn, sl, sa, sd); + M3D_FREE(sl); M3D_FREE(sa); M3D_FREE(sd); + sl = sa = sd = NULL; + /* preview chunk */ + if(model->preview.data && model->preview.length) { + sl = _m3d_safestr(sn, 0); + if(sl) { +/* gcc thinks that "ptr is used after free", well, gcc is simply wrong. */ +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wuse-after-free" +#endif + ptr -= (uintptr_t)out; len = (unsigned int)((uintptr_t)ptr + (uintptr_t)20 + strlen(sl)); + out = (unsigned char*)M3D_REALLOC(out, len); ptr += (uintptr_t)out; +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + if(!out) { setlocale(LC_NUMERIC, ol); goto memerr; } + ptr += sprintf(ptr, "Preview\r\n%s.png\r\n\r\n", sl); + M3D_FREE(sl); sl = NULL; + } + } + M3D_FREE(sn); sn = NULL; + /* texture map */ + if(numtmap && tmap && !(flags & M3D_EXP_NOTXTCRD) && !(flags & M3D_EXP_NOFACE)) { +/* interestingly gcc does not complain about "ptr is used after free" here, although the code is 100% the same */ + ptr -= (uintptr_t)out; len = (unsigned int)((uintptr_t)ptr + (uintptr_t)(maxtmap * 32) + (uintptr_t)12); + out = (unsigned char*)M3D_REALLOC(out, len); ptr += (uintptr_t)out; + if(!out) { setlocale(LC_NUMERIC, ol); goto memerr; } + ptr += sprintf(ptr, "Textmap\r\n"); + last = M3D_UNDEF; + for(i = 0; i < numtmap; i++) { + if(tmap[i].newidx == last) continue; + last = tmap[i].newidx; + ptr += sprintf(ptr, "%g %g\r\n", tmap[i].data.u, tmap[i].data.v); + } + ptr += sprintf(ptr, "\r\n"); + } + /* vertex chunk */ + if(numvrtx && vrtx && !(flags & M3D_EXP_NOFACE)) { + ptr -= (uintptr_t)out; len = (unsigned int)((uintptr_t)ptr + (uintptr_t)(maxvrtx * 128) + (uintptr_t)10); + out = (unsigned char*)M3D_REALLOC(out, len); ptr += (uintptr_t)out; + if(!out) { setlocale(LC_NUMERIC, ol); goto memerr; } + ptr += sprintf(ptr, "Vertex\r\n"); + last = M3D_UNDEF; + for(i = 0; i < numvrtx; i++) { + if(vrtx[i].newidx == last) continue; + last = vrtx[i].newidx; + ptr += sprintf(ptr, "%g %g %g %g", vrtx[i].data.x, vrtx[i].data.y, vrtx[i].data.z, vrtx[i].data.w); + if(!(flags & M3D_EXP_NOCMAP) && vrtx[i].data.color) + ptr += sprintf(ptr, " #%08x", vrtx[i].data.color); + if(!(flags & M3D_EXP_NOBONE) && model->numbone && maxskin && vrtx[i].data.skinid < M3D_INDEXMAX) { + if(skin[vrtx[i].data.skinid].data.weight[0] == (M3D_FLOAT)1.0) + ptr += sprintf(ptr, " %d", skin[vrtx[i].data.skinid].data.boneid[0]); + else + for(j = 0; j < M3D_NUMBONE && skin[vrtx[i].data.skinid].data.boneid[j] != M3D_UNDEF && + skin[vrtx[i].data.skinid].data.weight[j] > (M3D_FLOAT)0.0; j++) + ptr += sprintf(ptr, " %d:%g", skin[vrtx[i].data.skinid].data.boneid[j], + skin[vrtx[i].data.skinid].data.weight[j]); + } + ptr += sprintf(ptr, "\r\n"); + } + ptr += sprintf(ptr, "\r\n"); + } + /* bones chunk */ + if(model->numbone && model->bone && !(flags & M3D_EXP_NOBONE)) { + ptr -= (uintptr_t)out; len = (unsigned int)((uintptr_t)ptr + (uintptr_t)9); + for(i = 0; i < model->numbone; i++) { + len += (unsigned int)strlen(model->bone[i].name) + 128; + } + out = (unsigned char*)M3D_REALLOC(out, len); ptr += (uintptr_t)out; + if(!out) { setlocale(LC_NUMERIC, ol); goto memerr; } + ptr += sprintf(ptr, "Bones\r\n"); + ptr = _m3d_prtbone(ptr, model->bone, model->numbone, M3D_UNDEF, 0, vrtxidx); + ptr += sprintf(ptr, "\r\n"); + } + /* materials */ + if(model->nummaterial && !(flags & M3D_EXP_NOMATERIAL)) { + for(j = 0; j < model->nummaterial; j++) { + if(mtrlidx[j] == M3D_UNDEF || !model->material[j].numprop || !model->material[j].prop) continue; + m = &model->material[j]; + sn = _m3d_safestr(m->name, 0); + if(!sn) { setlocale(LC_NUMERIC, ol); goto memerr; } + ptr -= (uintptr_t)out; len = (unsigned int)((uintptr_t)ptr + (uintptr_t)strlen(sn) + (uintptr_t)12); + for(i = 0; i < m->numprop; i++) { + if(m->prop[i].type < 128) + len += 32; + else if(m->prop[i].value.textureid < model->numtexture && model->texture[m->prop[i].value.textureid].name) + len += (unsigned int)strlen(model->texture[m->prop[i].value.textureid].name) + 16; + } + out = (unsigned char*)M3D_REALLOC(out, len); ptr += (uintptr_t)out; + if(!out) { setlocale(LC_NUMERIC, ol); goto memerr; } + ptr += sprintf(ptr, "Material %s\r\n", sn); + M3D_FREE(sn); sn = NULL; + for(i = 0; i < m->numprop; i++) { + k = 256; + if(m->prop[i].type >= 128) { + for(l = 0; l < sizeof(m3d_propertytypes)/sizeof(m3d_propertytypes[0]); l++) + if(m->prop[i].type == m3d_propertytypes[l].id) { + sn = m3d_propertytypes[l].key; + break; + } + if(!sn) + for(l = 0; l < sizeof(m3d_propertytypes)/sizeof(m3d_propertytypes[0]); l++) + if(m->prop[i].type - 128 == m3d_propertytypes[l].id) { + sn = m3d_propertytypes[l].key; + break; + } + k = sn ? m3dpf_map : 256; + } else { + for(l = 0; l < sizeof(m3d_propertytypes)/sizeof(m3d_propertytypes[0]); l++) + if(m->prop[i].type == m3d_propertytypes[l].id) { + sn = m3d_propertytypes[l].key; + k = m3d_propertytypes[l].format; + break; + } + } + switch(k) { + case m3dpf_color: ptr += sprintf(ptr, "%s #%08x\r\n", sn, m->prop[i].value.color); break; + case m3dpf_uint8: + case m3dpf_uint16: + case m3dpf_uint32: ptr += sprintf(ptr, "%s %d\r\n", sn, m->prop[i].value.num); break; + case m3dpf_float: ptr += sprintf(ptr, "%s %g\r\n", sn, m->prop[i].value.fnum); break; + case m3dpf_map: + if(m->prop[i].value.textureid < model->numtexture && + model->texture[m->prop[i].value.textureid].name) { + sl = _m3d_safestr(model->texture[m->prop[i].value.textureid].name, 0); + if(!sl) { setlocale(LC_NUMERIC, ol); goto memerr; } + if(*sl) + ptr += sprintf(ptr, "map_%s %s\r\n", sn, sl); + M3D_FREE(sn); M3D_FREE(sl); sl = NULL; + } + break; + } + sn = NULL; + } + ptr += sprintf(ptr, "\r\n"); + } + } + /* procedural face */ + if(model->numinlined && model->inlined && !(flags & M3D_EXP_NOFACE)) { + /* all inlined assets which are not textures should be procedural surfaces */ + for(j = 0; j < model->numinlined; j++) { + if(!model->inlined[j].name || !*model->inlined[j].name || !model->inlined[j].length || !model->inlined[j].data || + (model->inlined[j].data[1] == 'P' && model->inlined[j].data[2] == 'N' && model->inlined[j].data[3] == 'G')) + continue; + for(i = k = 0; i < model->numtexture; i++) { + if(!strcmp(model->inlined[j].name, model->texture[i].name)) { k = 1; break; } + } + if(k) continue; + sn = _m3d_safestr(model->inlined[j].name, 0); + if(!sn) { setlocale(LC_NUMERIC, ol); goto memerr; } + ptr -= (uintptr_t)out; len = (unsigned int)((uintptr_t)ptr + (uintptr_t)strlen(sn) + (uintptr_t)18); + out = (unsigned char*)M3D_REALLOC(out, len); ptr += (uintptr_t)out; + if(!out) { setlocale(LC_NUMERIC, ol); goto memerr; } + ptr += sprintf(ptr, "Procedural\r\n%s\r\n\r\n", sn); + M3D_FREE(sn); sn = NULL; + } + } + /* mesh face */ + if(model->numface && face && !(flags & M3D_EXP_NOFACE)) { + ptr -= (uintptr_t)out; len = (unsigned int)((uintptr_t)ptr + (uintptr_t)(model->numface * 128) + (uintptr_t)6); + last = M3D_UNDEF; +#ifdef M3D_VERTEXMAX + lastp = M3D_UNDEF; +#endif + if(!(flags & M3D_EXP_NOMATERIAL)) + for(i = 0; i < model->numface; i++) { + j = face[i].data.materialid < model->nummaterial ? face[i].data.materialid : M3D_UNDEF; + if(j != last) { + last = j; + if(last < model->nummaterial) + len += (unsigned int)strlen(model->material[last].name); + len += 6; + } +#ifdef M3D_VERTEXMAX + j = face[i].data.paramid < model->numparam ? face[i].data.paramid : M3D_UNDEF; + if(j != lastp) { + lastp = j; + if(lastp < model->numparam) + len += (unsigned int)strlen(model->param[lastp].name); + len += 6; + } +#endif + } + out = (unsigned char*)M3D_REALLOC(out, len); ptr += (uintptr_t)out; + if(!out) { setlocale(LC_NUMERIC, ol); goto memerr; } + ptr += sprintf(ptr, "Mesh\r\n"); + last = M3D_UNDEF; +#ifdef M3D_VERTEXMAX + lastp = M3D_UNDEF; +#endif + for(i = 0; i < model->numface; i++) { + j = face[i].data.materialid < model->nummaterial ? face[i].data.materialid : M3D_UNDEF; + if(!(flags & M3D_EXP_NOMATERIAL) && j != last) { + last = j; + if(last < model->nummaterial) { + sn = _m3d_safestr(model->material[last].name, 0); + if(!sn) { setlocale(LC_NUMERIC, ol); goto memerr; } + ptr += sprintf(ptr, "use %s\r\n", sn); + M3D_FREE(sn); sn = NULL; + } else + ptr += sprintf(ptr, "use\r\n"); + } +#ifdef M3D_VERTEXMAX + j = face[i].data.paramid < model->numparam ? face[i].data.paramid : M3D_UNDEF; + if(!(flags & M3D_EXP_NOVRTMAX) && j != lastp) { + lastp = j; + if(lastp < model->numparam) { + sn = _m3d_safestr(model->param[lastp].name, 0); + if(!sn) { setlocale(LC_NUMERIC, ol); goto memerr; } + ptr += sprintf(ptr, "par %s\r\n", sn); + M3D_FREE(sn); sn = NULL; + } else + ptr += sprintf(ptr, "par\r\n"); + } +#endif + /* hardcoded triangles. Should be repeated as many times as the number of edges in polygon */ + for(j = 0; j < 3; j++) { + ptr += sprintf(ptr, "%s%d", j?" ":"", vrtxidx[face[i].data.vertex[j]]); + k = l = M3D_NOTDEFINED; + if(!(flags & M3D_EXP_NOTXTCRD) && (face[i].data.texcoord[j] != M3D_UNDEF) && + (tmapidx[face[i].data.texcoord[j]] != M3D_UNDEF)) { + k = tmapidx[face[i].data.texcoord[j]]; + ptr += sprintf(ptr, "/%d", k); + } + if(!(flags & M3D_EXP_NONORMAL) && (face[i].data.normal[j] != M3D_UNDEF)) { + l = vrtxidx[face[i].data.normal[j]]; + ptr += sprintf(ptr, "%s/%d", k == M3D_NOTDEFINED? "/" : "", l); + } +#ifdef M3D_VERTEXMAX + if(!(flags & M3D_EXP_NOVRTMAX) && (face[i].data.vertmax[j] != M3D_UNDEF)) { + ptr += sprintf(ptr, "%s%s/%d", k == M3D_NOTDEFINED? "/" : "", l == M3D_NOTDEFINED? "/" : "", + vrtxidx[face[i].data.vertmax[j]]); + } +#endif + } + ptr += sprintf(ptr, "\r\n"); + } + ptr += sprintf(ptr, "\r\n"); + } + /* voxel face */ + if(model->numvoxtype && model->voxtype && !(flags & M3D_EXP_NOFACE)) { + ptr -= (uintptr_t)out; len = (unsigned int)((uintptr_t)ptr + (uintptr_t)(model->numvoxtype * 128) + (uintptr_t)10); + for(i = 0; i < model->numvoxtype; i++) { + if(model->voxtype[i].name) len += (unsigned int)strlen(model->voxtype[i].name); + for(j = 0; j < model->voxtype[i].numitem; j++) + if(model->voxtype[i].item[j].name) + len += (unsigned int)strlen(model->voxtype[i].item[j].name) + 6; + } + out = (unsigned char*)M3D_REALLOC(out, len); ptr += (uintptr_t)out; + if(!out) { setlocale(LC_NUMERIC, ol); goto memerr; } + ptr += sprintf(ptr, "VoxTypes\r\n"); + for(i = 0; i < model->numvoxtype; i++) { + ptr += sprintf(ptr, "#%08x", model->voxtype[i].color); + if(model->voxtype[i].rotation) + ptr += sprintf(ptr, "/%02x", model->voxtype[i].rotation); + if(model->voxtype[i].voxshape) + ptr += sprintf(ptr, "%s/%03x", model->voxtype[i].rotation ? "" : "/", model->voxtype[i].voxshape); + sn = _m3d_safestr(model->voxtype[i].name, 0); + if(!sn) { setlocale(LC_NUMERIC, ol); goto memerr; } + ptr += sprintf(ptr, " %s", sn && sn[0] ? sn : "-"); + M3D_FREE(sn); sn = NULL; + if(!(flags & M3D_EXP_NOBONE) && model->numbone && maxskin && model->voxtype[i].skinid < M3D_INDEXMAX) { + if(skin[skinidx[model->voxtype[i].skinid]].data.weight[0] == (M3D_FLOAT)1.0) + ptr += sprintf(ptr, " %d", skin[skinidx[model->voxtype[i].skinid]].data.boneid[0]); + else + for(j = 0; j < M3D_NUMBONE && skin[skinidx[model->voxtype[i].skinid]].data.boneid[j] != M3D_UNDEF && + skin[skinidx[model->voxtype[i].skinid]].data.weight[j] > (M3D_FLOAT)0.0; j++) + ptr += sprintf(ptr, " %d:%g", skin[skinidx[model->voxtype[i].skinid]].data.boneid[j], + skin[skinidx[model->voxtype[i].skinid]].data.weight[j]); + } + if(model->voxtype[i].numitem && model->voxtype[i].item) { + for(j = k = 0; j < model->voxtype[i].numitem; j++) { + if(!model->voxtype[i].item[j].count || !model->voxtype[i].item[j].name || + !model->voxtype[i].item[j].name[0]) continue; + if(!k) { ptr += sprintf(ptr, " {"); k = 1; } + sn = _m3d_safestr(model->voxtype[i].item[j].name, 0); + if(!sn) { setlocale(LC_NUMERIC, ol); goto memerr; } + ptr += sprintf(ptr, " %d %s", model->voxtype[i].item[j].count, sn); + M3D_FREE(sn); sn = NULL; + } + if(k) ptr += sprintf(ptr, " }"); + } + while(ptr[-1] == '-' || ptr[-1] == ' ') ptr--; + ptr += sprintf(ptr, "\r\n"); + } + ptr += sprintf(ptr, "\r\n"); + } + if(model->numvoxel && model->voxel && !(flags & M3D_EXP_NOFACE)) { + for(i = 0; i < model->numvoxel; i++) { + ptr -= (uintptr_t)out; len = (unsigned int)((uintptr_t)ptr + (uintptr_t)128); + if(model->voxel[i].name) len += (unsigned int)strlen(model->voxel[i].name); + len += model->voxel[i].h * ((model->voxel[i].w * 6 + 2) * model->voxel[i].d + 9); + out = (unsigned char*)M3D_REALLOC(out, len); ptr += (uintptr_t)out; + if(!out) { setlocale(LC_NUMERIC, ol); goto memerr; } + ptr += sprintf(ptr, "Voxel"); + sn = _m3d_safestr(model->voxel[i].name, 0); + if(!sn) { setlocale(LC_NUMERIC, ol); goto memerr; } + if(sn && sn[0]) + ptr += sprintf(ptr, " %s", sn); + M3D_FREE(sn); sn = NULL; + ptr += sprintf(ptr, "\r\n"); + if(model->voxel[i].uncertain) + ptr += sprintf(ptr, "uncertain %d %d\r\n", (model->voxel[i].uncertain * 100) / 255, model->voxel[i].groupid); + if(model->voxel[i].x || model->voxel[i].y || model->voxel[i].z) + ptr += sprintf(ptr, "pos %d %d %d\r\n", model->voxel[i].x, model->voxel[i].y, model->voxel[i].z); + ptr += sprintf(ptr, "dim %d %d %d\r\n", model->voxel[i].w, model->voxel[i].h, model->voxel[i].d); + for(j = n = 0; j < model->voxel[i].h; j++) { + ptr += sprintf(ptr, "layer\r\n"); + for(k = 0; k < model->voxel[i].d; k++) { + for(l = 0; l < model->voxel[i].w; l++, n++) { + switch(model->voxel[i].data[n]) { + case M3D_VOXCLEAR: *ptr++ = '-'; break; + case M3D_VOXUNDEF: *ptr++ = '.'; break; + default: ptr += sprintf(ptr, "%d", model->voxel[i].data[n]); break; + } + *ptr++ = ' '; + } + ptr--; + ptr += sprintf(ptr, "\r\n"); + } + } + ptr += sprintf(ptr, "\r\n"); + } + } + /* mathematical shapes face */ + if(model->numshape && model->numshape && !(flags & M3D_EXP_NOFACE)) { + for(j = 0; j < model->numshape; j++) { + sn = _m3d_safestr(model->shape[j].name, 0); + if(!sn) { setlocale(LC_NUMERIC, ol); goto memerr; } + ptr -= (uintptr_t)out; len = (unsigned int)((uintptr_t)ptr + (uintptr_t)strlen(sn) + (uintptr_t)33); + out = (unsigned char*)M3D_REALLOC(out, len); ptr += (uintptr_t)out; + if(!out) { setlocale(LC_NUMERIC, ol); goto memerr; } + ptr += sprintf(ptr, "Shape %s\r\n", sn); + M3D_FREE(sn); sn = NULL; + if(model->shape[j].group != M3D_UNDEF && !(flags & M3D_EXP_NOBONE)) + ptr += sprintf(ptr, "group %d\r\n", model->shape[j].group); + for(i = 0; i < model->shape[j].numcmd; i++) { + cmd = &model->shape[j].cmd[i]; + if(cmd->type >= (unsigned int)(sizeof(m3d_commandtypes)/sizeof(m3d_commandtypes[0])) || !cmd->arg) + continue; + cd = &m3d_commandtypes[cmd->type]; + ptr -= (uintptr_t)out; len = (unsigned int)((uintptr_t)ptr + (uintptr_t)strlen(cd->key) + (uintptr_t)3); + for(k = 0; k < cd->p; k++) + switch(cd->a[k]) { + case m3dcp_mi_t: if(cmd->arg[k] != M3D_NOTDEFINED) { len += (unsigned int)strlen(model->material[cmd->arg[k]].name) + 1; } break; + case m3dcp_va_t: len += cmd->arg[k] * (cd->p - k - 1) * 16; k = cd->p; break; + default: len += 16; break; + } + out = (unsigned char*)M3D_REALLOC(out, len); ptr += (uintptr_t)out; + if(!out) { setlocale(LC_NUMERIC, ol); goto memerr; } + ptr += sprintf(ptr, "%s", cd->key); + for(k = n = 0, l = cd->p; k < l; k++) { + switch(cd->a[((k - n) % (cd->p - n)) + n]) { + case m3dcp_mi_t: + if(cmd->arg[k] != M3D_NOTDEFINED) { + sn = _m3d_safestr(model->material[cmd->arg[k]].name, 0); + if(!sn) { setlocale(LC_NUMERIC, ol); goto memerr; } + ptr += sprintf(ptr, " %s", sn); + M3D_FREE(sn); sn = NULL; + } + break; + case m3dcp_vc_t: ptr += sprintf(ptr, " %g", *((float*)&cmd->arg[k])); break; + case m3dcp_va_t: ptr += sprintf(ptr, " %d[", cmd->arg[k]); + n = k + 1; l += (cmd->arg[k] - 1) * (cd->p - k - 1); + break; + default: ptr += sprintf(ptr, " %d", cmd->arg[k]); break; + } + } + ptr += sprintf(ptr, "%s\r\n", l > cd->p ? " ]" : ""); + } + ptr += sprintf(ptr, "\r\n"); + } + } + /* annotation labels */ + if(model->numlabel && model->label && !(flags & M3D_EXP_NOFACE)) { + for(i = 0, j = 3, length = NULL; i < model->numlabel; i++) { + if(model->label[i].name) j += (unsigned int)strlen(model->label[i].name); + if(model->label[i].lang) j += (unsigned int)strlen(model->label[i].lang); + if(model->label[i].text) j += (unsigned int)strlen(model->label[i].text); + j += 40; + } + ptr -= (uintptr_t)out; len = (unsigned int)((uintptr_t)ptr + (uintptr_t)j); + out = (unsigned char*)M3D_REALLOC(out, len); ptr += (uintptr_t)out; + if(!out) { setlocale(LC_NUMERIC, ol); goto memerr; } + for(i = 0; i < model->numlabel; i++) { + if(!i || _m3d_strcmp(sl, model->label[i].lang) || _m3d_strcmp(sn, model->label[i].name)) { + sl = model->label[i].lang; + sn = model->label[i].name; + sd = _m3d_safestr(sn, 0); + if(!sd) { setlocale(LC_NUMERIC, ol); sn = sl = NULL; goto memerr; } + if(i) ptr += sprintf(ptr, "\r\n"); + ptr += sprintf(ptr, "Labels %s\r\n", sd); + M3D_FREE(sd); sd = NULL; + if(model->label[i].color) + ptr += sprintf(ptr, "color #0x%08x\r\n", model->label[i].color); + if(sl && *sl) { + sd = _m3d_safestr(sl, 0); + if(!sd) { setlocale(LC_NUMERIC, ol); sn = sl = NULL; goto memerr; } + ptr += sprintf(ptr, "lang %s\r\n", sd); + M3D_FREE(sd); sd = NULL; + } + } + sd = _m3d_safestr(model->label[i].text, 2); + if(!sd) { setlocale(LC_NUMERIC, ol); sn = sl = NULL; goto memerr; } + ptr += sprintf(ptr, "%d %s\r\n", model->label[i].vertexid, sd); + M3D_FREE(sd); sd = NULL; + } + ptr += sprintf(ptr, "\r\n"); + sn = sl = NULL; + } + /* actions */ + if(model->numaction && model->action && !(flags & M3D_EXP_NOACTION)) { + for(j = 0; j < model->numaction; j++) { + a = &model->action[j]; + sn = _m3d_safestr(a->name, 0); + if(!sn) { setlocale(LC_NUMERIC, ol); goto memerr; } + ptr -= (uintptr_t)out; len = (unsigned int)((uintptr_t)ptr + (uintptr_t)strlen(sn) + (uintptr_t)48); + for(i = 0; i < a->numframe; i++) + len += a->frame[i].numtransform * 128 + 8; + out = (unsigned char*)M3D_REALLOC(out, len); ptr += (uintptr_t)out; + if(!out) { setlocale(LC_NUMERIC, ol); goto memerr; } + ptr += sprintf(ptr, "Action %d %s\r\n", a->durationmsec, sn); + M3D_FREE(sn); sn = NULL; + for(i = 0; i < a->numframe; i++) { + ptr += sprintf(ptr, "frame %d\r\n", a->frame[i].msec); + for(k = 0; k < a->frame[i].numtransform; k++) { + ptr += sprintf(ptr, "%d %d %d\r\n", a->frame[i].transform[k].boneid, + vrtxidx[a->frame[i].transform[k].pos], vrtxidx[a->frame[i].transform[k].ori]); + } + } + ptr += sprintf(ptr, "\r\n"); + } + } + /* inlined assets */ + if(model->numinlined && model->inlined) { + for(i = j = 0; i < model->numinlined; i++) + if(model->inlined[i].name) + j += (unsigned int)strlen(model->inlined[i].name) + 6; + if(j > 0) { + ptr -= (uintptr_t)out; len = (unsigned int)((uintptr_t)ptr + (uintptr_t)j + (uintptr_t)16); + out = (unsigned char*)M3D_REALLOC(out, len); ptr += (uintptr_t)out; + if(!out) { setlocale(LC_NUMERIC, ol); goto memerr; } + ptr += sprintf(ptr, "Assets\r\n"); + for(i = 0; i < model->numinlined; i++) + if(model->inlined[i].name) + ptr += sprintf(ptr, "%s%s\r\n", model->inlined[i].name, strrchr(model->inlined[i].name, '.') ? "" : ".png"); + ptr += sprintf(ptr, "\r\n"); + } + } + /* extra info */ + if(model->numextra && (flags & M3D_EXP_EXTRA)) { + for(i = 0; i < model->numextra; i++) { + if(model->extra[i]->length < 9) continue; + ptr -= (uintptr_t)out; len = (unsigned int)((uintptr_t)ptr + (uintptr_t)17 + (uintptr_t)(model->extra[i]->length * 3)); + out = (unsigned char*)M3D_REALLOC(out, len); ptr += (uintptr_t)out; + if(!out) { setlocale(LC_NUMERIC, ol); goto memerr; } + ptr += sprintf(ptr, "Extra %c%c%c%c\r\n", + model->extra[i]->magic[0] > ' ' ? model->extra[i]->magic[0] : '_', + model->extra[i]->magic[1] > ' ' ? model->extra[i]->magic[1] : '_', + model->extra[i]->magic[2] > ' ' ? model->extra[i]->magic[2] : '_', + model->extra[i]->magic[3] > ' ' ? model->extra[i]->magic[3] : '_'); + for(j = 0; j < model->extra[i]->length; j++) + ptr += sprintf(ptr, "%02x ", *((unsigned char *)model->extra + sizeof(m3dchunk_t) + j)); + ptr--; + ptr += sprintf(ptr, "\r\n\r\n"); + } + } + setlocale(LC_NUMERIC, ol); + len = (unsigned int)((uintptr_t)ptr - (uintptr_t)out); + out = (unsigned char*)M3D_REALLOC(out, len + 1); + if(!out) goto memerr; + out[len] = 0; + } else +#endif + { + /* stricly only use LF (newline) in binary */ + sd = _m3d_safestr(model->desc, 3); + if(!sd) goto memerr; + /* header */ + h = (m3dhdr_t*)M3D_MALLOC(sizeof(m3dhdr_t) + strlen(sn) + strlen(sl) + strlen(sa) + strlen(sd) + 4); + if(!h) goto memerr; + memcpy((uint8_t*)h, "HEAD", 4); + h->length = sizeof(m3dhdr_t); + h->scale = scale; + i = (unsigned int)strlen(sn); memcpy((uint8_t*)h + h->length, sn, i+1); h->length += i+1; M3D_FREE(sn); + i = (unsigned int)strlen(sl); memcpy((uint8_t*)h + h->length, sl, i+1); h->length += i+1; M3D_FREE(sl); + i = (unsigned int)strlen(sa); memcpy((uint8_t*)h + h->length, sa, i+1); h->length += i+1; M3D_FREE(sa); + i = (unsigned int)strlen(sd); memcpy((uint8_t*)h + h->length, sd, i+1); h->length += i+1; M3D_FREE(sd); + sn = sl = sa = sd = NULL; + if(model->inlined) + for(i = 0; i < model->numinlined; i++) { + if(model->inlined[i].name && *model->inlined[i].name && model->inlined[i].length > 0) { + str = _m3d_addstr(str, &numstr, model->inlined[i].name); + if(!str) goto memerr; + } + } + if(str) + for(i = 0; i < numstr; i++) { + h = _m3d_addhdr(h, &str[i]); + if(!h) goto memerr; + } + vc_s = quality == M3D_EXP_INT8? 1 : (quality == M3D_EXP_INT16? 2 : (quality == M3D_EXP_DOUBLE? 8 : 4)); + vi_s = maxvrtx < 254 ? 1 : (maxvrtx < 65534 ? 2 : 4); + si_s = h->length - 16 < 254 ? 1 : (h->length - 16 < 65534 ? 2 : 4); + ci_s = !numcmap || !cmap ? 0 : (numcmap < 254 ? 1 : (numcmap < 65534 ? 2 : 4)); + ti_s = !maxtmap || !tmap ? 0 : (maxtmap < 254 ? 1 : (maxtmap < 65534 ? 2 : 4)); + bi_s = !model->numbone || !model->bone || (flags & M3D_EXP_NOBONE)? 0 : (model->numbone < 254 ? 1 : + (model->numbone < 65534 ? 2 : 4)); + nb_s = maxbone < 2 ? 1 : (maxbone == 2 ? 2 : (maxbone <= 4 ? 4 : 8)); + sk_s = !bi_s || !maxskin || !skin ? 0 : (maxskin < 254 ? 1 : (maxskin < 65534 ? 2 : 4)); + fc_s = maxt < 254 ? 1 : (maxt < 65534 ? 2 : 4); + hi_s = !model->numshape || !model->shape || (flags & M3D_EXP_NOFACE)? 0 : (model->numshape < 254 ? 1 : + (model->numshape < 65534 ? 2 : 4)); + fi_s = !model->numface || !model->face || (flags & M3D_EXP_NOFACE)? 0 : (model->numface < 254 ? 1 : + (model->numface < 65534 ? 2 : 4)); + vd_s = !model->numvoxel || !model->voxel || (flags & M3D_EXP_NOFACE)? 0 : (minvox >= -128 && maxvox <= 127 ? 1 : + (minvox >= -32768 && maxvox <= 32767 ? 2 : 4)); + vp_s = !model->numvoxtype || !model->voxtype || (flags & M3D_EXP_NOFACE)? 0 : (model->numvoxtype < 254 ? 1 : + (model->numvoxtype < 65534 ? 2 : 4)); + h->types = (vc_s == 8 ? (3<<0) : (vc_s == 2 ? (1<<0) : (vc_s == 1 ? (0<<0) : (2<<0)))) | + (vi_s == 2 ? (1<<2) : (vi_s == 1 ? (0<<2) : (2<<2))) | + (si_s == 2 ? (1<<4) : (si_s == 1 ? (0<<4) : (2<<4))) | + (ci_s == 2 ? (1<<6) : (ci_s == 1 ? (0<<6) : (ci_s == 4 ? (2<<6) : (3<<6)))) | + (ti_s == 2 ? (1<<8) : (ti_s == 1 ? (0<<8) : (ti_s == 4 ? (2<<8) : (3<<8)))) | + (bi_s == 2 ? (1<<10): (bi_s == 1 ? (0<<10): (bi_s == 4 ? (2<<10) : (3<<10)))) | + (nb_s == 2 ? (1<<12): (nb_s == 1 ? (0<<12): (2<<12))) | + (sk_s == 2 ? (1<<14): (sk_s == 1 ? (0<<14): (sk_s == 4 ? (2<<14) : (3<<14)))) | + (fc_s == 2 ? (1<<16): (fc_s == 1 ? (0<<16): (2<<16))) | + (hi_s == 2 ? (1<<18): (hi_s == 1 ? (0<<18): (hi_s == 4 ? (2<<18) : (3<<18)))) | + (fi_s == 2 ? (1<<20): (fi_s == 1 ? (0<<20): (fi_s == 4 ? (2<<20) : (3<<20)))) | + (vd_s == 2 ? (1<<22): (vd_s == 1 ? (0<<22): (vd_s == 4 ? (2<<22) : (3<<22)))) | + (vp_s == 2 ? (1<<24): (vp_s == 1 ? (0<<24): (vp_s == 4 ? (2<<24) : (3<<24)))); + len = h->length; + /* color map */ + if(numcmap && cmap && ci_s < 4 && !(flags & M3D_EXP_NOCMAP)) { + chunklen = 8 + numcmap * sizeof(uint32_t); + h = (m3dhdr_t*)M3D_REALLOC(h, len + chunklen); + if(!h) goto memerr; + memcpy((uint8_t*)h + len, "CMAP", 4); + *((uint32_t*)((uint8_t*)h + len + 4)) = chunklen; + memcpy((uint8_t*)h + len + 8, cmap, chunklen - 8); + len += chunklen; + } else numcmap = 0; + /* texture map */ + if(numtmap && tmap && !(flags & M3D_EXP_NOTXTCRD) && !(flags & M3D_EXP_NOFACE)) { + chunklen = 8 + maxtmap * vc_s * 2; + h = (m3dhdr_t*)M3D_REALLOC(h, len + chunklen); + if(!h) goto memerr; + memcpy((uint8_t*)h + len, "TMAP", 4); + length = (uint32_t*)((uint8_t*)h + len + 4); + out = (uint8_t*)h + len + 8; + last = M3D_UNDEF; + for(i = 0; i < numtmap; i++) { + if(tmap[i].newidx == last) continue; + last = tmap[i].newidx; + switch(vc_s) { + case 1: *out++ = (uint8_t)(tmap[i].data.u * 255); *out++ = (uint8_t)(tmap[i].data.v * 255); break; + case 2: + *((uint16_t*)out) = (uint16_t)(tmap[i].data.u * 65535); out += 2; + *((uint16_t*)out) = (uint16_t)(tmap[i].data.v * 65535); out += 2; + break; + case 4: *((float*)out) = tmap[i].data.u; out += 4; *((float*)out) = tmap[i].data.v; out += 4; break; + case 8: *((double*)out) = tmap[i].data.u; out += 8; *((double*)out) = tmap[i].data.v; out += 8; break; + } + } + *length = (uint32_t)((uintptr_t)out - (uintptr_t)((uint8_t*)h + len)); + out = NULL; + len += *length; + } + /* vertex */ + if(numvrtx && vrtx) { + chunklen = 8 + maxvrtx * (ci_s + sk_s + 4 * vc_s); + h = (m3dhdr_t*)M3D_REALLOC(h, len + chunklen); + if(!h) goto memerr; + memcpy((uint8_t*)h + len, "VRTS", 4); + length = (uint32_t*)((uint8_t*)h + len + 4); + out = (uint8_t*)h + len + 8; + last = M3D_UNDEF; + for(i = 0; i < numvrtx; i++) { + if(vrtx[i].newidx == last) continue; + last = vrtx[i].newidx; + switch(vc_s) { + case 1: + *out++ = (int8_t)(vrtx[i].data.x * 127); + *out++ = (int8_t)(vrtx[i].data.y * 127); + *out++ = (int8_t)(vrtx[i].data.z * 127); + *out++ = (int8_t)(vrtx[i].data.w * 127); + break; + case 2: + *((int16_t*)out) = (int16_t)(vrtx[i].data.x * 32767); out += 2; + *((int16_t*)out) = (int16_t)(vrtx[i].data.y * 32767); out += 2; + *((int16_t*)out) = (int16_t)(vrtx[i].data.z * 32767); out += 2; + *((int16_t*)out) = (int16_t)(vrtx[i].data.w * 32767); out += 2; + break; + case 4: + *((float*)out) = vrtx[i].data.x; out += 4; + *((float*)out) = vrtx[i].data.y; out += 4; + *((float*)out) = vrtx[i].data.z; out += 4; + *((float*)out) = vrtx[i].data.w; out += 4; + break; + case 8: + *((double*)out) = vrtx[i].data.x; out += 8; + *((double*)out) = vrtx[i].data.y; out += 8; + *((double*)out) = vrtx[i].data.z; out += 8; + *((double*)out) = vrtx[i].data.w; out += 8; + break; + } + idx = _m3d_cmapidx(cmap, numcmap, vrtx[i].data.color); + switch(ci_s) { + case 1: *out++ = (uint8_t)(idx); break; + case 2: *((uint16_t*)out) = (uint16_t)(idx); out += 2; break; + case 4: *((uint32_t*)out) = vrtx[i].data.color; out += 4; break; + } + out = _m3d_addidx(out, sk_s, vrtx[i].data.skinid); + } + *length = (uint32_t)((uintptr_t)out - (uintptr_t)((uint8_t*)h + len)); + out = NULL; + len += *length; + } + /* bones chunk */ + if(model->numbone && model->bone && !(flags & M3D_EXP_NOBONE)) { + i = 8 + bi_s + sk_s + model->numbone * (bi_s + si_s + 2*vi_s); + chunklen = i + numskin * nb_s * (bi_s + 1); + h = (m3dhdr_t*)M3D_REALLOC(h, len + chunklen); + if(!h) goto memerr; + memcpy((uint8_t*)h + len, "BONE", 4); + length = (uint32_t*)((uint8_t*)h + len + 4); + out = (uint8_t*)h + len + 8; + out = _m3d_addidx(out, bi_s, model->numbone); + out = _m3d_addidx(out, sk_s, maxskin); + for(i = 0; i < model->numbone; i++) { + out = _m3d_addidx(out, bi_s, model->bone[i].parent); + out = _m3d_addidx(out, si_s, _m3d_stridx(str, numstr, model->bone[i].name)); + out = _m3d_addidx(out, vi_s, vrtxidx[model->bone[i].pos]); + out = _m3d_addidx(out, vi_s, vrtxidx[model->bone[i].ori]); + } + if(numskin && skin && sk_s) { + last = M3D_UNDEF; + for(i = 0; i < numskin; i++) { + if(skin[i].newidx == last) continue; + last = skin[i].newidx; + memset(&weights, 0, nb_s); + for(j = k = l = 0, mw = 0.0; j < (uint32_t)nb_s && skin[i].data.boneid[j] != M3D_UNDEF && + skin[i].data.weight[j] > (M3D_FLOAT)0.0; j++) { + if(mw < skin[i].data.weight[j]) { mw = skin[i].data.weight[j]; k = j; } + weights[j] = (uint8_t)(skin[i].data.weight[j] * 255); + if(!weights[j]) { weights[j]++; l--; } + } + weights[k] += l; + switch(nb_s) { + case 1: weights[0] = 255; break; + case 2: memcpy(out, weights, 2); out += 2; break; + case 4: memcpy(out, weights, 4); out += 4; break; + case 8: memcpy(out, weights, 8); out += 8; break; + } + for(j = 0; j < (uint32_t)nb_s && skin[i].data.boneid[j] != M3D_UNDEF && weights[j]; j++) { + out = _m3d_addidx(out, bi_s, skin[i].data.boneid[j]); + *length += bi_s; + } + } + } + *length = (uint32_t)((uintptr_t)out - (uintptr_t)((uint8_t*)h + len)); + out = NULL; + len += *length; + } + /* materials */ + if(model->nummaterial && !(flags & M3D_EXP_NOMATERIAL)) { + for(j = 0; j < model->nummaterial; j++) { + if(mtrlidx[j] == M3D_UNDEF || !model->material[j].numprop || !model->material[j].prop) continue; + m = &model->material[j]; + chunklen = 12 + si_s + m->numprop * 5; + h = (m3dhdr_t*)M3D_REALLOC(h, len + chunklen); + if(!h) goto memerr; + memcpy((uint8_t*)h + len, "MTRL", 4); + length = (uint32_t*)((uint8_t*)h + len + 4); + out = (uint8_t*)h + len + 8; + out = _m3d_addidx(out, si_s, _m3d_stridx(str, numstr, m->name)); + for(i = 0; i < m->numprop; i++) { + if(m->prop[i].type >= 128) { + if(m->prop[i].value.textureid >= model->numtexture || + !model->texture[m->prop[i].value.textureid].name) continue; + k = m3dpf_map; + } else { + for(k = 256, l = 0; l < sizeof(m3d_propertytypes)/sizeof(m3d_propertytypes[0]); l++) + if(m->prop[i].type == m3d_propertytypes[l].id) { k = m3d_propertytypes[l].format; break; } + } + if(k == 256) continue; + *out++ = m->prop[i].type; + switch(k) { + case m3dpf_color: + if(!(flags & M3D_EXP_NOCMAP)) { + idx = _m3d_cmapidx(cmap, numcmap, m->prop[i].value.color); + switch(ci_s) { + case 1: *out++ = (uint8_t)(idx); break; + case 2: *((uint16_t*)out) = (uint16_t)(idx); out += 2; break; + case 4: *((uint32_t*)out) = (uint32_t)(m->prop[i].value.color); out += 4; break; + } + } else out--; + break; + case m3dpf_uint8: *out++ = m->prop[i].value.num; break; + case m3dpf_uint16: *((uint16_t*)out) = m->prop[i].value.num; out += 2; break; + case m3dpf_uint32: *((uint32_t*)out) = m->prop[i].value.num; out += 4; break; + case m3dpf_float: *((float*)out) = m->prop[i].value.fnum; out += 4; break; + + case m3dpf_map: + idx = _m3d_stridx(str, numstr, model->texture[m->prop[i].value.textureid].name); + out = _m3d_addidx(out, si_s, idx); + break; + } + } + *length = (uint32_t)((uintptr_t)out - (uintptr_t)((uint8_t*)h + len)); + len += *length; + out = NULL; + } + } + /* procedural face */ + if(model->numinlined && model->inlined && !(flags & M3D_EXP_NOFACE)) { + /* all inlined assets which are not textures should be procedural surfaces */ + for(j = 0; j < model->numinlined; j++) { + if(!model->inlined[j].name || !model->inlined[j].name[0] || model->inlined[j].length < 4 || + !model->inlined[j].data || (model->inlined[j].data[1] == 'P' && model->inlined[j].data[2] == 'N' && + model->inlined[j].data[3] == 'G')) + continue; + for(i = k = 0; i < model->numtexture; i++) { + if(!strcmp(model->inlined[j].name, model->texture[i].name)) { k = 1; break; } + } + if(k) continue; + numproc++; + chunklen = 8 + si_s; + h = (m3dhdr_t*)M3D_REALLOC(h, len + chunklen); + if(!h) goto memerr; + memcpy((uint8_t*)h + len, "PROC", 4); + *((uint32_t*)((uint8_t*)h + len + 4)) = chunklen; + out = (uint8_t*)h + len + 8; + out = _m3d_addidx(out, si_s, _m3d_stridx(str, numstr, model->inlined[j].name)); + out = NULL; + len += chunklen; + } + } + /* mesh face */ + if(model->numface && face && !(flags & M3D_EXP_NOFACE)) { + chunklen = 8 + si_s + model->numface * (9 * vi_s + 3 * ti_s + si_s + 1); + h = (m3dhdr_t*)M3D_REALLOC(h, len + chunklen); + if(!h) goto memerr; + memcpy((uint8_t*)h + len, "MESH", 4); + length = (uint32_t*)((uint8_t*)h + len + 4); + out = (uint8_t*)h + len + 8; + last = M3D_UNDEF; +#ifdef M3D_VERTEXMAX + lastp = M3D_UNDEF; +#endif + for(i = 0; i < model->numface; i++) { + if(!(flags & M3D_EXP_NOMATERIAL) && face[i].data.materialid != last) { + last = face[i].data.materialid; + idx = last < model->nummaterial ? _m3d_stridx(str, numstr, model->material[last].name) : 0; + *out++ = 0; + out = _m3d_addidx(out, si_s, idx); + } +#ifdef M3D_VERTEXMAX + if(!(flags & M3D_EXP_NOVRTMAX) && face[i].data.paramid != lastp) { + lastp = face[i].data.paramid; + idx = lastp < model->numparam ? _m3d_stridx(str, numstr, model->param[lastp].name) : 0; + *out++ = 0; + out = _m3d_addidx(out, si_s, idx); + } +#endif + /* hardcoded triangles. */ + k = (3 << 4) | + (((flags & M3D_EXP_NOTXTCRD) || !ti_s || face[i].data.texcoord[0] == M3D_UNDEF || + face[i].data.texcoord[1] == M3D_UNDEF || face[i].data.texcoord[2] == M3D_UNDEF) ? 0 : 1) | + (((flags & M3D_EXP_NONORMAL) || face[i].data.normal[0] == M3D_UNDEF || + face[i].data.normal[1] == M3D_UNDEF || face[i].data.normal[2] == M3D_UNDEF) ? 0 : 2) +#ifdef M3D_VERTEXMAX + | (((flags & M3D_EXP_NOVRTMAX) || face[i].data.vertmax[0] == M3D_UNDEF || + face[i].data.vertmax[1] == M3D_UNDEF || face[i].data.vertmax[2] == M3D_UNDEF) ? 0 : 4) +#endif + ; + *out++ = k; + for(j = 0; j < 3; j++) { + out = _m3d_addidx(out, vi_s, vrtxidx[face[i].data.vertex[j]]); + if(k & 1) + out = _m3d_addidx(out, ti_s, tmapidx[face[i].data.texcoord[j]]); + if(k & 2) + out = _m3d_addidx(out, vi_s, vrtxidx[face[i].data.normal[j]]); +#ifdef M3D_VERTEXMAX + if(k & 4) + out = _m3d_addidx(out, vi_s, vrtxidx[face[i].data.vertmax[j]]); +#endif + } + } + *length = (uint32_t)((uintptr_t)out - (uintptr_t)((uint8_t*)h + len)); + len += *length; + out = NULL; + } + /* voxel face */ + if(model->numvoxtype && model->voxtype && !(flags & M3D_EXP_NOFACE)) { + chunklen = 8 + si_s + model->numvoxtype * (ci_s + si_s + 3 + sk_s); + for(i = 0; i < model->numvoxtype; i++) + chunklen += model->voxtype[i].numitem * (2 + si_s); + h = (m3dhdr_t*)M3D_REALLOC(h, len + chunklen); + if(!h) goto memerr; + memcpy((uint8_t*)h + len, "VOXT", 4); + length = (uint32_t*)((uint8_t*)h + len + 4); + out = (uint8_t*)h + len + 8; + for(i = 0; i < model->numvoxtype; i++) { + if(!(flags & M3D_EXP_NOCMAP)) { + idx = _m3d_cmapidx(cmap, numcmap, model->voxtype[i].color); + switch(ci_s) { + case 1: *out++ = (uint8_t)(idx); break; + case 2: *((uint16_t*)out) = (uint16_t)(idx); out += 2; break; + case 4: *((uint32_t*)out) = (uint32_t)(model->voxtype[i].color); out += 4; break; + } + } + out = _m3d_addidx(out, si_s, _m3d_stridx(str, numstr, model->voxtype[i].name)); + *out++ = (model->voxtype[i].rotation & 0xBF) | (((model->voxtype[i].voxshape >> 8) & 1) << 6); + *out++ = model->voxtype[i].voxshape; + *out++ = model->voxtype[i].numitem; + if(!(flags & M3D_EXP_NOBONE) && model->numbone && maxskin) + out = _m3d_addidx(out, sk_s, skinidx[model->voxtype[i].skinid]); + for(j = 0; j < model->voxtype[i].numitem; j++) { + out = _m3d_addidx(out, 2, model->voxtype[i].item[j].count); + out = _m3d_addidx(out, si_s, _m3d_stridx(str, numstr, model->voxtype[i].item[j].name)); + } + } + *length = (uint32_t)((uintptr_t)out - (uintptr_t)((uint8_t*)h + len)); + len += *length; + out = NULL; + } + if(model->numvoxel && model->voxel && !(flags & M3D_EXP_NOFACE)) { + for(j = 0; j < model->numvoxel; j++) { + chunklen = 8 + si_s + 6 * vd_s + 2 + model->voxel[j].w * model->voxel[j].h * model->voxel[j].d * 3; + h = (m3dhdr_t*)M3D_REALLOC(h, len + chunklen); + if(!h) goto memerr; + memcpy((uint8_t*)h + len, "VOXD", 4); + length = (uint32_t*)((uint8_t*)h + len + 4); + out = (uint8_t*)h + len + 8; + out = _m3d_addidx(out, si_s, _m3d_stridx(str, numstr, model->voxel[j].name)); + out = _m3d_addidx(out, vd_s, model->voxel[j].x); + out = _m3d_addidx(out, vd_s, model->voxel[j].y); + out = _m3d_addidx(out, vd_s, model->voxel[j].z); + out = _m3d_addidx(out, vd_s, model->voxel[j].w); + out = _m3d_addidx(out, vd_s, model->voxel[j].h); + out = _m3d_addidx(out, vd_s, model->voxel[j].d); + *out++ = model->voxel[j].uncertain; + *out++ = model->voxel[j].groupid; + /* RLE compress voxel data */ + n = model->voxel[j].w * model->voxel[j].h * model->voxel[j].d; + k = o = 0; out[o++] = 0; + for(i = 0; i < n; i++) { + for(l = 1; l < 128 && i + l < n && model->voxel[j].data[i] == model->voxel[j].data[i + l]; l++); + if(l > 1) { + l--; + if(out[k]) { out[k]--; out[o++] = 0x80 | l; } + else out[k] = 0x80 | l; + switch(vp_s) { + case 1: out[o++] = model->voxel[j].data[i]; break; + default: *((uint16_t*)(out + o)) = model->voxel[j].data[i]; o += 2; break; + } + k = o; out[o++] = 0; + i += l; + continue; + } + out[k]++; + switch(vp_s) { + case 1: out[o++] = model->voxel[j].data[i]; break; + default: *((uint16_t*)(out + o)) = model->voxel[j].data[i]; o += 2; break; + } + if(out[k] > 127) { out[k]--; k = o; out[o++] = 0; } + } + if(!(out[k] & 0x80)) { if(out[k]) out[k]--; else o--; } + *length = (uint32_t)((uintptr_t)out + (uintptr_t)o - (uintptr_t)((uint8_t*)h + len)); + len += *length; + out = NULL; + } + } + /* mathematical shapes face */ + if(model->numshape && model->shape && !(flags & M3D_EXP_NOFACE)) { + for(j = 0; j < model->numshape; j++) { + chunklen = 12 + si_s + model->shape[j].numcmd * (M3D_CMDMAXARG + 1) * 4; + h = (m3dhdr_t*)M3D_REALLOC(h, len + chunklen); + if(!h) goto memerr; + memcpy((uint8_t*)h + len, "SHPE", 4); + length = (uint32_t*)((uint8_t*)h + len + 4); + out = (uint8_t*)h + len + 8; + out = _m3d_addidx(out, si_s, _m3d_stridx(str, numstr, model->shape[j].name)); + out = _m3d_addidx(out, bi_s, model->shape[j].group); + for(i = 0; i < model->shape[j].numcmd; i++) { + cmd = &model->shape[j].cmd[i]; + if(cmd->type >= (unsigned int)(sizeof(m3d_commandtypes)/sizeof(m3d_commandtypes[0])) || !cmd->arg) + continue; + cd = &m3d_commandtypes[cmd->type]; + *out++ = (cmd->type & 0x7F) | (cmd->type > 127 ? 0x80 : 0); + if(cmd->type > 127) *out++ = (cmd->type >> 7) & 0xff; + for(k = n = 0, l = cd->p; k < l; k++) { + switch(cd->a[((k - n) % (cd->p - n)) + n]) { + case m3dcp_mi_t: + out = _m3d_addidx(out, si_s, cmd->arg[k] < model->nummaterial ? + _m3d_stridx(str, numstr, model->material[cmd->arg[k]].name) : 0); + break; + case m3dcp_vc_t: + min_x = *((float*)&cmd->arg[k]); + switch(vc_s) { + case 1: *out++ = (int8_t)(min_x * 127); break; + case 2: *((int16_t*)out) = (int16_t)(min_x * 32767); out += 2; break; + case 4: *((float*)out) = min_x; out += 4; break; + case 8: *((double*)out) = min_x; out += 8; break; + } + break; + case m3dcp_hi_t: out = _m3d_addidx(out, hi_s, cmd->arg[k]); break; + case m3dcp_fi_t: out = _m3d_addidx(out, fi_s, cmd->arg[k]); break; + case m3dcp_ti_t: out = _m3d_addidx(out, ti_s, cmd->arg[k]); break; + case m3dcp_qi_t: + case m3dcp_vi_t: out = _m3d_addidx(out, vi_s, cmd->arg[k]); break; + case m3dcp_i1_t: out = _m3d_addidx(out, 1, cmd->arg[k]); break; + case m3dcp_i2_t: out = _m3d_addidx(out, 2, cmd->arg[k]); break; + case m3dcp_i4_t: out = _m3d_addidx(out, 4, cmd->arg[k]); break; + case m3dcp_va_t: out = _m3d_addidx(out, 4, cmd->arg[k]); + n = k + 1; l += (cmd->arg[k] - 1) * (cd->p - k - 1); + break; + } + } + } + *length = (uint32_t)((uintptr_t)out - (uintptr_t)((uint8_t*)h + len)); + len += *length; + out = NULL; + } + } + /* annotation labels */ + if(model->numlabel && model->label) { + for(i = 0, length = NULL; i < model->numlabel; i++) { + if(!i || _m3d_strcmp(sl, model->label[i].lang) || _m3d_strcmp(sn, model->label[i].name)) { + sl = model->label[i].lang; + sn = model->label[i].name; + if(length) { + *length = (uint32_t)((uintptr_t)out - (uintptr_t)((uint8_t*)h + len)); + len += *length; + } + chunklen = 8 + 2 * si_s + ci_s + model->numlabel * (vi_s + si_s); + h = (m3dhdr_t*)M3D_REALLOC(h, len + chunklen); + if(!h) { sn = NULL; sl = NULL; goto memerr; } + memcpy((uint8_t*)h + len, "LBLS", 4); + length = (uint32_t*)((uint8_t*)h + len + 4); + out = (uint8_t*)h + len + 8; + out = _m3d_addidx(out, si_s, _m3d_stridx(str, numstr, model->label[l].name)); + out = _m3d_addidx(out, si_s, _m3d_stridx(str, numstr, model->label[l].lang)); + idx = _m3d_cmapidx(cmap, numcmap, model->label[i].color); + switch(ci_s) { + case 1: *out++ = (uint8_t)(idx); break; + case 2: *((uint16_t*)out) = (uint16_t)(idx); out += 2; break; + case 4: *((uint32_t*)out) = model->label[i].color; out += 4; break; + } + } + out = _m3d_addidx(out, vi_s, vrtxidx[model->label[i].vertexid]); + out = _m3d_addidx(out, si_s, _m3d_stridx(str, numstr, model->label[l].text)); + } + if(length) { + *length = (uint32_t)((uintptr_t)out - (uintptr_t)((uint8_t*)h + len)); + len += *length; + } + out = NULL; + sn = sl = NULL; + } + /* actions */ + if(model->numaction && model->action && model->numbone && model->bone && !(flags & M3D_EXP_NOACTION)) { + for(j = 0; j < model->numaction; j++) { + a = &model->action[j]; + chunklen = 14 + si_s + a->numframe * (4 + fc_s + maxt * (bi_s + 2 * vi_s)); + h = (m3dhdr_t*)M3D_REALLOC(h, len + chunklen); + if(!h) goto memerr; + memcpy((uint8_t*)h + len, "ACTN", 4); + length = (uint32_t*)((uint8_t*)h + len + 4); + out = (uint8_t*)h + len + 8; + out = _m3d_addidx(out, si_s, _m3d_stridx(str, numstr, a->name)); + *((uint16_t*)out) = (uint16_t)(a->numframe); out += 2; + *((uint32_t*)out) = (uint32_t)(a->durationmsec); out += 4; + for(i = 0; i < a->numframe; i++) { + *((uint32_t*)out) = (uint32_t)(a->frame[i].msec); out += 4; + out = _m3d_addidx(out, fc_s, a->frame[i].numtransform); + for(k = 0; k < a->frame[i].numtransform; k++) { + out = _m3d_addidx(out, bi_s, a->frame[i].transform[k].boneid); + out = _m3d_addidx(out, vi_s, vrtxidx[a->frame[i].transform[k].pos]); + out = _m3d_addidx(out, vi_s, vrtxidx[a->frame[i].transform[k].ori]); + } + } + *length = (uint32_t)((uintptr_t)out - (uintptr_t)((uint8_t*)h + len)); + len += *length; + out = NULL; + } + } + /* inlined assets */ + if(model->numinlined && model->inlined && (numproc || (flags & M3D_EXP_INLINE))) { + for(j = 0; j < model->numinlined; j++) { + if(!model->inlined[j].name || !model->inlined[j].name[0] || model->inlined[j].length<4 || !model->inlined[j].data) + continue; + if(!(flags & M3D_EXP_INLINE)) { + if(model->inlined[j].data[1] == 'P' && model->inlined[j].data[2] == 'N' && model->inlined[j].data[3] == 'G') + continue; + for(i = k = 0; i < model->numtexture; i++) { + if(!strcmp(model->inlined[j].name, model->texture[i].name)) { k = 1; break; } + } + if(k) continue; + } + chunklen = 8 + si_s + model->inlined[j].length; + h = (m3dhdr_t*)M3D_REALLOC(h, len + chunklen); + if(!h) goto memerr; + memcpy((uint8_t*)h + len, "ASET", 4); + *((uint32_t*)((uint8_t*)h + len + 4)) = chunklen; + out = (uint8_t*)h + len + 8; + out = _m3d_addidx(out, si_s, _m3d_stridx(str, numstr, model->inlined[j].name)); + memcpy(out, model->inlined[j].data, model->inlined[j].length); + out = NULL; + len += chunklen; + } + } + /* extra chunks */ + if(model->numextra && model->extra && (flags & M3D_EXP_EXTRA)) { + for(j = 0; j < model->numextra; j++) { + if(!model->extra[j] || model->extra[j]->length < 8) + continue; + chunklen = model->extra[j]->length; + h = (m3dhdr_t*)M3D_REALLOC(h, len + chunklen); + if(!h) goto memerr; + memcpy((uint8_t*)h + len, model->extra[j], chunklen); + len += chunklen; + } + } + /* add end chunk */ + h = (m3dhdr_t*)M3D_REALLOC(h, len + 4); + if(!h) goto memerr; + memcpy((uint8_t*)h + len, "OMD3", 4); + len += 4; + /* zlib compress */ + if(!(flags & M3D_EXP_NOZLIB)) { + M3D_LOG("Deflating chunks"); + z = stbi_zlib_compress((unsigned char *)h, len, (int*)&l, 9); + if(z && l > 0 && l < len) { len = l; M3D_FREE(h); h = (m3dhdr_t*)z; } + } + /* add file header at the begining */ + len += 8; + out = (unsigned char*)M3D_MALLOC(len); + if(!out) goto memerr; + memcpy(out, "3DMO", 4); + *((uint32_t*)(out + 4)) = len; + /* preview image chunk, must be the first if exists */ + if(model->preview.data && model->preview.length) { + chunklen = 8 + model->preview.length; + out = (unsigned char*)M3D_REALLOC(out, len + chunklen); + if(!out) goto memerr; + memcpy((uint8_t*)out + 8, "PRVW", 4); + *((uint32_t*)((uint8_t*)out + 8 + 4)) = chunklen; + memcpy((uint8_t*)out + 8 + 8, model->preview.data, model->preview.length); + *((uint32_t*)(out + 4)) += chunklen; + } else + chunklen = 0; + memcpy(out + 8 + chunklen, h, len - 8); + } + if(size) *size = out ? len : 0; + if(vrtxidx) M3D_FREE(vrtxidx); + if(mtrlidx) M3D_FREE(mtrlidx); + if(tmapidx) M3D_FREE(tmapidx); + if(skinidx) M3D_FREE(skinidx); + if(norm) M3D_FREE(norm); + if(face) M3D_FREE(face); + if(cmap) M3D_FREE(cmap); + if(tmap) M3D_FREE(tmap); + if(skin) M3D_FREE(skin); + if(str) M3D_FREE(str); + if(vrtx) M3D_FREE(vrtx); + if(opa) M3D_FREE(opa); + if(h) M3D_FREE(h); + return out; +} +#endif + +#endif + +#ifdef __cplusplus +} +#ifdef M3D_CPPWRAPPER +#include +#include +#include + +/*** C++ wrapper class ***/ +namespace M3D { +#ifdef M3D_IMPLEMENTATION + + class Model { + public: + m3d_t *model; + + public: + Model() { + this->model = (m3d_t*)M3D_MALLOC(sizeof(m3d_t)); memset(this->model, 0, sizeof(m3d_t)); + } + Model(_unused const std::string &data, _unused m3dread_t ReadFileCB, + _unused m3dfree_t FreeCB, _unused M3D::Model mtllib) { +#ifndef M3D_NOIMPORTER + this->model = m3d_load((unsigned char *)data.data(), ReadFileCB, FreeCB, mtllib.model); +#else + Model(); +#endif + } + Model(_unused const std::vector data, _unused m3dread_t ReadFileCB, + _unused m3dfree_t FreeCB, _unused M3D::Model mtllib) { +#ifndef M3D_NOIMPORTER + this->model = m3d_load((unsigned char *)&data[0], ReadFileCB, FreeCB, mtllib.model); +#else + Model(); +#endif + } + Model(_unused const unsigned char *data, _unused m3dread_t ReadFileCB, + _unused m3dfree_t FreeCB, _unused M3D::Model mtllib) { +#ifndef M3D_NOIMPORTER + this->model = m3d_load((unsigned char*)data, ReadFileCB, FreeCB, mtllib.model); +#else + Model(); +#endif + } + ~Model() { m3d_free(this->model); } + + public: + m3d_t *getCStruct() { return this->model; } + std::string getName() { return std::string(this->model->name); } + void setName(std::string name) { this->model->name = (char*)name.c_str(); } + std::string getLicense() { return std::string(this->model->license); } + void setLicense(std::string license) { this->model->license = (char*)license.c_str(); } + std::string getAuthor() { return std::string(this->model->author); } + void setAuthor(std::string author) { this->model->author = (char*)author.c_str(); } + std::string getDescription() { return std::string(this->model->desc); } + void setDescription(std::string desc) { this->model->desc = (char*)desc.c_str(); } + float getScale() { return this->model->scale; } + void setScale(float scale) { this->model->scale = scale; } + std::vector getPreview() { return this->model->preview.data ? + std::vector(this->model->preview.data, this->model->preview.data + this->model->preview.length) : + std::vector(); } + std::vector getColorMap() { return this->model->cmap ? std::vector(this->model->cmap, + this->model->cmap + this->model->numcmap) : std::vector(); } + std::vector getTextureMap() { return this->model->tmap ? std::vector(this->model->tmap, + this->model->tmap + this->model->numtmap) : std::vector(); } + std::vector getTextures() { return this->model->texture ? std::vector(this->model->texture, + this->model->texture + this->model->numtexture) : std::vector(); } + std::string getTextureName(int idx) { return idx >= 0 && (unsigned int)idx < this->model->numtexture ? + std::string(this->model->texture[idx].name) : nullptr; } + std::vector getBones() { return this->model->bone ? std::vector(this->model->bone, this->model->bone + + this->model->numbone) : std::vector(); } + std::string getBoneName(int idx) { return idx >= 0 && (unsigned int)idx < this->model->numbone ? + std::string(this->model->bone[idx].name) : nullptr; } + std::vector getMaterials() { return this->model->material ? std::vector(this->model->material, + this->model->material + this->model->nummaterial) : std::vector(); } + std::string getMaterialName(int idx) { return idx >= 0 && (unsigned int)idx < this->model->nummaterial ? + std::string(this->model->material[idx].name) : nullptr; } + int getMaterialPropertyInt(int idx, int type) { + if (idx < 0 || (unsigned int)idx >= this->model->nummaterial || type < 0 || type >= 127 || + !this->model->material[idx].prop) return -1; + for (int i = 0; i < this->model->material[idx].numprop; i++) { + if (this->model->material[idx].prop[i].type == type) + return this->model->material[idx].prop[i].value.num; + } + return -1; + } + uint32_t getMaterialPropertyColor(int idx, int type) { return this->getMaterialPropertyInt(idx, type); } + float getMaterialPropertyFloat(int idx, int type) { + if (idx < 0 || (unsigned int)idx >= this->model->nummaterial || type < 0 || type >= 127 || + !this->model->material[idx].prop) return -1.0f; + for (int i = 0; i < this->model->material[idx].numprop; i++) { + if (this->model->material[idx].prop[i].type == type) + return this->model->material[idx].prop[i].value.fnum; + } + return -1.0f; + } + m3dtx_t* getMaterialPropertyMap(int idx, int type) { + if (idx < 0 || (unsigned int)idx >= this->model->nummaterial || type < 128 || type > 255 || + !this->model->material[idx].prop) return nullptr; + for (int i = 0; i < this->model->material[idx].numprop; i++) { + if (this->model->material[idx].prop[i].type == type) + return this->model->material[idx].prop[i].value.textureid < this->model->numtexture ? + &this->model->texture[this->model->material[idx].prop[i].value.textureid] : nullptr; + } + return nullptr; + } + std::vector getVertices() { return this->model->vertex ? std::vector(this->model->vertex, + this->model->vertex + this->model->numvertex) : std::vector(); } + std::vector getFace() { return this->model->face ? std::vector(this->model->face, this->model->face + + this->model->numface) : std::vector(); } + std::vector getVoxelTypes() { return this->model->voxtype ? std::vector(this->model->voxtype, + this->model->voxtype + this->model->numvoxtype) : std::vector(); } + std::string getVoxelTypeName(int idx) { return idx >= 0 && (unsigned int)idx < this->model->numvoxtype && + this->model->voxtype[idx].name && this->model->voxtype[idx].name[0] ? + std::string(this->model->voxtype[idx].name) : nullptr; } + std::vector getVoxelTypeItems(int idx) { return idx >= 0 && (unsigned int)idx < this->model->numvoxtype && + this->model->voxtype[idx].item ? std::vector(this->model->voxtype[idx].item, + this->model->voxtype[idx].item + this->model->voxtype[idx].numitem) : std::vector(); } + std::vector getVoxelBlocks() { return this->model->voxel ? std::vector(this->model->voxel, + this->model->voxel + this->model->numvoxel) : std::vector(); } + std::string getVoxelBlockName(int idx) { return idx >= 0 && (unsigned int)idx < this->model->numvoxel && + this->model->voxel[idx].name && this->model->voxel[idx].name[0] ? + std::string(this->model->voxel[idx].name) : nullptr; } + std::vector getVoxelBlockData(int idx) { return idx >= 0 && (unsigned int)idx < this->model->numvoxel && + this->model->voxel[idx].data ? std::vector(this->model->voxel[idx].data, + this->model->voxel[idx].data + this->model->voxel[idx].w*this->model->voxel[idx].h*this->model->voxel[idx].d) : + std::vector(); } + std::vector getShape() { return this->model->shape ? std::vector(this->model->shape, + this->model->shape + this->model->numshape) : std::vector(); } + std::string getShapeName(int idx) { return idx >= 0 && (unsigned int)idx < this->model->numshape && + this->model->shape[idx].name && this->model->shape[idx].name[0] ? + std::string(this->model->shape[idx].name) : nullptr; } + unsigned int getShapeGroup(int idx) { return idx >= 0 && (unsigned int)idx < this->model->numshape ? + this->model->shape[idx].group : 0xFFFFFFFF; } + std::vector getShapeCommands(int idx) { return idx >= 0 && (unsigned int)idx < this->model->numshape && + this->model->shape[idx].cmd ? std::vector(this->model->shape[idx].cmd, this->model->shape[idx].cmd + + this->model->shape[idx].numcmd) : std::vector(); } + std::vector getAnnotationLabels() { return this->model->label ? std::vector(this->model->label, + this->model->label + this->model->numlabel) : std::vector(); } + std::vector getSkin() { return this->model->skin ? std::vector(this->model->skin, this->model->skin + + this->model->numskin) : std::vector(); } + std::vector getActions() { return this->model->action ? std::vector(this->model->action, + this->model->action + this->model->numaction) : std::vector(); } + std::string getActionName(int aidx) { return aidx >= 0 && (unsigned int)aidx < this->model->numaction ? + std::string(this->model->action[aidx].name) : nullptr; } + unsigned int getActionDuration(int aidx) { return aidx >= 0 && (unsigned int)aidx < this->model->numaction ? + this->model->action[aidx].durationmsec : 0; } + std::vector getActionFrames(int aidx) { return aidx >= 0 && (unsigned int)aidx < this->model->numaction ? + std::vector(this->model->action[aidx].frame, this->model->action[aidx].frame + + this->model->action[aidx].numframe) : std::vector(); } + unsigned int getActionFrameTimestamp(int aidx, int fidx) { return aidx >= 0 && (unsigned int)aidx < this->model->numaction? + (fidx >= 0 && (unsigned int)fidx < this->model->action[aidx].numframe ? + this->model->action[aidx].frame[fidx].msec : 0) : 0; } + std::vector getActionFrameTransforms(int aidx, int fidx) { + return aidx >= 0 && (unsigned int)aidx < this->model->numaction ? ( + fidx >= 0 && (unsigned int)fidx < this->model->action[aidx].numframe ? + std::vector(this->model->action[aidx].frame[fidx].transform, + this->model->action[aidx].frame[fidx].transform + this->model->action[aidx].frame[fidx].numtransform) : + std::vector()) : std::vector(); } + std::vector getActionFrame(int aidx, int fidx, std::vector skeleton) { + m3dtr_t *pose = m3d_frame(this->model, (unsigned int)aidx, (unsigned int)fidx, + skeleton.size() ? &skeleton[0] : nullptr); + return std::vector(pose, pose + this->model->numbone); } + std::vector getActionPose(int aidx, unsigned int msec) { + m3db_t *pose = m3d_pose(this->model, (unsigned int)aidx, (unsigned int)msec); + return std::vector(pose, pose + this->model->numbone); } + std::vector getInlinedAssets() { return this->model->inlined ? std::vector(this->model->inlined, + this->model->inlined + this->model->numinlined) : std::vector(); } + std::vector> getExtras() { return this->model->extra ? + std::vector>(this->model->extra, + this->model->extra + this->model->numextra) : std::vector>(); } + std::vector Save(_unused int quality, _unused int flags) { +#ifdef M3D_EXPORTER + unsigned int size; + unsigned char *ptr = m3d_save(this->model, quality, flags, &size); + return ptr && size ? std::vector(ptr, ptr + size) : std::vector(); +#else + return std::vector(); +#endif + } + }; + +#else + class Model { + private: + m3d_t *model; + + public: + Model(const std::string &data, m3dread_t ReadFileCB, m3dfree_t FreeCB); + Model(const std::vector data, m3dread_t ReadFileCB, m3dfree_t FreeCB); + Model(const unsigned char *data, m3dread_t ReadFileCB, m3dfree_t FreeCB); + Model(); + ~Model(); + + public: + m3d_t *getCStruct(); + std::string getName(); + void setName(std::string name); + std::string getLicense(); + void setLicense(std::string license); + std::string getAuthor(); + void setAuthor(std::string author); + std::string getDescription(); + void setDescription(std::string desc); + float getScale(); + void setScale(float scale); + std::vector getPreview(); + std::vector getColorMap(); + std::vector getTextureMap(); + std::vector getTextures(); + std::string getTextureName(int idx); + std::vector getBones(); + std::string getBoneName(int idx); + std::vector getMaterials(); + std::string getMaterialName(int idx); + int getMaterialPropertyInt(int idx, int type); + uint32_t getMaterialPropertyColor(int idx, int type); + float getMaterialPropertyFloat(int idx, int type); + m3dtx_t* getMaterialPropertyMap(int idx, int type); + std::vector getVertices(); + std::vector getFace(); + std::vector getVoxelTypes(); + std::string getVoxelTypeName(int idx); + std::vector getVoxelTypeItems(int idx); + std::vector getVoxelBlocks(); + std::string getVoxelBlockName(int idx); + std::vector getVoxelBlockData(int idx); + std::vector getShape(); + std::string getShapeName(int idx); + unsigned int getShapeGroup(int idx); + std::vector getShapeCommands(int idx); + std::vector getAnnotationLabels(); + std::vector getSkin(); + std::vector getActions(); + std::string getActionName(int aidx); + unsigned int getActionDuration(int aidx); + std::vector getActionFrames(int aidx); + unsigned int getActionFrameTimestamp(int aidx, int fidx); + std::vector getActionFrameTransforms(int aidx, int fidx); + std::vector getActionFrame(int aidx, int fidx, std::vector skeleton); + std::vector getActionPose(int aidx, unsigned int msec); + std::vector getInlinedAssets(); + std::vector> getExtras(); + std::vector Save(int quality, int flags); + }; + +#endif /* impl */ +} +#endif + +#endif /* __cplusplus */ + +#endif diff --git a/external/rgfw/RGFW.h b/external/rgfw/RGFW.h new file mode 100644 index 0000000..e8082e4 --- /dev/null +++ b/external/rgfw/RGFW.h @@ -0,0 +1,10838 @@ +/* +* +* RGFW 1.7.5-dev + +* Copyright (C) 2022-25 ColleagueRiley +* +* libpng license +* +* 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. +* +* +*/ + +/* + (MAKE SURE RGFW_IMPLEMENTATION is in exactly one header or you use -D RGFW_IMPLEMENTATION) + #define RGFW_IMPLEMENTATION - makes it so source code is included with header +*/ + +/* + #define RGFW_IMPLEMENTATION - (required) makes it so the source code is included + #define RGFW_DEBUG - (optional) makes it so RGFW prints debug messages and errors when they're found + #define RGFW_OSMESA - (optional) use OSmesa as backend (instead of system's opengl api + regular opengl) + #define RGFW_BUFFER - (optional) draw directly to (RGFW) window pixel buffer that is drawn to screen (the buffer is in the RGBA format) + #define RGFW_EGL - (optional) use EGL for loading an OpenGL context (instead of the system's opengl api) + #define RGFW_OPENGL_ES1 - (optional) use EGL to load and use Opengl ES (version 1) for backend rendering (instead of the system's opengl api) + This version doesn't work for desktops (I'm pretty sure) + #define RGFW_OPENGL_ES2 - (optional) use OpenGL ES (version 2) + #define RGFW_OPENGL_ES3 - (optional) use OpenGL ES (version 3) + #define RGFW_DIRECTX - (optional) include integration directX functions (windows only) + #define RGFW_VULKAN - (optional) include helpful vulkan integration functions and macros + #define RGFW_WEBGPU - (optional) use webGPU for rendering (Web ONLY) + #define RGFW_NO_API - (optional) don't use any rendering API (no opengl, no vulkan, no directX) + + #define RGFW_LINK_EGL (optional) (windows only) if EGL is being used, if EGL functions should be defined dymanically (using GetProcAddress) + #define RGFW_X11 (optional) (unix only) if X11 should be used. This option is turned on by default by unix systems except for MacOS + #define RGFW_WAYLAND (optional) (unix only) use Wayland. (This can be used with X11) + #define RGFW_NO_X11 (optional) (unix only) don't fallback to X11 when using Wayland + #define RGFW_NO_LOAD_WGL (optional) (windows only) if WGL should be loaded dynamically during runtime + #define RGFW_NO_X11_CURSOR (optional) (unix only) don't use XCursor + #define RGFW_NO_X11_CURSOR_PRELOAD (optional) (unix only) use XCursor, but don't link it in code, (you'll have to link it with -lXcursor) + #define RGFW_NO_X11_EXT_PRELOAD (optional) (unix only) use Xext, but don't link it in code, (you'll have to link it with -lXext) + #define RGFW_NO_LOAD_WINMM (optional) (windows only) use winmm (timeBeginPeriod), but don't link it in code, (you'll have to link it with -lwinmm) + #define RGFW_NO_WINMM (optional) (windows only) don't use winmm + #define RGFW_NO_IOKIT (optional) (macOS) don't use IOKit + #define RGFW_NO_UNIX_CLOCK (optional) (unix) don't link unix clock functions + #define RGFW_NO_DWM (windows only) - do not use or link dwmapi + #define RGFW_USE_XDL (optional) (X11) if XDL (XLib Dynamic Loader) should be used to load X11 dynamically during runtime (must include XDL.h along with RGFW) + #define RGFW_COCOA_GRAPHICS_SWITCHING - (optional) (cocoa) use automatic graphics switching (allow the system to choose to use GPU or iGPU) + #define RGFW_COCOA_FRAME_NAME (optional) (cocoa) set frame name + #define RGFW_NO_DPI - do not calculate DPI (no XRM nor libShcore included) + #define RGFW_BUFFER_BGR - use the BGR format for bufffers instead of RGB, saves processing time + #define RGFW_ADVANCED_SMOOTH_RESIZE - use advanced methods for smooth resizing (may result in a spike in memory usage or worse performance) (eg. WM_TIMER and XSyncValue) + + #define RGFW_ALLOC x - choose the default allocation function (defaults to standard malloc) + #define RGFW_FREE x - choose the default deallocation function (defaults to standard free) + #define RGFW_USERPTR x - choose the default userptr sent to the malloc call, (NULL by default) + + #define RGFW_EXPORT - use when building RGFW + #define RGFW_IMPORT - use when linking with RGFW (not as a single-header) + + #define RGFW_USE_INT - force the use c-types rather than stdint.h (for systems that might not have stdint.h (msvc)) + #define RGFW_bool x - choose what type to use for bool, by default u32 is used +*/ + +/* +Example to get you started : + +linux : gcc main.c -lX11 -lXrandr -lGL +windows : gcc main.c -lopengl32 -lgdi32 +macos : gcc main.c -framework Cocoa -framework CoreVideo -framework OpenGL -framework IOKit + +#define RGFW_IMPLEMENTATION +#include "RGFW.h" + +u8 icon[4 * 3 * 3] = {0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF}; + +int main() { + RGFW_window* win = RGFW_createWindow("name", RGFW_RECT(100, 100, 500, 500), (u64)0); + + RGFW_window_setIcon(win, icon, RGFW_AREA(3, 3), 4); + + while (RGFW_window_shouldClose(win) == RGFW_FALSE) { + while (RGFW_window_checkEvent(win)) { + if (win->event.type == RGFW_quit || RGFW_isPressed(win, RGFW_escape)) + break; + } + + RGFW_window_swapBuffers(win); + + glClearColor(1.0f, 1.0f, 1.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + } + + RGFW_window_close(win); +} + + compiling : + + if you wish to compile the library all you have to do is create a new file with this in it + + rgfw.c + #define RGFW_IMPLEMENTATION + #include "RGFW.h" + + You may also want to add + `#define RGFW_EXPORT` when compiling and + `#define RGFW_IMPORT`when linking RGFW on it's own: + this reduces inline functions and prevents bloat in the object file + + then you can use gcc (or whatever compile you wish to use) to compile the library into object file + + ex. gcc -c RGFW.c -fPIC + + after you compile the library into an object file, you can also turn the object file into an static or shared library + + (commands ar and gcc can be replaced with whatever equivalent your system uses) + + static : ar rcs RGFW.a RGFW.o + shared : + windows: + gcc -shared RGFW.o -lopengl32 -lgdi32 -o RGFW.dll + linux: + gcc -shared RGFW.o -lX11 -lGL -lXrandr -o RGFW.so + macos: + gcc -shared RGFW.o -framework CoreVideo -framework Cocoa -framework OpenGL -framework IOKit +*/ + + + +/* + Credits : + EimaMei/Sacode : Much of the code for creating windows using winapi, Wrote the Silicon library, helped with MacOS Support, siliapp.h -> referencing + + stb - This project is heavily inspired by the stb single header files + + GLFW: + certain parts of winapi and X11 are very poorly documented, + GLFW's source code was referenced and used throughout the project. + + contributors : (feel free to put yourself here if you contribute) + krisvers -> code review + EimaMei (SaCode) -> code review + Code-Nycticebus -> bug fixes + Rob Rohan -> X11 bugs and missing features, MacOS/Cocoa fixing memory issues/bugs + AICDG (@THISISAGOODNAME) -> vulkan support (example) + @Easymode -> support, testing/debugging, bug fixes and reviews + Joshua Rowe (omnisci3nce) - bug fix, review (macOS) + @lesleyrs -> bug fix, review (OpenGL) + Nick Porcino (meshula) - testing, organization, review (MacOS, examples) + @DarekParodia -> code review (X11) (C++) +*/ + +#if _MSC_VER + #pragma comment(lib, "gdi32") + #pragma comment(lib, "shell32") + #pragma comment(lib, "User32") + #pragma warning( push ) + #pragma warning( disable : 4996 4191 4127) + #if _MSC_VER < 600 + #define RGFW_C89 + #endif +#else + #if defined(__STDC__) && !defined(__STDC_VERSION__) + #define RGFW_C89 + #endif +#endif + +#ifndef RGFW_USERPTR + #define RGFW_USERPTR NULL +#endif + +#ifndef RGFW_UNUSED + #define RGFW_UNUSED(x) (void)(x) +#endif + +#ifndef RGFW_ROUND + #define RGFW_ROUND(x) (i32)((x) >= 0 ? (x) + 0.5f : (x) - 0.5f) +#endif + +#ifndef RGFW_ALLOC + #include + #define RGFW_ALLOC malloc + #define RGFW_FREE free +#endif + +#ifndef RGFW_ASSERT + #include + #define RGFW_ASSERT assert +#endif + +#if !defined(RGFW_MEMCPY) || !defined(RGFW_STRNCMP) || !defined(RGFW_STRNCPY) || !defined(RGFW_MEMSET) + #include +#endif + +#ifndef RGFW_MEMSET + #define RGFW_MEMSET(ptr, value, num) memset(ptr, value, num) +#endif + +#ifndef RGFW_MEMCPY + #define RGFW_MEMCPY(dist, src, len) memcpy(dist, src, len) +#endif + +#ifndef RGFW_STRNCMP + #define RGFW_STRNCMP(s1, s2, max) strncmp(s1, s2, max) +#endif + +#ifndef RGFW_STRNCPY + #define RGFW_STRNCPY(dist, src, len) strncpy(dist, src, len) +#endif + +#ifndef RGFW_STRSTR + #define RGFW_STRSTR(str, substr) strstr(str, substr) +#endif + +#ifndef RGFW_STRTOL + /* required for X11 XDnD and X11 Monitor DPI */ + #include + #define RGFW_STRTOL(str, endptr, base) strtol(str, endptr, base) + #define RGFW_ATOF(num) atof(num) +#endif + +#ifdef RGFW_WIN95 /* for windows 95 testing (not that it really works) */ + #define RGFW_NO_MONITOR + #define RGFW_NO_PASSTHROUGH +#endif + +#if defined(RGFW_EXPORT) || defined(RGFW_IMPORT) + #if defined(_WIN32) + #if defined(__TINYC__) && (defined(RGFW_EXPORT) || defined(RGFW_IMPORT)) + #define __declspec(x) __attribute__((x)) + #endif + + #if defined(RGFW_EXPORT) + #define RGFWDEF __declspec(dllexport) + #else + #define RGFWDEF __declspec(dllimport) + #endif + #else + #if defined(RGFW_EXPORT) + #define RGFWDEF __attribute__((visibility("default"))) + #endif + #endif + #ifndef RGFWDEF + #define RGFWDEF + #endif +#endif + +#ifndef RGFWDEF + #ifdef RGFW_C89 + #define RGFWDEF __inline + #else + #define RGFWDEF inline + #endif +#endif + +#ifndef RGFW_ENUM + #define RGFW_ENUM(type, name) type name; enum +#endif + + +#if defined(__cplusplus) && !defined(__EMSCRIPTEN__) + extern "C" { +#endif + + /* makes sure the header file part is only defined once by default */ +#ifndef RGFW_HEADER + +#define RGFW_HEADER + +#include +#ifndef RGFW_INT_DEFINED + #ifdef RGFW_USE_INT /* optional for any system that might not have stdint.h */ + typedef unsigned char u8; + typedef signed char i8; + typedef unsigned short u16; + typedef signed short i16; + typedef unsigned long int u32; + typedef signed long int i32; + typedef unsigned long long u64; + typedef signed long long i64; + #else /* use stdint standard types instead of c "standard" types */ + #include + + typedef uint8_t u8; + typedef int8_t i8; + typedef uint16_t u16; + typedef int16_t i16; + typedef uint32_t u32; + typedef int32_t i32; + typedef uint64_t u64; + typedef int64_t i64; + #endif + #define RGFW_INT_DEFINED +#endif + +#ifndef RGFW_BOOL_DEFINED + #define RGFW_BOOL_DEFINED + typedef u8 RGFW_bool; +#endif + +#define RGFW_BOOL(x) (RGFW_bool)((x) ? RGFW_TRUE : RGFW_FALSE) /* force an value to be 0 or 1 */ +#define RGFW_TRUE (RGFW_bool)1 +#define RGFW_FALSE (RGFW_bool)0 + +/* these OS macros look better & are standardized */ +/* plus it helps with cross-compiling */ + +#ifdef __EMSCRIPTEN__ + #define RGFW_WASM + + #if !defined(RGFW_NO_API) && !defined(RGFW_WEBGPU) + #define RGFW_OPENGL + #endif + + #ifdef RGFW_EGL + #undef RGFW_EGL + #endif + + #include + #include + + #ifdef RGFW_WEBGPU + #include + #endif +#endif + +#if defined(RGFW_X11) && defined(__APPLE__) && !defined(RGFW_CUSTOM_BACKEND) + #define RGFW_MACOS_X11 + #define RGFW_UNIX + #undef __APPLE__ +#endif + +#if defined(_WIN32) && !defined(RGFW_X11) && !defined(RGFW_UNIX) && !defined(RGFW_WASM) && !defined(RGFW_CUSTOM_BACKEND) /* (if you're using X11 on windows some how) */ + #define RGFW_WINDOWS + /* make sure the correct architecture is defined */ + #if defined(_WIN64) + #define _AMD64_ + #undef _X86_ + #else + #undef _AMD64_ + #ifndef _X86_ + #define _X86_ + #endif + #endif + + #ifndef RGFW_NO_XINPUT + #ifdef __MINGW32__ /* try to find the right header */ + #include + #else + #include + #endif + #endif +#endif +#if defined(RGFW_WAYLAND) + #define RGFW_DEBUG /* wayland will be in debug mode by default for now */ + #if !defined(RGFW_NO_API) && (!defined(RGFW_BUFFER) || defined(RGFW_OPENGL)) && !defined(RGFW_OSMESA) + #define RGFW_EGL + #define RGFW_OPENGL + #define RGFW_UNIX + #include + #endif + + #include +#endif +#if !defined(RGFW_NO_X11) && !defined(RGFW_NO_X11) && (defined(__unix__) || defined(RGFW_MACOS_X11) || defined(RGFW_X11)) && !defined(RGFW_WASM) && !defined(RGFW_CUSTOM_BACKEND) + #define RGFW_MACOS_X11 + #define RGFW_X11 + #define RGFW_UNIX + #include + #include +#elif defined(__APPLE__) && !defined(RGFW_MACOS_X11) && !defined(RGFW_X11) && !defined(RGFW_WASM) && !defined(RGFW_CUSTOM_BACKEND) + #define RGFW_MACOS + #if !defined(RGFW_BUFFER_BGR) + #define RGFW_BUFFER_BGR + #else + #undef RGFW_BUFFER_BGR + #endif +#endif + +#if (defined(RGFW_OPENGL_ES1) || defined(RGFW_OPENGL_ES2) || defined(RGFW_OPENGL_ES3)) && !defined(RGFW_EGL) + #define RGFW_EGL +#endif + +#if !defined(RGFW_OSMESA) && !defined(RGFW_EGL) && !defined(RGFW_OPENGL) && !defined(RGFW_DIRECTX) && !defined(RGFW_BUFFER) && !defined(RGFW_NO_API) + #define RGFW_OPENGL +#endif + +#ifdef RGFW_EGL + #include +#elif defined(RGFW_OSMESA) + #ifdef RGFW_WINDOWS + #define OEMRESOURCE + #include + #ifndef GLAPIENTRY + #define GLAPIENTRY APIENTRY + #endif + #ifndef GLAPI + #define GLAPI WINGDIAPI + #endif + #endif + + #ifndef __APPLE__ + #include + #else + #include + #endif +#endif + +#if (defined(RGFW_OPENGL) || defined(RGFW_WEGL)) && defined(_MSC_VER) + #pragma comment(lib, "opengl32") +#endif + +#if defined(RGFW_OPENGL) && defined(RGFW_X11) + #ifndef GLX_MESA_swap_control + #define GLX_MESA_swap_control + #endif + #include /* GLX defs, xlib.h, gl.h */ +#endif + +#define RGFW_COCOA_FRAME_NAME NULL + +/*! (unix) Toggle use of wayland. This will be on by default if you use `RGFW_WAYLAND` (if you don't use RGFW_WAYLAND, you don't expose WAYLAND functions) + this is mostly used to allow you to force the use of XWayland +*/ +RGFWDEF void RGFW_useWayland(RGFW_bool wayland); +RGFWDEF RGFW_bool RGFW_usingWayland(void); +/* + regular RGFW stuff +*/ + +#define RGFW_key u8 + +typedef RGFW_ENUM(u8, RGFW_eventType) { + /*! event codes */ + RGFW_eventNone = 0, /*!< no event has been sent */ + RGFW_keyPressed, /* a key has been pressed */ + RGFW_keyReleased, /*!< a key has been released */ + /*! key event note + the code of the key pressed is stored in + RGFW_event.key + !!Keycodes defined at the bottom of the RGFW_HEADER part of this file!! + + while a string version is stored in + RGFW_event.KeyString + + RGFW_event.keyMod holds the current keyMod + this means if CapsLock, NumLock are active or not + */ + RGFW_mouseButtonPressed, /*!< a mouse button has been pressed (left,middle,right) */ + RGFW_mouseButtonReleased, /*!< a mouse button has been released (left,middle,right) */ + RGFW_mousePosChanged, /*!< the position of the mouse has been changed */ + /*! mouse event note + the x and y of the mouse can be found in the vector, RGFW_event.point + + RGFW_event.button holds which mouse button was pressed + */ + RGFW_gamepadConnected, /*!< a gamepad was connected */ + RGFW_gamepadDisconnected, /*!< a gamepad was disconnected */ + RGFW_gamepadButtonPressed, /*!< a gamepad button was pressed */ + RGFW_gamepadButtonReleased, /*!< a gamepad button was released */ + RGFW_gamepadAxisMove, /*!< an axis of a gamepad was moved */ + /*! gamepad event note + RGFW_event.gamepad holds which gamepad was altered, if any + RGFW_event.button holds which gamepad button was pressed + + RGFW_event.axis holds the data of all the axises + RGFW_event.axisesCount says how many axises there are + */ + RGFW_windowMoved, /*!< the window was moved (by the user) */ + RGFW_windowResized, /*!< the window was resized (by the user), [on WASM this means the browser was resized] */ + RGFW_focusIn, /*!< window is in focus now */ + RGFW_focusOut, /*!< window is out of focus now */ + RGFW_mouseEnter, /* mouse entered the window */ + RGFW_mouseLeave, /* mouse left the window */ + RGFW_windowRefresh, /* The window content needs to be refreshed */ + + /* attribs change event note + The event data is sent straight to the window structure + with win->r.x, win->r.y, win->r.w and win->r.h + */ + RGFW_quit, /*!< the user clicked the quit button */ + RGFW_DND, /*!< a file has been dropped into the window */ + RGFW_DNDInit, /*!< the start of a dnd event, when the place where the file drop is known */ + /* dnd data note + The x and y coords of the drop are stored in the vector RGFW_event.point + + RGFW_event.droppedFilesCount holds how many files were dropped + + This is also the size of the array which stores all the dropped file string, + RGFW_event.droppedFiles + */ + RGFW_windowMaximized, /*!< the window was maximized */ + RGFW_windowMinimized, /*!< the window was minimized */ + RGFW_windowRestored, /*!< the window was restored */ + RGFW_scaleUpdated /*!< content scale factor changed */ +}; + +/*! mouse button codes (RGFW_event.button) */ +typedef RGFW_ENUM(u8, RGFW_mouseButton) { + RGFW_mouseLeft = 0, /*!< left mouse button is pressed */ + RGFW_mouseMiddle, /*!< mouse-wheel-button is pressed */ + RGFW_mouseRight, /*!< right mouse button is pressed */ + RGFW_mouseScrollUp, /*!< mouse wheel is scrolling up */ + RGFW_mouseScrollDown, /*!< mouse wheel is scrolling down */ + RGFW_mouseMisc1, RGFW_mouseMisc2, RGFW_mouseMisc3, RGFW_mouseMisc4, RGFW_mouseMisc5, + RGFW_mouseFinal +}; + +#ifndef RGFW_MAX_PATH +#define RGFW_MAX_PATH 260 /* max length of a path (for dnd) */ +#endif +#ifndef RGFW_MAX_DROPS +#define RGFW_MAX_DROPS 260 /* max items you can drop at once */ +#endif + +#define RGFW_BIT(x) (1 << x) + +/* for RGFW_event.lockstate */ +typedef RGFW_ENUM(u8, RGFW_keymod) { + RGFW_modCapsLock = RGFW_BIT(0), + RGFW_modNumLock = RGFW_BIT(1), + RGFW_modControl = RGFW_BIT(2), + RGFW_modAlt = RGFW_BIT(3), + RGFW_modShift = RGFW_BIT(4), + RGFW_modSuper = RGFW_BIT(5), + RGFW_modScrollLock = RGFW_BIT(6) +}; + +/*! gamepad button codes (based on xbox/playstation), you may need to change these values per controller */ +typedef RGFW_ENUM(u8, RGFW_gamepadCodes) { + RGFW_gamepadNone = 0, /*!< or PS X button */ + RGFW_gamepadA, /*!< or PS X button */ + RGFW_gamepadB, /*!< or PS circle button */ + RGFW_gamepadY, /*!< or PS triangle button */ + RGFW_gamepadX, /*!< or PS square button */ + RGFW_gamepadStart, /*!< start button */ + RGFW_gamepadSelect, /*!< select button */ + RGFW_gamepadHome, /*!< home button */ + RGFW_gamepadUp, /*!< dpad up */ + RGFW_gamepadDown, /*!< dpad down */ + RGFW_gamepadLeft, /*!< dpad left */ + RGFW_gamepadRight, /*!< dpad right */ + RGFW_gamepadL1, /*!< left bump */ + RGFW_gamepadL2, /*!< left trigger */ + RGFW_gamepadR1, /*!< right bumper */ + RGFW_gamepadR2, /*!< right trigger */ + RGFW_gamepadL3, /* left thumb stick */ + RGFW_gamepadR3, /*!< right thumb stick */ + RGFW_gamepadFinal +}; + +/*! basic vector type, if there's not already a point/vector type of choice */ +#ifndef RGFW_point + typedef struct RGFW_point { i32 x, y; } RGFW_point; +#endif + +/*! basic rect type, if there's not already a rect type of choice */ +#ifndef RGFW_rect + typedef struct RGFW_rect { i32 x, y, w, h; } RGFW_rect; +#endif + +/*! basic area type, if there's not already a area type of choice */ +#ifndef RGFW_area + typedef struct RGFW_area { u32 w, h; } RGFW_area; +#endif + +#if defined(__cplusplus) && !defined(__APPLE__) +#define RGFW_POINT(x, y) {(i32)x, (i32)y} +#define RGFW_RECT(x, y, w, h) {(i32)x, (i32)y, (i32)w, (i32)h} +#define RGFW_AREA(w, h) {(u32)w, (u32)h} +#else +#define RGFW_POINT(x, y) (RGFW_point){(i32)(x), (i32)(y)} +#define RGFW_RECT(x, y, w, h) (RGFW_rect){(i32)(x), (i32)(y), (i32)(w), (i32)(h)} +#define RGFW_AREA(w, h) (RGFW_area){(u32)(w), (u32)(h)} +#endif + +#ifndef RGFW_NO_MONITOR + /* monitor mode data | can be changed by the user (with functions)*/ + typedef struct RGFW_monitorMode { + RGFW_area area; /*!< monitor workarea size */ + u32 refreshRate; /*!< monitor refresh rate */ + u8 red, blue, green; + } RGFW_monitorMode; + + /*! structure for monitor data */ + typedef struct RGFW_monitor { + i32 x, y; /*!< x - y of the monitor workarea */ + char name[128]; /*!< monitor name */ + float scaleX, scaleY; /*!< monitor content scale */ + float pixelRatio; /*!< pixel ratio for monitor (1.0 for regular, 2.0 for hiDPI) */ + float physW, physH; /*!< monitor physical size in inches */ + + RGFW_monitorMode mode; + } RGFW_monitor; + + /*! get an array of all the monitors (max 6) */ + RGFWDEF RGFW_monitor* RGFW_getMonitors(size_t* len); + /*! get the primary monitor */ + RGFWDEF RGFW_monitor RGFW_getPrimaryMonitor(void); + + typedef RGFW_ENUM(u8, RGFW_modeRequest) { + RGFW_monitorScale = RGFW_BIT(0), /*!< scale the monitor size */ + RGFW_monitorRefresh = RGFW_BIT(1), /*!< change the refresh rate */ + RGFW_monitorRGB = RGFW_BIT(2), /*!< change the monitor RGB bits size */ + RGFW_monitorAll = RGFW_monitorScale | RGFW_monitorRefresh | RGFW_monitorRGB + }; + + /*! request a specific mode */ + RGFWDEF RGFW_bool RGFW_monitor_requestMode(RGFW_monitor mon, RGFW_monitorMode mode, RGFW_modeRequest request); + /*! check if 2 monitor modes are the same */ + RGFWDEF RGFW_bool RGFW_monitorModeCompare(RGFW_monitorMode mon, RGFW_monitorMode mon2, RGFW_modeRequest request); +#endif + +/* RGFW mouse loading */ +typedef void RGFW_mouse; + +/*!< loads mouse icon from bitmap (similar to RGFW_window_setIcon). Icon NOT resized by default */ +RGFWDEF RGFW_mouse* RGFW_loadMouse(u8* icon, RGFW_area a, i32 channels); +/*!< frees RGFW_mouse data */ +RGFWDEF void RGFW_freeMouse(RGFW_mouse* mouse); + +/* NOTE: some parts of the data can represent different things based on the event (read comments in RGFW_event struct) */ +/*! Event structure for checking/getting events */ +typedef struct RGFW_event { + RGFW_eventType type; /*!< which event has been sent?*/ + RGFW_point point; /*!< mouse x, y of event (or drop point) */ + RGFW_point vector; /*!< raw mouse movement */ + float scaleX, scaleY; /*!< DPI scaling */ + + RGFW_key key; /*!< the physical key of the event, refers to where key is physically !!Keycodes defined at the bottom of the RGFW_HEADER part of this file!! */ + u8 keyChar; /*!< mapped key char of the event */ + + RGFW_bool repeat; /*!< key press event repeated (the key is being held) */ + RGFW_keymod keyMod; + + u8 button; /* !< which mouse (or gamepad) button was pressed */ + double scroll; /*!< the raw mouse scroll value */ + + u16 gamepad; /*! which gamepad this event applies to (if applicable to any) */ + u8 axisesCount; /*!< number of axises */ + + u8 whichAxis; /* which axis was effected */ + RGFW_point axis[4]; /*!< x, y of axises (-100 to 100) */ + + /*! drag and drop data */ + /* 260 max paths with a max length of 260 */ + char** droppedFiles; /*!< dropped files */ + size_t droppedFilesCount; /*!< house many files were dropped */ + + void* _win; /*!< the window this event applies too (for event queue events) */ +} RGFW_event; + +/*! source data for the window (used by the APIs) */ +#ifdef RGFW_WINDOWS +typedef struct RGFW_window_src { + HWND window; /*!< source window */ + HDC hdc; /*!< source HDC */ + u32 hOffset; /*!< height offset for window */ + HICON hIconSmall, hIconBig; /*!< source window icons */ + #if (defined(RGFW_OPENGL)) && !defined(RGFW_OSMESA) && !defined(RGFW_EGL) + HGLRC ctx; /*!< source graphics context */ + #elif defined(RGFW_OSMESA) + OSMesaContext ctx; + #elif defined(RGFW_EGL) + EGLSurface EGL_surface; + EGLDisplay EGL_display; + EGLContext EGL_context; + #endif + + #if defined(RGFW_OSMESA) || defined(RGFW_BUFFER) + HDC hdcMem; + HBITMAP bitmap; + u8* bitmapBits; + #endif + RGFW_area maxSize, minSize, aspectRatio; /*!< for setting max/min resize (RGFW_WINDOWS) */ +} RGFW_window_src; +#elif defined(RGFW_UNIX) +typedef struct RGFW_window_src { +#if defined(RGFW_X11) + Display* display; /*!< source display */ + Window window; /*!< source window */ + #if (defined(RGFW_OPENGL)) && !defined(RGFW_OSMESA) && !defined(RGFW_EGL) + GLXContext ctx; /*!< source graphics context */ + GLXFBConfig bestFbc; + #elif defined(RGFW_OSMESA) + OSMesaContext ctx; + #elif defined(RGFW_EGL) + EGLSurface EGL_surface; + EGLDisplay EGL_display; + EGLContext EGL_context; + #endif + + #if defined(RGFW_OSMESA) || defined(RGFW_BUFFER) + XImage* bitmap; + #endif + GC gc; + XVisualInfo visual; + #ifdef RGFW_ADVANCED_SMOOTH_RESIZE + i64 counter_value; + XID counter; + #endif + RGFW_rect r; +#endif /* RGFW_X11 */ +#if defined(RGFW_WAYLAND) + struct wl_display* wl_display; + struct wl_surface* surface; + struct wl_buffer* wl_buffer; + struct wl_keyboard* keyboard; + + struct wl_compositor* compositor; + struct xdg_surface* xdg_surface; + struct xdg_toplevel* xdg_toplevel; + struct zxdg_toplevel_decoration_v1* decoration; + struct xdg_wm_base* xdg_wm_base; + struct wl_shm* shm; + struct wl_seat *seat; + u8* buffer; + #if defined(RGFW_EGL) + struct wl_egl_window* eglWindow; + #endif + #if defined(RGFW_EGL) && !defined(RGFW_X11) + EGLSurface EGL_surface; + EGLDisplay EGL_display; + EGLContext EGL_context; + #elif defined(RGFW_OSMESA) && !defined(RGFW_X11) + OSMesaContext ctx; + #endif +#endif /* RGFW_WAYLAND */ +} RGFW_window_src; +#endif /* RGFW_UNIX */ +#if defined(RGFW_MACOS) +typedef struct RGFW_window_src { + void* window; +#if (defined(RGFW_OPENGL)) && !defined(RGFW_OSMESA) && !defined(RGFW_EGL) + void* ctx; /*!< source graphics context */ +#elif defined(RGFW_OSMESA) + OSMesaContext ctx; +#elif defined(RGFW_EGL) + EGLSurface EGL_surface; + EGLDisplay EGL_display; + EGLContext EGL_context; +#endif + + void* view; /* apple viewpoint thingy */ + void* mouse; +#if defined(RGFW_OSMESA) || defined(RGFW_BUFFER) +#endif +} RGFW_window_src; +#elif defined(RGFW_WASM) +typedef struct RGFW_window_src { + #if defined(RGFW_WEBGPU) + WGPUInstance ctx; + WGPUDevice device; + WGPUQueue queue; + #elif defined(RGFW_OSMESA) + OSMesaContext ctx; + #else + EMSCRIPTEN_WEBGL_CONTEXT_HANDLE ctx; + #endif +} RGFW_window_src; +#endif + +/*! Optional arguments for making a windows */ +typedef RGFW_ENUM(u32, RGFW_windowFlags) { + RGFW_windowNoInitAPI = RGFW_BIT(0), /* do NOT init an API (including the software rendering buffer) (mostly for bindings. you can also use `#define RGFW_NO_API`) */ + RGFW_windowNoBorder = RGFW_BIT(1), /*!< the window doesn't have a border */ + RGFW_windowNoResize = RGFW_BIT(2), /*!< the window cannot be resized by the user */ + RGFW_windowAllowDND = RGFW_BIT(3), /*!< the window supports drag and drop */ + RGFW_windowHideMouse = RGFW_BIT(4), /*! the window should hide the mouse (can be toggled later on using `RGFW_window_mouseShow`) */ + RGFW_windowFullscreen = RGFW_BIT(5), /*!< the window is fullscreen by default */ + RGFW_windowTransparent = RGFW_BIT(6), /*!< the window is transparent (only properly works on X11 and MacOS, although it's meant for for windows) */ + RGFW_windowCenter = RGFW_BIT(7), /*! center the window on the screen */ + RGFW_windowOpenglSoftware = RGFW_BIT(8), /*! use OpenGL software rendering */ + RGFW_windowCocoaCHDirToRes = RGFW_BIT(9), /*! (cocoa only), change directory to resource folder */ + RGFW_windowScaleToMonitor = RGFW_BIT(10), /*! scale the window to the screen */ + RGFW_windowHide = RGFW_BIT(11), /*! the window is hidden */ + RGFW_windowMaximize = RGFW_BIT(12), + RGFW_windowCenterCursor = RGFW_BIT(13), + RGFW_windowFloating = RGFW_BIT(14), /*!< create a floating window */ + RGFW_windowFreeOnClose = RGFW_BIT(15), /*!< free (RGFW_window_close) the RGFW_window struct when the window is closed (by the end user) */ + RGFW_windowFocusOnShow = RGFW_BIT(16), /*!< focus the window when it's shown */ + RGFW_windowMinimize = RGFW_BIT(17), /*!< focus the window when it's shown */ + RGFW_windowFocus = RGFW_BIT(18), /*!< if the window is in focus */ + RGFW_windowedFullscreen = RGFW_windowNoBorder | RGFW_windowMaximize +}; + +typedef struct RGFW_window { + RGFW_window_src src; /*!< src window data */ + +#if defined(RGFW_OSMESA) || defined(RGFW_BUFFER) + u8* buffer; /*!< buffer for non-GPU systems (OSMesa, basic software rendering) */ + /* when rendering using RGFW_BUFFER, the buffer is in the RGBA format */ + RGFW_area bufferSize; +#endif + void* userPtr; /* ptr for usr data */ + + RGFW_event event; /*!< current event */ + + RGFW_rect r; /*!< the x, y, w and h of the struct */ + + /*! which key RGFW_window_shouldClose checks. Settting this to RGFW_keyNULL disables the feature. */ + RGFW_key exitKey; + RGFW_point _lastMousePoint; /*!< last cusor point (for raw mouse data) */ + + u32 _flags; /*!< windows flags (for RGFW to check) */ + RGFW_rect _oldRect; /*!< rect before fullscreen */ +} RGFW_window; /*!< window structure for managing the window */ + +#if defined(RGFW_X11) || defined(RGFW_MACOS) + typedef u64 RGFW_thread; /*!< thread type unix */ +#else + typedef void* RGFW_thread; /*!< thread type for windows */ +#endif + +/*! scale monitor to window size */ +RGFWDEF RGFW_bool RGFW_monitor_scaleToWindow(RGFW_monitor mon, RGFW_window* win); + +/** * @defgroup Window_management +* @{ */ + + +/*! + * the class name for X11 and WinAPI. apps with the same class will be grouped by the WM + * by default the class name will == the root window's name +*/ +RGFWDEF void RGFW_setClassName(const char* name); +RGFWDEF void RGFW_setXInstName(const char* name); /*!< X11 instance name (window name will by used by default) */ + +/*! (cocoa only) change directory to resource folder */ +RGFWDEF void RGFW_moveToMacOSResourceDir(void); + +/* NOTE: (windows) if the executable has an icon resource named RGFW_ICON, it will be set as the initial icon for the window */ + +RGFWDEF RGFW_window* RGFW_createWindow( + const char* name, /* name of the window */ + RGFW_rect rect, /* rect of window */ + RGFW_windowFlags flags /* extra arguments ((u32)0 means no flags used)*/ +); /*!< function to create a window and struct */ + +RGFWDEF RGFW_window* RGFW_createWindowPtr( + const char* name, /* name of the window */ + RGFW_rect rect, /* rect of window */ + RGFW_windowFlags flags, /* extra arguments (NULL / (u32)0 means no flags used) */ + RGFW_window* win /* ptr to the window struct you want to use */ +); /*!< function to create a window (without allocating a window struct) */ + +RGFWDEF void RGFW_window_initBuffer(RGFW_window* win); +RGFWDEF void RGFW_window_initBufferSize(RGFW_window* win, RGFW_area area); +RGFWDEF void RGFW_window_initBufferPtr(RGFW_window* win, u8* buffer, RGFW_area area); + +/*! set the window flags (will undo flags if they don't match the old ones) */ +RGFWDEF void RGFW_window_setFlags(RGFW_window* win, RGFW_windowFlags); + +/*! get the size of the screen to an area struct */ +RGFWDEF RGFW_area RGFW_getScreenSize(void); + + +/*! + this function checks an *individual* event (and updates window structure attributes) + this means, using this function without a while loop may cause event lag + + ex. + + while (RGFW_window_checkEvent(win) != NULL) [this keeps checking events until it reaches the last one] + + this function is optional if you choose to use event callbacks, + although you still need some way to tell RGFW to process events eg. `RGFW_window_checkEvents` +*/ + +RGFWDEF RGFW_event* RGFW_window_checkEvent(RGFW_window* win); /*!< check current event (returns a pointer to win->event or NULL if there is no event)*/ + +/*! + for RGFW_window_eventWait and RGFW_window_checkEvents + waitMS -> Allows the function to keep checking for events even after `RGFW_window_checkEvent == NULL` + if waitMS == 0, the loop will not wait for events + if waitMS > 0, the loop will wait that many miliseconds after there are no more events until it returns + if waitMS == -1 or waitMS == the max size of an unsigned 32-bit int, the loop will not return until it gets another event +*/ +typedef RGFW_ENUM(i32, RGFW_eventWait) { + RGFW_eventNoWait = 0, + RGFW_eventWaitNext = -1 +}; + +/*! sleep until RGFW gets an event or the timer ends (defined by OS) */ +RGFWDEF void RGFW_window_eventWait(RGFW_window* win, i32 waitMS); + +/*! + check all the events until there are none left. + This should only be used if you're using callbacks only +*/ +RGFWDEF void RGFW_window_checkEvents(RGFW_window* win, i32 waitMS); + +/*! + tell RGFW_window_eventWait to stop waiting (to be ran from another thread) +*/ +RGFWDEF void RGFW_stopCheckEvents(void); + +/*! window managment functions */ +RGFWDEF void RGFW_window_close(RGFW_window* win); /*!< close the window and free leftover data */ + +/*! move a window to a given point */ +RGFWDEF void RGFW_window_move(RGFW_window* win, + RGFW_point v /*!< new pos */ +); + +#ifndef RGFW_NO_MONITOR + /*! move window to a specific monitor */ + RGFWDEF void RGFW_window_moveToMonitor(RGFW_window* win, RGFW_monitor m /* monitor */); +#endif + +/*! resize window to a current size/area */ +RGFWDEF void RGFW_window_resize(RGFW_window* win, /*!< source window */ + RGFW_area a /*!< new size */ +); + +/*! set window aspect ratio */ +RGFWDEF void RGFW_window_setAspectRatio(RGFW_window* win, RGFW_area a); +/*! set the minimum dimensions of a window */ +RGFWDEF void RGFW_window_setMinSize(RGFW_window* win, RGFW_area a); +/*! set the maximum dimensions of a window */ +RGFWDEF void RGFW_window_setMaxSize(RGFW_window* win, RGFW_area a); + +RGFWDEF void RGFW_window_focus(RGFW_window* win); /*!< sets the focus to this window */ +RGFWDEF RGFW_bool RGFW_window_isInFocus(RGFW_window* win); /*!< checks the focus to this window */ +RGFWDEF void RGFW_window_raise(RGFW_window* win); /*!< raise the window (to the top) */ +RGFWDEF void RGFW_window_maximize(RGFW_window* win); /*!< maximize the window */ +RGFWDEF void RGFW_window_setFullscreen(RGFW_window* win, RGFW_bool fullscreen); /*!< turn fullscreen on / off for a window */ +RGFWDEF void RGFW_window_center(RGFW_window* win); /*!< center the window */ +RGFWDEF void RGFW_window_minimize(RGFW_window* win); /*!< minimize the window (in taskbar (per OS))*/ +RGFWDEF void RGFW_window_restore(RGFW_window* win); /*!< restore the window from minimized (per OS)*/ +RGFWDEF void RGFW_window_setFloating(RGFW_window* win, RGFW_bool floating); /*!< make the window a floating window */ +RGFWDEF void RGFW_window_setOpacity(RGFW_window* win, u8 opacity); /*!< sets the opacity of a window */ + +/*! if the window should have a border or not (borderless) based on bool value of `border` */ +RGFWDEF void RGFW_window_setBorder(RGFW_window* win, RGFW_bool border); +RGFWDEF RGFW_bool RGFW_window_borderless(RGFW_window* win); + +/*! turn on / off dnd (RGFW_windowAllowDND stil must be passed to the window)*/ +RGFWDEF void RGFW_window_setDND(RGFW_window* win, RGFW_bool allow); +/*! check if DND is allowed */ +RGFWDEF RGFW_bool RGFW_window_allowsDND(RGFW_window* win); + + +#ifndef RGFW_NO_PASSTHROUGH + /*! turn on / off mouse passthrough */ + RGFWDEF void RGFW_window_setMousePassthrough(RGFW_window* win, RGFW_bool passthrough); +#endif + +/*! rename window to a given string */ +RGFWDEF void RGFW_window_setName(RGFW_window* win, + const char* name +); + +RGFWDEF RGFW_bool RGFW_window_setIcon(RGFW_window* win, /*!< source window */ + u8* icon /*!< icon bitmap */, + RGFW_area a /*!< width and height of the bitmap */, + i32 channels /*!< how many channels the bitmap has (rgb : 3, rgba : 4) */ +); /*!< image MAY be resized by default, set both the taskbar and window icon */ + +typedef RGFW_ENUM(u8, RGFW_icon) { + RGFW_iconTaskbar = RGFW_BIT(0), + RGFW_iconWindow = RGFW_BIT(1), + RGFW_iconBoth = RGFW_iconTaskbar | RGFW_iconWindow +}; +RGFWDEF RGFW_bool RGFW_window_setIconEx(RGFW_window* win, u8* icon, RGFW_area a, i32 channels, u8 type); + +/*!< sets mouse to RGFW_mouse icon (loaded from a bitmap struct) */ +RGFWDEF void RGFW_window_setMouse(RGFW_window* win, RGFW_mouse* mouse); + +/*!< sets the mouse to a standard API cursor (based on RGFW_MOUSE, as seen at the end of the RGFW_HEADER part of this file) */ +RGFWDEF RGFW_bool RGFW_window_setMouseStandard(RGFW_window* win, u8 mouse); + +RGFWDEF RGFW_bool RGFW_window_setMouseDefault(RGFW_window* win); /*!< sets the mouse to the default mouse icon */ +/* + Locks cursor at the center of the window + win->event.point becomes raw mouse movement data + + this is useful for a 3D camera +*/ +RGFWDEF void RGFW_window_mouseHold(RGFW_window* win, RGFW_area area); +/*! if the mouse is held by RGFW */ +RGFWDEF RGFW_bool RGFW_window_mouseHeld(RGFW_window* win); +/*! stop holding the mouse and let it move freely */ +RGFWDEF void RGFW_window_mouseUnhold(RGFW_window* win); + +/*! hide the window */ +RGFWDEF void RGFW_window_hide(RGFW_window* win); +/*! show the window */ +RGFWDEF void RGFW_window_show(RGFW_window* win); + +/* + makes it so `RGFW_window_shouldClose` returns true or overrides a window close + by modifying window flags +*/ +RGFWDEF void RGFW_window_setShouldClose(RGFW_window* win, RGFW_bool shouldClose); + +/*! where the mouse is on the screen */ +RGFWDEF RGFW_point RGFW_getGlobalMousePoint(void); + +/*! where the mouse is on the window */ +RGFWDEF RGFW_point RGFW_window_getMousePoint(RGFW_window* win); + +/*! show the mouse or hide the mouse */ +RGFWDEF void RGFW_window_showMouse(RGFW_window* win, RGFW_bool show); +/*! if the mouse is hidden */ +RGFWDEF RGFW_bool RGFW_window_mouseHidden(RGFW_window* win); +/*! move the mouse to a given point */ +RGFWDEF void RGFW_window_moveMouse(RGFW_window* win, RGFW_point v); + +/*! if the window should close (RGFW_close was sent or escape was pressed) */ +RGFWDEF RGFW_bool RGFW_window_shouldClose(RGFW_window* win); +/*! if the window is fullscreen */ +RGFWDEF RGFW_bool RGFW_window_isFullscreen(RGFW_window* win); +/*! if the window is hidden */ +RGFWDEF RGFW_bool RGFW_window_isHidden(RGFW_window* win); +/*! if the window is minimized */ +RGFWDEF RGFW_bool RGFW_window_isMinimized(RGFW_window* win); +/*! if the window is maximized */ +RGFWDEF RGFW_bool RGFW_window_isMaximized(RGFW_window* win); +/*! if the window is floating */ +RGFWDEF RGFW_bool RGFW_window_isFloating(RGFW_window* win); +/** @} */ + +/** * @defgroup Monitor +* @{ */ + +#ifndef RGFW_NO_MONITOR +/* + scale the window to the monitor. + This is run by default if the user uses the arg `RGFW_scaleToMonitor` during window creation +*/ +RGFWDEF void RGFW_window_scaleToMonitor(RGFW_window* win); +/*! get the struct of the window's monitor */ +RGFWDEF RGFW_monitor RGFW_window_getMonitor(RGFW_window* win); +#endif + +/** @} */ + +/** * @defgroup Input +* @{ */ + +/*! if window == NULL, it checks if the key is pressed globally. Otherwise, it checks only if the key is pressed while the window in focus. */ +RGFWDEF RGFW_bool RGFW_isPressed(RGFW_window* win, RGFW_key key); /*!< if key is pressed (key code)*/ + +RGFWDEF RGFW_bool RGFW_wasPressed(RGFW_window* win, RGFW_key key); /*!< if key was pressed (checks previous state only) (key code) */ + +RGFWDEF RGFW_bool RGFW_isHeld(RGFW_window* win, RGFW_key key); /*!< if key is held (key code) */ +RGFWDEF RGFW_bool RGFW_isReleased(RGFW_window* win, RGFW_key key); /*!< if key is released (key code) */ + +/* if a key is pressed and then released, pretty much the same as RGFW_isReleased */ +RGFWDEF RGFW_bool RGFW_isClicked(RGFW_window* win, RGFW_key key /*!< key code */); + +/*! if a mouse button is pressed */ +RGFWDEF RGFW_bool RGFW_isMousePressed(RGFW_window* win, RGFW_mouseButton button /*!< mouse button code */ ); +/*! if a mouse button is held */ +RGFWDEF RGFW_bool RGFW_isMouseHeld(RGFW_window* win, RGFW_mouseButton button /*!< mouse button code */ ); +/*! if a mouse button was released */ +RGFWDEF RGFW_bool RGFW_isMouseReleased(RGFW_window* win, RGFW_mouseButton button /*!< mouse button code */ ); +/*! if a mouse button was pressed (checks previous state only) */ +RGFWDEF RGFW_bool RGFW_wasMousePressed(RGFW_window* win, RGFW_mouseButton button /*!< mouse button code */ ); +/** @} */ + +/** * @defgroup Clipboard +* @{ */ +typedef ptrdiff_t RGFW_ssize_t; + +RGFWDEF const char* RGFW_readClipboard(size_t* size); /*!< read clipboard data */ +/*! read clipboard data or send a NULL str to just get the length of the clipboard data */ +RGFWDEF RGFW_ssize_t RGFW_readClipboardPtr(char* str, size_t strCapacity); +RGFWDEF void RGFW_writeClipboard(const char* text, u32 textLen); /*!< write text to the clipboard */ +/** @} */ + + + +/** * @defgroup error handling +* @{ */ +typedef RGFW_ENUM(u8, RGFW_debugType) { + RGFW_typeError = 0, RGFW_typeWarning, RGFW_typeInfo +}; + +typedef RGFW_ENUM(u8, RGFW_errorCode) { + RGFW_noError = 0, /*!< no error */ + RGFW_errOpenglContext, RGFW_errEGLContext, /*!< error with the OpenGL context */ + RGFW_errWayland, + RGFW_errDirectXContext, + RGFW_errIOKit, + RGFW_errClipboard, + RGFW_errFailedFuncLoad, + RGFW_errBuffer, + RGFW_infoMonitor, RGFW_infoWindow, RGFW_infoBuffer, RGFW_infoGlobal, RGFW_infoOpenGL, + RGFW_warningWayland, RGFW_warningOpenGL +}; + +typedef struct RGFW_debugContext { RGFW_window* win; RGFW_monitor* monitor; u32 srcError; } RGFW_debugContext; + +#if defined(__cplusplus) && !defined(__APPLE__) +#define RGFW_DEBUG_CTX(win, err) {win, NULL, err} +#define RGFW_DEBUG_CTX_MON(monitor) {_RGFW.root, &monitor, 0} +#else +#define RGFW_DEBUG_CTX(win, err) (RGFW_debugContext){win, NULL, err} +#define RGFW_DEBUG_CTX_MON(monitor) (RGFW_debugContext){_RGFW.root, &monitor, 0} +#endif + +typedef void (* RGFW_debugfunc)(RGFW_debugType type, RGFW_errorCode err, RGFW_debugContext ctx, const char* msg); +RGFWDEF RGFW_debugfunc RGFW_setDebugCallback(RGFW_debugfunc func); +RGFWDEF void RGFW_sendDebugInfo(RGFW_debugType type, RGFW_errorCode err, RGFW_debugContext ctx, const char* msg); +/** @} */ + +/** + + + event callbacks. + These are completely optional, so you can use the normal + RGFW_checkEvent() method if you prefer that + +* @defgroup Callbacks +* @{ +*/ + +/*! RGFW_windowMoved, the window and its new rect value */ +typedef void (* RGFW_windowMovedfunc)(RGFW_window* win, RGFW_rect r); +/*! RGFW_windowResized, the window and its new rect value */ +typedef void (* RGFW_windowResizedfunc)(RGFW_window* win, RGFW_rect r); +/*! RGFW_windowRestored, the window and its new rect value */ +typedef void (* RGFW_windowRestoredfunc)(RGFW_window* win, RGFW_rect r); +/*! RGFW_windowMaximized, the window and its new rect value */ +typedef void (* RGFW_windowMaximizedfunc)(RGFW_window* win, RGFW_rect r); +/*! RGFW_windowMinimized, the window and its new rect value */ +typedef void (* RGFW_windowMinimizedfunc)(RGFW_window* win, RGFW_rect r); +/*! RGFW_quit, the window that was closed */ +typedef void (* RGFW_windowQuitfunc)(RGFW_window* win); +/*! RGFW_focusIn / RGFW_focusOut, the window who's focus has changed and if its in focus */ +typedef void (* RGFW_focusfunc)(RGFW_window* win, RGFW_bool inFocus); +/*! RGFW_mouseEnter / RGFW_mouseLeave, the window that changed, the point of the mouse (enter only) and if the mouse has entered */ +typedef void (* RGFW_mouseNotifyfunc)(RGFW_window* win, RGFW_point point, RGFW_bool status); +/*! RGFW_mousePosChanged, the window that the move happened on, and the new point of the mouse */ +typedef void (* RGFW_mousePosfunc)(RGFW_window* win, RGFW_point point, RGFW_point vector); +/*! RGFW_DNDInit, the window, the point of the drop on the windows */ +typedef void (* RGFW_dndInitfunc)(RGFW_window* win, RGFW_point point); +/*! RGFW_windowRefresh, the window that needs to be refreshed */ +typedef void (* RGFW_windowRefreshfunc)(RGFW_window* win); +/*! RGFW_keyPressed / RGFW_keyReleased, the window that got the event, the mapped key, the physical key, the string version, the state of the mod keys, if it was a press (else it's a release) */ +typedef void (* RGFW_keyfunc)(RGFW_window* win, u8 key, u8 keyChar, RGFW_keymod keyMod, RGFW_bool pressed); +/*! RGFW_mouseButtonPressed / RGFW_mouseButtonReleased, the window that got the event, the button that was pressed, the scroll value, if it was a press (else it's a release) */ +typedef void (* RGFW_mouseButtonfunc)(RGFW_window* win, RGFW_mouseButton button, double scroll, RGFW_bool pressed); +/*! RGFW_gamepadButtonPressed, the window that got the event, the button that was pressed, the scroll value, if it was a press (else it's a release) */ +typedef void (* RGFW_gamepadButtonfunc)(RGFW_window* win, u16 gamepad, u8 button, RGFW_bool pressed); +/*! RGFW_gamepadAxisMove, the window that got the event, the gamepad in question, the axis values and the axis count */ +typedef void (* RGFW_gamepadAxisfunc)(RGFW_window* win, u16 gamepad, RGFW_point axis[2], u8 axisesCount, u8 whichAxis); +/*! RGFW_gamepadConnected / RGFW_gamepadDisconnected, the window that got the event, the gamepad in question, if the controller was connected (else it was disconnected) */ +typedef void (* RGFW_gamepadfunc)(RGFW_window* win, u16 gamepad, RGFW_bool connected); +/*! RGFW_dnd, the window that had the drop, the drop data and the number of files dropped */ +typedef void (* RGFW_dndfunc)(RGFW_window* win, char** droppedFiles, size_t droppedFilesCount); +/*! RGFW_scaleUpdated, the window the event was sent to, content scaleX, content scaleY */ +typedef void (* RGFW_scaleUpdatedfunc)(RGFW_window* win, float scaleX, float scaleY); + +/*! set callback for a window move event. Returns previous callback function (if it was set) */ +RGFWDEF RGFW_windowMovedfunc RGFW_setWindowMovedCallback(RGFW_windowMovedfunc func); +/*! set callback for a window resize event. Returns previous callback function (if it was set) */ +RGFWDEF RGFW_windowResizedfunc RGFW_setWindowResizedCallback(RGFW_windowResizedfunc func); +/*! set callback for a window quit event. Returns previous callback function (if it was set) */ +RGFWDEF RGFW_windowQuitfunc RGFW_setWindowQuitCallback(RGFW_windowQuitfunc func); +/*! set callback for a mouse move event. Returns previous callback function (if it was set) */ +RGFWDEF RGFW_mousePosfunc RGFW_setMousePosCallback(RGFW_mousePosfunc func); +/*! set callback for a window refresh event. Returns previous callback function (if it was set) */ +RGFWDEF RGFW_windowRefreshfunc RGFW_setWindowRefreshCallback(RGFW_windowRefreshfunc func); +/*! set callback for a window focus change event. Returns previous callback function (if it was set) */ +RGFWDEF RGFW_focusfunc RGFW_setFocusCallback(RGFW_focusfunc func); +/*! set callback for a mouse notify event. Returns previous callback function (if it was set) */ +RGFWDEF RGFW_mouseNotifyfunc RGFW_setMouseNotifyCallback(RGFW_mouseNotifyfunc func); +/*! set callback for a drop event event. Returns previous callback function (if it was set) */ +RGFWDEF RGFW_dndfunc RGFW_setDndCallback(RGFW_dndfunc func); +/*! set callback for a start of a drop event. Returns previous callback function (if it was set) */ +RGFWDEF RGFW_dndInitfunc RGFW_setDndInitCallback(RGFW_dndInitfunc func); +/*! set callback for a key (press / release) event. Returns previous callback function (if it was set) */ +RGFWDEF RGFW_keyfunc RGFW_setKeyCallback(RGFW_keyfunc func); +/*! set callback for a mouse button (press / release) event. Returns previous callback function (if it was set) */ +RGFWDEF RGFW_mouseButtonfunc RGFW_setMouseButtonCallback(RGFW_mouseButtonfunc func); +/*! set callback for a controller button (press / release) event. Returns previous callback function (if it was set) */ +RGFWDEF RGFW_gamepadButtonfunc RGFW_setGamepadButtonCallback(RGFW_gamepadButtonfunc func); +/*! set callback for a gamepad axis move event. Returns previous callback function (if it was set) */ +RGFWDEF RGFW_gamepadAxisfunc RGFW_setGamepadAxisCallback(RGFW_gamepadAxisfunc func); +/*! set callback for when a controller is connected or disconnected. Returns the previous callback function (if it was set) */ +RGFWDEF RGFW_gamepadfunc RGFW_setGamepadCallback(RGFW_gamepadfunc func); +/*! set call back for when window is maximized. Returns the previous callback function (if it was set) */ +RGFWDEF RGFW_windowResizedfunc RGFW_setWindowMaximizedCallback(RGFW_windowResizedfunc func); +/*! set call back for when window is minimized. Returns the previous callback function (if it was set) */ +RGFWDEF RGFW_windowResizedfunc RGFW_setWindowMinimizedCallback(RGFW_windowResizedfunc func); +/*! set call back for when window is restored. Returns the previous callback function (if it was set) */ +RGFWDEF RGFW_windowResizedfunc RGFW_setWindowRestoredCallback(RGFW_windowResizedfunc func); +/*! set callback for when the DPI changes. Returns previous callback function (if it was set) */ +RGFWDEF RGFW_scaleUpdatedfunc RGFW_setScaleUpdatedCallback(RGFW_scaleUpdatedfunc func); +/** @} */ + +/** * @defgroup Threads +* @{ */ + +#ifndef RGFW_NO_THREADS +/*! threading functions */ + +/*! NOTE! (for X11/linux) : if you define a window in a thread, it must be run after the original thread's window is created or else there will be a memory error */ +/* + I'd suggest you use sili's threading functions instead + if you're going to use sili + which is a good idea generally +*/ + +#if defined(__unix__) || defined(__APPLE__) || defined(RGFW_WASM) || defined(RGFW_CUSTOM_BACKEND) + typedef void* (* RGFW_threadFunc_ptr)(void*); +#else + typedef DWORD (__stdcall *RGFW_threadFunc_ptr) (LPVOID lpThreadParameter); +#endif + +RGFWDEF RGFW_thread RGFW_createThread(RGFW_threadFunc_ptr ptr, void* args); /*!< create a thread */ +RGFWDEF void RGFW_cancelThread(RGFW_thread thread); /*!< cancels a thread */ +RGFWDEF void RGFW_joinThread(RGFW_thread thread); /*!< join thread to current thread */ +RGFWDEF void RGFW_setThreadPriority(RGFW_thread thread, u8 priority); /*!< sets the priority priority */ +#endif + +/** @} */ + +/** * @defgroup gamepad +* @{ */ + +typedef RGFW_ENUM(u8, RGFW_gamepadType) { + RGFW_gamepadMicrosoft = 0, RGFW_gamepadSony, RGFW_gamepadNintendo, RGFW_gamepadLogitech, RGFW_gamepadUnknown +}; + +/*! gamepad count starts at 0*/ +RGFWDEF u32 RGFW_isPressedGamepad(RGFW_window* win, u8 controller, RGFW_gamepadCodes button); +RGFWDEF u32 RGFW_isReleasedGamepad(RGFW_window* win, u8 controller, RGFW_gamepadCodes button); +RGFWDEF u32 RGFW_isHeldGamepad(RGFW_window* win, u8 controller, RGFW_gamepadCodes button); +RGFWDEF u32 RGFW_wasPressedGamepad(RGFW_window* win, u8 controller, RGFW_gamepadCodes button); +RGFWDEF RGFW_point RGFW_getGamepadAxis(RGFW_window* win, u16 controller, u16 whichAxis); +RGFWDEF const char* RGFW_getGamepadName(RGFW_window* win, u16 controller); +RGFWDEF size_t RGFW_getGamepadCount(RGFW_window* win); +RGFWDEF RGFW_gamepadType RGFW_getGamepadType(RGFW_window* win, u16 controller); + +/** @} */ + +/** * @defgroup graphics_API +* @{ */ + +/*!< make the window the current opengl drawing context + + NOTE: + if you want to switch the graphics context's thread, + you have to run RGFW_window_makeCurrent(NULL); on the old thread + then RGFW_window_makeCurrent(valid_window) on the new thread +*/ +RGFWDEF void RGFW_window_makeCurrent(RGFW_window* win); + +/*! get current RGFW window graphics context */ +RGFWDEF RGFW_window* RGFW_getCurrent(void); + +/* supports openGL, directX, OSMesa, EGL and software rendering */ +RGFWDEF void RGFW_window_swapBuffers(RGFW_window* win); /*!< swap the rendering buffer */ +RGFWDEF void RGFW_window_swapInterval(RGFW_window* win, i32 swapInterval); +/*!< render the software rendering buffer (this is called by RGFW_window_swapInterval) */ +RGFWDEF void RGFW_window_swapBuffers_software(RGFW_window* win); + +typedef void (*RGFW_proc)(void); /* function pointer equivalent of void* */ + +/*! native API functions */ +#if defined(RGFW_OPENGL) || defined(RGFW_EGL) +/*!< create an opengl context for the RGFW window, run by createWindow by default (unless the RGFW_windowNoInitAPI is included) */ +RGFWDEF void RGFW_window_initOpenGL(RGFW_window* win, RGFW_bool software); +/*!< called by `RGFW_window_close` by default (unless the RGFW_windowNoInitAPI is set) */ +RGFWDEF void RGFW_window_freeOpenGL(RGFW_window* win); + +/*! OpenGL init hints */ +typedef RGFW_ENUM(u8, RGFW_glHints) { + RGFW_glStencil = 0, /*!< set stencil buffer bit size (8 by default) */ + RGFW_glSamples, /*!< set number of sampiling buffers (4 by default) */ + RGFW_glStereo, /*!< use GL_STEREO (GL_FALSE by default) */ + RGFW_glAuxBuffers, /*!< number of aux buffers (0 by default) */ + RGFW_glDoubleBuffer, /*!< request double buffering */ + RGFW_glRed, RGFW_glGreen, RGFW_glBlue, RGFW_glAlpha, /*!< set RGBA bit sizes */ + RGFW_glDepth, + RGFW_glAccumRed, RGFW_glAccumGreen, RGFW_glAccumBlue,RGFW_glAccumAlpha, /*!< set accumulated RGBA bit sizes */ + RGFW_glSRGB, /*!< request sRGA */ + RGFW_glRobustness, /*!< request a robust context */ + RGFW_glDebug, /*!< request opengl debugging */ + RGFW_glNoError, /*!< request no opengl errors */ + RGFW_glReleaseBehavior, + RGFW_glProfile, + RGFW_glMajor, RGFW_glMinor, + RGFW_glFinalHint = 32, /*!< the final hint (not for setting) */ + RGFW_releaseFlush = 0, RGFW_glReleaseNone, /* RGFW_glReleaseBehavior options */ + RGFW_glCore = 0, RGFW_glCompatibility /*!< RGFW_glProfile options */ +}; +RGFWDEF void RGFW_setGLHint(RGFW_glHints hint, i32 value); +RGFWDEF RGFW_bool RGFW_extensionSupported(const char* extension, size_t len); /*!< check if whether the specified API extension is supported by the current OpenGL or OpenGL ES context */ +RGFWDEF RGFW_proc RGFW_getProcAddress(const char* procname); /*!< get native opengl proc address */ +RGFWDEF void RGFW_window_makeCurrent_OpenGL(RGFW_window* win); /*!< to be called by RGFW_window_makeCurrent */ +RGFWDEF void RGFW_window_swapBuffers_OpenGL(RGFW_window* win); /*!< swap opengl buffer (only) called by RGFW_window_swapInterval */ +void* RGFW_getCurrent_OpenGL(void); /*!< get the current context (OpenGL backend (GLX) (WGL) (EGL) (cocoa) (webgl))*/ + +RGFWDEF RGFW_bool RGFW_extensionSupportedPlatform(const char* extension, size_t len); /*!< check if whether the specified platform-specific API extension is supported by the current OpenGL or OpenGL ES context */ +#endif +#ifdef RGFW_VULKAN + #if defined(RGFW_WAYLAND) && defined(RGFW_X11) + #define VK_USE_PLATFORM_WAYLAND_KHR + #define VK_USE_PLATFORM_XLIB_KHR + #define RGFW_VK_SURFACE ((RGFW_usingWayland()) ? ("VK_KHR_wayland_surface") : ("VK_KHR_xlib_surface")) + #elif defined(RGFW_WAYLAND) + #define VK_USE_PLATFORM_WAYLAND_KHR + #define VK_USE_PLATFORM_XLIB_KHR + #define RGFW_VK_SURFACE "VK_KHR_wayland_surface" + #elif defined(RGFW_X11) + #define VK_USE_PLATFORM_XLIB_KHR + #define RGFW_VK_SURFACE "VK_KHR_xlib_surface" + #elif defined(RGFW_WINDOWS) + #define VK_USE_PLATFORM_WIN32_KHR + #define OEMRESOURCE + #define RGFW_VK_SURFACE "VK_KHR_win32_surface" + #elif defined(RGFW_MACOS) && !defined(RGFW_MACOS_X11) + #define VK_USE_PLATFORM_MACOS_MVK + #define RGFW_VK_SURFACE "VK_MVK_macos_surface" + #else + #define RGFW_VK_SURFACE NULL + #endif + +/* if you don't want to use the above macros */ +RGFWDEF const char** RGFW_getVKRequiredInstanceExtensions(size_t* count); /*!< gets (static) extension array (and size (which will be 2)) */ + +#include + +RGFWDEF VkResult RGFW_window_createVKSurface(RGFW_window* win, VkInstance instance, VkSurfaceKHR* surface); +RGFWDEF RGFW_bool RGFW_getVKPresentationSupport(VkInstance instance, VkPhysicalDevice physicalDevice, u32 queueFamilyIndex); +#endif +#ifdef RGFW_DIRECTX +#ifndef RGFW_WINDOWS + #undef RGFW_DIRECTX +#else + #define OEMRESOURCE + #include + + #ifndef __cplusplus + #define __uuidof(T) IID_##T + #endif +RGFWDEF int RGFW_window_createDXSwapChain(RGFW_window* win, IDXGIFactory* pFactory, IUnknown* pDevice, IDXGISwapChain** swapchain); +#endif +#endif + +/** @} */ + +/** * @defgroup Supporting +* @{ */ + +/*! optional init/deinit function */ +RGFWDEF i32 RGFW_init(void); /*!< is called by default when the first window is created by default */ +RGFWDEF void RGFW_deinit(void); /*!< is called by default when the last open window is closed */ + +RGFWDEF double RGFW_getTime(void); /*!< get time in seconds since RGFW_setTime, which ran when the first window is open */ +RGFWDEF u64 RGFW_getTimeNS(void); /*!< get time in nanoseconds RGFW_setTime, which ran when the first window is open */ +RGFWDEF void RGFW_sleep(u64 milisecond); /*!< sleep for a set time */ +RGFWDEF void RGFW_setTime(double time); /*!< set timer in seconds */ +RGFWDEF u64 RGFW_getTimerValue(void); /*!< get API timer value */ +RGFWDEF u64 RGFW_getTimerFreq(void); /*!< get API time freq */ + +/*< updates fps / sets fps to cap (must by ran manually by the user at the end of a frame), returns current fps */ +RGFWDEF u32 RGFW_checkFPS(double startTime, u32 frameCount, u32 fpsCap); + +/*!< change which window is the root window */ +RGFWDEF void RGFW_setRootWindow(RGFW_window* win); +RGFWDEF RGFW_window* RGFW_getRootWindow(void); + +/*! standard event queue, used for injecting events and returning source API callback events like any other queue check */ +/* these are all used internally by RGFW */ +void RGFW_eventQueuePush(RGFW_event event); +RGFW_event* RGFW_eventQueuePop(RGFW_window* win); + +/* for C++ / C89 */ +#define RGFW_eventQueuePushEx(eventInit) { RGFW_event e; eventInit; RGFW_eventQueuePush(e); } + +/*! + key codes and mouse icon enums +*/ +#undef RGFW_key +typedef RGFW_ENUM(u8, RGFW_key) { + RGFW_keyNULL = 0, + RGFW_escape = '\033', + RGFW_backtick = '`', + RGFW_0 = '0', + RGFW_1 = '1', + RGFW_2 = '2', + RGFW_3 = '3', + RGFW_4 = '4', + RGFW_5 = '5', + RGFW_6 = '6', + RGFW_7 = '7', + RGFW_8 = '8', + RGFW_9 = '9', + + RGFW_minus = '-', + RGFW_equals = '=', + RGFW_backSpace = '\b', + RGFW_tab = '\t', + RGFW_space = ' ', + + RGFW_a = 'a', + RGFW_b = 'b', + RGFW_c = 'c', + RGFW_d = 'd', + RGFW_e = 'e', + RGFW_f = 'f', + RGFW_g = 'g', + RGFW_h = 'h', + RGFW_i = 'i', + RGFW_j = 'j', + RGFW_k = 'k', + RGFW_l = 'l', + RGFW_m = 'm', + RGFW_n = 'n', + RGFW_o = 'o', + RGFW_p = 'p', + RGFW_q = 'q', + RGFW_r = 'r', + RGFW_s = 's', + RGFW_t = 't', + RGFW_u = 'u', + RGFW_v = 'v', + RGFW_w = 'w', + RGFW_x = 'x', + RGFW_y = 'y', + RGFW_z = 'z', + + RGFW_period = '.', + RGFW_comma = ',', + RGFW_slash = '/', + RGFW_bracket = '{', + RGFW_closeBracket = '}', + RGFW_semicolon = ';', + RGFW_apostrophe = '\'', + RGFW_backSlash = '\\', + RGFW_return = '\n', + + RGFW_delete = '\177', /* 127 */ + + RGFW_F1, + RGFW_F2, + RGFW_F3, + RGFW_F4, + RGFW_F5, + RGFW_F6, + RGFW_F7, + RGFW_F8, + RGFW_F9, + RGFW_F10, + RGFW_F11, + RGFW_F12, + + RGFW_capsLock, + RGFW_shiftL, + RGFW_controlL, + RGFW_altL, + RGFW_superL, + RGFW_shiftR, + RGFW_controlR, + RGFW_altR, + RGFW_superR, + RGFW_up, + RGFW_down, + RGFW_left, + RGFW_right, + RGFW_insert, + RGFW_end, + RGFW_home, + RGFW_pageUp, + RGFW_pageDown, + + RGFW_numLock, + RGFW_KP_Slash, + RGFW_multiply, + RGFW_KP_Minus, + RGFW_KP_1, + RGFW_KP_2, + RGFW_KP_3, + RGFW_KP_4, + RGFW_KP_5, + RGFW_KP_6, + RGFW_KP_7, + RGFW_KP_8, + RGFW_KP_9, + RGFW_KP_0, + RGFW_KP_Period, + RGFW_KP_Return, + RGFW_scrollLock, + RGFW_keyLast = 256 /* padding for alignment ~(175 by default) */ + }; + +RGFWDEF u32 RGFW_apiKeyToRGFW(u32 keycode); + +typedef RGFW_ENUM(u8, RGFW_mouseIcons) { + RGFW_mouseNormal = 0, + RGFW_mouseArrow, + RGFW_mouseIbeam, + RGFW_mouseCrosshair, + RGFW_mousePointingHand, + RGFW_mouseResizeEW, + RGFW_mouseResizeNS, + RGFW_mouseResizeNWSE, + RGFW_mouseResizeNESW, + RGFW_mouseResizeAll, + RGFW_mouseNotAllowed, + RGFW_mouseIconFinal = 16 /* padding for alignment */ +}; +/** @} */ + +#endif /* RGFW_HEADER */ +#if defined(RGFW_X11) || defined(RGFW_WAYLAND) + #define RGFW_OS_BASED_VALUE(l, w, m, h) l +#elif defined(RGFW_WINDOWS) + #define RGFW_OS_BASED_VALUE(l, w, m, h) w +#elif defined(RGFW_MACOS) + #define RGFW_OS_BASED_VALUE(l, w, m, h) m +#elif defined(RGFW_WASM) + #define RGFW_OS_BASED_VALUE(l, w, m, h) h +#endif + + +#ifdef RGFW_IMPLEMENTATION +RGFW_bool RGFW_useWaylandBool = 1; +void RGFW_useWayland(RGFW_bool wayland) { RGFW_useWaylandBool = wayland; } +RGFW_bool RGFW_usingWayland(void) { return RGFW_useWaylandBool; } + +#if !defined(RGFW_NO_X11) && defined(RGFW_WAYLAND) +#define RGFW_GOTO_WAYLAND(fallback) if (RGFW_useWaylandBool && fallback == 0) goto wayland +#else +#define RGFW_GOTO_WAYLAND(fallback) +#endif + +char* RGFW_clipboard_data; +void RGFW_clipboard_switch(char* newstr); +void RGFW_clipboard_switch(char* newstr) { + if (RGFW_clipboard_data != NULL) + RGFW_FREE(RGFW_clipboard_data); + RGFW_clipboard_data = newstr; +} + +#define RGFW_CHECK_CLIPBOARD() \ + if (size <= 0 && RGFW_clipboard_data != NULL) \ + return (const char*)RGFW_clipboard_data; \ + else if (size <= 0) \ + return "\0"; + +const char* RGFW_readClipboard(size_t* len) { + RGFW_ssize_t size = RGFW_readClipboardPtr(NULL, 0); + RGFW_CHECK_CLIPBOARD(); + char* str = (char*)RGFW_ALLOC((size_t)size); + RGFW_ASSERT(str != NULL); + str[0] = '\0'; + + size = RGFW_readClipboardPtr(str, (size_t)size); + + RGFW_CHECK_CLIPBOARD(); + + if (len != NULL) *len = (size_t)size; + + RGFW_clipboard_switch(str); + return (const char*)str; +} + +RGFW_debugfunc RGFW_debugCallback = NULL; +RGFW_debugfunc RGFW_setDebugCallback(RGFW_debugfunc func) { + RGFW_debugfunc RGFW_debugCallbackPrev = RGFW_debugCallback; + RGFW_debugCallback = func; + return RGFW_debugCallbackPrev; +} + +#ifdef RGFW_DEBUG +#include +#endif + +void RGFW_sendDebugInfo(RGFW_debugType type, RGFW_errorCode err, RGFW_debugContext ctx, const char* msg) { + if (RGFW_debugCallback) RGFW_debugCallback(type, err, ctx, msg); + #ifdef RGFW_DEBUG + switch (type) { + case RGFW_typeInfo: printf("RGFW INFO (%i %i): %s", type, err, msg); break; + case RGFW_typeError: printf("RGFW DEBUG (%i %i): %s", type, err, msg); break; + case RGFW_typeWarning: printf("RGFW WARNING (%i %i): %s", type, err, msg); break; + default: break; + } + + switch (err) { + #ifdef RGFW_BUFFER + case RGFW_errBuffer: case RGFW_infoBuffer: printf(" buffer size: %i %i\n", ctx.win->bufferSize.w, ctx.win->bufferSize.h); break; + #endif + case RGFW_infoMonitor: printf(": scale (%s):\n rect: {%i, %i, %i, %i}\n physical size:%f %f\n scale: %f %f\n pixelRatio: %f\n refreshRate: %i\n depth: %i\n", ctx.monitor->name, ctx.monitor->x, ctx.monitor->y, ctx.monitor->mode.area.w, ctx.monitor->mode.area.h, ctx.monitor->physW, ctx.monitor->physH, ctx.monitor->scaleX, ctx.monitor->scaleY, ctx.monitor->pixelRatio, ctx.monitor->mode.refreshRate, ctx.monitor->mode.red + ctx.monitor->mode.green + ctx.monitor->mode.blue); break; + case RGFW_infoWindow: printf(" with rect of {%i, %i, %i, %i} \n", ctx.win->r.x, ctx.win->r.y,ctx. win->r.w, ctx.win->r.h); break; + case RGFW_errDirectXContext: printf(" srcError %i\n", ctx.srcError); break; + default: printf("\n"); + } + #endif +} + +u64 RGFW_timerOffset = 0; +void RGFW_setTime(double time) { + RGFW_timerOffset = RGFW_getTimerValue() - (u64)(time * (double)RGFW_getTimerFreq()); +} + +double RGFW_getTime(void) { + return (double) ((double)(RGFW_getTimerValue() - RGFW_timerOffset) / (double)RGFW_getTimerFreq()); +} + +u64 RGFW_getTimeNS(void) { + return (u64)(((double)((RGFW_getTimerValue() - RGFW_timerOffset)) * 1e9) / (double)RGFW_getTimerFreq()); +} + +/* +RGFW_IMPLEMENTATION starts with generic RGFW defines + +This is the start of keycode data + + Why not use macros instead of the numbers itself? + Windows -> Not all scancodes keys are macros + Linux -> Only symcodes are values, (XK_0 - XK_1, XK_a - XK_z) are larger than 0xFF00, I can't find any way to work with them without making the array an unreasonable size + MacOS -> windows and linux already don't have keycodes as macros, so there's no point +*/ + + + +/* + the c++ compiler doesn't support setting up an array like, + we'll have to do it during runtime using a function & this messy setup +*/ + +#ifndef RGFW_CUSTOM_BACKEND + +#if !defined(__cplusplus) && !defined(RGFW_C89) +#define RGFW_NEXT , +#define RGFW_MAP +#else +#define RGFW_NEXT ; +#define RGFW_MAP RGFW_keycodes +#endif + +u8 RGFW_keycodes [RGFW_OS_BASED_VALUE(256, 512, 128, 256)] = { +#if defined(__cplusplus) || defined(RGFW_C89) + 0 +}; +void RGFW_init_keys(void); +void RGFW_init_keys(void) { +#endif + RGFW_MAP [RGFW_OS_BASED_VALUE(49, 0x029, 50, DOM_VK_BACK_QUOTE)] = RGFW_backtick RGFW_NEXT + + RGFW_MAP [RGFW_OS_BASED_VALUE(19, 0x00B, 29, DOM_VK_0)] = RGFW_0 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(10, 0x002, 18, DOM_VK_1)] = RGFW_1 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(11, 0x003, 19, DOM_VK_2)] = RGFW_2 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(12, 0x004, 20, DOM_VK_3)] = RGFW_3 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(13, 0x005, 21, DOM_VK_4)] = RGFW_4 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(14, 0x006, 23, DOM_VK_5)] = RGFW_5 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(15, 0x007, 22, DOM_VK_6)] = RGFW_6 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(16, 0x008, 26, DOM_VK_7)] = RGFW_7 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(17, 0x009, 28, DOM_VK_8)] = RGFW_8 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(18, 0x00A, 25, DOM_VK_9)] = RGFW_9, + RGFW_MAP [RGFW_OS_BASED_VALUE(65, 0x039, 49, DOM_VK_SPACE)] = RGFW_space, + RGFW_MAP [RGFW_OS_BASED_VALUE(38, 0x01E, 0, DOM_VK_A)] = RGFW_a RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(56, 0x030, 11, DOM_VK_B)] = RGFW_b RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(54, 0x02E, 8, DOM_VK_C)] = RGFW_c RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(40, 0x020, 2, DOM_VK_D)] = RGFW_d RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(26, 0x012, 14, DOM_VK_E)] = RGFW_e RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(41, 0x021, 3, DOM_VK_F)] = RGFW_f RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(42, 0x022, 5, DOM_VK_G)] = RGFW_g RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(43, 0x023, 4, DOM_VK_H)] = RGFW_h RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(31, 0x017, 34, DOM_VK_I)] = RGFW_i RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(44, 0x024, 38, DOM_VK_J)] = RGFW_j RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(45, 0x025, 40, DOM_VK_K)] = RGFW_k RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(46, 0x026, 37, DOM_VK_L)] = RGFW_l RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(58, 0x032, 46, DOM_VK_M)] = RGFW_m RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(57, 0x031, 45, DOM_VK_N)] = RGFW_n RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(32, 0x018, 31, DOM_VK_O)] = RGFW_o RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(33, 0x019, 35, DOM_VK_P)] = RGFW_p RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(24, 0x010, 12, DOM_VK_Q)] = RGFW_q RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(27, 0x013, 15, DOM_VK_R)] = RGFW_r RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(39, 0x01F, 1, DOM_VK_S)] = RGFW_s RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(28, 0x014, 17, DOM_VK_T)] = RGFW_t RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(30, 0x016, 32, DOM_VK_U)] = RGFW_u RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(55, 0x02F, 9, DOM_VK_V)] = RGFW_v RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(25, 0x011, 13, DOM_VK_W)] = RGFW_w RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(53, 0x02D, 7, DOM_VK_X)] = RGFW_x RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(29, 0x015, 16, DOM_VK_Y)] = RGFW_y RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(52, 0x02C, 6, DOM_VK_Z)] = RGFW_z, + RGFW_MAP [RGFW_OS_BASED_VALUE(60, 0x034, 47, DOM_VK_PERIOD)] = RGFW_period RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(59, 0x033, 43, DOM_VK_COMMA)] = RGFW_comma RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(61, 0x035, 44, DOM_VK_SLASH)] = RGFW_slash RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(34, 0x01A, 33, DOM_VK_OPEN_BRACKET)] = RGFW_bracket RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(35, 0x01B, 30, DOM_VK_CLOSE_BRACKET)] = RGFW_closeBracket RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(47, 0x027, 41, DOM_VK_SEMICOLON)] = RGFW_semicolon RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(48, 0x028, 39, DOM_VK_QUOTE)] = RGFW_apostrophe RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(51, 0x02B, 42, DOM_VK_BACK_SLASH)] = RGFW_backSlash, + RGFW_MAP [RGFW_OS_BASED_VALUE(36, 0x01C, 36, DOM_VK_RETURN)] = RGFW_return RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(119, 0x153, 118, DOM_VK_DELETE)] = RGFW_delete RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(77, 0x145, 72, DOM_VK_NUM_LOCK)] = RGFW_numLock RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(106, 0x135, 82, DOM_VK_DIVIDE)] = RGFW_KP_Slash RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(63, 0x037, 76, DOM_VK_MULTIPLY)] = RGFW_multiply RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(82, 0x04A, 67, DOM_VK_SUBTRACT)] = RGFW_KP_Minus RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(87, 0x04F, 84, DOM_VK_NUMPAD1)] = RGFW_KP_1 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(88, 0x050, 85, DOM_VK_NUMPAD2)] = RGFW_KP_2 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(89, 0x051, 86, DOM_VK_NUMPAD3)] = RGFW_KP_3 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(83, 0x04B, 87, DOM_VK_NUMPAD4)] = RGFW_KP_4 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(84, 0x04C, 88, DOM_VK_NUMPAD5)] = RGFW_KP_5 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(85, 0x04D, 89, DOM_VK_NUMPAD6)] = RGFW_KP_6 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(79, 0x047, 90, DOM_VK_NUMPAD7)] = RGFW_KP_7 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(80, 0x048, 92, DOM_VK_NUMPAD8)] = RGFW_KP_8 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(81, 0x049, 93, DOM_VK_NUMPAD9)] = RGFW_KP_9 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(90, 0x052, 83, DOM_VK_NUMPAD0)] = RGFW_KP_0 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(91, 0x053, 65, DOM_VK_DECIMAL)] = RGFW_KP_Period RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(104, 0x11C, 77, 0)] = RGFW_KP_Return, + RGFW_MAP [RGFW_OS_BASED_VALUE(20, 0x00C, 27, DOM_VK_HYPHEN_MINUS)] = RGFW_minus RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(21, 0x00D, 24, DOM_VK_EQUALS)] = RGFW_equals RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(22, 0x00E, 51, DOM_VK_BACK_SPACE)] = RGFW_backSpace RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(23, 0x00F, 48, DOM_VK_TAB)] = RGFW_tab RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(66, 0x03A, 57, DOM_VK_CAPS_LOCK)] = RGFW_capsLock RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(50, 0x02A, 56, DOM_VK_SHIFT)] = RGFW_shiftL RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(37, 0x01D, 59, DOM_VK_CONTROL)] = RGFW_controlL RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(64, 0x038, 58, DOM_VK_ALT)] = RGFW_altL RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(133, 0x15B, 55, DOM_VK_WIN)] = RGFW_superL, + #if !defined(RGFW_MACOS) && !defined(RGFW_WASM) + RGFW_MAP [RGFW_OS_BASED_VALUE(105, 0x11D, 59, 0)] = RGFW_controlR RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(134, 0x15C, 55, 0)] = RGFW_superR, + RGFW_MAP [RGFW_OS_BASED_VALUE(62, 0x036, 56, 0)] = RGFW_shiftR RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(108, 0x138, 58, 0)] = RGFW_altR, + #endif + RGFW_MAP [RGFW_OS_BASED_VALUE(67, 0x03B, 127, DOM_VK_F1)] = RGFW_F1 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(68, 0x03C, 121, DOM_VK_F2)] = RGFW_F2 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(69, 0x03D, 100, DOM_VK_F3)] = RGFW_F3 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(70, 0x03E, 119, DOM_VK_F4)] = RGFW_F4 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(71, 0x03F, 97, DOM_VK_F5)] = RGFW_F5 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(72, 0x040, 98, DOM_VK_F6)] = RGFW_F6 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(73, 0x041, 99, DOM_VK_F7)] = RGFW_F7 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(74, 0x042, 101, DOM_VK_F8)] = RGFW_F8 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(75, 0x043, 102, DOM_VK_F9)] = RGFW_F9 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(76, 0x044, 110, DOM_VK_F10)] = RGFW_F10 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(95, 0x057, 104, DOM_VK_F11)] = RGFW_F11 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(96, 0x058, 112, DOM_VK_F12)] = RGFW_F12 RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(111, 0x148, 126, DOM_VK_UP)] = RGFW_up RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(116, 0x150, 125, DOM_VK_DOWN)] = RGFW_down RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(113, 0x14B, 123, DOM_VK_LEFT)] = RGFW_left RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(114, 0x14D, 124, DOM_VK_RIGHT)] = RGFW_right RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(118, 0x152, 115, DOM_VK_INSERT)] = RGFW_insert RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(115, 0x14F, 120, DOM_VK_END)] = RGFW_end RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(112, 0x149, 117, DOM_VK_PAGE_UP)] = RGFW_pageUp RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(117, 0x151, 122, DOM_VK_PAGE_DOWN)] = RGFW_pageDown RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(9, 0x001, 53, DOM_VK_ESCAPE)] = RGFW_escape RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(110, 0x147, 116, DOM_VK_HOME)] = RGFW_home RGFW_NEXT + RGFW_MAP [RGFW_OS_BASED_VALUE(78, 0x046, 107, DOM_VK_SCROLL_LOCK)] = RGFW_scrollLock RGFW_NEXT +#if defined(__cplusplus) || defined(RGFW_C89) +} +#else +}; +#endif + +#undef RGFW_NEXT +#undef RGFW_MAP + +u32 RGFW_apiKeyToRGFW(u32 keycode) { + #if defined(__cplusplus) || defined(RGFW_C89) + if (RGFW_keycodes[RGFW_OS_BASED_VALUE(49, 0x029, 50, DOM_VK_BACK_QUOTE)] != RGFW_backtick) { + RGFW_init_keys(); + } + #endif + + /* make sure the key isn't out of bounds */ + if (keycode > sizeof(RGFW_keycodes) / sizeof(u8)) + return 0; + + return RGFW_keycodes[keycode]; +} +#endif /* RGFW_CUSTOM_BACKEND */ + +typedef struct { + RGFW_bool current : 1; + RGFW_bool prev : 1; +} RGFW_keyState; + +RGFW_keyState RGFW_keyboard[RGFW_keyLast] = { {0, 0} }; + +RGFWDEF void RGFW_resetKeyPrev(void); +void RGFW_resetKeyPrev(void) { + size_t i; /*!< reset each previous state */ + for (i = 0; i < RGFW_keyLast; i++) RGFW_keyboard[i].prev = 0; +} +RGFWDEF void RGFW_resetKey(void); +void RGFW_resetKey(void) { RGFW_MEMSET(RGFW_keyboard, 0, sizeof(RGFW_keyboard)); } +/* + this is the end of keycode data +*/ + +/* gamepad data */ +RGFW_keyState RGFW_gamepadPressed[4][32]; /*!< if a key is currently pressed or not (per gamepad) */ +RGFW_point RGFW_gamepadAxes[4][4]; /*!< if a key is currently pressed or not (per gamepad) */ + +RGFW_gamepadType RGFW_gamepads_type[4]; /*!< if a key is currently pressed or not (per gamepad) */ +i32 RGFW_gamepads[4] = {0, 0, 0, 0}; /*!< limit of 4 gamepads at a time */ +char RGFW_gamepads_name[4][128]; /*!< gamepad names */ +u16 RGFW_gamepadCount = 0; /*!< the actual amount of gamepads */ + +/* + event callback defines start here +*/ + + +/* + These exist to avoid the + if (func == NULL) check + for (allegedly) better performance + + RGFW_EMPTY_DEF exists to prevent the missing-prototypes warning +*/ +static void RGFW_windowMovedfuncEMPTY(RGFW_window* win, RGFW_rect r) { RGFW_UNUSED(win); RGFW_UNUSED(r); } +static void RGFW_windowResizedfuncEMPTY(RGFW_window* win, RGFW_rect r) { RGFW_UNUSED(win); RGFW_UNUSED(r); } +static void RGFW_windowRestoredfuncEMPTY(RGFW_window* win, RGFW_rect r) { RGFW_UNUSED(win); RGFW_UNUSED(r); } +static void RGFW_windowMinimizedfuncEMPTY(RGFW_window* win, RGFW_rect r) { RGFW_UNUSED(win); RGFW_UNUSED(r); } +static void RGFW_windowMaximizedfuncEMPTY(RGFW_window* win, RGFW_rect r) { RGFW_UNUSED(win); RGFW_UNUSED(r); } +static void RGFW_windowQuitfuncEMPTY(RGFW_window* win) { RGFW_UNUSED(win); } +static void RGFW_focusfuncEMPTY(RGFW_window* win, RGFW_bool inFocus) {RGFW_UNUSED(win); RGFW_UNUSED(inFocus);} +static void RGFW_mouseNotifyfuncEMPTY(RGFW_window* win, RGFW_point point, RGFW_bool status) {RGFW_UNUSED(win); RGFW_UNUSED(point); RGFW_UNUSED(status);} +static void RGFW_mousePosfuncEMPTY(RGFW_window* win, RGFW_point point, RGFW_point vector) {RGFW_UNUSED(win); RGFW_UNUSED(point); RGFW_UNUSED(vector);} +static void RGFW_dndInitfuncEMPTY(RGFW_window* win, RGFW_point point) {RGFW_UNUSED(win); RGFW_UNUSED(point);} +static void RGFW_windowRefreshfuncEMPTY(RGFW_window* win) {RGFW_UNUSED(win); } +static void RGFW_keyfuncEMPTY(RGFW_window* win, RGFW_key key, u8 keyChar, RGFW_keymod keyMod, RGFW_bool pressed) {RGFW_UNUSED(win); RGFW_UNUSED(key); RGFW_UNUSED(keyChar); RGFW_UNUSED(keyMod); RGFW_UNUSED(pressed);} +static void RGFW_mouseButtonfuncEMPTY(RGFW_window* win, RGFW_mouseButton button, double scroll, RGFW_bool pressed) {RGFW_UNUSED(win); RGFW_UNUSED(button); RGFW_UNUSED(scroll); RGFW_UNUSED(pressed);} +static void RGFW_gamepadButtonfuncEMPTY(RGFW_window* win, u16 gamepad, u8 button, RGFW_bool pressed) {RGFW_UNUSED(win); RGFW_UNUSED(gamepad); RGFW_UNUSED(button); RGFW_UNUSED(pressed); } +static void RGFW_gamepadAxisfuncEMPTY(RGFW_window* win, u16 gamepad, RGFW_point axis[2], u8 axisesCount, u8 whichAxis) {RGFW_UNUSED(win); RGFW_UNUSED(gamepad); RGFW_UNUSED(axis); RGFW_UNUSED(axisesCount); RGFW_UNUSED(whichAxis); } +static void RGFW_gamepadfuncEMPTY(RGFW_window* win, u16 gamepad, RGFW_bool connected) {RGFW_UNUSED(win); RGFW_UNUSED(gamepad); RGFW_UNUSED(connected);} +static void RGFW_dndfuncEMPTY(RGFW_window* win, char** droppedFiles, size_t droppedFilesCount) {RGFW_UNUSED(win); RGFW_UNUSED(droppedFiles); RGFW_UNUSED(droppedFilesCount);} +static void RGFW_scaleUpdatedfuncEMPTY(RGFW_window* win, float scaleX, float scaleY) {RGFW_UNUSED(win); RGFW_UNUSED(scaleX); RGFW_UNUSED(scaleY); } + +#define RGFW_CALLBACK_DEFINE(x, x2) \ +RGFW_##x##func RGFW_##x##Callback = RGFW_##x##funcEMPTY; \ +RGFW_##x##func RGFW_set##x2##Callback(RGFW_##x##func func) { \ + RGFW_##x##func prev = RGFW_##x##Callback; \ + RGFW_##x##Callback = func; \ + return prev; \ +} +RGFW_CALLBACK_DEFINE(windowMaximized, WindowMaximized) +RGFW_CALLBACK_DEFINE(windowMinimized, WindowMinimized) +RGFW_CALLBACK_DEFINE(windowRestored, WindowRestored) +RGFW_CALLBACK_DEFINE(windowMoved, WindowMoved) +RGFW_CALLBACK_DEFINE(windowResized, WindowResized) +RGFW_CALLBACK_DEFINE(windowQuit, WindowQuit) +RGFW_CALLBACK_DEFINE(mousePos, MousePos) +RGFW_CALLBACK_DEFINE(windowRefresh, WindowRefresh) +RGFW_CALLBACK_DEFINE(focus, Focus) +RGFW_CALLBACK_DEFINE(mouseNotify, MouseNotify) +RGFW_CALLBACK_DEFINE(dnd, Dnd) +RGFW_CALLBACK_DEFINE(dndInit, DndInit) +RGFW_CALLBACK_DEFINE(key, Key) +RGFW_CALLBACK_DEFINE(mouseButton, MouseButton) +RGFW_CALLBACK_DEFINE(gamepadButton, GamepadButton) +RGFW_CALLBACK_DEFINE(gamepadAxis, GamepadAxis) +RGFW_CALLBACK_DEFINE(gamepad, Gamepad) +RGFW_CALLBACK_DEFINE(scaleUpdated, ScaleUpdated) +#undef RGFW_CALLBACK_DEFINE + +void RGFW_window_checkEvents(RGFW_window* win, i32 waitMS) { + RGFW_window_eventWait(win, waitMS); + + while (RGFW_window_checkEvent(win) != NULL && RGFW_window_shouldClose(win) == 0) { + if (win->event.type == RGFW_quit) return; + } + + #ifdef RGFW_WASM /* WASM needs to run the sleep function for asyncify */ + RGFW_sleep(0); + #endif +} + +void RGFW_window_checkMode(RGFW_window* win); +void RGFW_window_checkMode(RGFW_window* win) { + if (RGFW_window_isMinimized(win)) { + win->_flags |= RGFW_windowMinimize; + RGFW_windowMinimizedCallback(win, win->r); + } else if (RGFW_window_isMaximized(win)) { + win->_flags |= RGFW_windowMaximize; + RGFW_eventQueuePushEx(e.type = RGFW_windowMaximized; e._win = win); + RGFW_windowMaximizedCallback(win, win->r); + } else if (((win->_flags & RGFW_windowMinimize) && !RGFW_window_isMaximized(win)) || + (win->_flags & RGFW_windowMaximize && !RGFW_window_isMaximized(win))) { + win->_flags &= ~(u32)RGFW_windowMinimize; + if (RGFW_window_isMaximized(win) == RGFW_FALSE) win->_flags &= ~(u32)RGFW_windowMaximize; + RGFW_eventQueuePushEx(e.type = RGFW_windowRestored; e._win = win); + RGFW_windowRestoredCallback(win, win->r); + } +} + +/* +no more event call back defines +*/ + +#define SET_ATTRIB(a, v) { \ + RGFW_ASSERT(((size_t) index + 1) < sizeof(attribs) / sizeof(attribs[0])); \ + attribs[index++] = a; \ + attribs[index++] = v; \ +} + +#define RGFW_EVENT_PASSED RGFW_BIT(24) /* if a queued event was passed */ +#define RGFW_EVENT_QUIT RGFW_BIT(25) /* the window close button was pressed */ +#define RGFW_HOLD_MOUSE RGFW_BIT(26) /*!< hold the moues still */ +#define RGFW_MOUSE_LEFT RGFW_BIT(27) /* if mouse left the window */ +#define RGFW_WINDOW_ALLOC RGFW_BIT(28) /* if window was allocated by RGFW */ +#define RGFW_BUFFER_ALLOC RGFW_BIT(29) /* if window.buffer was allocated by RGFW */ +#define RGFW_WINDOW_INIT RGFW_BIT(30) /* if window.buffer was allocated by RGFW */ +#define RGFW_INTERNAL_FLAGS (RGFW_EVENT_QUIT | RGFW_EVENT_PASSED | RGFW_HOLD_MOUSE | RGFW_MOUSE_LEFT | RGFW_WINDOW_ALLOC | RGFW_BUFFER_ALLOC | RGFW_windowFocus) + +RGFW_window* RGFW_createWindow(const char* name, RGFW_rect rect, RGFW_windowFlags flags) { + RGFW_window* win = (RGFW_window*)RGFW_ALLOC(sizeof(RGFW_window)); + RGFW_ASSERT(win != NULL); + win->_flags = RGFW_WINDOW_ALLOC; + return RGFW_createWindowPtr(name, rect, flags, win); +} + +#if defined(RGFW_USE_XDL) && defined(RGFW_X11) + #define XDL_IMPLEMENTATION + #include "XDL.h" +#endif + +#define RGFW_MAX_EVENTS 32 +typedef struct RGFW_globalStruct { + RGFW_window* root; + RGFW_window* current; + i32 windowCount; + i32 eventLen; + i32 eventIndex; + + #ifdef RGFW_X11 + Display* display; + Window helperWindow; + char* clipboard; /* for writing to the clipboard selection */ + size_t clipboard_len; + #endif + #ifdef RGFW_WAYLAND + struct wl_display* wl_display; + #endif + #if defined(RGFW_X11) || defined(RGFW_WINDOWS) + RGFW_mouse* hiddenMouse; + #endif + RGFW_event events[RGFW_MAX_EVENTS]; + +} RGFW_globalStruct; +#if !defined(RGFW_C89) && !defined(__cplusplus) +RGFW_globalStruct _RGFW = {.root = NULL, .current = NULL, .windowCount = -1, .eventLen = 0, .eventIndex = 0}; +#define _RGFW_init RGFW_TRUE +#else +RGFW_bool _RGFW_init = RGFW_FALSE; +RGFW_globalStruct _RGFW; +#endif + +void RGFW_eventQueuePush(RGFW_event event) { + if (_RGFW.eventLen >= RGFW_MAX_EVENTS) return; + _RGFW.events[_RGFW.eventLen] = event; + _RGFW.eventLen++; +} + +RGFW_event* RGFW_eventQueuePop(RGFW_window* win) { + RGFW_event* ev; + if (_RGFW.eventLen == 0) return NULL; + + ev = (RGFW_event*)&_RGFW.events[_RGFW.eventIndex]; + + _RGFW.eventLen--; + if (_RGFW.eventLen && _RGFW.eventIndex < (_RGFW.eventLen - 1)) + _RGFW.eventIndex++; + else if (_RGFW.eventLen == 0) + _RGFW.eventIndex = 0; + + if (ev->_win != win && ev->_win != NULL) { + RGFW_eventQueuePush(*ev); + return NULL; + } + + ev->droppedFilesCount = win->event.droppedFilesCount; + ev->droppedFiles = win->event.droppedFiles; + return ev; +} + +RGFW_event* RGFW_window_checkEventCore(RGFW_window* win); +RGFW_event* RGFW_window_checkEventCore(RGFW_window* win) { + RGFW_event* ev; + RGFW_ASSERT(win != NULL); + if (win->event.type == 0 && _RGFW.eventLen == 0) + RGFW_resetKeyPrev(); + + if (win->event.type == RGFW_quit && win->_flags & RGFW_windowFreeOnClose) { + static RGFW_event event; + event = win->event; + RGFW_window_close(win); + return &event; + } + + if (win->event.type != RGFW_DNDInit) win->event.type = 0; + + /* check queued events */ + ev = RGFW_eventQueuePop(win); + if (ev != NULL) { + if (ev->type == RGFW_quit) RGFW_window_setShouldClose(win, RGFW_TRUE); + win->event = *ev; + } + else return NULL; + + return &win->event; +} + + +RGFWDEF void RGFW_window_basic_init(RGFW_window* win, RGFW_rect rect, RGFW_windowFlags flags); +void RGFW_setRootWindow(RGFW_window* win) { _RGFW.root = win; } +RGFW_window* RGFW_getRootWindow(void) { return _RGFW.root; } + +/* do a basic initialization for RGFW_window, this is to standard it for each OS */ +void RGFW_window_basic_init(RGFW_window* win, RGFW_rect rect, RGFW_windowFlags flags) { + RGFW_UNUSED(flags); + if (_RGFW.windowCount == -1 || _RGFW_init == RGFW_FALSE) RGFW_init(); + _RGFW.windowCount++; + + /* rect based the requested flags */ + if (_RGFW.root == NULL) { + RGFW_setRootWindow(win); + RGFW_setTime(0); + } + + if (!(win->_flags & RGFW_WINDOW_ALLOC)) win->_flags = 0; + + /* set and init the new window's data */ + win->r = rect; + win->exitKey = RGFW_escape; + win->event.droppedFilesCount = 0; + + win->_flags = 0 | (win->_flags & RGFW_WINDOW_ALLOC); + win->_flags |= flags; + win->event.keyMod = 0; + win->_lastMousePoint.x = 0; + win->_lastMousePoint.y = 0; + + win->event.droppedFiles = (char**)RGFW_ALLOC(RGFW_MAX_PATH * RGFW_MAX_DROPS); + RGFW_ASSERT(win->event.droppedFiles != NULL); + + { + u32 i; + for (i = 0; i < RGFW_MAX_DROPS; i++) + win->event.droppedFiles[i] = (char*)(win->event.droppedFiles + RGFW_MAX_DROPS + (i * RGFW_MAX_PATH)); + } +} + +void RGFW_window_setFlags(RGFW_window* win, RGFW_windowFlags flags) { + RGFW_windowFlags cmpFlags = win->_flags; + if (win->_flags & RGFW_WINDOW_INIT) cmpFlags = 0; + + #ifndef RGFW_NO_MONITOR + if (flags & RGFW_windowScaleToMonitor) RGFW_window_scaleToMonitor(win); + #endif + + if (flags & RGFW_windowCenter) RGFW_window_center(win); + if (flags & RGFW_windowCenterCursor) + RGFW_window_moveMouse(win, RGFW_POINT(win->r.x + (win->r.w / 2), win->r.y + (win->r.h / 2))); + if (flags & RGFW_windowNoBorder) RGFW_window_setBorder(win, 0); + else RGFW_window_setBorder(win, 1); + if (flags & RGFW_windowFullscreen) RGFW_window_setFullscreen(win, RGFW_TRUE); + else if (cmpFlags & RGFW_windowFullscreen) RGFW_window_setFullscreen(win, 0); + if (flags & RGFW_windowMaximize) RGFW_window_maximize(win); + else if (cmpFlags & RGFW_windowMaximize) RGFW_window_restore(win); + if (flags & RGFW_windowMinimize) RGFW_window_minimize(win); + else if (cmpFlags & RGFW_windowMinimize) RGFW_window_restore(win); + if (flags & RGFW_windowHideMouse) RGFW_window_showMouse(win, 0); + else if (cmpFlags & RGFW_windowHideMouse) RGFW_window_showMouse(win, 1); + if (flags & RGFW_windowHide) RGFW_window_hide(win); + else if (cmpFlags & RGFW_windowHide) RGFW_window_show(win); + if (flags & RGFW_windowCocoaCHDirToRes) RGFW_moveToMacOSResourceDir(); + if (flags & RGFW_windowFloating) RGFW_window_setFloating(win, 1); + else if (cmpFlags & RGFW_windowFloating) RGFW_window_setFloating(win, 0); + if (flags & RGFW_windowFocus) RGFW_window_focus(win); + + if (flags & RGFW_windowNoResize) { + RGFW_window_setMaxSize(win, RGFW_AREA(win->r.w, win->r.h)); + RGFW_window_setMinSize(win, RGFW_AREA(win->r.w, win->r.h)); + } else if (cmpFlags & RGFW_windowNoResize) { + RGFW_window_setMaxSize(win, RGFW_AREA(0, 0)); + RGFW_window_setMinSize(win, RGFW_AREA(0, 0)); + } + + win->_flags = flags | (win->_flags & RGFW_INTERNAL_FLAGS); +} + +RGFW_bool RGFW_window_isInFocus(RGFW_window* win) { +#ifdef RGFW_WASM + return RGFW_TRUE; +#else + return RGFW_BOOL(win->_flags & RGFW_windowFocus); +#endif +} + +void RGFW_window_initBuffer(RGFW_window* win) { + RGFW_area area = RGFW_getScreenSize(); + if ((win->_flags & RGFW_windowNoResize)) + area = RGFW_AREA(win->r.w, win->r.h); + + RGFW_window_initBufferSize(win, area); +} + +void RGFW_window_initBufferSize(RGFW_window* win, RGFW_area area) { +#if defined(RGFW_BUFFER) || defined(RGFW_OSMESA) + win->_flags |= RGFW_BUFFER_ALLOC; + #ifndef RGFW_WINDOWS + u8* buffer = (u8*)RGFW_ALLOC(area.w * area.h * 4); + RGFW_ASSERT(buffer != NULL); + + RGFW_window_initBufferPtr(win, buffer, area); + #else /* windows's bitmap allocs memory for us */ + RGFW_window_initBufferPtr(win, (u8*)NULL, area); + #endif +#else + RGFW_UNUSED(win); RGFW_UNUSED(area); +#endif +} + +#ifdef RGFW_MACOS +RGFWDEF void RGFW_window_cocoaSetLayer(RGFW_window* win, void* layer); +RGFWDEF void* RGFW_cocoaGetLayer(void); +#endif + +const char* RGFW_className = NULL; +void RGFW_setClassName(const char* name) { RGFW_className = name; } + +#ifndef RGFW_X11 +void RGFW_setXInstName(const char* name) { RGFW_UNUSED(name); } +#endif + +RGFW_keyState RGFW_mouseButtons[RGFW_mouseFinal] = { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} }; + +RGFW_bool RGFW_isMousePressed(RGFW_window* win, RGFW_mouseButton button) { + return RGFW_mouseButtons[button].current && (win == NULL || RGFW_window_isInFocus(win)); +} +RGFW_bool RGFW_wasMousePressed(RGFW_window* win, RGFW_mouseButton button) { + return RGFW_mouseButtons[button].prev && (win != NULL || RGFW_window_isInFocus(win)); +} +RGFW_bool RGFW_isMouseHeld(RGFW_window* win, RGFW_mouseButton button) { + return (RGFW_isMousePressed(win, button) && RGFW_wasMousePressed(win, button)); +} +RGFW_bool RGFW_isMouseReleased(RGFW_window* win, RGFW_mouseButton button) { + return (!RGFW_isMousePressed(win, button) && RGFW_wasMousePressed(win, button)); +} + +RGFW_point RGFW_window_getMousePoint(RGFW_window* win) { + RGFW_ASSERT(win != NULL); + return win->_lastMousePoint; +} + +RGFW_bool RGFW_isPressed(RGFW_window* win, RGFW_key key) { + return RGFW_keyboard[key].current && (win == NULL || RGFW_window_isInFocus(win)); +} + +RGFW_bool RGFW_wasPressed(RGFW_window* win, RGFW_key key) { + return RGFW_keyboard[key].prev && (win == NULL || RGFW_window_isInFocus(win)); +} + +RGFW_bool RGFW_isHeld(RGFW_window* win, RGFW_key key) { + return (RGFW_isPressed(win, key) && RGFW_wasPressed(win, key)); +} + +RGFW_bool RGFW_isClicked(RGFW_window* win, RGFW_key key) { + return (RGFW_wasPressed(win, key) && !RGFW_isPressed(win, key)); +} + +RGFW_bool RGFW_isReleased(RGFW_window* win, RGFW_key key) { + return (!RGFW_isPressed(win, key) && RGFW_wasPressed(win, key)); +} + +void RGFW_window_makeCurrent(RGFW_window* win) { + _RGFW.current = win; +#if defined(RGFW_OPENGL) || defined(RGFW_EGL) + RGFW_window_makeCurrent_OpenGL(win); +#endif +} + +RGFW_window* RGFW_getCurrent(void) { + return _RGFW.current; +} + +void RGFW_window_swapBuffers(RGFW_window* win) { + RGFW_ASSERT(win != NULL); + RGFW_window_swapBuffers_software(win); +#if defined(RGFW_OPENGL) || defined(RGFW_EGL) + RGFW_window_swapBuffers_OpenGL(win); +#endif +} + +RGFWDEF void RGFW_setBit(u32* data, u32 bit, RGFW_bool value); +void RGFW_setBit(u32* data, u32 bit, RGFW_bool value) { + if (value) + *data |= bit; + else if (!value && (*(data) & bit)) + *data ^= bit; +} + +void RGFW_window_center(RGFW_window* win) { + RGFW_ASSERT(win != NULL); + RGFW_area screenR = RGFW_getScreenSize(); + RGFW_window_move(win, RGFW_POINT((i32)(screenR.w - (u32)win->r.w) / 2, (screenR.h - (u32)win->r.h) / 2)); +} + +RGFW_bool RGFW_monitor_scaleToWindow(RGFW_monitor mon, RGFW_window* win) { + RGFW_monitorMode mode; + RGFW_ASSERT(win != NULL); + + mode.area.w = (u32)win->r.w; + mode.area.h = (u32)win->r.h; + return RGFW_monitor_requestMode(mon, mode, RGFW_monitorScale); +} + +void RGFW_splitBPP(u32 bpp, RGFW_monitorMode* mode); +void RGFW_splitBPP(u32 bpp, RGFW_monitorMode* mode) { + if (bpp == 32) bpp = 24; + mode->red = mode->green = mode->blue = (u8)(bpp / 3); + + u32 delta = bpp - (mode->red * 3); /* handle leftovers */ + if (delta >= 1) mode->green = mode->green + 1; + if (delta == 2) mode->red = mode->red + 1; +} + +RGFW_bool RGFW_monitorModeCompare(RGFW_monitorMode mon, RGFW_monitorMode mon2, RGFW_modeRequest request) { + return (((mon.area.w == mon2.area.w && mon.area.h == mon2.area.h) || !(request & RGFW_monitorScale)) && + ((mon.refreshRate == mon2.refreshRate) || !(request & RGFW_monitorRefresh)) && + ((mon.red == mon2.red && mon.green == mon2.green && mon.blue == mon2.blue) || !(request & RGFW_monitorRGB))); +} + +RGFW_bool RGFW_window_shouldClose(RGFW_window* win) { + return (win == NULL || (win->_flags & RGFW_EVENT_QUIT)|| (win->exitKey && RGFW_isPressed(win, win->exitKey))); +} + +void RGFW_window_setShouldClose(RGFW_window* win, RGFW_bool shouldClose) { + if (shouldClose) { + win->_flags |= RGFW_EVENT_QUIT; + RGFW_windowQuitCallback(win); + } else { + win->_flags &= ~(u32)RGFW_EVENT_QUIT; + } +} + +#ifndef RGFW_NO_MONITOR +void RGFW_window_scaleToMonitor(RGFW_window* win) { + RGFW_monitor monitor = RGFW_window_getMonitor(win); + if (monitor.scaleX == 0 && monitor.scaleY == 0) + return; + + RGFW_window_resize(win, RGFW_AREA((u32)(monitor.scaleX * (float)win->r.w), (u32)(monitor.scaleY * (float)win->r.h))); +} + +void RGFW_window_moveToMonitor(RGFW_window* win, RGFW_monitor m) { + RGFW_window_move(win, RGFW_POINT(m.x + win->r.x, m.y + win->r.y)); +} +#endif + +RGFW_bool RGFW_window_setIcon(RGFW_window* win, u8* icon, RGFW_area a, i32 channels) { + return RGFW_window_setIconEx(win, icon, a, channels, RGFW_iconBoth); +} + +RGFWDEF void RGFW_captureCursor(RGFW_window* win, RGFW_rect); +RGFWDEF void RGFW_releaseCursor(RGFW_window* win); + + +RGFW_bool RGFW_window_mouseHeld(RGFW_window* win) { return RGFW_BOOL(win->_flags & RGFW_HOLD_MOUSE); } + +void RGFW_window_mouseHold(RGFW_window* win, RGFW_area area) { + if (!area.w && !area.h) + area = RGFW_AREA(win->r.w / 2, win->r.h / 2); + + win->_flags |= RGFW_HOLD_MOUSE; + RGFW_captureCursor(win, win->r); + RGFW_window_moveMouse(win, RGFW_POINT(win->r.x + (win->r.w / 2), win->r.y + (win->r.h / 2))); +} + +void RGFW_window_mouseUnhold(RGFW_window* win) { + win->_flags &= ~(u32)RGFW_HOLD_MOUSE; + RGFW_releaseCursor(win); +} + +u32 RGFW_checkFPS(double startTime, u32 frameCount, u32 fpsCap) { + double deltaTime = RGFW_getTime() - startTime; + if (deltaTime == 0) return 0; + + double fps = (frameCount / deltaTime); /* the numer of frames over the time it took for them to render */ + if (fpsCap && fps > fpsCap) { + double frameTime = (double)frameCount / (double)fpsCap; /* how long it should take to finish the frames */ + double sleepTime = frameTime - deltaTime; /* subtract how long it should have taken with how long it did take */ + + if (sleepTime > 0) RGFW_sleep((u32)(sleepTime * 1000)); + } + + return (u32) fps; +} + +#if defined(RGFW_OSMESA) || defined(RGFW_BUFFER) +void RGFW_RGB_to_BGR(RGFW_window* win, u8* data) { + #if !defined(RGFW_BUFFER_BGR) && !defined(RGFW_OSMESA) + u32 x, y; + for (y = 0; y < (u32)win->r.h; y++) { + for (x = 0; x < (u32)win->r.w; x++) { + u32 index = (y * 4 * win->bufferSize.w) + x * 4; + + u8 red = data[index]; + data[index] = win->buffer[index + 2]; + data[index + 2] = red; + } + } + #elif defined(RGFW_OSMESA) + u32 y; + for(y = 0; y < (u32)win->r.h; y++){ + u32 index_from = (y + (win->bufferSize.h - win->r.h)) * 4 * win->bufferSize.w; + u32 index_to = y * 4 * win->bufferSize.w; + memcpy(&data[index_to], &data[index_from], 4 * win->bufferSize.w); + } + #else + RGFW_UNUSED(win); RGFW_UNUSED(data); + #endif +} +#endif + +u32 RGFW_isPressedGamepad(RGFW_window* win, u8 c, RGFW_gamepadCodes button) { + RGFW_UNUSED(win); + return RGFW_gamepadPressed[c][button].current; +} +u32 RGFW_wasPressedGamepad(RGFW_window* win, u8 c, RGFW_gamepadCodes button) { + RGFW_UNUSED(win); + return RGFW_gamepadPressed[c][button].prev; +} +u32 RGFW_isReleasedGamepad(RGFW_window* win, u8 controller, RGFW_gamepadCodes button) { + RGFW_UNUSED(win); + return !RGFW_isPressedGamepad(win, controller, button) && RGFW_wasPressedGamepad(win, controller, button); +} +u32 RGFW_isHeldGamepad(RGFW_window* win, u8 controller, RGFW_gamepadCodes button) { + RGFW_UNUSED(win); + return RGFW_isPressedGamepad(win, controller, button) && RGFW_wasPressedGamepad(win, controller, button); +} + +RGFW_point RGFW_getGamepadAxis(RGFW_window* win, u16 controller, u16 whichAxis) { + RGFW_UNUSED(win); + return RGFW_gamepadAxes[controller][whichAxis]; +} +const char* RGFW_getGamepadName(RGFW_window* win, u16 controller) { + RGFW_UNUSED(win); + return (const char*)RGFW_gamepads_name[controller]; +} + +size_t RGFW_getGamepadCount(RGFW_window* win) { + RGFW_UNUSED(win); + return RGFW_gamepadCount; +} + +RGFW_gamepadType RGFW_getGamepadType(RGFW_window* win, u16 controller) { + RGFW_UNUSED(win); + return RGFW_gamepads_type[controller]; +} + +RGFWDEF void RGFW_updateKeyMod(RGFW_window* win, RGFW_keymod mod, RGFW_bool value); +void RGFW_updateKeyMod(RGFW_window* win, RGFW_keymod mod, RGFW_bool value) { + if (value) win->event.keyMod |= mod; + else win->event.keyMod &= ~mod; +} + +RGFWDEF void RGFW_updateKeyModsPro(RGFW_window* win, RGFW_bool capital, RGFW_bool numlock, RGFW_bool control, RGFW_bool alt, RGFW_bool shift, RGFW_bool super, RGFW_bool scroll); +void RGFW_updateKeyModsPro(RGFW_window* win, RGFW_bool capital, RGFW_bool numlock, RGFW_bool control, RGFW_bool alt, RGFW_bool shift, RGFW_bool super, RGFW_bool scroll) { + RGFW_updateKeyMod(win, RGFW_modCapsLock, capital); + RGFW_updateKeyMod(win, RGFW_modNumLock, numlock); + RGFW_updateKeyMod(win, RGFW_modControl, control); + RGFW_updateKeyMod(win, RGFW_modAlt, alt); + RGFW_updateKeyMod(win, RGFW_modShift, shift); + RGFW_updateKeyMod(win, RGFW_modSuper, super); + RGFW_updateKeyMod(win, RGFW_modScrollLock, scroll); +} + +RGFWDEF void RGFW_updateKeyMods(RGFW_window* win, RGFW_bool capital, RGFW_bool numlock, RGFW_bool scroll); +void RGFW_updateKeyMods(RGFW_window* win, RGFW_bool capital, RGFW_bool numlock, RGFW_bool scroll) { + RGFW_updateKeyModsPro(win, capital, numlock, + RGFW_isPressed(win, RGFW_controlL) || RGFW_isPressed(win, RGFW_controlR), + RGFW_isPressed(win, RGFW_altL) || RGFW_isPressed(win, RGFW_altR), + RGFW_isPressed(win, RGFW_shiftL) || RGFW_isPressed(win, RGFW_shiftR), + RGFW_isPressed(win, RGFW_superL) || RGFW_isPressed(win, RGFW_superR), + scroll); +} + +RGFWDEF void RGFW_window_showMouseFlags(RGFW_window* win, RGFW_bool show); +void RGFW_window_showMouseFlags(RGFW_window* win, RGFW_bool show) { + if (show && (win->_flags & RGFW_windowHideMouse)) + win->_flags ^= RGFW_windowHideMouse; + else if (!show && !(win->_flags & RGFW_windowHideMouse)) + win->_flags |= RGFW_windowHideMouse; +} + +RGFW_bool RGFW_window_mouseHidden(RGFW_window* win) { + return (RGFW_bool)RGFW_BOOL(win->_flags & RGFW_windowHideMouse); +} + +RGFW_bool RGFW_window_borderless(RGFW_window* win) { + return (RGFW_bool)RGFW_BOOL(win->_flags & RGFW_windowNoBorder); +} + +RGFW_bool RGFW_window_isFullscreen(RGFW_window* win){ return RGFW_BOOL(win->_flags & RGFW_windowFullscreen); } +RGFW_bool RGFW_window_allowsDND(RGFW_window* win) { return RGFW_BOOL(win->_flags & RGFW_windowAllowDND); } + +#ifndef RGFW_WINDOWS +void RGFW_window_setDND(RGFW_window* win, RGFW_bool allow) { + RGFW_setBit(&win->_flags, RGFW_windowAllowDND, allow); +} +#endif + +#if defined(RGFW_X11) || defined(RGFW_MACOS) || defined(RGFW_WASM) || defined(RGFW_WAYLAND) +#ifndef __USE_POSIX199309 + #define __USE_POSIX199309 +#endif +#include +struct timespec; +#endif + +#if defined(RGFW_X11) || defined(RGFW_WINDOWS) +void RGFW_window_showMouse(RGFW_window* win, RGFW_bool show) { + RGFW_window_showMouseFlags(win, show); + if (show == 0) + RGFW_window_setMouse(win, _RGFW.hiddenMouse); + else + RGFW_window_setMouseDefault(win); +} +#endif + +#ifndef RGFW_MACOS +void RGFW_moveToMacOSResourceDir(void) { } +#endif + +/* + graphics API specific code (end of generic code) + starts here +*/ + + +/* + OpenGL defines start here (Normal, EGL, OSMesa) +*/ + +#if defined(RGFW_OPENGL) || defined(RGFW_EGL) + +#ifdef RGFW_WINDOWS + #define WIN32_LEAN_AND_MEAN + #define OEMRESOURCE + #include +#endif + +#if !defined(__APPLE__) && !defined(RGFW_NO_GL_HEADER) + #include +#elif defined(__APPLE__) + #ifndef GL_SILENCE_DEPRECATION + #define GL_SILENCE_DEPRECATION + #endif + #include + #include +#endif + +/* EGL, normal OpenGL only */ +#ifndef RGFW_EGL +i32 RGFW_GL_HINTS[RGFW_glFinalHint] = {8, +#else +i32 RGFW_GL_HINTS[RGFW_glFinalHint] = {0, +#endif + 0, 0, 0, 1, 8, 8, 8, 8, 24, 0, 0, 0, 0, 0, 0, 0, 0, RGFW_glReleaseNone, RGFW_glCore, 0, 0}; + +void RGFW_setGLHint(RGFW_glHints hint, i32 value) { + if (hint < RGFW_glFinalHint && hint) RGFW_GL_HINTS[hint] = value; +} + +RGFW_bool RGFW_extensionSupportedStr(const char* extensions, const char* ext, size_t len) { + const char *start = extensions; + const char *where; + const char* terminator; + + if (extensions == NULL || ext == NULL) + return RGFW_FALSE; + + where = strstr(extensions, ext); + while (where) { + terminator = where + len; + if ((where == start || *(where - 1) == ' ') && + (*terminator == ' ' || *terminator == '\0')) { + return RGFW_TRUE; + } + where = RGFW_STRSTR(terminator, ext); + } + + return RGFW_FALSE; +} + +RGFW_bool RGFW_extensionSupported(const char* extension, size_t len) { + #ifdef GL_NUM_EXTENSIONS + if (RGFW_GL_HINTS[RGFW_glMajor] >= 3) { + i32 i; + GLint count = 0; + + RGFW_proc RGFW_glGetStringi = RGFW_getProcAddress("glGetStringi"); + RGFW_proc RGFW_glGetIntegerv = RGFW_getProcAddress("RGFW_glGetIntegerv"); + if (RGFW_glGetIntegerv) + ((void(*)(GLenum, GLint*))RGFW_glGetIntegerv)(GL_NUM_EXTENSIONS, &count); + + for (i = 0; RGFW_glGetStringi && i < count; i++) { + const char* en = ((const char* (*)(u32, u32))RGFW_glGetStringi)(GL_EXTENSIONS, (u32)i); + if (en && RGFW_STRNCMP(en, extension, len) == 0) + return RGFW_TRUE; + } + } else +#endif + { + RGFW_proc RGFW_glGetString = RGFW_getProcAddress("glGetString"); + + if (RGFW_glGetString) { + const char* extensions = ((const char*(*)(u32))RGFW_glGetString)(GL_EXTENSIONS); + if ((extensions != NULL) && RGFW_extensionSupportedStr(extensions, extension, len)) + return RGFW_TRUE; + } + } + + return RGFW_extensionSupportedPlatform(extension, len); +} + +/* OPENGL normal only (no EGL / OSMesa) */ +#if defined(RGFW_OPENGL) && !defined(RGFW_EGL) && !defined(RGFW_CUSTOM_BACKEND) && !defined(RGFW_WASM) + +#define RGFW_GL_RENDER_TYPE RGFW_OS_BASED_VALUE(GLX_X_VISUAL_TYPE, 0x2003, 73, 0) + #define RGFW_GL_ALPHA_SIZE RGFW_OS_BASED_VALUE(GLX_ALPHA_SIZE, 0x201b, 11, 0) + #define RGFW_GL_DEPTH_SIZE RGFW_OS_BASED_VALUE(GLX_DEPTH_SIZE, 0x2022, 12, 0) + #define RGFW_GL_DOUBLEBUFFER RGFW_OS_BASED_VALUE(GLX_DOUBLEBUFFER, 0x2011, 5, 0) + #define RGFW_GL_STENCIL_SIZE RGFW_OS_BASED_VALUE(GLX_STENCIL_SIZE, 0x2023, 13, 0) + #define RGFW_GL_SAMPLES RGFW_OS_BASED_VALUE(GLX_SAMPLES, 0x2042, 55, 0) + #define RGFW_GL_STEREO RGFW_OS_BASED_VALUE(GLX_STEREO, 0x2012, 6, 0) + #define RGFW_GL_AUX_BUFFERS RGFW_OS_BASED_VALUE(GLX_AUX_BUFFERS, 0x2024, 7, 0) + +#if defined(RGFW_X11) || defined(RGFW_WINDOWS) + #define RGFW_GL_DRAW RGFW_OS_BASED_VALUE(GLX_X_RENDERABLE, 0x2001, 0, 0) + #define RGFW_GL_DRAW_TYPE RGFW_OS_BASED_VALUE(GLX_RENDER_TYPE, 0x2013, 0, 0) + #define RGFW_GL_FULL_FORMAT RGFW_OS_BASED_VALUE(GLX_TRUE_COLOR, 0x2027, 0, 0) + #define RGFW_GL_RED_SIZE RGFW_OS_BASED_VALUE(GLX_RED_SIZE, 0x2015, 0, 0) + #define RGFW_GL_GREEN_SIZE RGFW_OS_BASED_VALUE(GLX_GREEN_SIZE, 0x2017, 0, 0) + #define RGFW_GL_BLUE_SIZE RGFW_OS_BASED_VALUE(GLX_BLUE_SIZE, 0x2019, 0, 0) + #define RGFW_GL_USE_RGBA RGFW_OS_BASED_VALUE(GLX_RGBA_BIT, 0x202B, 0, 0) + #define RGFW_GL_ACCUM_RED_SIZE RGFW_OS_BASED_VALUE(14, 0x201E, 0, 0) + #define RGFW_GL_ACCUM_GREEN_SIZE RGFW_OS_BASED_VALUE(15, 0x201F, 0, 0) + #define RGFW_GL_ACCUM_BLUE_SIZE RGFW_OS_BASED_VALUE(16, 0x2020, 0, 0) + #define RGFW_GL_ACCUM_ALPHA_SIZE RGFW_OS_BASED_VALUE(17, 0x2021, 0, 0) + #define RGFW_GL_SRGB RGFW_OS_BASED_VALUE(0x20b2, 0x3089, 0, 0) + #define RGFW_GL_NOERROR RGFW_OS_BASED_VALUE(0x31b3, 0x31b3, 0, 0) + #define RGFW_GL_FLAGS RGFW_OS_BASED_VALUE(GLX_CONTEXT_FLAGS_ARB, 0x2094, 0, 0) + #define RGFW_GL_RELEASE_BEHAVIOR RGFW_OS_BASED_VALUE(GLX_CONTEXT_RELEASE_BEHAVIOR_ARB, 0x2097 , 0, 0) + #define RGFW_GL_CONTEXT_RELEASE RGFW_OS_BASED_VALUE(GLX_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB, 0x2098, 0, 0) + #define RGFW_GL_CONTEXT_NONE RGFW_OS_BASED_VALUE(GLX_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB, 0x0000, 0, 0) + #define RGFW_GL_FLAGS RGFW_OS_BASED_VALUE(GLX_CONTEXT_FLAGS_ARB, 0x2094, 0, 0) + #define RGFW_GL_DEBUG_BIT RGFW_OS_BASED_VALUE(GLX_CONTEXT_FLAGS_ARB, 0x2094, 0, 0) + #define RGFW_GL_ROBUST_BIT RGFW_OS_BASED_VALUE(GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB, 0x00000004, 0, 0) +#endif + +#ifdef RGFW_WINDOWS + #define WGL_SUPPORT_OPENGL_ARB 0x2010 + #define WGL_COLOR_BITS_ARB 0x2014 + #define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 + #define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 + #define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 + #define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 + #define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 + #define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 + #define WGL_SAMPLE_BUFFERS_ARB 0x2041 + #define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20a9 + #define WGL_PIXEL_TYPE_ARB 0x2013 + #define WGL_TYPE_RGBA_ARB 0x202B + + #define WGL_TRANSPARENT_ARB 0x200A +#endif + +/* The window'ing api needs to know how to render the data we (or opengl) give it + MacOS and Windows do this using a structure called a "pixel format" + X11 calls it a "Visual" + This function returns the attributes for the format we want */ +i32* RGFW_initFormatAttribs(u32 useSoftware); +i32* RGFW_initFormatAttribs(u32 useSoftware) { + RGFW_UNUSED(useSoftware); + static i32 attribs[] = { + #if defined(RGFW_X11) || defined(RGFW_WINDOWS) + RGFW_GL_RENDER_TYPE, + RGFW_GL_FULL_FORMAT, + RGFW_GL_DRAW, 1, + RGFW_GL_DRAW_TYPE , RGFW_GL_USE_RGBA, + #endif + + #ifdef RGFW_X11 + GLX_DRAWABLE_TYPE , GLX_WINDOW_BIT, + #endif + + #ifdef RGFW_MACOS + 72, + 8, 24, + #endif + + #ifdef RGFW_WINDOWS + WGL_SUPPORT_OPENGL_ARB, 1, + WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB, + WGL_COLOR_BITS_ARB, 32, + #endif + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + + size_t index = (sizeof(attribs) / sizeof(attribs[0])) - 27; + + #define RGFW_GL_ADD_ATTRIB(attrib, attVal) \ + if (attVal) { \ + attribs[index] = attrib;\ + attribs[index + 1] = attVal;\ + index += 2;\ + } + + #if defined(RGFW_MACOS) && defined(RGFW_COCOA_GRAPHICS_SWITCHING) + RGFW_GL_ADD_ATTRIB(96, kCGLPFASupportsAutomaticGraphicsSwitching); + #endif + + RGFW_GL_ADD_ATTRIB(RGFW_GL_DOUBLEBUFFER, 1); + + RGFW_GL_ADD_ATTRIB(RGFW_GL_ALPHA_SIZE, RGFW_GL_HINTS[RGFW_glAlpha]); + RGFW_GL_ADD_ATTRIB(RGFW_GL_DEPTH_SIZE, RGFW_GL_HINTS[RGFW_glDepth]); + RGFW_GL_ADD_ATTRIB(RGFW_GL_STENCIL_SIZE, RGFW_GL_HINTS[RGFW_glStencil]); + RGFW_GL_ADD_ATTRIB(RGFW_GL_STEREO, RGFW_GL_HINTS[RGFW_glStereo]); + RGFW_GL_ADD_ATTRIB(RGFW_GL_AUX_BUFFERS, RGFW_GL_HINTS[RGFW_glAuxBuffers]); + + #if defined(RGFW_X11) || defined(RGFW_WINDOWS) + RGFW_GL_ADD_ATTRIB(RGFW_GL_RED_SIZE, RGFW_GL_HINTS[RGFW_glRed]); + RGFW_GL_ADD_ATTRIB(RGFW_GL_GREEN_SIZE, RGFW_GL_HINTS[RGFW_glBlue]); + RGFW_GL_ADD_ATTRIB(RGFW_GL_BLUE_SIZE, RGFW_GL_HINTS[RGFW_glGreen]); + #endif + + #if defined(RGFW_X11) || defined(RGFW_WINDOWS) + RGFW_GL_ADD_ATTRIB(RGFW_GL_ACCUM_RED_SIZE, RGFW_GL_HINTS[RGFW_glAccumRed]); + RGFW_GL_ADD_ATTRIB(RGFW_GL_ACCUM_GREEN_SIZE, RGFW_GL_HINTS[RGFW_glAccumBlue]); + RGFW_GL_ADD_ATTRIB(RGFW_GL_ACCUM_BLUE_SIZE, RGFW_GL_HINTS[RGFW_glAccumGreen]); + RGFW_GL_ADD_ATTRIB(RGFW_GL_ACCUM_ALPHA_SIZE, RGFW_GL_HINTS[RGFW_glAccumAlpha]); + RGFW_GL_ADD_ATTRIB(RGFW_GL_SRGB, RGFW_GL_HINTS[RGFW_glSRGB]); + RGFW_GL_ADD_ATTRIB(RGFW_GL_NOERROR, RGFW_GL_HINTS[RGFW_glNoError]); + + if (RGFW_GL_HINTS[RGFW_glReleaseBehavior] == RGFW_releaseFlush) { + RGFW_GL_ADD_ATTRIB(RGFW_GL_RELEASE_BEHAVIOR, RGFW_GL_CONTEXT_RELEASE); + } else if (RGFW_GL_HINTS[RGFW_glReleaseBehavior] == RGFW_glReleaseNone) { + RGFW_GL_ADD_ATTRIB(RGFW_GL_RELEASE_BEHAVIOR, RGFW_GL_CONTEXT_NONE); + } + + i32 flags = 0; + if (RGFW_GL_HINTS[RGFW_glDebug]) flags |= RGFW_GL_DEBUG_BIT; + if (RGFW_GL_HINTS[RGFW_glRobustness]) flags |= RGFW_GL_ROBUST_BIT; + RGFW_GL_ADD_ATTRIB(RGFW_GL_FLAGS, flags); + #else + i32 accumSize = (i32)(RGFW_GL_HINTS[RGFW_glAccumRed] + RGFW_GL_HINTS[RGFW_glAccumGreen] + RGFW_GL_HINTS[RGFW_glAccumBlue] + RGFW_GL_HINTS[RGFW_glAccumAlpha]) / 4; + RGFW_GL_ADD_ATTRIB(14, accumSize); + #endif + + #ifndef RGFW_X11 + RGFW_GL_ADD_ATTRIB(RGFW_GL_SAMPLES, RGFW_GL_HINTS[RGFW_glSamples]); + #endif + + #ifdef RGFW_MACOS + if (useSoftware) { + RGFW_GL_ADD_ATTRIB(70, kCGLRendererGenericFloatID); + } else { + attribs[index] = RGFW_GL_RENDER_TYPE; + index += 1; + } + #endif + + #ifdef RGFW_MACOS + /* macOS has the surface attribs and the opengl attribs connected for some reason + maybe this is to give macOS more control to limit openGL/the opengl version? */ + + attribs[index] = 99; + attribs[index + 1] = 0x1000; + + + if (RGFW_GL_HINTS[RGFW_glMajor] >= 4 || RGFW_GL_HINTS[RGFW_glMajor] >= 3) { + attribs[index + 1] = (i32) ((RGFW_GL_HINTS[RGFW_glMajor] >= 4) ? 0x4100 : 0x3200); + } + #endif + + RGFW_GL_ADD_ATTRIB(0, 0); + + return attribs; +} + +/* EGL only (no OSMesa nor normal OPENGL) */ +#elif defined(RGFW_EGL) + +#include + +#if defined(RGFW_LINK_EGL) + typedef EGLBoolean(EGLAPIENTRY* PFN_eglInitialize)(EGLDisplay, EGLint*, EGLint*); + + PFNEGLINITIALIZEPROC eglInitializeSource; + PFNEGLGETCONFIGSPROC eglGetConfigsSource; + PFNEGLCHOOSECONFIgamepadROC eglChooseConfigSource; + PFNEGLCREATEWINDOWSURFACEPROC eglCreateWindowSurfaceSource; + PFNEGLCREATECONTEXTPROC eglCreateContextSource; + PFNEGLMAKECURRENTPROC eglMakeCurrentSource; + PFNEGLGETDISPLAYPROC eglGetDisplaySource; + PFNEGLSWAPBUFFERSPROC eglSwapBuffersSource; + PFNEGLSWAPINTERVALPROC eglSwapIntervalSource; + PFNEGLBINDAPIPROC eglBindAPISource; + PFNEGLDESTROYCONTEXTPROC eglDestroyContextSource; + PFNEGLTERMINATEPROC eglTerminateSource; + PFNEGLDESTROYSURFACEPROC eglDestroySurfaceSource; + + #define eglInitialize eglInitializeSource + #define eglGetConfigs eglGetConfigsSource + #define eglChooseConfig eglChooseConfigSource + #define eglCreateWindowSurface eglCreateWindowSurfaceSource + #define eglCreateContext eglCreateContextSource + #define eglMakeCurrent eglMakeCurrentSource + #define eglGetDisplay eglGetDisplaySource + #define eglSwapBuffers eglSwapBuffersSource + #define eglSwapInterval eglSwapIntervalSource + #define eglBindAPI eglBindAPISource + #define eglDestroyContext eglDestroyContextSource + #define eglTerminate eglTerminateSource + #define eglDestroySurface eglDestroySurfaceSource; +#endif + + +#define EGL_SURFACE_MAJOR_VERSION_KHR 0x3098 +#define EGL_SURFACE_MINOR_VERSION_KHR 0x30fb + +#ifndef RGFW_GL_ADD_ATTRIB +#define RGFW_GL_ADD_ATTRIB(attrib, attVal) \ + if (attVal) { \ + attribs[index] = attrib;\ + attribs[index + 1] = attVal;\ + index += 2;\ + } +#endif + + +void RGFW_window_initOpenGL(RGFW_window* win, RGFW_bool software) { + RGFW_UNUSED(software); +#if defined(RGFW_LINK_EGL) + eglInitializeSource = (PFNEGLINITIALIZEPROC) eglGetProcAddress("eglInitialize"); + eglGetConfigsSource = (PFNEGLGETCONFIGSPROC) eglGetProcAddress("eglGetConfigs"); + eglChooseConfigSource = (PFNEGLCHOOSECONFIgamepadROC) eglGetProcAddress("eglChooseConfig"); + eglCreateWindowSurfaceSource = (PFNEGLCREATEWINDOWSURFACEPROC) eglGetProcAddress("eglCreateWindowSurface"); + eglCreateContextSource = (PFNEGLCREATECONTEXTPROC) eglGetProcAddress("eglCreateContext"); + eglMakeCurrentSource = (PFNEGLMAKECURRENTPROC) eglGetProcAddress("eglMakeCurrent"); + eglGetDisplaySource = (PFNEGLGETDISPLAYPROC) eglGetProcAddress("eglGetDisplay"); + eglSwapBuffersSource = (PFNEGLSWAPBUFFERSPROC) eglGetProcAddress("eglSwapBuffers"); + eglSwapIntervalSource = (PFNEGLSWAPINTERVALPROC) eglGetProcAddress("eglSwapInterval"); + eglBindAPISource = (PFNEGLBINDAPIPROC) eglGetProcAddress("eglBindAPI"); + eglDestroyContextSource = (PFNEGLDESTROYCONTEXTPROC) eglGetProcAddress("eglDestroyContext"); + eglTerminateSource = (PFNEGLTERMINATEPROC) eglGetProcAddress("eglTerminate"); + eglDestroySurfaceSource = (PFNEGLDESTROYSURFACEPROC) eglGetProcAddress("eglDestroySurface"); + + RGFW_ASSERT(eglInitializeSource != NULL && + eglGetConfigsSource != NULL && + eglChooseConfigSource != NULL && + eglCreateWindowSurfaceSource != NULL && + eglCreateContextSource != NULL && + eglMakeCurrentSource != NULL && + eglGetDisplaySource != NULL && + eglSwapBuffersSource != NULL && + eglSwapIntervalsSource != NULL && + eglBindAPISource != NULL && + eglDestroyContextSource != NULL && + eglTerminateSource != NULL && + eglDestroySurfaceSource != NULL); +#endif /* RGFW_LINK_EGL */ + +#ifdef RGFW_WAYLAND + if (RGFW_useWaylandBool) + win->src.eglWindow = wl_egl_window_create(win->src.surface, win->r.w, win->r.h); +#endif + + #ifdef RGFW_WINDOWS + win->src.EGL_display = eglGetDisplay((EGLNativeDisplayType) win->src.hdc); + #elif defined(RGFW_MACOS) + win->src.EGL_display = eglGetDisplay((EGLNativeDisplayType)0); + #elif defined(RGFW_WAYLAND) + if (RGFW_useWaylandBool) + win->src.EGL_display = eglGetDisplay((EGLNativeDisplayType) win->src.wl_display); + else + win->src.EGL_display = eglGetDisplay((EGLNativeDisplayType) win->src.display); + #else + win->src.EGL_display = eglGetDisplay((EGLNativeDisplayType) win->src.display); + #endif + + EGLint major, minor; + + eglInitialize(win->src.EGL_display, &major, &minor); + + #ifndef EGL_OPENGL_ES1_BIT + #define EGL_OPENGL_ES1_BIT 0x1 + #endif + + EGLint egl_config[24] = { + EGL_SURFACE_TYPE, EGL_WINDOW_BIT, + EGL_RENDERABLE_TYPE, + #ifdef RGFW_OPENGL_ES1 + EGL_OPENGL_ES1_BIT, + #elif defined(RGFW_OPENGL_ES3) + EGL_OPENGL_ES3_BIT, + #elif defined(RGFW_OPENGL_ES2) + EGL_OPENGL_ES2_BIT, + #else + EGL_OPENGL_BIT, + #endif + EGL_NONE, EGL_NONE + }; + + { + size_t index = 7; + EGLint* attribs = egl_config; + + RGFW_GL_ADD_ATTRIB(EGL_RED_SIZE, RGFW_GL_HINTS[RGFW_glRed]); + RGFW_GL_ADD_ATTRIB(EGL_GREEN_SIZE, RGFW_GL_HINTS[RGFW_glBlue]); + RGFW_GL_ADD_ATTRIB(EGL_BLUE_SIZE, RGFW_GL_HINTS[RGFW_glGreen]); + RGFW_GL_ADD_ATTRIB(EGL_ALPHA_SIZE, RGFW_GL_HINTS[RGFW_glAlpha]); + RGFW_GL_ADD_ATTRIB(EGL_DEPTH_SIZE, RGFW_GL_HINTS[RGFW_glDepth]); + + if (RGFW_GL_HINTS[RGFW_glSRGB]) + RGFW_GL_ADD_ATTRIB(0x3089, RGFW_GL_HINTS[RGFW_glSRGB]); + + RGFW_GL_ADD_ATTRIB(EGL_NONE, EGL_NONE); + } + + EGLConfig config; + EGLint numConfigs; + eglChooseConfig(win->src.EGL_display, egl_config, &config, 1, &numConfigs); + + #if defined(RGFW_MACOS) + void* layer = RGFW_cocoaGetLayer(); + + RGFW_window_cocoaSetLayer(win, layer); + + win->src.EGL_surface = eglCreateWindowSurface(win->src.EGL_display, config, (EGLNativeWindowType) layer, NULL); + #elif defined(RGFW_WINDOWS) + win->src.EGL_surface = eglCreateWindowSurface(win->src.EGL_display, config, (EGLNativeWindowType) win->src.window, NULL); + #elif defined(RGFW_WAYLAND) + if (RGFW_useWaylandBool) + win->src.EGL_surface = eglCreateWindowSurface(win->src.EGL_display, config, (EGLNativeWindowType) win->src.eglWindow, NULL); + else + win->src.EGL_surface = eglCreateWindowSurface(win->src.EGL_display, config, (EGLNativeWindowType) win->src.window, NULL); + #else + win->src.EGL_surface = eglCreateWindowSurface(win->src.EGL_display, config, (EGLNativeWindowType) win->src.window, NULL); + #endif + + EGLint attribs[12]; + size_t index = 0; + +#ifdef RGFW_OPENGL_ES1 + RGFW_GL_ADD_ATTRIB(EGL_CONTEXT_CLIENT_VERSION, 1); +#elif defined(RGFW_OPENGL_ES2) + RGFW_GL_ADD_ATTRIB(EGL_CONTEXT_CLIENT_VERSION, 2); +#elif defined(RGFW_OPENGL_ES3) + RGFW_GL_ADD_ATTRIB(EGL_CONTEXT_CLIENT_VERSION, 3); +#endif + + RGFW_GL_ADD_ATTRIB(EGL_STENCIL_SIZE, RGFW_GL_HINTS[RGFW_glStencil]); + RGFW_GL_ADD_ATTRIB(EGL_SAMPLES, RGFW_GL_HINTS[RGFW_glSamples]); + + if (RGFW_GL_HINTS[RGFW_glDoubleBuffer] == 0) + RGFW_GL_ADD_ATTRIB(EGL_RENDER_BUFFER, EGL_SINGLE_BUFFER); + + if (RGFW_GL_HINTS[RGFW_glMajor]) { + RGFW_GL_ADD_ATTRIB(EGL_CONTEXT_MAJOR_VERSION, RGFW_GL_HINTS[RGFW_glMajor]); + RGFW_GL_ADD_ATTRIB(EGL_CONTEXT_MINOR_VERSION, RGFW_GL_HINTS[RGFW_glMinor]); + + if (RGFW_GL_HINTS[RGFW_glProfile] == RGFW_glCore) { + RGFW_GL_ADD_ATTRIB(EGL_CONTEXT_OPENGL_PROFILE_MASK, EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT); + } + else { + RGFW_GL_ADD_ATTRIB(EGL_CONTEXT_OPENGL_PROFILE_MASK, EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT); + } + } + + RGFW_GL_ADD_ATTRIB(EGL_CONTEXT_OPENGL_ROBUST_ACCESS, RGFW_GL_HINTS[RGFW_glRobustness]); + RGFW_GL_ADD_ATTRIB(EGL_CONTEXT_OPENGL_DEBUG, RGFW_GL_HINTS[RGFW_glDebug]); + if (RGFW_GL_HINTS[RGFW_glReleaseBehavior] == RGFW_releaseFlush) { + RGFW_GL_ADD_ATTRIB(0x2097, 0x2098); + } else { + RGFW_GL_ADD_ATTRIB(0x2096, 0x0000); + } + + RGFW_GL_ADD_ATTRIB(EGL_NONE, EGL_NONE); + + #if defined(RGFW_OPENGL_ES1) || defined(RGFW_OPENGL_ES2) || defined(RGFW_OPENGL_ES3) + eglBindAPI(EGL_OPENGL_ES_API); + #else + eglBindAPI(EGL_OPENGL_API); + #endif + + win->src.EGL_context = eglCreateContext(win->src.EGL_display, config, EGL_NO_CONTEXT, attribs); + + if (win->src.EGL_context == NULL) { + RGFW_sendDebugInfo(RGFW_typeError, RGFW_errEGLContext, RGFW_DEBUG_CTX(win, 0), "failed to create an EGL opengl context"); + return; + } + + eglMakeCurrent(win->src.EGL_display, win->src.EGL_surface, win->src.EGL_surface, win->src.EGL_context); + eglSwapBuffers(win->src.EGL_display, win->src.EGL_surface); + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoOpenGL, RGFW_DEBUG_CTX(win, 0), "EGL opengl context initalized"); +} + +void RGFW_window_freeOpenGL(RGFW_window* win) { + if (win->src.EGL_display == NULL) return; + + eglDestroySurface(win->src.EGL_display, win->src.EGL_surface); + eglDestroyContext(win->src.EGL_display, win->src.EGL_context); + eglTerminate(win->src.EGL_display); + win->src.EGL_display = NULL; + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoOpenGL, RGFW_DEBUG_CTX(win, 0), "EGL opengl context freed"); +} + +void RGFW_window_makeCurrent_OpenGL(RGFW_window* win) { + if (win == NULL) + eglMakeCurrent(_RGFW.root->src.EGL_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + else { + eglMakeCurrent(win->src.EGL_display, win->src.EGL_surface, win->src.EGL_surface, win->src.EGL_context); + } +} + +void RGFW_window_swapBuffers_OpenGL(RGFW_window* win) { eglSwapBuffers(win->src.EGL_display, win->src.EGL_surface); } + +void* RGFW_getCurrent_OpenGL(void) { return eglGetCurrentContext(); } + +#ifdef RGFW_APPLE +void* RGFWnsglFramework = NULL; +#elif defined(RGFW_WINDOWS) +HMODULE RGFW_wgl_dll = NULL; +#endif + +RGFW_proc RGFW_getProcAddress(const char* procname) { + #if defined(RGFW_WINDOWS) + RGFW_proc proc = (RGFW_proc) GetProcAddress(RGFW_wgl_dll, procname); + + if (proc) + return proc; + #endif + + return (RGFW_proc) eglGetProcAddress(procname); +} + +RGFW_bool RGFW_extensionSupportedPlatform(const char* extension, size_t len) { + const char* extensions = eglQueryString(_RGFW.root->src.EGL_display, EGL_EXTENSIONS); + return extensions != NULL && RGFW_extensionSupportedStr(extensions, extension, len); +} + +void RGFW_window_swapInterval(RGFW_window* win, i32 swapInterval) { + RGFW_ASSERT(win != NULL); + + eglSwapInterval(win->src.EGL_display, swapInterval); + +} + +#endif /* RGFW_EGL */ + +/* + end of RGFW_EGL defines +*/ +#endif /* end of RGFW_GL (OpenGL, EGL, OSMesa )*/ + +/* + RGFW_VULKAN defines +*/ +#ifdef RGFW_VULKAN +#ifdef RGFW_MACOS +#include +#endif + +const char** RGFW_getVKRequiredInstanceExtensions(size_t* count) { + static const char* arr[2] = {VK_KHR_SURFACE_EXTENSION_NAME}; + arr[1] = RGFW_VK_SURFACE; + if (count != NULL) *count = 2; + + return (const char**)arr; +} + +VkResult RGFW_window_createVKSurface(RGFW_window* win, VkInstance instance, VkSurfaceKHR* surface) { + RGFW_ASSERT(win != NULL); RGFW_ASSERT(instance); + RGFW_ASSERT(surface != NULL); + + *surface = VK_NULL_HANDLE; + +#ifdef RGFW_X11 + RGFW_GOTO_WAYLAND(0); + VkXlibSurfaceCreateInfoKHR x11 = { VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR, 0, 0, (Display*) win->src.display, (Window) win->src.window }; + return vkCreateXlibSurfaceKHR(instance, &x11, NULL, surface); +#endif +#if defined(RGFW_WAYLAND) +wayland: + VkWaylandSurfaceCreateInfoKHR wayland = { VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR, 0, 0, (struct wl_display*) win->src.wl_display, (struct wl_surface*) win->src.surface }; + return vkCreateWaylandSurfaceKHR(instance, &wayland, NULL, surface); +#elif defined(RGFW_WINDOWS) + VkWin32SurfaceCreateInfoKHR win32 = { VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR, 0, 0, GetModuleHandle(NULL), (HWND)win->src.window }; + + return vkCreateWin32SurfaceKHR(instance, &win32, NULL, surface); +#elif defined(RGFW_MACOS) && !defined(RGFW_MACOS_X11) + void* contentView = ((void* (*)(id, SEL))objc_msgSend)((id)win->src.window, sel_getUid("contentView")); + VkMacOSSurfaceCreateFlagsMVK macos = { VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK, 0, 0, win->src.display, (void*)contentView }; + + return vkCreateMacOSSurfaceMVK(instance, &macos, NULL, surface); +#endif +} + + +RGFW_bool RGFW_getVKPresentationSupport(VkInstance instance, VkPhysicalDevice physicalDevice, u32 queueFamilyIndex) { + RGFW_ASSERT(instance); + if (_RGFW.windowCount == -1 || _RGFW_init == RGFW_FALSE) RGFW_init(); +#ifdef RGFW_X11 + RGFW_GOTO_WAYLAND(0); + Visual* visual = DefaultVisual(_RGFW.display, DefaultScreen(_RGFW.display)); + if (_RGFW.root) + visual = _RGFW.root->src.visual.visual; + + RGFW_bool out = vkGetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, _RGFW.display, XVisualIDFromVisual(visual)); + return out; +#endif +#if defined(RGFW_WAYLAND) +wayland: + RGFW_bool wlout = vkGetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, _RGFW.wl_display); + return wlout; +#elif defined(RGFW_WINDOWS) +#elif defined(RGFW_MACOS) && !defined(RGFW_MACOS_X11) + return RGFW_FALSE; /* TODO */ +#endif +} +#endif /* end of RGFW_vulkan */ + +/* +This is where OS specific stuff starts +*/ + + +#if (defined(RGFW_WAYLAND) || defined(RGFW_X11)) && !defined(RGFW_NO_LINUX) + int RGFW_eventWait_forceStop[] = {0, 0, 0}; /* for wait events */ + + #if defined(__linux__) + #include + #include + #include + #include + + u32 RGFW_linux_updateGamepad(RGFW_window* win); + u32 RGFW_linux_updateGamepad(RGFW_window* win) { + /* check for new gamepads */ + static const char* str[] = {"/dev/input/js0", "/dev/input/js1", "/dev/input/js2", "/dev/input/js3", "/dev/input/js4", "/dev/input/js5"}; + static u8 RGFW_rawGamepads[6]; + { + u16 i; + for (i = 0; i < 6; i++) { + u16 index = RGFW_gamepadCount; + if (RGFW_rawGamepads[i]) { + struct input_id device_info; + if (ioctl(RGFW_rawGamepads[i], EVIOCGID, &device_info) == -2) { + if (errno == ENODEV) { + RGFW_rawGamepads[i] = 0; + } + } + continue; + } + + i32 js = open(str[i], O_RDONLY); + + if (js <= 0) + break; + + if (RGFW_gamepadCount >= 4) { + close(js); + break; + } + + RGFW_rawGamepads[i] = 1; + + int axes, buttons; + if (ioctl(js, JSIOCGAXES, &axes) < 0 || ioctl(js, JSIOCGBUTTONS, &buttons) < 0) { + close(js); + continue; + } + + if (buttons <= 5 || buttons >= 30) { + close(js); + continue; + } + + RGFW_gamepadCount++; + + RGFW_gamepads[index] = js; + + ioctl(js, JSIOCGNAME(sizeof(RGFW_gamepads_name[index])), RGFW_gamepads_name[index]); + RGFW_gamepads_name[index][sizeof(RGFW_gamepads_name[index]) - 1] = 0; + + u8 j; + for (j = 0; j < 16; j++) { + RGFW_gamepadPressed[index][j].prev = 0; + RGFW_gamepadPressed[index][j].current = 0; + } + + win->event.type = RGFW_gamepadConnected; + + RGFW_gamepads_type[index] = RGFW_gamepadUnknown; + if (RGFW_STRSTR(RGFW_gamepads_name[index], "Microsoft") || RGFW_STRSTR(RGFW_gamepads_name[index], "X-Box")) + RGFW_gamepads_type[index] = RGFW_gamepadMicrosoft; + else if (RGFW_STRSTR(RGFW_gamepads_name[index], "PlayStation") || RGFW_STRSTR(RGFW_gamepads_name[index], "PS3") || RGFW_STRSTR(RGFW_gamepads_name[index], "PS4") || RGFW_STRSTR(RGFW_gamepads_name[index], "PS5")) + RGFW_gamepads_type[index] = RGFW_gamepadSony; + else if (RGFW_STRSTR(RGFW_gamepads_name[index], "Nintendo")) + RGFW_gamepads_type[index] = RGFW_gamepadNintendo; + else if (RGFW_STRSTR(RGFW_gamepads_name[index], "Logitech")) + RGFW_gamepads_type[index] = RGFW_gamepadLogitech; + + win->event.gamepad = index; + RGFW_gamepadCallback(win, index, 1); + return 1; + } + } + /* check gamepad events */ + u8 i; + + for (i = 0; i < RGFW_gamepadCount; i++) { + struct js_event e; + if (RGFW_gamepads[i] == 0) + continue; + + i32 flags = fcntl(RGFW_gamepads[i], F_GETFL, 0); + fcntl(RGFW_gamepads[i], F_SETFL, flags | O_NONBLOCK); + + ssize_t bytes; + while ((bytes = read(RGFW_gamepads[i], &e, sizeof(e))) > 0) { + switch (e.type) { + case JS_EVENT_BUTTON: { + size_t typeIndex = 0; + if (RGFW_gamepads_type[i] == RGFW_gamepadMicrosoft) typeIndex = 1; + else if (RGFW_gamepads_type[i] == RGFW_gamepadLogitech) typeIndex = 2; + + win->event.type = e.value ? RGFW_gamepadButtonPressed : RGFW_gamepadButtonReleased; + u8 RGFW_linux2RGFW[3][RGFW_gamepadR3 + 8] = {{ /* ps */ + RGFW_gamepadA, RGFW_gamepadB, RGFW_gamepadY, RGFW_gamepadX, RGFW_gamepadL1, RGFW_gamepadR1, RGFW_gamepadL2, RGFW_gamepadR2, + RGFW_gamepadSelect, RGFW_gamepadStart, RGFW_gamepadHome, RGFW_gamepadL3, RGFW_gamepadR3, RGFW_gamepadUp, RGFW_gamepadDown, RGFW_gamepadLeft, RGFW_gamepadRight, + },{ /* xbox */ + RGFW_gamepadA, RGFW_gamepadB, RGFW_gamepadX, RGFW_gamepadY, RGFW_gamepadL1, RGFW_gamepadR1, RGFW_gamepadSelect, RGFW_gamepadStart, + RGFW_gamepadHome, RGFW_gamepadL3, RGFW_gamepadR3, 255, 255, RGFW_gamepadUp, RGFW_gamepadDown, RGFW_gamepadLeft, RGFW_gamepadRight + },{ /* Logitech */ + RGFW_gamepadA, RGFW_gamepadB, RGFW_gamepadX, RGFW_gamepadY, RGFW_gamepadL1, RGFW_gamepadR1, RGFW_gamepadL2, RGFW_gamepadR2, + RGFW_gamepadSelect, RGFW_gamepadStart, RGFW_gamepadHome, RGFW_gamepadL3, RGFW_gamepadR3, RGFW_gamepadUp, RGFW_gamepadDown, RGFW_gamepadLeft, RGFW_gamepadRight + } + }; + + win->event.button = RGFW_linux2RGFW[typeIndex][e.number]; + win->event.gamepad = i; + if (win->event.button == 255) break; + + RGFW_gamepadPressed[i][win->event.button].prev = RGFW_gamepadPressed[i][win->event.button].current; + RGFW_gamepadPressed[i][win->event.button].current = RGFW_BOOL(e.value); + RGFW_gamepadButtonCallback(win, i, win->event.button, RGFW_BOOL(e.value)); + + return 1; + } + case JS_EVENT_AXIS: { + size_t axis = e.number / 2; + if (axis == 2) axis = 1; + + ioctl(RGFW_gamepads[i], JSIOCGAXES, &win->event.axisesCount); + win->event.axisesCount = 2; + + if (axis < 3) { + if (e.number == 0 || e.number == 3) + RGFW_gamepadAxes[i][axis].x = (i32)((e.value / 32767.0f) * 100); + else if (e.number == 1 || e.number == 4) { + RGFW_gamepadAxes[i][axis].y = (i32)((e.value / 32767.0f) * 100); + } + } + + win->event.axis[axis] = RGFW_gamepadAxes[i][axis]; + win->event.type = RGFW_gamepadAxisMove; + win->event.gamepad = i; + win->event.whichAxis = (u8)axis; + RGFW_gamepadAxisCallback(win, i, win->event.axis, win->event.axisesCount, win->event.whichAxis); + return 1; + } + default: break; + } + } + if (bytes == -1 && errno == ENODEV) { + RGFW_gamepadCount--; + close(RGFW_gamepads[i]); + RGFW_gamepads[i] = 0; + + win->event.type = RGFW_gamepadDisconnected; + win->event.gamepad = i; + RGFW_gamepadCallback(win, i, 0); + return 1; + } + } + return 0; + } + + #endif +#endif + + + +/* + + Start of Wayland defines + + +*/ + +#ifdef RGFW_WAYLAND +/* +Wayland TODO: (out of date) +- fix RGFW_keyPressed lock state + + RGFW_windowMoved, the window was moved (by the user) + RGFW_windowResized the window was resized (by the user), [on WASM this means the browser was resized] + RGFW_windowRefresh The window content needs to be refreshed + + RGFW_DND a file has been dropped into the window + RGFW_DNDInit + +- window args: + #define RGFW_windowNoResize the window cannot be resized by the user + #define RGFW_windowAllowDND the window supports drag and drop + #define RGFW_scaleToMonitor scale the window to the screen + +- other missing functions functions ("TODO wayland") (~30 functions) +- fix buffer rendering weird behavior +*/ +#include +#include +#include +#include +#include +#include +#include +#include + +RGFW_window* RGFW_key_win = NULL; + +/* wayland global garbage (wayland bad, X11 is fine (ish) (not really)) */ +#include "xdg-shell.h" +#include "xdg-decoration-unstable-v1.h" + +struct xkb_context *xkb_context; +struct xkb_keymap *keymap = NULL; +struct xkb_state *xkb_state = NULL; +enum zxdg_toplevel_decoration_v1_mode client_preferred_mode, RGFW_current_mode; +struct zxdg_decoration_manager_v1 *decoration_manager = NULL; + +struct wl_cursor_theme* RGFW_wl_cursor_theme = NULL; +struct wl_surface* RGFW_cursor_surface = NULL; +struct wl_cursor_image* RGFW_cursor_image = NULL; + +void xdg_wm_base_ping_handler(void *data, + struct xdg_wm_base *wm_base, uint32_t serial) +{ + RGFW_UNUSED(data); + xdg_wm_base_pong(wm_base, serial); +} + +const struct xdg_wm_base_listener xdg_wm_base_listener = { + .ping = xdg_wm_base_ping_handler, +}; + +RGFW_bool RGFW_wl_configured = 0; + +void xdg_surface_configure_handler(void *data, + struct xdg_surface *xdg_surface, uint32_t serial) +{ + RGFW_UNUSED(data); + xdg_surface_ack_configure(xdg_surface, serial); + RGFW_wl_configured = 1; +} + +const struct xdg_surface_listener xdg_surface_listener = { + .configure = xdg_surface_configure_handler, +}; + +void xdg_toplevel_configure_handler(void *data, + struct xdg_toplevel *toplevel, int32_t width, int32_t height, + struct wl_array *states) +{ + RGFW_UNUSED(data); RGFW_UNUSED(toplevel); RGFW_UNUSED(states); + RGFW_UNUSED(width); RGFW_UNUSED(height); +} + +void xdg_toplevel_close_handler(void *data, + struct xdg_toplevel *toplevel) +{ + RGFW_UNUSED(data); + RGFW_window* win = (RGFW_window*)xdg_toplevel_get_user_data(toplevel); + if (win == NULL) + win = RGFW_key_win; + + RGFW_eventQueuePushEx(e.type = RGFW_quit; e._win = win); + RGFW_windowQuitCallback(win); +} + +void shm_format_handler(void *data, + struct wl_shm *shm, uint32_t format) +{ + RGFW_UNUSED(data); RGFW_UNUSED(shm); RGFW_UNUSED(format); +} + +const struct wl_shm_listener shm_listener = { + .format = shm_format_handler, +}; + +const struct xdg_toplevel_listener xdg_toplevel_listener = { + .configure = xdg_toplevel_configure_handler, + .close = xdg_toplevel_close_handler, +}; + +RGFW_window* RGFW_mouse_win = NULL; + +void pointer_enter(void *data, struct wl_pointer *pointer, uint32_t serial, struct wl_surface *surface, wl_fixed_t surface_x, wl_fixed_t surface_y) { + RGFW_UNUSED(data); RGFW_UNUSED(pointer); RGFW_UNUSED(serial); RGFW_UNUSED(surface_x); RGFW_UNUSED(surface_y); + RGFW_window* win = (RGFW_window*)wl_surface_get_user_data(surface); + RGFW_mouse_win = win; + + RGFW_eventQueuePushEx(e.type = RGFW_mouseEnter; + e.point = RGFW_POINT(wl_fixed_to_double(surface_x), wl_fixed_to_double(surface_y)); + e._win = win); + + RGFW_mouseNotifyCallback(win, win->event.point, RGFW_TRUE); +} +void pointer_leave(void *data, struct wl_pointer *pointer, uint32_t serial, struct wl_surface *surface) { + RGFW_UNUSED(data); RGFW_UNUSED(pointer); RGFW_UNUSED(serial); RGFW_UNUSED(surface); + RGFW_window* win = (RGFW_window*)wl_surface_get_user_data(surface); + if (RGFW_mouse_win == win) + RGFW_mouse_win = NULL; + + RGFW_eventQueuePushEx(e.type = RGFW_mouseLeave; + e.point = win->event.point; + e._win = win); + + RGFW_mouseNotifyCallback(win, win->event.point, RGFW_FALSE); +} +void pointer_motion(void *data, struct wl_pointer *pointer, uint32_t time, wl_fixed_t x, wl_fixed_t y) { + RGFW_UNUSED(data); RGFW_UNUSED(pointer); RGFW_UNUSED(time); RGFW_UNUSED(x); RGFW_UNUSED(y); + + RGFW_ASSERT(RGFW_mouse_win != NULL); + RGFW_eventQueuePushEx(e.type = RGFW_mousePosChanged; + e.point = RGFW_POINT(wl_fixed_to_double(x), wl_fixed_to_double(y)); + e._win = RGFW_mouse_win); + + RGFW_mousePosCallback(RGFW_mouse_win, RGFW_POINT(wl_fixed_to_double(x), wl_fixed_to_double(y)), RGFW_mouse_win->event.vector); +} +void pointer_button(void *data, struct wl_pointer *pointer, uint32_t serial, uint32_t time, uint32_t button, uint32_t state) { + RGFW_UNUSED(data); RGFW_UNUSED(pointer); RGFW_UNUSED(time); RGFW_UNUSED(serial); + RGFW_ASSERT(RGFW_mouse_win != NULL); + + u32 b = (button - 0x110) + 1; + + /* flip right and middle button codes */ + if (b == 2) b = 3; + else if (b == 3) b = 2; + + RGFW_mouseButtons[b].prev = RGFW_mouseButtons[b].current; + RGFW_mouseButtons[b].current = RGFW_BOOL(state); + + RGFW_eventQueuePushEx(e.type = RGFW_mouseButtonPressed + RGFW_BOOL(state); + e.button = (u8)b; + e._win = RGFW_mouse_win); + RGFW_mouseButtonCallback(RGFW_mouse_win, (u8)b, 0, RGFW_BOOL(state)); +} +void pointer_axis(void *data, struct wl_pointer *pointer, uint32_t time, uint32_t axis, wl_fixed_t value) { + RGFW_UNUSED(data); RGFW_UNUSED(pointer); RGFW_UNUSED(time); RGFW_UNUSED(axis); + RGFW_ASSERT(RGFW_mouse_win != NULL); + + double scroll = wl_fixed_to_double(value); + + RGFW_eventQueuePushEx(e.type = RGFW_mouseButtonPressed; + e.button = RGFW_mouseScrollUp + (scroll < 0); + e.scroll = scroll; + e._win = RGFW_mouse_win); + + RGFW_mouseButtonCallback(RGFW_mouse_win, RGFW_mouseScrollUp + (scroll < 0), scroll, 1); +} + +void RGFW_doNothing(void) { } + +void keyboard_keymap (void *data, struct wl_keyboard *keyboard, uint32_t format, int32_t fd, uint32_t size) { + RGFW_UNUSED(data); RGFW_UNUSED(keyboard); RGFW_UNUSED(format); + + char *keymap_string = mmap (NULL, size, PROT_READ, MAP_SHARED, fd, 0); + xkb_keymap_unref (keymap); + keymap = xkb_keymap_new_from_string (xkb_context, keymap_string, XKB_KEYMAP_FORMAT_TEXT_V1, XKB_KEYMAP_COMPILE_NO_FLAGS); + + munmap (keymap_string, size); + close (fd); + xkb_state_unref (xkb_state); + xkb_state = xkb_state_new (keymap); +} +void keyboard_enter (void *data, struct wl_keyboard *keyboard, uint32_t serial, struct wl_surface *surface, struct wl_array *keys) { + RGFW_UNUSED(data); RGFW_UNUSED(keyboard); RGFW_UNUSED(serial); RGFW_UNUSED(keys); + + RGFW_key_win = (RGFW_window*)wl_surface_get_user_data(surface); + + RGFW_key_win->_flags |= RGFW_windowFocus; + RGFW_eventQueuePushEx(e.type = RGFW_focusIn, e._win = RGFW_key_win); + RGFW_focusCallback(RGFW_key_win, RGFW_TRUE); + + RGFW_resetKey(); + if ((win->_flags & RGFW_HOLD_MOUSE)) RGFW_window_mouseHold(win, RGFW_AREA(win->r.w, win->r.h)); +} +void keyboard_leave (void *data, struct wl_keyboard *keyboard, uint32_t serial, struct wl_surface *surface) { + RGFW_UNUSED(data); RGFW_UNUSED(keyboard); RGFW_UNUSED(serial); + + RGFW_window* win = (RGFW_window*)wl_surface_get_user_data(surface); + if (RGFW_key_win == win) + RGFW_key_win = NULL; + + RGFW_eventQueuePushEx(e.type = RGFW_focusOut; e._win = win); + win->_flags &= ~(u32)RGFW_windowFocus; + RGFW_focusCallback(win, RGFW_FALSE); +} +void keyboard_key (void *data, struct wl_keyboard *keyboard, uint32_t serial, uint32_t time, uint32_t key, uint32_t state) { + RGFW_UNUSED(data); RGFW_UNUSED(keyboard); RGFW_UNUSED(serial); RGFW_UNUSED(time); + + if (RGFW_key_win == NULL) return; + + xkb_keysym_t keysym = xkb_state_key_get_one_sym(xkb_state, key + 8); + + u32 RGFWkey = RGFW_apiKeyToRGFW(key + 8); + RGFW_keyboard[RGFWkey].prev = RGFW_keyboard[RGFWkey].current; + RGFW_keyboard[RGFWkey].current = RGFW_BOOL(state); + + RGFW_eventQueuePushEx(e.type = (u8)(RGFW_keyPressed + state); + e.key = (u8)RGFWkey; + e.keyChar = (u8)keysym; + e.repeat = RGFW_isHeld(RGFW_key_win, (u8)RGFWkey); + e._win = RGFW_key_win); + + RGFW_updateKeyMods(RGFW_key_win, RGFW_BOOL(xkb_keymap_mod_get_index(keymap, "Lock")), RGFW_BOOL(xkb_keymap_mod_get_index(keymap, "Mod2")), RGFW_BOOL(xkb_keymap_mod_get_index(keymap, "ScrollLock"))); + RGFW_keyCallback(RGFW_key_win, (u8)RGFWkey, (u8)keysym, RGFW_key_win->event.keyMod, RGFW_BOOL(state)); +} +void keyboard_modifiers (void *data, struct wl_keyboard *keyboard, uint32_t serial, uint32_t mods_depressed, uint32_t mods_latched, uint32_t mods_locked, uint32_t group) { + RGFW_UNUSED(data); RGFW_UNUSED(keyboard); RGFW_UNUSED(serial); RGFW_UNUSED(time); + xkb_state_update_mask (xkb_state, mods_depressed, mods_latched, mods_locked, 0, 0, group); +} +struct wl_keyboard_listener keyboard_listener = {&keyboard_keymap, &keyboard_enter, &keyboard_leave, &keyboard_key, &keyboard_modifiers, (void (*)(void *, struct wl_keyboard *, +int, int))&RGFW_doNothing}; + +void seat_capabilities (void *data, struct wl_seat *seat, uint32_t capabilities) { + RGFW_UNUSED(data); + struct wl_pointer_listener pointer_listener = (struct wl_pointer_listener){&pointer_enter, &pointer_leave, &pointer_motion, &pointer_button, &pointer_axis, (void (*)(void *, struct wl_pointer *))&RGFW_doNothing, (void (*)(void *, struct wl_pointer *, uint32_t))&RGFW_doNothing, (void (*)(void *, struct wl_pointer *, uint32_t, uint32_t))&RGFW_doNothing, (void (*)(void *, struct wl_pointer *, uint32_t, int32_t))&RGFW_doNothing, (void (*)(void *, struct wl_pointer *, uint32_t, int32_t))&RGFW_doNothing}; + + if (capabilities & WL_SEAT_CAPABILITY_POINTER) { + struct wl_pointer *pointer = wl_seat_get_pointer (seat); + wl_pointer_add_listener (pointer, &pointer_listener, NULL); + } + if (capabilities & WL_SEAT_CAPABILITY_KEYBOARD) { + struct wl_keyboard *keyboard = wl_seat_get_keyboard (seat); + wl_keyboard_add_listener (keyboard, &keyboard_listener, NULL); + } +} +struct wl_seat_listener seat_listener = {&seat_capabilities, (void (*)(void *, struct wl_seat *, const char *))&RGFW_doNothing}; + +void wl_global_registry_handler(void *data, + struct wl_registry *registry, uint32_t id, const char *interface, + uint32_t version) +{ + RGFW_window* win = (RGFW_window*)data; + RGFW_UNUSED(version); + if (RGFW_STRNCMP(interface, "wl_compositor", 16) == 0) { + win->src.compositor = wl_registry_bind(registry, + id, &wl_compositor_interface, 4); + } else if (RGFW_STRNCMP(interface, "xdg_wm_base", 12) == 0) { + win->src.xdg_wm_base = wl_registry_bind(registry, + id, &xdg_wm_base_interface, 1); + } else if (RGFW_STRNCMP(interface, zxdg_decoration_manager_v1_interface.name, 255) == 0) { + decoration_manager = wl_registry_bind(registry, id, &zxdg_decoration_manager_v1_interface, 1); + } else if (RGFW_STRNCMP(interface, "wl_shm", 7) == 0) { + win->src.shm = wl_registry_bind(registry, + id, &wl_shm_interface, 1); + wl_shm_add_listener(win->src.shm, &shm_listener, NULL); + } else if (RGFW_STRNCMP(interface,"wl_seat", 8) == 0) { + win->src.seat = wl_registry_bind(registry, id, &wl_seat_interface, 1); + wl_seat_add_listener(win->src.seat, &seat_listener, NULL); + } +} + +void wl_global_registry_remove(void *data, struct wl_registry *registry, uint32_t name) { RGFW_UNUSED(data); RGFW_UNUSED(registry); RGFW_UNUSED(name); } +const struct wl_registry_listener registry_listener = { + .global = wl_global_registry_handler, + .global_remove = wl_global_registry_remove, +}; + +void decoration_handle_configure(void *data, + struct zxdg_toplevel_decoration_v1 *decoration, + enum zxdg_toplevel_decoration_v1_mode mode) { + RGFW_UNUSED(data); RGFW_UNUSED(decoration); + RGFW_current_mode = mode; +} + +const struct zxdg_toplevel_decoration_v1_listener decoration_listener = { + .configure = decoration_handle_configure, +}; + +void randname(char *buf) { + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + long r = ts.tv_nsec; + + int i; + for (i = 0; i < 6; ++i) { + buf[i] = (char)('A'+(r&15)+(r&16)*2); + r >>= 5; + } +} + +size_t wl_stringlen(char* name) { + size_t i = 0; + while (name[i]) { i++; } + return i; +} + +int anonymous_shm_open(void) { + char name[] = "/RGFW-wayland-XXXXXX"; + int retries = 100; + + do { + randname(name + wl_stringlen(name) - 6); + + --retries; + /* shm_open guarantees that O_CLOEXEC is set */ + int fd = shm_open(name, O_RDWR | O_CREAT | O_EXCL, 0600); + if (fd >= 0) { + shm_unlink(name); + return fd; + } + } while (retries > 0 && errno == EEXIST); + + return -1; +} + +int create_shm_file(off_t size) { + int fd = anonymous_shm_open(); + if (fd < 0) { + return fd; + } + + if (ftruncate(fd, size) < 0) { + close(fd); + return -1; + } + + return fd; +} + +void wl_surface_frame_done(void *data, struct wl_callback *cb, uint32_t time) { + RGFW_UNUSED(data); RGFW_UNUSED(cb); RGFW_UNUSED(time); + + #ifdef RGFW_BUFFER + RGFW_window* win = (RGFW_window*)data; + wl_surface_attach(win->src.surface, win->src.wl_buffer, 0, 0); + wl_surface_damage_buffer(win->src.surface, 0, 0, win->r.w, win->r.h); + wl_surface_commit(win->src.surface); + #endif +} + +const struct wl_callback_listener wl_surface_frame_listener = { + .done = wl_surface_frame_done, +}; +#endif /* RGFW_WAYLAND */ +/* + End of Wayland defines +*/ + +/* + + +Start of Linux / Unix defines + + +*/ + +#ifdef RGFW_UNIX +#if !defined(RGFW_NO_X11_CURSOR) && defined(RGFW_X11) +#include +#endif + +#include + +#ifndef RGFW_NO_DPI +#include +#include +#endif + +#include +#include +#include +#include + +#include /* for converting keycode to string */ +#include /* for hiding */ +#include +#include +#include + +#include /* for data limits (mainly used in drag and drop functions) */ +#include + +/* atoms needed for drag and drop */ +Atom XdndAware, XtextPlain, XtextUriList; +Atom RGFW_XUTF8_STRING = 0; + +Atom wm_delete_window = 0, RGFW_XCLIPBOARD = 0; + +#if !defined(RGFW_NO_X11_CURSOR) && !defined(RGFW_NO_X11_CURSOR_PRELOAD) + typedef XcursorImage* (*PFN_XcursorImageCreate)(int, int); + typedef void (*PFN_XcursorImageDestroy)(XcursorImage*); + typedef Cursor(*PFN_XcursorImageLoadCursor)(Display*, const XcursorImage*); +#endif +#ifdef RGFW_OPENGL + typedef GLXContext(*glXCreateContextAttribsARBProc)(Display*, GLXFBConfig, GLXContext, Bool, const int*); +#endif + +#if !defined(RGFW_NO_X11_XI_PRELOAD) + typedef int (* PFN_XISelectEvents)(Display*,Window,XIEventMask*,int); + PFN_XISelectEvents XISelectEventsSRC = NULL; + #define XISelectEvents XISelectEventsSRC + + void* X11Xihandle = NULL; +#endif + +#if !defined(RGFW_NO_X11_EXT_PRELOAD) + typedef void (* PFN_XSyncIntToValue)(XSyncValue*, int); + PFN_XSyncIntToValue XSyncIntToValueSRC = NULL; + #define XSyncIntToValue XSyncIntToValueSRC + + typedef Status (* PFN_XSyncSetCounter)(Display*, XSyncCounter, XSyncValue); + PFN_XSyncSetCounter XSyncSetCounterSRC = NULL; + #define XSyncSetCounter XSyncSetCounterSRC + + typedef XSyncCounter (* PFN_XSyncCreateCounter)(Display*, XSyncValue); + PFN_XSyncCreateCounter XSyncCreateCounterSRC = NULL; + #define XSyncCreateCounter XSyncCreateCounterSRC + + typedef void (* PFN_XShapeCombineMask)(Display*,Window,int,int,int,Pixmap,int); + PFN_XShapeCombineMask XShapeCombineMaskSRC; + #define XShapeCombineMask XShapeCombineMaskSRC + + typedef void (* PFN_XShapeCombineRegion)(Display*,Window,int,int,int,Region,int); + PFN_XShapeCombineRegion XShapeCombineRegionSRC; + #define XShapeCombineRegion XShapeCombineRegionSRC + void* X11XEXThandle = NULL; +#endif + +#if !defined(RGFW_NO_X11_CURSOR) && !defined(RGFW_NO_X11_CURSOR_PRELOAD) + PFN_XcursorImageLoadCursor XcursorImageLoadCursorSRC = NULL; + PFN_XcursorImageCreate XcursorImageCreateSRC = NULL; + PFN_XcursorImageDestroy XcursorImageDestroySRC = NULL; + + #define XcursorImageLoadCursor XcursorImageLoadCursorSRC + #define XcursorImageCreate XcursorImageCreateSRC + #define XcursorImageDestroy XcursorImageDestroySRC + + void* X11Cursorhandle = NULL; +#endif + +const char* RGFW_instName = NULL; +void RGFW_setXInstName(const char* name) { + RGFW_instName = name; +} + +#if defined(RGFW_OPENGL) && !defined(RGFW_EGL) +RGFW_bool RGFW_extensionSupportedPlatform(const char * extension, size_t len) { + const char* extensions = glXQueryExtensionsString(_RGFW.display, XDefaultScreen(_RGFW.display)); + return (extensions != NULL) && RGFW_extensionSupportedStr(extensions, extension, len); +} +RGFW_proc RGFW_getProcAddress(const char* procname) { return (RGFW_proc) glXGetProcAddress((GLubyte*) procname); } +#endif + +void RGFW_window_initBufferPtr(RGFW_window* win, u8* buffer, RGFW_area area) { + RGFW_GOTO_WAYLAND(0); + +#if defined(RGFW_OSMESA) || defined(RGFW_BUFFER) + win->buffer = (u8*)buffer; + win->bufferSize = area; + + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoBuffer, RGFW_DEBUG_CTX(win, 0), "createing a 4 channel buffer"); + #ifdef RGFW_X11 + #ifdef RGFW_OSMESA + win->src.ctx = OSMesaCreateContext(OSMESA_BGRA, NULL); + OSMesaMakeCurrent(win->src.ctx, win->buffer, GL_UNSIGNED_BYTE, area.w, area.h); + OSMesaPixelStore(OSMESA_Y_UP, 0); + #endif + + win->src.bitmap = XCreateImage( + win->src.display, win->src.visual.visual, (u32)win->src.visual.depth, + ZPixmap, 0, NULL, area.w, area.h, 32, 0 + ); + #endif + #ifdef RGFW_WAYLAND + wayland: {} + u32 size = (u32)(win->r.w * win->r.h * 4); + int fd = create_shm_file(size); + if (fd < 0) { + RGFW_sendDebugInfo(RGFW_typeError, RGFW_errBuffer, RGFW_DEBUG_CTX(win, (u32)fd),"Failed to create a buffer."); + exit(1); + } + + win->src.buffer = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + if (win->src.buffer == MAP_FAILED) { + RGFW_sendDebugInfo(RGFW_typeError, RGFW_errBuffer, RGFW_DEBUG_CTX(win, 0), "mmap failed!"); + close(fd); + exit(1); + } + + win->_flags |= RGFW_BUFFER_ALLOC; + + struct wl_shm_pool* pool = wl_shm_create_pool(win->src.shm, fd, (i32)size); + win->src.wl_buffer = wl_shm_pool_create_buffer(pool, 0, win->r.w, win->r.h, win->r.w * 4, + WL_SHM_FORMAT_ARGB8888); + wl_shm_pool_destroy(pool); + + close(fd); + + wl_surface_attach(win->src.surface, win->src.wl_buffer, 0, 0); + wl_surface_commit(win->src.surface); + + u8 color[] = {0x00, 0x00, 0x00, 0xFF}; + + size_t i; + for (i = 0; i < area.w * area.h * 4; i += 4) { + RGFW_MEMCPY(&win->buffer[i], color, 4); + } + + RGFW_MEMCPY(win->src.buffer, win->buffer, (size_t)(win->r.w * win->r.h * 4)); + + #if defined(RGFW_OSMESA) + win->src.ctx = OSMesaCreateContext(OSMESA_BGRA, NULL); + OSMesaMakeCurrent(win->src.ctx, win->buffer, GL_UNSIGNED_BYTE, area.w, area.h); + OSMesaPixelStore(OSMESA_Y_UP, 0); + #endif + #endif +#else + #ifdef RGFW_WAYLAND + wayland:{} + #endif + + RGFW_UNUSED(win); RGFW_UNUSED(buffer); RGFW_UNUSED(area); +#endif +} + +#define RGFW_LOAD_ATOM(name) \ + static Atom name = 0; \ + if (name == 0) name = XInternAtom(_RGFW.display, #name, False); + +void RGFW_window_setBorder(RGFW_window* win, RGFW_bool border) { + RGFW_setBit(&win->_flags, RGFW_windowNoBorder, !border); + + RGFW_GOTO_WAYLAND(0); + #ifdef RGFW_X11 + RGFW_LOAD_ATOM(_MOTIF_WM_HINTS); + + struct __x11WindowHints { + unsigned long flags, functions, decorations, status; + long input_mode; + } hints; + hints.flags = 2; + hints.decorations = border; + + XChangeProperty(win->src.display, win->src.window, _MOTIF_WM_HINTS, _MOTIF_WM_HINTS, 32, + PropModeReplace, (u8*)&hints, 5 + ); + + if (RGFW_window_isHidden(win) == 0) { + RGFW_window_hide(win); + RGFW_window_show(win); + } + + #endif + #ifdef RGFW_WAYLAND + wayland: + RGFW_UNUSED(win); RGFW_UNUSED(border); + #endif +} + +void RGFW_releaseCursor(RGFW_window* win) { +RGFW_GOTO_WAYLAND(0); +#ifdef RGFW_X11 + XUngrabPointer(win->src.display, CurrentTime); + + /* disable raw input */ + unsigned char mask[] = { 0 }; + XIEventMask em; + em.deviceid = XIAllMasterDevices; + em.mask_len = sizeof(mask); + em.mask = mask; + + XISelectEvents(win->src.display, XDefaultRootWindow(win->src.display), &em, 1); +#endif +#ifdef RGFW_WAYLAND + wayland: + RGFW_UNUSED(win); +#endif +} + +void RGFW_captureCursor(RGFW_window* win, RGFW_rect r) { +RGFW_GOTO_WAYLAND(0); +#ifdef RGFW_X11 + /* enable raw input */ + unsigned char mask[XIMaskLen(XI_RawMotion)] = { 0 }; + XISetMask(mask, XI_RawMotion); + + XIEventMask em; + em.deviceid = XIAllMasterDevices; + em.mask_len = sizeof(mask); + em.mask = mask; + + XISelectEvents(win->src.display, XDefaultRootWindow(win->src.display), &em, 1); + + XGrabPointer(win->src.display, win->src.window, True, PointerMotionMask, GrabModeAsync, GrabModeAsync, None, None, CurrentTime); + RGFW_window_moveMouse(win, RGFW_POINT(win->r.x + (i32)(r.w / 2), win->r.y + (i32)(r.h / 2))); +#endif +#ifdef RGFW_WAYLAND + wayland: + RGFW_UNUSED(win); RGFW_UNUSED(r); +#endif +} + +#define RGFW_LOAD_LIBRARY(x, lib) if (x == NULL) x = dlopen(lib, RTLD_LAZY | RTLD_LOCAL) +#define RGFW_PROC_DEF(proc, name) if (name##SRC == NULL && proc != NULL) { \ + void* ptr = dlsym(proc, #name); \ + if (ptr != NULL) memcpy(&name##SRC, &ptr, sizeof(PFN_##name)); \ +} + + + +void RGFW_window_getVisual(RGFW_window* win, RGFW_bool software) { +#if defined(RGFW_OPENGL) && !defined(RGFW_EGL) + i32* visual_attribs = RGFW_initFormatAttribs(software); + i32 fbcount; + GLXFBConfig* fbc = glXChooseFBConfig(win->src.display, DefaultScreen(win->src.display), visual_attribs, &fbcount); + + i32 best_fbc = -1; + i32 best_depth = 0; + i32 best_samples = 0; + + if (fbcount == 0) { + RGFW_sendDebugInfo(RGFW_typeError, RGFW_errOpenglContext, RGFW_DEBUG_CTX(win, 0), "Failed to find any valid GLX visual configs"); + return; + } + + i32 i; + for (i = 0; i < fbcount; i++) { + XVisualInfo* vi = glXGetVisualFromFBConfig(win->src.display, fbc[i]); + if (vi == NULL) + continue; + + i32 samp_buf, samples; + glXGetFBConfigAttrib(win->src.display, fbc[i], GLX_SAMPLE_BUFFERS, &samp_buf); + glXGetFBConfigAttrib(win->src.display, fbc[i], GLX_SAMPLES, &samples); + + if (best_fbc == -1) best_fbc = i; + if ((!(win->_flags & RGFW_windowTransparent) || vi->depth == 32) && best_depth == 0) { + best_fbc = i; + best_depth = vi->depth; + } + if ((!(win->_flags & RGFW_windowTransparent) || vi->depth == 32) && samples <= RGFW_GL_HINTS[RGFW_glSamples] && samples > best_samples) { + best_fbc = i; + best_depth = vi->depth; + best_samples = samples; + } + XFree(vi); + } + + if (best_fbc == -1) { + RGFW_sendDebugInfo(RGFW_typeError, RGFW_errOpenglContext, RGFW_DEBUG_CTX(win, 0), "Failed to get a valid GLX visual"); + return; + } + + win->src.bestFbc = fbc[best_fbc]; + XVisualInfo* vi = glXGetVisualFromFBConfig(win->src.display, win->src.bestFbc); + if (vi->depth != 32 && (win->_flags & RGFW_windowTransparent)) + RGFW_sendDebugInfo(RGFW_typeWarning, RGFW_warningOpenGL, RGFW_DEBUG_CTX(win, 0), "Failed to to find a matching visual with a 32-bit depth"); + + if (best_samples < RGFW_GL_HINTS[RGFW_glSamples]) + RGFW_sendDebugInfo(RGFW_typeWarning, RGFW_warningOpenGL, RGFW_DEBUG_CTX(win, 0), "Failed to load matching sampiling"); + + XFree(fbc); + win->src.visual = *vi; + XFree(vi); +#else + RGFW_UNUSED(software); + win->src.visual.visual = DefaultVisual(win->src.display, DefaultScreen(win->src.display)); + win->src.visual.depth = DefaultDepth(win->src.display, DefaultScreen(win->src.display)); + if (win->_flags & RGFW_windowTransparent) { + XMatchVisualInfo(win->src.display, DefaultScreen(win->src.display), 32, TrueColor, &win->src.visual); /*!< for RGBA backgrounds */ + if (win->src.visual.depth != 32) + RGFW_sendDebugInfo(RGFW_typeWarning, RGFW_warningOpenGL, RGFW_DEBUG_CTX(win, 0), "Failed to load a 32-bit depth"); + } +#endif +} + +#ifndef RGFW_EGL +void RGFW_window_initOpenGL(RGFW_window* win, RGFW_bool software) { + RGFW_UNUSED(software); +#ifdef RGFW_OPENGL + i32 context_attribs[7] = { 0, 0, 0, 0, 0, 0, 0 }; + context_attribs[0] = GLX_CONTEXT_PROFILE_MASK_ARB; + if (RGFW_GL_HINTS[RGFW_glProfile] == RGFW_glCore) + context_attribs[1] = GLX_CONTEXT_CORE_PROFILE_BIT_ARB; + else + context_attribs[1] = GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB; + + if (RGFW_GL_HINTS[RGFW_glMinor] || RGFW_GL_HINTS[RGFW_glMajor]) { + context_attribs[2] = GLX_CONTEXT_MAJOR_VERSION_ARB; + context_attribs[3] = RGFW_GL_HINTS[RGFW_glMajor]; + context_attribs[4] = GLX_CONTEXT_MINOR_VERSION_ARB; + context_attribs[5] = RGFW_GL_HINTS[RGFW_glMinor]; + } + + glXCreateContextAttribsARBProc glXCreateContextAttribsARB = 0; + glXCreateContextAttribsARB = (glXCreateContextAttribsARBProc) + glXGetProcAddressARB((GLubyte*) "glXCreateContextAttribsARB"); + + GLXContext ctx = NULL; + if (_RGFW.root != NULL && _RGFW.root != win) { + ctx = _RGFW.root->src.ctx; + RGFW_window_makeCurrent_OpenGL(_RGFW.root); + } + + if (glXCreateContextAttribsARB == NULL) { + RGFW_sendDebugInfo(RGFW_typeError, RGFW_errOpenglContext, RGFW_DEBUG_CTX(win, 0), "failed to load proc address 'glXCreateContextAttribsARB', loading a generic opengl context"); + win->src.ctx = glXCreateContext(win->src.display, &win->src.visual, ctx, True); + } + else { + win->src.ctx = glXCreateContextAttribsARB(win->src.display, win->src.bestFbc, ctx, True, context_attribs); + XSync(win->src.display, False); + if (win->src.ctx == NULL) { + RGFW_sendDebugInfo(RGFW_typeError, RGFW_errOpenglContext, RGFW_DEBUG_CTX(win, 0), "failed to create an opengl context with AttribsARB, loading a generic opengl context"); + win->src.ctx = glXCreateContext(win->src.display, &win->src.visual, ctx, True); + } + } + + glXMakeCurrent(win->src.display, (Drawable) win->src.window, (GLXContext) win->src.ctx); + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoOpenGL, RGFW_DEBUG_CTX(win, 0), "opengl context initalized"); +#else + RGFW_UNUSED(win); RGFW_UNUSED(software); +#endif +} + +void RGFW_window_freeOpenGL(RGFW_window* win) { +#ifdef RGFW_OPENGL + if (win->src.ctx == NULL) return; + glXDestroyContext(win->src.display, win->src.ctx); + win->src.ctx = NULL; + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoOpenGL, RGFW_DEBUG_CTX(win, 0), "opengl context freed"); +#else +RGFW_UNUSED(win); +#endif +} +#endif + + +i32 RGFW_init(void) { + RGFW_GOTO_WAYLAND(1); +#if defined(RGFW_C89) || defined(__cplusplus) + if (_RGFW_init) return 0; + _RGFW_init = RGFW_TRUE; + _RGFW.root = NULL; _RGFW.current = NULL; _RGFW.windowCount = -1; _RGFW.eventLen = 0; _RGFW.eventIndex = 0; +#endif + +#ifdef RGFW_X11 + if (_RGFW.windowCount != -1) return 0; + #ifdef RGFW_USE_XDL + XDL_init(); + #endif + + #if !defined(RGFW_NO_X11_CURSOR) && !defined(RGFW_NO_X11_CURSOR_PRELOAD) + #if defined(__CYGWIN__) + RGFW_LOAD_LIBRARY(X11Cursorhandle, "libXcursor-1.so"); + #elif defined(__OpenBSD__) || defined(__NetBSD__) + RGFW_LOAD_LIBRARY(X11Cursorhandle, "libXcursor.so"); + #else + RGFW_LOAD_LIBRARY(X11Cursorhandle, "libXcursor.so.1"); + #endif + RGFW_PROC_DEF(X11Cursorhandle, XcursorImageCreate); + RGFW_PROC_DEF(X11Cursorhandle, XcursorImageDestroy); + RGFW_PROC_DEF(X11Cursorhandle, XcursorImageLoadCursor); + #endif + + #if !defined(RGFW_NO_X11_XI_PRELOAD) + #if defined(__CYGWIN__) + RGFW_LOAD_LIBRARY(X11Xihandle, "libXi-6.so"); + #elif defined(__OpenBSD__) || defined(__NetBSD__) + RGFW_LOAD_LIBRARY(X11Xihandle, "libXi.so"); + #else + RGFW_LOAD_LIBRARY(X11Xihandle, "libXi.so.6"); + #endif + RGFW_PROC_DEF(X11Xihandle, XISelectEvents); + #endif + + #if !defined(RGFW_NO_X11_EXT_PRELOAD) + #if defined(__CYGWIN__) + RGFW_LOAD_LIBRARY(X11XEXThandle, "libXext-6.so"); + #elif defined(__OpenBSD__) || defined(__NetBSD__) + RGFW_LOAD_LIBRARY(X11XEXThandle, "libXext.so"); + #else + RGFW_LOAD_LIBRARY(X11XEXThandle, "libXext.so.6"); + #endif + RGFW_PROC_DEF(X11XEXThandle, XSyncCreateCounter); + RGFW_PROC_DEF(X11XEXThandle, XSyncIntToValue); + RGFW_PROC_DEF(X11XEXThandle, XSyncSetCounter); + RGFW_PROC_DEF(X11XEXThandle, XShapeCombineRegion); + RGFW_PROC_DEF(X11XEXThandle, XShapeCombineMask); + #endif + + XInitThreads(); /*!< init X11 threading */ + _RGFW.display = XOpenDisplay(0); + XSetWindowAttributes wa; + RGFW_MEMSET(&wa, 0, sizeof(wa)); + wa.event_mask = PropertyChangeMask; + _RGFW.helperWindow = XCreateWindow(_RGFW.display, XDefaultRootWindow(_RGFW.display), 0, 0, 1, 1, 0, 0, + InputOnly, DefaultVisual(_RGFW.display, DefaultScreen(_RGFW.display)), CWEventMask, &wa); + + _RGFW.windowCount = 0; + u8 RGFW_blk[] = { 0, 0, 0, 0 }; + _RGFW.hiddenMouse = RGFW_loadMouse(RGFW_blk, RGFW_AREA(1, 1), 4); + _RGFW.clipboard = NULL; + + XkbComponentNamesRec rec; + XkbDescPtr desc = XkbGetMap(_RGFW.display, 0, XkbUseCoreKbd); + XkbDescPtr evdesc; + u8 old[sizeof(RGFW_keycodes) / sizeof(RGFW_keycodes[0])]; + + XkbGetNames(_RGFW.display, XkbKeyNamesMask, desc); + + RGFW_MEMSET(&rec, 0, sizeof(rec)); + rec.keycodes = (char*)"evdev"; + evdesc = XkbGetKeyboardByName(_RGFW.display, XkbUseCoreKbd, &rec, XkbGBN_KeyNamesMask, XkbGBN_KeyNamesMask, False); + /* memo: RGFW_keycodes[x11 keycode] = rgfw keycode */ + if(evdesc != NULL && desc != NULL){ + for(int i = 0; i < (int)sizeof(RGFW_keycodes) / (int)sizeof(RGFW_keycodes[0]); i++){ + old[i] = RGFW_keycodes[i]; + RGFW_keycodes[i] = 0; + } + for(int i = evdesc->min_key_code; i <= evdesc->max_key_code; i++){ + for(int j = desc->min_key_code; j <= desc->max_key_code; j++){ + if(strncmp(evdesc->names->keys[i].name, desc->names->keys[j].name, XkbKeyNameLength) == 0){ + RGFW_keycodes[j] = old[i]; + break; + } + } + } + XkbFreeKeyboard(desc, 0, True); + XkbFreeKeyboard(evdesc, 0, True); + } +#endif +#ifdef RGFW_WAYLAND +wayland: + _RGFW.wl_display = wl_display_connect(NULL); +#endif + _RGFW.windowCount = 0; + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoGlobal, RGFW_DEBUG_CTX(NULL, 0), "global context initialized"); + return 0; +} + + +RGFW_window* RGFW_createWindowPtr(const char* name, RGFW_rect rect, RGFW_windowFlags flags, RGFW_window* win) { + RGFW_window_basic_init(win, rect, flags); + +#ifdef RGFW_WAYLAND + win->src.compositor = NULL; +#endif + RGFW_GOTO_WAYLAND(0); +#ifdef RGFW_X11 + i64 event_mask = KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask | StructureNotifyMask | FocusChangeMask | LeaveWindowMask | EnterWindowMask | ExposureMask; /*!< X11 events accepted */ + + win->src.display = XOpenDisplay(NULL); + RGFW_window_getVisual(win, RGFW_BOOL(flags & RGFW_windowOpenglSoftware)); + + /* make X window attrubutes */ + XSetWindowAttributes swa; + RGFW_MEMSET(&swa, 0, sizeof(swa)); + + Colormap cmap; + swa.colormap = cmap = XCreateColormap(win->src.display, + DefaultRootWindow(win->src.display), + win->src.visual.visual, AllocNone); + swa.event_mask = event_mask; + + /* create the window */ + win->src.window = XCreateWindow(win->src.display, DefaultRootWindow(win->src.display), win->r.x, win->r.y, (u32)win->r.w, (u32)win->r.h, + 0, win->src.visual.depth, InputOutput, win->src.visual.visual, + CWColormap | CWBorderPixel | CWEventMask, &swa); + + XFreeColors(win->src.display, cmap, NULL, 0, 0); + + win->src.gc = XCreateGC(win->src.display, win->src.window, 0, NULL); + + /* In your .desktop app, if you set the property + StartupWMClass=RGFW that will assoicate the launcher icon + with your application - robrohan */ + if (RGFW_className == NULL) + RGFW_className = (char*)name; + + XClassHint hint; + hint.res_class = (char*)RGFW_className; + if (RGFW_instName == NULL) hint.res_name = (char*)name; + else hint.res_name = (char*)RGFW_instName; + XSetClassHint(win->src.display, win->src.window, &hint); + + #ifndef RGFW_NO_MONITOR + if (flags & RGFW_windowScaleToMonitor) + RGFW_window_scaleToMonitor(win); + #endif + XSelectInput(win->src.display, (Drawable) win->src.window, event_mask); /*!< tell X11 what events we want */ + + /* make it so the user can't close the window until the program does */ + if (wm_delete_window == 0) { + wm_delete_window = XInternAtom(win->src.display, "WM_DELETE_WINDOW", False); + RGFW_XUTF8_STRING = XInternAtom(win->src.display, "UTF8_STRING", False); + RGFW_XCLIPBOARD = XInternAtom(win->src.display, "CLIPBOARD", False); + } + + XSetWMProtocols(win->src.display, (Drawable) win->src.window, &wm_delete_window, 1); + /* set the background */ + RGFW_window_setName(win, name); + + XMoveWindow(win->src.display, (Drawable) win->src.window, win->r.x, win->r.y); /*!< move the window to it's proper cords */ + + if (flags & RGFW_windowAllowDND) { /* init drag and drop atoms and turn on drag and drop for this window */ + win->_flags |= RGFW_windowAllowDND; + + /* actions */ + XtextUriList = XInternAtom(win->src.display, "text/uri-list", False); + XtextPlain = XInternAtom(win->src.display, "text/plain", False); + XdndAware = XInternAtom(win->src.display, "XdndAware", False); + const u8 version = 5; + + XChangeProperty(win->src.display, win->src.window, + XdndAware, 4, 32, + PropModeReplace, &version, 1); /*!< turns on drag and drop */ + } + +#ifdef RGFW_ADVANCED_SMOOTH_RESIZE + RGFW_LOAD_ATOM(_NET_WM_SYNC_REQUEST_COUNTER) + RGFW_LOAD_ATOM(_NET_WM_SYNC_REQUEST) + Atom protcols[2] = {_NET_WM_SYNC_REQUEST, wm_delete_window}; + XSetWMProtocols(win->src.display, win->src.window, protcols, 2); + + XSyncValue initial_value; + XSyncIntToValue(&initial_value, 0); + win->src.counter = XSyncCreateCounter(win->src.display, initial_value); + + XChangeProperty(win->src.display, win->src.window, _NET_WM_SYNC_REQUEST_COUNTER, XA_CARDINAL, 32, PropModeReplace, (uint8_t*)&win->src.counter, 1); +#endif + + if ((flags & RGFW_windowNoInitAPI) == 0) { + RGFW_window_initOpenGL(win, RGFW_BOOL(flags & RGFW_windowOpenglSoftware)); + RGFW_window_initBuffer(win); + } + + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoWindow, RGFW_DEBUG_CTX(win, 0), "a new window was created"); + RGFW_window_setMouseDefault(win); + RGFW_window_setFlags(win, flags); + + win->src.r = win->r; + + RGFW_window_show(win); + return win; /*return newly created window */ +#endif +#ifdef RGFW_WAYLAND + wayland: + RGFW_sendDebugInfo(RGFW_typeWarning, RGFW_warningWayland, RGFW_DEBUG_CTX(win, 0), "RGFW Wayland support is experimental"); + + win->src.wl_display = _RGFW.wl_display; + if (win->src.wl_display == NULL) { + RGFW_sendDebugInfo(RGFW_typeError, RGFW_errWayland, RGFW_DEBUG_CTX(win, 0), "Failed to load Wayland display"); + #ifdef RGFW_X11 + RGFW_sendDebugInfo(RGFW_typeWarning, RGFW_warningWayland, RGFW_DEBUG_CTX(win, 0), "Falling back to X11"); + RGFW_useWayland(0); + return RGFW_createWindowPtr(name, rect, flags, win); + #endif + return NULL; + } + + + #ifdef RGFW_X11 + win->src.window = _RGFW.helperWindow; + XMapWindow(win->src.display, win->src.window); + XFlush(win->src.display); + if (wm_delete_window == 0) { + wm_delete_window = XInternAtom(win->src.display, "WM_DELETE_WINDOW", False); + RGFW_XUTF8_STRING = XInternAtom(win->src.display, "UTF8_STRING", False); + RGFW_XCLIPBOARD = XInternAtom(win->src.display, "CLIPBOARD", False); + } + #endif + + struct wl_registry *registry = wl_display_get_registry(win->src.wl_display); + wl_registry_add_listener(registry, ®istry_listener, win); + + wl_display_roundtrip(win->src.wl_display); + wl_display_dispatch(win->src.wl_display); + + if (win->src.compositor == NULL) { + RGFW_sendDebugInfo(RGFW_typeError, RGFW_errWayland, RGFW_DEBUG_CTX(win, 0), "Can't find compositor."); + return NULL; + } + + if (RGFW_wl_cursor_theme == NULL) { + RGFW_wl_cursor_theme = wl_cursor_theme_load(NULL, 24, win->src.shm); + RGFW_cursor_surface = wl_compositor_create_surface(win->src.compositor); + + struct wl_cursor* cursor = wl_cursor_theme_get_cursor(RGFW_wl_cursor_theme, "left_ptr"); + RGFW_cursor_image = cursor->images[0]; + struct wl_buffer* cursor_buffer = wl_cursor_image_get_buffer(RGFW_cursor_image); + + wl_surface_attach(RGFW_cursor_surface, cursor_buffer, 0, 0); + wl_surface_commit(RGFW_cursor_surface); + } + + xdg_wm_base_add_listener(win->src.xdg_wm_base, &xdg_wm_base_listener, NULL); + + xkb_context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); + + win->src.surface = wl_compositor_create_surface(win->src.compositor); + wl_surface_set_user_data(win->src.surface, win); + + win->src.xdg_surface = xdg_wm_base_get_xdg_surface(win->src.xdg_wm_base, win->src.surface); + xdg_surface_add_listener(win->src.xdg_surface, &xdg_surface_listener, NULL); + + xdg_wm_base_set_user_data(win->src.xdg_wm_base, win); + + win->src.xdg_toplevel = xdg_surface_get_toplevel(win->src.xdg_surface); + xdg_toplevel_set_user_data(win->src.xdg_toplevel, win); + xdg_toplevel_add_listener(win->src.xdg_toplevel, &xdg_toplevel_listener, NULL); + + xdg_surface_set_window_geometry(win->src.xdg_surface, 0, 0, win->r.w, win->r.h); + + if (!(flags & RGFW_windowNoBorder)) { + win->src.decoration = zxdg_decoration_manager_v1_get_toplevel_decoration( + decoration_manager, win->src.xdg_toplevel); + } + + wl_display_roundtrip(win->src.wl_display); + + wl_surface_commit(win->src.surface); + RGFW_window_show(win); + + /* wait for the surface to be configured */ + while (wl_display_dispatch(win->src.wl_display) != -1 && !RGFW_wl_configured) { } + + if ((flags & RGFW_windowNoInitAPI) == 0) { + RGFW_window_initOpenGL(win, RGFW_BOOL(flags & RGFW_windowOpenglSoftware)); + RGFW_window_initBuffer(win); + } + struct wl_callback* callback = wl_surface_frame(win->src.surface); + wl_callback_add_listener(callback, &wl_surface_frame_listener, win); + wl_surface_commit(win->src.surface); + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoWindow, RGFW_DEBUG_CTX(win, 0), "a new window was created"); + + #ifndef RGFW_NO_MONITOR + if (flags & RGFW_windowScaleToMonitor) + RGFW_window_scaleToMonitor(win); + #endif + + RGFW_window_setMouseDefault(win); + RGFW_window_setFlags(win, flags); + return win; /* return newly created window */ +#endif +} + +RGFW_area RGFW_getScreenSize(void) { + RGFW_GOTO_WAYLAND(1); + RGFW_init(); + + #ifdef RGFW_X11 + Screen* scrn = DefaultScreenOfDisplay(_RGFW.display); + return RGFW_AREA(scrn->width, scrn->height); + #endif + #ifdef RGFW_WAYLAND + wayland: return RGFW_AREA(_RGFW.root->r.w, _RGFW.root->r.h); /* TODO */ + #endif +} + +RGFW_point RGFW_getGlobalMousePoint(void) { + RGFW_init(); + RGFW_point RGFWMouse; + + i32 x, y; + u32 z; + Window window1, window2; + XQueryPointer(_RGFW.display, XDefaultRootWindow(_RGFW.display), &window1, &window2, &RGFWMouse.x, &RGFWMouse.y, &x, &y, &z); + + return RGFWMouse; +} + +RGFWDEF void RGFW_XHandleClipboardSelection(XEvent* event); +void RGFW_XHandleClipboardSelection(XEvent* event) { + RGFW_LOAD_ATOM(ATOM_PAIR); + RGFW_LOAD_ATOM(MULTIPLE); + RGFW_LOAD_ATOM(TARGETS); + RGFW_LOAD_ATOM(SAVE_TARGETS); + + const XSelectionRequestEvent* request = &event->xselectionrequest; + const Atom formats[] = { RGFW_XUTF8_STRING, XA_STRING }; + const int formatCount = sizeof(formats) / sizeof(formats[0]); + + if (request->target == TARGETS) { + const Atom targets[] = { TARGETS, MULTIPLE, RGFW_XUTF8_STRING, XA_STRING }; + + XChangeProperty(_RGFW.display, request->requestor, request->property, + XA_ATOM, 32, PropModeReplace, (u8*) targets, sizeof(targets) / sizeof(Atom)); + } else if (request->target == MULTIPLE) { + Atom* targets = NULL; + + Atom actualType = 0; + int actualFormat = 0; + unsigned long count = 0, bytesAfter = 0; + + XGetWindowProperty(_RGFW.display, request->requestor, request->property, 0, LONG_MAX, + False, ATOM_PAIR, &actualType, &actualFormat, &count, &bytesAfter, (u8**) &targets); + + unsigned long i; + for (i = 0; i < (u32)count; i += 2) { + if (targets[i] == RGFW_XUTF8_STRING || targets[i] == XA_STRING) + XChangeProperty(_RGFW.display, request->requestor, targets[i + 1], targets[i], + 8, PropModeReplace, (const unsigned char *)_RGFW.clipboard, (i32)_RGFW.clipboard_len); + else + targets[i + 1] = None; + } + + XChangeProperty(_RGFW.display, + request->requestor, request->property, ATOM_PAIR, 32, + PropModeReplace, (u8*) targets, (i32)count); + + XFlush(_RGFW.display); + XFree(targets); + } else if (request->target == SAVE_TARGETS) + XChangeProperty(_RGFW.display, request->requestor, request->property, 0, 32, PropModeReplace, NULL, 0); + else { + int i; + for (i = 0; i < formatCount; i++) { + if (request->target != formats[i]) + continue; + XChangeProperty(_RGFW.display, request->requestor, request->property, request->target, + 8, PropModeReplace, (u8*) _RGFW.clipboard, (i32)_RGFW.clipboard_len); + } + } + + XEvent reply = { SelectionNotify }; + reply.xselection.property = request->property; + reply.xselection.display = request->display; + reply.xselection.requestor = request->requestor; + reply.xselection.selection = request->selection; + reply.xselection.target = request->target; + reply.xselection.time = request->time; + + XSendEvent(_RGFW.display, request->requestor, False, 0, &reply); +} + +char* RGFW_strtok(char* str, const char* delimStr); +char* RGFW_strtok(char* str, const char* delimStr) { + static char* static_str = NULL; + + if (str != NULL) + static_str = str; + + if (static_str == NULL) { + return NULL; + } + + while (*static_str != '\0') { + RGFW_bool delim = 0; + const char* d; + for (d = delimStr; *d != '\0'; d++) { + if (*static_str == *d) { + delim = 1; + break; + } + } + if (!delim) + break; + static_str++; + } + + if (*static_str == '\0') + return NULL; + + char* token_start = static_str; + while (*static_str != '\0') { + int delim = 0; + const char* d; + for (d = delimStr; *d != '\0'; d++) { + if (*static_str == *d) { + delim = 1; + break; + } + } + + if (delim) { + *static_str = '\0'; + static_str++; + break; + } + static_str++; + } + + return token_start; +} + +i32 RGFW_XHandleClipboardSelectionHelper(void); + +RGFW_event* RGFW_window_checkEvent(RGFW_window* win) { + RGFW_XHandleClipboardSelectionHelper(); + + if (win == NULL || ((win->_flags & RGFW_windowFreeOnClose) && (win->_flags & RGFW_EVENT_QUIT))) return NULL; + RGFW_event* ev = RGFW_window_checkEventCore(win); + if (ev) return ev; + + #if defined(__linux__) && !defined(RGFW_NO_LINUX) + if (RGFW_linux_updateGamepad(win)) return &win->event; + #endif + RGFW_GOTO_WAYLAND(0); +#ifdef RGFW_X11 + RGFW_LOAD_ATOM(XdndTypeList); + RGFW_LOAD_ATOM(XdndSelection); + RGFW_LOAD_ATOM(XdndEnter); + RGFW_LOAD_ATOM(XdndPosition); + RGFW_LOAD_ATOM(XdndStatus); + RGFW_LOAD_ATOM(XdndLeave); + RGFW_LOAD_ATOM(XdndDrop); + RGFW_LOAD_ATOM(XdndFinished); + RGFW_LOAD_ATOM(XdndActionCopy); + RGFW_LOAD_ATOM(_NET_WM_SYNC_REQUEST); + RGFW_LOAD_ATOM(WM_PROTOCOLS); + XPending(win->src.display); + + XEvent E; /*!< raw X11 event */ + + /* if there is no unread qued events, get a new one */ + if ((QLength(win->src.display) || XEventsQueued(win->src.display, QueuedAlready) + XEventsQueued(win->src.display, QueuedAfterReading)) + && win->event.type != RGFW_quit + ) + XNextEvent(win->src.display, &E); + else { + return NULL; + } + + win->event.type = 0; + + /* xdnd data */ + static Window source = 0; + static long version = 0; + static i32 format = 0; + + XEvent reply = { ClientMessage }; + + switch (E.type) { + case KeyPress: + case KeyRelease: { + win->event.repeat = RGFW_FALSE; + /* check if it's a real key release */ + if (E.type == KeyRelease && XEventsQueued(win->src.display, QueuedAfterReading)) { /* get next event if there is one */ + XEvent NE; + XPeekEvent(win->src.display, &NE); + + if (E.xkey.time == NE.xkey.time && E.xkey.keycode == NE.xkey.keycode) /* check if the current and next are both the same */ + win->event.repeat = RGFW_TRUE; + } + + /* set event key data */ + win->event.key = (u8)RGFW_apiKeyToRGFW(E.xkey.keycode); + KeySym sym = (KeySym)XkbKeycodeToKeysym(win->src.display, (KeyCode)E.xkey.keycode, 0, (KeyCode)E.xkey.state & ShiftMask ? 1 : 0); + + if ((E.xkey.state & LockMask) && sym >= XK_a && sym <= XK_z) + sym = (E.xkey.state & ShiftMask) ? sym + 32 : sym - 32; + if ((u8)sym != (u32)sym) + sym = 0; + + win->event.keyChar = (u8)sym; + + RGFW_keyboard[win->event.key].prev = RGFW_keyboard[win->event.key].current; + + /* get keystate data */ + win->event.type = (E.type == KeyPress) ? RGFW_keyPressed : RGFW_keyReleased; + + XKeyboardState keystate; + XGetKeyboardControl(win->src.display, &keystate); + + RGFW_keyboard[win->event.key].current = (E.type == KeyPress); + + XkbStateRec state; + XkbGetState(win->src.display, XkbUseCoreKbd, &state); + RGFW_updateKeyMods(win, (state.locked_mods & LockMask), (state.locked_mods & Mod2Mask), (state.locked_mods & Mod3Mask)); + + RGFW_keyCallback(win, win->event.key, win->event.keyChar, win->event.keyMod, (E.type == KeyPress)); + break; + } + case ButtonPress: + case ButtonRelease: + if (E.xbutton.button > RGFW_mouseFinal) { /* skip this event */ + XFlush(win->src.display); + return RGFW_window_checkEvent(win); + } + + win->event.type = RGFW_mouseButtonPressed + (E.type == ButtonRelease); /* the events match */ + win->event.button = (u8)(E.xbutton.button - 1); + switch(win->event.button) { + case RGFW_mouseScrollUp: + win->event.scroll = 1; + break; + case RGFW_mouseScrollDown: + win->event.scroll = -1; + break; + default: break; + } + + RGFW_mouseButtons[win->event.button].prev = RGFW_mouseButtons[win->event.button].current; + + if (win->event.repeat == RGFW_FALSE) + win->event.repeat = RGFW_isPressed(win, win->event.key); + + RGFW_mouseButtons[win->event.button].current = (E.type == ButtonPress); + RGFW_mouseButtonCallback(win, win->event.button, win->event.scroll, (E.type == ButtonPress)); + break; + + case MotionNotify: + win->event.point.x = E.xmotion.x; + win->event.point.y = E.xmotion.y; + + win->event.vector.x = win->event.point.x - win->_lastMousePoint.x; + win->event.vector.y = win->event.point.y - win->_lastMousePoint.y; + win->_lastMousePoint = win->event.point; + + win->event.type = RGFW_mousePosChanged; + RGFW_mousePosCallback(win, win->event.point, win->event.vector); + break; + + case GenericEvent: { + /* MotionNotify is used for mouse events if the mouse isn't held */ + if (!(win->_flags & RGFW_HOLD_MOUSE)) { + XFreeEventData(win->src.display, &E.xcookie); + break; + } + + XGetEventData(win->src.display, &E.xcookie); + if (E.xcookie.evtype == XI_RawMotion) { + XIRawEvent *raw = (XIRawEvent *)E.xcookie.data; + if (raw->valuators.mask_len == 0) { + XFreeEventData(win->src.display, &E.xcookie); + break; + } + + double deltaX = 0.0f; + double deltaY = 0.0f; + + /* check if relative motion data exists where we think it does */ + if (XIMaskIsSet(raw->valuators.mask, 0) != 0) + deltaX += raw->raw_values[0]; + if (XIMaskIsSet(raw->valuators.mask, 1) != 0) + deltaY += raw->raw_values[1]; + + win->event.vector = RGFW_POINT((i32)deltaX, (i32)deltaY); + win->event.point.x = win->_lastMousePoint.x + win->event.vector.x; + win->event.point.y = win->_lastMousePoint.y + win->event.vector.y; + win->_lastMousePoint = win->event.point; + + RGFW_window_moveMouse(win, RGFW_POINT(win->r.x + (win->r.w / 2), win->r.y + (win->r.h / 2))); + + win->event.type = RGFW_mousePosChanged; + RGFW_mousePosCallback(win, win->event.point, win->event.vector); + } + + XFreeEventData(win->src.display, &E.xcookie); + break; + } + + case Expose: { + win->event.type = RGFW_windowRefresh; + RGFW_windowRefreshCallback(win); + +#ifdef RGFW_ADVANCED_SMOOTH_RESIZE + XSyncValue value; + XSyncIntToValue(&value, (i32)win->src.counter_value); + XSyncSetCounter(win->src.display, win->src.counter, value); +#endif + break; + } + case MapNotify: case UnmapNotify: RGFW_window_checkMode(win); break; + case ClientMessage: { + /* if the client closed the window */ + if (E.xclient.data.l[0] == (long)wm_delete_window) { + win->event.type = RGFW_quit; + RGFW_window_setShouldClose(win, RGFW_TRUE); + RGFW_windowQuitCallback(win); + break; + } +#ifdef RGFW_ADVANCED_SMOOTH_RESIZE + if (E.xclient.message_type == WM_PROTOCOLS && (Atom)E.xclient.data.l[0] == _NET_WM_SYNC_REQUEST) { + RGFW_windowRefreshCallback(win); + win->src.counter_value = 0; + win->src.counter_value |= E.xclient.data.l[2]; + win->src.counter_value |= (E.xclient.data.l[3] << 32); + + XSyncValue value; + XSyncIntToValue(&value, (i32)win->src.counter_value); + XSyncSetCounter(win->src.display, win->src.counter, value); + break; + } +#endif + if ((win->_flags & RGFW_windowAllowDND) == 0) + break; + + reply.xclient.window = source; + reply.xclient.format = 32; + reply.xclient.data.l[0] = (long)win->src.window; + reply.xclient.data.l[1] = 0; + reply.xclient.data.l[2] = None; + + if (E.xclient.message_type == XdndEnter) { + if (version > 5) + break; + + unsigned long count; + Atom* formats; + Atom real_formats[6]; + Bool list = E.xclient.data.l[1] & 1; + + source = (unsigned long int)E.xclient.data.l[0]; + version = E.xclient.data.l[1] >> 24; + format = None; + if (list) { + Atom actualType; + i32 actualFormat; + unsigned long bytesAfter; + + XGetWindowProperty( + win->src.display, source, XdndTypeList, + 0, LONG_MAX, False, 4, + &actualType, &actualFormat, &count, &bytesAfter, (u8**)&formats + ); + } else { + count = 0; + + size_t i; + for (i = 2; i < 5; i++) { + if (E.xclient.data.l[i] != None) { + real_formats[count] = (unsigned long int)E.xclient.data.l[i]; + count += 1; + } + } + + formats = real_formats; + } + + size_t i; + for (i = 0; i < count; i++) { + if (formats[i] == XtextUriList || formats[i] == XtextPlain) { + format = (int)formats[i]; + break; + } + } + + if (list) { + XFree(formats); + } + + break; + } + + if (E.xclient.message_type == XdndPosition) { + const i32 xabs = (E.xclient.data.l[2] >> 16) & 0xffff; + const i32 yabs = (E.xclient.data.l[2]) & 0xffff; + Window dummy; + i32 xpos, ypos; + + if (version > 5) + break; + + XTranslateCoordinates( + win->src.display, XDefaultRootWindow(win->src.display), win->src.window, + xabs, yabs, &xpos, &ypos, &dummy + ); + + win->event.point.x = xpos; + win->event.point.y = ypos; + + reply.xclient.window = source; + reply.xclient.message_type = XdndStatus; + + if (format) { + reply.xclient.data.l[1] = 1; + if (version >= 2) + reply.xclient.data.l[4] = (long)XdndActionCopy; + } + + XSendEvent(win->src.display, source, False, NoEventMask, &reply); + XFlush(win->src.display); + break; + } + if (E.xclient.message_type != XdndDrop) + break; + + if (version > 5) + break; + + size_t i; + for (i = 0; i < win->event.droppedFilesCount; i++) + win->event.droppedFiles[i][0] = '\0'; + + win->event.droppedFilesCount = 0; + + + win->event.type = RGFW_DNDInit; + + if (format) { + Time time = (version >= 1) + ? (Time)E.xclient.data.l[2] + : CurrentTime; + + XConvertSelection( + win->src.display, XdndSelection, (Atom)format, + XdndSelection, win->src.window, time + ); + } else if (version >= 2) { + XEvent new_reply = { ClientMessage }; + + XSendEvent(win->src.display, source, False, NoEventMask, &new_reply); + XFlush(win->src.display); + } + + RGFW_dndInitCallback(win, win->event.point); + } break; + case SelectionRequest: + RGFW_XHandleClipboardSelection(&E); + XFlush(win->src.display); + return RGFW_window_checkEvent(win); + case SelectionNotify: { + /* this is only for checking for xdnd drops */ + if (E.xselection.property != XdndSelection || !(win->_flags & RGFW_windowAllowDND)) + break; + char* data; + unsigned long result; + + Atom actualType; + i32 actualFormat; + unsigned long bytesAfter; + + XGetWindowProperty(win->src.display, E.xselection.requestor, E.xselection.property, 0, LONG_MAX, False, E.xselection.target, &actualType, &actualFormat, &result, &bytesAfter, (u8**) &data); + + if (result == 0) + break; + + const char* prefix = (const char*)"file://"; + + char* line; + + win->event.droppedFilesCount = 0; + win->event.type = RGFW_DND; + + while ((line = (char*)RGFW_strtok(data, "\r\n"))) { + char path[RGFW_MAX_PATH]; + + data = NULL; + + if (line[0] == '#') + continue; + + char* l; + for (l = line; 1; l++) { + if ((l - line) > 7) + break; + else if (*l != prefix[(l - line)]) + break; + else if (*l == '\0' && prefix[(l - line)] == '\0') { + line += 7; + while (*line != '/') + line++; + break; + } else if (*l == '\0') + break; + } + + win->event.droppedFilesCount++; + + size_t index = 0; + while (*line) { + if (line[0] == '%' && line[1] && line[2]) { + const char digits[3] = { line[1], line[2], '\0' }; + path[index] = (char) RGFW_STRTOL(digits, NULL, 16); + line += 2; + } else + path[index] = *line; + + index++; + line++; + } + path[index] = '\0'; + RGFW_MEMCPY(win->event.droppedFiles[win->event.droppedFilesCount - 1], path, index + 1); + } + + RGFW_dndCallback(win, win->event.droppedFiles, win->event.droppedFilesCount); + if (data) + XFree(data); + + if (version >= 2) { + XEvent new_reply = { ClientMessage }; + new_reply.xclient.window = source; + new_reply.xclient.message_type = XdndFinished; + new_reply.xclient.format = 32; + new_reply.xclient.data.l[1] = (long int)result; + new_reply.xclient.data.l[2] = (long int)XdndActionCopy; + XSendEvent(win->src.display, source, False, NoEventMask, &new_reply); + XFlush(win->src.display); + } + break; + } + case FocusIn: + if ((win->_flags & RGFW_windowFullscreen)) + XMapRaised(win->src.display, win->src.window); + + win->_flags |= RGFW_windowFocus; + win->event.type = RGFW_focusIn; + RGFW_focusCallback(win, 1); + + + RGFW_resetKey(); + if ((win->_flags & RGFW_HOLD_MOUSE)) RGFW_window_mouseHold(win, RGFW_AREA(win->r.w, win->r.h)); + break; + case FocusOut: + if ((win->_flags & RGFW_windowFullscreen)) + RGFW_window_minimize(win); + + win->_flags &= ~(u32)RGFW_windowFocus; + win->event.type = RGFW_focusOut; + RGFW_focusCallback(win, 0); + break; + case PropertyNotify: RGFW_window_checkMode(win); break; + case EnterNotify: { + win->event.type = RGFW_mouseEnter; + win->event.point.x = E.xcrossing.x; + win->event.point.y = E.xcrossing.y; + RGFW_mouseNotifyCallback(win, win->event.point, 1); + break; + } + + case LeaveNotify: { + win->event.type = RGFW_mouseLeave; + RGFW_mouseNotifyCallback(win, win->event.point, 0); + break; + } + + case ConfigureNotify: { + /* detect resize */ + RGFW_window_checkMode(win); + if (E.xconfigure.width != win->src.r.w || E.xconfigure.height != win->src.r.h) { + win->event.type = RGFW_windowResized; + win->src.r = win->r = RGFW_RECT(win->src.r.x, win->src.r.y, E.xconfigure.width, E.xconfigure.height); + RGFW_windowResizedCallback(win, win->r); + break; + } + + /* detect move */ + if (E.xconfigure.x != win->src.r.x || E.xconfigure.y != win->src.r.y) { + win->event.type = RGFW_windowMoved; + win->src.r = win->r = RGFW_RECT(E.xconfigure.x, E.xconfigure.y, win->src.r.w, win->src.r.h); + RGFW_windowMovedCallback(win, win->r); + break; + } + + break; + } + default: + XFlush(win->src.display); + return RGFW_window_checkEvent(win); + } + XFlush(win->src.display); + if (win->event.type) return &win->event; + else return NULL; +#endif +#ifdef RGFW_WAYLAND + wayland: + if ((win->_flags & RGFW_windowHide) == 0) + wl_display_roundtrip(win->src.wl_display); + return NULL; +#endif +} + +void RGFW_window_move(RGFW_window* win, RGFW_point v) { + RGFW_ASSERT(win != NULL); + win->r.x = v.x; + win->r.y = v.y; + RGFW_GOTO_WAYLAND(0); +#ifdef RGFW_X11 + XMoveWindow(win->src.display, win->src.window, v.x, v.y); +#endif +#ifdef RGFW_WAYLAND + wayland: + RGFW_ASSERT(win != NULL); + + if (win->src.compositor) { + struct wl_pointer *pointer = wl_seat_get_pointer(win->src.seat); + if (!pointer) { + return; + } + + wl_display_flush(win->src.wl_display); + } +#endif +} + + +void RGFW_window_resize(RGFW_window* win, RGFW_area a) { + RGFW_ASSERT(win != NULL); + win->r.w = (i32)a.w; + win->r.h = (i32)a.h; + RGFW_GOTO_WAYLAND(0); +#ifdef RGFW_X11 + XResizeWindow(win->src.display, win->src.window, a.w, a.h); + + if ((win->_flags & RGFW_windowNoResize)) { + XSizeHints sh; + sh.flags = (1L << 4) | (1L << 5); + sh.min_width = sh.max_width = (i32)a.w; + sh.min_height = sh.max_height = (i32)a.h; + + XSetWMSizeHints(win->src.display, (Drawable) win->src.window, &sh, XA_WM_NORMAL_HINTS); + } +#endif +#ifdef RGFW_WAYLAND + wayland: + if (win->src.compositor) { + xdg_surface_set_window_geometry(win->src.xdg_surface, 0, 0, win->r.w, win->r.h); + #ifdef RGFW_OPENGL + wl_egl_window_resize(win->src.eglWindow, (i32)a.w, (i32)a.h, 0, 0); + #endif + } +#endif +} + +void RGFW_window_setAspectRatio(RGFW_window* win, RGFW_area a) { + RGFW_ASSERT(win != NULL); + + if (a.w == 0 && a.h == 0) + return; + + XSizeHints hints; + long flags; + + XGetWMNormalHints(win->src.display, win->src.window, &hints, &flags); + + hints.flags |= PAspect; + + hints.min_aspect.x = hints.max_aspect.x = (i32)a.w; + hints.min_aspect.y = hints.max_aspect.y = (i32)a.h; + + XSetWMNormalHints(win->src.display, win->src.window, &hints); +} + +void RGFW_window_setMinSize(RGFW_window* win, RGFW_area a) { + RGFW_ASSERT(win != NULL); + + long flags; + XSizeHints hints; + RGFW_MEMSET(&hints, 0, sizeof(XSizeHints)); + + XGetWMNormalHints(win->src.display, win->src.window, &hints, &flags); + + hints.flags |= PMinSize; + + hints.min_width = (i32)a.w; + hints.min_height = (i32)a.h; + + XSetWMNormalHints(win->src.display, win->src.window, &hints); +} + +void RGFW_window_setMaxSize(RGFW_window* win, RGFW_area a) { + RGFW_ASSERT(win != NULL); + + long flags; + XSizeHints hints; + RGFW_MEMSET(&hints, 0, sizeof(XSizeHints)); + + XGetWMNormalHints(win->src.display, win->src.window, &hints, &flags); + + hints.flags |= PMaxSize; + + hints.max_width = (i32)a.w; + hints.max_height = (i32)a.h; + + XSetWMNormalHints(win->src.display, win->src.window, &hints); +} + +void RGFW_toggleXMaximized(RGFW_window* win, RGFW_bool maximized); +void RGFW_toggleXMaximized(RGFW_window* win, RGFW_bool maximized) { + RGFW_ASSERT(win != NULL); + RGFW_LOAD_ATOM(_NET_WM_STATE); + RGFW_LOAD_ATOM(_NET_WM_STATE_MAXIMIZED_VERT); + RGFW_LOAD_ATOM(_NET_WM_STATE_MAXIMIZED_HORZ); + + XEvent xev = {0}; + xev.type = ClientMessage; + xev.xclient.window = win->src.window; + xev.xclient.message_type = _NET_WM_STATE; + xev.xclient.format = 32; + xev.xclient.data.l[0] = maximized; + xev.xclient.data.l[1] = (long int)_NET_WM_STATE_MAXIMIZED_HORZ; + xev.xclient.data.l[2] = (long int)_NET_WM_STATE_MAXIMIZED_VERT; + xev.xclient.data.l[3] = 0; + xev.xclient.data.l[4] = 0; + + XSendEvent(win->src.display, DefaultRootWindow(win->src.display), False, SubstructureRedirectMask | SubstructureNotifyMask, &xev); +} + +void RGFW_window_maximize(RGFW_window* win) { + win->_oldRect = win->r; + RGFW_toggleXMaximized(win, 1); +} + +void RGFW_window_focus(RGFW_window* win) { + RGFW_ASSERT(win); + + XWindowAttributes attr; + XGetWindowAttributes(win->src.display, win->src.window, &attr); + if (attr.map_state != IsViewable) return; + + XSetInputFocus(win->src.display, win->src.window, RevertToPointerRoot, CurrentTime); + XFlush(win->src.display); +} + +void RGFW_window_raise(RGFW_window* win) { + RGFW_ASSERT(win); + XRaiseWindow(win->src.display, win->src.window); + XMapRaised(win->src.display, win->src.window); +} + +void RGFW_window_setXAtom(RGFW_window* win, Atom netAtom, RGFW_bool fullscreen); +void RGFW_window_setXAtom(RGFW_window* win, Atom netAtom, RGFW_bool fullscreen) { + RGFW_ASSERT(win != NULL); + RGFW_LOAD_ATOM(_NET_WM_STATE); + + XEvent xev = {0}; + xev.xclient.type = ClientMessage; + xev.xclient.serial = 0; + xev.xclient.send_event = True; + xev.xclient.message_type = _NET_WM_STATE; + xev.xclient.window = win->src.window; + xev.xclient.format = 32; + xev.xclient.data.l[0] = fullscreen; + xev.xclient.data.l[1] = (long int)netAtom; + xev.xclient.data.l[2] = 0; + + XSendEvent(win->src.display, DefaultRootWindow(win->src.display), False, SubstructureNotifyMask | SubstructureRedirectMask, &xev); +} + +void RGFW_window_setFullscreen(RGFW_window* win, RGFW_bool fullscreen) { + RGFW_ASSERT(win != NULL); + if (fullscreen) { + win->_flags |= RGFW_windowFullscreen; + win->_oldRect = win->r; + } + else win->_flags &= ~(u32)RGFW_windowFullscreen; + + RGFW_LOAD_ATOM(_NET_WM_STATE_FULLSCREEN); + + RGFW_window_setXAtom(win, _NET_WM_STATE_FULLSCREEN, fullscreen); + + XRaiseWindow(win->src.display, win->src.window); + XMapRaised(win->src.display, win->src.window); +} + +void RGFW_window_setFloating(RGFW_window* win, RGFW_bool floating) { + RGFW_ASSERT(win != NULL); + + RGFW_LOAD_ATOM(_NET_WM_STATE_ABOVE); + RGFW_window_setXAtom(win, _NET_WM_STATE_ABOVE, floating); +} + +void RGFW_window_setOpacity(RGFW_window* win, u8 opacity) { + RGFW_ASSERT(win != NULL); + const u32 value = (u32) (0xffffffffu * (double) opacity); + RGFW_LOAD_ATOM(NET_WM_WINDOW_OPACITY); + XChangeProperty(win->src.display, win->src.window, + NET_WM_WINDOW_OPACITY, XA_CARDINAL, 32, PropModeReplace, (unsigned char*) &value, 1); +} + +void RGFW_window_minimize(RGFW_window* win) { + RGFW_ASSERT(win != NULL); + if (RGFW_window_isMaximized(win)) return; + + win->_oldRect = win->r; + XIconifyWindow(win->src.display, win->src.window, DefaultScreen(win->src.display)); + XFlush(win->src.display); +} + +void RGFW_window_restore(RGFW_window* win) { + RGFW_ASSERT(win != NULL); + RGFW_toggleXMaximized(win, 0); + + win->r = win->_oldRect; + RGFW_window_move(win, RGFW_POINT(win->r.x, win->r.y)); + RGFW_window_resize(win, RGFW_AREA(win->r.w, win->r.h)); + + RGFW_window_show(win); + XFlush(win->src.display); +} + +RGFW_bool RGFW_window_isFloating(RGFW_window* win) { + RGFW_LOAD_ATOM(_NET_WM_STATE); + RGFW_LOAD_ATOM(_NET_WM_STATE_ABOVE); + + Atom actual_type; + int actual_format; + unsigned long nitems, bytes_after; + Atom* prop_return = NULL; + + int status = XGetWindowProperty(win->src.display, win->src.window, _NET_WM_STATE, 0, (~0L), False, XA_ATOM, + &actual_type, &actual_format, &nitems, &bytes_after, + (unsigned char **)&prop_return); + + if (status != Success || actual_type != XA_ATOM) + return RGFW_FALSE; + + unsigned long i; + for (i = 0; i < nitems; i++) + if (prop_return[i] == _NET_WM_STATE_ABOVE) return RGFW_TRUE; + + if (prop_return) + XFree(prop_return); + + return RGFW_FALSE; +} + +void RGFW_window_setName(RGFW_window* win, const char* name) { + RGFW_ASSERT(win != NULL); + RGFW_GOTO_WAYLAND(0); + #ifdef RGFW_X11 + XStoreName(win->src.display, win->src.window, name); + + RGFW_LOAD_ATOM(_NET_WM_NAME); + + char buf[256]; + RGFW_MEMSET(buf, 0, sizeof(buf)); + RGFW_STRNCPY(buf, name, sizeof(buf) - 1); + + XChangeProperty( + win->src.display, win->src.window, _NET_WM_NAME, RGFW_XUTF8_STRING, + 8, PropModeReplace, (u8*)buf, sizeof(buf) + ); + #endif + #ifdef RGFW_WAYLAND + wayland: + if (win->src.compositor) + xdg_toplevel_set_title(win->src.xdg_toplevel, name); + #endif +} + +#ifndef RGFW_NO_PASSTHROUGH +void RGFW_window_setMousePassthrough(RGFW_window* win, RGFW_bool passthrough) { + RGFW_ASSERT(win != NULL); + if (passthrough) { + Region region = XCreateRegion(); + XShapeCombineRegion(win->src.display, win->src.window, ShapeInput, 0, 0, region, ShapeSet); + XDestroyRegion(region); + + return; + } + + XShapeCombineMask(win->src.display, win->src.window, ShapeInput, 0, 0, None, ShapeSet); +} +#endif /* RGFW_NO_PASSTHROUGH */ + +RGFW_bool RGFW_window_setIconEx(RGFW_window* win, u8* icon, RGFW_area a, i32 channels, u8 type) { + RGFW_ASSERT(win != NULL); + RGFW_GOTO_WAYLAND(0); +#ifdef RGFW_X11 + RGFW_LOAD_ATOM(_NET_WM_ICON); + if (icon == NULL || (channels != 3 && channels != 4)) { + RGFW_bool res = (RGFW_bool)XChangeProperty( + win->src.display, win->src.window, _NET_WM_ICON, XA_CARDINAL, 32, + PropModeReplace, (u8*)NULL, 0 + ); + return res; + } + + i32 count = (i32)(2 + (a.w * a.h)); + + unsigned long* data = (unsigned long*) RGFW_ALLOC((u32)count * sizeof(unsigned long)); + RGFW_ASSERT(data != NULL); + + data[0] = (unsigned long)a.w; + data[1] = (unsigned long)a.h; + + unsigned long* target = &data[2]; + u32 x, y; + + for (x = 0; x < a.w; x++) { + for (y = 0; y < a.h; y++) { + size_t i = y * a.w + x; + u32 alpha = (channels == 4) ? icon[i * 4 + 3] : 0xFF; + + target[i] = (unsigned long)((icon[i * 4 + 0]) << 16) | + (unsigned long)((icon[i * 4 + 1]) << 8) | + (unsigned long)((icon[i * 4 + 2]) << 0) | + (unsigned long)(alpha << 24); + } + } + + RGFW_bool res = RGFW_TRUE; + if (type & RGFW_iconTaskbar) { + res = (RGFW_bool)XChangeProperty( + win->src.display, win->src.window, _NET_WM_ICON, XA_CARDINAL, 32, + PropModeReplace, (u8*)data, count + ); + } + + if (type & RGFW_iconWindow) { + XWMHints wm_hints; + wm_hints.flags = IconPixmapHint; + + i32 depth = DefaultDepth(win->src.display, DefaultScreen(win->src.display)); + XImage *image = XCreateImage(win->src.display, DefaultVisual(win->src.display, DefaultScreen(win->src.display)), + (u32)depth, ZPixmap, 0, (char *)target, a.w, a.h, 32, 0); + + wm_hints.icon_pixmap = XCreatePixmap(win->src.display, win->src.window, a.w, a.h, (u32)depth); + XPutImage(win->src.display, wm_hints.icon_pixmap, DefaultGC(win->src.display, DefaultScreen(win->src.display)), image, 0, 0, 0, 0, a.w, a.h); + image->data = NULL; + XDestroyImage(image); + + XSetWMHints(win->src.display, win->src.window, &wm_hints); + } + + RGFW_FREE(data); + XFlush(win->src.display); + return RGFW_BOOL(res); +#endif +#ifdef RGFW_WAYLAND + wayland: + return RGFW_FALSE; +#endif +} + +RGFW_mouse* RGFW_loadMouse(u8* icon, RGFW_area a, i32 channels) { + RGFW_ASSERT(icon); + RGFW_ASSERT(channels == 3 || channels == 4); + RGFW_GOTO_WAYLAND(0); + +#ifdef RGFW_X11 +#ifndef RGFW_NO_X11_CURSOR + RGFW_init(); + XcursorImage* native = XcursorImageCreate((i32)a.w, (i32)a.h); + native->xhot = 0; + native->yhot = 0; + + XcursorPixel* target = native->pixels; + size_t x, y; + for (x = 0; x < a.w; x++) { + for (y = 0; y < a.h; y++) { + size_t i = y * a.w + x; + u32 alpha = (channels == 4) ? icon[i * 4 + 3] : 0xFF; + + target[i] = (u32)((icon[i * 4 + 0]) << 16) + | (u32)((icon[i * 4 + 1]) << 8) + | (u32)((icon[i * 4 + 2]) << 0) + | (u32)(alpha << 24); + } + } + + Cursor cursor = XcursorImageLoadCursor(_RGFW.display, native); + XcursorImageDestroy(native); + + return (void*)cursor; +#else + RGFW_UNUSED(image); RGFW_UNUSED(a.w); RGFW_UNUSED(channels); + return NULL; +#endif +#endif +#ifdef RGFW_WAYLAND + wayland: + RGFW_UNUSED(icon); RGFW_UNUSED(a); RGFW_UNUSED(channels); + return NULL; /* TODO */ +#endif +} + +void RGFW_window_setMouse(RGFW_window* win, RGFW_mouse* mouse) { +RGFW_GOTO_WAYLAND(0); +#ifdef RGFW_X11 + RGFW_ASSERT(win && mouse); + XDefineCursor(win->src.display, win->src.window, (Cursor)mouse); +#endif +#ifdef RGFW_WAYLAND + wayland: + RGFW_UNUSED(win); RGFW_UNUSED(mouse); +#endif +} + +void RGFW_freeMouse(RGFW_mouse* mouse) { +RGFW_GOTO_WAYLAND(0); +#ifdef RGFW_X11 + RGFW_ASSERT(mouse); + XFreeCursor(_RGFW.display, (Cursor)mouse); +#endif +#ifdef RGFW_WAYLAND + wayland: + RGFW_UNUSED(mouse); +#endif +} + +void RGFW_window_moveMouse(RGFW_window* win, RGFW_point p) { +RGFW_GOTO_WAYLAND(1); +#ifdef RGFW_X11 + RGFW_ASSERT(win != NULL); + + XEvent event; + XQueryPointer(win->src.display, DefaultRootWindow(win->src.display), + &event.xbutton.root, &event.xbutton.window, + &event.xbutton.x_root, &event.xbutton.y_root, + &event.xbutton.x, &event.xbutton.y, + &event.xbutton.state); + + win->_lastMousePoint = RGFW_POINT(p.x - win->r.x, p.y - win->r.y); + if (event.xbutton.x == p.x && event.xbutton.y == p.y) + return; + + XWarpPointer(win->src.display, None, win->src.window, 0, 0, 0, 0, (int) p.x - win->r.x, (int) p.y - win->r.y); +#endif +#ifdef RGFW_WAYLAND + wayland: + RGFW_UNUSED(win); RGFW_UNUSED(p); +#endif +} + +RGFW_bool RGFW_window_setMouseDefault(RGFW_window* win) { + return RGFW_window_setMouseStandard(win, RGFW_mouseArrow); +} + +RGFW_bool RGFW_window_setMouseStandard(RGFW_window* win, u8 mouse) { + RGFW_ASSERT(win != NULL); + RGFW_GOTO_WAYLAND(0); +#ifdef RGFW_X11 + static const u8 mouseIconSrc[16] = { XC_arrow, XC_left_ptr, XC_xterm, XC_crosshair, XC_hand2, XC_sb_h_double_arrow, XC_sb_v_double_arrow, XC_bottom_left_corner, XC_bottom_right_corner, XC_fleur, XC_X_cursor}; + + if (mouse > (sizeof(mouseIconSrc) / sizeof(u8))) + return RGFW_FALSE; + + mouse = mouseIconSrc[mouse]; + + Cursor cursor = XCreateFontCursor(win->src.display, mouse); + XDefineCursor(win->src.display, win->src.window, (Cursor) cursor); + + XFreeCursor(win->src.display, (Cursor) cursor); + return RGFW_TRUE; +#endif +#ifdef RGFW_WAYLAND + wayland: { } + static const char* iconStrings[16] = { "left_ptr", "left_ptr", "text", "cross", "pointer", "e-resize", "n-resize", "nw-resize", "ne-resize", "all-resize", "not-allowed" }; + + struct wl_cursor* wlcursor = wl_cursor_theme_get_cursor(RGFW_wl_cursor_theme, iconStrings[mouse]); + RGFW_cursor_image = wlcursor->images[0]; + struct wl_buffer* cursor_buffer = wl_cursor_image_get_buffer(RGFW_cursor_image); + + wl_surface_attach(RGFW_cursor_surface, cursor_buffer, 0, 0); + wl_surface_commit(RGFW_cursor_surface); + return RGFW_TRUE; + +#endif +} + +void RGFW_window_hide(RGFW_window* win) { + RGFW_GOTO_WAYLAND(0); +#ifdef RGFW_X11 + XUnmapWindow(win->src.display, win->src.window); +#endif +#ifdef RGFW_WAYLAND + wayland: + wl_surface_attach(win->src.surface, NULL, 0, 0); + wl_surface_commit(win->src.surface); + win->_flags |= RGFW_windowHide; +#endif +} + +void RGFW_window_show(RGFW_window* win) { + win->_flags &= ~(u32)RGFW_windowHide; + if (win->_flags & RGFW_windowFocusOnShow) RGFW_window_focus(win); + RGFW_GOTO_WAYLAND(0); +#ifdef RGFW_X11 + XMapWindow(win->src.display, win->src.window); +#endif +#ifdef RGFW_WAYLAND + wayland: + /* wl_surface_attach(win->src.surface, win->rc., 0, 0); */ + wl_surface_commit(win->src.surface); +#endif +} + +RGFW_ssize_t RGFW_readClipboardPtr(char* str, size_t strCapacity) { + RGFW_GOTO_WAYLAND(1); +#ifdef RGFW_X11 + RGFW_init(); + if (XGetSelectionOwner(_RGFW.display, RGFW_XCLIPBOARD) == _RGFW.helperWindow) { + if (str != NULL) + RGFW_STRNCPY(str, _RGFW.clipboard, _RGFW.clipboard_len - 1); + _RGFW.clipboard[_RGFW.clipboard_len - 1] = '\0'; + return (RGFW_ssize_t)_RGFW.clipboard_len - 1; + } + + XEvent event; + int format; + unsigned long N, sizeN; + char* data; + Atom target; + + RGFW_LOAD_ATOM(XSEL_DATA); + + XConvertSelection(_RGFW.display, RGFW_XCLIPBOARD, RGFW_XUTF8_STRING, XSEL_DATA, _RGFW.helperWindow, CurrentTime); + XSync(_RGFW.display, 0); + while (1) { + XNextEvent(_RGFW.display, &event); + if (event.type != SelectionNotify) continue; + + if (event.xselection.selection != RGFW_XCLIPBOARD || event.xselection.property == 0) + return -1; + break; + } + + XGetWindowProperty(event.xselection.display, event.xselection.requestor, + event.xselection.property, 0L, (~0L), 0, AnyPropertyType, &target, + &format, &sizeN, &N, (u8**) &data); + + RGFW_ssize_t size; + if (sizeN > strCapacity && str != NULL) + size = -1; + + if ((target == RGFW_XUTF8_STRING || target == XA_STRING) && str != NULL) { + RGFW_MEMCPY(str, data, sizeN); + str[sizeN] = '\0'; + XFree(data); + } else if (str != NULL) size = -1; + + XDeleteProperty(event.xselection.display, event.xselection.requestor, event.xselection.property); + size = (RGFW_ssize_t)sizeN; + + return size; +#endif +#if defined(RGFW_WAYLAND) +wayland: return 0; +#endif +} + +i32 RGFW_XHandleClipboardSelectionHelper(void) { +#ifdef RGFW_X11 + RGFW_LOAD_ATOM(SAVE_TARGETS); + + XEvent event; + XPending(_RGFW.display); + + if (QLength(_RGFW.display) || XEventsQueued(_RGFW.display, QueuedAlready) + XEventsQueued(_RGFW.display, QueuedAfterReading)) + XNextEvent(_RGFW.display, &event); + else + return 0; + + switch (event.type) { + case SelectionRequest: + RGFW_XHandleClipboardSelection(&event); + return 0; + case SelectionNotify: + if (event.xselection.target == SAVE_TARGETS) + return 0; + break; + default: break; + } + + return 0; +#else + return 1; +#endif +} + +void RGFW_writeClipboard(const char* text, u32 textLen) { + RGFW_GOTO_WAYLAND(1); + #ifdef RGFW_X11 + RGFW_LOAD_ATOM(SAVE_TARGETS); + RGFW_init(); + + /* request ownership of the clipboard section and request to convert it, this means its our job to convert it */ + XSetSelectionOwner(_RGFW.display, RGFW_XCLIPBOARD, _RGFW.helperWindow, CurrentTime); + if (XGetSelectionOwner(_RGFW.display, RGFW_XCLIPBOARD) != _RGFW.helperWindow) { + RGFW_sendDebugInfo(RGFW_typeError, RGFW_errClipboard, RGFW_DEBUG_CTX(_RGFW.root, 0), "X11 failed to become owner of clipboard selection"); + return; + } + + if (_RGFW.clipboard) + RGFW_FREE(_RGFW.clipboard); + + _RGFW.clipboard = (char*)RGFW_ALLOC(textLen); + RGFW_ASSERT(_RGFW.clipboard != NULL); + + RGFW_STRNCPY(_RGFW.clipboard, text, textLen - 1); + _RGFW.clipboard[textLen - 1] = '\0'; + _RGFW.clipboard_len = textLen; + #endif + #ifdef RGFW_WAYLAND + wayland: + RGFW_UNUSED(text); RGFW_UNUSED(textLen); + #endif +} + +RGFW_bool RGFW_window_isHidden(RGFW_window* win) { + RGFW_ASSERT(win != NULL); + + XWindowAttributes windowAttributes; + XGetWindowAttributes(win->src.display, win->src.window, &windowAttributes); + + return (windowAttributes.map_state == IsUnmapped && !RGFW_window_isMinimized(win)); +} + +RGFW_bool RGFW_window_isMinimized(RGFW_window* win) { + RGFW_ASSERT(win != NULL); + RGFW_LOAD_ATOM(WM_STATE); + + Atom actual_type; + i32 actual_format; + unsigned long nitems, bytes_after; + unsigned char* prop_data; + + i32 status = XGetWindowProperty(win->src.display, win->src.window, WM_STATE, 0, 2, False, + AnyPropertyType, &actual_type, &actual_format, + &nitems, &bytes_after, &prop_data); + + if (status == Success && nitems >= 1 && prop_data == (unsigned char*)IconicState) { + XFree(prop_data); + return RGFW_TRUE; + } + + if (prop_data != NULL) + XFree(prop_data); + + XWindowAttributes windowAttributes; + XGetWindowAttributes(win->src.display, win->src.window, &windowAttributes); + return windowAttributes.map_state != IsViewable; +} + +RGFW_bool RGFW_window_isMaximized(RGFW_window* win) { + RGFW_ASSERT(win != NULL); + RGFW_LOAD_ATOM(_NET_WM_STATE); + RGFW_LOAD_ATOM(_NET_WM_STATE_MAXIMIZED_VERT); + RGFW_LOAD_ATOM(_NET_WM_STATE_MAXIMIZED_HORZ); + + Atom actual_type; + i32 actual_format; + unsigned long nitems, bytes_after; + unsigned char* prop_data; + + i32 status = XGetWindowProperty(win->src.display, win->src.window, _NET_WM_STATE, 0, 1024, False, + XA_ATOM, &actual_type, &actual_format, + &nitems, &bytes_after, &prop_data); + + if (status != Success) { + if (prop_data != NULL) + XFree(prop_data); + + return RGFW_FALSE; + } + + u64 i; + for (i = 0; i < nitems; ++i) { + if (prop_data[i] == _NET_WM_STATE_MAXIMIZED_VERT || + prop_data[i] == _NET_WM_STATE_MAXIMIZED_HORZ) { + XFree(prop_data); + return RGFW_TRUE; + } + } + + if (prop_data != NULL) + XFree(prop_data); + + return RGFW_FALSE; +} + +#ifndef RGFW_NO_DPI +u32 RGFW_XCalculateRefreshRate(XRRModeInfo mi); +u32 RGFW_XCalculateRefreshRate(XRRModeInfo mi) { + if (mi.hTotal == 0 || mi.vTotal == 0) return 0; + return (u32) RGFW_ROUND((double) mi.dotClock / ((double) mi.hTotal * (double) mi.vTotal)); +} +#endif + + +static float XGetSystemContentDPI(Display* display, i32 screen) { + float dpi = 96.0f; + + #ifndef RGFW_NO_DPI + RGFW_UNUSED(screen); + char* rms = XResourceManagerString(display); + XrmDatabase db = NULL; + if (rms) db = XrmGetStringDatabase(rms); + + if (rms && db) { + XrmValue value; + char* type = NULL; + + if (XrmGetResource(db, "Xft.dpi", "Xft.Dpi", &type, &value) && type && RGFW_STRNCMP(type, "String", 7) == 0) + dpi = (float)RGFW_ATOF(value.addr); + XrmDestroyDatabase(db); + } + #else + dpi = RGFW_ROUND(DisplayWidth(display, screen) / (DisplayWidthMM(display, screen) / 25.4)); + #endif + + return dpi; +} + +RGFW_monitor RGFW_XCreateMonitor(i32 screen); +RGFW_monitor RGFW_XCreateMonitor(i32 screen) { + RGFW_monitor monitor; + RGFW_init(); + Display* display = _RGFW.display; + + if (screen == -1) screen = DefaultScreen(display); + + Screen* scrn = DefaultScreenOfDisplay(display); + RGFW_area size = RGFW_AREA(scrn->width, scrn->height); + + monitor.x = 0; + monitor.y = 0; + monitor.mode.area = RGFW_AREA(size.w, size.h); + monitor.physW = (float)DisplayWidthMM(display, screen) / 25.4f; + monitor.physH = (float)DisplayHeightMM(display, screen) / 25.4f; + + RGFW_splitBPP((u32)DefaultDepth(display, DefaultScreen(display)), &monitor.mode); + + char* name = XDisplayName((const char*)display); + RGFW_STRNCPY(monitor.name, name, sizeof(monitor.name) - 1); + monitor.name[sizeof(monitor.name) - 1] = '\0'; + + float dpi = XGetSystemContentDPI(display, screen); + monitor.pixelRatio = dpi >= 192.0f ? 2 : 1; + monitor.scaleX = (float) (dpi) / 96.0f; + monitor.scaleY = (float) (dpi) / 96.0f; + + #ifndef RGFW_NO_DPI + XRRScreenResources* sr = XRRGetScreenResourcesCurrent(display, RootWindow(display, screen)); + monitor.mode.refreshRate = RGFW_XCalculateRefreshRate(sr->modes[screen]); + + XRRCrtcInfo* ci = NULL; + int crtc = screen; + + if (sr->ncrtc > crtc) { + ci = XRRGetCrtcInfo(display, sr, sr->crtcs[crtc]); + } + #endif + + #ifndef RGFW_NO_DPI + XRROutputInfo* info = XRRGetOutputInfo (display, sr, sr->outputs[screen]); + + if (info == NULL || ci == NULL) { + XRRFreeScreenResources(sr); + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoMonitor, RGFW_DEBUG_CTX_MON(monitor), "monitor found"); + return monitor; + } + + + float physW = (float)info->mm_width / 25.4f; + float physH = (float)info->mm_height / 25.4f; + + RGFW_STRNCPY(monitor.name, info->name, sizeof(monitor.name) - 1); + monitor.name[sizeof(monitor.name) - 1] = '\0'; + + if ((u8)physW && (u8)physH) { + monitor.physW = physW; + monitor.physH = physH; + } + + monitor.x = ci->x; + monitor.y = ci->y; + + if (ci->width && ci->height) { + monitor.mode.area.w = (u32)ci->width; + monitor.mode.area.h = (u32)ci->height; + } + #endif + + #ifndef RGFW_NO_DPI + XRRFreeCrtcInfo(ci); + XRRFreeScreenResources(sr); + #endif + + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoMonitor, RGFW_DEBUG_CTX_MON(monitor), "monitor found"); + return monitor; +} + +RGFW_monitor* RGFW_getMonitors(size_t* len) { + static RGFW_monitor monitors[7]; + + RGFW_GOTO_WAYLAND(1); + #ifdef RGFW_X11 + RGFW_init(); + + Display* display = _RGFW.display; + i32 max = ScreenCount(display); + + i32 i; + for (i = 0; i < max && i < 6; i++) + monitors[i] = RGFW_XCreateMonitor(i); + + if (len != NULL) *len = (size_t)((max <= 6) ? (max) : (6)); + + return monitors; + #endif + #ifdef RGFW_WAYLAND + wayland: return monitors; /* TODO WAYLAND */ + #endif +} + +RGFW_monitor RGFW_getPrimaryMonitor(void) { + RGFW_GOTO_WAYLAND(1); + #ifdef RGFW_X11 + return RGFW_XCreateMonitor(-1); + #endif + #ifdef RGFW_WAYLAND + wayland: return (RGFW_monitor){ 0 }; /* TODO WAYLAND */ + #endif +} + +RGFW_bool RGFW_monitor_requestMode(RGFW_monitor mon, RGFW_monitorMode mode, RGFW_modeRequest request) { + RGFW_GOTO_WAYLAND(1); +#ifdef RGFW_X11 + #ifndef RGFW_NO_DPI + RGFW_init(); + XRRScreenResources* screenRes = XRRGetScreenResources(_RGFW.display, DefaultRootWindow(_RGFW.display)); + if (screenRes == NULL) return RGFW_FALSE; + + int i; + for (i = 0; i < screenRes->ncrtc; i++) { + XRRCrtcInfo* crtcInfo = XRRGetCrtcInfo(_RGFW.display, screenRes, screenRes->crtcs[i]); + if (!crtcInfo) continue; + + if (mon.x == crtcInfo->x && mon.y == crtcInfo->y && (u32)mon.mode.area.w == crtcInfo->width && (u32)mon.mode.area.h == crtcInfo->height) { + RRMode rmode = None; + int index; + for (index = 0; index < screenRes->nmode; index++) { + RGFW_monitorMode foundMode; + foundMode.area = RGFW_AREA(screenRes->modes[index].width, screenRes->modes[index].height); + foundMode.refreshRate = RGFW_XCalculateRefreshRate(screenRes->modes[index]); + RGFW_splitBPP((u32)DefaultDepth(_RGFW.display, DefaultScreen(_RGFW.display)), &foundMode); + + if (RGFW_monitorModeCompare(mode, foundMode, request)) { + rmode = screenRes->modes[index].id; + + RROutput output = screenRes->outputs[i]; + XRROutputInfo* info = XRRGetOutputInfo(_RGFW.display, screenRes, output); + if (info) { + XRRSetCrtcConfig(_RGFW.display, screenRes, screenRes->crtcs[i], + CurrentTime, 0, 0, rmode, RR_Rotate_0, &output, 1); + XRRFreeOutputInfo(info); + XRRFreeCrtcInfo(crtcInfo); + XRRFreeScreenResources(screenRes); + return RGFW_TRUE; + } + } + } + + XRRFreeCrtcInfo(crtcInfo); + XRRFreeScreenResources(screenRes); + return RGFW_FALSE; + } + + XRRFreeCrtcInfo(crtcInfo); + } + + XRRFreeScreenResources(screenRes); + return RGFW_FALSE; + #endif +#endif +#ifdef RGFW_WAYLAND +wayland: +#endif + return RGFW_FALSE; +} + +RGFW_monitor RGFW_window_getMonitor(RGFW_window* win) { + RGFW_monitor mon; + RGFW_MEMSET(&mon, 0, sizeof(mon)); + + RGFW_ASSERT(win != NULL); + RGFW_GOTO_WAYLAND(1); +#ifdef RGFW_X11 + XWindowAttributes attrs; + if (!XGetWindowAttributes(win->src.display, win->src.window, &attrs)) { + return mon; + } + + i32 i; + for (i = 0; i < ScreenCount(win->src.display) && i < 6; i++) { + Screen* screen = ScreenOfDisplay(win->src.display, i); + if (attrs.x >= 0 && attrs.x < XWidthOfScreen(screen) && + attrs.y >= 0 && attrs.y < XHeightOfScreen(screen)) + return RGFW_XCreateMonitor(i); + } +#endif +#ifdef RGFW_WAYLAND +wayland: +#endif + return mon; + +} + +#if defined(RGFW_OPENGL) && !defined(RGFW_EGL) +void RGFW_window_makeCurrent_OpenGL(RGFW_window* win) { + if (win == NULL) + glXMakeCurrent(NULL, (Drawable)NULL, (GLXContext) NULL); + else + glXMakeCurrent(win->src.display, (Drawable) win->src.window, (GLXContext) win->src.ctx); +} +void* RGFW_getCurrent_OpenGL(void) { return glXGetCurrentContext(); } +void RGFW_window_swapBuffers_OpenGL(RGFW_window* win) { glXSwapBuffers(win->src.display, win->src.window); } +#endif + +void RGFW_window_swapBuffers_software(RGFW_window* win) { + RGFW_ASSERT(win != NULL); + RGFW_GOTO_WAYLAND(0); +#if defined(RGFW_OSMESA) || defined(RGFW_BUFFER) + #ifdef RGFW_X11 + win->src.bitmap->data = (char*) win->buffer; + RGFW_RGB_to_BGR(win, (u8*)win->src.bitmap->data); + XPutImage(win->src.display, win->src.window, win->src.gc, win->src.bitmap, 0, 0, 0, 0, win->bufferSize.w, win->bufferSize.h); + win->src.bitmap->data = NULL; + return; + #endif + #ifdef RGFW_WAYLAND + wayland: + #if !defined(RGFW_BUFFER_BGR) && !defined(RGFW_OSMESA) + RGFW_RGB_to_BGR(win, win->src.buffer); + #else + size_t y; + for (y = 0; y < win->r.h; y++) { + u32 index = (y * 4 * win->r.w); + u32 index2 = (y * 4 * win->bufferSize.w); + RGFW_MEMCPY(&win->src.buffer[index], &win->buffer[index2], win->r.w * 4); + } + #endif + + wl_surface_frame_done(win, NULL, 0); + wl_surface_commit(win->src.surface); + #endif +#else +#ifdef RGFW_WAYLAND + wayland: +#endif + RGFW_UNUSED(win); +#endif +} + +#if !defined(RGFW_EGL) + +void RGFW_window_swapInterval(RGFW_window* win, i32 swapInterval) { + RGFW_ASSERT(win != NULL); + + #if defined(RGFW_OPENGL) + // cached pfn to avoid calling glXGetProcAddress more than once + static PFNGLXSWAPINTERVALEXTPROC pfn = (PFNGLXSWAPINTERVALEXTPROC)123; + static int (*pfn2)(int) = NULL; + + if (pfn == (PFNGLXSWAPINTERVALEXTPROC)123) { + pfn = ((PFNGLXSWAPINTERVALEXTPROC)glXGetProcAddress((GLubyte*) "glXSwapIntervalEXT")); + if (pfn == NULL) { + const char* array[] = {"GLX_MESA_swap_control", "GLX_SGI_swap_control"}; + u32 i; + for (i = 0; i < sizeof(array) / sizeof(char*) && pfn2 == NULL; i++) + pfn2 = ((int(*)(int))glXGetProcAddress((GLubyte*) array[i])); + + if (pfn2 != NULL) { + RGFW_sendDebugInfo(RGFW_typeError, RGFW_errOpenglContext, RGFW_DEBUG_CTX(_RGFW.root, 0), "Failed to load swap interval function, fallingback to the native swapinterval function"); + } else { + RGFW_sendDebugInfo(RGFW_typeError, RGFW_errOpenglContext, RGFW_DEBUG_CTX(_RGFW.root, 0), "Failed to load swap interval function"); + } + } + } + if (pfn != NULL) + pfn(win->src.display, win->src.window, swapInterval); + else if (pfn2 != NULL) { + pfn2(swapInterval); + } + #else + RGFW_UNUSED(swapInterval); + #endif +} +#endif + +void RGFW_deinit(void) { + if (_RGFW.windowCount == -1 || _RGFW_init == RGFW_FALSE) return; + #define RGFW_FREE_LIBRARY(x) if (x != NULL) dlclose(x); x = NULL; +#ifdef RGFW_X11 + /* to save the clipboard on the x server after the window is closed */ + RGFW_LOAD_ATOM(CLIPBOARD_MANAGER); + RGFW_LOAD_ATOM(SAVE_TARGETS); + if (XGetSelectionOwner(_RGFW.display, RGFW_XCLIPBOARD) == _RGFW.helperWindow) { + XConvertSelection(_RGFW.display, CLIPBOARD_MANAGER, SAVE_TARGETS, None, _RGFW.helperWindow, CurrentTime); + while (RGFW_XHandleClipboardSelectionHelper()); + } + if (_RGFW.clipboard) { + RGFW_FREE(_RGFW.clipboard); + _RGFW.clipboard = NULL; + } + + RGFW_freeMouse(_RGFW.hiddenMouse); + XCloseDisplay(_RGFW.display); /*!< kill connection to the x server */ + + #if !defined(RGFW_NO_X11_CURSOR_PRELOAD) && !defined(RGFW_NO_X11_CURSOR) + RGFW_FREE_LIBRARY(X11Cursorhandle); + #endif + #if !defined(RGFW_NO_X11_XI_PRELOAD) + RGFW_FREE_LIBRARY(X11Xihandle); + #endif + + #ifdef RGFW_USE_XDL + XDL_close(); + #endif + + #if !defined(RGFW_NO_X11_EXT_PRELOAD) + RGFW_FREE_LIBRARY(X11XEXThandle); + #endif +#endif +#ifdef RGFW_WAYLAND + wl_display_disconnect(_RGFW.wl_display); +#endif + #ifndef RGFW_NO_LINUX + if (RGFW_eventWait_forceStop[0] || RGFW_eventWait_forceStop[1]){ + close(RGFW_eventWait_forceStop[0]); + close(RGFW_eventWait_forceStop[1]); + } + + u8 i; + for (i = 0; i < RGFW_gamepadCount; i++) { + if(RGFW_gamepads[i]) + close(RGFW_gamepads[i]); + } + #endif + + _RGFW.root = NULL; + _RGFW.windowCount = -1; + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoGlobal, RGFW_DEBUG_CTX(NULL, 0), "global context deinitialized"); +} + +void RGFW_window_close(RGFW_window* win) { + RGFW_ASSERT(win != NULL); + if ((win->_flags & RGFW_windowNoInitAPI) == 0) RGFW_window_freeOpenGL(win); + + #ifdef RGFW_X11 + RGFW_GOTO_WAYLAND(0); + + /* ungrab pointer if it was grabbed */ + if (win->_flags & RGFW_HOLD_MOUSE) + XUngrabPointer(win->src.display, CurrentTime); + + #if defined(RGFW_OSMESA) || defined(RGFW_BUFFER) + if (win->buffer != NULL) { + if ((win->_flags & RGFW_BUFFER_ALLOC)) + RGFW_FREE(win->buffer); + XDestroyImage((XImage*) win->src.bitmap); + } + #endif + + XFreeGC(win->src.display, win->src.gc); + XDestroyWindow(win->src.display, (Drawable) win->src.window); /*!< close the window */ + win->src.window = 0; + XCloseDisplay(win->src.display); + + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoWindow, RGFW_DEBUG_CTX(win, 0), "a window was freed"); + _RGFW.windowCount--; + if (_RGFW.windowCount == 0) RGFW_deinit(); + + RGFW_clipboard_switch(NULL); + RGFW_FREE(win->event.droppedFiles); + if ((win->_flags & RGFW_WINDOW_ALLOC)) { + RGFW_FREE(win); + win = NULL; + } + return; + #endif + + #ifdef RGFW_WAYLAND + wayland: + + #ifdef RGFW_X11 + XDestroyWindow(win->src.display, (Drawable) win->src.window); + #endif + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoWindow, RGFW_DEBUG_CTX(win, 0), "a window was freed"); + _RGFW.windowCount--; + if (_RGFW.windowCount == 0) RGFW_deinit(); + + xdg_toplevel_destroy(win->src.xdg_toplevel); + xdg_surface_destroy(win->src.xdg_surface); + wl_surface_destroy(win->src.surface); + + #if defined(RGFW_OSMESA) || defined(RGFW_BUFFER) + wl_buffer_destroy(win->src.wl_buffer); + if ((win->_flags & RGFW_BUFFER_ALLOC)) + RGFW_FREE(win->buffer); + + munmap(win->src.buffer, (size_t)(win->r.w * win->r.h * 4)); + #endif + + RGFW_clipboard_switch(NULL); + RGFW_FREE(win->event.droppedFiles); + if ((win->_flags & RGFW_WINDOW_ALLOC)) { + RGFW_FREE(win); + win = NULL; + } + #endif +} + + +/* + End of X11 linux / wayland / unix defines +*/ + +#include +#include +#include + +void RGFW_stopCheckEvents(void) { + + RGFW_eventWait_forceStop[2] = 1; + while (1) { + const char byte = 0; + const ssize_t result = write(RGFW_eventWait_forceStop[1], &byte, 1); + if (result == 1 || result == -1) + break; + } +} + +void RGFW_window_eventWait(RGFW_window* win, i32 waitMS) { + if (waitMS == 0) return; + + u8 i; + if (RGFW_eventWait_forceStop[0] == 0 || RGFW_eventWait_forceStop[1] == 0) { + if (pipe(RGFW_eventWait_forceStop) != -1) { + fcntl(RGFW_eventWait_forceStop[0], F_GETFL, 0); + fcntl(RGFW_eventWait_forceStop[0], F_GETFD, 0); + fcntl(RGFW_eventWait_forceStop[1], F_GETFL, 0); + fcntl(RGFW_eventWait_forceStop[1], F_GETFD, 0); + } + } + + struct pollfd fds[] = { + #ifdef RGFW_WAYLAND + { wl_display_get_fd(win->src.wl_display), POLLIN, 0 }, + #else + { ConnectionNumber(win->src.display), POLLIN, 0 }, + #endif + #ifdef RGFW_X11 + { ConnectionNumber(_RGFW.display), POLLIN, 0 }, + #endif + { RGFW_eventWait_forceStop[0], POLLIN, 0 }, + #if defined(__linux__) + { -1, POLLIN, 0 }, {-1, POLLIN, 0 }, {-1, POLLIN, 0 }, {-1, POLLIN, 0} + #endif + }; + + u8 index = 2; +#ifdef RGFW_X11 + index++; +#endif + + #if defined(__linux__) || defined(__NetBSD__) + for (i = 0; i < RGFW_gamepadCount; i++) { + if (RGFW_gamepads[i] == 0) + continue; + + fds[index].fd = RGFW_gamepads[i]; + index++; + } + #endif + + + u64 start = RGFW_getTimeNS(); + + + #ifdef RGFW_WAYLAND + while (wl_display_dispatch(win->src.wl_display) <= 0 + #else + while (XPending(win->src.display) == 0 + #endif + #ifdef RGFW_X11 + && XPending(_RGFW.display) == 0 + #endif + ) { + if (poll(fds, index, waitMS) <= 0) + break; + + if (waitMS != RGFW_eventWaitNext) + waitMS -= (i32)(RGFW_getTimeNS() - start) / (i32)1e+6; + } + + /* drain any data in the stop request */ + if (RGFW_eventWait_forceStop[2]) { + char data[64]; + (void)!read(RGFW_eventWait_forceStop[0], data, sizeof(data)); + + RGFW_eventWait_forceStop[2] = 0; + } +} + +i32 RGFW_getClock(void); +i32 RGFW_getClock(void) { + static i32 clock = -1; + if (clock != -1) return clock; + + #if defined(_POSIX_MONOTONIC_CLOCK) + struct timespec ts; + if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) + clock = CLOCK_MONOTONIC; + #else + clock = CLOCK_REALTIME; + #endif + + return clock; +} + +u64 RGFW_getTimerFreq(void) { return 1000000000LLU; } +u64 RGFW_getTimerValue(void) { + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + return (u64)ts.tv_sec * RGFW_getTimerFreq() + (u64)ts.tv_nsec; +} +#endif /* end of wayland or X11 defines */ + + + +/* + + Start of Windows defines + + +*/ + +#ifdef RGFW_WINDOWS +#define WIN32_LEAN_AND_MEAN +#define OEMRESOURCE +#include + +#include +#include +#include +#include +#include +#include +#include + +#ifndef WM_DPICHANGED +#define WM_DPICHANGED 0x02E0 +#endif + +#ifndef RGFW_NO_XINPUT + typedef DWORD (WINAPI * PFN_XInputGetState)(DWORD,XINPUT_STATE*); + PFN_XInputGetState XInputGetStateSRC = NULL; + #define XInputGetState XInputGetStateSRC + + typedef DWORD (WINAPI * PFN_XInputGetKeystroke)(DWORD, DWORD, PXINPUT_KEYSTROKE); + PFN_XInputGetKeystroke XInputGetKeystrokeSRC = NULL; + #define XInputGetKeystroke XInputGetKeystrokeSRC + + HMODULE RGFW_XInput_dll = NULL; +#endif + +char* RGFW_createUTF8FromWideStringWin32(const WCHAR* source); + +#define GL_FRONT 0x0404 +#define GL_BACK 0x0405 +#define GL_LEFT 0x0406 +#define GL_RIGHT 0x0407 + +typedef int (*PFN_wglGetSwapIntervalEXT)(void); +PFN_wglGetSwapIntervalEXT wglGetSwapIntervalEXTSrc = NULL; +#define wglGetSwapIntervalEXT wglGetSwapIntervalEXTSrc + + +void* RGFWgamepadApi = NULL; + +/* these two wgl functions need to be preloaded */ +typedef HGLRC (WINAPI *PFNWGLCREATECONTEXTATTRIBSARBPROC)(HDC hdc, HGLRC hglrc, const int *attribList); +PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB = NULL; + +#ifndef RGFW_EGL + HMODULE RGFW_wgl_dll = NULL; +#endif + +#ifndef RGFW_NO_LOAD_WGL + typedef HGLRC(WINAPI* PFN_wglCreateContext)(HDC); + typedef BOOL(WINAPI* PFN_wglDeleteContext)(HGLRC); + typedef PROC(WINAPI* PFN_wglGetProcAddress)(LPCSTR); + typedef BOOL(WINAPI* PFN_wglMakeCurrent)(HDC, HGLRC); + typedef HDC(WINAPI* PFN_wglGetCurrentDC)(void); + typedef HGLRC(WINAPI* PFN_wglGetCurrentContext)(void); + typedef BOOL(WINAPI* PFN_wglShareLists)(HGLRC, HGLRC); + + PFN_wglCreateContext wglCreateContextSRC; + PFN_wglDeleteContext wglDeleteContextSRC; + PFN_wglGetProcAddress wglGetProcAddressSRC; + PFN_wglMakeCurrent wglMakeCurrentSRC; + PFN_wglGetCurrentDC wglGetCurrentDCSRC; + PFN_wglGetCurrentContext wglGetCurrentContextSRC; + PFN_wglShareLists wglShareListsSRC; + + #define wglCreateContext wglCreateContextSRC + #define wglDeleteContext wglDeleteContextSRC + #define wglGetProcAddress wglGetProcAddressSRC + #define wglMakeCurrent wglMakeCurrentSRC + #define wglGetCurrentDC wglGetCurrentDCSRC + #define wglGetCurrentContext wglGetCurrentContextSRC + #define wglShareLists wglShareListsSRC +#endif + +#if defined(RGFW_OPENGL) && !defined(RGFW_EGL) +RGFW_bool RGFW_extensionSupportedPlatform(const char * extension, size_t len) { + const char* extensions = NULL; + + RGFW_proc proc = RGFW_getProcAddress("wglGetExtensionsStringARB"); + RGFW_proc proc2 = RGFW_getProcAddress("wglGetExtensionsStringEXT"); + + if (proc) + extensions = ((const char* (*)(HDC))proc)(wglGetCurrentDC()); + else if (proc2) + extensions = ((const char*(*)(void))proc2)(); + + return extensions != NULL && RGFW_extensionSupportedStr(extensions, extension, len); +} + +RGFW_proc RGFW_getProcAddress(const char* procname) { + RGFW_proc proc = (RGFW_proc)wglGetProcAddress(procname); + if (proc) + return proc; + + return (RGFW_proc) GetProcAddress(RGFW_wgl_dll, procname); +} + +typedef HRESULT (APIENTRY* PFNWGLCHOOSEPIXELFORMATARBPROC)(HDC hdc, const int* piAttribIList, const FLOAT* pfAttribFList, UINT nMaxFormats, int* piFormats, UINT* nNumFormats); +PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARB = NULL; + +typedef BOOL(APIENTRY* PFNWGLSWAPINTERVALEXTPROC)(int interval); +PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT = NULL; +#endif + +#ifndef RGFW_NO_DWM +HMODULE RGFW_dwm_dll = NULL; +typedef struct { DWORD dwFlags; int fEnable; HRGN hRgnBlur; int fTransitionOnMaximized;} DWM_BLURBEHIND; +typedef HRESULT (WINAPI * PFN_DwmEnableBlurBehindWindow)(HWND, const DWM_BLURBEHIND*); +PFN_DwmEnableBlurBehindWindow DwmEnableBlurBehindWindowSRC = NULL; +#endif +void RGFW_win32_makeWindowTransparent(RGFW_window* win); +void RGFW_win32_makeWindowTransparent(RGFW_window* win) { + if (!(win->_flags & RGFW_windowTransparent)) return; + + #ifndef RGFW_NO_DWM + if (DwmEnableBlurBehindWindowSRC != NULL) { + DWM_BLURBEHIND bb = {0, 0, 0, 0}; + bb.dwFlags = 0x1; + bb.fEnable = TRUE; + bb.hRgnBlur = NULL; + DwmEnableBlurBehindWindowSRC(win->src.window, &bb); + + } else + #endif + { + SetWindowLong(win->src.window, GWL_EXSTYLE, WS_EX_LAYERED); + SetLayeredWindowAttributes(win->src.window, 0, 128, LWA_ALPHA); + } +} + +LRESULT CALLBACK WndProcW(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); +LRESULT CALLBACK WndProcW(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { + RGFW_window* win = (RGFW_window*)GetPropW(hWnd, L"RGFW"); + if (win == NULL) return DefWindowProcW(hWnd, message, wParam, lParam); + + RECT windowRect; + GetWindowRect(hWnd, &windowRect); + + switch (message) { + case WM_CLOSE: + case WM_QUIT: + RGFW_eventQueuePushEx(e.type = RGFW_quit; e._win = win); + RGFW_windowQuitCallback(win); + return 0; + case WM_ACTIVATE: { + RGFW_bool inFocus = RGFW_BOOL(LOWORD(wParam) != WA_INACTIVE); + if (inFocus) win->_flags |= RGFW_windowFocus; + else win->_flags &= ~ (u32)RGFW_windowFocus; + RGFW_eventQueuePushEx(e.type = (RGFW_eventType)((u8)RGFW_focusOut - inFocus); e._win = win); + + RGFW_focusCallback(win, inFocus); + + if ((win->_flags & RGFW_windowFullscreen) == 0) + return DefWindowProcW(hWnd, message, wParam, lParam); + + win->_flags &= ~(u32)RGFW_EVENT_PASSED; + if (inFocus == RGFW_FALSE) RGFW_window_minimize(win); + else RGFW_window_setFullscreen(win, 1); + return DefWindowProcW(hWnd, message, wParam, lParam); + } + case WM_MOVE: + win->r.x = windowRect.left; + win->r.y = windowRect.top; + RGFW_eventQueuePushEx(e.type = RGFW_windowMoved; e._win = win); + RGFW_windowMovedCallback(win, win->r); + return DefWindowProcW(hWnd, message, wParam, lParam); + case WM_SIZE: { + if (win->src.aspectRatio.w != 0 && win->src.aspectRatio.h != 0) { + double aspectRatio = (double)win->src.aspectRatio.w / win->src.aspectRatio.h; + + int width = windowRect.right - windowRect.left; + int height = windowRect.bottom - windowRect.top; + int newHeight = (int)(width / aspectRatio); + int newWidth = (int)(height * aspectRatio); + + if (win->r.w > windowRect.right - windowRect.left || + win->r.h > (i32)((u32)(windowRect.bottom - windowRect.top) - win->src.hOffset)) + { + if (newHeight > height) windowRect.right = windowRect.left + newWidth; + else windowRect.bottom = windowRect.top + newHeight; + } else { + if (newHeight < height) windowRect.right = windowRect.left + newWidth; + else windowRect.bottom = windowRect.top + newHeight; + } + + RGFW_window_resize(win, RGFW_AREA((windowRect.right - windowRect.left), + (u32)(windowRect.bottom - windowRect.top) - (u32)win->src.hOffset)); + } + + win->r.w = windowRect.right - windowRect.left; + win->r.h = (windowRect.bottom - windowRect.top) - (i32)win->src.hOffset; + RGFW_eventQueuePushEx(e.type = RGFW_windowResized; e._win = win); + RGFW_windowResizedCallback(win, win->r); + RGFW_window_checkMode(win); + return DefWindowProcW(hWnd, message, wParam, lParam); + } + #ifndef RGFW_NO_MONITOR + case WM_DPICHANGED: { + if (win->_flags & RGFW_windowScaleToMonitor) RGFW_window_scaleToMonitor(win); + + const float scaleX = HIWORD(wParam) / (float) 96; + const float scaleY = LOWORD(wParam) / (float) 96; + RGFW_scaleUpdatedCallback(win, scaleX, scaleY); + RGFW_eventQueuePushEx(e.type = RGFW_scaleUpdated; e.scaleX = scaleX; e.scaleY = scaleY; e._win = win); + return DefWindowProcW(hWnd, message, wParam, lParam); + } + #endif + case WM_GETMINMAXINFO: { + MINMAXINFO* mmi = (MINMAXINFO*) lParam; + mmi->ptMinTrackSize.x = (LONG)win->src.minSize.w; + mmi->ptMinTrackSize.y = (LONG)(win->src.minSize.h + win->src.hOffset); + if (win->src.maxSize.w == 0 && win->src.maxSize.h == 0) + return DefWindowProcW(hWnd, message, wParam, lParam); + + mmi->ptMaxTrackSize.x = (LONG)win->src.maxSize.w; + mmi->ptMaxTrackSize.y = (LONG)(win->src.maxSize.h + win->src.hOffset); + return DefWindowProcW(hWnd, message, wParam, lParam); + } + case WM_PAINT: { + PAINTSTRUCT ps; + BeginPaint(hWnd, &ps); + RGFW_eventQueuePushEx(e.type = RGFW_windowRefresh; e._win = win); + RGFW_windowRefreshCallback(win); + EndPaint(hWnd, &ps); + + return DefWindowProcW(hWnd, message, wParam, lParam); + } + #if(_WIN32_WINNT >= 0x0600) + case WM_DWMCOMPOSITIONCHANGED: + case WM_DWMCOLORIZATIONCOLORCHANGED: + RGFW_win32_makeWindowTransparent(win); + break; + #endif +/* based on sokol_app.h */ +#ifdef RGFW_ADVANCED_SMOOTH_RESIZE + case WM_ENTERSIZEMOVE: SetTimer(win->src.window, 1, USER_TIMER_MINIMUM, NULL); break; + case WM_EXITSIZEMOVE: KillTimer(win->src.window, 1); break; + case WM_TIMER: RGFW_windowRefreshCallback(win); break; +#endif + case WM_NCLBUTTONDOWN: { + /* workaround for half-second pause when starting to move window + see: https://gamedev.net/forums/topic/672094-keeping-things-moving-during-win32-moveresize-events/5254386/ + */ + POINT point = { 0, 0 }; + if (SendMessage(win->src.window, WM_NCHITTEST, wParam, lParam) != HTCAPTION || GetCursorPos(&point) == FALSE) + break; + + ScreenToClient(win->src.window, &point); + PostMessage(win->src.window, WM_MOUSEMOVE, 0, ((uint32_t)point.x)|(((uint32_t)point.y) << 16)); + break; + } + default: break; + } + return DefWindowProcW(hWnd, message, wParam, lParam); +} + +#ifndef RGFW_NO_DPI + HMODULE RGFW_Shcore_dll = NULL; + typedef HRESULT (WINAPI *PFN_GetDpiForMonitor)(HMONITOR,MONITOR_DPI_TYPE,UINT*,UINT*); + PFN_GetDpiForMonitor GetDpiForMonitorSRC = NULL; + #define GetDpiForMonitor GetDpiForMonitorSRC +#endif + +#if !defined(RGFW_NO_LOAD_WINMM) && !defined(RGFW_NO_WINMM) + HMODULE RGFW_winmm_dll = NULL; + typedef u32 (WINAPI * PFN_timeBeginPeriod)(u32); + typedef PFN_timeBeginPeriod PFN_timeEndPeriod; + PFN_timeBeginPeriod timeBeginPeriodSRC, timeEndPeriodSRC; + #define timeBeginPeriod timeBeginPeriodSRC + #define timeEndPeriod timeEndPeriodSRC +#elif !defined(RGFW_NO_WINMM) + __declspec(dllimport) u32 __stdcall timeBeginPeriod(u32 uPeriod); + __declspec(dllimport) u32 __stdcall timeEndPeriod(u32 uPeriod); +#endif +#define RGFW_PROC_DEF(proc, name) if (name##SRC == NULL && proc != NULL) { \ + name##SRC = (PFN_##name)(RGFW_proc)GetProcAddress((proc), (#name)); \ + RGFW_ASSERT(name##SRC != NULL); \ + } + +#ifndef RGFW_NO_XINPUT +void RGFW_loadXInput(void); +void RGFW_loadXInput(void) { + u32 i; + static const char* names[] = {"xinput1_4.dll", "xinput9_1_0.dll", "xinput1_2.dll", "xinput1_1.dll"}; + + for (i = 0; i < sizeof(names) / sizeof(const char*) && (XInputGetStateSRC == NULL || XInputGetKeystrokeSRC != NULL); i++) { + RGFW_XInput_dll = LoadLibraryA(names[i]); + RGFW_PROC_DEF(RGFW_XInput_dll, XInputGetState); + RGFW_PROC_DEF(RGFW_XInput_dll, XInputGetKeystroke); + } + + if (XInputGetStateSRC == NULL) + RGFW_sendDebugInfo(RGFW_typeError, RGFW_errFailedFuncLoad, RGFW_DEBUG_CTX(_RGFW.root, 0), "Failed to load XInputGetState"); + if (XInputGetKeystrokeSRC == NULL) + RGFW_sendDebugInfo(RGFW_typeError, RGFW_errFailedFuncLoad, RGFW_DEBUG_CTX(_RGFW.root, 0), "Failed to load XInputGetKeystroke"); +} +#endif + +void RGFW_window_initBufferPtr(RGFW_window* win, u8* buffer, RGFW_area area){ +#if defined(RGFW_OSMESA) || defined(RGFW_BUFFER) + win->buffer = buffer; + win->bufferSize = area; + + BITMAPV5HEADER bi; + ZeroMemory(&bi, sizeof(bi)); + bi.bV5Size = sizeof(bi); + bi.bV5Width = (i32)area.w; + bi.bV5Height = -((LONG) area.h); + bi.bV5Planes = 1; + bi.bV5BitCount = 32; + bi.bV5Compression = BI_RGB; + + win->src.bitmap = CreateDIBSection(win->src.hdc, + (BITMAPINFO*) &bi, DIB_RGB_COLORS, + (void**) &win->src.bitmapBits, + NULL, (DWORD) 0); + + if (win->buffer == NULL) + win->buffer = win->src.bitmapBits; + + win->src.hdcMem = CreateCompatibleDC(win->src.hdc); + SelectObject(win->src.hdcMem, win->src.bitmap); + + #if defined(RGFW_OSMESA) + win->src.ctx = OSMesaCreateContext(OSMESA_BGRA, NULL); + OSMesaMakeCurrent(win->src.ctx, win->buffer, GL_UNSIGNED_BYTE, area.w, area.h); + OSMesaPixelStore(OSMESA_Y_UP, 0); + #endif + #else + RGFW_UNUSED(win); RGFW_UNUSED(buffer); RGFW_UNUSED(area); /*!< if buffer rendering is not being used */ + #endif +} + +void RGFW_releaseCursor(RGFW_window* win) { + RGFW_UNUSED(win); + ClipCursor(NULL); + const RAWINPUTDEVICE id = { 0x01, 0x02, RIDEV_REMOVE, NULL }; + RegisterRawInputDevices(&id, 1, sizeof(id)); +} + +void RGFW_captureCursor(RGFW_window* win, RGFW_rect rect) { + RGFW_UNUSED(win); RGFW_UNUSED(rect); + + RECT clipRect; + GetClientRect(win->src.window, &clipRect); + ClientToScreen(win->src.window, (POINT*) &clipRect.left); + ClientToScreen(win->src.window, (POINT*) &clipRect.right); + ClipCursor(&clipRect); + + const RAWINPUTDEVICE id = { 0x01, 0x02, 0, win->src.window }; + RegisterRawInputDevices(&id, 1, sizeof(id)); +} + +#define RGFW_LOAD_LIBRARY(x, lib) if (x == NULL) { x = LoadLibraryA(lib); RGFW_ASSERT(x != NULL); } + +#ifdef RGFW_DIRECTX +int RGFW_window_createDXSwapChain(RGFW_window* win, IDXGIFactory* pFactory, IUnknown* pDevice, IDXGISwapChain** swapchain) { + RGFW_ASSERT(win && pFactory && pDevice && swapchain); + + static DXGI_SWAP_CHAIN_DESC swapChainDesc = { 0 }; + swapChainDesc.BufferCount = 2; + swapChainDesc.BufferDesc.Width = win->r.w; + swapChainDesc.BufferDesc.Height = win->r.h; + swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + swapChainDesc.OutputWindow = (HWND)win->src.window; + swapChainDesc.SampleDesc.Count = 1; + swapChainDesc.SampleDesc.Quality = 0; + swapChainDesc.Windowed = TRUE; + swapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; + + HRESULT hr = pFactory->lpVtbl->CreateSwapChain(pFactory, (IUnknown*)pDevice, &swapChainDesc, swapchain); + if (FAILED(hr)) { + RGFW_sendDebugInfo(RGFW_typeError, RGFW_errDirectXContext, RGFW_DEBUG_CTX(win, hr), "Failed to create DirectX swap chain!"); + return -2; + } + + return 0; +} +#endif + +void RGFW_win32_loadOpenGLFuncs(HWND dummyWin); +void RGFW_win32_loadOpenGLFuncs(HWND dummyWin) { +#ifdef RGFW_OPENGL + if (wglSwapIntervalEXT != NULL && wglChoosePixelFormatARB != NULL && wglChoosePixelFormatARB != NULL) + return; + + HDC dummy_dc = GetDC(dummyWin); + u32 pfd_flags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; + + PIXELFORMATDESCRIPTOR pfd = {sizeof(pfd), 1, pfd_flags, PFD_TYPE_RGBA, 32, 8, PFD_MAIN_PLANE, 32, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 32, 8, 0, PFD_MAIN_PLANE, 0, 0, 0, 0}; + + int dummy_pixel_format = ChoosePixelFormat(dummy_dc, &pfd); + SetPixelFormat(dummy_dc, dummy_pixel_format, &pfd); + + HGLRC dummy_context = wglCreateContext(dummy_dc); + wglMakeCurrent(dummy_dc, dummy_context); + + wglCreateContextAttribsARB = ((PFNWGLCREATECONTEXTATTRIBSARBPROC(WINAPI *)(const char*)) wglGetProcAddress)("wglCreateContextAttribsARB"); + wglChoosePixelFormatARB = ((PFNWGLCHOOSEPIXELFORMATARBPROC(WINAPI *)(const char*)) wglGetProcAddress)("wglChoosePixelFormatARB"); + + wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)(RGFW_proc)wglGetProcAddress("wglSwapIntervalEXT"); + if (wglSwapIntervalEXT == NULL) { + RGFW_sendDebugInfo(RGFW_typeError, RGFW_errOpenglContext, RGFW_DEBUG_CTX(_RGFW.root, 0), "Failed to load swap interval function"); + } + + wglMakeCurrent(dummy_dc, 0); + wglDeleteContext(dummy_context); + ReleaseDC(dummyWin, dummy_dc); +#else + RGFW_UNUSED(dummyWin); +#endif +} + +#ifndef RGFW_EGL +void RGFW_window_initOpenGL(RGFW_window* win, RGFW_bool software) { +#ifdef RGFW_OPENGL + PIXELFORMATDESCRIPTOR pfd; + pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); + pfd.nVersion = 1; + pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; + pfd.iPixelType = PFD_TYPE_RGBA; + pfd.iLayerType = PFD_MAIN_PLANE; + pfd.cColorBits = 32; + pfd.cAlphaBits = 8; + pfd.cDepthBits = 24; + pfd.cStencilBits = (BYTE)RGFW_GL_HINTS[RGFW_glStencil]; + pfd.cAuxBuffers = (BYTE)RGFW_GL_HINTS[RGFW_glAuxBuffers]; + if (RGFW_GL_HINTS[RGFW_glStereo]) pfd.dwFlags |= PFD_STEREO; + + /* try to create the pixel format we want for opengl and then try to create an opengl context for the specified version */ + if (software) + pfd.dwFlags |= PFD_GENERIC_FORMAT | PFD_GENERIC_ACCELERATED; + + /* get pixel format, default to a basic pixel format */ + int pixel_format = ChoosePixelFormat(win->src.hdc, &pfd); + if (wglChoosePixelFormatARB != NULL) { + i32* pixel_format_attribs = (i32*)RGFW_initFormatAttribs(software); + + int new_pixel_format; + UINT num_formats; + wglChoosePixelFormatARB(win->src.hdc, pixel_format_attribs, 0, 1, &new_pixel_format, &num_formats); + if (!num_formats) + RGFW_sendDebugInfo(RGFW_typeError, RGFW_errOpenglContext, RGFW_DEBUG_CTX(win, 0), "Failed to create a pixel format for WGL"); + else pixel_format = new_pixel_format; + } + + PIXELFORMATDESCRIPTOR suggested; + if (!DescribePixelFormat(win->src.hdc, pixel_format, sizeof(suggested), &suggested) || + !SetPixelFormat(win->src.hdc, pixel_format, &pfd)) + RGFW_sendDebugInfo(RGFW_typeError, RGFW_errOpenglContext, RGFW_DEBUG_CTX(win, 0), "Failed to set the WGL pixel format"); + + if (wglCreateContextAttribsARB != NULL) { + /* create opengl/WGL context for the specified version */ + u32 index = 0; + i32 attribs[40]; + + if (RGFW_GL_HINTS[RGFW_glProfile]== RGFW_glCore) { + SET_ATTRIB(WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB); + } + else { + SET_ATTRIB(WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB); + } + + if (RGFW_GL_HINTS[RGFW_glMinor] || RGFW_GL_HINTS[RGFW_glMajor]) { + SET_ATTRIB(WGL_CONTEXT_MAJOR_VERSION_ARB, RGFW_GL_HINTS[RGFW_glMajor]); + SET_ATTRIB(WGL_CONTEXT_MINOR_VERSION_ARB, RGFW_GL_HINTS[RGFW_glMinor]); + } + + SET_ATTRIB(0, 0); + + win->src.ctx = (HGLRC)wglCreateContextAttribsARB(win->src.hdc, NULL, attribs); + } else { /* fall back to a default context (probably opengl 2 or something) */ + RGFW_sendDebugInfo(RGFW_typeError, RGFW_errOpenglContext, RGFW_DEBUG_CTX(win, 0), "Failed to create an accelerated OpenGL Context"); + win->src.ctx = wglCreateContext(win->src.hdc); + } + + ReleaseDC(win->src.window, win->src.hdc); + win->src.hdc = GetDC(win->src.window); + wglMakeCurrent(win->src.hdc, win->src.ctx); + + if (_RGFW.root != win) + wglShareLists(_RGFW.root->src.ctx, win->src.ctx); + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoOpenGL, RGFW_DEBUG_CTX(win, 0), "opengl context initalized"); +#else + RGFW_UNUSED(win); RGFW_UNUSED(software); +#endif +} + +void RGFW_window_freeOpenGL(RGFW_window* win) { +#ifdef RGFW_OPENGL + if (win->src.ctx == NULL) return; + wglDeleteContext((HGLRC) win->src.ctx); /*!< delete opengl context */ + win->src.ctx = NULL; + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoOpenGL, RGFW_DEBUG_CTX(win, 0), "opengl context freed"); +#else + RGFW_UNUSED(win); +#endif +} +#endif + + +i32 RGFW_init(void) { +#if defined(RGFW_C89) || defined(__cplusplus) + if (_RGFW_init) return 0; + _RGFW_init = RGFW_TRUE; + _RGFW.root = NULL; _RGFW.current = NULL; _RGFW.windowCount = -1; _RGFW.eventLen = 0; _RGFW.eventIndex = 0; +#endif + + #ifndef RGFW_NO_XINPUT + if (RGFW_XInput_dll == NULL) + RGFW_loadXInput(); + #endif + +#ifndef RGFW_NO_DPI + #if (_WIN32_WINNT >= 0x0600) + SetProcessDPIAware(); + #endif +#endif + + #ifndef RGFW_NO_WINMM + #ifndef RGFW_NO_LOAD_WINMM + RGFW_LOAD_LIBRARY(RGFW_winmm_dll, "winmm.dll"); + RGFW_PROC_DEF(RGFW_winmm_dll, timeBeginPeriod); + RGFW_PROC_DEF(RGFW_winmm_dll, timeEndPeriod); + #endif + timeBeginPeriod(1); + #endif + + #ifndef RGFW_NO_DWM + RGFW_LOAD_LIBRARY(RGFW_dwm_dll, "dwmapi.dll"); + RGFW_PROC_DEF(RGFW_dwm_dll, DwmEnableBlurBehindWindow); + #endif + + RGFW_LOAD_LIBRARY(RGFW_wgl_dll, "opengl32.dll"); + #ifndef RGFW_NO_LOAD_WGL + RGFW_PROC_DEF(RGFW_wgl_dll, wglCreateContext); + RGFW_PROC_DEF(RGFW_wgl_dll, wglDeleteContext); + RGFW_PROC_DEF(RGFW_wgl_dll, wglGetProcAddress); + RGFW_PROC_DEF(RGFW_wgl_dll, wglMakeCurrent); + RGFW_PROC_DEF(RGFW_wgl_dll, wglGetCurrentDC); + RGFW_PROC_DEF(RGFW_wgl_dll, wglGetCurrentContext); + RGFW_PROC_DEF(RGFW_wgl_dll, wglShareLists); + #endif + + u8 RGFW_blk[] = { 0, 0, 0, 0 }; + _RGFW.hiddenMouse = RGFW_loadMouse(RGFW_blk, RGFW_AREA(1, 1), 4); + + _RGFW.windowCount = 0; + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoGlobal, RGFW_DEBUG_CTX(NULL, 0), "global context initialized"); + return 1; +} + +RGFW_window* RGFW_createWindowPtr(const char* name, RGFW_rect rect, RGFW_windowFlags flags, RGFW_window* win) { + if (name[0] == 0) name = (char*) " "; + + RGFW_window_basic_init(win, rect, flags); + + win->src.hIconSmall = win->src.hIconBig = NULL; + win->src.maxSize = RGFW_AREA(0, 0); + win->src.minSize = RGFW_AREA(0, 0); + win->src.aspectRatio = RGFW_AREA(0, 0); + + HINSTANCE inh = GetModuleHandleA(NULL); + + #ifndef __cplusplus + WNDCLASSW Class = { 0 }; /*!< Setup the Window class. */ + #else + WNDCLASSW Class = { }; + #endif + + if (RGFW_className == NULL) + RGFW_className = (char*)name; + + wchar_t wide_class[256]; + MultiByteToWideChar(CP_UTF8, 0, RGFW_className, -1, wide_class, 255); + + Class.lpszClassName = wide_class; + Class.hInstance = inh; + Class.hCursor = LoadCursor(NULL, IDC_ARROW); + Class.lpfnWndProc = WndProcW; + Class.cbClsExtra = sizeof(RGFW_window*); + + Class.hIcon = (HICON)LoadImageA(GetModuleHandleW(NULL), "RGFW_ICON", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); + if (Class.hIcon == NULL) + Class.hIcon = (HICON)LoadImageA(NULL, (LPCSTR)IDI_APPLICATION, IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); + + RegisterClassW(&Class); + + DWORD window_style = WS_CLIPSIBLINGS | WS_CLIPCHILDREN; + + RECT windowRect, clientRect; + + if (!(flags & RGFW_windowNoBorder)) { + window_style |= WS_CAPTION | WS_SYSMENU | WS_BORDER | WS_MINIMIZEBOX | WS_THICKFRAME; + + if (!(flags & RGFW_windowNoResize)) + window_style |= WS_SIZEBOX | WS_MAXIMIZEBOX; + } else + window_style |= WS_POPUP | WS_VISIBLE | WS_SYSMENU; + + wchar_t wide_name[256]; + MultiByteToWideChar(CP_UTF8, 0, name, -1, wide_name, 255); + HWND dummyWin = CreateWindowW(Class.lpszClassName, (wchar_t*)wide_name, window_style, win->r.x, win->r.y, win->r.w, win->r.h, 0, 0, inh, 0); + + GetWindowRect(dummyWin, &windowRect); + GetClientRect(dummyWin, &clientRect); + + RGFW_win32_loadOpenGLFuncs(dummyWin); + DestroyWindow(dummyWin); + + win->src.hOffset = (u32)(windowRect.bottom - windowRect.top) - (u32)(clientRect.bottom - clientRect.top); + win->src.window = CreateWindowW(Class.lpszClassName, (wchar_t*)wide_name, window_style, win->r.x, win->r.y, win->r.w, win->r.h + (i32)win->src.hOffset, 0, 0, inh, 0); + SetPropW(win->src.window, L"RGFW", win); + RGFW_window_resize(win, RGFW_AREA(win->r.w, win->r.h)); /* so WM_GETMINMAXINFO gets called again */ + + if (flags & RGFW_windowAllowDND) { + win->_flags |= RGFW_windowAllowDND; + RGFW_window_setDND(win, 1); + } + win->src.hdc = GetDC(win->src.window); + + if ((flags & RGFW_windowNoInitAPI) == 0) { + RGFW_window_initOpenGL(win, RGFW_BOOL(flags & RGFW_windowOpenglSoftware)); + RGFW_window_initBuffer(win); + } + + RGFW_window_setFlags(win, flags); + RGFW_win32_makeWindowTransparent(win); + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoWindow, RGFW_DEBUG_CTX(win, 0), "a new window was created"); + RGFW_window_show(win); + + return win; +} + +void RGFW_window_setBorder(RGFW_window* win, RGFW_bool border) { + RGFW_setBit(&win->_flags, RGFW_windowNoBorder, !border); + LONG style = GetWindowLong(win->src.window, GWL_STYLE); + + + if (border == 0) { + SetWindowLong(win->src.window, GWL_STYLE, style & ~WS_OVERLAPPEDWINDOW); + SetWindowPos( + win->src.window, HWND_TOP, 0, 0, 0, 0, + SWP_NOZORDER | SWP_FRAMECHANGED | SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE + ); + } + else { + style |= WS_OVERLAPPEDWINDOW; + if (win->_flags & RGFW_windowNoResize) style &= ~WS_MAXIMIZEBOX; + SetWindowPos( + win->src.window, HWND_TOP, 0, 0, 0, 0, + SWP_NOZORDER | SWP_FRAMECHANGED | SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE + ); + } +} + +void RGFW_window_setDND(RGFW_window* win, RGFW_bool allow) { + RGFW_setBit(&win->_flags, RGFW_windowAllowDND, allow); + DragAcceptFiles(win->src.window, allow); +} + +RGFW_area RGFW_getScreenSize(void) { + HDC dc = GetDC(NULL); + RGFW_area area = RGFW_AREA(GetDeviceCaps(dc, HORZRES), GetDeviceCaps(dc, VERTRES)); + ReleaseDC(NULL, dc); + return area; +} + +RGFW_point RGFW_getGlobalMousePoint(void) { + POINT p; + GetCursorPos(&p); + + return RGFW_POINT(p.x, p.y); +} + +void RGFW_window_setAspectRatio(RGFW_window* win, RGFW_area a) { + RGFW_ASSERT(win != NULL); + win->src.aspectRatio = a; +} + +void RGFW_window_setMinSize(RGFW_window* win, RGFW_area a) { + RGFW_ASSERT(win != NULL); + win->src.minSize = a; +} + +void RGFW_window_setMaxSize(RGFW_window* win, RGFW_area a) { + RGFW_ASSERT(win != NULL); + win->src.maxSize = a; +} + +void RGFW_window_focus(RGFW_window* win) { + RGFW_ASSERT(win); + SetForegroundWindow(win->src.window); + SetFocus(win->src.window); +} + +void RGFW_window_raise(RGFW_window* win) { + RGFW_ASSERT(win); + BringWindowToTop(win->src.window); + SetWindowPos(win->src.window, HWND_TOP, win->r.x, win->r.y, win->r.w, win->r.h, SWP_NOSIZE | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_FRAMECHANGED); +} + +void RGFW_window_setFullscreen(RGFW_window* win, RGFW_bool fullscreen) { + RGFW_ASSERT(win != NULL); + + if (fullscreen == RGFW_FALSE) { + RGFW_window_setBorder(win, 1); + SetWindowPos(win->src.window, HWND_NOTOPMOST, win->_oldRect.x, win->_oldRect.y, win->_oldRect.w, win->_oldRect.h + (i32)win->src.hOffset, + SWP_NOOWNERZORDER | SWP_FRAMECHANGED); + + win->_flags &= ~(u32)RGFW_windowFullscreen; + win->r = win->_oldRect; + return; + } + + win->_oldRect = win->r; + win->_flags |= RGFW_windowFullscreen; + + RGFW_monitor mon = RGFW_window_getMonitor(win); + RGFW_window_setBorder(win, 0); + + SetWindowPos(win->src.window, HWND_TOPMOST, 0, 0, (i32)mon.mode.area.w, (i32)mon.mode.area.h, SWP_NOOWNERZORDER | SWP_FRAMECHANGED | SWP_SHOWWINDOW); + RGFW_monitor_scaleToWindow(mon, win); + + win->r = RGFW_RECT(0, 0, mon.mode.area.w, mon.mode.area.h); +} + +void RGFW_window_maximize(RGFW_window* win) { + RGFW_ASSERT(win != NULL); + RGFW_window_hide(win); + ShowWindow(win->src.window, SW_MAXIMIZE); +} + +void RGFW_window_minimize(RGFW_window* win) { + RGFW_ASSERT(win != NULL); + ShowWindow(win->src.window, SW_MINIMIZE); +} + +void RGFW_window_setFloating(RGFW_window* win, RGFW_bool floating) { + RGFW_ASSERT(win != NULL); + if (floating) SetWindowPos(win->src.window, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); + else SetWindowPos(win->src.window, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); +} + +void RGFW_window_setOpacity(RGFW_window* win, u8 opacity) { + SetWindowLong(win->src.window, GWL_EXSTYLE, WS_EX_LAYERED); + SetLayeredWindowAttributes(win->src.window, 0, opacity, LWA_ALPHA); +} + +void RGFW_window_restore(RGFW_window* win) { RGFW_window_show(win); } + +RGFW_bool RGFW_window_isFloating(RGFW_window* win) { + return (GetWindowLongPtr(win->src.window, GWL_EXSTYLE) & WS_EX_TOPMOST) != 0; +} + +u8 RGFW_xinput2RGFW[] = { + RGFW_gamepadA, /* or PS X button */ + RGFW_gamepadB, /* or PS circle button */ + RGFW_gamepadX, /* or PS square button */ + RGFW_gamepadY, /* or PS triangle button */ + RGFW_gamepadR1, /* right bumper */ + RGFW_gamepadL1, /* left bump */ + RGFW_gamepadL2, /* left trigger */ + RGFW_gamepadR2, /* right trigger */ + 0, 0, 0, 0, 0, 0, 0, 0, + RGFW_gamepadUp, /* dpad up */ + RGFW_gamepadDown, /* dpad down */ + RGFW_gamepadLeft, /* dpad left */ + RGFW_gamepadRight, /* dpad right */ + RGFW_gamepadStart, /* start button */ + RGFW_gamepadSelect,/* select button */ + RGFW_gamepadL3, + RGFW_gamepadR3, +}; +i32 RGFW_checkXInput(RGFW_window* win, RGFW_event* e); +i32 RGFW_checkXInput(RGFW_window* win, RGFW_event* e) { + #ifndef RGFW_NO_XINPUT + + RGFW_UNUSED(win); + u16 i; + for (i = 0; i < 4; i++) { + XINPUT_KEYSTROKE keystroke; + + if (XInputGetKeystroke == NULL) + return 0; + + DWORD result = XInputGetKeystroke((DWORD)i, 0, &keystroke); + + if ((keystroke.Flags & XINPUT_KEYSTROKE_REPEAT) == 0 && result != ERROR_EMPTY) { + if (result != ERROR_SUCCESS) + return 0; + + if (keystroke.VirtualKey > VK_PAD_RTHUMB_PRESS) + continue; + + /* gamepad + 1 = RGFW_gamepadButtonReleased */ + e->type = RGFW_gamepadButtonPressed + !(keystroke.Flags & XINPUT_KEYSTROKE_KEYDOWN); + e->button = RGFW_xinput2RGFW[keystroke.VirtualKey - 0x5800]; + RGFW_gamepadPressed[i][e->button].prev = RGFW_gamepadPressed[i][e->button].current; + RGFW_gamepadPressed[i][e->button].current = RGFW_BOOL(keystroke.Flags & XINPUT_KEYSTROKE_KEYDOWN); + + RGFW_gamepadButtonCallback(win, i, e->button, e->type == RGFW_gamepadButtonPressed); + return 1; + } + + XINPUT_STATE state; + if (XInputGetState == NULL || + XInputGetState((DWORD) i, &state) == ERROR_DEVICE_NOT_CONNECTED + ) { + if (RGFW_gamepads[i] == 0) + continue; + + RGFW_gamepads[i] = 0; + RGFW_gamepadCount--; + + win->event.type = RGFW_gamepadDisconnected; + win->event.gamepad = (u16)i; + RGFW_gamepadCallback(win, i, 0); + return 1; + } + + if (RGFW_gamepads[i] == 0) { + RGFW_gamepads[i] = 1; + RGFW_gamepadCount++; + + char str[] = "Microsoft X-Box (XInput device)"; + RGFW_MEMCPY(RGFW_gamepads_name[i], str, sizeof(str)); + RGFW_gamepads_name[i][sizeof(RGFW_gamepads_name[i]) - 1] = '\0'; + win->event.type = RGFW_gamepadConnected; + win->event.gamepad = i; + RGFW_gamepads_type[i] = RGFW_gamepadMicrosoft; + + RGFW_gamepadCallback(win, i, 1); + return 1; + } + +#define INPUT_DEADZONE ( 0.24f * (float)(0x7FFF) ) /* Default to 24% of the +/- 32767 range. This is a reasonable default value but can be altered if needed. */ + + if ((state.Gamepad.sThumbLX < INPUT_DEADZONE && + state.Gamepad.sThumbLX > -INPUT_DEADZONE) && + (state.Gamepad.sThumbLY < INPUT_DEADZONE && + state.Gamepad.sThumbLY > -INPUT_DEADZONE)) + { + state.Gamepad.sThumbLX = 0; + state.Gamepad.sThumbLY = 0; + } + + if ((state.Gamepad.sThumbRX < INPUT_DEADZONE && + state.Gamepad.sThumbRX > -INPUT_DEADZONE) && + (state.Gamepad.sThumbRY < INPUT_DEADZONE && + state.Gamepad.sThumbRY > -INPUT_DEADZONE)) + { + state.Gamepad.sThumbRX = 0; + state.Gamepad.sThumbRY = 0; + } + + e->axisesCount = 2; + RGFW_point axis1 = RGFW_POINT(((float)state.Gamepad.sThumbLX / 32768.0f) * 100, ((float)state.Gamepad.sThumbLY / -32768.0f) * 100); + RGFW_point axis2 = RGFW_POINT(((float)state.Gamepad.sThumbRX / 32768.0f) * 100, ((float)state.Gamepad.sThumbRY / -32768.0f) * 100); + + if (axis1.x != e->axis[0].x || axis1.y != e->axis[0].y){ + win->event.whichAxis = 0; + + e->type = RGFW_gamepadAxisMove; + e->axis[0] = axis1; + RGFW_gamepadAxes[i][0] = e->axis[0]; + + RGFW_gamepadAxisCallback(win, e->gamepad, e->axis, e->axisesCount, e->whichAxis); + return 1; + } + + if (axis2.x != e->axis[1].x || axis2.y != e->axis[1].y) { + win->event.whichAxis = 1; + e->type = RGFW_gamepadAxisMove; + e->axis[1] = axis2; + RGFW_gamepadAxes[i][1] = e->axis[1]; + + RGFW_gamepadAxisCallback(win, e->gamepad, e->axis, e->axisesCount, e->whichAxis); + return 1; + } + } + + #endif + + return 0; +} + +void RGFW_stopCheckEvents(void) { + PostMessageW(_RGFW.root->src.window, WM_NULL, 0, 0); +} + +void RGFW_window_eventWait(RGFW_window* win, i32 waitMS) { + RGFW_UNUSED(win); + MsgWaitForMultipleObjects(0, NULL, FALSE, (DWORD)waitMS, QS_ALLINPUT); +} + +RGFW_event* RGFW_window_checkEvent(RGFW_window* win) { + if (win == NULL || ((win->_flags & RGFW_windowFreeOnClose) && (win->_flags & RGFW_EVENT_QUIT))) return NULL; + RGFW_event* ev = RGFW_window_checkEventCore(win); + if (ev) return ev; + + static HDROP drop; + if (win->event.type == RGFW_DNDInit) { + if (win->event.droppedFilesCount) { + u32 i; + for (i = 0; i < win->event.droppedFilesCount; i++) + win->event.droppedFiles[i][0] = '\0'; + } + + win->event.droppedFilesCount = 0; + win->event.droppedFilesCount = DragQueryFileW(drop, 0xffffffff, NULL, 0); + + u32 i; + for (i = 0; i < win->event.droppedFilesCount; i++) { + UINT length = DragQueryFileW(drop, i, NULL, 0); + if (length == 0) + continue; + + WCHAR buffer[RGFW_MAX_PATH * 2]; + if (length > (RGFW_MAX_PATH * 2) - 1) + length = RGFW_MAX_PATH * 2; + + DragQueryFileW(drop, i, buffer, length + 1); + + char* str = RGFW_createUTF8FromWideStringWin32(buffer); + if (str != NULL) + RGFW_MEMCPY(win->event.droppedFiles[i], str, length + 1); + + win->event.droppedFiles[i][RGFW_MAX_PATH - 1] = '\0'; + } + + DragFinish(drop); + RGFW_dndCallback(win, win->event.droppedFiles, win->event.droppedFilesCount); + + win->event.type = RGFW_DND; + return &win->event; + } + + if (RGFW_checkXInput(win, &win->event)) + return &win->event; + + static BYTE keyboardState[256]; + GetKeyboardState(keyboardState); + + MSG msg; + if (PeekMessageA(&msg, NULL, 0u, 0u, PM_REMOVE)) { + if (msg.hwnd != win->src.window && msg.hwnd != NULL) { + TranslateMessage(&msg); + DispatchMessageA(&msg); + return RGFW_window_checkEvent(win); + } + } else { + return NULL; + } + + switch (msg.message) { + case WM_MOUSELEAVE: + win->event.type = RGFW_mouseLeave; + win->_flags |= RGFW_MOUSE_LEFT; + RGFW_mouseNotifyCallback(win, win->event.point, 0); + break; + case WM_SYSKEYUP: case WM_KEYUP: { + i32 scancode = (HIWORD(msg.lParam) & (KF_EXTENDED | 0xff)); + if (scancode == 0) + scancode = (i32)MapVirtualKeyW((UINT)msg.wParam, MAPVK_VK_TO_VSC); + + switch (scancode) { + case 0x54: scancode = 0x137; break; /* Alt+PrtS */ + case 0x146: scancode = 0x45; break; /* Ctrl+Pause */ + case 0x136: scancode = 0x36; break; /* CJK IME sets the extended bit for right Shift */ + default: break; + } + + win->event.key = (u8)RGFW_apiKeyToRGFW((u32) scancode); + + if (msg.wParam == VK_CONTROL) { + if (HIWORD(msg.lParam) & KF_EXTENDED) + win->event.key = RGFW_controlR; + else win->event.key = RGFW_controlL; + } + + wchar_t charBuffer; + ToUnicodeEx((UINT)msg.wParam, (UINT)scancode, keyboardState, (wchar_t*)&charBuffer, 1, 0, NULL); + + win->event.keyChar = (u8)charBuffer; + + RGFW_keyboard[win->event.key].prev = RGFW_keyboard[win->event.key].current; + win->event.type = RGFW_keyReleased; + RGFW_keyboard[win->event.key].current = 0; + + RGFW_updateKeyMods(win, (GetKeyState(VK_CAPITAL) & 0x0001), (GetKeyState(VK_NUMLOCK) & 0x0001), (GetKeyState(VK_SCROLL) & 0x0001)); + + RGFW_keyCallback(win, win->event.key, win->event.keyChar, win->event.keyMod, 0); + break; + } + case WM_SYSKEYDOWN: case WM_KEYDOWN: { + i32 scancode = (HIWORD(msg.lParam) & (KF_EXTENDED | 0xff)); + if (scancode == 0) + scancode = (i32)MapVirtualKeyW((u32)msg.wParam, MAPVK_VK_TO_VSC); + + switch (scancode) { + case 0x54: scancode = 0x137; break; /* Alt+PrtS */ + case 0x146: scancode = 0x45; break; /* Ctrl+Pause */ + case 0x136: scancode = 0x36; break; /* CJK IME sets the extended bit for right Shift */ + default: break; + } + + win->event.key = (u8)RGFW_apiKeyToRGFW((u32) scancode); + if (msg.wParam == VK_CONTROL) { + if (HIWORD(msg.lParam) & KF_EXTENDED) + win->event.key = RGFW_controlR; + else win->event.key = RGFW_controlL; + } + + wchar_t charBuffer; + ToUnicodeEx((UINT)msg.wParam, (UINT)scancode, keyboardState, &charBuffer, 1, 0, NULL); + win->event.keyChar = (u8)charBuffer; + + RGFW_keyboard[win->event.key].prev = RGFW_keyboard[win->event.key].current; + + win->event.type = RGFW_keyPressed; + win->event.repeat = RGFW_isPressed(win, win->event.key); + RGFW_keyboard[win->event.key].current = 1; + RGFW_updateKeyMods(win, (GetKeyState(VK_CAPITAL) & 0x0001), (GetKeyState(VK_NUMLOCK) & 0x0001), (GetKeyState(VK_SCROLL) & 0x0001)); + + RGFW_keyCallback(win, win->event.key, win->event.keyChar, win->event.keyMod, 1); + break; + } + case WM_MOUSEMOVE: { + if ((win->_flags & RGFW_HOLD_MOUSE)) + break; + + win->event.type = RGFW_mousePosChanged; + + i32 x = GET_X_LPARAM(msg.lParam); + i32 y = GET_Y_LPARAM(msg.lParam); + + RGFW_mousePosCallback(win, win->event.point, win->event.vector); + + if (win->_flags & RGFW_MOUSE_LEFT) { + win->_flags &= ~(u32)RGFW_MOUSE_LEFT; + win->event.type = RGFW_mouseEnter; + RGFW_mouseNotifyCallback(win, win->event.point, 1); + } + + win->event.point.x = x; + win->event.point.y = y; + win->_lastMousePoint = RGFW_POINT(x, y); + + break; + } + case WM_INPUT: { + if (!(win->_flags & RGFW_HOLD_MOUSE)) + break; + + unsigned size = sizeof(RAWINPUT); + static RAWINPUT raw; + + GetRawInputData((HRAWINPUT)msg.lParam, RID_INPUT, &raw, &size, sizeof(RAWINPUTHEADER)); + + if (raw.header.dwType != RIM_TYPEMOUSE || (raw.data.mouse.lLastX == 0 && raw.data.mouse.lLastY == 0) ) + break; + + if (raw.data.mouse.usFlags & MOUSE_MOVE_ABSOLUTE) { + POINT pos = {0, 0}; + int width, height; + + if (raw.data.mouse.usFlags & MOUSE_VIRTUAL_DESKTOP) { + pos.x += GetSystemMetrics(SM_XVIRTUALSCREEN); + pos.y += GetSystemMetrics(SM_YVIRTUALSCREEN); + width = GetSystemMetrics(SM_CXVIRTUALSCREEN); + height = GetSystemMetrics(SM_CYVIRTUALSCREEN); + } + else { + width = GetSystemMetrics(SM_CXSCREEN); + height = GetSystemMetrics(SM_CYSCREEN); + } + + pos.x += (int) (((float)raw.data.mouse.lLastX / 65535.f) * (float)width); + pos.y += (int) (((float)raw.data.mouse.lLastY / 65535.f) * (float)height); + ScreenToClient(win->src.window, &pos); + + win->event.vector.x = pos.x - win->_lastMousePoint.x; + win->event.vector.y = pos.y - win->_lastMousePoint.y; + } else { + win->event.vector.x = raw.data.mouse.lLastX; + win->event.vector.y = raw.data.mouse.lLastY; + } + + win->event.type = RGFW_mousePosChanged; + win->_lastMousePoint.x += win->event.vector.x; + win->_lastMousePoint.y += win->event.vector.y; + win->event.point = win->_lastMousePoint; + RGFW_mousePosCallback(win, win->event.point, win->event.vector); + break; + } + case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: case WM_MBUTTONDOWN: case WM_XBUTTONDOWN: + if (msg.message == WM_XBUTTONDOWN) + win->event.button = RGFW_mouseMisc1 + (GET_XBUTTON_WPARAM(msg.wParam) == XBUTTON2); + else win->event.button = (msg.message == WM_LBUTTONDOWN) ? RGFW_mouseLeft : + (msg.message == WM_RBUTTONDOWN) ? RGFW_mouseRight : RGFW_mouseMiddle; + + win->event.type = RGFW_mouseButtonPressed; + RGFW_mouseButtons[win->event.button].prev = RGFW_mouseButtons[win->event.button].current; + RGFW_mouseButtons[win->event.button].current = 1; + RGFW_mouseButtonCallback(win, win->event.button, win->event.scroll, 1); + break; + case WM_LBUTTONUP: case WM_RBUTTONUP: case WM_MBUTTONUP: case WM_XBUTTONUP: + if (msg.message == WM_XBUTTONUP) + win->event.button = RGFW_mouseMisc1 + (GET_XBUTTON_WPARAM(msg.wParam) == XBUTTON2); + else win->event.button = (msg.message == WM_LBUTTONUP) ? RGFW_mouseLeft : + (msg.message == WM_RBUTTONUP) ? RGFW_mouseRight : RGFW_mouseMiddle; + win->event.type = RGFW_mouseButtonReleased; + RGFW_mouseButtons[win->event.button].prev = RGFW_mouseButtons[win->event.button].current; + RGFW_mouseButtons[win->event.button].current = 0; + RGFW_mouseButtonCallback(win, win->event.button, win->event.scroll, 0); + break; + case WM_MOUSEWHEEL: + if (msg.wParam > 0) + win->event.button = RGFW_mouseScrollUp; + else + win->event.button = RGFW_mouseScrollDown; + + RGFW_mouseButtons[win->event.button].prev = RGFW_mouseButtons[win->event.button].current; + RGFW_mouseButtons[win->event.button].current = 1; + + win->event.scroll = (SHORT) HIWORD(msg.wParam) / (double) WHEEL_DELTA; + + win->event.type = RGFW_mouseButtonPressed; + RGFW_mouseButtonCallback(win, win->event.button, win->event.scroll, 1); + break; + case WM_DROPFILES: { + win->event.type = RGFW_DNDInit; + + drop = (HDROP) msg.wParam; + POINT pt; + + /* Move the mouse to the position of the drop */ + DragQueryPoint(drop, &pt); + + win->event.point.x = pt.x; + win->event.point.y = pt.y; + + RGFW_dndInitCallback(win, win->event.point); + } + break; + default: + TranslateMessage(&msg); + DispatchMessageA(&msg); + return RGFW_window_checkEvent(win); + } + + TranslateMessage(&msg); + DispatchMessageA(&msg); + + return &win->event; +} + +RGFW_bool RGFW_window_isHidden(RGFW_window* win) { + RGFW_ASSERT(win != NULL); + + return IsWindowVisible(win->src.window) == 0 && !RGFW_window_isMinimized(win); +} + +RGFW_bool RGFW_window_isMinimized(RGFW_window* win) { + RGFW_ASSERT(win != NULL); + + #ifndef __cplusplus + WINDOWPLACEMENT placement = { 0 }; + #else + WINDOWPLACEMENT placement = { }; + #endif + GetWindowPlacement(win->src.window, &placement); + return placement.showCmd == SW_SHOWMINIMIZED; +} + +RGFW_bool RGFW_window_isMaximized(RGFW_window* win) { + RGFW_ASSERT(win != NULL); + + #ifndef __cplusplus + WINDOWPLACEMENT placement = { 0 }; + #else + WINDOWPLACEMENT placement = { }; + #endif + GetWindowPlacement(win->src.window, &placement); + return placement.showCmd == SW_SHOWMAXIMIZED || IsZoomed(win->src.window); +} + +typedef struct { int iIndex; HMONITOR hMonitor; RGFW_monitor* monitors; } RGFW_mInfo; +#ifndef RGFW_NO_MONITOR +RGFW_monitor win32CreateMonitor(HMONITOR src); +RGFW_monitor win32CreateMonitor(HMONITOR src) { + RGFW_monitor monitor; + MONITORINFOEX monitorInfo; + + monitorInfo.cbSize = sizeof(MONITORINFOEX); + GetMonitorInfoA(src, (LPMONITORINFO)&monitorInfo); + + /* get the monitor's index */ + DISPLAY_DEVICEA dd; + dd.cb = sizeof(dd); + + DWORD deviceNum; + for (deviceNum = 0; EnumDisplayDevicesA(NULL, deviceNum, &dd, 0); deviceNum++) { + if (!(dd.StateFlags & DISPLAY_DEVICE_ACTIVE)) + continue; + + DEVMODEA dm; + ZeroMemory(&dm, sizeof(dm)); + dm.dmSize = sizeof(dm); + + if (EnumDisplaySettingsA(dd.DeviceName, ENUM_CURRENT_SETTINGS, &dm)) { + monitor.mode.refreshRate = dm.dmDisplayFrequency; + RGFW_splitBPP(dm.dmBitsPerPel, &monitor.mode); + } + + DISPLAY_DEVICEA mdd; + mdd.cb = sizeof(mdd); + + if (EnumDisplayDevicesA(dd.DeviceName, (DWORD)deviceNum, &mdd, 0)) { + RGFW_STRNCPY(monitor.name, mdd.DeviceString, sizeof(monitor.name) - 1); + monitor.name[sizeof(monitor.name) - 1] = '\0'; + break; + } + } + + + + + monitor.x = monitorInfo.rcWork.left; + monitor.y = monitorInfo.rcWork.top; + monitor.mode.area.w = (u32)(monitorInfo.rcMonitor.right - monitorInfo.rcMonitor.left); + monitor.mode.area.h = (u32)(monitorInfo.rcMonitor.bottom - monitorInfo.rcMonitor.top); + + HDC hdc = CreateDC(monitorInfo.szDevice, NULL, NULL, NULL); + /* get pixels per inch */ + float dpiX = (float)GetDeviceCaps(hdc, LOGPIXELSX); + float dpiY = (float)GetDeviceCaps(hdc, LOGPIXELSX); + + monitor.scaleX = dpiX / 96.0f; + monitor.scaleY = dpiY / 96.0f; + monitor.pixelRatio = dpiX >= 192.0f ? 2.0f : 1.0f; + + monitor.physW = (float)GetDeviceCaps(hdc, HORZSIZE) / 25.4f; + monitor.physH = (float)GetDeviceCaps(hdc, VERTSIZE) / 25.4f; + DeleteDC(hdc); + + #ifndef RGFW_NO_DPI + RGFW_LOAD_LIBRARY(RGFW_Shcore_dll, "shcore.dll"); + RGFW_PROC_DEF(RGFW_Shcore_dll, GetDpiForMonitor); + + if (GetDpiForMonitor != NULL) { + u32 x, y; + GetDpiForMonitor(src, MDT_EFFECTIVE_DPI, &x, &y); + monitor.scaleX = (float) (x) / (float) 96.0f; + monitor.scaleY = (float) (y) / (float) 96.0f; + monitor.pixelRatio = dpiX >= 192.0f ? 2.0f : 1.0f; + } + #endif + + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoMonitor, RGFW_DEBUG_CTX_MON(monitor), "monitor found"); + return monitor; +} +#endif /* RGFW_NO_MONITOR */ + +#ifndef RGFW_NO_MONITOR +BOOL CALLBACK GetMonitorHandle(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData); +BOOL CALLBACK GetMonitorHandle(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) { + RGFW_UNUSED(hdcMonitor); + RGFW_UNUSED(lprcMonitor); + + RGFW_mInfo* info = (RGFW_mInfo*) dwData; + + + if (info->iIndex >= 6) + return FALSE; + + info->monitors[info->iIndex] = win32CreateMonitor(hMonitor); + info->iIndex++; + + return TRUE; +} + +RGFW_monitor RGFW_getPrimaryMonitor(void) { + #ifdef __cplusplus + return win32CreateMonitor(MonitorFromPoint({ 0, 0 }, MONITOR_DEFAULTTOPRIMARY)); + #else + return win32CreateMonitor(MonitorFromPoint((POINT) { 0, 0 }, MONITOR_DEFAULTTOPRIMARY)); + #endif +} + +RGFW_monitor* RGFW_getMonitors(size_t* len) { + static RGFW_monitor monitors[6]; + RGFW_mInfo info; + info.iIndex = 0; + info.monitors = monitors; + + EnumDisplayMonitors(NULL, NULL, GetMonitorHandle, (LPARAM) &info); + + if (len != NULL) *len = (size_t)info.iIndex; + return monitors; +} + +RGFW_monitor RGFW_window_getMonitor(RGFW_window* win) { + HMONITOR src = MonitorFromWindow(win->src.window, MONITOR_DEFAULTTOPRIMARY); + return win32CreateMonitor(src); +} + +RGFW_bool RGFW_monitor_requestMode(RGFW_monitor mon, RGFW_monitorMode mode, RGFW_modeRequest request) { + POINT p = { mon.x, mon.y }; + HMONITOR src = MonitorFromPoint(p, MONITOR_DEFAULTTOPRIMARY); + + MONITORINFOEX monitorInfo; + monitorInfo.cbSize = sizeof(MONITORINFOEX); + GetMonitorInfoA(src, (LPMONITORINFO)&monitorInfo); + + DISPLAY_DEVICEA dd; + dd.cb = sizeof(dd); + + /* Enumerate display devices */ + DWORD deviceNum; + for (deviceNum = 0; EnumDisplayDevicesA(NULL, deviceNum, &dd, 0); deviceNum++) { + if (!(dd.StateFlags & DISPLAY_DEVICE_ACTIVE)) + continue; + + if (strcmp(dd.DeviceName, (const char*)monitorInfo.szDevice) != 0) + continue; + + DEVMODEA dm; + ZeroMemory(&dm, sizeof(dm)); + dm.dmSize = sizeof(dm); + + if (EnumDisplaySettingsA(dd.DeviceName, ENUM_CURRENT_SETTINGS, &dm)) { + if (request & RGFW_monitorScale) { + dm.dmFields |= DM_PELSWIDTH | DM_PELSHEIGHT; + dm.dmPelsWidth = mode.area.w; + dm.dmPelsHeight = mode.area.h; + } + + if (request & RGFW_monitorRefresh) { + dm.dmFields |= DM_DISPLAYFREQUENCY; + dm.dmDisplayFrequency = mode.refreshRate; + } + + if (request & RGFW_monitorRGB) { + dm.dmFields |= DM_BITSPERPEL; + dm.dmBitsPerPel = (DWORD)(mode.red + mode.green + mode.blue); + } + + if (ChangeDisplaySettingsEx(dd.DeviceName, &dm, NULL, CDS_TEST, NULL) == DISP_CHANGE_SUCCESSFUL) { + if (ChangeDisplaySettingsEx(dd.DeviceName, &dm, NULL, CDS_UPDATEREGISTRY, NULL) == DISP_CHANGE_SUCCESSFUL) + return RGFW_TRUE; + return RGFW_FALSE; + } else return RGFW_FALSE; + } + } + + return RGFW_FALSE; +} + +#endif +HICON RGFW_loadHandleImage(u8* src, i32 c, RGFW_area a, BOOL icon); +HICON RGFW_loadHandleImage(u8* src, i32 c, RGFW_area a, BOOL icon) { + size_t channels = (size_t)c; + + BITMAPV5HEADER bi; + ZeroMemory(&bi, sizeof(bi)); + bi.bV5Size = sizeof(bi); + bi.bV5Width = (i32)a.w; + bi.bV5Height = -((LONG) a.h); + bi.bV5Planes = 1; + bi.bV5BitCount = (WORD)(channels * 8); + bi.bV5Compression = BI_RGB; + HDC dc = GetDC(NULL); + u8* target = NULL; + + HBITMAP color = CreateDIBSection(dc, + (BITMAPINFO*) &bi, DIB_RGB_COLORS, (void**) &target, + NULL, (DWORD) 0); + + size_t x, y; + for (y = 0; y < a.h; y++) { + for (x = 0; x < a.w; x++) { + size_t index = (y * 4 * (size_t)a.w) + x * channels; + target[index] = src[index + 2]; + target[index + 1] = src[index + 1]; + target[index + 2] = src[index]; + target[index + 3] = src[index + 3]; + } + } + + ReleaseDC(NULL, dc); + + HBITMAP mask = CreateBitmap((i32)a.w, (i32)a.h, 1, 1, NULL); + + ICONINFO ii; + ZeroMemory(&ii, sizeof(ii)); + ii.fIcon = icon; + ii.xHotspot = a.w / 2; + ii.yHotspot = a.h / 2; + ii.hbmMask = mask; + ii.hbmColor = color; + + HICON handle = CreateIconIndirect(&ii); + + DeleteObject(color); + DeleteObject(mask); + + return handle; +} + +void* RGFW_loadMouse(u8* icon, RGFW_area a, i32 channels) { + HCURSOR cursor = (HCURSOR) RGFW_loadHandleImage(icon, channels, a, FALSE); + return cursor; +} + +void RGFW_window_setMouse(RGFW_window* win, RGFW_mouse* mouse) { + RGFW_ASSERT(win && mouse); + SetClassLongPtrA(win->src.window, GCLP_HCURSOR, (LPARAM) mouse); + SetCursor((HCURSOR)mouse); +} + +void RGFW_freeMouse(RGFW_mouse* mouse) { + RGFW_ASSERT(mouse); + DestroyCursor((HCURSOR)mouse); +} + +RGFW_bool RGFW_window_setMouseDefault(RGFW_window* win) { + return RGFW_window_setMouseStandard(win, RGFW_mouseArrow); +} + +RGFW_bool RGFW_window_setMouseStandard(RGFW_window* win, u8 mouse) { + RGFW_ASSERT(win != NULL); + + static const u32 mouseIconSrc[16] = {OCR_NORMAL, OCR_NORMAL, OCR_IBEAM, OCR_CROSS, OCR_HAND, OCR_SIZEWE, OCR_SIZENS, OCR_SIZENWSE, OCR_SIZENESW, OCR_SIZEALL, OCR_NO}; + if (mouse > (sizeof(mouseIconSrc) / sizeof(u32))) + return RGFW_FALSE; + + char* icon = MAKEINTRESOURCEA(mouseIconSrc[mouse]); + + SetClassLongPtrA(win->src.window, GCLP_HCURSOR, (LPARAM) LoadCursorA(NULL, icon)); + SetCursor(LoadCursorA(NULL, icon)); + return RGFW_TRUE; +} + +void RGFW_window_hide(RGFW_window* win) { + ShowWindow(win->src.window, SW_HIDE); +} + +void RGFW_window_show(RGFW_window* win) { + if (win->_flags & RGFW_windowFocusOnShow) RGFW_window_focus(win); + ShowWindow(win->src.window, SW_RESTORE); +} + +#define RGFW_FREE_LIBRARY(x) if (x != NULL) FreeLibrary(x); x = NULL; +void RGFW_deinit(void) { + #ifndef RGFW_NO_XINPUT + RGFW_FREE_LIBRARY(RGFW_XInput_dll); + #endif + + #ifndef RGFW_NO_DPI + RGFW_FREE_LIBRARY(RGFW_Shcore_dll); + #endif + + #ifndef RGFW_NO_WINMM + timeEndPeriod(1); + #ifndef RGFW_NO_LOAD_WINMM + RGFW_FREE_LIBRARY(RGFW_winmm_dll); + #endif + #endif + + RGFW_FREE_LIBRARY(RGFW_wgl_dll); + _RGFW.root = NULL; + + RGFW_freeMouse(_RGFW.hiddenMouse); + _RGFW.windowCount = -1; + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoGlobal, RGFW_DEBUG_CTX(NULL, 0), "global context deinitialized"); +} + + +void RGFW_window_close(RGFW_window* win) { + RGFW_ASSERT(win != NULL); + #ifdef RGFW_BUFFER + DeleteDC(win->src.hdcMem); + DeleteObject(win->src.bitmap); + #endif + + if ((win->_flags & RGFW_windowNoInitAPI) == 0) RGFW_window_freeOpenGL(win); + RemovePropW(win->src.window, L"RGFW"); + ReleaseDC(win->src.window, win->src.hdc); /*!< delete device context */ + DestroyWindow(win->src.window); /*!< delete window */ + + if (win->src.hIconSmall) DestroyIcon(win->src.hIconSmall); + if (win->src.hIconBig) DestroyIcon(win->src.hIconBig); + + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoWindow, RGFW_DEBUG_CTX(win, 0), "a window was freed"); + _RGFW.windowCount--; + if (_RGFW.windowCount == 0) RGFW_deinit(); + + RGFW_clipboard_switch(NULL); + RGFW_FREE(win->event.droppedFiles); + if ((win->_flags & RGFW_WINDOW_ALLOC)) { + RGFW_FREE(win); + win = NULL; + } +} + +void RGFW_window_move(RGFW_window* win, RGFW_point v) { + RGFW_ASSERT(win != NULL); + + win->r.x = v.x; + win->r.y = v.y; + SetWindowPos(win->src.window, HWND_TOP, win->r.x, win->r.y, 0, 0, SWP_NOSIZE); +} + +void RGFW_window_resize(RGFW_window* win, RGFW_area a) { + RGFW_ASSERT(win != NULL); + + win->r.w = (i32)a.w; + win->r.h = (i32)a.h; + SetWindowPos(win->src.window, HWND_TOP, 0, 0, win->r.w, win->r.h + (i32)win->src.hOffset, SWP_NOMOVE); +} + + +void RGFW_window_setName(RGFW_window* win, const char* name) { + RGFW_ASSERT(win != NULL); + + wchar_t wide_name[256]; + MultiByteToWideChar(CP_UTF8, 0, name, -1, wide_name, 256); + SetWindowTextW(win->src.window, wide_name); +} + +#ifndef RGFW_NO_PASSTHROUGH +void RGFW_window_setMousePassthrough(RGFW_window* win, RGFW_bool passthrough) { + RGFW_ASSERT(win != NULL); + COLORREF key = 0; + BYTE alpha = 0; + DWORD flags = 0; + i32 exStyle = GetWindowLongW(win->src.window, GWL_EXSTYLE); + + if (exStyle & WS_EX_LAYERED) + GetLayeredWindowAttributes(win->src.window, &key, &alpha, &flags); + + if (passthrough) + exStyle |= (WS_EX_TRANSPARENT | WS_EX_LAYERED); + else { + exStyle &= ~WS_EX_TRANSPARENT; + if (exStyle & WS_EX_LAYERED && !(flags & LWA_ALPHA)) + exStyle &= ~WS_EX_LAYERED; + } + + SetWindowLongW(win->src.window, GWL_EXSTYLE, exStyle); + + if (passthrough) + SetLayeredWindowAttributes(win->src.window, key, alpha, flags); +} +#endif + +RGFW_bool RGFW_window_setIconEx(RGFW_window* win, u8* src, RGFW_area a, i32 channels, u8 type) { + RGFW_ASSERT(win != NULL); + #ifndef RGFW_WIN95 + RGFW_UNUSED(channels); + + if (win->src.hIconSmall && (type & RGFW_iconWindow)) DestroyIcon(win->src.hIconSmall); + if (win->src.hIconBig && (type & RGFW_iconTaskbar)) DestroyIcon(win->src.hIconBig); + + if (src == NULL) { + HICON defaultIcon = LoadIcon(NULL, IDI_APPLICATION); + if (type & RGFW_iconWindow) + SendMessage(win->src.window, WM_SETICON, (WPARAM)ICON_SMALL, (LPARAM)defaultIcon); + if (type & RGFW_iconTaskbar) + SendMessage(win->src.window, WM_SETICON, (WPARAM)ICON_BIG, (LPARAM)defaultIcon); + return RGFW_TRUE; + } + + if (type & RGFW_iconWindow) { + win->src.hIconSmall = RGFW_loadHandleImage(src, channels, a, TRUE); + SendMessage(win->src.window, WM_SETICON, (WPARAM)ICON_SMALL, (LPARAM)win->src.hIconSmall); + } + if (type & RGFW_iconTaskbar) { + win->src.hIconBig = RGFW_loadHandleImage(src, channels, a, TRUE); + SendMessage(win->src.window, WM_SETICON, (WPARAM)ICON_BIG, (LPARAM)win->src.hIconBig); + } + return RGFW_TRUE; + #else + RGFW_UNUSED(src); + RGFW_UNUSED(a); + RGFW_UNUSED(channels); + return RGFW_FALSE; + #endif +} + +RGFW_ssize_t RGFW_readClipboardPtr(char* str, size_t strCapacity) { + /* Open the clipboard */ + if (OpenClipboard(NULL) == 0) + return -1; + + /* Get the clipboard data as a Unicode string */ + HANDLE hData = GetClipboardData(CF_UNICODETEXT); + if (hData == NULL) { + CloseClipboard(); + return -1; + } + + wchar_t* wstr = (wchar_t*) GlobalLock(hData); + + RGFW_ssize_t textLen = 0; + + { + setlocale(LC_ALL, "en_US.UTF-8"); + + textLen = (RGFW_ssize_t)wcstombs(NULL, wstr, 0) + 1; + if (str != NULL && (RGFW_ssize_t)strCapacity <= textLen - 1) + textLen = 0; + + if (str != NULL && textLen) { + if (textLen > 1) + wcstombs(str, wstr, (size_t)(textLen)); + + str[textLen] = '\0'; + } + } + + /* Release the clipboard data */ + GlobalUnlock(hData); + CloseClipboard(); + + return textLen; +} + +void RGFW_writeClipboard(const char* text, u32 textLen) { + HANDLE object; + WCHAR* buffer; + + object = GlobalAlloc(GMEM_MOVEABLE, (1 + textLen) * sizeof(WCHAR)); + if (!object) + return; + + buffer = (WCHAR*) GlobalLock(object); + if (!buffer) { + GlobalFree(object); + return; + } + + MultiByteToWideChar(CP_UTF8, 0, text, -1, buffer, (i32)textLen); + GlobalUnlock(object); + + if (!OpenClipboard(_RGFW.root->src.window)) { + GlobalFree(object); + return; + } + + EmptyClipboard(); + SetClipboardData(CF_UNICODETEXT, object); + CloseClipboard(); +} + +void RGFW_window_moveMouse(RGFW_window* win, RGFW_point p) { + RGFW_ASSERT(win != NULL); + win->_lastMousePoint = RGFW_POINT(p.x - win->r.x, p.y - win->r.y); + SetCursorPos(p.x, p.y); +} + +#ifdef RGFW_OPENGL +void RGFW_window_makeCurrent_OpenGL(RGFW_window* win) { + if (win == NULL) + wglMakeCurrent(NULL, NULL); + else + wglMakeCurrent(win->src.hdc, (HGLRC) win->src.ctx); +} +void* RGFW_getCurrent_OpenGL(void) { return wglGetCurrentContext(); } +void RGFW_window_swapBuffers_OpenGL(RGFW_window* win){ SwapBuffers(win->src.hdc); } +#endif + +#ifndef RGFW_EGL +void RGFW_window_swapInterval(RGFW_window* win, i32 swapInterval) { + RGFW_ASSERT(win != NULL); +#if defined(RGFW_OPENGL) + if (wglSwapIntervalEXT == NULL || wglSwapIntervalEXT(swapInterval) == FALSE) + RGFW_sendDebugInfo(RGFW_typeError, RGFW_errOpenglContext, RGFW_DEBUG_CTX(win, 0), "Failed to set swap interval"); +#else + RGFW_UNUSED(swapInterval); +#endif +} +#endif + +void RGFW_window_swapBuffers_software(RGFW_window* win) { +#if defined(RGFW_OSMESA) || defined(RGFW_BUFFER) + if (win->buffer != win->src.bitmapBits) + memcpy(win->src.bitmapBits, win->buffer, win->bufferSize.w * win->bufferSize.h * 4); + + RGFW_RGB_to_BGR(win, win->src.bitmapBits); + BitBlt(win->src.hdc, 0, 0, win->r.w, win->r.h, win->src.hdcMem, 0, 0, SRCCOPY); +#else + RGFW_UNUSED(win); +#endif +} + +char* RGFW_createUTF8FromWideStringWin32(const WCHAR* source) { + if (source == NULL) { + return NULL; + } + i32 size = WideCharToMultiByte(CP_UTF8, 0, source, -1, NULL, 0, NULL, NULL); + if (!size) { + return NULL; + } + + static char target[RGFW_MAX_PATH * 2]; + if (size > RGFW_MAX_PATH * 2) + size = RGFW_MAX_PATH * 2; + + target[size] = 0; + + if (!WideCharToMultiByte(CP_UTF8, 0, source, -1, target, size, NULL, NULL)) { + return NULL; + } + + return target; +} + +u64 RGFW_getTimerFreq(void) { + static u64 frequency = 0; + if (frequency == 0) QueryPerformanceFrequency((LARGE_INTEGER*)&frequency); + + return frequency; +} + +u64 RGFW_getTimerValue(void) { + u64 value; + QueryPerformanceCounter((LARGE_INTEGER*)&value); + return value; +} + +void RGFW_sleep(u64 ms) { + Sleep((u32)ms); +} + +#ifndef RGFW_NO_THREADS + +RGFW_thread RGFW_createThread(RGFW_threadFunc_ptr ptr, void* args) { return CreateThread(NULL, 0, ptr, args, 0, NULL); } +void RGFW_cancelThread(RGFW_thread thread) { CloseHandle((HANDLE) thread); } +void RGFW_joinThread(RGFW_thread thread) { WaitForSingleObject((HANDLE) thread, INFINITE); } +void RGFW_setThreadPriority(RGFW_thread thread, u8 priority) { SetThreadPriority((HANDLE) thread, priority); } + +#endif +#endif /* RGFW_WINDOWS */ + +/* + End of Windows defines +*/ + + + +/* + + Start of MacOS defines + + +*/ + +#if defined(RGFW_MACOS) +/* + based on silicon.h + start of cocoa wrapper +*/ + +#include +#include +#include +#include +#include +#include + +typedef CGRect NSRect; +typedef CGPoint NSPoint; +typedef CGSize NSSize; + +typedef const char* NSPasteboardType; +typedef unsigned long NSUInteger; +typedef long NSInteger; +typedef NSInteger NSModalResponse; + +#ifdef __arm64__ + /* ARM just uses objc_msgSend */ +#define abi_objc_msgSend_stret objc_msgSend +#define abi_objc_msgSend_fpret objc_msgSend +#else /* __i386__ */ + /* x86 just uses abi_objc_msgSend_fpret and (NSColor *)objc_msgSend_id respectively */ +#define abi_objc_msgSend_stret objc_msgSend_stret +#define abi_objc_msgSend_fpret objc_msgSend_fpret +#endif + +#define NSAlloc(nsclass) objc_msgSend_id((id)nsclass, sel_registerName("alloc")) +#define objc_msgSend_bool(x, y) ((BOOL (*)(id, SEL))objc_msgSend) ((id)(x), (SEL)y) +#define objc_msgSend_void(x, y) ((void (*)(id, SEL))objc_msgSend) ((id)(x), (SEL)y) +#define objc_msgSend_void_id(x, y, z) ((void (*)(id, SEL, id))objc_msgSend) ((id)x, (SEL)y, (id)z) +#define objc_msgSend_uint(x, y) ((NSUInteger (*)(id, SEL))objc_msgSend) ((id)(x), (SEL)y) +#define objc_msgSend_void_bool(x, y, z) ((void (*)(id, SEL, BOOL))objc_msgSend) ((id)(x), (SEL)y, (BOOL)z) +#define objc_msgSend_bool_void(x, y) ((BOOL (*)(id, SEL))objc_msgSend) ((id)(x), (SEL)y) +#define objc_msgSend_void_SEL(x, y, z) ((void (*)(id, SEL, SEL))objc_msgSend) ((id)(x), (SEL)y, (SEL)z) +#define objc_msgSend_id(x, y) ((id (*)(id, SEL))objc_msgSend) ((id)(x), (SEL)y) +#define objc_msgSend_id_id(x, y, z) ((id (*)(id, SEL, id))objc_msgSend) ((id)(x), (SEL)y, (id)z) +#define objc_msgSend_id_bool(x, y, z) ((BOOL (*)(id, SEL, id))objc_msgSend) ((id)(x), (SEL)y, (id)z) +#define objc_msgSend_int(x, y, z) ((id (*)(id, SEL, int))objc_msgSend) ((id)(x), (SEL)y, (int)z) +#define objc_msgSend_arr(x, y, z) ((id (*)(id, SEL, int))objc_msgSend) ((id)(x), (SEL)y, (int)z) +#define objc_msgSend_ptr(x, y, z) ((id (*)(id, SEL, void*))objc_msgSend) ((id)(x), (SEL)y, (void*)z) +#define objc_msgSend_class(x, y) ((id (*)(Class, SEL))objc_msgSend) ((Class)(x), (SEL)y) +#define objc_msgSend_class_char(x, y, z) ((id (*)(Class, SEL, char*))objc_msgSend) ((Class)(x), (SEL)y, (char*)z) + +id NSApp = NULL; + +#define NSRelease(obj) objc_msgSend_void((id)obj, sel_registerName("release")) +id NSString_stringWithUTF8String(const char* str); +id NSString_stringWithUTF8String(const char* str) { + return ((id(*)(id, SEL, const char*))objc_msgSend) + ((id)objc_getClass("NSString"), sel_registerName("stringWithUTF8String:"), str); +} + +const char* NSString_to_char(id str); +const char* NSString_to_char(id str) { + return ((const char* (*)(id, SEL)) objc_msgSend) ((id)(id)str, sel_registerName("UTF8String")); +} + +void si_impl_func_to_SEL_with_name(const char* class_name, const char* register_name, void* function); +void si_impl_func_to_SEL_with_name(const char* class_name, const char* register_name, void* function) { + Class selected_class; + + if (RGFW_STRNCMP(class_name, "NSView", 6) == 0) { + selected_class = objc_getClass("ViewClass"); + } else if (RGFW_STRNCMP(class_name, "NSWindow", 8) == 0) { + selected_class = objc_getClass("WindowClass"); + } else { + selected_class = objc_getClass(class_name); + } + + class_addMethod(selected_class, sel_registerName(register_name), (IMP) function, 0); +} + +/* Header for the array. */ +typedef struct siArrayHeader { + size_t count; + /* TODO(EimaMei): Add a `type_width` later on. */ +} siArrayHeader; + +/* Gets the header of the siArray. */ +#define SI_ARRAY_HEADER(s) ((siArrayHeader*)s - 1) +#define si_array_len(array) (SI_ARRAY_HEADER(array)->count) +#define si_func_to_SEL(class_name, function) si_impl_func_to_SEL_with_name(class_name, #function":", (void*)function) +/* Creates an Objective-C method (SEL) from a regular C function with the option to set the register name.*/ +#define si_func_to_SEL_with_name(class_name, register_name, function) si_impl_func_to_SEL_with_name(class_name, register_name":", (void*)function) + +unsigned char* NSBitmapImageRep_bitmapData(id imageRep); +unsigned char* NSBitmapImageRep_bitmapData(id imageRep) { + return ((unsigned char* (*)(id, SEL))objc_msgSend) ((id)imageRep, sel_registerName("bitmapData")); +} + +typedef RGFW_ENUM(NSUInteger, NSBitmapFormat) { + NSBitmapFormatAlphaFirst = 1 << 0, /* 0 means is alpha last (RGBA, CMYKA, etc.) */ + NSBitmapFormatAlphaNonpremultiplied = 1 << 1, /* 0 means is premultiplied */ + NSBitmapFormatFloatingpointSamples = 1 << 2, /* 0 is integer */ + + NSBitmapFormatSixteenBitLittleEndian = (1 << 8), + NSBitmapFormatThirtyTwoBitLittleEndian = (1 << 9), + NSBitmapFormatSixteenBitBigEndian = (1 << 10), + NSBitmapFormatThirtyTwoBitBigEndian = (1 << 11) +}; + +id NSBitmapImageRep_initWithBitmapData(unsigned char** planes, NSInteger width, NSInteger height, NSInteger bps, NSInteger spp, bool alpha, bool isPlanar, const char* colorSpaceName, NSBitmapFormat bitmapFormat, NSInteger rowBytes, NSInteger pixelBits); +id NSBitmapImageRep_initWithBitmapData(unsigned char** planes, NSInteger width, NSInteger height, NSInteger bps, NSInteger spp, bool alpha, bool isPlanar, const char* colorSpaceName, NSBitmapFormat bitmapFormat, NSInteger rowBytes, NSInteger pixelBits) { + SEL func = sel_registerName("initWithBitmapDataPlanes:pixelsWide:pixelsHigh:bitsPerSample:samplesPerPixel:hasAlpha:isPlanar:colorSpaceName:bitmapFormat:bytesPerRow:bitsPerPixel:"); + + return (id) ((id(*)(id, SEL, unsigned char**, NSInteger, NSInteger, NSInteger, NSInteger, bool, bool, id, NSBitmapFormat, NSInteger, NSInteger))objc_msgSend) + (NSAlloc((id)objc_getClass("NSBitmapImageRep")), func, planes, width, height, bps, spp, alpha, isPlanar, NSString_stringWithUTF8String(colorSpaceName), bitmapFormat, rowBytes, pixelBits); +} + +id NSColor_colorWithSRGB(CGFloat red, CGFloat green, CGFloat blue, CGFloat alpha); +id NSColor_colorWithSRGB(CGFloat red, CGFloat green, CGFloat blue, CGFloat alpha) { + void* nsclass = objc_getClass("NSColor"); + SEL func = sel_registerName("colorWithSRGBRed:green:blue:alpha:"); + return ((id(*)(id, SEL, CGFloat, CGFloat, CGFloat, CGFloat))objc_msgSend) + ((id)nsclass, func, red, green, blue, alpha); +} + +typedef RGFW_ENUM(NSInteger, NSOpenGLContextParameter) { + NSOpenGLContextParameterSwapInterval = 222, /* 1 param. 0 -> Don't sync, 1 -> Sync to vertical retrace */ + NSOpenGLContextParametectxaceOrder = 235, /* 1 param. 1 -> Above Window (default), -1 -> Below Window */ + NSOpenGLContextParametectxaceOpacity = 236, /* 1 param. 1-> Surface is opaque (default), 0 -> non-opaque */ + NSOpenGLContextParametectxaceBackingSize = 304, /* 2 params. Width/height of surface backing size */ + NSOpenGLContextParameterReclaimResources = 308, /* 0 params. */ + NSOpenGLContextParameterCurrentRendererID = 309, /* 1 param. Retrieves the current renderer ID */ + NSOpenGLContextParameterGPUVertexProcessing = 310, /* 1 param. Currently processing vertices with GPU (get) */ + NSOpenGLContextParameterGPUFragmentProcessing = 311, /* 1 param. Currently processing fragments with GPU (get) */ + NSOpenGLContextParameterHasDrawable = 314, /* 1 param. Boolean returned if drawable is attached */ + NSOpenGLContextParameterMPSwapsInFlight = 315, /* 1 param. Max number of swaps queued by the MP GL engine */ + + NSOpenGLContextParameterSwapRectangle API_DEPRECATED("", macos(10.0, 10.14)) = 200, /* 4 params. Set or get the swap rectangle {x, y, w, h} */ + NSOpenGLContextParameterSwapRectangleEnable API_DEPRECATED("", macos(10.0, 10.14)) = 201, /* Enable or disable the swap rectangle */ + NSOpenGLContextParameterRasterizationEnable API_DEPRECATED("", macos(10.0, 10.14)) = 221, /* Enable or disable all rasterization */ + NSOpenGLContextParameterStateValidation API_DEPRECATED("", macos(10.0, 10.14)) = 301, /* Validate state for multi-screen functionality */ + NSOpenGLContextParametectxaceSurfaceVolatile API_DEPRECATED("", macos(10.0, 10.14)) = 306, /* 1 param. Surface volatile state */ +}; + +typedef RGFW_ENUM(NSInteger, NSWindowButton) { + NSWindowCloseButton = 0, + NSWindowMiniaturizeButton = 1, + NSWindowZoomButton = 2, + NSWindowToolbarButton = 3, + NSWindowDocumentIconButton = 4, + NSWindowDocumentVersionsButton = 6, + NSWindowFullScreenButton = 7, +}; +void NSOpenGLContext_setValues(id context, const int* vals, NSOpenGLContextParameter param); +void NSOpenGLContext_setValues(id context, const int* vals, NSOpenGLContextParameter param) { + ((void (*)(id, SEL, const int*, NSOpenGLContextParameter))objc_msgSend) + (context, sel_registerName("setValues:forParameter:"), vals, param); +} +void* NSOpenGLPixelFormat_initWithAttributes(const uint32_t* attribs); +void* NSOpenGLPixelFormat_initWithAttributes(const uint32_t* attribs) { + return (void*) ((id(*)(id, SEL, const uint32_t*))objc_msgSend) + (NSAlloc((id)objc_getClass("NSOpenGLPixelFormat")), sel_registerName("initWithAttributes:"), attribs); +} + +id NSPasteboard_generalPasteboard(void); +id NSPasteboard_generalPasteboard(void) { + return (id) objc_msgSend_id((id)objc_getClass("NSPasteboard"), sel_registerName("generalPasteboard")); +} + +id* cstrToNSStringArray(char** strs, size_t len); +id* cstrToNSStringArray(char** strs, size_t len) { + static id nstrs[6]; + size_t i; + for (i = 0; i < len; i++) + nstrs[i] = NSString_stringWithUTF8String(strs[i]); + + return nstrs; +} + +const char* NSPasteboard_stringForType(id pasteboard, NSPasteboardType dataType, size_t* len); +const char* NSPasteboard_stringForType(id pasteboard, NSPasteboardType dataType, size_t* len) { + SEL func = sel_registerName("stringForType:"); + id nsstr = NSString_stringWithUTF8String(dataType); + id nsString = ((id(*)(id, SEL, id))objc_msgSend)(pasteboard, func, nsstr); + const char* str = NSString_to_char(nsString); + if (len != NULL) + *len = (size_t)((NSUInteger(*)(id, SEL, int))objc_msgSend)(nsString, sel_registerName("maximumLengthOfBytesUsingEncoding:"), 4); + return str; +} + +id c_array_to_NSArray(void* array, size_t len); +id c_array_to_NSArray(void* array, size_t len) { + SEL func = sel_registerName("initWithObjects:count:"); + void* nsclass = objc_getClass("NSArray"); + return ((id (*)(id, SEL, void*, NSUInteger))objc_msgSend) + (NSAlloc(nsclass), func, array, len); +} + + +void NSregisterForDraggedTypes(id view, NSPasteboardType* newTypes, size_t len); +void NSregisterForDraggedTypes(id view, NSPasteboardType* newTypes, size_t len) { + id* ntypes = cstrToNSStringArray((char**)newTypes, len); + + id array = c_array_to_NSArray(ntypes, len); + objc_msgSend_void_id(view, sel_registerName("registerForDraggedTypes:"), array); + NSRelease(array); +} + +NSInteger NSPasteBoard_declareTypes(id pasteboard, NSPasteboardType* newTypes, size_t len, void* owner); +NSInteger NSPasteBoard_declareTypes(id pasteboard, NSPasteboardType* newTypes, size_t len, void* owner) { + id* ntypes = cstrToNSStringArray((char**)newTypes, len); + + SEL func = sel_registerName("declareTypes:owner:"); + + id array = c_array_to_NSArray(ntypes, len); + + NSInteger output = ((NSInteger(*)(id, SEL, id, void*))objc_msgSend) + (pasteboard, func, array, owner); + NSRelease(array); + + return output; +} + +#define NSRetain(obj) objc_msgSend_void((id)obj, sel_registerName("retain")) + +typedef enum NSApplicationActivationPolicy { + NSApplicationActivationPolicyRegular, + NSApplicationActivationPolicyAccessory, + NSApplicationActivationPolicyProhibited +} NSApplicationActivationPolicy; + +typedef RGFW_ENUM(u32, NSBackingStoreType) { + NSBackingStoreRetained = 0, + NSBackingStoreNonretained = 1, + NSBackingStoreBuffered = 2 +}; + +typedef RGFW_ENUM(u32, NSWindowStyleMask) { + NSWindowStyleMaskBorderless = 0, + NSWindowStyleMaskTitled = 1 << 0, + NSWindowStyleMaskClosable = 1 << 1, + NSWindowStyleMaskMiniaturizable = 1 << 2, + NSWindowStyleMaskResizable = 1 << 3, + NSWindowStyleMaskTexturedBackground = 1 << 8, /* deprecated */ + NSWindowStyleMaskUnifiedTitleAndToolbar = 1 << 12, + NSWindowStyleMaskFullScreen = 1 << 14, + NSWindowStyleMaskFullSizeContentView = 1 << 15, + NSWindowStyleMaskUtilityWindow = 1 << 4, + NSWindowStyleMaskDocModalWindow = 1 << 6, + NSWindowStyleMaskNonactivatingpanel = 1 << 7, + NSWindowStyleMaskHUDWindow = 1 << 13 +}; + +NSPasteboardType const NSPasteboardTypeString = "public.utf8-plain-text"; /* Replaces NSStringPasteboardType */ + + +typedef RGFW_ENUM(i32, NSDragOperation) { + NSDragOperationNone = 0, + NSDragOperationCopy = 1, + NSDragOperationLink = 2, + NSDragOperationGeneric = 4, + NSDragOperationPrivate = 8, + NSDragOperationMove = 16, + NSDragOperationDelete = 32, + NSDragOperationEvery = (int)ULONG_MAX +}; + +void* NSArray_objectAtIndex(id array, NSUInteger index) { + SEL func = sel_registerName("objectAtIndex:"); + return ((id(*)(id, SEL, NSUInteger))objc_msgSend)(array, func, index); +} + +id NSWindow_contentView(id window) { + SEL func = sel_registerName("contentView"); + return objc_msgSend_id(window, func); +} + +/* + End of cocoa wrapper +*/ + +#ifdef RGFW_OPENGL +/* MacOS opengl API spares us yet again (there are no extensions) */ +RGFW_bool RGFW_extensionSupportedPlatform(const char * extension, size_t len) { RGFW_UNUSED(extension); RGFW_UNUSED(len); return RGFW_FALSE; } +CFBundleRef RGFWnsglFramework = NULL; + +RGFW_proc RGFW_getProcAddress(const char* procname) { + if (RGFWnsglFramework == NULL) + RGFWnsglFramework = CFBundleGetBundleWithIdentifier(CFSTR("com.apple.opengl")); + + CFStringRef symbolName = CFStringCreateWithCString(kCFAllocatorDefault, procname, kCFStringEncodingASCII); + + RGFW_proc symbol = (RGFW_proc)CFBundleGetFunctionPointerForName(RGFWnsglFramework, symbolName); + + CFRelease(symbolName); + + return symbol; +} +#endif + +id NSWindow_delegate(RGFW_window* win) { + return (id) objc_msgSend_id((id)win->src.window, sel_registerName("delegate")); +} + +u32 RGFW_OnClose(id self) { + RGFW_window* win = NULL; + object_getInstanceVariable(self, (const char*)"RGFW_window", (void**)&win); + if (win == NULL) + return true; + + RGFW_eventQueuePushEx(e.type = RGFW_quit; e._win = win); + RGFW_windowQuitCallback(win); + + return false; +} + +/* NOTE(EimaMei): Fixes the constant clicking when the app is running under a terminal. */ +bool acceptsFirstResponder(void) { return true; } +bool performKeyEquivalent(id event) { RGFW_UNUSED(event); return true; } + +NSDragOperation draggingEntered(id self, SEL sel, id sender) { + RGFW_UNUSED(sender); RGFW_UNUSED(self); RGFW_UNUSED(sel); + + return NSDragOperationCopy; +} +NSDragOperation draggingUpdated(id self, SEL sel, id sender) { + RGFW_UNUSED(sel); + + RGFW_window* win = NULL; + object_getInstanceVariable(self, "RGFW_window", (void**)&win); + if (win == NULL || (!(win->_flags & RGFW_windowAllowDND))) + return 0; + + NSPoint p = ((NSPoint(*)(id, SEL)) objc_msgSend)(sender, sel_registerName("draggingLocation")); + RGFW_eventQueuePushEx(e.type = RGFW_DNDInit; + e.point = RGFW_POINT((u32) p.x, (u32) (win->r.h - p.y)); + e._win = win); + + RGFW_dndInitCallback(win, win->event.point); + return NSDragOperationCopy; +} +bool prepareForDragOperation(id self) { + RGFW_window* win = NULL; + object_getInstanceVariable(self, "RGFW_window", (void**)&win); + if (win == NULL) + return true; + + if (!(win->_flags & RGFW_windowAllowDND)) { + return false; + } + + return true; +} + +void RGFW__osxDraggingEnded(id self, SEL sel, id sender); +void RGFW__osxDraggingEnded(id self, SEL sel, id sender) { RGFW_UNUSED(sender); RGFW_UNUSED(self); RGFW_UNUSED(sel); return; } + +/* NOTE(EimaMei): Usually, you never need 'id self, SEL cmd' for C -> Obj-C methods. This isn't the case. */ +bool performDragOperation(id self, SEL sel, id sender) { + RGFW_UNUSED(sender); RGFW_UNUSED(self); RGFW_UNUSED(sel); + + RGFW_window* win = NULL; + object_getInstanceVariable(self, "RGFW_window", (void**)&win); + + if (win == NULL) + return false; + + /* id pasteBoard = objc_msgSend_id(sender, sel_registerName("draggingPasteboard")); */ + + id pasteBoard = objc_msgSend_id(sender, sel_registerName("draggingPasteboard")); + + /* Get the types of data available on the pasteboard */ + id types = objc_msgSend_id(pasteBoard, sel_registerName("types")); + + /* Get the string type for file URLs */ + id fileURLsType = objc_msgSend_class_char(objc_getClass("NSString"), sel_registerName("stringWithUTF8String:"), "NSFilenamesPboardType"); + + /* Check if the pasteboard contains file URLs */ + if (objc_msgSend_id_bool(types, sel_registerName("containsObject:"), fileURLsType) == 0) { + RGFW_sendDebugInfo(RGFW_typeError, RGFW_errClipboard, RGFW_DEBUG_CTX(win, 0), "No files found on the pasteboard."); + return 0; + } + + id fileURLs = objc_msgSend_id_id(pasteBoard, sel_registerName("propertyListForType:"), fileURLsType); + int count = ((int (*)(id, SEL))objc_msgSend)(fileURLs, sel_registerName("count")); + + if (count == 0) + return 0; + + int i; + for (i = 0; i < count; i++) { + id fileURL = objc_msgSend_arr(fileURLs, sel_registerName("objectAtIndex:"), i); + const char *filePath = ((const char* (*)(id, SEL))objc_msgSend)(fileURL, sel_registerName("UTF8String")); + RGFW_STRNCPY(win->event.droppedFiles[i], filePath, RGFW_MAX_PATH - 1); + win->event.droppedFiles[i][RGFW_MAX_PATH - 1] = '\0'; + } + NSPoint p = ((NSPoint(*)(id, SEL)) objc_msgSend)(sender, sel_registerName("draggingLocation")); + + win->event.droppedFilesCount = (size_t)count; + RGFW_eventQueuePushEx(e.type = RGFW_DND; + e.point = RGFW_POINT((u32) p.x, (u32) (win->r.h - p.y)); + e.droppedFilesCount = (size_t)count; + e._win = win); + + RGFW_dndCallback(win, win->event.droppedFiles, win->event.droppedFilesCount); + + return false; +} + +#ifndef RGFW_NO_IOKIT +#include +#include + +u32 RGFW_osx_getFallbackRefreshRate(CGDirectDisplayID displayID) { + u32 refreshRate = 0; + io_iterator_t it; + io_service_t service; + CFNumberRef indexRef, clockRef, countRef; + uint32_t clock, count; + +#ifdef kIOMainPortDefault + if (IOServiceGetMatchingServices(kIOMainPortDefault, IOServiceMatching("IOFramebuffer"), &it) != 0) +#elif defined(kIOMasterPortDefault) + if (IOServiceGetMatchingServices(kIOMainPortDefault, IOServiceMatching("IOFramebuffer"), &it) != 0) +#endif + return RGFW_FALSE; + + while ((service = IOIteratorNext(it)) != 0) { + uint32_t index; + indexRef = (CFNumberRef)IORegistryEntryCreateCFProperty(service, CFSTR("IOFramebufferOpenGLIndex"), kCFAllocatorDefault, kNilOptions); + if (indexRef == 0) continue; + + if (CFNumberGetValue(indexRef, kCFNumberIntType, &index) && CGOpenGLDisplayMaskToDisplayID(1 << index) == displayID) { + CFRelease(indexRef); + break; + } + + CFRelease(indexRef); + } + + if (service) { + clockRef = (CFNumberRef)IORegistryEntryCreateCFProperty(service, CFSTR("IOFBCurrentPixelClock"), kCFAllocatorDefault, kNilOptions); + if (clockRef) { + if (CFNumberGetValue(clockRef, kCFNumberIntType, &clock) && clock) { + countRef = (CFNumberRef)IORegistryEntryCreateCFProperty(service, CFSTR("IOFBCurrentPixelCount"), kCFAllocatorDefault, kNilOptions); + if (countRef && CFNumberGetValue(countRef, kCFNumberIntType, &count) && count) { + refreshRate = (u32)RGFW_ROUND(clock / (double) count); + CFRelease(countRef); + } + } + CFRelease(clockRef); + } + } + + IOObjectRelease(it); + return refreshRate; +} + +IOHIDDeviceRef RGFW_osxControllers[4] = {NULL}; + +size_t findControllerIndex(IOHIDDeviceRef device) { + size_t i; + for (i = 0; i < 4; i++) + if (RGFW_osxControllers[i] == device) + return i; + return (size_t)-1; +} + +void RGFW__osxInputValueChangedCallback(void *context, IOReturn result, void *sender, IOHIDValueRef value) { + RGFW_UNUSED(context); RGFW_UNUSED(result); RGFW_UNUSED(sender); + IOHIDElementRef element = IOHIDValueGetElement(value); + + IOHIDDeviceRef device = IOHIDElementGetDevice(element); + size_t index = findControllerIndex(device); + if (index == (size_t)-1) return; + + uint32_t usagePage = IOHIDElementGetUsagePage(element); + uint32_t usage = IOHIDElementGetUsage(element); + + CFIndex intValue = IOHIDValueGetIntegerValue(value); + + u8 RGFW_osx2RGFWSrc[2][RGFW_gamepadFinal] = {{ + 0, RGFW_gamepadSelect, RGFW_gamepadL3, RGFW_gamepadR3, RGFW_gamepadStart, + RGFW_gamepadUp, RGFW_gamepadRight, RGFW_gamepadDown, RGFW_gamepadLeft, + RGFW_gamepadL2, RGFW_gamepadR2, RGFW_gamepadL1, RGFW_gamepadR1, + RGFW_gamepadY, RGFW_gamepadB, RGFW_gamepadA, RGFW_gamepadX, RGFW_gamepadHome}, + {0, RGFW_gamepadA, RGFW_gamepadB, RGFW_gamepadR3, RGFW_gamepadX, + RGFW_gamepadY, RGFW_gamepadRight, RGFW_gamepadL1, RGFW_gamepadR1, + RGFW_gamepadL2, RGFW_gamepadR2, RGFW_gamepadDown, RGFW_gamepadStart, + RGFW_gamepadUp, RGFW_gamepadL3, RGFW_gamepadSelect, RGFW_gamepadStart, RGFW_gamepadHome} + }; + + u8* RGFW_osx2RGFW = RGFW_osx2RGFWSrc[0]; + if (RGFW_gamepads_type[index] == RGFW_gamepadMicrosoft) + RGFW_osx2RGFW = RGFW_osx2RGFWSrc[1]; + + switch (usagePage) { + case kHIDPage_Button: { + u8 button = 0; + if (usage < sizeof(RGFW_osx2RGFW)) + button = RGFW_osx2RGFW[usage]; + + RGFW_gamepadButtonCallback(_RGFW.root, (u16)index, button, (u8)intValue); + RGFW_gamepadPressed[index][button].prev = RGFW_gamepadPressed[index][button].current; + RGFW_gamepadPressed[index][button].current = RGFW_BOOL(intValue); + RGFW_eventQueuePushEx(e.type = intValue ? RGFW_gamepadButtonPressed: RGFW_gamepadButtonReleased; + e.button = button; + e.gamepad = (u16)index; + e._win = _RGFW.root); + break; + } + case kHIDPage_GenericDesktop: { + CFIndex logicalMin = IOHIDElementGetLogicalMin(element); + CFIndex logicalMax = IOHIDElementGetLogicalMax(element); + + if (logicalMax <= logicalMin) return; + if (intValue < logicalMin) intValue = logicalMin; + if (intValue > logicalMax) intValue = logicalMax; + + i8 axisValue = (i8)(-100.0 + ((intValue - logicalMin) * 200.0) / (logicalMax - logicalMin)); + + u8 whichAxis = 0; + switch (usage) { + case kHIDUsage_GD_X: RGFW_gamepadAxes[index][0].x = axisValue; whichAxis = 0; break; + case kHIDUsage_GD_Y: RGFW_gamepadAxes[index][0].y = axisValue; whichAxis = 0; break; + case kHIDUsage_GD_Z: RGFW_gamepadAxes[index][1].x = axisValue; whichAxis = 1; break; + case kHIDUsage_GD_Rz: RGFW_gamepadAxes[index][1].y = axisValue; whichAxis = 1; break; + default: return; + } + + RGFW_event e; + e.type = RGFW_gamepadAxisMove; + e.gamepad = (u16)index; + e.whichAxis = whichAxis; + e._win = _RGFW.root; + for (size_t i = 0; i < 4; i++) + e.axis[i] = RGFW_gamepadAxes[index][i]; + + RGFW_eventQueuePush(e); + + RGFW_gamepadAxisCallback(_RGFW.root, (u16)index, RGFW_gamepadAxes[index], 2, whichAxis); + } + } +} + +void RGFW__osxDeviceAddedCallback(void* context, IOReturn result, void *sender, IOHIDDeviceRef device) { + RGFW_UNUSED(context); RGFW_UNUSED(result); RGFW_UNUSED(sender); + CFTypeRef usageRef = (CFTypeRef)IOHIDDeviceGetProperty(device, CFSTR(kIOHIDPrimaryUsageKey)); + int usage = 0; + if (usageRef) + CFNumberGetValue((CFNumberRef)usageRef, kCFNumberIntType, (void*)&usage); + + if (usage != kHIDUsage_GD_Joystick && usage != kHIDUsage_GD_GamePad && usage != kHIDUsage_GD_MultiAxisController) { + return; + } + + size_t i; + for (i = 0; i < 4; i++) { + if (RGFW_osxControllers[i] != NULL) + continue; + + RGFW_osxControllers[i] = device; + + IOHIDDeviceRegisterInputValueCallback(device, RGFW__osxInputValueChangedCallback, NULL); + + CFStringRef deviceName = (CFStringRef)IOHIDDeviceGetProperty(device, CFSTR(kIOHIDProductKey)); + if (deviceName) + CFStringGetCString(deviceName, RGFW_gamepads_name[i], sizeof(RGFW_gamepads_name[i]), kCFStringEncodingUTF8); + + RGFW_gamepads_type[i] = RGFW_gamepadUnknown; + if (RGFW_STRSTR(RGFW_gamepads_name[i], "Microsoft") || RGFW_STRSTR(RGFW_gamepads_name[i], "X-Box") || RGFW_STRSTR(RGFW_gamepads_name[i], "Xbox")) + RGFW_gamepads_type[i] = RGFW_gamepadMicrosoft; + else if (RGFW_STRSTR(RGFW_gamepads_name[i], "PlayStation") || RGFW_STRSTR(RGFW_gamepads_name[i], "PS3") || RGFW_STRSTR(RGFW_gamepads_name[i], "PS4") || RGFW_STRSTR(RGFW_gamepads_name[i], "PS5")) + RGFW_gamepads_type[i] = RGFW_gamepadSony; + else if (RGFW_STRSTR(RGFW_gamepads_name[i], "Nintendo")) + RGFW_gamepads_type[i] = RGFW_gamepadNintendo; + else if (RGFW_STRSTR(RGFW_gamepads_name[i], "Logitech")) + RGFW_gamepads_type[i] = RGFW_gamepadLogitech; + + RGFW_gamepads[i] = (u16)i; + RGFW_gamepadCount++; + + RGFW_eventQueuePushEx(e.type = RGFW_gamepadConnected; + e.gamepad = (u16)i; + e._win = _RGFW.root); + + RGFW_gamepadCallback(_RGFW.root, (u16)i, 1); + break; + } +} + +void RGFW__osxDeviceRemovedCallback(void *context, IOReturn result, void *sender, IOHIDDeviceRef device) { + RGFW_UNUSED(context); RGFW_UNUSED(result); RGFW_UNUSED(sender); RGFW_UNUSED(device); + CFNumberRef usageRef = (CFNumberRef)IOHIDDeviceGetProperty(device, CFSTR(kIOHIDPrimaryUsageKey)); + int usage = 0; + if (usageRef) + CFNumberGetValue(usageRef, kCFNumberIntType, &usage); + + if (usage != kHIDUsage_GD_Joystick && usage != kHIDUsage_GD_GamePad && usage != kHIDUsage_GD_MultiAxisController) { + return; + } + + size_t index = findControllerIndex(device); + if (index != (size_t)-1) + RGFW_osxControllers[index] = NULL; + + RGFW_eventQueuePushEx(e.type = RGFW_gamepadDisconnected; + e.gamepad = (u16)index; + e._win = _RGFW.root); + RGFW_gamepadCallback(_RGFW.root, (u16)index, 0); + + RGFW_gamepadCount--; +} + +RGFWDEF void RGFW_osxInitIOKit(void); +void RGFW_osxInitIOKit(void) { + IOHIDManagerRef hidManager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); + if (!hidManager) { + RGFW_sendDebugInfo(RGFW_typeError, RGFW_errIOKit, RGFW_DEBUG_CTX(_RGFW.root, 0), "Failed to create IOHIDManager."); + return; + } + + CFMutableDictionaryRef matchingDictionary = CFDictionaryCreateMutable( + kCFAllocatorDefault, + 0, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks + ); + if (!matchingDictionary) { + RGFW_sendDebugInfo(RGFW_typeError, RGFW_errIOKit, RGFW_DEBUG_CTX(_RGFW.root, 0), "Failed to create matching dictionary for IOKit."); + CFRelease(hidManager); + return; + } + + CFDictionarySetValue( + matchingDictionary, + CFSTR(kIOHIDDeviceUsagePageKey), + CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, (int[]){kHIDPage_GenericDesktop}) + ); + + IOHIDManagerSetDeviceMatching(hidManager, matchingDictionary); + + IOHIDManagerRegisterDeviceMatchingCallback(hidManager, RGFW__osxDeviceAddedCallback, NULL); + IOHIDManagerRegisterDeviceRemovalCallback(hidManager, RGFW__osxDeviceRemovedCallback, NULL); + + IOHIDManagerScheduleWithRunLoop(hidManager, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); + + IOHIDManagerOpen(hidManager, kIOHIDOptionsTypeNone); + + /* Execute the run loop once in order to register any initially-attached joysticks */ + CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, false); +} +#endif + +void RGFW_moveToMacOSResourceDir(void) { + char resourcesPath[256]; + + CFBundleRef bundle = CFBundleGetMainBundle(); + if (!bundle) + return; + + CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(bundle); + CFStringRef last = CFURLCopyLastPathComponent(resourcesURL); + + if ( + CFStringCompare(CFSTR("Resources"), last, 0) != kCFCompareEqualTo || + CFURLGetFileSystemRepresentation(resourcesURL, true, (u8*) resourcesPath, 255) == 0 + ) { + CFRelease(last); + CFRelease(resourcesURL); + return; + } + + CFRelease(last); + CFRelease(resourcesURL); + + chdir(resourcesPath); +} + + +void RGFW__osxWindowDeminiaturize(id self, SEL sel) { + RGFW_UNUSED(sel); + RGFW_window* win = NULL; + object_getInstanceVariable(self, "RGFW_window", (void**)&win); + if (win == NULL) return; + + win->_flags |= RGFW_windowMinimize; + RGFW_eventQueuePushEx(e.type = RGFW_windowRestored; e._win = win); + RGFW_windowRestoredCallback(win, win->r); + +} +void RGFW__osxWindowMiniaturize(id self, SEL sel) { + RGFW_UNUSED(sel); + RGFW_window* win = NULL; + object_getInstanceVariable(self, "RGFW_window", (void**)&win); + if (win == NULL) return; + + win->_flags &= ~(u32)RGFW_windowMinimize; + RGFW_eventQueuePushEx(e.type = RGFW_windowMinimized; e._win = win); + RGFW_windowMinimizedCallback(win, win->r); + +} + +void RGFW__osxWindowBecameKey(id self, SEL sel) { + RGFW_UNUSED(sel); + RGFW_window* win = NULL; + object_getInstanceVariable(self, "RGFW_window", (void**)&win); + if (win == NULL) return; + + win->_flags |= RGFW_windowFocus; + RGFW_eventQueuePushEx(e.type = RGFW_focusIn; e._win = win); + + RGFW_focusCallback(win, RGFW_TRUE); + + RGFW_resetKey(); + if ((win->_flags & RGFW_HOLD_MOUSE)) RGFW_window_mouseHold(win, RGFW_AREA(win->r.w, win->r.h)); +} + +void RGFW__osxWindowResignKey(id self, SEL sel) { + RGFW_UNUSED(sel); + RGFW_window* win = NULL; + object_getInstanceVariable(self, "RGFW_window", (void**)&win); + if (win == NULL) return; + + win->_flags &= ~(u32)RGFW_windowFocus; + RGFW_eventQueuePushEx(e.type = RGFW_focusOut; e._win = win); + RGFW_focusCallback(win, RGFW_FALSE); +} + +NSSize RGFW__osxWindowResize(id self, SEL sel, NSSize frameSize) { + RGFW_UNUSED(sel); + + RGFW_window* win = NULL; + object_getInstanceVariable(self, "RGFW_window", (void**)&win); + if (win == NULL) return frameSize; + + win->r.w = (i32)frameSize.width; + win->r.h = (i32)frameSize.height; + + RGFW_monitor mon = RGFW_window_getMonitor(win); + if ((i32)mon.mode.area.w == win->r.w && (i32)mon.mode.area.h - 102 <= win->r.h) { + win->_flags |= RGFW_windowMaximize; + RGFW_eventQueuePushEx(e.type = RGFW_windowMaximized; e._win = win); + RGFW_windowMaximizedCallback(win, win->r); + } else if (win->_flags & RGFW_windowMaximize) { + win->_flags &= ~(u32)RGFW_windowMaximize; + RGFW_eventQueuePushEx(e.type = RGFW_windowRestored; e._win = win); + RGFW_windowRestoredCallback(win, win->r); + + } + + + RGFW_eventQueuePushEx(e.type = RGFW_windowResized; e._win = win); + RGFW_windowResizedCallback(win, win->r); + return frameSize; +} + +void RGFW__osxWindowMove(id self, SEL sel) { + RGFW_UNUSED(sel); + + RGFW_window* win = NULL; + object_getInstanceVariable(self, "RGFW_window", (void**)&win); + if (win == NULL) return; + + NSRect frame = ((NSRect(*)(id, SEL))abi_objc_msgSend_stret)((id)win->src.window, sel_registerName("frame")); + win->r.x = (i32) frame.origin.x; + win->r.y = (i32) frame.origin.y; + + RGFW_eventQueuePushEx(e.type = RGFW_windowMoved; e._win = win); + RGFW_windowMovedCallback(win, win->r); +} + +void RGFW__osxViewDidChangeBackingProperties(id self, SEL _cmd) { + RGFW_UNUSED(_cmd); + RGFW_window* win = NULL; + object_getInstanceVariable(self, "RGFW_window", (void**)&win); + if (win == NULL) return; + + RGFW_monitor mon = RGFW_window_getMonitor(win); + RGFW_scaleUpdatedCallback(win, mon.scaleX, mon.scaleY); + RGFW_eventQueuePushEx(e.type = RGFW_scaleUpdated; e.scaleX = mon.scaleX; e.scaleY = mon.scaleY ; e._win = win); +} + +void RGFW__osxDrawRect(id self, SEL _cmd, CGRect rect) { + RGFW_UNUSED(rect); RGFW_UNUSED(_cmd); + RGFW_window* win = NULL; + object_getInstanceVariable(self, "RGFW_window", (void**)&win); + if (win == NULL) return; + + RGFW_eventQueuePushEx(e.type = RGFW_windowRefresh; e._win = win); + RGFW_windowRefreshCallback(win); +} + +void RGFW_window_initBufferPtr(RGFW_window* win, u8* buffer, RGFW_area area) { + #if defined(RGFW_OSMESA) || defined(RGFW_BUFFER) + win->buffer = buffer; + win->bufferSize = area; + win->_flags |= RGFW_BUFFER_ALLOC; + #ifdef RGFW_OSMESA + win->src.ctx = OSMesaCreateContext(OSMESA_RGBA, NULL); + OSMesaMakeCurrent(win->src.ctx, win->buffer, GL_UNSIGNED_BYTE, area.w, area.h); + OSMesaPixelStore(OSMESA_Y_UP, 0); + #endif + #else + RGFW_UNUSED(win); RGFW_UNUSED(buffer); RGFW_UNUSED(area); /*!< if buffer rendering is not being used */ + #endif +} + +void RGFW_window_cocoaSetLayer(RGFW_window* win, void* layer) { + objc_msgSend_void_id((id)win->src.view, sel_registerName("setLayer"), (id)layer); +} + +void* RGFW_cocoaGetLayer(void) { + return objc_msgSend_class((id)objc_getClass("CAMetalLayer"), (SEL)sel_registerName("layer")); +} + +NSPasteboardType const NSPasteboardTypeURL = "public.url"; +NSPasteboardType const NSPasteboardTypeFileURL = "public.file-url"; + +id RGFW__osx_generateViewClass(const char* subclass, RGFW_window* win) { + Class customViewClass; + customViewClass = objc_allocateClassPair(objc_getClass(subclass), "RGFWCustomView", 0); + + class_addIvar( customViewClass, "RGFW_window", sizeof(RGFW_window*), (u8)rint(log2(sizeof(RGFW_window*))), "L"); + class_addMethod(customViewClass, sel_registerName("drawRect:"), (IMP)RGFW__osxDrawRect, "v@:{CGRect=ffff}"); + class_addMethod(customViewClass, sel_registerName("viewDidChangeBackingProperties"), (IMP)RGFW__osxViewDidChangeBackingProperties, ""); + + id customView = objc_msgSend_id(NSAlloc(customViewClass), sel_registerName("init")); + object_setInstanceVariable(customView, "RGFW_window", win); + + return customView; +} + +#ifndef RGFW_EGL +void RGFW_window_initOpenGL(RGFW_window* win, RGFW_bool software) { +#ifdef RGFW_OPENGL + void* attrs = RGFW_initFormatAttribs(software); + void* format = NSOpenGLPixelFormat_initWithAttributes((uint32_t*)attrs); + + if (format == NULL) { + RGFW_sendDebugInfo(RGFW_typeError, RGFW_errOpenglContext, RGFW_DEBUG_CTX(win, 0), "Failed to load pixel format for OpenGL"); + void* subAttrs = RGFW_initFormatAttribs(1); + format = NSOpenGLPixelFormat_initWithAttributes((uint32_t*)subAttrs); + + if (format == NULL) + RGFW_sendDebugInfo(RGFW_typeError, RGFW_errOpenglContext, RGFW_DEBUG_CTX(win, 0), "and loading software rendering OpenGL failed"); + else + RGFW_sendDebugInfo(RGFW_typeWarning, RGFW_warningOpenGL, RGFW_DEBUG_CTX(win, 0), "Switching to software rendering"); + } + + /* the pixel format can be passed directly to opengl context creation to create a context + this is because the format also includes information about the opengl version (which may be a bad thing) */ + + win->src.view = (id) ((id(*)(id, SEL, NSRect, uint32_t*))objc_msgSend) (RGFW__osx_generateViewClass("NSOpenGLView", win), + sel_registerName("initWithFrame:pixelFormat:"), (NSRect){{0, 0}, {win->r.w, win->r.h}}, (uint32_t*)format); + + objc_msgSend_void(win->src.view, sel_registerName("prepareOpenGL")); + win->src.ctx = objc_msgSend_id(win->src.view, sel_registerName("openGLContext")); + + if (win->_flags & RGFW_windowTransparent) { + i32 opacity = 0; + #define NSOpenGLCPSurfaceOpacity 236 + NSOpenGLContext_setValues((id)win->src.ctx, &opacity, NSOpenGLCPSurfaceOpacity); + } + + objc_msgSend_void(win->src.ctx, sel_registerName("makeCurrentContext")); + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoOpenGL, RGFW_DEBUG_CTX(win, 0), "opengl context initalized"); +#else + RGFW_UNUSED(win); RGFW_UNUSED(software); +#endif +} + +void RGFW_window_freeOpenGL(RGFW_window* win) { +#ifdef RGFW_OPENGL + if (win->src.ctx == NULL) return; + objc_msgSend_void(win->src.ctx, sel_registerName("release")); + win->src.ctx = NULL; + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoOpenGL, RGFW_DEBUG_CTX(win, 0), "opengl context freed"); +#else + RGFW_UNUSED(win); +#endif +} +#endif + + +i32 RGFW_init(void) { +#if defined(RGFW_C89) || defined(__cplusplus) + if (_RGFW_init) return 0; + _RGFW_init = RGFW_TRUE; + _RGFW.root = NULL; _RGFW.current = NULL; _RGFW.windowCount = -1; _RGFW.eventLen = 0; _RGFW.eventIndex = 0; +#endif + + /* NOTE(EimaMei): Why does Apple hate good code? Like wtf, who thought of methods being a great idea??? + Imagine a universe, where MacOS had a proper system API (we would probably have like 20% better performance). + */ + si_func_to_SEL_with_name("NSObject", "windowShouldClose", (void*)RGFW_OnClose); + + /* NOTE(EimaMei): Fixes the 'Boop' sfx from constantly playing each time you click a key. Only a problem when running in the terminal. */ + si_func_to_SEL("NSWindow", acceptsFirstResponder); + si_func_to_SEL("NSWindow", performKeyEquivalent); + + if (NSApp == NULL) { + NSApp = objc_msgSend_id((id)objc_getClass("NSApplication"), sel_registerName("sharedApplication")); + + ((void (*)(id, SEL, NSUInteger))objc_msgSend) + (NSApp, sel_registerName("setActivationPolicy:"), NSApplicationActivationPolicyRegular); + + #ifndef RGFW_NO_IOKIT + RGFW_osxInitIOKit(); + #endif + } + + _RGFW.windowCount = 0; + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoGlobal, RGFW_DEBUG_CTX(NULL, 0), "global context initialized"); + return 0; +} + +RGFW_window* RGFW_createWindowPtr(const char* name, RGFW_rect rect, RGFW_windowFlags flags, RGFW_window* win) { + static u8 RGFW_loaded = 0; + RGFW_window_basic_init(win, rect, flags); + + /* RR Create an autorelease pool */ + id pool = objc_msgSend_class(objc_getClass("NSAutoreleasePool"), sel_registerName("alloc")); + pool = objc_msgSend_id(pool, sel_registerName("init")); + + RGFW_window_setMouseDefault(win); + + NSRect windowRect; + windowRect.origin.x = win->r.x; + windowRect.origin.y = win->r.y; + windowRect.size.width = win->r.w; + windowRect.size.height = win->r.h; + + NSBackingStoreType macArgs = NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable | NSBackingStoreBuffered | NSWindowStyleMaskTitled; + + if (!(flags & RGFW_windowNoResize)) + macArgs |= NSWindowStyleMaskResizable; + if (!(flags & RGFW_windowNoBorder)) + macArgs |= NSWindowStyleMaskTitled; + { + void* nsclass = objc_getClass("NSWindow"); + SEL func = sel_registerName("initWithContentRect:styleMask:backing:defer:"); + + win->src.window = ((id(*)(id, SEL, NSRect, NSWindowStyleMask, NSBackingStoreType, bool))objc_msgSend) + (NSAlloc(nsclass), func, windowRect, macArgs, macArgs, false); + } + + id str = NSString_stringWithUTF8String(name); + objc_msgSend_void_id((id)win->src.window, sel_registerName("setTitle:"), str); + + if ((flags & RGFW_windowNoInitAPI) == 0) { + RGFW_window_initOpenGL(win, RGFW_BOOL(flags & RGFW_windowOpenglSoftware)); + RGFW_window_initBuffer(win); + } + + #ifdef RGFW_OPENGL + else + #endif + { + NSRect contentRect = (NSRect){{0, 0}, {win->r.w, win->r.h}}; + win->src.view = ((id(*)(id, SEL, NSRect))objc_msgSend) (NSAlloc(objc_getClass("NSView")), sel_registerName("initWithFrame:"), contentRect); + } + + void* contentView = NSWindow_contentView((id)win->src.window); + objc_msgSend_void_bool(contentView, sel_registerName("setWantsLayer:"), true); + objc_msgSend_int((id)win->src.view, sel_registerName("setLayerContentsPlacement:"), 4); + objc_msgSend_void_id((id)win->src.window, sel_registerName("setContentView:"), win->src.view); + + if (flags & RGFW_windowTransparent) { + objc_msgSend_void_bool(win->src.window, sel_registerName("setOpaque:"), false); + + objc_msgSend_void_id((id)win->src.window, sel_registerName("setBackgroundColor:"), + NSColor_colorWithSRGB(0, 0, 0, 0)); + } + + Class delegateClass = objc_allocateClassPair(objc_getClass("NSObject"), "WindowDelegate", 0); + + class_addIvar( + delegateClass, "RGFW_window", + sizeof(RGFW_window*), (u8)rint(log2(sizeof(RGFW_window*))), + "L" + ); + + class_addMethod(delegateClass, sel_registerName("windowWillResize:toSize:"), (IMP) RGFW__osxWindowResize, "{NSSize=ff}@:{NSSize=ff}"); + class_addMethod(delegateClass, sel_registerName("windowWillMove:"), (IMP) RGFW__osxWindowMove, ""); + class_addMethod(delegateClass, sel_registerName("windowDidMove:"), (IMP) RGFW__osxWindowMove, ""); + class_addMethod(delegateClass, sel_registerName("windowDidMiniaturize:"), (IMP) RGFW__osxWindowMiniaturize, ""); + class_addMethod(delegateClass, sel_registerName("windowDidDeminiaturize:"), (IMP) RGFW__osxWindowDeminiaturize, ""); + class_addMethod(delegateClass, sel_registerName("windowDidBecomeKey:"), (IMP) RGFW__osxWindowBecameKey, ""); + class_addMethod(delegateClass, sel_registerName("windowDidResignKey:"), (IMP) RGFW__osxWindowResignKey, ""); + class_addMethod(delegateClass, sel_registerName("draggingEntered:"), (IMP)draggingEntered, "l@:@"); + class_addMethod(delegateClass, sel_registerName("draggingUpdated:"), (IMP)draggingUpdated, "l@:@"); + class_addMethod(delegateClass, sel_registerName("draggingExited:"), (IMP)RGFW__osxDraggingEnded, "v@:@"); + class_addMethod(delegateClass, sel_registerName("draggingEnded:"), (IMP)RGFW__osxDraggingEnded, "v@:@"); + class_addMethod(delegateClass, sel_registerName("prepareForDragOperation:"), (IMP)prepareForDragOperation, "B@:@"); + class_addMethod(delegateClass, sel_registerName("performDragOperation:"), (IMP)performDragOperation, "B@:@"); + + id delegate = objc_msgSend_id(NSAlloc(delegateClass), sel_registerName("init")); + + if (RGFW_COCOA_FRAME_NAME) + objc_msgSend_ptr(win->src.view, sel_registerName("setFrameAutosaveName:"), RGFW_COCOA_FRAME_NAME); + + object_setInstanceVariable(delegate, "RGFW_window", win); + + objc_msgSend_void_id((id)win->src.window, sel_registerName("setDelegate:"), delegate); + + if (flags & RGFW_windowAllowDND) { + win->_flags |= RGFW_windowAllowDND; + + NSPasteboardType types[] = {NSPasteboardTypeURL, NSPasteboardTypeFileURL, NSPasteboardTypeString}; + NSregisterForDraggedTypes((id)win->src.window, types, 3); + } + + RGFW_window_setFlags(win, flags); + + /* Show the window */ + objc_msgSend_void_bool(NSApp, sel_registerName("activateIgnoringOtherApps:"), true); + ((id(*)(id, SEL, SEL))objc_msgSend)((id)win->src.window, sel_registerName("makeKeyAndOrderFront:"), NULL); + RGFW_window_show(win); + + if (!RGFW_loaded) { + objc_msgSend_void(win->src.window, sel_registerName("makeMainWindow")); + + RGFW_loaded = 1; + } + + objc_msgSend_void(win->src.window, sel_registerName("makeKeyWindow")); + + objc_msgSend_void(NSApp, sel_registerName("finishLaunching")); + NSRetain(win->src.window); + NSRetain(NSApp); + + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoWindow, RGFW_DEBUG_CTX(win, 0), "a new window was created"); + return win; +} + +void RGFW_window_setBorder(RGFW_window* win, RGFW_bool border) { + NSRect frame = ((NSRect(*)(id, SEL))abi_objc_msgSend_stret)((id)win->src.window, sel_registerName("frame")); + NSRect content = ((NSRect(*)(id, SEL))abi_objc_msgSend_stret)((id)win->src.view, sel_registerName("frame")); + float offset = 0; + + RGFW_setBit(&win->_flags, RGFW_windowNoBorder, !border); + NSBackingStoreType storeType = NSWindowStyleMaskBorderless | NSWindowStyleMaskFullSizeContentView; + if (border) + storeType = NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable; + if (!(win->_flags & RGFW_windowNoResize)) { + storeType |= NSWindowStyleMaskResizable; + } + + ((void (*)(id, SEL, NSBackingStoreType))objc_msgSend)((id)win->src.window, sel_registerName("setStyleMask:"), storeType); + + if (!border) { + id miniaturizeButton = objc_msgSend_int((id)win->src.window, sel_registerName("standardWindowButton:"), NSWindowMiniaturizeButton); + id titleBarView = objc_msgSend_id(miniaturizeButton, sel_registerName("superview")); + objc_msgSend_void_bool(titleBarView, sel_registerName("setHidden:"), true); + + offset = (float)(frame.size.height - content.size.height); + } + + RGFW_window_resize(win, RGFW_AREA(win->r.w, win->r.h + offset)); + win->r.h -= (i32)offset; +} + +RGFW_area RGFW_getScreenSize(void) { + static CGDirectDisplayID display = 0; + + if (display == 0) + display = CGMainDisplayID(); + + return RGFW_AREA(CGDisplayPixelsWide(display), CGDisplayPixelsHigh(display)); +} + +RGFW_point RGFW_getGlobalMousePoint(void) { + RGFW_ASSERT(_RGFW.root != NULL); + + CGEventRef e = CGEventCreate(NULL); + CGPoint point = CGEventGetLocation(e); + CFRelease(e); + + return RGFW_POINT((u32) point.x, (u32) point.y); /*!< the point is loaded during event checks */ +} + +typedef RGFW_ENUM(u32, NSEventType) { /* various types of events */ + NSEventTypeLeftMouseDown = 1, + NSEventTypeLeftMouseUp = 2, + NSEventTypeRightMouseDown = 3, + NSEventTypeRightMouseUp = 4, + NSEventTypeMouseMoved = 5, + NSEventTypeLeftMouseDragged = 6, + NSEventTypeRightMouseDragged = 7, + NSEventTypeMouseEntered = 8, + NSEventTypeMouseExited = 9, + NSEventTypeKeyDown = 10, + NSEventTypeKeyUp = 11, + NSEventTypeFlagsChanged = 12, + NSEventTypeAppKitDefined = 13, + NSEventTypeSystemDefined = 14, + NSEventTypeApplicationDefined = 15, + NSEventTypePeriodic = 16, + NSEventTypeCursorUpdate = 17, + NSEventTypeScrollWheel = 22, + NSEventTypeTabletPoint = 23, + NSEventTypeTabletProximity = 24, + NSEventTypeOtherMouseDown = 25, + NSEventTypeOtherMouseUp = 26, + NSEventTypeOtherMouseDragged = 27, + /* The following event types are available on some hardware on 10.5.2 and later */ + NSEventTypeGesture = 29, + NSEventTypeMagnify = 30, + NSEventTypeSwipe = 31, + NSEventTypeRotate = 18, + NSEventTypeBeginGesture = 19, + NSEventTypeEndGesture = 20, + + NSEventTypeSmartMagnify = 32, + NSEventTypeQuickLook = 33, + + NSEventTypePressure = 34, + NSEventTypeDirectTouch = 37, + + NSEventTypeChangeMode = 38, +}; + +typedef unsigned long long NSEventMask; + +typedef enum NSEventModifierFlags { + NSEventModifierFlagCapsLock = 1 << 16, + NSEventModifierFlagShift = 1 << 17, + NSEventModifierFlagControl = 1 << 18, + NSEventModifierFlagOption = 1 << 19, + NSEventModifierFlagCommand = 1 << 20, + NSEventModifierFlagNumericPad = 1 << 21 +} NSEventModifierFlags; + +void RGFW_stopCheckEvents(void) { + id eventPool = objc_msgSend_class(objc_getClass("NSAutoreleasePool"), sel_registerName("alloc")); + eventPool = objc_msgSend_id(eventPool, sel_registerName("init")); + + id e = (id) ((id(*)(Class, SEL, NSEventType, NSPoint, NSEventModifierFlags, void*, NSInteger, void**, short, NSInteger, NSInteger))objc_msgSend) + (objc_getClass("NSEvent"), sel_registerName("otherEventWithType:location:modifierFlags:timestamp:windowNumber:context:subtype:data1:data2:"), + NSEventTypeApplicationDefined, (NSPoint){0, 0}, (NSEventModifierFlags)0, NULL, (NSInteger)0, NULL, 0, 0, 0); + + ((void (*)(id, SEL, id, bool))objc_msgSend) + (NSApp, sel_registerName("postEvent:atStart:"), e, 1); + + objc_msgSend_bool_void(eventPool, sel_registerName("drain")); +} + +void RGFW_window_eventWait(RGFW_window* win, i32 waitMS) { + RGFW_UNUSED(win); + + id eventPool = objc_msgSend_class(objc_getClass("NSAutoreleasePool"), sel_registerName("alloc")); + eventPool = objc_msgSend_id(eventPool, sel_registerName("init")); + + void* date = (void*) ((id(*)(Class, SEL, double))objc_msgSend) + (objc_getClass("NSDate"), sel_registerName("dateWithTimeIntervalSinceNow:"), waitMS); + + SEL eventFunc = sel_registerName("nextEventMatchingMask:untilDate:inMode:dequeue:"); + id e = (id) ((id(*)(id, SEL, NSEventMask, void*, id, bool))objc_msgSend) + (NSApp, eventFunc, + ULONG_MAX, date, NSString_stringWithUTF8String("kCFRunLoopDefaultMode"), true); + + + if (e) { + ((void (*)(id, SEL, id, bool))objc_msgSend) + (NSApp, sel_registerName("postEvent:atStart:"), e, 1); + } + + objc_msgSend_bool_void(eventPool, sel_registerName("drain")); +} + +RGFW_event* RGFW_window_checkEvent(RGFW_window* win) { + if (win == NULL || ((win->_flags & RGFW_windowFreeOnClose) && (win->_flags & RGFW_EVENT_QUIT))) return NULL; + + objc_msgSend_void((id)win->src.mouse, sel_registerName("set")); + RGFW_event* ev = RGFW_window_checkEventCore(win); + if (ev) { + ((void(*)(id, SEL))objc_msgSend)(NSApp, sel_registerName("updateWindows")); + return ev; + } + + id eventPool = objc_msgSend_class(objc_getClass("NSAutoreleasePool"), sel_registerName("alloc")); + eventPool = objc_msgSend_id(eventPool, sel_registerName("init")); + + SEL eventFunc = sel_registerName("nextEventMatchingMask:untilDate:inMode:dequeue:"); + + void* date = NULL; + + id e = (id) ((id(*)(id, SEL, NSEventMask, void*, id, bool))objc_msgSend) + (NSApp, eventFunc, ULONG_MAX, date, NSString_stringWithUTF8String("kCFRunLoopDefaultMode"), true); + + if (e == NULL) { + objc_msgSend_bool_void(eventPool, sel_registerName("drain")); + objc_msgSend_void_id(NSApp, sel_registerName("sendEvent:"), e); + ((void(*)(id, SEL))objc_msgSend)(NSApp, sel_registerName("updateWindows")); + return NULL; + } + + if (objc_msgSend_id(e, sel_registerName("window")) != win->src.window) { + ((void (*)(id, SEL, id, bool))objc_msgSend) + (NSApp, sel_registerName("postEvent:atStart:"), e, 0); + + objc_msgSend_void_id(NSApp, sel_registerName("sendEvent:"), e); + objc_msgSend_bool_void(eventPool, sel_registerName("drain")); + ((void(*)(id, SEL))objc_msgSend)(NSApp, sel_registerName("updateWindows")); + return NULL; + } + + if (win->event.droppedFilesCount) { + u32 i; + for (i = 0; i < win->event.droppedFilesCount; i++) + win->event.droppedFiles[i][0] = '\0'; + } + + win->event.droppedFilesCount = 0; + win->event.type = 0; + + u32 type = (u32)objc_msgSend_uint(e, sel_registerName("type")); + switch (type) { + case NSEventTypeMouseEntered: { + win->event.type = RGFW_mouseEnter; + NSPoint p = ((NSPoint(*)(id, SEL)) objc_msgSend)(e, sel_registerName("locationInWindow")); + + win->event.point = RGFW_POINT((i32) p.x, (i32) (win->r.h - p.y)); + RGFW_mouseNotifyCallback(win, win->event.point, 1); + break; + } + + case NSEventTypeMouseExited: + win->event.type = RGFW_mouseLeave; + RGFW_mouseNotifyCallback(win, win->event.point, 0); + break; + + case NSEventTypeKeyDown: { + u32 key = (u16) objc_msgSend_uint(e, sel_registerName("keyCode")); + + u32 mappedKey = (u32)*(((char*)(const char*) NSString_to_char(objc_msgSend_id(e, sel_registerName("charactersIgnoringModifiers"))))); + if (((u8)mappedKey) == 239) + mappedKey = 0; + + win->event.keyChar = (u8)mappedKey; + + win->event.key = (u8)RGFW_apiKeyToRGFW(key); + RGFW_keyboard[win->event.key].prev = RGFW_keyboard[win->event.key].current; + + win->event.type = RGFW_keyPressed; + win->event.repeat = RGFW_isPressed(win, win->event.key); + RGFW_keyboard[win->event.key].current = 1; + + RGFW_keyCallback(win, win->event.key, win->event.keyChar, win->event.keyMod, 1); + break; + } + + case NSEventTypeKeyUp: { + u32 key = (u16) objc_msgSend_uint(e, sel_registerName("keyCode")); + + + u32 mappedKey = (u32)*(((char*)(const char*) NSString_to_char(objc_msgSend_id(e, sel_registerName("charactersIgnoringModifiers"))))); + if (((u8)mappedKey) == 239) + mappedKey = 0; + + win->event.keyChar = (u8)mappedKey; + + win->event.key = (u8)RGFW_apiKeyToRGFW(key); + + RGFW_keyboard[win->event.key].prev = RGFW_keyboard[win->event.key].current; + + win->event.type = RGFW_keyReleased; + + RGFW_keyboard[win->event.key].current = 0; + RGFW_keyCallback(win, win->event.key, win->event.keyChar, win->event.keyMod, 0); + break; + } + + case NSEventTypeFlagsChanged: { + u32 flags = (u32)objc_msgSend_uint(e, sel_registerName("modifierFlags")); + RGFW_updateKeyModsPro(win, ((u32)(flags & NSEventModifierFlagCapsLock) % 255), ((flags & NSEventModifierFlagNumericPad) % 255), + ((flags & NSEventModifierFlagControl) % 255), ((flags & NSEventModifierFlagOption) % 255), + ((flags & NSEventModifierFlagShift) % 255), ((flags & NSEventModifierFlagCommand) % 255), 0); + u8 i; + for (i = 0; i < 9; i++) + RGFW_keyboard[i + RGFW_capsLock].prev = 0; + + for (i = 0; i < 5; i++) { + u32 shift = (1 << (i + 16)); + u32 key = i + RGFW_capsLock; + + if ((flags & shift) && !RGFW_wasPressed(win, (u8)key)) { + RGFW_keyboard[key].current = 1; + + if (key != RGFW_capsLock) + RGFW_keyboard[key+ 4].current = 1; + + win->event.type = RGFW_keyPressed; + win->event.key = (u8)key; + break; + } + + if (!(flags & shift) && RGFW_wasPressed(win, (u8)key)) { + RGFW_keyboard[key].current = 0; + + if (key != RGFW_capsLock) + RGFW_keyboard[key + 4].current = 0; + + win->event.type = RGFW_keyReleased; + win->event.key = (u8)key; + break; + } + } + + RGFW_keyCallback(win, win->event.key, win->event.keyChar, win->event.keyMod, win->event.type == RGFW_keyPressed); + + break; + } + case NSEventTypeLeftMouseDragged: + case NSEventTypeOtherMouseDragged: + case NSEventTypeRightMouseDragged: + case NSEventTypeMouseMoved: { + win->event.type = RGFW_mousePosChanged; + NSPoint p = ((NSPoint(*)(id, SEL)) objc_msgSend)(e, sel_registerName("locationInWindow")); + win->event.point = RGFW_POINT((u32) p.x, (u32) (win->r.h - p.y)); + + p.x = ((CGFloat(*)(id, SEL))abi_objc_msgSend_fpret)(e, sel_registerName("deltaX")); + p.y = ((CGFloat(*)(id, SEL))abi_objc_msgSend_fpret)(e, sel_registerName("deltaY")); + win->event.vector = RGFW_POINT((i32)p.x, (i32)p.y); + + win->_lastMousePoint = win->event.point; + RGFW_mousePosCallback(win, win->event.point, win->event.vector); + break; + } + case NSEventTypeLeftMouseDown: case NSEventTypeRightMouseDown: case NSEventTypeOtherMouseDown: { + u32 buttonNumber = (u32)objc_msgSend_uint(e, sel_registerName("buttonNumber")); + switch (buttonNumber) { + case 0: win->event.button = RGFW_mouseLeft; break; + case 1: win->event.button = RGFW_mouseRight; break; + case 2: win->event.button = RGFW_mouseMiddle; break; + default: win->event.button = (u8)buttonNumber; + } + + win->event.type = RGFW_mouseButtonPressed; + RGFW_mouseButtons[win->event.button].prev = RGFW_mouseButtons[win->event.button].current; + RGFW_mouseButtons[win->event.button].current = 1; + RGFW_mouseButtonCallback(win, win->event.button, win->event.scroll, 1); + break; + } + case NSEventTypeLeftMouseUp: case NSEventTypeRightMouseUp: case NSEventTypeOtherMouseUp: { + u32 buttonNumber = (u32)objc_msgSend_uint(e, sel_registerName("buttonNumber")); + switch (buttonNumber) { + case 0: win->event.button = RGFW_mouseLeft; break; + case 1: win->event.button = RGFW_mouseRight; break; + case 2: win->event.button = RGFW_mouseMiddle; break; + default: win->event.button = (u8)buttonNumber; + } + RGFW_mouseButtons[win->event.button].prev = RGFW_mouseButtons[win->event.button].current; + RGFW_mouseButtons[win->event.button].current = 0; + win->event.type = RGFW_mouseButtonReleased; + RGFW_mouseButtonCallback(win, win->event.button, win->event.scroll, 0); + break; + } + case NSEventTypeScrollWheel: { + double deltaY = ((CGFloat(*)(id, SEL))abi_objc_msgSend_fpret)(e, sel_registerName("deltaY")); + + if (deltaY > 0) { + win->event.button = RGFW_mouseScrollUp; + } + else if (deltaY < 0) { + win->event.button = RGFW_mouseScrollDown; + } + + RGFW_mouseButtons[win->event.button].prev = RGFW_mouseButtons[win->event.button].current; + RGFW_mouseButtons[win->event.button].current = 1; + + win->event.scroll = deltaY; + + win->event.type = RGFW_mouseButtonPressed; + RGFW_mouseButtonCallback(win, win->event.button, win->event.scroll, 1); + break; + } + + default: + objc_msgSend_void_id(NSApp, sel_registerName("sendEvent:"), e); + ((void(*)(id, SEL))objc_msgSend)(NSApp, sel_registerName("updateWindows")); + return RGFW_window_checkEvent(win); + } + + objc_msgSend_void_id(NSApp, sel_registerName("sendEvent:"), e); + ((void(*)(id, SEL))objc_msgSend)(NSApp, sel_registerName("updateWindows")); + objc_msgSend_bool_void(eventPool, sel_registerName("drain")); + return &win->event; +} + + +void RGFW_window_move(RGFW_window* win, RGFW_point v) { + RGFW_ASSERT(win != NULL); + + win->r.x = v.x; + win->r.y = v.y; + ((void(*)(id, SEL, NSRect, bool, bool))objc_msgSend) + ((id)win->src.window, sel_registerName("setFrame:display:animate:"), (NSRect){{win->r.x, win->r.y}, {win->r.w, win->r.h}}, true, true); +} + +void RGFW_window_resize(RGFW_window* win, RGFW_area a) { + RGFW_ASSERT(win != NULL); + + NSRect frame = ((NSRect(*)(id, SEL))abi_objc_msgSend_stret)((id)win->src.window, sel_registerName("frame")); + NSRect content = ((NSRect(*)(id, SEL))abi_objc_msgSend_stret)((id)win->src.view, sel_registerName("frame")); + float offset = (float)(frame.size.height - content.size.height); + + win->r.w = (i32)a.w; + win->r.h = (i32)a.h; + + ((void(*)(id, SEL, NSRect, bool, bool))objc_msgSend) + ((id)win->src.window, sel_registerName("setFrame:display:animate:"), (NSRect){{win->r.x, win->r.y}, {win->r.w, win->r.h + offset}}, true, true); +} + +void RGFW_window_focus(RGFW_window* win) { + RGFW_ASSERT(win); + objc_msgSend_void_bool(NSApp, sel_registerName("activateIgnoringOtherApps:"), true); + ((void (*)(id, SEL))objc_msgSend)((id)win->src.window, sel_registerName("makeKeyWindow")); +} + +void RGFW_window_raise(RGFW_window* win) { + RGFW_ASSERT(win != NULL); + ((id(*)(id, SEL, SEL))objc_msgSend)((id)win->src.window, sel_registerName("orderFront:"), (SEL)NULL); + objc_msgSend_void_id(win->src.window, sel_registerName("setLevel:"), kCGNormalWindowLevelKey); +} + +void RGFW_window_setFullscreen(RGFW_window* win, RGFW_bool fullscreen) { + RGFW_ASSERT(win != NULL); + if (fullscreen && (win->_flags & RGFW_windowFullscreen)) return; + if (!fullscreen && !(win->_flags & RGFW_windowFullscreen)) return; + + if (fullscreen) { + win->_oldRect = win->r; + RGFW_monitor mon = RGFW_window_getMonitor(win); + win->r = RGFW_RECT(0, 0, mon.x, mon.y); + win->_flags |= RGFW_windowFullscreen; + RGFW_window_resize(win, RGFW_AREA(mon.mode.area.w, mon.mode.area.h)); + RGFW_window_move(win, RGFW_POINT(0, 0)); + } + objc_msgSend_void_SEL(win->src.window, sel_registerName("toggleFullScreen:"), NULL); + + if (!fullscreen) { + win->r = win->_oldRect; + win->_flags &= ~(u32)RGFW_windowFullscreen; + + RGFW_window_resize(win, RGFW_AREA(win->r.w, win->r.h)); + RGFW_window_move(win, RGFW_POINT(win->r.x, win->r.y)); + } +} + +void RGFW_window_maximize(RGFW_window* win) { + RGFW_ASSERT(win != NULL); + if (RGFW_window_isMaximized(win)) return; + + win->_flags |= RGFW_windowMaximize; + objc_msgSend_void_SEL(win->src.window, sel_registerName("zoom:"), NULL); +} + +void RGFW_window_minimize(RGFW_window* win) { + RGFW_ASSERT(win != NULL); + objc_msgSend_void_SEL(win->src.window, sel_registerName("performMiniaturize:"), NULL); +} + +void RGFW_window_setFloating(RGFW_window* win, RGFW_bool floating) { + RGFW_ASSERT(win != NULL); + if (floating) objc_msgSend_void_id(win->src.window, sel_registerName("setLevel:"), kCGFloatingWindowLevelKey); + else objc_msgSend_void_id(win->src.window, sel_registerName("setLevel:"), kCGNormalWindowLevelKey); +} + +void RGFW_window_setOpacity(RGFW_window* win, u8 opacity) { + objc_msgSend_int(win->src.window, sel_registerName("setAlphaValue:"), opacity); + objc_msgSend_void_bool(win->src.window, sel_registerName("setOpaque:"), (opacity < (u8)255)); + + if (opacity) + objc_msgSend_void_id((id)win->src.window, sel_registerName("setBackgroundColor:"), NSColor_colorWithSRGB(0, 0, 0, opacity)); + +} + +void RGFW_window_restore(RGFW_window* win) { + RGFW_ASSERT(win != NULL); + + if (RGFW_window_isMaximized(win)) + objc_msgSend_void_SEL(win->src.window, sel_registerName("zoom:"), NULL); + + objc_msgSend_void_SEL(win->src.window, sel_registerName("deminiaturize:"), NULL); + RGFW_window_show(win); +} + +RGFW_bool RGFW_window_isFloating(RGFW_window* win) { + RGFW_ASSERT(win != NULL); + int level = ((int (*)(id, SEL))objc_msgSend) ((id)(win->src.window), (SEL)sel_registerName("level")); + return level > kCGNormalWindowLevelKey; +} + +void RGFW_window_setName(RGFW_window* win, const char* name) { + RGFW_ASSERT(win != NULL); + + id str = NSString_stringWithUTF8String(name); + objc_msgSend_void_id((id)win->src.window, sel_registerName("setTitle:"), str); +} + +#ifndef RGFW_NO_PASSTHROUGH +void RGFW_window_setMousePassthrough(RGFW_window* win, RGFW_bool passthrough) { + objc_msgSend_void_bool(win->src.window, sel_registerName("setIgnoresMouseEvents:"), passthrough); +} +#endif + +void RGFW_window_setAspectRatio(RGFW_window* win, RGFW_area a) { + if (a.w == 0 && a.h == 0) a = RGFW_AREA(1, 1); + + ((void (*)(id, SEL, NSSize))objc_msgSend) + ((id)win->src.window, sel_registerName("setContentAspectRatio:"), (NSSize){a.w, a.h}); +} + +void RGFW_window_setMinSize(RGFW_window* win, RGFW_area a) { + ((void (*)(id, SEL, NSSize))objc_msgSend) + ((id)win->src.window, sel_registerName("setMinSize:"), (NSSize){a.w, a.h}); +} + +void RGFW_window_setMaxSize(RGFW_window* win, RGFW_area a) { + if (a.w == 0 && a.h == 0) { + a = RGFW_getScreenSize(); + } + + ((void (*)(id, SEL, NSSize))objc_msgSend) + ((id)win->src.window, sel_registerName("setMaxSize:"), (NSSize){a.w, a.h}); +} + +RGFW_bool RGFW_window_setIconEx(RGFW_window* win, u8* data, RGFW_area area, i32 channels, u8 type) { + RGFW_ASSERT(win != NULL); + RGFW_UNUSED(type); + + if (data == NULL) { + objc_msgSend_void_id(NSApp, sel_registerName("setApplicationIconImage:"), NULL); + return RGFW_TRUE; + } + + /* code by EimaMei: Make a bitmap representation, then copy the loaded image into it. */ + id representation = NSBitmapImageRep_initWithBitmapData(NULL, area.w, area.h, 8, channels, (channels == 4), false, "NSCalibratedRGBColorSpace", 1 << 1, area.w * (u32)channels, 8 * (u32)channels); + RGFW_MEMCPY(NSBitmapImageRep_bitmapData(representation), data, area.w * area.h * (u32)channels); + + /* Add ze representation. */ + id dock_image = ((id(*)(id, SEL, NSSize))objc_msgSend) (NSAlloc((id)objc_getClass("NSImage")), sel_registerName("initWithSize:"), ((NSSize){area.w, area.h})); + + objc_msgSend_void_id(dock_image, sel_registerName("addRepresentation:"), representation); + + /* Finally, set the dock image to it. */ + objc_msgSend_void_id(NSApp, sel_registerName("setApplicationIconImage:"), dock_image); + /* Free the garbage. */ + NSRelease(dock_image); + NSRelease(representation); + + return RGFW_TRUE; +} + +id NSCursor_arrowStr(const char* str) { + void* nclass = objc_getClass("NSCursor"); + SEL func = sel_registerName(str); + return (id) objc_msgSend_id(nclass, func); +} + +RGFW_mouse* RGFW_loadMouse(u8* icon, RGFW_area a, i32 channels) { + if (icon == NULL) { + objc_msgSend_void(NSCursor_arrowStr("arrowCursor"), sel_registerName("set")); + return NULL; + } + + /* NOTE(EimaMei): Code by yours truly. */ + /* Make a bitmap representation, then copy the loaded image into it. */ + id representation = (id)NSBitmapImageRep_initWithBitmapData(NULL, a.w, a.h, 8, channels, (channels == 4), false, "NSCalibratedRGBColorSpace", 1 << 1, a.w * (u32)channels, 8 * (u32)channels); + RGFW_MEMCPY(NSBitmapImageRep_bitmapData(representation), icon, a.w * a.h * (u32)channels); + + /* Add ze representation. */ + id cursor_image = ((id(*)(id, SEL, NSSize))objc_msgSend) (NSAlloc((id)objc_getClass("NSImage")), sel_registerName("initWithSize:"), ((NSSize){a.w, a.h})); + + objc_msgSend_void_id(cursor_image, sel_registerName("addRepresentation:"), representation); + + /* Finally, set the cursor image. */ + id cursor = (id) ((id(*)(id, SEL, id, NSPoint))objc_msgSend) + (NSAlloc(objc_getClass("NSCursor")), sel_registerName("initWithImage:hotSpot:"), cursor_image, (NSPoint){0.0, 0.0}); + + /* Free the garbage. */ + NSRelease(cursor_image); + NSRelease(representation); + + return (void*)cursor; +} + +void RGFW_window_setMouse(RGFW_window* win, RGFW_mouse* mouse) { + RGFW_ASSERT(win != NULL); RGFW_ASSERT(mouse); + CGDisplayShowCursor(kCGDirectMainDisplay); + objc_msgSend_void((id)mouse, sel_registerName("set")); + win->src.mouse = mouse; +} + +void RGFW_freeMouse(RGFW_mouse* mouse) { + RGFW_ASSERT(mouse); + NSRelease((id)mouse); +} + +RGFW_bool RGFW_window_setMouseDefault(RGFW_window* win) { + return RGFW_window_setMouseStandard(win, RGFW_mouseArrow); +} + +void RGFW_window_showMouse(RGFW_window* win, RGFW_bool show) { + RGFW_window_showMouseFlags(win, show); + if (show) CGDisplayShowCursor(kCGDirectMainDisplay); + else CGDisplayHideCursor(kCGDirectMainDisplay); +} + +RGFW_bool RGFW_window_setMouseStandard(RGFW_window* win, u8 stdMouses) { + static const char* mouseIconSrc[16] = {"arrowCursor", "arrowCursor", "IBeamCursor", "crosshairCursor", "pointingHandCursor", "resizeLeftRightCursor", "resizeUpDownCursor", "_windowResizeNorthWestSouthEastCursor", "_windowResizeNorthEastSouthWestCursor", "closedHandCursor", "operationNotAllowedCursor"}; + if (stdMouses > ((sizeof(mouseIconSrc)) / (sizeof(char*)))) + return RGFW_FALSE; + + const char* mouseStr = mouseIconSrc[stdMouses]; + id mouse = NSCursor_arrowStr(mouseStr); + + if (mouse == NULL) + return RGFW_FALSE; + + RGFW_UNUSED(win); + CGDisplayShowCursor(kCGDirectMainDisplay); + objc_msgSend_void(mouse, sel_registerName("set")); + win->src.mouse = mouse; + + return RGFW_TRUE; +} + +void RGFW_releaseCursor(RGFW_window* win) { + RGFW_UNUSED(win); + CGAssociateMouseAndMouseCursorPosition(1); +} + +void RGFW_captureCursor(RGFW_window* win, RGFW_rect r) { + RGFW_UNUSED(win); + + CGWarpMouseCursorPosition((CGPoint){r.x + (r.w / 2), r.y + (r.h / 2)}); + CGAssociateMouseAndMouseCursorPosition(0); +} + +void RGFW_window_moveMouse(RGFW_window* win, RGFW_point v) { + RGFW_UNUSED(win); + + win->_lastMousePoint = RGFW_POINT(v.x - win->r.x, v.y - win->r.y); + CGWarpMouseCursorPosition((CGPoint){v.x, v.y}); +} + + +void RGFW_window_hide(RGFW_window* win) { + objc_msgSend_void_bool(win->src.window, sel_registerName("setIsVisible:"), false); +} + +void RGFW_window_show(RGFW_window* win) { + if (win->_flags & RGFW_windowFocusOnShow) + ((id(*)(id, SEL, SEL))objc_msgSend)((id)win->src.window, sel_registerName("makeKeyAndOrderFront:"), NULL); + + ((id(*)(id, SEL, SEL))objc_msgSend)((id)win->src.window, sel_registerName("orderFront:"), NULL); + objc_msgSend_void_bool(win->src.window, sel_registerName("setIsVisible:"), true); +} + +RGFW_bool RGFW_window_isHidden(RGFW_window* win) { + RGFW_ASSERT(win != NULL); + + bool visible = objc_msgSend_bool(win->src.window, sel_registerName("isVisible")); + return visible == NO && !RGFW_window_isMinimized(win); +} + +RGFW_bool RGFW_window_isMinimized(RGFW_window* win) { + RGFW_ASSERT(win != NULL); + + return objc_msgSend_bool(win->src.window, sel_registerName("isMiniaturized")) == YES; +} + +RGFW_bool RGFW_window_isMaximized(RGFW_window* win) { + RGFW_ASSERT(win != NULL); + RGFW_bool b = (RGFW_bool)objc_msgSend_bool(win->src.window, sel_registerName("isZoomed")); + return b; +} + +id RGFW_getNSScreenForDisplayID(CGDirectDisplayID display) { + Class NSScreenClass = objc_getClass("NSScreen"); + + id screens = objc_msgSend_id(NSScreenClass, sel_registerName("screens")); + + NSUInteger count = (NSUInteger)objc_msgSend_uint(screens, sel_registerName("count")); + NSUInteger i; + for (i = 0; i < count; i++) { + id screen = ((id (*)(id, SEL, int))objc_msgSend) (screens, sel_registerName("objectAtIndex:"), (int)i); + id description = objc_msgSend_id(screen, sel_registerName("deviceDescription")); + id screenNumberKey = NSString_stringWithUTF8String("NSScreenNumber"); + id screenNumber = objc_msgSend_id_id(description, sel_registerName("objectForKey:"), screenNumberKey); + + if ((CGDirectDisplayID)objc_msgSend_uint(screenNumber, sel_registerName("unsignedIntValue")) == display) { + return screen; + } + } + + return NULL; +} + +u32 RGFW_osx_getFallbackRefreshRate(CGDirectDisplayID displayID); + +u32 RGFW_osx_getRefreshRate(CGDirectDisplayID display, CGDisplayModeRef mode) { + if (mode) { + u32 refreshRate = (u32)CGDisplayModeGetRefreshRate(mode); + if (refreshRate != 0) return refreshRate; + } + +#ifndef RGFW_NO_IOKIT + u32 res = RGFW_osx_getFallbackRefreshRate(display); + if (res != 0) return res; +#else + RGFW_UNUSED(display); +#endif + return 60; +} + +RGFW_monitor RGFW_NSCreateMonitor(CGDirectDisplayID display, id screen) { + RGFW_monitor monitor; + + const char name[] = "MacOS\0"; + RGFW_MEMCPY(monitor.name, name, 6); + + CGRect bounds = CGDisplayBounds(display); + monitor.x = (i32)bounds.origin.x; + monitor.y = (i32)bounds.origin.y; + monitor.mode.area = RGFW_AREA((int) bounds.size.width, (int) bounds.size.height); + + monitor.mode.red = 8; monitor.mode.green = 8; monitor.mode.blue = 8; + + CGDisplayModeRef mode = CGDisplayCopyDisplayMode(display); + monitor.mode.refreshRate = RGFW_osx_getRefreshRate(display, mode); + CFRelease(mode); + + CGSize screenSizeMM = CGDisplayScreenSize(display); + monitor.physW = (float)screenSizeMM.width / 25.4f; + monitor.physH = (float)screenSizeMM.height / 25.4f; + + float ppi_width = (monitor.mode.area.w/monitor.physW); + float ppi_height = (monitor.mode.area.h/monitor.physH); + + monitor.pixelRatio = (float)((CGFloat (*)(id, SEL))abi_objc_msgSend_fpret) (screen, sel_registerName("backingScaleFactor")); + float dpi = 96.0f * monitor.pixelRatio; + + monitor.scaleX = ((i32)(((float) (ppi_width) / dpi) * 10.0f)) / 10.0f; + monitor.scaleY = ((i32)(((float) (ppi_height) / dpi) * 10.0f)) / 10.0f; + + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoMonitor, RGFW_DEBUG_CTX_MON(monitor), "monitor found"); + return monitor; +} + + +RGFW_monitor* RGFW_getMonitors(size_t* len) { + static CGDirectDisplayID displays[7]; + u32 count; + + if (CGGetActiveDisplayList(6, displays, &count) != kCGErrorSuccess) + return NULL; + + if (count > 6) count = 6; + + static RGFW_monitor monitors[7]; + + u32 i; + for (i = 0; i < count; i++) + monitors[i] = RGFW_NSCreateMonitor(displays[i], RGFW_getNSScreenForDisplayID(displays[i])); + + if (len != NULL) *len = count; + return monitors; +} + +RGFW_bool RGFW_monitor_requestMode(RGFW_monitor mon, RGFW_monitorMode mode, RGFW_modeRequest request) { + CGPoint point = { mon.x, mon.y }; + + CGDirectDisplayID display; + uint32_t displayCount = 0; + CGError err = CGGetDisplaysWithPoint(point, 1, &display, &displayCount); + if (err != kCGErrorSuccess || displayCount != 1) + return RGFW_FALSE; + + CFArrayRef allModes = CGDisplayCopyAllDisplayModes(display, NULL); + + if (allModes == NULL) + return RGFW_FALSE; + + CFIndex i; + for (i = 0; i < CFArrayGetCount(allModes); i++) { + CGDisplayModeRef cmode = (CGDisplayModeRef)CFArrayGetValueAtIndex(allModes, i); + + RGFW_monitorMode foundMode; + foundMode.area = RGFW_AREA(CGDisplayModeGetWidth(cmode), CGDisplayModeGetHeight(cmode)); + foundMode.refreshRate = RGFW_osx_getRefreshRate(display, cmode); + foundMode.red = 8; foundMode.green = 8; foundMode.blue = 8; + + if (RGFW_monitorModeCompare(mode, foundMode, request)) { + if (CGDisplaySetDisplayMode(display, cmode, NULL) == kCGErrorSuccess) { + CFRelease(allModes); + return RGFW_TRUE; + } + break; + } + } + + CFRelease(allModes); + + return RGFW_FALSE; +} + +RGFW_monitor RGFW_getPrimaryMonitor(void) { + CGDirectDisplayID primary = CGMainDisplayID(); + return RGFW_NSCreateMonitor(primary, RGFW_getNSScreenForDisplayID(primary)); +} + +RGFW_monitor RGFW_window_getMonitor(RGFW_window* win) { + id screen = objc_msgSend_id(win->src.window, sel_registerName("screen")); + id description = objc_msgSend_id(screen, sel_registerName("deviceDescription")); + id screenNumberKey = NSString_stringWithUTF8String("NSScreenNumber"); + id screenNumber = objc_msgSend_id_id(description, sel_registerName("objectForKey:"), screenNumberKey); + + CGDirectDisplayID display = (CGDirectDisplayID)objc_msgSend_uint(screenNumber, sel_registerName("unsignedIntValue")); + + return RGFW_NSCreateMonitor(display, screen); +} + +RGFW_ssize_t RGFW_readClipboardPtr(char* str, size_t strCapacity) { + size_t clip_len; + char* clip = (char*)NSPasteboard_stringForType(NSPasteboard_generalPasteboard(), NSPasteboardTypeString, &clip_len); + if (clip == NULL) return -1; + + if (str != NULL) { + if (strCapacity < clip_len) + return 0; + + RGFW_MEMCPY(str, clip, clip_len); + + str[clip_len] = '\0'; + } + + return (RGFW_ssize_t)clip_len; +} + +void RGFW_writeClipboard(const char* text, u32 textLen) { + RGFW_UNUSED(textLen); + + NSPasteboardType array[] = { NSPasteboardTypeString, NULL }; + NSPasteBoard_declareTypes(NSPasteboard_generalPasteboard(), array, 1, NULL); + + SEL func = sel_registerName("setString:forType:"); + ((bool (*)(id, SEL, id, id))objc_msgSend) + (NSPasteboard_generalPasteboard(), func, NSString_stringWithUTF8String(text), NSString_stringWithUTF8String(NSPasteboardTypeString)); +} + + #ifdef RGFW_OPENGL + void RGFW_window_makeCurrent_OpenGL(RGFW_window* win) { + if (win != NULL) + objc_msgSend_void(win->src.ctx, sel_registerName("makeCurrentContext")); + else + objc_msgSend_id(objc_getClass("NSOpenGLContext"), sel_registerName("clearCurrentContext")); + } + void* RGFW_getCurrent_OpenGL(void) { + return objc_msgSend_id(objc_getClass("NSOpenGLContext"), sel_registerName("currentContext")); + } + + void RGFW_window_swapBuffers_OpenGL(RGFW_window* win) { + objc_msgSend_void(win->src.ctx, sel_registerName("flushBuffer")); + } + #endif + + #if !defined(RGFW_EGL) + + void RGFW_window_swapInterval(RGFW_window* win, i32 swapInterval) { + RGFW_ASSERT(win != NULL); + #if defined(RGFW_OPENGL) + + NSOpenGLContext_setValues((id)win->src.ctx, &swapInterval, 222); + #else + RGFW_UNUSED(swapInterval); + #endif + } + + #endif + +void RGFW_window_swapBuffers_software(RGFW_window* win) { +#if defined(RGFW_OSMESA) || defined(RGFW_BUFFER) + RGFW_RGB_to_BGR(win, win->buffer); + i32 channels = 4; + id image = ((id (*)(Class, SEL))objc_msgSend)(objc_getClass("NSImage"), sel_getUid("alloc")); + NSSize size = (NSSize){win->bufferSize.w, win->bufferSize.h}; + image = ((id (*)(id, SEL, NSSize))objc_msgSend)((id)image, sel_getUid("initWithSize:"), size); + + id rep = NSBitmapImageRep_initWithBitmapData(&win->buffer, win->r.w, win->r.h , 8, channels, (channels == 4), false, + "NSDeviceRGBColorSpace", 1 << 1, (u32)win->bufferSize.w * (u32)channels, 8 * (u32)channels); + ((void (*)(id, SEL, id))objc_msgSend)((id)image, sel_getUid("addRepresentation:"), rep); + + id contentView = ((id (*)(id, SEL))objc_msgSend)((id)win->src.window, sel_getUid("contentView")); + ((void (*)(id, SEL, BOOL))objc_msgSend)(contentView, sel_getUid("setWantsLayer:"), YES); + id layer = ((id (*)(id, SEL))objc_msgSend)(contentView, sel_getUid("layer")); + + ((void (*)(id, SEL, id))objc_msgSend)(layer, sel_getUid("setContents:"), (id)image); + ((void (*)(id, SEL, BOOL))objc_msgSend)(contentView, sel_getUid("setNeedsDisplay:"), YES); + + NSRelease(rep); + NSRelease(image); +#else + RGFW_UNUSED(win); +#endif +} + +void RGFW_deinit(void) { + _RGFW.windowCount = -1; + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoGlobal, RGFW_DEBUG_CTX(NULL, 0), "global context deinitialized"); +} + +void RGFW_window_close(RGFW_window* win) { + RGFW_ASSERT(win != NULL); + NSRelease(win->src.view); + if ((win->_flags & RGFW_windowNoInitAPI) == 0) RGFW_window_freeOpenGL(win); + + #if defined(RGFW_OSMESA) || defined(RGFW_BUFFER) + if ((win->_flags & RGFW_BUFFER_ALLOC)) + RGFW_FREE(win->buffer); + #endif + + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoGlobal, RGFW_DEBUG_CTX(NULL, 0), "global context deinitialized"); + _RGFW.windowCount--; + if (_RGFW.windowCount == 0) RGFW_deinit(); + + RGFW_clipboard_switch(NULL); + RGFW_FREE(win->event.droppedFiles); + if ((win->_flags & RGFW_WINDOW_ALLOC)) { + RGFW_FREE(win); + win = NULL; + } +} + +u64 RGFW_getTimerFreq(void) { + static u64 freq = 0; + if (freq == 0) { + mach_timebase_info_data_t info; + mach_timebase_info(&info); + freq = (u64)((info.denom * 1e9) / info.numer); + } + + return freq; +} + +u64 RGFW_getTimerValue(void) { return (u64)mach_absolute_time(); } + +#endif /* RGFW_MACOS */ + +/* + End of MaOS defines +*/ + +/* + WASM defines +*/ + +#ifdef RGFW_WASM +EM_BOOL Emscripten_on_resize(int eventType, const EmscriptenUiEvent* E, void* userData) { + RGFW_UNUSED(eventType); RGFW_UNUSED(userData); + + RGFW_eventQueuePushEx(e.type = RGFW_windowResized; e._win = _RGFW.root); + RGFW_windowResizedCallback(_RGFW.root, RGFW_RECT(0, 0, E->windowInnerWidth, E->windowInnerHeight)); + return EM_TRUE; +} + +EM_BOOL Emscripten_on_fullscreenchange(int eventType, const EmscriptenFullscreenChangeEvent* E, void* userData) { + RGFW_UNUSED(eventType); RGFW_UNUSED(userData); + static u8 fullscreen = RGFW_FALSE; + static RGFW_rect ogRect; + + if (fullscreen == RGFW_FALSE) { + ogRect = _RGFW.root->r; + } + + fullscreen = !fullscreen; + RGFW_eventQueuePushEx(e.type = RGFW_windowResized; e._win = _RGFW.root); + _RGFW.root->r = RGFW_RECT(0, 0, E->screenWidth, E->screenHeight); + + EM_ASM("Module.canvas.focus();"); + + if (fullscreen == RGFW_FALSE) { + _RGFW.root->r = RGFW_RECT(0, 0, ogRect.w, ogRect.h); + /* emscripten_request_fullscreen("#canvas", 0); */ + } else { + #if __EMSCRIPTEN_major__ >= 1 && __EMSCRIPTEN_minor__ >= 29 && __EMSCRIPTEN_tiny__ >= 0 + EmscriptenFullscreenStrategy FSStrat = {0}; + FSStrat.scaleMode = EMSCRIPTEN_FULLSCREEN_SCALE_STRETCH; /* EMSCRIPTEN_FULLSCREEN_SCALE_ASPECT : EMSCRIPTEN_FULLSCREEN_SCALE_STRETCH; */ + FSStrat.canvasResolutionScaleMode = EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_HIDEF; + FSStrat.filteringMode = EMSCRIPTEN_FULLSCREEN_FILTERING_DEFAULT; + emscripten_request_fullscreen_strategy("#canvas", 1, &FSStrat); + #else + emscripten_request_fullscreen("#canvas", 1); + #endif + } + + emscripten_set_canvas_element_size("#canvas", _RGFW.root->r.w, _RGFW.root->r.h); + + RGFW_windowResizedCallback(_RGFW.root, _RGFW.root->r); + return EM_TRUE; +} + + + +EM_BOOL Emscripten_on_focusin(int eventType, const EmscriptenFocusEvent* E, void* userData) { + RGFW_UNUSED(eventType); RGFW_UNUSED(userData); RGFW_UNUSED(E); + + RGFW_eventQueuePushEx(e.type = RGFW_focusIn; e._win = _RGFW.root); + _RGFW.root->_flags |= RGFW_windowFocus; + RGFW_focusCallback(_RGFW.root, 1); + + RGFW_resetKey(); + if ((_RGFW.root->_flags & RGFW_HOLD_MOUSE)) RGFW_window_mouseHold(_RGFW.root, RGFW_AREA(_RGFW.root->r.w, _RGFW.root->r.h)); + return EM_TRUE; +} + +EM_BOOL Emscripten_on_focusout(int eventType, const EmscriptenFocusEvent* E, void* userData) { + RGFW_UNUSED(eventType); RGFW_UNUSED(userData); RGFW_UNUSED(E); + + RGFW_eventQueuePushEx(e.type = RGFW_focusOut; e._win = _RGFW.root); + _RGFW.root->_flags &= ~(u32)RGFW_windowFocus; + RGFW_focusCallback(_RGFW.root, 0); + return EM_TRUE; +} + +EM_BOOL Emscripten_on_mousemove(int eventType, const EmscriptenMouseEvent* E, void* userData) { + RGFW_UNUSED(eventType); RGFW_UNUSED(userData); + RGFW_eventQueuePushEx(e.type = RGFW_mousePosChanged; + e.point = RGFW_POINT(E->targetX, E->targetY); + e.vector = RGFW_POINT(E->movementX, E->movementY); + e._win = _RGFW.root); + + _RGFW.root->_lastMousePoint = RGFW_POINT(E->targetX, E->targetY); + RGFW_mousePosCallback(_RGFW.root, RGFW_POINT(E->targetX, E->targetY), RGFW_POINT(E->movementX, E->movementY)); + return EM_TRUE; +} + +EM_BOOL Emscripten_on_mousedown(int eventType, const EmscriptenMouseEvent* E, void* userData) { + RGFW_UNUSED(eventType); RGFW_UNUSED(userData); + + int button = E->button; + if (button > 2) + button += 2; + + RGFW_eventQueuePushEx(e.type = RGFW_mouseButtonPressed; + e.point = RGFW_POINT(E->targetX, E->targetY); + e.vector = RGFW_POINT(E->movementX, E->movementY); + e.button = (u8)button; + e.scroll = 0; + e._win = _RGFW.root); + RGFW_mouseButtons[button].prev = RGFW_mouseButtons[button].current; + RGFW_mouseButtons[button].current = 1; + + RGFW_mouseButtonCallback(_RGFW.root, button, 0, 1); + return EM_TRUE; +} + +EM_BOOL Emscripten_on_mouseup(int eventType, const EmscriptenMouseEvent* E, void* userData) { + RGFW_UNUSED(eventType); RGFW_UNUSED(userData); + + int button = E->button; + if (button > 2) + button += 2; + + RGFW_eventQueuePushEx(e.type = RGFW_mouseButtonReleased; + e.point = RGFW_POINT(E->targetX, E->targetY); + e.vector = RGFW_POINT(E->movementX, E->movementY); + e.button = (u8)button; + e.scroll = 0; + e._win = _RGFW.root); + RGFW_mouseButtons[button].prev = RGFW_mouseButtons[button].current; + RGFW_mouseButtons[button].current = 0; + + RGFW_mouseButtonCallback(_RGFW.root, button, 0, 0); + return EM_TRUE; +} + +EM_BOOL Emscripten_on_wheel(int eventType, const EmscriptenWheelEvent* E, void* userData) { + RGFW_UNUSED(eventType); RGFW_UNUSED(userData); + + int button = RGFW_mouseScrollUp + (E->deltaY < 0); + RGFW_eventQueuePushEx(e.type = RGFW_mouseButtonPressed; + e.button = (u8)button; + e.scroll = (double)(E->deltaY < 0 ? 1 : -1); + e._win = _RGFW.root); + RGFW_mouseButtons[button].prev = RGFW_mouseButtons[button].current; + RGFW_mouseButtons[button].current = 1; + RGFW_mouseButtonCallback(_RGFW.root, button, E->deltaY < 0 ? 1 : -1, 1); + + return EM_TRUE; +} + +EM_BOOL Emscripten_on_touchstart(int eventType, const EmscriptenTouchEvent* E, void* userData) { + RGFW_UNUSED(eventType); RGFW_UNUSED(userData); + + size_t i; + for (i = 0; i < (size_t)E->numTouches; i++) { + RGFW_eventQueuePushEx(e.type = RGFW_mouseButtonPressed; + e.point = RGFW_POINT(E->touches[i].targetX, E->touches[i].targetY); + e.button = RGFW_mouseLeft; + e._win = _RGFW.root); + + RGFW_mouseButtons[RGFW_mouseLeft].prev = RGFW_mouseButtons[RGFW_mouseLeft].current; + RGFW_mouseButtons[RGFW_mouseLeft].current = 1; + + _RGFW.root->_lastMousePoint = RGFW_POINT(E->touches[i].targetX, E->touches[i].targetY); + RGFW_mousePosCallback(_RGFW.root, RGFW_POINT(E->touches[i].targetX, E->touches[i].targetY), _RGFW.root->event.vector); + RGFW_mouseButtonCallback(_RGFW.root, RGFW_mouseLeft, 0, 1); + } + + return EM_TRUE; +} +EM_BOOL Emscripten_on_touchmove(int eventType, const EmscriptenTouchEvent* E, void* userData) { + RGFW_UNUSED(eventType); RGFW_UNUSED(userData); + + size_t i; + for (i = 0; i < (size_t)E->numTouches; i++) { + RGFW_eventQueuePushEx(e.type = RGFW_mousePosChanged; + e.point = RGFW_POINT(E->touches[i].targetX, E->touches[i].targetY); + e.button = RGFW_mouseLeft; + e._win = _RGFW.root); + + _RGFW.root->_lastMousePoint = RGFW_POINT(E->touches[i].targetX, E->touches[i].targetY); + RGFW_mousePosCallback(_RGFW.root, RGFW_POINT(E->touches[i].targetX, E->touches[i].targetY), _RGFW.root->event.vector); + } + return EM_TRUE; +} + +EM_BOOL Emscripten_on_touchend(int eventType, const EmscriptenTouchEvent* E, void* userData) { + RGFW_UNUSED(eventType); RGFW_UNUSED(userData); + + size_t i; + for (i = 0; i < (size_t)E->numTouches; i++) { + RGFW_eventQueuePushEx(e.type = RGFW_mouseButtonReleased; + e.point = RGFW_POINT(E->touches[i].targetX, E->touches[i].targetY); + e.button = RGFW_mouseLeft; + e._win = _RGFW.root); + + RGFW_mouseButtons[RGFW_mouseLeft].prev = RGFW_mouseButtons[RGFW_mouseLeft].current; + RGFW_mouseButtons[RGFW_mouseLeft].current = 0; + + _RGFW.root->_lastMousePoint = RGFW_POINT(E->touches[i].targetX, E->touches[i].targetY); + RGFW_mousePosCallback(_RGFW.root, RGFW_POINT(E->touches[i].targetX, E->touches[i].targetY), _RGFW.root->event.vector); + RGFW_mouseButtonCallback(_RGFW.root, RGFW_mouseLeft, 0, 0); + } + return EM_TRUE; +} + +EM_BOOL Emscripten_on_touchcancel(int eventType, const EmscriptenTouchEvent* E, void* userData) { RGFW_UNUSED(eventType); RGFW_UNUSED(userData); return EM_TRUE; } + +EM_BOOL Emscripten_on_gamepad(int eventType, const EmscriptenGamepadEvent *gamepadEvent, void *userData) { + RGFW_UNUSED(eventType); RGFW_UNUSED(userData); + + if (gamepadEvent->index >= 4) + return 0; + + size_t i = gamepadEvent->index; + if (gamepadEvent->connected) { + RGFW_STRNCPY(RGFW_gamepads_name[gamepadEvent->index], gamepadEvent->id, sizeof(RGFW_gamepads_name[gamepadEvent->index]) - 1); + RGFW_gamepads_name[gamepadEvent->index][sizeof(RGFW_gamepads_name[gamepadEvent->index]) - 1] = '\0'; + RGFW_gamepads_type[i] = RGFW_gamepadUnknown; + if (RGFW_STRSTR(RGFW_gamepads_name[i], "Microsoft") || RGFW_STRSTR(RGFW_gamepads_name[i], "X-Box")) + RGFW_gamepads_type[i] = RGFW_gamepadMicrosoft; + else if (RGFW_STRSTR(RGFW_gamepads_name[i], "PlayStation") || RGFW_STRSTR(RGFW_gamepads_name[i], "PS3") || RGFW_STRSTR(RGFW_gamepads_name[i], "PS4") || RGFW_STRSTR(RGFW_gamepads_name[i], "PS5")) + RGFW_gamepads_type[i] = RGFW_gamepadSony; + else if (RGFW_STRSTR(RGFW_gamepads_name[i], "Nintendo")) + RGFW_gamepads_type[i] = RGFW_gamepadNintendo; + else if (RGFW_STRSTR(RGFW_gamepads_name[i], "Logitech")) + RGFW_gamepads_type[i] = RGFW_gamepadLogitech; + RGFW_gamepadCount++; + } else { + RGFW_gamepadCount--; + } + + RGFW_eventQueuePushEx(e.type = (RGFW_eventType)(gamepadEvent->connected ? RGFW_gamepadConnected : RGFW_gamepadConnected); + e.gamepad = (u16)gamepadEvent->index; + e._win = _RGFW.root); + + RGFW_gamepadCallback(_RGFW.root, gamepadEvent->index, gamepadEvent->connected); + RGFW_gamepads[gamepadEvent->index] = gamepadEvent->connected; + + return 1; /* The event was consumed by the callback handler */ +} + +u32 RGFW_wASMPhysicalToRGFW(u32 hash) { + switch(hash) { /* 0x0000 */ + case 0x67243A2DU /* Escape */: return RGFW_escape; /* 0x0001 */ + case 0x67251058U /* Digit0 */: return RGFW_0; /* 0x0002 */ + case 0x67251059U /* Digit1 */: return RGFW_1; /* 0x0003 */ + case 0x6725105AU /* Digit2 */: return RGFW_2; /* 0x0004 */ + case 0x6725105BU /* Digit3 */: return RGFW_3; /* 0x0005 */ + case 0x6725105CU /* Digit4 */: return RGFW_4; /* 0x0006 */ + case 0x6725105DU /* Digit5 */: return RGFW_5; /* 0x0007 */ + case 0x6725105EU /* Digit6 */: return RGFW_6; /* 0x0008 */ + case 0x6725105FU /* Digit7 */: return RGFW_7; /* 0x0009 */ + case 0x67251050U /* Digit8 */: return RGFW_8; /* 0x000A */ + case 0x67251051U /* Digit9 */: return RGFW_9; /* 0x000B */ + case 0x92E14DD3U /* Minus */: return RGFW_minus; /* 0x000C */ + case 0x92E1FBACU /* Equal */: return RGFW_equals; /* 0x000D */ + case 0x36BF1CB5U /* Backspace */: return RGFW_backSpace; /* 0x000E */ + case 0x7B8E51E2U /* Tab */: return RGFW_tab; /* 0x000F */ + case 0x2C595B51U /* KeyQ */: return RGFW_q; /* 0x0010 */ + case 0x2C595B57U /* KeyW */: return RGFW_w; /* 0x0011 */ + case 0x2C595B45U /* KeyE */: return RGFW_e; /* 0x0012 */ + case 0x2C595B52U /* KeyR */: return RGFW_r; /* 0x0013 */ + case 0x2C595B54U /* KeyT */: return RGFW_t; /* 0x0014 */ + case 0x2C595B59U /* KeyY */: return RGFW_y; /* 0x0015 */ + case 0x2C595B55U /* KeyU */: return RGFW_u; /* 0x0016 */ + case 0x2C595B4FU /* KeyO */: return RGFW_o; /* 0x0018 */ + case 0x2C595B50U /* KeyP */: return RGFW_p; /* 0x0019 */ + case 0x45D8158CU /* BracketLeft */: return RGFW_closeBracket; /* 0x001A */ + case 0xDEEABF7CU /* BracketRight */: return RGFW_bracket; /* 0x001B */ + case 0x92E1C5D2U /* Enter */: return RGFW_return; /* 0x001C */ + case 0xE058958CU /* ControlLeft */: return RGFW_controlL; /* 0x001D */ + case 0x2C595B41U /* KeyA */: return RGFW_a; /* 0x001E */ + case 0x2C595B53U /* KeyS */: return RGFW_s; /* 0x001F */ + case 0x2C595B44U /* KeyD */: return RGFW_d; /* 0x0020 */ + case 0x2C595B46U /* KeyF */: return RGFW_f; /* 0x0021 */ + case 0x2C595B47U /* KeyG */: return RGFW_g; /* 0x0022 */ + case 0x2C595B48U /* KeyH */: return RGFW_h; /* 0x0023 */ + case 0x2C595B4AU /* KeyJ */: return RGFW_j; /* 0x0024 */ + case 0x2C595B4BU /* KeyK */: return RGFW_k; /* 0x0025 */ + case 0x2C595B4CU /* KeyL */: return RGFW_l; /* 0x0026 */ + case 0x2707219EU /* Semicolon */: return RGFW_semicolon; /* 0x0027 */ + case 0x92E0B58DU /* Quote */: return RGFW_apostrophe; /* 0x0028 */ + case 0x36BF358DU /* Backquote */: return RGFW_backtick; /* 0x0029 */ + case 0x26B1958CU /* ShiftLeft */: return RGFW_shiftL; /* 0x002A */ + case 0x36BF2438U /* Backslash */: return RGFW_backSlash; /* 0x002B */ + case 0x2C595B5AU /* KeyZ */: return RGFW_z; /* 0x002C */ + case 0x2C595B58U /* KeyX */: return RGFW_x; /* 0x002D */ + case 0x2C595B43U /* KeyC */: return RGFW_c; /* 0x002E */ + case 0x2C595B56U /* KeyV */: return RGFW_v; /* 0x002F */ + case 0x2C595B42U /* KeyB */: return RGFW_b; /* 0x0030 */ + case 0x2C595B4EU /* KeyN */: return RGFW_n; /* 0x0031 */ + case 0x2C595B4DU /* KeyM */: return RGFW_m; /* 0x0032 */ + case 0x92E1A1C1U /* Comma */: return RGFW_comma; /* 0x0033 */ + case 0x672FFAD4U /* Period */: return RGFW_period; /* 0x0034 */ + case 0x92E0A438U /* Slash */: return RGFW_slash; /* 0x0035 */ + case 0xC5A6BF7CU /* ShiftRight */: return RGFW_shiftR; + case 0x5D64DA91U /* NumpadMultiply */: return RGFW_multiply; + case 0xC914958CU /* AltLeft */: return RGFW_altL; /* 0x0038 */ + case 0x92E09CB5U /* Space */: return RGFW_space; /* 0x0039 */ + case 0xB8FAE73BU /* CapsLock */: return RGFW_capsLock; /* 0x003A */ + case 0x7174B789U /* F1 */: return RGFW_F1; /* 0x003B */ + case 0x7174B78AU /* F2 */: return RGFW_F2; /* 0x003C */ + case 0x7174B78BU /* F3 */: return RGFW_F3; /* 0x003D */ + case 0x7174B78CU /* F4 */: return RGFW_F4; /* 0x003E */ + case 0x7174B78DU /* F5 */: return RGFW_F5; /* 0x003F */ + case 0x7174B78EU /* F6 */: return RGFW_F6; /* 0x0040 */ + case 0x7174B78FU /* F7 */: return RGFW_F7; /* 0x0041 */ + case 0x7174B780U /* F8 */: return RGFW_F8; /* 0x0042 */ + case 0x7174B781U /* F9 */: return RGFW_F9; /* 0x0043 */ + case 0x7B8E57B0U /* F10 */: return RGFW_F10; /* 0x0044 */ + case 0xC925FCDFU /* Numpad7 */: return RGFW_multiply; /* 0x0047 */ + case 0xC925FCD0U /* Numpad8 */: return RGFW_KP_8; /* 0x0048 */ + case 0xC925FCD1U /* Numpad9 */: return RGFW_KP_9; /* 0x0049 */ + case 0x5EA3E8A4U /* NumpadSubtract */: return RGFW_minus; /* 0x004A */ + case 0xC925FCDCU /* Numpad4 */: return RGFW_KP_4; /* 0x004B */ + case 0xC925FCDDU /* Numpad5 */: return RGFW_KP_5; /* 0x004C */ + case 0xC925FCDEU /* Numpad6 */: return RGFW_KP_6; /* 0x004D */ + case 0xC925FCD9U /* Numpad1 */: return RGFW_KP_1; /* 0x004F */ + case 0xC925FCDAU /* Numpad2 */: return RGFW_KP_2; /* 0x0050 */ + case 0xC925FCDBU /* Numpad3 */: return RGFW_KP_3; /* 0x0051 */ + case 0xC925FCD8U /* Numpad0 */: return RGFW_KP_0; /* 0x0052 */ + case 0x95852DACU /* NumpadDecimal */: return RGFW_period; /* 0x0053 */ + case 0x7B8E57B1U /* F11 */: return RGFW_F11; /* 0x0057 */ + case 0x7B8E57B2U /* F12 */: return RGFW_F12; /* 0x0058 */ + case 0x7393FBACU /* NumpadEqual */: return RGFW_KP_Return; + case 0xB88EBF7CU /* AltRight */: return RGFW_altR; /* 0xE038 */ + case 0xC925873BU /* NumLock */: return RGFW_numLock; /* 0xE045 */ + case 0x2C595F45U /* Home */: return RGFW_home; /* 0xE047 */ + case 0xC91BB690U /* ArrowUp */: return RGFW_up; /* 0xE048 */ + case 0x672F9210U /* PageUp */: return RGFW_pageUp; /* 0xE049 */ + case 0x3799258CU /* ArrowLeft */: return RGFW_left; /* 0xE04B */ + case 0x4CE33F7CU /* ArrowRight */: return RGFW_right; /* 0xE04D */ + case 0x7B8E55DCU /* End */: return RGFW_end; /* 0xE04F */ + case 0x3799379EU /* ArrowDown */: return RGFW_down; /* 0xE050 */ + case 0xBA90179EU /* PageDown */: return RGFW_pageDown; /* 0xE051 */ + case 0x6723CB2CU /* Insert */: return RGFW_insert; /* 0xE052 */ + case 0x6725C50DU /* Delete */: return RGFW_delete; /* 0xE053 */ + case 0x6723658CU /* OSLeft */: return RGFW_superL; /* 0xE05B */ + case 0x39643F7CU /* MetaRight */: return RGFW_superR; /* 0xE05C */ + } + + return 0; +} + +void EMSCRIPTEN_KEEPALIVE RGFW_handleKeyEvent(char* key, char* code, RGFW_bool press) { + const char* iCode = code; + + u32 hash = 0; + while(*iCode) hash = ((hash ^ 0x7E057D79U) << 3) ^ (unsigned int)*iCode++; + + u32 physicalKey = RGFW_wASMPhysicalToRGFW(hash); + + u8 mappedKey = (u8)(*((u32*)key)); + + if (*((u16*)key) != mappedKey) { + mappedKey = 0; + if (*((u32*)key) == *((u32*)"Tab")) mappedKey = RGFW_tab; + } + + RGFW_eventQueuePushEx(e.type = (RGFW_eventType)(press ? RGFW_keyPressed : RGFW_keyReleased); + e.key = (u8)physicalKey; + e.keyChar = (u8)mappedKey; + e.keyMod = _RGFW.root->event.keyMod; + e._win = _RGFW.root); + + RGFW_keyboard[physicalKey].prev = RGFW_keyboard[physicalKey].current; + RGFW_keyboard[physicalKey].current = press; + + RGFW_keyCallback(_RGFW.root, physicalKey, mappedKey, _RGFW.root->event.keyMod, press); +} + +void EMSCRIPTEN_KEEPALIVE RGFW_handleKeyMods(RGFW_bool capital, RGFW_bool numlock, RGFW_bool control, RGFW_bool alt, RGFW_bool shift, RGFW_bool super, RGFW_bool scroll) { + RGFW_updateKeyModsPro(_RGFW.root, capital, numlock, control, alt, shift, super, scroll); +} + +void EMSCRIPTEN_KEEPALIVE Emscripten_onDrop(size_t count) { + if (!(_RGFW.root->_flags & RGFW_windowAllowDND)) + return; + + _RGFW.root->event.droppedFilesCount = count; + RGFW_eventQueuePushEx(e.type = RGFW_DND; + e.droppedFilesCount = count; + e._win = _RGFW.root); + RGFW_dndCallback(_RGFW.root, _RGFW.root->event.droppedFiles, count); +} + +RGFW_bool RGFW_stopCheckEvents_bool = RGFW_FALSE; +void RGFW_stopCheckEvents(void) { + RGFW_stopCheckEvents_bool = RGFW_TRUE; +} + +void RGFW_window_eventWait(RGFW_window* win, i32 waitMS) { + RGFW_UNUSED(win); + if (waitMS == 0) return; + + u32 start = (u32)(((u64)RGFW_getTimeNS()) / 1e+6); + + while ((_RGFW.eventLen == 0) && RGFW_stopCheckEvents_bool == RGFW_FALSE && (RGFW_getTimeNS() / 1e+6) - start < waitMS) + emscripten_sleep(0); + + RGFW_stopCheckEvents_bool = RGFW_FALSE; +} + +void RGFW_window_initBufferPtr(RGFW_window* win, u8* buffer, RGFW_area area){ + #if defined(RGFW_OSMESA) || defined(RGFW_BUFFER) + win->buffer = buffer; + win->bufferSize = area; + #ifdef RGFW_OSMESA + win->src.ctx = OSMesaCreateContext(OSMESA_RGBA, NULL); + OSMesaMakeCurrent(win->src.ctx, win->buffer, GL_UNSIGNED_BYTE, area.w, area.h); + OSMesaPixelStore(OSMESA_Y_UP, 0); + #endif + #else + RGFW_UNUSED(win); RGFW_UNUSED(buffer); RGFW_UNUSED(area); /*!< if buffer rendering is not being used */ + #endif +} + +void EMSCRIPTEN_KEEPALIVE RGFW_makeSetValue(size_t index, char* file) { + /* This seems like a terrible idea, don't replicate this unless you hate yourself or the OS */ + /* TODO: find a better way to do this + */ + RGFW_STRNCPY((char*)_RGFW.root->event.droppedFiles[index], file, RGFW_MAX_PATH - 1); + _RGFW.root->event.droppedFiles[index][RGFW_MAX_PATH - 1] = '\0'; +} + +#include +#include +#include +#include + +void EMSCRIPTEN_KEEPALIVE RGFW_mkdir(char* name) { mkdir(name, 0755); } + +void EMSCRIPTEN_KEEPALIVE RGFW_writeFile(const char *path, const char *data, size_t len) { + FILE* file = fopen(path, "w+"); + if (file == NULL) + return; + + fwrite(data, sizeof(char), len, file); + fclose(file); +} + +void RGFW_window_initOpenGL(RGFW_window* win, RGFW_bool software) { +#if defined(RGFW_OPENGL) && !defined(RGFW_WEBGPU) && !defined(RGFW_OSMESA) && !defined(RGFW_BUFFER) + EmscriptenWebGLContextAttributes attrs; + attrs.alpha = RGFW_GL_HINTS[RGFW_glDepth]; + attrs.depth = RGFW_GL_HINTS[RGFW_glAlpha]; + attrs.stencil = RGFW_GL_HINTS[RGFW_glStencil]; + attrs.antialias = RGFW_GL_HINTS[RGFW_glSamples]; + attrs.premultipliedAlpha = EM_TRUE; + attrs.preserveDrawingBuffer = EM_FALSE; + + if (RGFW_GL_HINTS[RGFW_glDoubleBuffer] == 0) + attrs.renderViaOffscreenBackBuffer = 0; + else + attrs.renderViaOffscreenBackBuffer = RGFW_GL_HINTS[RGFW_glAuxBuffers]; + + attrs.failIfMajorPerformanceCaveat = EM_FALSE; + attrs.majorVersion = (RGFW_GL_HINTS[RGFW_glMajor] == 0) ? 1 : RGFW_GL_HINTS[RGFW_glMajor]; + attrs.minorVersion = RGFW_GL_HINTS[RGFW_glMinor]; + + attrs.enableExtensionsByDefault = EM_TRUE; + attrs.explicitSwapControl = EM_TRUE; + + emscripten_webgl_init_context_attributes(&attrs); + win->src.ctx = emscripten_webgl_create_context("#canvas", &attrs); + emscripten_webgl_make_context_current(win->src.ctx); + + #ifdef LEGACY_GL_EMULATION + EM_ASM("Module.useWebGL = true; GLImmediate.init();"); + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoOpenGL, RGFW_DEBUG_CTX(win, 0), "opengl context initalized"); + #endif + glViewport(0, 0, win->r.w, win->r.h); +#endif +} + +void RGFW_window_freeOpenGL(RGFW_window* win) { +#if defined(RGFW_OPENGL) && !defined(RGFW_WEBGPU) && !defined(RGFW_OSMESA) && !defined(RGFW_OSMESA) + if (win->src.ctx == 0) return; + emscripten_webgl_destroy_context(win->src.ctx); + win->src.ctx = 0; + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoOpenGL, RGFW_DEBUG_CTX(win, 0), "opengl context freed"); +#elif defined(RGFW_OPENGL) && defined(RGFW_OSMESA) + if(win->src.ctx == 0) return; + OSMesaDestroyContext(win->src.ctx); + win->src.ctx = 0; +#else + RGFW_UNUSED(win); +#endif +} + +i32 RGFW_init(void) { +#if defined(RGFW_C89) || defined(__cplusplus) + if (_RGFW_init) return 0; + _RGFW_init = RGFW_TRUE; + _RGFW.root = NULL; _RGFW.current = NULL; _RGFW.windowCount = -2; _RGFW.eventLen = 0; _RGFW.eventIndex = 0; +#endif + + _RGFW.windowCount = 0; + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoGlobal, RGFW_DEBUG_CTX(NULL, 0), "global context initialized"); + return 0; +} + +RGFW_window* RGFW_createWindowPtr(const char* name, RGFW_rect rect, RGFW_windowFlags flags, RGFW_window* win) { + RGFW_window_basic_init(win, rect, flags); + RGFW_window_initOpenGL(win, 0); + + #if defined(RGFW_WEBGPU) + win->src.ctx = wgpuCreateInstance(NULL); + win->src.device = emscripten_webgpu_get_device(); + win->src.queue = wgpuDeviceGetQueue(win->src.device); + #endif + + emscripten_set_canvas_element_size("#canvas", rect.w, rect.h); + emscripten_set_window_title(name); + + /* load callbacks */ + emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, EM_FALSE, Emscripten_on_resize); + emscripten_set_fullscreenchange_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, NULL, EM_FALSE, Emscripten_on_fullscreenchange); + emscripten_set_mousemove_callback("#canvas", NULL, EM_FALSE, Emscripten_on_mousemove); + emscripten_set_touchstart_callback("#canvas", NULL, EM_FALSE, Emscripten_on_touchstart); + emscripten_set_touchend_callback("#canvas", NULL, EM_FALSE, Emscripten_on_touchend); + emscripten_set_touchmove_callback("#canvas", NULL, EM_FALSE, Emscripten_on_touchmove); + emscripten_set_touchcancel_callback("#canvas", NULL, EM_FALSE, Emscripten_on_touchcancel); + emscripten_set_mousedown_callback("#canvas", NULL, EM_FALSE, Emscripten_on_mousedown); + emscripten_set_mouseup_callback("#canvas", NULL, EM_FALSE, Emscripten_on_mouseup); + emscripten_set_wheel_callback("#canvas", NULL, EM_FALSE, Emscripten_on_wheel); + emscripten_set_focusin_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, EM_FALSE, Emscripten_on_focusin); + emscripten_set_focusout_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, EM_FALSE, Emscripten_on_focusout); + emscripten_set_gamepadconnected_callback(NULL, 1, Emscripten_on_gamepad); + emscripten_set_gamepaddisconnected_callback(NULL, 1, Emscripten_on_gamepad); + + if (flags & RGFW_windowAllowDND) { + win->_flags |= RGFW_windowAllowDND; + } + + EM_ASM({ + window.addEventListener("keydown", + (event) => { + var key = stringToNewUTF8(event.key); var code = stringToNewUTF8(event.code); + Module._RGFW_handleKeyMods(event.getModifierState("CapsLock"), event.getModifierState("NumLock"), event.getModifierState("Control"), event.getModifierState("Alt"), event.getModifierState("Shift"), event.getModifierState("Meta"), event.getModifierState("ScrollLock")); + Module._RGFW_handleKeyEvent(key, code, 1); + _free(key); _free(code); + }, + true); + window.addEventListener("keyup", + (event) => { + var key = stringToNewUTF8(event.key); var code = stringToNewUTF8(event.code); + Module._RGFW_handleKeyMods(event.getModifierState("CapsLock"), event.getModifierState("NumLock"), event.getModifierState("Control"), event.getModifierState("Alt"), event.getModifierState("Shift"), event.getModifierState("Meta"), event.getModifierState("ScrollLock")); + Module._RGFW_handleKeyEvent(key, code, 0); + _free(key); _free(code); + }, + true); + }); + + EM_ASM({ + var canvas = document.getElementById('canvas'); + canvas.addEventListener('drop', function(e) { + e.preventDefault(); + if (e.dataTransfer.file < 0) + return; + + var filenamesArray = []; + var count = e.dataTransfer.files.length; + + /* Read and save the files to emscripten's files */ + var drop_dir = '.rgfw_dropped_files'; + Module._RGFW_mkdir(drop_dir); + + for (var i = 0; i < count; i++) { + var file = e.dataTransfer.files[i]; + + var path = '/' + drop_dir + '/' + file.name.replace("//", '_'); + var reader = new FileReader(); + + reader.onloadend = (e) => { + if (reader.readyState != 2) { + out('failed to read dropped file: '+file.name+': '+reader.error); + } + else { + var data = e.target.result; + + _RGFW_writeFile(path, new Uint8Array(data), file.size); + } + }; + + reader.readAsArrayBuffer(file); + /* This works weird on modern opengl */ + var filename = stringToNewUTF8(path); + + filenamesArray.push(filename); + + Module._RGFW_makeSetValue(i, filename); + } + + Module._Emscripten_onDrop(count); + + for (var i = 0; i < count; ++i) { + _free(filenamesArray[i]); + } + }, true); + + canvas.addEventListener('dragover', function(e) { e.preventDefault(); return false; }, true); + }); + + RGFW_window_setFlags(win, flags); + + if ((flags & RGFW_windowNoInitAPI) == 0) { + RGFW_window_initBuffer(win); + } + + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoWindow, RGFW_DEBUG_CTX(win, 0), "a new window was created"); + return win; +} + +RGFW_event* RGFW_window_checkEvent(RGFW_window* win) { + if (win == NULL || ((win->_flags & RGFW_windowFreeOnClose) && (win->_flags & RGFW_EVENT_QUIT))) return NULL; + RGFW_event* ev = RGFW_window_checkEventCore(win); + if (ev) return ev; + + emscripten_sample_gamepad_data(); + /* check gamepads */ + int i; + for (i = 0; (i < emscripten_get_num_gamepads()) && (i < 4); i++) { + if (RGFW_gamepads[i] == 0) + continue; + EmscriptenGamepadEvent gamepadState; + + if (emscripten_get_gamepad_status(i, &gamepadState) != EMSCRIPTEN_RESULT_SUCCESS) + break; + + /* Register buttons data for every connected gamepad */ + int j; + for (j = 0; (j < gamepadState.numButtons) && (j < 16); j++) { + u32 map[] = { + RGFW_gamepadA, RGFW_gamepadB, RGFW_gamepadX, RGFW_gamepadY, + RGFW_gamepadL1, RGFW_gamepadR1, RGFW_gamepadL2, RGFW_gamepadR2, + RGFW_gamepadSelect, RGFW_gamepadStart, + RGFW_gamepadL3, RGFW_gamepadR3, + RGFW_gamepadUp, RGFW_gamepadDown, RGFW_gamepadLeft, RGFW_gamepadRight, RGFW_gamepadHome + }; + + + u32 button = map[j]; + if (button == 404) + continue; + + if (RGFW_gamepadPressed[i][button].current != gamepadState.digitalButton[j]) { + if (gamepadState.digitalButton[j]) + win->event.type = RGFW_gamepadButtonPressed; + else + win->event.type = RGFW_gamepadButtonReleased; + + win->event.gamepad = i; + win->event.button = map[j]; + + RGFW_gamepadPressed[i][button].prev = RGFW_gamepadPressed[i][button].current; + RGFW_gamepadPressed[i][button].current = gamepadState.digitalButton[j]; + + RGFW_gamepadButtonCallback(win, win->event.gamepad, win->event.button, gamepadState.digitalButton[j]); + return &win->event; + } + } + + for (j = 0; (j < gamepadState.numAxes) && (j < 4); j += 2) { + win->event.axisesCount = gamepadState.numAxes / 2; + if (RGFW_gamepadAxes[i][(size_t)(j / 2)].x != (i8)(gamepadState.axis[j] * 100.0f) || + RGFW_gamepadAxes[i][(size_t)(j / 2)].y != (i8)(gamepadState.axis[j + 1] * 100.0f) + ) { + + RGFW_gamepadAxes[i][(size_t)(j / 2)].x = (i8)(gamepadState.axis[j] * 100.0f); + RGFW_gamepadAxes[i][(size_t)(j / 2)].y = (i8)(gamepadState.axis[j + 1] * 100.0f); + win->event.axis[(size_t)(j / 2)] = RGFW_gamepadAxes[i][(size_t)(j / 2)]; + + win->event.type = RGFW_gamepadAxisMove; + win->event.gamepad = i; + win->event.whichAxis = j / 2; + + RGFW_gamepadAxisCallback(win, win->event.gamepad, win->event.axis, win->event.axisesCount, win->event.whichAxis); + return &win->event; + } + } + } + + return NULL; +} + +void RGFW_window_resize(RGFW_window* win, RGFW_area a) { + RGFW_UNUSED(win); + emscripten_set_canvas_element_size("#canvas", a.w, a.h); +} + +/* NOTE: I don't know if this is possible */ +void RGFW_window_moveMouse(RGFW_window* win, RGFW_point v) { RGFW_UNUSED(win); RGFW_UNUSED(v); } +/* this one might be possible but it looks iffy */ +RGFW_mouse* RGFW_loadMouse(u8* icon, RGFW_area a, i32 channels) { RGFW_UNUSED(channels); RGFW_UNUSED(a); RGFW_UNUSED(icon); return NULL; } + +void RGFW_window_setMouse(RGFW_window* win, RGFW_mouse* mouse) { RGFW_UNUSED(win); RGFW_UNUSED(mouse); } +void RGFW_freeMouse(RGFW_mouse* mouse) { RGFW_UNUSED(mouse); } + +RGFW_bool RGFW_window_setMouseStandard(RGFW_window* win, u8 mouse) { + static const char cursors[16][16] = { + "default", "default", "text", "crosshair", + "pointer", "ew-resize", "ns-resize", "nwse-resize", "nesw-resize", + "move", "not-allowed" + }; + + RGFW_UNUSED(win); + EM_ASM( { document.getElementById("canvas").style.cursor = UTF8ToString($0); }, cursors[mouse]); + return RGFW_TRUE; +} + +RGFW_bool RGFW_window_setMouseDefault(RGFW_window* win) { + return RGFW_window_setMouseStandard(win, RGFW_mouseNormal); +} + +void RGFW_window_showMouse(RGFW_window* win, RGFW_bool show) { + RGFW_window_showMouseFlags(win, show); + if (show) + RGFW_window_setMouseDefault(win); + else + EM_ASM(document.getElementById('canvas').style.cursor = 'none';); +} + +RGFW_point RGFW_getGlobalMousePoint(void) { + RGFW_point point; + point.x = EM_ASM_INT({ + return window.mouseX || 0; + }); + point.y = EM_ASM_INT({ + return window.mouseY || 0; + }); + return point; +} + +void RGFW_window_setMousePassthrough(RGFW_window* win, RGFW_bool passthrough) { + RGFW_UNUSED(win); + + EM_ASM_({ + var canvas = document.getElementById('canvas'); + if ($0) { + canvas.style.pointerEvents = 'none'; + } else { + canvas.style.pointerEvents = 'auto'; + } + }, passthrough); +} + +void RGFW_writeClipboard(const char* text, u32 textLen) { + RGFW_UNUSED(textLen); + EM_ASM({ navigator.clipboard.writeText(UTF8ToString($0)); }, text); +} + + +RGFW_ssize_t RGFW_readClipboardPtr(char* str, size_t strCapacity) { + RGFW_UNUSED(str); RGFW_UNUSED(strCapacity); + /* + placeholder code for later + I'm not sure if this is possible do the the async stuff + */ + return 0; +} + +void RGFW_window_swapBuffers_software(RGFW_window* win) { +#if defined(RGFW_OSMESA) + EM_ASM_({ + var data = Module.HEAPU8.slice($0, $0 + $1 * $2 * 4); + let context = document.getElementById("canvas").getContext("2d"); + let image = context.getImageData(0, 0, $1, $2); + image.data.set(data); + context.putImageData(image, 0, $4 - $2); + }, win->buffer, win->bufferSize.w, win->bufferSize.h, win->r.w, win->r.h); +#elif defined(RGFW_BUFFER) + EM_ASM_({ + var data = Module.HEAPU8.slice($0, $0 + $1 * $2 * 4); + let context = document.getElementById("canvas").getContext("2d"); + let image = context.getImageData(0, 0, $1, $2); + image.data.set(data); + context.putImageData(image, 0, 0); + }, win->buffer, win->bufferSize.w, win->bufferSize.h, win->r.w, win->r.h); + emscripten_sleep(0); +#else + RGFW_UNUSED(win); +#endif +} + +void RGFW_window_makeCurrent_OpenGL(RGFW_window* win) { +#if !defined(RGFW_WEBGPU) && !(defined(RGFW_OSMESA) || defined(RGFW_BUFFER)) + if (win == NULL) + emscripten_webgl_make_context_current(0); + else + emscripten_webgl_make_context_current(win->src.ctx); +#endif +} + + +void RGFW_window_swapBuffers_OpenGL(RGFW_window* win) { +#ifndef RGFW_WEBGPU + emscripten_webgl_commit_frame(); + +#endif + emscripten_sleep(0); +} + +#ifndef RGFW_WEBGPU +void* RGFW_getCurrent_OpenGL(void) { return (void*)emscripten_webgl_get_current_context(); } +#endif + +#ifndef RGFW_EGL +void RGFW_window_swapInterval(RGFW_window* win, i32 swapInterval) { RGFW_UNUSED(win); RGFW_UNUSED(swapInterval); } +#endif + +void RGFW_deinit(void) { _RGFW.windowCount = -1; RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoGlobal, RGFW_DEBUG_CTX(NULL, 0), "global context deinitialized"); } + +void RGFW_window_close(RGFW_window* win) { + if ((win->_flags & RGFW_windowNoInitAPI) == 0) RGFW_window_freeOpenGL(win); + + #if defined(RGFW_OSMESA) || defined(RGFW_BUFFER) + if ((win->_flags & RGFW_BUFFER_ALLOC)) + RGFW_FREE(win->buffer); + #endif + + RGFW_sendDebugInfo(RGFW_typeInfo, RGFW_infoWindow, RGFW_DEBUG_CTX(win, 0), "a window was freed"); + _RGFW.windowCount--; + if (_RGFW.windowCount == 0) RGFW_deinit(); + + RGFW_clipboard_switch(NULL); + RGFW_FREE(win->event.droppedFiles); + if ((win->_flags & RGFW_WINDOW_ALLOC)) { + RGFW_FREE(win); + win = NULL; + } +} + +int RGFW_innerWidth(void) { return EM_ASM_INT({ return window.innerWidth; }); } +int RGFW_innerHeight(void) { return EM_ASM_INT({ return window.innerHeight; }); } + +RGFW_area RGFW_getScreenSize(void) { + return RGFW_AREA(RGFW_innerWidth(), RGFW_innerHeight()); +} + +RGFW_bool RGFW_extensionSupportedPlatform(const char* extension, size_t len) { +#ifdef RGFW_OPENGL + return EM_ASM_INT({ + var ext = UTF8ToString($0, $1); + var canvas = document.querySelector('canvas'); + var gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl'); + if (!gl) return 0; + + var supported = gl.getSupportedExtensions(); + return supported && supported.includes(ext) ? 1 : 0; + }, extension, len); +#else + return RGFW_FALSE; +#endif +} + +RGFW_proc RGFW_getProcAddress(const char* procname) { +#ifdef RGFW_OPENGL + return (RGFW_proc)emscripten_webgl_get_proc_address(procname); +#else + return NULL +#endif +} + +void RGFW_sleep(u64 milisecond) { + emscripten_sleep(milisecond); +} + +u64 RGFW_getTimerFreq(void) { return (u64)1000; } +u64 RGFW_getTimerValue(void) { return emscripten_get_now() * 1e+6; } + +void RGFW_releaseCursor(RGFW_window* win) { + RGFW_UNUSED(win); + emscripten_exit_pointerlock(); +} + +void RGFW_captureCursor(RGFW_window* win, RGFW_rect r) { + RGFW_UNUSED(win); RGFW_UNUSED(r); + + emscripten_request_pointerlock("#canvas", 1); +} + + +void RGFW_window_setName(RGFW_window* win, const char* name) { + RGFW_UNUSED(win); + emscripten_set_window_title(name); +} + +void RGFW_window_maximize(RGFW_window* win) { + RGFW_ASSERT(win != NULL); + + RGFW_area screen = RGFW_getScreenSize(); + RGFW_window_move(win, RGFW_POINT(0, 0)); + RGFW_window_resize(win, screen); +} + +void RGFW_window_setFullscreen(RGFW_window* win, RGFW_bool fullscreen) { + RGFW_ASSERT(win != NULL); + if (fullscreen) { + win->_flags |= RGFW_windowFullscreen; + EM_ASM( Module.requestFullscreen(false, true); ); + return; + } + win->_flags &= ~(u32)RGFW_windowFullscreen; + EM_ASM( Module.exitFullscreen(false, true); ); +} + +void RGFW_window_setOpacity(RGFW_window* win, u8 opacity) { + RGFW_UNUSED(win); + EM_ASM({ + var element = document.getElementById("canvas"); + if (element) + element.style.opacity = $1; + }, "elementId", opacity); +} + +/* unsupported functions */ +void RGFW_window_focus(RGFW_window* win) { RGFW_UNUSED(win); } +void RGFW_window_raise(RGFW_window* win) { RGFW_UNUSED(win); } +RGFW_bool RGFW_monitor_requestMode(RGFW_monitor mon, RGFW_monitorMode mode, RGFW_modeRequest request) { RGFW_UNUSED(mon); RGFW_UNUSED(mode); RGFW_UNUSED(request); return RGFW_FALSE; } +RGFW_monitor* RGFW_getMonitors(size_t* len) { RGFW_UNUSED(len); return NULL; } +RGFW_monitor RGFW_getPrimaryMonitor(void) { return (RGFW_monitor){}; } +void RGFW_window_move(RGFW_window* win, RGFW_point v) { RGFW_UNUSED(win); RGFW_UNUSED(v); } +void RGFW_window_setAspectRatio(RGFW_window* win, RGFW_area a) { RGFW_UNUSED(win); RGFW_UNUSED(a); } +void RGFW_window_setMinSize(RGFW_window* win, RGFW_area a) { RGFW_UNUSED(win); RGFW_UNUSED(a); } +void RGFW_window_setMaxSize(RGFW_window* win, RGFW_area a) { RGFW_UNUSED(win); RGFW_UNUSED(a); } +void RGFW_window_minimize(RGFW_window* win) { RGFW_UNUSED(win); } +void RGFW_window_restore(RGFW_window* win) { RGFW_UNUSED(win); } +void RGFW_window_setFloating(RGFW_window* win, RGFW_bool floating) { RGFW_UNUSED(win); RGFW_UNUSED(floating); } +void RGFW_window_setBorder(RGFW_window* win, RGFW_bool border) { RGFW_UNUSED(win); RGFW_UNUSED(border); } +RGFW_bool RGFW_window_setIconEx(RGFW_window* win, u8* icon, RGFW_area a, i32 channels, u8 type) { RGFW_UNUSED(win); RGFW_UNUSED(icon); RGFW_UNUSED(a); RGFW_UNUSED(channels); RGFW_UNUSED(type); return RGFW_FALSE; } +void RGFW_window_hide(RGFW_window* win) { RGFW_UNUSED(win); } +void RGFW_window_show(RGFW_window* win) {RGFW_UNUSED(win); } +RGFW_bool RGFW_window_isHidden(RGFW_window* win) { RGFW_UNUSED(win); return RGFW_FALSE; } +RGFW_bool RGFW_window_isMinimized(RGFW_window* win) { RGFW_UNUSED(win); return RGFW_FALSE; } +RGFW_bool RGFW_window_isMaximized(RGFW_window* win) { RGFW_UNUSED(win); return RGFW_FALSE; } +RGFW_bool RGFW_window_isFloating(RGFW_window* win) { RGFW_UNUSED(win); return RGFW_FALSE; } +RGFW_monitor RGFW_window_getMonitor(RGFW_window* win) { RGFW_UNUSED(win); return (RGFW_monitor){}; } +#endif + +/* end of web asm defines */ + +/* unix (macOS, linux, web asm) only stuff */ +#if defined(RGFW_X11) || defined(RGFW_MACOS) || defined(RGFW_WASM) || defined(RGFW_WAYLAND) +#ifndef RGFW_NO_THREADS +#include + +RGFW_thread RGFW_createThread(RGFW_threadFunc_ptr ptr, void* args) { + RGFW_thread t; + pthread_create((pthread_t*) &t, NULL, *ptr, args); + return t; +} +void RGFW_cancelThread(RGFW_thread thread) { pthread_cancel((pthread_t) thread); } +void RGFW_joinThread(RGFW_thread thread) { pthread_join((pthread_t) thread, NULL); } + +#if defined(__linux__) +void RGFW_setThreadPriority(RGFW_thread thread, u8 priority) { pthread_setschedprio((pthread_t)thread, priority); } +#else +void RGFW_setThreadPriority(RGFW_thread thread, u8 priority) { RGFW_UNUSED(thread); RGFW_UNUSED(priority); } +#endif +#endif + +#ifndef RGFW_WASM +void RGFW_sleep(u64 ms) { + struct timespec time; + time.tv_sec = 0; + time.tv_nsec = (long int)((double)ms * 1e+6); + + #ifndef RGFW_NO_UNIX_CLOCK + nanosleep(&time, NULL); + #endif +} +#endif + +#endif /* end of unix / mac stuff */ +#endif /* RGFW_IMPLEMENTATION */ + +#if defined(__cplusplus) && !defined(__EMSCRIPTEN__) +} +#endif + +#if _MSC_VER + #pragma warning( pop ) +#endif diff --git a/external/stb/stb_image.h b/external/stb/stb_image.h new file mode 100644 index 0000000..9eedabe --- /dev/null +++ b/external/stb/stb_image.h @@ -0,0 +1,7988 @@ +/* stb_image - v2.30 - public domain image loader - http://nothings.org/stb + no warranty implied; use at your own risk + + Do this: + #define STB_IMAGE_IMPLEMENTATION + before you include this file in *one* C or C++ file to create the implementation. + + // i.e. it should look like this: + #include ... + #include ... + #include ... + #define STB_IMAGE_IMPLEMENTATION + #include "stb_image.h" + + You can #define STBI_ASSERT(x) before the #include to avoid using assert.h. + And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free + + + QUICK NOTES: + Primarily of interest to game developers and other people who can + avoid problematic images and only need the trivial interface + + JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) + PNG 1/2/4/8/16-bit-per-channel + + TGA (not sure what subset, if a subset) + BMP non-1bpp, non-RLE + PSD (composited view only, no extra channels, 8/16 bit-per-channel) + + GIF (*comp always reports as 4-channel) + HDR (radiance rgbE format) + PIC (Softimage PIC) + PNM (PPM and PGM binary only) + + Animated GIF still needs a proper API, but here's one way to do it: + http://gist.github.com/urraka/685d9a6340b26b830d49 + + - decode from memory or through FILE (define STBI_NO_STDIO to remove code) + - decode from arbitrary I/O callbacks + - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) + + Full documentation under "DOCUMENTATION" below. + + +LICENSE + + See end of file for license information. + +RECENT REVISION HISTORY: + + 2.30 (2024-05-31) avoid erroneous gcc warning + 2.29 (2023-05-xx) optimizations + 2.28 (2023-01-29) many error fixes, security errors, just tons of stuff + 2.27 (2021-07-11) document stbi_info better, 16-bit PNM support, bug fixes + 2.26 (2020-07-13) many minor fixes + 2.25 (2020-02-02) fix warnings + 2.24 (2020-02-02) fix warnings; thread-local failure_reason and flip_vertically + 2.23 (2019-08-11) fix clang static analysis warning + 2.22 (2019-03-04) gif fixes, fix warnings + 2.21 (2019-02-25) fix typo in comment + 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings + 2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes + 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 + RGB-format JPEG; remove white matting in PSD; + allocate large structures on the stack; + correct channel count for PNG & BMP + 2.10 (2016-01-22) avoid warning introduced in 2.09 + 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED + + See end of file for full revision history. + + + ============================ Contributors ========================= + + Image formats Extensions, features + Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info) + Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info) + Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG) + Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks) + Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG) + Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip) + Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD) + github:urraka (animated gif) Junggon Kim (PNM comments) + Christopher Forseth (animated gif) Daniel Gibson (16-bit TGA) + socks-the-fox (16-bit PNG) + Jeremy Sawicki (handle all ImageNet JPGs) + Optimizations & bugfixes Mikhail Morozov (1-bit BMP) + Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query) + Arseny Kapoulkine Simon Breuss (16-bit PNM) + John-Mark Allen + Carmelo J Fdez-Aguera + + Bug & warning fixes + Marc LeBlanc David Woo Guillaume George Martins Mozeiko + Christpher Lloyd Jerry Jansson Joseph Thomson Blazej Dariusz Roszkowski + Phil Jordan Dave Moore Roy Eltham + Hayaki Saito Nathan Reed Won Chun + Luke Graham Johan Duparc Nick Verigakis the Horde3D community + Thomas Ruf Ronny Chevalier github:rlyeh + Janez Zemva John Bartholomew Michal Cichon github:romigrou + Jonathan Blow Ken Hamada Tero Hanninen github:svdijk + Eugene Golushkov Laurent Gomila Cort Stratton github:snagar + Aruelien Pocheville Sergio Gonzalez Thibault Reuille github:Zelex + Cass Everitt Ryamond Barbiero github:grim210 + Paul Du Bois Engin Manap Aldo Culquicondor github:sammyhw + Philipp Wiesemann Dale Weiler Oriol Ferrer Mesia github:phprus + Josh Tobin Neil Bickford Matthew Gregan github:poppolopoppo + Julian Raschke Gregory Mullen Christian Floisand github:darealshinji + Baldur Karlsson Kevin Schmidt JR Smith github:Michaelangel007 + Brad Weinberger Matvey Cherevko github:mosra + Luca Sas Alexander Veselov Zack Middleton [reserved] + Ryan C. Gordon [reserved] [reserved] + DO NOT ADD YOUR NAME HERE + + Jacko Dirks + + To add your name to the credits, pick a random blank space in the middle and fill it. + 80% of merge conflicts on stb PRs are due to people adding their name at the end + of the credits. +*/ + +#ifndef STBI_INCLUDE_STB_IMAGE_H +#define STBI_INCLUDE_STB_IMAGE_H + +// DOCUMENTATION +// +// Limitations: +// - no 12-bit-per-channel JPEG +// - no JPEGs with arithmetic coding +// - GIF always returns *comp=4 +// +// Basic usage (see HDR discussion below for HDR usage): +// int x,y,n; +// unsigned char *data = stbi_load(filename, &x, &y, &n, 0); +// // ... process data if not NULL ... +// // ... x = width, y = height, n = # 8-bit components per pixel ... +// // ... replace '0' with '1'..'4' to force that many components per pixel +// // ... but 'n' will always be the number that it would have been if you said 0 +// stbi_image_free(data); +// +// Standard parameters: +// int *x -- outputs image width in pixels +// int *y -- outputs image height in pixels +// int *channels_in_file -- outputs # of image components in image file +// int desired_channels -- if non-zero, # of image components requested in result +// +// The return value from an image loader is an 'unsigned char *' which points +// to the pixel data, or NULL on an allocation failure or if the image is +// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels, +// with each pixel consisting of N interleaved 8-bit components; the first +// pixel pointed to is top-left-most in the image. There is no padding between +// image scanlines or between pixels, regardless of format. The number of +// components N is 'desired_channels' if desired_channels is non-zero, or +// *channels_in_file otherwise. If desired_channels is non-zero, +// *channels_in_file has the number of components that _would_ have been +// output otherwise. E.g. if you set desired_channels to 4, you will always +// get RGBA output, but you can check *channels_in_file to see if it's trivially +// opaque because e.g. there were only 3 channels in the source image. +// +// An output image with N components has the following components interleaved +// in this order in each pixel: +// +// N=#comp components +// 1 grey +// 2 grey, alpha +// 3 red, green, blue +// 4 red, green, blue, alpha +// +// If image loading fails for any reason, the return value will be NULL, +// and *x, *y, *channels_in_file will be unchanged. The function +// stbi_failure_reason() can be queried for an extremely brief, end-user +// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS +// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly +// more user-friendly ones. +// +// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. +// +// To query the width, height and component count of an image without having to +// decode the full file, you can use the stbi_info family of functions: +// +// int x,y,n,ok; +// ok = stbi_info(filename, &x, &y, &n); +// // returns ok=1 and sets x, y, n if image is a supported format, +// // 0 otherwise. +// +// Note that stb_image pervasively uses ints in its public API for sizes, +// including sizes of memory buffers. This is now part of the API and thus +// hard to change without causing breakage. As a result, the various image +// loaders all have certain limits on image size; these differ somewhat +// by format but generally boil down to either just under 2GB or just under +// 1GB. When the decoded image would be larger than this, stb_image decoding +// will fail. +// +// Additionally, stb_image will reject image files that have any of their +// dimensions set to a larger value than the configurable STBI_MAX_DIMENSIONS, +// which defaults to 2**24 = 16777216 pixels. Due to the above memory limit, +// the only way to have an image with such dimensions load correctly +// is for it to have a rather extreme aspect ratio. Either way, the +// assumption here is that such larger images are likely to be malformed +// or malicious. If you do need to load an image with individual dimensions +// larger than that, and it still fits in the overall size limit, you can +// #define STBI_MAX_DIMENSIONS on your own to be something larger. +// +// =========================================================================== +// +// UNICODE: +// +// If compiling for Windows and you wish to use Unicode filenames, compile +// with +// #define STBI_WINDOWS_UTF8 +// and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert +// Windows wchar_t filenames to utf8. +// +// =========================================================================== +// +// Philosophy +// +// stb libraries are designed with the following priorities: +// +// 1. easy to use +// 2. easy to maintain +// 3. good performance +// +// Sometimes I let "good performance" creep up in priority over "easy to maintain", +// and for best performance I may provide less-easy-to-use APIs that give higher +// performance, in addition to the easy-to-use ones. Nevertheless, it's important +// to keep in mind that from the standpoint of you, a client of this library, +// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all. +// +// Some secondary priorities arise directly from the first two, some of which +// provide more explicit reasons why performance can't be emphasized. +// +// - Portable ("ease of use") +// - Small source code footprint ("easy to maintain") +// - No dependencies ("ease of use") +// +// =========================================================================== +// +// I/O callbacks +// +// I/O callbacks allow you to read from arbitrary sources, like packaged +// files or some other source. Data read from callbacks are processed +// through a small internal buffer (currently 128 bytes) to try to reduce +// overhead. +// +// The three functions you must define are "read" (reads some bytes of data), +// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). +// +// =========================================================================== +// +// SIMD support +// +// The JPEG decoder will try to automatically use SIMD kernels on x86 when +// supported by the compiler. For ARM Neon support, you must explicitly +// request it. +// +// (The old do-it-yourself SIMD API is no longer supported in the current +// code.) +// +// On x86, SSE2 will automatically be used when available based on a run-time +// test; if not, the generic C versions are used as a fall-back. On ARM targets, +// the typical path is to have separate builds for NEON and non-NEON devices +// (at least this is true for iOS and Android). Therefore, the NEON support is +// toggled by a build flag: define STBI_NEON to get NEON loops. +// +// If for some reason you do not want to use any of SIMD code, or if +// you have issues compiling it, you can disable it entirely by +// defining STBI_NO_SIMD. +// +// =========================================================================== +// +// HDR image support (disable by defining STBI_NO_HDR) +// +// stb_image supports loading HDR images in general, and currently the Radiance +// .HDR file format specifically. You can still load any file through the existing +// interface; if you attempt to load an HDR file, it will be automatically remapped +// to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; +// both of these constants can be reconfigured through this interface: +// +// stbi_hdr_to_ldr_gamma(2.2f); +// stbi_hdr_to_ldr_scale(1.0f); +// +// (note, do not use _inverse_ constants; stbi_image will invert them +// appropriately). +// +// Additionally, there is a new, parallel interface for loading files as +// (linear) floats to preserve the full dynamic range: +// +// float *data = stbi_loadf(filename, &x, &y, &n, 0); +// +// If you load LDR images through this interface, those images will +// be promoted to floating point values, run through the inverse of +// constants corresponding to the above: +// +// stbi_ldr_to_hdr_scale(1.0f); +// stbi_ldr_to_hdr_gamma(2.2f); +// +// Finally, given a filename (or an open file or memory block--see header +// file for details) containing image data, you can query for the "most +// appropriate" interface to use (that is, whether the image is HDR or +// not), using: +// +// stbi_is_hdr(char *filename); +// +// =========================================================================== +// +// iPhone PNG support: +// +// We optionally support converting iPhone-formatted PNGs (which store +// premultiplied BGRA) back to RGB, even though they're internally encoded +// differently. To enable this conversion, call +// stbi_convert_iphone_png_to_rgb(1). +// +// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per +// pixel to remove any premultiplied alpha *only* if the image file explicitly +// says there's premultiplied data (currently only happens in iPhone images, +// and only if iPhone convert-to-rgb processing is on). +// +// =========================================================================== +// +// ADDITIONAL CONFIGURATION +// +// - You can suppress implementation of any of the decoders to reduce +// your code footprint by #defining one or more of the following +// symbols before creating the implementation. +// +// STBI_NO_JPEG +// STBI_NO_PNG +// STBI_NO_BMP +// STBI_NO_PSD +// STBI_NO_TGA +// STBI_NO_GIF +// STBI_NO_HDR +// STBI_NO_PIC +// STBI_NO_PNM (.ppm and .pgm) +// +// - You can request *only* certain decoders and suppress all other ones +// (this will be more forward-compatible, as addition of new decoders +// doesn't require you to disable them explicitly): +// +// STBI_ONLY_JPEG +// STBI_ONLY_PNG +// STBI_ONLY_BMP +// STBI_ONLY_PSD +// STBI_ONLY_TGA +// STBI_ONLY_GIF +// STBI_ONLY_HDR +// STBI_ONLY_PIC +// STBI_ONLY_PNM (.ppm and .pgm) +// +// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still +// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB +// +// - If you define STBI_MAX_DIMENSIONS, stb_image will reject images greater +// than that size (in either width or height) without further processing. +// This is to let programs in the wild set an upper bound to prevent +// denial-of-service attacks on untrusted data, as one could generate a +// valid image of gigantic dimensions and force stb_image to allocate a +// huge block of memory and spend disproportionate time decoding it. By +// default this is set to (1 << 24), which is 16777216, but that's still +// very big. + +#ifndef STBI_NO_STDIO +#include +#endif // STBI_NO_STDIO + +#define STBI_VERSION 1 + +enum +{ + STBI_default = 0, // only used for desired_channels + + STBI_grey = 1, + STBI_grey_alpha = 2, + STBI_rgb = 3, + STBI_rgb_alpha = 4 +}; + +#include +typedef unsigned char stbi_uc; +typedef unsigned short stbi_us; + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef STBIDEF +#ifdef STB_IMAGE_STATIC +#define STBIDEF static +#else +#define STBIDEF extern +#endif +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// PRIMARY API - works on images of any type +// + +// +// load image by filename, open file, or memory buffer +// + +typedef struct +{ + int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read + void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative + int (*eof) (void *user); // returns nonzero if we are at end of file/data +} stbi_io_callbacks; + +//////////////////////////////////// +// +// 8-bits-per-channel interface +// + +STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +// for stbi_load_from_file, file pointer is left pointing immediately after image +#endif + +#ifndef STBI_NO_GIF +STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp); +#endif + +#ifdef STBI_WINDOWS_UTF8 +STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input); +#endif + +//////////////////////////////////// +// +// 16-bits-per-channel interface +// + +STBIDEF stbi_us *stbi_load_16_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_us *stbi_load_16 (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +#endif + +//////////////////////////////////// +// +// float-per-channel interface +// +#ifndef STBI_NO_LINEAR + STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + + #ifndef STBI_NO_STDIO + STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); + #endif +#endif + +#ifndef STBI_NO_HDR + STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); + STBIDEF void stbi_hdr_to_ldr_scale(float scale); +#endif // STBI_NO_HDR + +#ifndef STBI_NO_LINEAR + STBIDEF void stbi_ldr_to_hdr_gamma(float gamma); + STBIDEF void stbi_ldr_to_hdr_scale(float scale); +#endif // STBI_NO_LINEAR + +// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename); +STBIDEF int stbi_is_hdr_from_file(FILE *f); +#endif // STBI_NO_STDIO + + +// get a VERY brief reason for failure +// on most compilers (and ALL modern mainstream compilers) this is threadsafe +STBIDEF const char *stbi_failure_reason (void); + +// free the loaded image -- this is just free() +STBIDEF void stbi_image_free (void *retval_from_stbi_load); + +// get image dimensions & components without fully decoding +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len); +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user); + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); +STBIDEF int stbi_is_16_bit (char const *filename); +STBIDEF int stbi_is_16_bit_from_file(FILE *f); +#endif + + + +// for image formats that explicitly notate that they have premultiplied alpha, +// we just return the colors as stored in the file. set this flag to force +// unpremultiplication. results are undefined if the unpremultiply overflow. +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); + +// indicate whether we should process iphone images back to canonical format, +// or just pass them through "as-is" +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); + +// flip the image vertically, so the first pixel in the output array is the bottom left +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip); + +// as above, but only applies to images loaded on the thread that calls the function +// this function is only available if your compiler supports thread-local variables; +// calling it will fail to link if your compiler doesn't +STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply); +STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert); +STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip); + +// ZLIB client - used by PNG, available for other purposes + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header); +STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + +STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + + +#ifdef __cplusplus +} +#endif + +// +// +//// end header file ///////////////////////////////////////////////////// +#endif // STBI_INCLUDE_STB_IMAGE_H + +#ifdef STB_IMAGE_IMPLEMENTATION + +#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ + || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ + || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ + || defined(STBI_ONLY_ZLIB) + #ifndef STBI_ONLY_JPEG + #define STBI_NO_JPEG + #endif + #ifndef STBI_ONLY_PNG + #define STBI_NO_PNG + #endif + #ifndef STBI_ONLY_BMP + #define STBI_NO_BMP + #endif + #ifndef STBI_ONLY_PSD + #define STBI_NO_PSD + #endif + #ifndef STBI_ONLY_TGA + #define STBI_NO_TGA + #endif + #ifndef STBI_ONLY_GIF + #define STBI_NO_GIF + #endif + #ifndef STBI_ONLY_HDR + #define STBI_NO_HDR + #endif + #ifndef STBI_ONLY_PIC + #define STBI_NO_PIC + #endif + #ifndef STBI_ONLY_PNM + #define STBI_NO_PNM + #endif +#endif + +#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) +#define STBI_NO_ZLIB +#endif + + +#include +#include // ptrdiff_t on osx +#include +#include +#include + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +#include // ldexp, pow +#endif + +#ifndef STBI_NO_STDIO +#include +#endif + +#ifndef STBI_ASSERT +#include +#define STBI_ASSERT(x) assert(x) +#endif + +#ifdef __cplusplus +#define STBI_EXTERN extern "C" +#else +#define STBI_EXTERN extern +#endif + + +#ifndef _MSC_VER + #ifdef __cplusplus + #define stbi_inline inline + #else + #define stbi_inline + #endif +#else + #define stbi_inline __forceinline +#endif + +#ifndef STBI_NO_THREAD_LOCALS + #if defined(__cplusplus) && __cplusplus >= 201103L + #define STBI_THREAD_LOCAL thread_local + #elif defined(__GNUC__) && __GNUC__ < 5 + #define STBI_THREAD_LOCAL __thread + #elif defined(_MSC_VER) + #define STBI_THREAD_LOCAL __declspec(thread) + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__) + #define STBI_THREAD_LOCAL _Thread_local + #endif + + #ifndef STBI_THREAD_LOCAL + #if defined(__GNUC__) + #define STBI_THREAD_LOCAL __thread + #endif + #endif +#endif + +#if defined(_MSC_VER) || defined(__SYMBIAN32__) +typedef unsigned short stbi__uint16; +typedef signed short stbi__int16; +typedef unsigned int stbi__uint32; +typedef signed int stbi__int32; +#else +#include +typedef uint16_t stbi__uint16; +typedef int16_t stbi__int16; +typedef uint32_t stbi__uint32; +typedef int32_t stbi__int32; +#endif + +// should produce compiler error if size is wrong +typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; + +#ifdef _MSC_VER +#define STBI_NOTUSED(v) (void)(v) +#else +#define STBI_NOTUSED(v) (void)sizeof(v) +#endif + +#ifdef _MSC_VER +#define STBI_HAS_LROTL +#endif + +#ifdef STBI_HAS_LROTL + #define stbi_lrot(x,y) _lrotl(x,y) +#else + #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (-(y) & 31))) +#endif + +#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) +// ok +#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) +// ok +#else +#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." +#endif + +#ifndef STBI_MALLOC +#define STBI_MALLOC(sz) malloc(sz) +#define STBI_REALLOC(p,newsz) realloc(p,newsz) +#define STBI_FREE(p) free(p) +#endif + +#ifndef STBI_REALLOC_SIZED +#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) +#endif + +// x86/x64 detection +#if defined(__x86_64__) || defined(_M_X64) +#define STBI__X64_TARGET +#elif defined(__i386) || defined(_M_IX86) +#define STBI__X86_TARGET +#endif + +#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) +// gcc doesn't support sse2 intrinsics unless you compile with -msse2, +// which in turn means it gets to use SSE2 everywhere. This is unfortunate, +// but previous attempts to provide the SSE2 functions with runtime +// detection caused numerous issues. The way architecture extensions are +// exposed in GCC/Clang is, sadly, not really suited for one-file libs. +// New behavior: if compiled with -msse2, we use SSE2 without any +// detection; if not, we don't use it at all. +#define STBI_NO_SIMD +#endif + +#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) +// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET +// +// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the +// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant. +// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not +// simultaneously enabling "-mstackrealign". +// +// See https://github.com/nothings/stb/issues/81 for more information. +// +// So default to no SSE2 on 32-bit MinGW. If you've read this far and added +// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2. +#define STBI_NO_SIMD +#endif + +#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) +#define STBI_SSE2 +#include + +#ifdef _MSC_VER + +#if _MSC_VER >= 1400 // not VC6 +#include // __cpuid +static int stbi__cpuid3(void) +{ + int info[4]; + __cpuid(info,1); + return info[3]; +} +#else +static int stbi__cpuid3(void) +{ + int res; + __asm { + mov eax,1 + cpuid + mov res,edx + } + return res; +} +#endif + +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name + +#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) +static int stbi__sse2_available(void) +{ + int info3 = stbi__cpuid3(); + return ((info3 >> 26) & 1) != 0; +} +#endif + +#else // assume GCC-style if not VC++ +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) + +#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) +static int stbi__sse2_available(void) +{ + // If we're even attempting to compile this on GCC/Clang, that means + // -msse2 is on, which means the compiler is allowed to use SSE2 + // instructions at will, and so are we. + return 1; +} +#endif + +#endif +#endif + +// ARM NEON +#if defined(STBI_NO_SIMD) && defined(STBI_NEON) +#undef STBI_NEON +#endif + +#ifdef STBI_NEON +#include +#ifdef _MSC_VER +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name +#else +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) +#endif +#endif + +#ifndef STBI_SIMD_ALIGN +#define STBI_SIMD_ALIGN(type, name) type name +#endif + +#ifndef STBI_MAX_DIMENSIONS +#define STBI_MAX_DIMENSIONS (1 << 24) +#endif + +/////////////////////////////////////////////// +// +// stbi__context struct and start_xxx functions + +// stbi__context structure is our basic context used by all images, so it +// contains all the IO context, plus some basic image information +typedef struct +{ + stbi__uint32 img_x, img_y; + int img_n, img_out_n; + + stbi_io_callbacks io; + void *io_user_data; + + int read_from_callbacks; + int buflen; + stbi_uc buffer_start[128]; + int callback_already_read; + + stbi_uc *img_buffer, *img_buffer_end; + stbi_uc *img_buffer_original, *img_buffer_original_end; +} stbi__context; + + +static void stbi__refill_buffer(stbi__context *s); + +// initialize a memory-decode context +static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len) +{ + s->io.read = NULL; + s->read_from_callbacks = 0; + s->callback_already_read = 0; + s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; + s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len; +} + +// initialize a callback-based context +static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user) +{ + s->io = *c; + s->io_user_data = user; + s->buflen = sizeof(s->buffer_start); + s->read_from_callbacks = 1; + s->callback_already_read = 0; + s->img_buffer = s->img_buffer_original = s->buffer_start; + stbi__refill_buffer(s); + s->img_buffer_original_end = s->img_buffer_end; +} + +#ifndef STBI_NO_STDIO + +static int stbi__stdio_read(void *user, char *data, int size) +{ + return (int) fread(data,1,size,(FILE*) user); +} + +static void stbi__stdio_skip(void *user, int n) +{ + int ch; + fseek((FILE*) user, n, SEEK_CUR); + ch = fgetc((FILE*) user); /* have to read a byte to reset feof()'s flag */ + if (ch != EOF) { + ungetc(ch, (FILE *) user); /* push byte back onto stream if valid. */ + } +} + +static int stbi__stdio_eof(void *user) +{ + return feof((FILE*) user) || ferror((FILE *) user); +} + +static stbi_io_callbacks stbi__stdio_callbacks = +{ + stbi__stdio_read, + stbi__stdio_skip, + stbi__stdio_eof, +}; + +static void stbi__start_file(stbi__context *s, FILE *f) +{ + stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f); +} + +//static void stop_file(stbi__context *s) { } + +#endif // !STBI_NO_STDIO + +static void stbi__rewind(stbi__context *s) +{ + // conceptually rewind SHOULD rewind to the beginning of the stream, + // but we just rewind to the beginning of the initial buffer, because + // we only use it after doing 'test', which only ever looks at at most 92 bytes + s->img_buffer = s->img_buffer_original; + s->img_buffer_end = s->img_buffer_original_end; +} + +enum +{ + STBI_ORDER_RGB, + STBI_ORDER_BGR +}; + +typedef struct +{ + int bits_per_channel; + int num_channels; + int channel_order; +} stbi__result_info; + +#ifndef STBI_NO_JPEG +static int stbi__jpeg_test(stbi__context *s); +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNG +static int stbi__png_test(stbi__context *s); +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__png_is16(stbi__context *s); +#endif + +#ifndef STBI_NO_BMP +static int stbi__bmp_test(stbi__context *s); +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_TGA +static int stbi__tga_test(stbi__context *s); +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context *s); +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc); +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__psd_is16(stbi__context *s); +#endif + +#ifndef STBI_NO_HDR +static int stbi__hdr_test(stbi__context *s); +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_test(stbi__context *s); +static void *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_GIF +static int stbi__gif_test(stbi__context *s); +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp); +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNM +static int stbi__pnm_test(stbi__context *s); +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__pnm_is16(stbi__context *s); +#endif + +static +#ifdef STBI_THREAD_LOCAL +STBI_THREAD_LOCAL +#endif +const char *stbi__g_failure_reason; + +STBIDEF const char *stbi_failure_reason(void) +{ + return stbi__g_failure_reason; +} + +#ifndef STBI_NO_FAILURE_STRINGS +static int stbi__err(const char *str) +{ + stbi__g_failure_reason = str; + return 0; +} +#endif + +static void *stbi__malloc(size_t size) +{ + return STBI_MALLOC(size); +} + +// stb_image uses ints pervasively, including for offset calculations. +// therefore the largest decoded image size we can support with the +// current code, even on 64-bit targets, is INT_MAX. this is not a +// significant limitation for the intended use case. +// +// we do, however, need to make sure our size calculations don't +// overflow. hence a few helper functions for size calculations that +// multiply integers together, making sure that they're non-negative +// and no overflow occurs. + +// return 1 if the sum is valid, 0 on overflow. +// negative terms are considered invalid. +static int stbi__addsizes_valid(int a, int b) +{ + if (b < 0) return 0; + // now 0 <= b <= INT_MAX, hence also + // 0 <= INT_MAX - b <= INTMAX. + // And "a + b <= INT_MAX" (which might overflow) is the + // same as a <= INT_MAX - b (no overflow) + return a <= INT_MAX - b; +} + +// returns 1 if the product is valid, 0 on overflow. +// negative factors are considered invalid. +static int stbi__mul2sizes_valid(int a, int b) +{ + if (a < 0 || b < 0) return 0; + if (b == 0) return 1; // mul-by-0 is always safe + // portable way to check for no overflows in a*b + return a <= INT_MAX/b; +} + +#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) +// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow +static int stbi__mad2sizes_valid(int a, int b, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add); +} +#endif + +// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow +static int stbi__mad3sizes_valid(int a, int b, int c, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__addsizes_valid(a*b*c, add); +} + +// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) +static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add); +} +#endif + +#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) +// mallocs with size overflow checking +static void *stbi__malloc_mad2(int a, int b, int add) +{ + if (!stbi__mad2sizes_valid(a, b, add)) return NULL; + return stbi__malloc(a*b + add); +} +#endif + +static void *stbi__malloc_mad3(int a, int b, int c, int add) +{ + if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL; + return stbi__malloc(a*b*c + add); +} + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) +static void *stbi__malloc_mad4(int a, int b, int c, int d, int add) +{ + if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL; + return stbi__malloc(a*b*c*d + add); +} +#endif + +// returns 1 if the sum of two signed ints is valid (between -2^31 and 2^31-1 inclusive), 0 on overflow. +static int stbi__addints_valid(int a, int b) +{ + if ((a >= 0) != (b >= 0)) return 1; // a and b have different signs, so no overflow + if (a < 0 && b < 0) return a >= INT_MIN - b; // same as a + b >= INT_MIN; INT_MIN - b cannot overflow since b < 0. + return a <= INT_MAX - b; +} + +// returns 1 if the product of two ints fits in a signed short, 0 on overflow. +static int stbi__mul2shorts_valid(int a, int b) +{ + if (b == 0 || b == -1) return 1; // multiplication by 0 is always 0; check for -1 so SHRT_MIN/b doesn't overflow + if ((a >= 0) == (b >= 0)) return a <= SHRT_MAX/b; // product is positive, so similar to mul2sizes_valid + if (b < 0) return a <= SHRT_MIN / b; // same as a * b >= SHRT_MIN + return a >= SHRT_MIN / b; +} + +// stbi__err - error +// stbi__errpf - error returning pointer to float +// stbi__errpuc - error returning pointer to unsigned char + +#ifdef STBI_NO_FAILURE_STRINGS + #define stbi__err(x,y) 0 +#elif defined(STBI_FAILURE_USERMSG) + #define stbi__err(x,y) stbi__err(y) +#else + #define stbi__err(x,y) stbi__err(x) +#endif + +#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL)) +#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL)) + +STBIDEF void stbi_image_free(void *retval_from_stbi_load) +{ + STBI_FREE(retval_from_stbi_load); +} + +#ifndef STBI_NO_LINEAR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp); +#endif + +#ifndef STBI_NO_HDR +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp); +#endif + +static int stbi__vertically_flip_on_load_global = 0; + +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) +{ + stbi__vertically_flip_on_load_global = flag_true_if_should_flip; +} + +#ifndef STBI_THREAD_LOCAL +#define stbi__vertically_flip_on_load stbi__vertically_flip_on_load_global +#else +static STBI_THREAD_LOCAL int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set; + +STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip) +{ + stbi__vertically_flip_on_load_local = flag_true_if_should_flip; + stbi__vertically_flip_on_load_set = 1; +} + +#define stbi__vertically_flip_on_load (stbi__vertically_flip_on_load_set \ + ? stbi__vertically_flip_on_load_local \ + : stbi__vertically_flip_on_load_global) +#endif // STBI_THREAD_LOCAL + +static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields + ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed + ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order + ri->num_channels = 0; + + // test the formats with a very explicit header first (at least a FOURCC + // or distinctive magic number first) + #ifndef STBI_NO_PNG + if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_BMP + if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_GIF + if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PSD + if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc); + #else + STBI_NOTUSED(bpc); + #endif + #ifndef STBI_NO_PIC + if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri); + #endif + + // then the formats that can end up attempting to load with just 1 or 2 + // bytes matching expectations; these are prone to false positives, so + // try them later + #ifndef STBI_NO_JPEG + if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PNM + if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri); + #endif + + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri); + return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); + } + #endif + + #ifndef STBI_NO_TGA + // test tga last because it's a crappy test! + if (stbi__tga_test(s)) + return stbi__tga_load(s,x,y,comp,req_comp, ri); + #endif + + return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); +} + +static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi_uc *reduced; + + reduced = (stbi_uc *) stbi__malloc(img_len); + if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling + + STBI_FREE(orig); + return reduced; +} + +static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi__uint16 *enlarged; + + enlarged = (stbi__uint16 *) stbi__malloc(img_len*2); + if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff + + STBI_FREE(orig); + return enlarged; +} + +static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel) +{ + int row; + size_t bytes_per_row = (size_t)w * bytes_per_pixel; + stbi_uc temp[2048]; + stbi_uc *bytes = (stbi_uc *)image; + + for (row = 0; row < (h>>1); row++) { + stbi_uc *row0 = bytes + row*bytes_per_row; + stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row; + // swap row0 with row1 + size_t bytes_left = bytes_per_row; + while (bytes_left) { + size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp); + memcpy(temp, row0, bytes_copy); + memcpy(row0, row1, bytes_copy); + memcpy(row1, temp, bytes_copy); + row0 += bytes_copy; + row1 += bytes_copy; + bytes_left -= bytes_copy; + } + } +} + +#ifndef STBI_NO_GIF +static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel) +{ + int slice; + int slice_size = w * h * bytes_per_pixel; + + stbi_uc *bytes = (stbi_uc *)image; + for (slice = 0; slice < z; ++slice) { + stbi__vertical_flip(bytes, w, h, bytes_per_pixel); + bytes += slice_size; + } +} +#endif + +static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8); + + if (result == NULL) + return NULL; + + // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. + STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); + + if (ri.bits_per_channel != 8) { + result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 8; + } + + // @TODO: move stbi__convert_format to here + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc)); + } + + return (unsigned char *) result; +} + +static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16); + + if (result == NULL) + return NULL; + + // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. + STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); + + if (ri.bits_per_channel != 16) { + result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 16; + } + + // @TODO: move stbi__convert_format16 to here + // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16)); + } + + return (stbi__uint16 *) result; +} + +#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR) +static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp) +{ + if (stbi__vertically_flip_on_load && result != NULL) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(float)); + } +} +#endif + +#ifndef STBI_NO_STDIO + +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) +STBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide); +STBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); +#endif + +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) +STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input) +{ + return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL); +} +#endif + +static FILE *stbi__fopen(char const *filename, char const *mode) +{ + FILE *f; +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) + wchar_t wMode[64]; + wchar_t wFilename[1024]; + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename))) + return 0; + + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode))) + return 0; + +#if defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != _wfopen_s(&f, wFilename, wMode)) + f = 0; +#else + f = _wfopen(wFilename, wMode); +#endif + +#elif defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != fopen_s(&f, filename, mode)) + f=0; +#else + f = fopen(filename, mode); +#endif + return f; +} + + +STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + unsigned char *result; + if (!f) return stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__uint16 *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + stbi__uint16 *result; + if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file_16(f,x,y,comp,req_comp); + fclose(f); + return result; +} + + +#endif //!STBI_NO_STDIO + +STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); +} + +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_GIF +STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_mem(&s,buffer,len); + + result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp); + if (stbi__vertically_flip_on_load) { + stbi__vertical_flip_slices( result, *x, *y, *z, *comp ); + } + + return result; +} +#endif + +#ifndef STBI_NO_LINEAR +static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *data; + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + stbi__result_info ri; + float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri); + if (hdr_data) + stbi__float_postprocess(hdr_data,x,y,comp,req_comp); + return hdr_data; + } + #endif + data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp); + if (data) + return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); + return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); +} + +STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} + +STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_STDIO +STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + float *result; + FILE *f = stbi__fopen(filename, "rb"); + if (!f) return stbi__errpf("can't fopen", "Unable to open file"); + result = stbi_loadf_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_file(&s,f); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} +#endif // !STBI_NO_STDIO + +#endif // !STBI_NO_LINEAR + +// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is +// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always +// reports false! + +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(buffer); + STBI_NOTUSED(len); + return 0; + #endif +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result=0; + if (f) { + result = stbi_is_hdr_from_file(f); + fclose(f); + } + return result; +} + +STBIDEF int stbi_is_hdr_from_file(FILE *f) +{ + #ifndef STBI_NO_HDR + long pos = ftell(f); + int res; + stbi__context s; + stbi__start_file(&s,f); + res = stbi__hdr_test(&s); + fseek(f, pos, SEEK_SET); + return res; + #else + STBI_NOTUSED(f); + return 0; + #endif +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(clbk); + STBI_NOTUSED(user); + return 0; + #endif +} + +#ifndef STBI_NO_LINEAR +static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f; + +STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } +STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } +#endif + +static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f; + +STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; } +STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; } + + +////////////////////////////////////////////////////////////////////////////// +// +// Common code used by all image loaders +// + +enum +{ + STBI__SCAN_load=0, + STBI__SCAN_type, + STBI__SCAN_header +}; + +static void stbi__refill_buffer(stbi__context *s) +{ + int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); + s->callback_already_read += (int) (s->img_buffer - s->img_buffer_original); + if (n == 0) { + // at end of file, treat same as if from memory, but need to handle case + // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file + s->read_from_callbacks = 0; + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start+1; + *s->img_buffer = 0; + } else { + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start + n; + } +} + +stbi_inline static stbi_uc stbi__get8(stbi__context *s) +{ + if (s->img_buffer < s->img_buffer_end) + return *s->img_buffer++; + if (s->read_from_callbacks) { + stbi__refill_buffer(s); + return *s->img_buffer++; + } + return 0; +} + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +stbi_inline static int stbi__at_eof(stbi__context *s) +{ + if (s->io.read) { + if (!(s->io.eof)(s->io_user_data)) return 0; + // if feof() is true, check if buffer = end + // special case: we've only got the special 0 character at the end + if (s->read_from_callbacks == 0) return 1; + } + + return s->img_buffer >= s->img_buffer_end; +} +#endif + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) +// nothing +#else +static void stbi__skip(stbi__context *s, int n) +{ + if (n == 0) return; // already there! + if (n < 0) { + s->img_buffer = s->img_buffer_end; + return; + } + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + s->img_buffer = s->img_buffer_end; + (s->io.skip)(s->io_user_data, n - blen); + return; + } + } + s->img_buffer += n; +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM) +// nothing +#else +static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n) +{ + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + int res, count; + + memcpy(buffer, s->img_buffer, blen); + + count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen); + res = (count == (n-blen)); + s->img_buffer = s->img_buffer_end; + return res; + } + } + + if (s->img_buffer+n <= s->img_buffer_end) { + memcpy(buffer, s->img_buffer, n); + s->img_buffer += n; + return 1; + } else + return 0; +} +#endif + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) +// nothing +#else +static int stbi__get16be(stbi__context *s) +{ + int z = stbi__get8(s); + return (z << 8) + stbi__get8(s); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) +// nothing +#else +static stbi__uint32 stbi__get32be(stbi__context *s) +{ + stbi__uint32 z = stbi__get16be(s); + return (z << 16) + stbi__get16be(s); +} +#endif + +#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) +// nothing +#else +static int stbi__get16le(stbi__context *s) +{ + int z = stbi__get8(s); + return z + (stbi__get8(s) << 8); +} +#endif + +#ifndef STBI_NO_BMP +static stbi__uint32 stbi__get32le(stbi__context *s) +{ + stbi__uint32 z = stbi__get16le(s); + z += (stbi__uint32)stbi__get16le(s) << 16; + return z; +} +#endif + +#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +////////////////////////////////////////////////////////////////////////////// +// +// generic converter from built-in img_n to req_comp +// individual types do this automatically as much as possible (e.g. jpeg +// does all cases internally since it needs to colorspace convert anyway, +// and it never has alpha, so very few cases ). png can automatically +// interleave an alpha=255 channel, but falls back to this for other cases +// +// assume data buffer is malloced, so malloc a new one and free that one +// only failure mode is malloc failing + +static stbi_uc stbi__compute_y(int r, int g, int b) +{ + return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + unsigned char *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0); + if (good == NULL) { + STBI_FREE(data); + return stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + unsigned char *src = data + j * x * img_n ; + unsigned char *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=255; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=255; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=255; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = 255; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; + default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return stbi__errpuc("unsupported", "Unsupported format conversion"); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) +// nothing +#else +static stbi__uint16 stbi__compute_y_16(int r, int g, int b) +{ + return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) +// nothing +#else +static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + stbi__uint16 *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2); + if (good == NULL) { + STBI_FREE(data); + return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + stbi__uint16 *src = data + j * x * img_n ; + stbi__uint16 *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=0xffff; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; + default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return (stbi__uint16*) stbi__errpuc("unsupported", "Unsupported format conversion"); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} +#endif + +#ifndef STBI_NO_LINEAR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) +{ + int i,k,n; + float *output; + if (!data) return NULL; + output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0); + if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale); + } + } + if (n < comp) { + for (i=0; i < x*y; ++i) { + output[i*comp + n] = data[i*comp + n]/255.0f; + } + } + STBI_FREE(data); + return output; +} +#endif + +#ifndef STBI_NO_HDR +#define stbi__float2int(x) ((int) (x)) +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) +{ + int i,k,n; + stbi_uc *output; + if (!data) return NULL; + output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0); + if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + if (k < comp) { + float z = data[i*comp+k] * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + } + STBI_FREE(data); + return output; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// "baseline" JPEG/JFIF decoder +// +// simple implementation +// - doesn't support delayed output of y-dimension +// - simple interface (only one output format: 8-bit interleaved RGB) +// - doesn't try to recover corrupt jpegs +// - doesn't allow partial loading, loading multiple at once +// - still fast on x86 (copying globals into locals doesn't help x86) +// - allocates lots of intermediate memory (full size of all components) +// - non-interleaved case requires this anyway +// - allows good upsampling (see next) +// high-quality +// - upsampled channels are bilinearly interpolated, even across blocks +// - quality integer IDCT derived from IJG's 'slow' +// performance +// - fast huffman; reasonable integer IDCT +// - some SIMD kernels for common paths on targets with SSE2/NEON +// - uses a lot of intermediate memory, could cache poorly + +#ifndef STBI_NO_JPEG + +// huffman decoding acceleration +#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache + +typedef struct +{ + stbi_uc fast[1 << FAST_BITS]; + // weirdly, repacking this into AoS is a 10% speed loss, instead of a win + stbi__uint16 code[256]; + stbi_uc values[256]; + stbi_uc size[257]; + unsigned int maxcode[18]; + int delta[17]; // old 'firstsymbol' - old 'firstcode' +} stbi__huffman; + +typedef struct +{ + stbi__context *s; + stbi__huffman huff_dc[4]; + stbi__huffman huff_ac[4]; + stbi__uint16 dequant[4][64]; + stbi__int16 fast_ac[4][1 << FAST_BITS]; + +// sizes for components, interleaved MCUs + int img_h_max, img_v_max; + int img_mcu_x, img_mcu_y; + int img_mcu_w, img_mcu_h; + +// definition of jpeg image component + struct + { + int id; + int h,v; + int tq; + int hd,ha; + int dc_pred; + + int x,y,w2,h2; + stbi_uc *data; + void *raw_data, *raw_coeff; + stbi_uc *linebuf; + short *coeff; // progressive only + int coeff_w, coeff_h; // number of 8x8 coefficient blocks + } img_comp[4]; + + stbi__uint32 code_buffer; // jpeg entropy-coded buffer + int code_bits; // number of valid bits + unsigned char marker; // marker seen while filling entropy buffer + int nomore; // flag if we saw a marker so must stop + + int progressive; + int spec_start; + int spec_end; + int succ_high; + int succ_low; + int eob_run; + int jfif; + int app14_color_transform; // Adobe APP14 tag + int rgb; + + int scan_n, order[4]; + int restart_interval, todo; + +// kernels + void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]); + void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step); + stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs); +} stbi__jpeg; + +static int stbi__build_huffman(stbi__huffman *h, int *count) +{ + int i,j,k=0; + unsigned int code; + // build size list for each symbol (from JPEG spec) + for (i=0; i < 16; ++i) { + for (j=0; j < count[i]; ++j) { + h->size[k++] = (stbi_uc) (i+1); + if(k >= 257) return stbi__err("bad size list","Corrupt JPEG"); + } + } + h->size[k] = 0; + + // compute actual symbols (from jpeg spec) + code = 0; + k = 0; + for(j=1; j <= 16; ++j) { + // compute delta to add to code to compute symbol id + h->delta[j] = k - code; + if (h->size[k] == j) { + while (h->size[k] == j) + h->code[k++] = (stbi__uint16) (code++); + if (code-1 >= (1u << j)) return stbi__err("bad code lengths","Corrupt JPEG"); + } + // compute largest code + 1 for this size, preshifted as needed later + h->maxcode[j] = code << (16-j); + code <<= 1; + } + h->maxcode[j] = 0xffffffff; + + // build non-spec acceleration table; 255 is flag for not-accelerated + memset(h->fast, 255, 1 << FAST_BITS); + for (i=0; i < k; ++i) { + int s = h->size[i]; + if (s <= FAST_BITS) { + int c = h->code[i] << (FAST_BITS-s); + int m = 1 << (FAST_BITS-s); + for (j=0; j < m; ++j) { + h->fast[c+j] = (stbi_uc) i; + } + } + } + return 1; +} + +// build a table that decodes both magnitude and value of small ACs in +// one go. +static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) +{ + int i; + for (i=0; i < (1 << FAST_BITS); ++i) { + stbi_uc fast = h->fast[i]; + fast_ac[i] = 0; + if (fast < 255) { + int rs = h->values[fast]; + int run = (rs >> 4) & 15; + int magbits = rs & 15; + int len = h->size[fast]; + + if (magbits && len + magbits <= FAST_BITS) { + // magnitude code followed by receive_extend code + int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); + int m = 1 << (magbits - 1); + if (k < m) k += (~0U << magbits) + 1; + // if the result is small enough, we can fit it in fast_ac table + if (k >= -128 && k <= 127) + fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits)); + } + } + } +} + +static void stbi__grow_buffer_unsafe(stbi__jpeg *j) +{ + do { + unsigned int b = j->nomore ? 0 : stbi__get8(j->s); + if (b == 0xff) { + int c = stbi__get8(j->s); + while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes + if (c != 0) { + j->marker = (unsigned char) c; + j->nomore = 1; + return; + } + } + j->code_buffer |= b << (24 - j->code_bits); + j->code_bits += 8; + } while (j->code_bits <= 24); +} + +// (1 << n) - 1 +static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; + +// decode a jpeg huffman value from the bitstream +stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) +{ + unsigned int temp; + int c,k; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + // look at the top FAST_BITS and determine what symbol ID it is, + // if the code is <= FAST_BITS + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + k = h->fast[c]; + if (k < 255) { + int s = h->size[k]; + if (s > j->code_bits) + return -1; + j->code_buffer <<= s; + j->code_bits -= s; + return h->values[k]; + } + + // naive test is to shift the code_buffer down so k bits are + // valid, then test against maxcode. To speed this up, we've + // preshifted maxcode left so that it has (16-k) 0s at the + // end; in other words, regardless of the number of bits, it + // wants to be compared against something shifted to have 16; + // that way we don't need to shift inside the loop. + temp = j->code_buffer >> 16; + for (k=FAST_BITS+1 ; ; ++k) + if (temp < h->maxcode[k]) + break; + if (k == 17) { + // error! code not found + j->code_bits -= 16; + return -1; + } + + if (k > j->code_bits) + return -1; + + // convert the huffman code to the symbol id + c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k]; + if(c < 0 || c >= 256) // symbol id out of bounds! + return -1; + STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]); + + // convert the id to a symbol + j->code_bits -= k; + j->code_buffer <<= k; + return h->values[c]; +} + +// bias[n] = (-1<code_bits < n) stbi__grow_buffer_unsafe(j); + if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing + + sgn = j->code_buffer >> 31; // sign bit always in MSB; 0 if MSB clear (positive), 1 if MSB set (negative) + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k + (stbi__jbias[n] & (sgn - 1)); +} + +// get some unsigned bits +stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n) +{ + unsigned int k; + if (j->code_bits < n) stbi__grow_buffer_unsafe(j); + if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k; +} + +stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j) +{ + unsigned int k; + if (j->code_bits < 1) stbi__grow_buffer_unsafe(j); + if (j->code_bits < 1) return 0; // ran out of bits from stream, return 0s intead of continuing + k = j->code_buffer; + j->code_buffer <<= 1; + --j->code_bits; + return k & 0x80000000; +} + +// given a value that's at position X in the zigzag stream, +// where does it appear in the 8x8 matrix coded as row-major? +static const stbi_uc stbi__jpeg_dezigzag[64+15] = +{ + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + // let corrupt input sample past end + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63 +}; + +// decode one 64-entry block-- +static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi__uint16 *dequant) +{ + int diff,dc,k; + int t; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + t = stbi__jpeg_huff_decode(j, hdc); + if (t < 0 || t > 15) return stbi__err("bad huffman code","Corrupt JPEG"); + + // 0 all the ac values now so we can do it 32-bits at a time + memset(data,0,64*sizeof(data[0])); + + diff = t ? stbi__extend_receive(j, t) : 0; + if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta","Corrupt JPEG"); + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + if (!stbi__mul2shorts_valid(dc, dequant[0])) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + data[0] = (short) (dc * dequant[0]); + + // decode AC components, see JPEG spec + k = 1; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available"); + j->code_buffer <<= s; + j->code_bits -= s; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) * dequant[zig]); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (rs != 0xf0) break; // end block + k += 16; + } else { + k += r; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]); + } + } + } while (k < 64); + return 1; +} + +static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b) +{ + int diff,dc; + int t; + if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + if (j->succ_high == 0) { + // first scan for DC coefficient, must be first + memset(data,0,64*sizeof(data[0])); // 0 all the ac values now + t = stbi__jpeg_huff_decode(j, hdc); + if (t < 0 || t > 15) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + diff = t ? stbi__extend_receive(j, t) : 0; + + if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta", "Corrupt JPEG"); + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + if (!stbi__mul2shorts_valid(dc, 1 << j->succ_low)) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + data[0] = (short) (dc * (1 << j->succ_low)); + } else { + // refinement scan for DC coefficient + if (stbi__jpeg_get_bit(j)) + data[0] += (short) (1 << j->succ_low); + } + return 1; +} + +// @OPTIMIZE: store non-zigzagged during the decode passes, +// and only de-zigzag when dequantizing +static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac) +{ + int k; + if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->succ_high == 0) { + int shift = j->succ_low; + + if (j->eob_run) { + --j->eob_run; + return 1; + } + + k = j->spec_start; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available"); + j->code_buffer <<= s; + j->code_bits -= s; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) * (1 << shift)); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r); + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + --j->eob_run; + break; + } + k += 16; + } else { + k += r; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) * (1 << shift)); + } + } + } while (k <= j->spec_end); + } else { + // refinement scan for these AC coefficients + + short bit = (short) (1 << j->succ_low); + + if (j->eob_run) { + --j->eob_run; + for (k = j->spec_start; k <= j->spec_end; ++k) { + short *p = &data[stbi__jpeg_dezigzag[k]]; + if (*p != 0) + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } + } else { + k = j->spec_start; + do { + int r,s; + int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r) - 1; + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + r = 64; // force end of block + } else { + // r=15 s=0 should write 16 0s, so we just do + // a run of 15 0s and then write s (which is 0), + // so we don't have to do anything special here + } + } else { + if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG"); + // sign bit + if (stbi__jpeg_get_bit(j)) + s = bit; + else + s = -bit; + } + + // advance by r + while (k <= j->spec_end) { + short *p = &data[stbi__jpeg_dezigzag[k++]]; + if (*p != 0) { + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } else { + if (r == 0) { + *p = (short) s; + break; + } + --r; + } + } + } while (k <= j->spec_end); + } + } + return 1; +} + +// take a -128..127 value and stbi__clamp it and convert to 0..255 +stbi_inline static stbi_uc stbi__clamp(int x) +{ + // trick to use a single test to catch both cases + if ((unsigned int) x > 255) { + if (x < 0) return 0; + if (x > 255) return 255; + } + return (stbi_uc) x; +} + +#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) +#define stbi__fsh(x) ((x) * 4096) + +// derived from jidctint -- DCT_ISLOW +#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ + int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ + p2 = s2; \ + p3 = s6; \ + p1 = (p2+p3) * stbi__f2f(0.5411961f); \ + t2 = p1 + p3*stbi__f2f(-1.847759065f); \ + t3 = p1 + p2*stbi__f2f( 0.765366865f); \ + p2 = s0; \ + p3 = s4; \ + t0 = stbi__fsh(p2+p3); \ + t1 = stbi__fsh(p2-p3); \ + x0 = t0+t3; \ + x3 = t0-t3; \ + x1 = t1+t2; \ + x2 = t1-t2; \ + t0 = s7; \ + t1 = s5; \ + t2 = s3; \ + t3 = s1; \ + p3 = t0+t2; \ + p4 = t1+t3; \ + p1 = t0+t3; \ + p2 = t1+t2; \ + p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ + t0 = t0*stbi__f2f( 0.298631336f); \ + t1 = t1*stbi__f2f( 2.053119869f); \ + t2 = t2*stbi__f2f( 3.072711026f); \ + t3 = t3*stbi__f2f( 1.501321110f); \ + p1 = p5 + p1*stbi__f2f(-0.899976223f); \ + p2 = p5 + p2*stbi__f2f(-2.562915447f); \ + p3 = p3*stbi__f2f(-1.961570560f); \ + p4 = p4*stbi__f2f(-0.390180644f); \ + t3 += p1+p4; \ + t2 += p2+p3; \ + t1 += p2+p4; \ + t0 += p1+p3; + +static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64]) +{ + int i,val[64],*v=val; + stbi_uc *o; + short *d = data; + + // columns + for (i=0; i < 8; ++i,++d, ++v) { + // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing + if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 + && d[40]==0 && d[48]==0 && d[56]==0) { + // no shortcut 0 seconds + // (1|2|3|4|5|6|7)==0 0 seconds + // all separate -0.047 seconds + // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds + int dcterm = d[0]*4; + v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; + } else { + STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56]) + // constants scaled things up by 1<<12; let's bring them back + // down, but keep 2 extra bits of precision + x0 += 512; x1 += 512; x2 += 512; x3 += 512; + v[ 0] = (x0+t3) >> 10; + v[56] = (x0-t3) >> 10; + v[ 8] = (x1+t2) >> 10; + v[48] = (x1-t2) >> 10; + v[16] = (x2+t1) >> 10; + v[40] = (x2-t1) >> 10; + v[24] = (x3+t0) >> 10; + v[32] = (x3-t0) >> 10; + } + } + + for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { + // no fast case since the first 1D IDCT spread components out + STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) + // constants scaled things up by 1<<12, plus we had 1<<2 from first + // loop, plus horizontal and vertical each scale by sqrt(8) so together + // we've got an extra 1<<3, so 1<<17 total we need to remove. + // so we want to round that, which means adding 0.5 * 1<<17, + // aka 65536. Also, we'll end up with -128 to 127 that we want + // to encode as 0..255 by adding 128, so we'll add that before the shift + x0 += 65536 + (128<<17); + x1 += 65536 + (128<<17); + x2 += 65536 + (128<<17); + x3 += 65536 + (128<<17); + // tried computing the shifts into temps, or'ing the temps to see + // if any were out of range, but that was slower + o[0] = stbi__clamp((x0+t3) >> 17); + o[7] = stbi__clamp((x0-t3) >> 17); + o[1] = stbi__clamp((x1+t2) >> 17); + o[6] = stbi__clamp((x1-t2) >> 17); + o[2] = stbi__clamp((x2+t1) >> 17); + o[5] = stbi__clamp((x2-t1) >> 17); + o[3] = stbi__clamp((x3+t0) >> 17); + o[4] = stbi__clamp((x3-t0) >> 17); + } +} + +#ifdef STBI_SSE2 +// sse2 integer IDCT. not the fastest possible implementation but it +// produces bit-identical results to the generic C version so it's +// fully "transparent". +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + // This is constructed to match our regular (generic) integer IDCT exactly. + __m128i row0, row1, row2, row3, row4, row5, row6, row7; + __m128i tmp; + + // dot product constant: even elems=x, odd elems=y + #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) + + // out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) + // out(1) = c1[even]*x + c1[odd]*y + #define dct_rot(out0,out1, x,y,c0,c1) \ + __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ + __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ + __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ + __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ + __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ + __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) + + // out = in << 12 (in 16-bit, out 32-bit) + #define dct_widen(out, in) \ + __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ + __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) + + // wide add + #define dct_wadd(out, a, b) \ + __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_add_epi32(a##_h, b##_h) + + // wide sub + #define dct_wsub(out, a, b) \ + __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) + + // butterfly a/b, add bias, then shift by "s" and pack + #define dct_bfly32o(out0, out1, a,b,bias,s) \ + { \ + __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ + __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ + dct_wadd(sum, abiased, b); \ + dct_wsub(dif, abiased, b); \ + out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ + out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ + } + + // 8-bit interleave step (for transposes) + #define dct_interleave8(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi8(a, b); \ + b = _mm_unpackhi_epi8(tmp, b) + + // 16-bit interleave step (for transposes) + #define dct_interleave16(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi16(a, b); \ + b = _mm_unpackhi_epi16(tmp, b) + + #define dct_pass(bias,shift) \ + { \ + /* even part */ \ + dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ + __m128i sum04 = _mm_add_epi16(row0, row4); \ + __m128i dif04 = _mm_sub_epi16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ + dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ + __m128i sum17 = _mm_add_epi16(row1, row7); \ + __m128i sum35 = _mm_add_epi16(row3, row5); \ + dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ + dct_wadd(x4, y0o, y4o); \ + dct_wadd(x5, y1o, y5o); \ + dct_wadd(x6, y2o, y5o); \ + dct_wadd(x7, y3o, y4o); \ + dct_bfly32o(row0,row7, x0,x7,bias,shift); \ + dct_bfly32o(row1,row6, x1,x6,bias,shift); \ + dct_bfly32o(row2,row5, x2,x5,bias,shift); \ + dct_bfly32o(row3,row4, x3,x4,bias,shift); \ + } + + __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f)); + __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f)); + __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f)); + __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f)); + __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f)); + __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f)); + __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f)); + __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f)); + + // rounding biases in column/row passes, see stbi__idct_block for explanation. + __m128i bias_0 = _mm_set1_epi32(512); + __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17)); + + // load + row0 = _mm_load_si128((const __m128i *) (data + 0*8)); + row1 = _mm_load_si128((const __m128i *) (data + 1*8)); + row2 = _mm_load_si128((const __m128i *) (data + 2*8)); + row3 = _mm_load_si128((const __m128i *) (data + 3*8)); + row4 = _mm_load_si128((const __m128i *) (data + 4*8)); + row5 = _mm_load_si128((const __m128i *) (data + 5*8)); + row6 = _mm_load_si128((const __m128i *) (data + 6*8)); + row7 = _mm_load_si128((const __m128i *) (data + 7*8)); + + // column pass + dct_pass(bias_0, 10); + + { + // 16bit 8x8 transpose pass 1 + dct_interleave16(row0, row4); + dct_interleave16(row1, row5); + dct_interleave16(row2, row6); + dct_interleave16(row3, row7); + + // transpose pass 2 + dct_interleave16(row0, row2); + dct_interleave16(row1, row3); + dct_interleave16(row4, row6); + dct_interleave16(row5, row7); + + // transpose pass 3 + dct_interleave16(row0, row1); + dct_interleave16(row2, row3); + dct_interleave16(row4, row5); + dct_interleave16(row6, row7); + } + + // row pass + dct_pass(bias_1, 17); + + { + // pack + __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7 + __m128i p1 = _mm_packus_epi16(row2, row3); + __m128i p2 = _mm_packus_epi16(row4, row5); + __m128i p3 = _mm_packus_epi16(row6, row7); + + // 8bit 8x8 transpose pass 1 + dct_interleave8(p0, p2); // a0e0a1e1... + dct_interleave8(p1, p3); // c0g0c1g1... + + // transpose pass 2 + dct_interleave8(p0, p1); // a0c0e0g0... + dct_interleave8(p2, p3); // b0d0f0h0... + + // transpose pass 3 + dct_interleave8(p0, p2); // a0b0c0d0... + dct_interleave8(p1, p3); // a4b4c4d4... + + // store + _mm_storel_epi64((__m128i *) out, p0); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p2); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p1); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p3); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e)); + } + +#undef dct_const +#undef dct_rot +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_interleave8 +#undef dct_interleave16 +#undef dct_pass +} + +#endif // STBI_SSE2 + +#ifdef STBI_NEON + +// NEON integer IDCT. should produce bit-identical +// results to the generic C version. +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + int16x8_t row0, row1, row2, row3, row4, row5, row6, row7; + + int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f)); + int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f)); + int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f)); + int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f)); + int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f)); + int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f)); + int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f)); + int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f)); + int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f)); + int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f)); + int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f)); + int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f)); + +#define dct_long_mul(out, inq, coeff) \ + int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) + +#define dct_long_mac(out, acc, inq, coeff) \ + int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) + +#define dct_widen(out, inq) \ + int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ + int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) + +// wide add +#define dct_wadd(out, a, b) \ + int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vaddq_s32(a##_h, b##_h) + +// wide sub +#define dct_wsub(out, a, b) \ + int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vsubq_s32(a##_h, b##_h) + +// butterfly a/b, then shift using "shiftop" by "s" and pack +#define dct_bfly32o(out0,out1, a,b,shiftop,s) \ + { \ + dct_wadd(sum, a, b); \ + dct_wsub(dif, a, b); \ + out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ + out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ + } + +#define dct_pass(shiftop, shift) \ + { \ + /* even part */ \ + int16x8_t sum26 = vaddq_s16(row2, row6); \ + dct_long_mul(p1e, sum26, rot0_0); \ + dct_long_mac(t2e, p1e, row6, rot0_1); \ + dct_long_mac(t3e, p1e, row2, rot0_2); \ + int16x8_t sum04 = vaddq_s16(row0, row4); \ + int16x8_t dif04 = vsubq_s16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + int16x8_t sum15 = vaddq_s16(row1, row5); \ + int16x8_t sum17 = vaddq_s16(row1, row7); \ + int16x8_t sum35 = vaddq_s16(row3, row5); \ + int16x8_t sum37 = vaddq_s16(row3, row7); \ + int16x8_t sumodd = vaddq_s16(sum17, sum35); \ + dct_long_mul(p5o, sumodd, rot1_0); \ + dct_long_mac(p1o, p5o, sum17, rot1_1); \ + dct_long_mac(p2o, p5o, sum35, rot1_2); \ + dct_long_mul(p3o, sum37, rot2_0); \ + dct_long_mul(p4o, sum15, rot2_1); \ + dct_wadd(sump13o, p1o, p3o); \ + dct_wadd(sump24o, p2o, p4o); \ + dct_wadd(sump23o, p2o, p3o); \ + dct_wadd(sump14o, p1o, p4o); \ + dct_long_mac(x4, sump13o, row7, rot3_0); \ + dct_long_mac(x5, sump24o, row5, rot3_1); \ + dct_long_mac(x6, sump23o, row3, rot3_2); \ + dct_long_mac(x7, sump14o, row1, rot3_3); \ + dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ + dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ + dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ + dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ + } + + // load + row0 = vld1q_s16(data + 0*8); + row1 = vld1q_s16(data + 1*8); + row2 = vld1q_s16(data + 2*8); + row3 = vld1q_s16(data + 3*8); + row4 = vld1q_s16(data + 4*8); + row5 = vld1q_s16(data + 5*8); + row6 = vld1q_s16(data + 6*8); + row7 = vld1q_s16(data + 7*8); + + // add DC bias + row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0)); + + // column pass + dct_pass(vrshrn_n_s32, 10); + + // 16bit 8x8 transpose + { +// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. +// whether compilers actually get this is another story, sadly. +#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); } +#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); } + + // pass 1 + dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6 + dct_trn16(row2, row3); + dct_trn16(row4, row5); + dct_trn16(row6, row7); + + // pass 2 + dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4 + dct_trn32(row1, row3); + dct_trn32(row4, row6); + dct_trn32(row5, row7); + + // pass 3 + dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0 + dct_trn64(row1, row5); + dct_trn64(row2, row6); + dct_trn64(row3, row7); + +#undef dct_trn16 +#undef dct_trn32 +#undef dct_trn64 + } + + // row pass + // vrshrn_n_s32 only supports shifts up to 16, we need + // 17. so do a non-rounding shift of 16 first then follow + // up with a rounding shift by 1. + dct_pass(vshrn_n_s32, 16); + + { + // pack and round + uint8x8_t p0 = vqrshrun_n_s16(row0, 1); + uint8x8_t p1 = vqrshrun_n_s16(row1, 1); + uint8x8_t p2 = vqrshrun_n_s16(row2, 1); + uint8x8_t p3 = vqrshrun_n_s16(row3, 1); + uint8x8_t p4 = vqrshrun_n_s16(row4, 1); + uint8x8_t p5 = vqrshrun_n_s16(row5, 1); + uint8x8_t p6 = vqrshrun_n_s16(row6, 1); + uint8x8_t p7 = vqrshrun_n_s16(row7, 1); + + // again, these can translate into one instruction, but often don't. +#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); } +#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); } + + // sadly can't use interleaved stores here since we only write + // 8 bytes to each scan line! + + // 8x8 8-bit transpose pass 1 + dct_trn8_8(p0, p1); + dct_trn8_8(p2, p3); + dct_trn8_8(p4, p5); + dct_trn8_8(p6, p7); + + // pass 2 + dct_trn8_16(p0, p2); + dct_trn8_16(p1, p3); + dct_trn8_16(p4, p6); + dct_trn8_16(p5, p7); + + // pass 3 + dct_trn8_32(p0, p4); + dct_trn8_32(p1, p5); + dct_trn8_32(p2, p6); + dct_trn8_32(p3, p7); + + // store + vst1_u8(out, p0); out += out_stride; + vst1_u8(out, p1); out += out_stride; + vst1_u8(out, p2); out += out_stride; + vst1_u8(out, p3); out += out_stride; + vst1_u8(out, p4); out += out_stride; + vst1_u8(out, p5); out += out_stride; + vst1_u8(out, p6); out += out_stride; + vst1_u8(out, p7); + +#undef dct_trn8_8 +#undef dct_trn8_16 +#undef dct_trn8_32 + } + +#undef dct_long_mul +#undef dct_long_mac +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_pass +} + +#endif // STBI_NEON + +#define STBI__MARKER_none 0xff +// if there's a pending marker from the entropy stream, return that +// otherwise, fetch from the stream and get a marker. if there's no +// marker, return 0xff, which is never a valid marker value +static stbi_uc stbi__get_marker(stbi__jpeg *j) +{ + stbi_uc x; + if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; } + x = stbi__get8(j->s); + if (x != 0xff) return STBI__MARKER_none; + while (x == 0xff) + x = stbi__get8(j->s); // consume repeated 0xff fill bytes + return x; +} + +// in each scan, we'll have scan_n components, and the order +// of the components is specified by order[] +#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) + +// after a restart interval, stbi__jpeg_reset the entropy decoder and +// the dc prediction +static void stbi__jpeg_reset(stbi__jpeg *j) +{ + j->code_bits = 0; + j->code_buffer = 0; + j->nomore = 0; + j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0; + j->marker = STBI__MARKER_none; + j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; + j->eob_run = 0; + // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, + // since we don't even allow 1<<30 pixels +} + +static int stbi__parse_entropy_coded_data(stbi__jpeg *z) +{ + stbi__jpeg_reset(z); + if (!z->progressive) { + if (z->scan_n == 1) { + int i,j; + STBI_SIMD_ALIGN(short, data[64]); + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + // if it's NOT a restart, then just bail, so we get corrupt data + // rather than no data + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + STBI_SIMD_ALIGN(short, data[64]); + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x)*8; + int y2 = (j*z->img_comp[n].v + y)*8; + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data); + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } else { + if (z->scan_n == 1) { + int i,j; + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + if (z->spec_start == 0) { + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } else { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha])) + return 0; + } + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x); + int y2 = (j*z->img_comp[n].v + y); + short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w); + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } +} + +static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant) +{ + int i; + for (i=0; i < 64; ++i) + data[i] *= dequant[i]; +} + +static void stbi__jpeg_finish(stbi__jpeg *z) +{ + if (z->progressive) { + // dequantize and idct the data + int i,j,n; + for (n=0; n < z->s->img_n; ++n) { + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]); + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + } + } + } + } +} + +static int stbi__process_marker(stbi__jpeg *z, int m) +{ + int L; + switch (m) { + case STBI__MARKER_none: // no marker found + return stbi__err("expected marker","Corrupt JPEG"); + + case 0xDD: // DRI - specify restart interval + if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG"); + z->restart_interval = stbi__get16be(z->s); + return 1; + + case 0xDB: // DQT - define quantization table + L = stbi__get16be(z->s)-2; + while (L > 0) { + int q = stbi__get8(z->s); + int p = q >> 4, sixteen = (p != 0); + int t = q & 15,i; + if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG"); + if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG"); + + for (i=0; i < 64; ++i) + z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s)); + L -= (sixteen ? 129 : 65); + } + return L==0; + + case 0xC4: // DHT - define huffman table + L = stbi__get16be(z->s)-2; + while (L > 0) { + stbi_uc *v; + int sizes[16],i,n=0; + int q = stbi__get8(z->s); + int tc = q >> 4; + int th = q & 15; + if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG"); + for (i=0; i < 16; ++i) { + sizes[i] = stbi__get8(z->s); + n += sizes[i]; + } + if(n > 256) return stbi__err("bad DHT header","Corrupt JPEG"); // Loop over i < n would write past end of values! + L -= 17; + if (tc == 0) { + if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0; + v = z->huff_dc[th].values; + } else { + if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0; + v = z->huff_ac[th].values; + } + for (i=0; i < n; ++i) + v[i] = stbi__get8(z->s); + if (tc != 0) + stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th); + L -= n; + } + return L==0; + } + + // check for comment block or APP blocks + if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { + L = stbi__get16be(z->s); + if (L < 2) { + if (m == 0xFE) + return stbi__err("bad COM len","Corrupt JPEG"); + else + return stbi__err("bad APP len","Corrupt JPEG"); + } + L -= 2; + + if (m == 0xE0 && L >= 5) { // JFIF APP0 segment + static const unsigned char tag[5] = {'J','F','I','F','\0'}; + int ok = 1; + int i; + for (i=0; i < 5; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 5; + if (ok) + z->jfif = 1; + } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment + static const unsigned char tag[6] = {'A','d','o','b','e','\0'}; + int ok = 1; + int i; + for (i=0; i < 6; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 6; + if (ok) { + stbi__get8(z->s); // version + stbi__get16be(z->s); // flags0 + stbi__get16be(z->s); // flags1 + z->app14_color_transform = stbi__get8(z->s); // color transform + L -= 6; + } + } + + stbi__skip(z->s, L); + return 1; + } + + return stbi__err("unknown marker","Corrupt JPEG"); +} + +// after we see SOS +static int stbi__process_scan_header(stbi__jpeg *z) +{ + int i; + int Ls = stbi__get16be(z->s); + z->scan_n = stbi__get8(z->s); + if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad SOS component count","Corrupt JPEG"); + if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG"); + for (i=0; i < z->scan_n; ++i) { + int id = stbi__get8(z->s), which; + int q = stbi__get8(z->s); + for (which = 0; which < z->s->img_n; ++which) + if (z->img_comp[which].id == id) + break; + if (which == z->s->img_n) return 0; // no match + z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG"); + z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG"); + z->order[i] = which; + } + + { + int aa; + z->spec_start = stbi__get8(z->s); + z->spec_end = stbi__get8(z->s); // should be 63, but might be 0 + aa = stbi__get8(z->s); + z->succ_high = (aa >> 4); + z->succ_low = (aa & 15); + if (z->progressive) { + if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13) + return stbi__err("bad SOS", "Corrupt JPEG"); + } else { + if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG"); + if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG"); + z->spec_end = 63; + } + } + + return 1; +} + +static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why) +{ + int i; + for (i=0; i < ncomp; ++i) { + if (z->img_comp[i].raw_data) { + STBI_FREE(z->img_comp[i].raw_data); + z->img_comp[i].raw_data = NULL; + z->img_comp[i].data = NULL; + } + if (z->img_comp[i].raw_coeff) { + STBI_FREE(z->img_comp[i].raw_coeff); + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].coeff = 0; + } + if (z->img_comp[i].linebuf) { + STBI_FREE(z->img_comp[i].linebuf); + z->img_comp[i].linebuf = NULL; + } + } + return why; +} + +static int stbi__process_frame_header(stbi__jpeg *z, int scan) +{ + stbi__context *s = z->s; + int Lf,p,i,q, h_max=1,v_max=1,c; + Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG + p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline + s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG + s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + c = stbi__get8(s); + if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG"); + s->img_n = c; + for (i=0; i < c; ++i) { + z->img_comp[i].data = NULL; + z->img_comp[i].linebuf = NULL; + } + + if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG"); + + z->rgb = 0; + for (i=0; i < s->img_n; ++i) { + static const unsigned char rgb[3] = { 'R', 'G', 'B' }; + z->img_comp[i].id = stbi__get8(s); + if (s->img_n == 3 && z->img_comp[i].id == rgb[i]) + ++z->rgb; + q = stbi__get8(s); + z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG"); + z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG"); + z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG"); + } + + if (scan != STBI__SCAN_load) return 1; + + if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode"); + + for (i=0; i < s->img_n; ++i) { + if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; + if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; + } + + // check that plane subsampling factors are integer ratios; our resamplers can't deal with fractional ratios + // and I've never seen a non-corrupted JPEG file actually use them + for (i=0; i < s->img_n; ++i) { + if (h_max % z->img_comp[i].h != 0) return stbi__err("bad H","Corrupt JPEG"); + if (v_max % z->img_comp[i].v != 0) return stbi__err("bad V","Corrupt JPEG"); + } + + // compute interleaved mcu info + z->img_h_max = h_max; + z->img_v_max = v_max; + z->img_mcu_w = h_max * 8; + z->img_mcu_h = v_max * 8; + // these sizes can't be more than 17 bits + z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; + z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; + + for (i=0; i < s->img_n; ++i) { + // number of effective pixels (e.g. for non-interleaved MCU) + z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; + z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; + // to simplify generation, we'll allocate enough memory to decode + // the bogus oversized data from using interleaved MCUs and their + // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't + // discard the extra data until colorspace conversion + // + // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier) + // so these muls can't overflow with 32-bit ints (which we require) + z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; + z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; + z->img_comp[i].coeff = 0; + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].linebuf = NULL; + z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15); + if (z->img_comp[i].raw_data == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); + // align blocks for idct using mmx/sse + z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); + if (z->progressive) { + // w2, h2 are multiples of 8 (see above) + z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8; + z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8; + z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15); + if (z->img_comp[i].raw_coeff == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); + z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15); + } + } + + return 1; +} + +// use comparisons since in some cases we handle more than one case (e.g. SOF) +#define stbi__DNL(x) ((x) == 0xdc) +#define stbi__SOI(x) ((x) == 0xd8) +#define stbi__EOI(x) ((x) == 0xd9) +#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) +#define stbi__SOS(x) ((x) == 0xda) + +#define stbi__SOF_progressive(x) ((x) == 0xc2) + +static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) +{ + int m; + z->jfif = 0; + z->app14_color_transform = -1; // valid values are 0,1,2 + z->marker = STBI__MARKER_none; // initialize cached marker to empty + m = stbi__get_marker(z); + if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG"); + if (scan == STBI__SCAN_type) return 1; + m = stbi__get_marker(z); + while (!stbi__SOF(m)) { + if (!stbi__process_marker(z,m)) return 0; + m = stbi__get_marker(z); + while (m == STBI__MARKER_none) { + // some files have extra padding after their blocks, so ok, we'll scan + if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG"); + m = stbi__get_marker(z); + } + } + z->progressive = stbi__SOF_progressive(m); + if (!stbi__process_frame_header(z, scan)) return 0; + return 1; +} + +static stbi_uc stbi__skip_jpeg_junk_at_end(stbi__jpeg *j) +{ + // some JPEGs have junk at end, skip over it but if we find what looks + // like a valid marker, resume there + while (!stbi__at_eof(j->s)) { + stbi_uc x = stbi__get8(j->s); + while (x == 0xff) { // might be a marker + if (stbi__at_eof(j->s)) return STBI__MARKER_none; + x = stbi__get8(j->s); + if (x != 0x00 && x != 0xff) { + // not a stuffed zero or lead-in to another marker, looks + // like an actual marker, return it + return x; + } + // stuffed zero has x=0 now which ends the loop, meaning we go + // back to regular scan loop. + // repeated 0xff keeps trying to read the next byte of the marker. + } + } + return STBI__MARKER_none; +} + +// decode image to YCbCr format +static int stbi__decode_jpeg_image(stbi__jpeg *j) +{ + int m; + for (m = 0; m < 4; m++) { + j->img_comp[m].raw_data = NULL; + j->img_comp[m].raw_coeff = NULL; + } + j->restart_interval = 0; + if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0; + m = stbi__get_marker(j); + while (!stbi__EOI(m)) { + if (stbi__SOS(m)) { + if (!stbi__process_scan_header(j)) return 0; + if (!stbi__parse_entropy_coded_data(j)) return 0; + if (j->marker == STBI__MARKER_none ) { + j->marker = stbi__skip_jpeg_junk_at_end(j); + // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 + } + m = stbi__get_marker(j); + if (STBI__RESTART(m)) + m = stbi__get_marker(j); + } else if (stbi__DNL(m)) { + int Ld = stbi__get16be(j->s); + stbi__uint32 NL = stbi__get16be(j->s); + if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG"); + if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG"); + m = stbi__get_marker(j); + } else { + if (!stbi__process_marker(j, m)) return 1; + m = stbi__get_marker(j); + } + } + if (j->progressive) + stbi__jpeg_finish(j); + return 1; +} + +// static jfif-centered resampling (across block boundaries) + +typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1, + int w, int hs); + +#define stbi__div4(x) ((stbi_uc) ((x) >> 2)) + +static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + STBI_NOTUSED(out); + STBI_NOTUSED(in_far); + STBI_NOTUSED(w); + STBI_NOTUSED(hs); + return in_near; +} + +static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples vertically for every one in input + int i; + STBI_NOTUSED(hs); + for (i=0; i < w; ++i) + out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2); + return out; +} + +static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples horizontally for every one in input + int i; + stbi_uc *input = in_near; + + if (w == 1) { + // if only one sample, can't do any interpolation + out[0] = out[1] = input[0]; + return out; + } + + out[0] = input[0]; + out[1] = stbi__div4(input[0]*3 + input[1] + 2); + for (i=1; i < w-1; ++i) { + int n = 3*input[i]+2; + out[i*2+0] = stbi__div4(n+input[i-1]); + out[i*2+1] = stbi__div4(n+input[i+1]); + } + out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2); + out[i*2+1] = input[w-1]; + + STBI_NOTUSED(in_far); + STBI_NOTUSED(hs); + + return out; +} + +#define stbi__div16(x) ((stbi_uc) ((x) >> 4)) + +static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i,t0,t1; + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + out[0] = stbi__div4(t1+2); + for (i=1; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i=0,t0,t1; + + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + // process groups of 8 pixels for as long as we can. + // note we can't handle the last pixel in a row in this loop + // because we need to handle the filter boundary conditions. + for (; i < ((w-1) & ~7); i += 8) { +#if defined(STBI_SSE2) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + __m128i zero = _mm_setzero_si128(); + __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i)); + __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i)); + __m128i farw = _mm_unpacklo_epi8(farb, zero); + __m128i nearw = _mm_unpacklo_epi8(nearb, zero); + __m128i diff = _mm_sub_epi16(farw, nearw); + __m128i nears = _mm_slli_epi16(nearw, 2); + __m128i curr = _mm_add_epi16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + __m128i prv0 = _mm_slli_si128(curr, 2); + __m128i nxt0 = _mm_srli_si128(curr, 2); + __m128i prev = _mm_insert_epi16(prv0, t1, 0); + __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + __m128i bias = _mm_set1_epi16(8); + __m128i curs = _mm_slli_epi16(curr, 2); + __m128i prvd = _mm_sub_epi16(prev, curr); + __m128i nxtd = _mm_sub_epi16(next, curr); + __m128i curb = _mm_add_epi16(curs, bias); + __m128i even = _mm_add_epi16(prvd, curb); + __m128i odd = _mm_add_epi16(nxtd, curb); + + // interleave even and odd pixels, then undo scaling. + __m128i int0 = _mm_unpacklo_epi16(even, odd); + __m128i int1 = _mm_unpackhi_epi16(even, odd); + __m128i de0 = _mm_srli_epi16(int0, 4); + __m128i de1 = _mm_srli_epi16(int1, 4); + + // pack and write output + __m128i outv = _mm_packus_epi16(de0, de1); + _mm_storeu_si128((__m128i *) (out + i*2), outv); +#elif defined(STBI_NEON) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + uint8x8_t farb = vld1_u8(in_far + i); + uint8x8_t nearb = vld1_u8(in_near + i); + int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb)); + int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2)); + int16x8_t curr = vaddq_s16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + int16x8_t prv0 = vextq_s16(curr, curr, 7); + int16x8_t nxt0 = vextq_s16(curr, curr, 1); + int16x8_t prev = vsetq_lane_s16(t1, prv0, 0); + int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + int16x8_t curs = vshlq_n_s16(curr, 2); + int16x8_t prvd = vsubq_s16(prev, curr); + int16x8_t nxtd = vsubq_s16(next, curr); + int16x8_t even = vaddq_s16(curs, prvd); + int16x8_t odd = vaddq_s16(curs, nxtd); + + // undo scaling and round, then store with even/odd phases interleaved + uint8x8x2_t o; + o.val[0] = vqrshrun_n_s16(even, 4); + o.val[1] = vqrshrun_n_s16(odd, 4); + vst2_u8(out + i*2, o); +#endif + + // "previous" value for next iter + t1 = 3*in_near[i+7] + in_far[i+7]; + } + + t0 = t1; + t1 = 3*in_near[i] + in_far[i]; + out[i*2] = stbi__div16(3*t1 + t0 + 8); + + for (++i; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} +#endif + +static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // resample with nearest-neighbor + int i,j; + STBI_NOTUSED(in_far); + for (i=0; i < w; ++i) + for (j=0; j < hs; ++j) + out[i*hs+j] = in_near[i]; + return out; +} + +// this is a reduced-precision calculation of YCbCr-to-RGB introduced +// to make sure the code produces the same results in both SIMD and scalar +#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) +static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) +{ + int i; + for (i=0; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step) +{ + int i = 0; + +#ifdef STBI_SSE2 + // step == 3 is pretty ugly on the final interleave, and i'm not convinced + // it's useful in practice (you wouldn't use it for textures, for example). + // so just accelerate step == 4 case. + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + __m128i signflip = _mm_set1_epi8(-0x80); + __m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f)); + __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f)); + __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f)); + __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f)); + __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128); + __m128i xw = _mm_set1_epi16(255); // alpha channel + + for (; i+7 < count; i += 8) { + // load + __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i)); + __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i)); + __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i)); + __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128 + __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128 + + // unpack to short (and left-shift cr, cb by 8) + __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes); + __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased); + __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased); + + // color transform + __m128i yws = _mm_srli_epi16(yw, 4); + __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw); + __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw); + __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1); + __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1); + __m128i rws = _mm_add_epi16(cr0, yws); + __m128i gwt = _mm_add_epi16(cb0, yws); + __m128i bws = _mm_add_epi16(yws, cb1); + __m128i gws = _mm_add_epi16(gwt, cr1); + + // descale + __m128i rw = _mm_srai_epi16(rws, 4); + __m128i bw = _mm_srai_epi16(bws, 4); + __m128i gw = _mm_srai_epi16(gws, 4); + + // back to byte, set up for transpose + __m128i brb = _mm_packus_epi16(rw, bw); + __m128i gxb = _mm_packus_epi16(gw, xw); + + // transpose to interleave channels + __m128i t0 = _mm_unpacklo_epi8(brb, gxb); + __m128i t1 = _mm_unpackhi_epi8(brb, gxb); + __m128i o0 = _mm_unpacklo_epi16(t0, t1); + __m128i o1 = _mm_unpackhi_epi16(t0, t1); + + // store + _mm_storeu_si128((__m128i *) (out + 0), o0); + _mm_storeu_si128((__m128i *) (out + 16), o1); + out += 32; + } + } +#endif + +#ifdef STBI_NEON + // in this version, step=3 support would be easy to add. but is there demand? + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + uint8x8_t signflip = vdup_n_u8(0x80); + int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f)); + int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f)); + int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f)); + int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f)); + + for (; i+7 < count; i += 8) { + // load + uint8x8_t y_bytes = vld1_u8(y + i); + uint8x8_t cr_bytes = vld1_u8(pcr + i); + uint8x8_t cb_bytes = vld1_u8(pcb + i); + int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip)); + int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip)); + + // expand to s16 + int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4)); + int16x8_t crw = vshll_n_s8(cr_biased, 7); + int16x8_t cbw = vshll_n_s8(cb_biased, 7); + + // color transform + int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0); + int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0); + int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1); + int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1); + int16x8_t rws = vaddq_s16(yws, cr0); + int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1); + int16x8_t bws = vaddq_s16(yws, cb1); + + // undo scaling, round, convert to byte + uint8x8x4_t o; + o.val[0] = vqrshrun_n_s16(rws, 4); + o.val[1] = vqrshrun_n_s16(gws, 4); + o.val[2] = vqrshrun_n_s16(bws, 4); + o.val[3] = vdup_n_u8(255); + + // store, interleaving r/g/b/a + vst4_u8(out, o); + out += 8*4; + } + } +#endif + + for (; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} +#endif + +// set up the kernels +static void stbi__setup_jpeg(stbi__jpeg *j) +{ + j->idct_block_kernel = stbi__idct_block; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2; + +#ifdef STBI_SSE2 + if (stbi__sse2_available()) { + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; + } +#endif + +#ifdef STBI_NEON + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; +#endif +} + +// clean up the temporary component buffers +static void stbi__cleanup_jpeg(stbi__jpeg *j) +{ + stbi__free_jpeg_components(j, j->s->img_n, 0); +} + +typedef struct +{ + resample_row_func resample; + stbi_uc *line0,*line1; + int hs,vs; // expansion factor in each axis + int w_lores; // horizontal pixels pre-expansion + int ystep; // how far through vertical expansion we are + int ypos; // which pre-expansion row we're on +} stbi__resample; + +// fast 0..255 * 0..255 => 0..255 rounded multiplication +static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y) +{ + unsigned int t = x*y + 128; + return (stbi_uc) ((t + (t >>8)) >> 8); +} + +static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) +{ + int n, decode_n, is_rgb; + z->s->img_n = 0; // make stbi__cleanup_jpeg safe + + // validate req_comp + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + + // load a jpeg image from whichever source, but leave in YCbCr format + if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } + + // determine actual number of components to generate + n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1; + + is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif)); + + if (z->s->img_n == 3 && n < 3 && !is_rgb) + decode_n = 1; + else + decode_n = z->s->img_n; + + // nothing to do if no components requested; check this now to avoid + // accessing uninitialized coutput[0] later + if (decode_n <= 0) { stbi__cleanup_jpeg(z); return NULL; } + + // resample and color-convert + { + int k; + unsigned int i,j; + stbi_uc *output; + stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL }; + + stbi__resample res_comp[4]; + + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + + // allocate line buffer big enough for upsampling off the edges + // with upsample factor of 4 + z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3); + if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + r->hs = z->img_h_max / z->img_comp[k].h; + r->vs = z->img_v_max / z->img_comp[k].v; + r->ystep = r->vs >> 1; + r->w_lores = (z->s->img_x + r->hs-1) / r->hs; + r->ypos = 0; + r->line0 = r->line1 = z->img_comp[k].data; + + if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; + else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2; + else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2; + else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel; + else r->resample = stbi__resample_row_generic; + } + + // can't error after this so, this is safe + output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1); + if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + // now go ahead and resample + for (j=0; j < z->s->img_y; ++j) { + stbi_uc *out = output + n * z->s->img_x * j; + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + int y_bot = r->ystep >= (r->vs >> 1); + coutput[k] = r->resample(z->img_comp[k].linebuf, + y_bot ? r->line1 : r->line0, + y_bot ? r->line0 : r->line1, + r->w_lores, r->hs); + if (++r->ystep >= r->vs) { + r->ystep = 0; + r->line0 = r->line1; + if (++r->ypos < z->img_comp[k].y) + r->line1 += z->img_comp[k].w2; + } + } + if (n >= 3) { + stbi_uc *y = coutput[0]; + if (z->s->img_n == 3) { + if (is_rgb) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = y[i]; + out[1] = coutput[1][i]; + out[2] = coutput[2][i]; + out[3] = 255; + out += n; + } + } else { + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else if (z->s->img_n == 4) { + if (z->app14_color_transform == 0) { // CMYK + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(coutput[0][i], m); + out[1] = stbi__blinn_8x8(coutput[1][i], m); + out[2] = stbi__blinn_8x8(coutput[2][i], m); + out[3] = 255; + out += n; + } + } else if (z->app14_color_transform == 2) { // YCCK + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(255 - out[0], m); + out[1] = stbi__blinn_8x8(255 - out[1], m); + out[2] = stbi__blinn_8x8(255 - out[2], m); + out += n; + } + } else { // YCbCr + alpha? Ignore the fourth channel for now + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else + for (i=0; i < z->s->img_x; ++i) { + out[0] = out[1] = out[2] = y[i]; + out[3] = 255; // not used if n==3 + out += n; + } + } else { + if (is_rgb) { + if (n == 1) + for (i=0; i < z->s->img_x; ++i) + *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + else { + for (i=0; i < z->s->img_x; ++i, out += 2) { + out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + out[1] = 255; + } + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 0) { + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + stbi_uc r = stbi__blinn_8x8(coutput[0][i], m); + stbi_uc g = stbi__blinn_8x8(coutput[1][i], m); + stbi_uc b = stbi__blinn_8x8(coutput[2][i], m); + out[0] = stbi__compute_y(r, g, b); + out[1] = 255; + out += n; + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 2) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]); + out[1] = 255; + out += n; + } + } else { + stbi_uc *y = coutput[0]; + if (n == 1) + for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; + else + for (i=0; i < z->s->img_x; ++i) { *out++ = y[i]; *out++ = 255; } + } + } + } + stbi__cleanup_jpeg(z); + *out_x = z->s->img_x; + *out_y = z->s->img_y; + if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output + return output; + } +} + +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + unsigned char* result; + stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg)); + if (!j) return stbi__errpuc("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); + STBI_NOTUSED(ri); + j->s = s; + stbi__setup_jpeg(j); + result = load_jpeg_image(j, x,y,comp,req_comp); + STBI_FREE(j); + return result; +} + +static int stbi__jpeg_test(stbi__context *s) +{ + int r; + stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg)); + if (!j) return stbi__err("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); + j->s = s; + stbi__setup_jpeg(j); + r = stbi__decode_jpeg_header(j, STBI__SCAN_type); + stbi__rewind(s); + STBI_FREE(j); + return r; +} + +static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp) +{ + if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) { + stbi__rewind( j->s ); + return 0; + } + if (x) *x = j->s->img_x; + if (y) *y = j->s->img_y; + if (comp) *comp = j->s->img_n >= 3 ? 3 : 1; + return 1; +} + +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) +{ + int result; + stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg))); + if (!j) return stbi__err("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); + j->s = s; + result = stbi__jpeg_info_raw(j, x, y, comp); + STBI_FREE(j); + return result; +} +#endif + +// public domain zlib decode v0.2 Sean Barrett 2006-11-18 +// simple implementation +// - all input must be provided in an upfront buffer +// - all output is written to a single output buffer (can malloc/realloc) +// performance +// - fast huffman + +#ifndef STBI_NO_ZLIB + +// fast-way is faster to check than jpeg huffman, but slow way is slower +#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables +#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) +#define STBI__ZNSYMS 288 // number of symbols in literal/length alphabet + +// zlib-style huffman encoding +// (jpegs packs from left, zlib from right, so can't share code) +typedef struct +{ + stbi__uint16 fast[1 << STBI__ZFAST_BITS]; + stbi__uint16 firstcode[16]; + int maxcode[17]; + stbi__uint16 firstsymbol[16]; + stbi_uc size[STBI__ZNSYMS]; + stbi__uint16 value[STBI__ZNSYMS]; +} stbi__zhuffman; + +stbi_inline static int stbi__bitreverse16(int n) +{ + n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); + n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); + n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); + n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); + return n; +} + +stbi_inline static int stbi__bit_reverse(int v, int bits) +{ + STBI_ASSERT(bits <= 16); + // to bit reverse n bits, reverse 16 and shift + // e.g. 11 bits, bit reverse and shift away 5 + return stbi__bitreverse16(v) >> (16-bits); +} + +static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num) +{ + int i,k=0; + int code, next_code[16], sizes[17]; + + // DEFLATE spec for generating codes + memset(sizes, 0, sizeof(sizes)); + memset(z->fast, 0, sizeof(z->fast)); + for (i=0; i < num; ++i) + ++sizes[sizelist[i]]; + sizes[0] = 0; + for (i=1; i < 16; ++i) + if (sizes[i] > (1 << i)) + return stbi__err("bad sizes", "Corrupt PNG"); + code = 0; + for (i=1; i < 16; ++i) { + next_code[i] = code; + z->firstcode[i] = (stbi__uint16) code; + z->firstsymbol[i] = (stbi__uint16) k; + code = (code + sizes[i]); + if (sizes[i]) + if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG"); + z->maxcode[i] = code << (16-i); // preshift for inner loop + code <<= 1; + k += sizes[i]; + } + z->maxcode[16] = 0x10000; // sentinel + for (i=0; i < num; ++i) { + int s = sizelist[i]; + if (s) { + int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; + stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i); + z->size [c] = (stbi_uc ) s; + z->value[c] = (stbi__uint16) i; + if (s <= STBI__ZFAST_BITS) { + int j = stbi__bit_reverse(next_code[s],s); + while (j < (1 << STBI__ZFAST_BITS)) { + z->fast[j] = fastv; + j += (1 << s); + } + } + ++next_code[s]; + } + } + return 1; +} + +// zlib-from-memory implementation for PNG reading +// because PNG allows splitting the zlib stream arbitrarily, +// and it's annoying structurally to have PNG call ZLIB call PNG, +// we require PNG read all the IDATs and combine them into a single +// memory buffer + +typedef struct +{ + stbi_uc *zbuffer, *zbuffer_end; + int num_bits; + int hit_zeof_once; + stbi__uint32 code_buffer; + + char *zout; + char *zout_start; + char *zout_end; + int z_expandable; + + stbi__zhuffman z_length, z_distance; +} stbi__zbuf; + +stbi_inline static int stbi__zeof(stbi__zbuf *z) +{ + return (z->zbuffer >= z->zbuffer_end); +} + +stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z) +{ + return stbi__zeof(z) ? 0 : *z->zbuffer++; +} + +static void stbi__fill_bits(stbi__zbuf *z) +{ + do { + if (z->code_buffer >= (1U << z->num_bits)) { + z->zbuffer = z->zbuffer_end; /* treat this as EOF so we fail. */ + return; + } + z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits; + z->num_bits += 8; + } while (z->num_bits <= 24); +} + +stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n) +{ + unsigned int k; + if (z->num_bits < n) stbi__fill_bits(z); + k = z->code_buffer & ((1 << n) - 1); + z->code_buffer >>= n; + z->num_bits -= n; + return k; +} + +static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s,k; + // not resolved by fast table, so compute it the slow way + // use jpeg approach, which requires MSbits at top + k = stbi__bit_reverse(a->code_buffer, 16); + for (s=STBI__ZFAST_BITS+1; ; ++s) + if (k < z->maxcode[s]) + break; + if (s >= 16) return -1; // invalid code! + // code size is s, so: + b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; + if (b >= STBI__ZNSYMS) return -1; // some data was corrupt somewhere! + if (z->size[b] != s) return -1; // was originally an assert, but report failure instead. + a->code_buffer >>= s; + a->num_bits -= s; + return z->value[b]; +} + +stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s; + if (a->num_bits < 16) { + if (stbi__zeof(a)) { + if (!a->hit_zeof_once) { + // This is the first time we hit eof, insert 16 extra padding btis + // to allow us to keep going; if we actually consume any of them + // though, that is invalid data. This is caught later. + a->hit_zeof_once = 1; + a->num_bits += 16; // add 16 implicit zero bits + } else { + // We already inserted our extra 16 padding bits and are again + // out, this stream is actually prematurely terminated. + return -1; + } + } else { + stbi__fill_bits(a); + } + } + b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; + if (b) { + s = b >> 9; + a->code_buffer >>= s; + a->num_bits -= s; + return b & 511; + } + return stbi__zhuffman_decode_slowpath(a, z); +} + +static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes +{ + char *q; + unsigned int cur, limit, old_limit; + z->zout = zout; + if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); + cur = (unsigned int) (z->zout - z->zout_start); + limit = old_limit = (unsigned) (z->zout_end - z->zout_start); + if (UINT_MAX - cur < (unsigned) n) return stbi__err("outofmem", "Out of memory"); + while (cur + n > limit) { + if(limit > UINT_MAX / 2) return stbi__err("outofmem", "Out of memory"); + limit *= 2; + } + q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); + STBI_NOTUSED(old_limit); + if (q == NULL) return stbi__err("outofmem", "Out of memory"); + z->zout_start = q; + z->zout = q + cur; + z->zout_end = q + limit; + return 1; +} + +static const int stbi__zlength_base[31] = { + 3,4,5,6,7,8,9,10,11,13, + 15,17,19,23,27,31,35,43,51,59, + 67,83,99,115,131,163,195,227,258,0,0 }; + +static const int stbi__zlength_extra[31]= +{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; + +static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, +257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; + +static const int stbi__zdist_extra[32] = +{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +static int stbi__parse_huffman_block(stbi__zbuf *a) +{ + char *zout = a->zout; + for(;;) { + int z = stbi__zhuffman_decode(a, &a->z_length); + if (z < 256) { + if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes + if (zout >= a->zout_end) { + if (!stbi__zexpand(a, zout, 1)) return 0; + zout = a->zout; + } + *zout++ = (char) z; + } else { + stbi_uc *p; + int len,dist; + if (z == 256) { + a->zout = zout; + if (a->hit_zeof_once && a->num_bits < 16) { + // The first time we hit zeof, we inserted 16 extra zero bits into our bit + // buffer so the decoder can just do its speculative decoding. But if we + // actually consumed any of those bits (which is the case when num_bits < 16), + // the stream actually read past the end so it is malformed. + return stbi__err("unexpected end","Corrupt PNG"); + } + return 1; + } + if (z >= 286) return stbi__err("bad huffman code","Corrupt PNG"); // per DEFLATE, length codes 286 and 287 must not appear in compressed data + z -= 257; + len = stbi__zlength_base[z]; + if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]); + z = stbi__zhuffman_decode(a, &a->z_distance); + if (z < 0 || z >= 30) return stbi__err("bad huffman code","Corrupt PNG"); // per DEFLATE, distance codes 30 and 31 must not appear in compressed data + dist = stbi__zdist_base[z]; + if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]); + if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG"); + if (len > a->zout_end - zout) { + if (!stbi__zexpand(a, zout, len)) return 0; + zout = a->zout; + } + p = (stbi_uc *) (zout - dist); + if (dist == 1) { // run of one byte; common in images. + stbi_uc v = *p; + if (len) { do *zout++ = v; while (--len); } + } else { + if (len) { do *zout++ = *p++; while (--len); } + } + } + } +} + +static int stbi__compute_huffman_codes(stbi__zbuf *a) +{ + static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + stbi__zhuffman z_codelength; + stbi_uc lencodes[286+32+137];//padding for maximum single op + stbi_uc codelength_sizes[19]; + int i,n; + + int hlit = stbi__zreceive(a,5) + 257; + int hdist = stbi__zreceive(a,5) + 1; + int hclen = stbi__zreceive(a,4) + 4; + int ntot = hlit + hdist; + + memset(codelength_sizes, 0, sizeof(codelength_sizes)); + for (i=0; i < hclen; ++i) { + int s = stbi__zreceive(a,3); + codelength_sizes[length_dezigzag[i]] = (stbi_uc) s; + } + if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; + + n = 0; + while (n < ntot) { + int c = stbi__zhuffman_decode(a, &z_codelength); + if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG"); + if (c < 16) + lencodes[n++] = (stbi_uc) c; + else { + stbi_uc fill = 0; + if (c == 16) { + c = stbi__zreceive(a,2)+3; + if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG"); + fill = lencodes[n-1]; + } else if (c == 17) { + c = stbi__zreceive(a,3)+3; + } else if (c == 18) { + c = stbi__zreceive(a,7)+11; + } else { + return stbi__err("bad codelengths", "Corrupt PNG"); + } + if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG"); + memset(lencodes+n, fill, c); + n += c; + } + } + if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG"); + if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; + return 1; +} + +static int stbi__parse_uncompressed_block(stbi__zbuf *a) +{ + stbi_uc header[4]; + int len,nlen,k; + if (a->num_bits & 7) + stbi__zreceive(a, a->num_bits & 7); // discard + // drain the bit-packed data into header + k = 0; + while (a->num_bits > 0) { + header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check + a->code_buffer >>= 8; + a->num_bits -= 8; + } + if (a->num_bits < 0) return stbi__err("zlib corrupt","Corrupt PNG"); + // now fill header the normal way + while (k < 4) + header[k++] = stbi__zget8(a); + len = header[1] * 256 + header[0]; + nlen = header[3] * 256 + header[2]; + if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG"); + if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG"); + if (a->zout + len > a->zout_end) + if (!stbi__zexpand(a, a->zout, len)) return 0; + memcpy(a->zout, a->zbuffer, len); + a->zbuffer += len; + a->zout += len; + return 1; +} + +static int stbi__parse_zlib_header(stbi__zbuf *a) +{ + int cmf = stbi__zget8(a); + int cm = cmf & 15; + /* int cinfo = cmf >> 4; */ + int flg = stbi__zget8(a); + if (stbi__zeof(a)) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec + if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec + if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png + if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png + // window = 1 << (8 + cinfo)... but who cares, we fully buffer output + return 1; +} + +static const stbi_uc stbi__zdefault_length[STBI__ZNSYMS] = +{ + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8 +}; +static const stbi_uc stbi__zdefault_distance[32] = +{ + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 +}; +/* +Init algorithm: +{ + int i; // use <= to match clearly with spec + for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; + for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9; + for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7; + for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8; + + for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; +} +*/ + +static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) +{ + int final, type; + if (parse_header) + if (!stbi__parse_zlib_header(a)) return 0; + a->num_bits = 0; + a->code_buffer = 0; + a->hit_zeof_once = 0; + do { + final = stbi__zreceive(a,1); + type = stbi__zreceive(a,2); + if (type == 0) { + if (!stbi__parse_uncompressed_block(a)) return 0; + } else if (type == 3) { + return 0; + } else { + if (type == 1) { + // use fixed code lengths + if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , STBI__ZNSYMS)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; + } else { + if (!stbi__compute_huffman_codes(a)) return 0; + } + if (!stbi__parse_huffman_block(a)) return 0; + } + } while (!final); + return 1; +} + +static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header) +{ + a->zout_start = obuf; + a->zout = obuf; + a->zout_end = obuf + olen; + a->z_expandable = exp; + + return stbi__parse_zlib(a, parse_header); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, 1)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) +{ + return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 1)) + return (int) (a.zout - a.zout_start); + else + return -1; +} + +STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(16384); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer+len; + if (stbi__do_zlib(&a, p, 16384, 1, 0)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 0)) + return (int) (a.zout - a.zout_start); + else + return -1; +} +#endif + +// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 +// simple implementation +// - only 8-bit samples +// - no CRC checking +// - allocates lots of intermediate memory +// - avoids problem of streaming data between subsystems +// - avoids explicit window management +// performance +// - uses stb_zlib, a PD zlib implementation with fast huffman decoding + +#ifndef STBI_NO_PNG +typedef struct +{ + stbi__uint32 length; + stbi__uint32 type; +} stbi__pngchunk; + +static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) +{ + stbi__pngchunk c; + c.length = stbi__get32be(s); + c.type = stbi__get32be(s); + return c; +} + +static int stbi__check_png_header(stbi__context *s) +{ + static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 }; + int i; + for (i=0; i < 8; ++i) + if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG"); + return 1; +} + +typedef struct +{ + stbi__context *s; + stbi_uc *idata, *expanded, *out; + int depth; +} stbi__png; + + +enum { + STBI__F_none=0, + STBI__F_sub=1, + STBI__F_up=2, + STBI__F_avg=3, + STBI__F_paeth=4, + // synthetic filter used for first scanline to avoid needing a dummy row of 0s + STBI__F_avg_first +}; + +static stbi_uc first_row_filter[5] = +{ + STBI__F_none, + STBI__F_sub, + STBI__F_none, + STBI__F_avg_first, + STBI__F_sub // Paeth with b=c=0 turns out to be equivalent to sub +}; + +static int stbi__paeth(int a, int b, int c) +{ + // This formulation looks very different from the reference in the PNG spec, but is + // actually equivalent and has favorable data dependencies and admits straightforward + // generation of branch-free code, which helps performance significantly. + int thresh = c*3 - (a + b); + int lo = a < b ? a : b; + int hi = a < b ? b : a; + int t0 = (hi <= thresh) ? lo : c; + int t1 = (thresh <= lo) ? hi : t0; + return t1; +} + +static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; + +// adds an extra all-255 alpha channel +// dest == src is legal +// img_n must be 1 or 3 +static void stbi__create_png_alpha_expand8(stbi_uc *dest, stbi_uc *src, stbi__uint32 x, int img_n) +{ + int i; + // must process data backwards since we allow dest==src + if (img_n == 1) { + for (i=x-1; i >= 0; --i) { + dest[i*2+1] = 255; + dest[i*2+0] = src[i]; + } + } else { + STBI_ASSERT(img_n == 3); + for (i=x-1; i >= 0; --i) { + dest[i*4+3] = 255; + dest[i*4+2] = src[i*3+2]; + dest[i*4+1] = src[i*3+1]; + dest[i*4+0] = src[i*3+0]; + } + } +} + +// create the png data from post-deflated data +static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color) +{ + int bytes = (depth == 16 ? 2 : 1); + stbi__context *s = a->s; + stbi__uint32 i,j,stride = x*out_n*bytes; + stbi__uint32 img_len, img_width_bytes; + stbi_uc *filter_buf; + int all_ok = 1; + int k; + int img_n = s->img_n; // copy it into a local for later + + int output_bytes = out_n*bytes; + int filter_bytes = img_n*bytes; + int width = x; + + STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); + a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into + if (!a->out) return stbi__err("outofmem", "Out of memory"); + + // note: error exits here don't need to clean up a->out individually, + // stbi__do_png always does on error. + if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err("too large", "Corrupt PNG"); + img_width_bytes = (((img_n * x * depth) + 7) >> 3); + if (!stbi__mad2sizes_valid(img_width_bytes, y, img_width_bytes)) return stbi__err("too large", "Corrupt PNG"); + img_len = (img_width_bytes + 1) * y; + + // we used to check for exact match between raw_len and img_len on non-interlaced PNGs, + // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros), + // so just check for raw_len < img_len always. + if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); + + // Allocate two scan lines worth of filter workspace buffer. + filter_buf = (stbi_uc *) stbi__malloc_mad2(img_width_bytes, 2, 0); + if (!filter_buf) return stbi__err("outofmem", "Out of memory"); + + // Filtering for low-bit-depth images + if (depth < 8) { + filter_bytes = 1; + width = img_width_bytes; + } + + for (j=0; j < y; ++j) { + // cur/prior filter buffers alternate + stbi_uc *cur = filter_buf + (j & 1)*img_width_bytes; + stbi_uc *prior = filter_buf + (~j & 1)*img_width_bytes; + stbi_uc *dest = a->out + stride*j; + int nk = width * filter_bytes; + int filter = *raw++; + + // check filter type + if (filter > 4) { + all_ok = stbi__err("invalid filter","Corrupt PNG"); + break; + } + + // if first row, use special filter that doesn't sample previous row + if (j == 0) filter = first_row_filter[filter]; + + // perform actual filtering + switch (filter) { + case STBI__F_none: + memcpy(cur, raw, nk); + break; + case STBI__F_sub: + memcpy(cur, raw, filter_bytes); + for (k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); + break; + case STBI__F_up: + for (k = 0; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + prior[k]); + break; + case STBI__F_avg: + for (k = 0; k < filter_bytes; ++k) + cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); + for (k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); + break; + case STBI__F_paeth: + for (k = 0; k < filter_bytes; ++k) + cur[k] = STBI__BYTECAST(raw[k] + prior[k]); // prior[k] == stbi__paeth(0,prior[k],0) + for (k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes], prior[k], prior[k-filter_bytes])); + break; + case STBI__F_avg_first: + memcpy(cur, raw, filter_bytes); + for (k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); + break; + } + + raw += nk; + + // expand decoded bits in cur to dest, also adding an extra alpha channel if desired + if (depth < 8) { + stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range + stbi_uc *in = cur; + stbi_uc *out = dest; + stbi_uc inb = 0; + stbi__uint32 nsmp = x*img_n; + + // expand bits to bytes first + if (depth == 4) { + for (i=0; i < nsmp; ++i) { + if ((i & 1) == 0) inb = *in++; + *out++ = scale * (inb >> 4); + inb <<= 4; + } + } else if (depth == 2) { + for (i=0; i < nsmp; ++i) { + if ((i & 3) == 0) inb = *in++; + *out++ = scale * (inb >> 6); + inb <<= 2; + } + } else { + STBI_ASSERT(depth == 1); + for (i=0; i < nsmp; ++i) { + if ((i & 7) == 0) inb = *in++; + *out++ = scale * (inb >> 7); + inb <<= 1; + } + } + + // insert alpha=255 values if desired + if (img_n != out_n) + stbi__create_png_alpha_expand8(dest, dest, x, img_n); + } else if (depth == 8) { + if (img_n == out_n) + memcpy(dest, cur, x*img_n); + else + stbi__create_png_alpha_expand8(dest, cur, x, img_n); + } else if (depth == 16) { + // convert the image data from big-endian to platform-native + stbi__uint16 *dest16 = (stbi__uint16*)dest; + stbi__uint32 nsmp = x*img_n; + + if (img_n == out_n) { + for (i = 0; i < nsmp; ++i, ++dest16, cur += 2) + *dest16 = (cur[0] << 8) | cur[1]; + } else { + STBI_ASSERT(img_n+1 == out_n); + if (img_n == 1) { + for (i = 0; i < x; ++i, dest16 += 2, cur += 2) { + dest16[0] = (cur[0] << 8) | cur[1]; + dest16[1] = 0xffff; + } + } else { + STBI_ASSERT(img_n == 3); + for (i = 0; i < x; ++i, dest16 += 4, cur += 6) { + dest16[0] = (cur[0] << 8) | cur[1]; + dest16[1] = (cur[2] << 8) | cur[3]; + dest16[2] = (cur[4] << 8) | cur[5]; + dest16[3] = 0xffff; + } + } + } + } + } + + STBI_FREE(filter_buf); + if (!all_ok) return 0; + + return 1; +} + +static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced) +{ + int bytes = (depth == 16 ? 2 : 1); + int out_bytes = out_n * bytes; + stbi_uc *final; + int p; + if (!interlaced) + return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); + + // de-interlacing + final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); + if (!final) return stbi__err("outofmem", "Out of memory"); + for (p=0; p < 7; ++p) { + int xorig[] = { 0,4,0,2,0,1,0 }; + int yorig[] = { 0,0,4,0,2,0,1 }; + int xspc[] = { 8,8,4,4,2,2,1 }; + int yspc[] = { 8,8,8,4,4,2,2 }; + int i,j,x,y; + // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 + x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; + y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; + if (x && y) { + stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y; + if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) { + STBI_FREE(final); + return 0; + } + for (j=0; j < y; ++j) { + for (i=0; i < x; ++i) { + int out_y = j*yspc[p]+yorig[p]; + int out_x = i*xspc[p]+xorig[p]; + memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes, + a->out + (j*x+i)*out_bytes, out_bytes); + } + } + STBI_FREE(a->out); + image_data += img_len; + image_data_len -= img_len; + } + } + a->out = final; + + return 1; +} + +static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + // compute color-based transparency, assuming we've + // already got 255 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i=0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 255); + p += 2; + } + } else { + for (i=0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi__uint16 *p = (stbi__uint16*) z->out; + + // compute color-based transparency, assuming we've + // already got 65535 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i = 0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 65535); + p += 2; + } + } else { + for (i = 0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n) +{ + stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; + stbi_uc *p, *temp_out, *orig = a->out; + + p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0); + if (p == NULL) return stbi__err("outofmem", "Out of memory"); + + // between here and free(out) below, exitting would leak + temp_out = p; + + if (pal_img_n == 3) { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p += 3; + } + } else { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p[3] = palette[n+3]; + p += 4; + } + } + STBI_FREE(a->out); + a->out = temp_out; + + STBI_NOTUSED(len); + + return 1; +} + +static int stbi__unpremultiply_on_load_global = 0; +static int stbi__de_iphone_flag_global = 0; + +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) +{ + stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) +{ + stbi__de_iphone_flag_global = flag_true_if_should_convert; +} + +#ifndef STBI_THREAD_LOCAL +#define stbi__unpremultiply_on_load stbi__unpremultiply_on_load_global +#define stbi__de_iphone_flag stbi__de_iphone_flag_global +#else +static STBI_THREAD_LOCAL int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set; +static STBI_THREAD_LOCAL int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set; + +STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply) +{ + stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply; + stbi__unpremultiply_on_load_set = 1; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert) +{ + stbi__de_iphone_flag_local = flag_true_if_should_convert; + stbi__de_iphone_flag_set = 1; +} + +#define stbi__unpremultiply_on_load (stbi__unpremultiply_on_load_set \ + ? stbi__unpremultiply_on_load_local \ + : stbi__unpremultiply_on_load_global) +#define stbi__de_iphone_flag (stbi__de_iphone_flag_set \ + ? stbi__de_iphone_flag_local \ + : stbi__de_iphone_flag_global) +#endif // STBI_THREAD_LOCAL + +static void stbi__de_iphone(stbi__png *z) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + if (s->img_out_n == 3) { // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 3; + } + } else { + STBI_ASSERT(s->img_out_n == 4); + if (stbi__unpremultiply_on_load) { + // convert bgr to rgb and unpremultiply + for (i=0; i < pixel_count; ++i) { + stbi_uc a = p[3]; + stbi_uc t = p[0]; + if (a) { + stbi_uc half = a / 2; + p[0] = (p[2] * 255 + half) / a; + p[1] = (p[1] * 255 + half) / a; + p[2] = ( t * 255 + half) / a; + } else { + p[0] = p[2]; + p[2] = t; + } + p += 4; + } + } else { + // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 4; + } + } + } +} + +#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d)) + +static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) +{ + stbi_uc palette[1024], pal_img_n=0; + stbi_uc has_trans=0, tc[3]={0}; + stbi__uint16 tc16[3]; + stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; + int first=1,k,interlace=0, color=0, is_iphone=0; + stbi__context *s = z->s; + + z->expanded = NULL; + z->idata = NULL; + z->out = NULL; + + if (!stbi__check_png_header(s)) return 0; + + if (scan == STBI__SCAN_type) return 1; + + for (;;) { + stbi__pngchunk c = stbi__get_chunk_header(s); + switch (c.type) { + case STBI__PNG_TYPE('C','g','B','I'): + is_iphone = 1; + stbi__skip(s, c.length); + break; + case STBI__PNG_TYPE('I','H','D','R'): { + int comp,filter; + if (!first) return stbi__err("multiple IHDR","Corrupt PNG"); + first = 0; + if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); + s->img_x = stbi__get32be(s); + s->img_y = stbi__get32be(s); + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + z->depth = stbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only"); + color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); + comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); + filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG"); + interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG"); + if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG"); + if (!pal_img_n) { + s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); + if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); + } else { + // if paletted, then pal_n is our final components, and + // img_n is # components to decompress/filter. + s->img_n = 1; + if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG"); + } + // even with SCAN_header, have to scan to see if we have a tRNS + break; + } + + case STBI__PNG_TYPE('P','L','T','E'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG"); + pal_len = c.length / 3; + if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG"); + for (i=0; i < pal_len; ++i) { + palette[i*4+0] = stbi__get8(s); + palette[i*4+1] = stbi__get8(s); + palette[i*4+2] = stbi__get8(s); + palette[i*4+3] = 255; + } + break; + } + + case STBI__PNG_TYPE('t','R','N','S'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG"); + if (pal_img_n) { + if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; } + if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG"); + if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG"); + pal_img_n = 4; + for (i=0; i < c.length; ++i) + palette[i*4+3] = stbi__get8(s); + } else { + if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG"); + if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); + has_trans = 1; + // non-paletted with tRNS = constant alpha. if header-scanning, we can stop now. + if (scan == STBI__SCAN_header) { ++s->img_n; return 1; } + if (z->depth == 16) { + for (k = 0; k < s->img_n && k < 3; ++k) // extra loop test to suppress false GCC warning + tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is + } else { + for (k = 0; k < s->img_n && k < 3; ++k) + tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger + } + } + break; + } + + case STBI__PNG_TYPE('I','D','A','T'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); + if (scan == STBI__SCAN_header) { + // header scan definitely stops at first IDAT + if (pal_img_n) + s->img_n = pal_img_n; + return 1; + } + if (c.length > (1u << 30)) return stbi__err("IDAT size limit", "IDAT section larger than 2^30 bytes"); + if ((int)(ioff + c.length) < (int)ioff) return 0; + if (ioff + c.length > idata_limit) { + stbi__uint32 idata_limit_old = idata_limit; + stbi_uc *p; + if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; + while (ioff + c.length > idata_limit) + idata_limit *= 2; + STBI_NOTUSED(idata_limit_old); + p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); + z->idata = p; + } + if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG"); + ioff += c.length; + break; + } + + case STBI__PNG_TYPE('I','E','N','D'): { + stbi__uint32 raw_len, bpl; + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (scan != STBI__SCAN_load) return 1; + if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG"); + // initial guess for decoded data size to avoid unnecessary reallocs + bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component + raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; + z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone); + if (z->expanded == NULL) return 0; // zlib should set error + STBI_FREE(z->idata); z->idata = NULL; + if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) + s->img_out_n = s->img_n+1; + else + s->img_out_n = s->img_n; + if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0; + if (has_trans) { + if (z->depth == 16) { + if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0; + } else { + if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; + } + } + if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) + stbi__de_iphone(z); + if (pal_img_n) { + // pal_img_n == 3 or 4 + s->img_n = pal_img_n; // record the actual colors we had + s->img_out_n = pal_img_n; + if (req_comp >= 3) s->img_out_n = req_comp; + if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) + return 0; + } else if (has_trans) { + // non-paletted image with tRNS -> source image has (constant) alpha + ++s->img_n; + } + STBI_FREE(z->expanded); z->expanded = NULL; + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + return 1; + } + + default: + // if critical, fail + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if ((c.type & (1 << 29)) == 0) { + #ifndef STBI_NO_FAILURE_STRINGS + // not threadsafe + static char invalid_chunk[] = "XXXX PNG chunk not known"; + invalid_chunk[0] = STBI__BYTECAST(c.type >> 24); + invalid_chunk[1] = STBI__BYTECAST(c.type >> 16); + invalid_chunk[2] = STBI__BYTECAST(c.type >> 8); + invalid_chunk[3] = STBI__BYTECAST(c.type >> 0); + #endif + return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type"); + } + stbi__skip(s, c.length); + break; + } + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + } +} + +static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri) +{ + void *result=NULL; + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { + if (p->depth <= 8) + ri->bits_per_channel = 8; + else if (p->depth == 16) + ri->bits_per_channel = 16; + else + return stbi__errpuc("bad bits_per_channel", "PNG not supported: unsupported color depth"); + result = p->out; + p->out = NULL; + if (req_comp && req_comp != p->s->img_out_n) { + if (ri->bits_per_channel == 8) + result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + else + result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + p->s->img_out_n = req_comp; + if (result == NULL) return result; + } + *x = p->s->img_x; + *y = p->s->img_y; + if (n) *n = p->s->img_n; + } + STBI_FREE(p->out); p->out = NULL; + STBI_FREE(p->expanded); p->expanded = NULL; + STBI_FREE(p->idata); p->idata = NULL; + + return result; +} + +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi__png p; + p.s = s; + return stbi__do_png(&p, x,y,comp,req_comp, ri); +} + +static int stbi__png_test(stbi__context *s) +{ + int r; + r = stbi__check_png_header(s); + stbi__rewind(s); + return r; +} + +static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp) +{ + if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { + stbi__rewind( p->s ); + return 0; + } + if (x) *x = p->s->img_x; + if (y) *y = p->s->img_y; + if (comp) *comp = p->s->img_n; + return 1; +} + +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__png p; + p.s = s; + return stbi__png_info_raw(&p, x, y, comp); +} + +static int stbi__png_is16(stbi__context *s) +{ + stbi__png p; + p.s = s; + if (!stbi__png_info_raw(&p, NULL, NULL, NULL)) + return 0; + if (p.depth != 16) { + stbi__rewind(p.s); + return 0; + } + return 1; +} +#endif + +// Microsoft/Windows BMP image + +#ifndef STBI_NO_BMP +static int stbi__bmp_test_raw(stbi__context *s) +{ + int r; + int sz; + if (stbi__get8(s) != 'B') return 0; + if (stbi__get8(s) != 'M') return 0; + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + stbi__get32le(s); // discard data offset + sz = stbi__get32le(s); + r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124); + return r; +} + +static int stbi__bmp_test(stbi__context *s) +{ + int r = stbi__bmp_test_raw(s); + stbi__rewind(s); + return r; +} + + +// returns 0..31 for the highest set bit +static int stbi__high_bit(unsigned int z) +{ + int n=0; + if (z == 0) return -1; + if (z >= 0x10000) { n += 16; z >>= 16; } + if (z >= 0x00100) { n += 8; z >>= 8; } + if (z >= 0x00010) { n += 4; z >>= 4; } + if (z >= 0x00004) { n += 2; z >>= 2; } + if (z >= 0x00002) { n += 1;/* >>= 1;*/ } + return n; +} + +static int stbi__bitcount(unsigned int a) +{ + a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 + a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 + a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits + a = (a + (a >> 8)); // max 16 per 8 bits + a = (a + (a >> 16)); // max 32 per 8 bits + return a & 0xff; +} + +// extract an arbitrarily-aligned N-bit value (N=bits) +// from v, and then make it 8-bits long and fractionally +// extend it to full full range. +static int stbi__shiftsigned(unsigned int v, int shift, int bits) +{ + static unsigned int mul_table[9] = { + 0, + 0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/, + 0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/, + }; + static unsigned int shift_table[9] = { + 0, 0,0,1,0,2,4,6,0, + }; + if (shift < 0) + v <<= -shift; + else + v >>= shift; + STBI_ASSERT(v < 256); + v >>= (8-bits); + STBI_ASSERT(bits >= 0 && bits <= 8); + return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits]; +} + +typedef struct +{ + int bpp, offset, hsz; + unsigned int mr,mg,mb,ma, all_a; + int extra_read; +} stbi__bmp_data; + +static int stbi__bmp_set_mask_defaults(stbi__bmp_data *info, int compress) +{ + // BI_BITFIELDS specifies masks explicitly, don't override + if (compress == 3) + return 1; + + if (compress == 0) { + if (info->bpp == 16) { + info->mr = 31u << 10; + info->mg = 31u << 5; + info->mb = 31u << 0; + } else if (info->bpp == 32) { + info->mr = 0xffu << 16; + info->mg = 0xffu << 8; + info->mb = 0xffu << 0; + info->ma = 0xffu << 24; + info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 + } else { + // otherwise, use defaults, which is all-0 + info->mr = info->mg = info->mb = info->ma = 0; + } + return 1; + } + return 0; // error +} + +static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) +{ + int hsz; + if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP"); + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + info->offset = stbi__get32le(s); + info->hsz = hsz = stbi__get32le(s); + info->mr = info->mg = info->mb = info->ma = 0; + info->extra_read = 14; + + if (info->offset < 0) return stbi__errpuc("bad BMP", "bad BMP"); + + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); + if (hsz == 12) { + s->img_x = stbi__get16le(s); + s->img_y = stbi__get16le(s); + } else { + s->img_x = stbi__get32le(s); + s->img_y = stbi__get32le(s); + } + if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP"); + info->bpp = stbi__get16le(s); + if (hsz != 12) { + int compress = stbi__get32le(s); + if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); + if (compress >= 4) return stbi__errpuc("BMP JPEG/PNG", "BMP type not supported: unsupported compression"); // this includes PNG/JPEG modes + if (compress == 3 && info->bpp != 16 && info->bpp != 32) return stbi__errpuc("bad BMP", "bad BMP"); // bitfields requires 16 or 32 bits/pixel + stbi__get32le(s); // discard sizeof + stbi__get32le(s); // discard hres + stbi__get32le(s); // discard vres + stbi__get32le(s); // discard colorsused + stbi__get32le(s); // discard max important + if (hsz == 40 || hsz == 56) { + if (hsz == 56) { + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + } + if (info->bpp == 16 || info->bpp == 32) { + if (compress == 0) { + stbi__bmp_set_mask_defaults(info, compress); + } else if (compress == 3) { + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->extra_read += 12; + // not documented, but generated by photoshop and handled by mspaint + if (info->mr == info->mg && info->mg == info->mb) { + // ?!?!? + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else { + // V4/V5 header + int i; + if (hsz != 108 && hsz != 124) + return stbi__errpuc("bad BMP", "bad BMP"); + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->ma = stbi__get32le(s); + if (compress != 3) // override mr/mg/mb unless in BI_BITFIELDS mode, as per docs + stbi__bmp_set_mask_defaults(info, compress); + stbi__get32le(s); // discard color space + for (i=0; i < 12; ++i) + stbi__get32le(s); // discard color space parameters + if (hsz == 124) { + stbi__get32le(s); // discard rendering intent + stbi__get32le(s); // discard offset of profile data + stbi__get32le(s); // discard size of profile data + stbi__get32le(s); // discard reserved + } + } + } + return (void *) 1; +} + + +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *out; + unsigned int mr=0,mg=0,mb=0,ma=0, all_a; + stbi_uc pal[256][4]; + int psize=0,i,j,width; + int flip_vertically, pad, target; + stbi__bmp_data info; + STBI_NOTUSED(ri); + + info.all_a = 255; + if (stbi__bmp_parse_header(s, &info) == NULL) + return NULL; // error code already set + + flip_vertically = ((int) s->img_y) > 0; + s->img_y = abs((int) s->img_y); + + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + mr = info.mr; + mg = info.mg; + mb = info.mb; + ma = info.ma; + all_a = info.all_a; + + if (info.hsz == 12) { + if (info.bpp < 24) + psize = (info.offset - info.extra_read - 24) / 3; + } else { + if (info.bpp < 16) + psize = (info.offset - info.extra_read - info.hsz) >> 2; + } + if (psize == 0) { + // accept some number of extra bytes after the header, but if the offset points either to before + // the header ends or implies a large amount of extra data, reject the file as malformed + int bytes_read_so_far = s->callback_already_read + (int)(s->img_buffer - s->img_buffer_original); + int header_limit = 1024; // max we actually read is below 256 bytes currently. + int extra_data_limit = 256*4; // what ordinarily goes here is a palette; 256 entries*4 bytes is its max size. + if (bytes_read_so_far <= 0 || bytes_read_so_far > header_limit) { + return stbi__errpuc("bad header", "Corrupt BMP"); + } + // we established that bytes_read_so_far is positive and sensible. + // the first half of this test rejects offsets that are either too small positives, or + // negative, and guarantees that info.offset >= bytes_read_so_far > 0. this in turn + // ensures the number computed in the second half of the test can't overflow. + if (info.offset < bytes_read_so_far || info.offset - bytes_read_so_far > extra_data_limit) { + return stbi__errpuc("bad offset", "Corrupt BMP"); + } else { + stbi__skip(s, info.offset - bytes_read_so_far); + } + } + + if (info.bpp == 24 && ma == 0xff000000) + s->img_n = 3; + else + s->img_n = ma ? 4 : 3; + if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 + target = req_comp; + else + target = s->img_n; // if they want monochrome, we'll post-convert + + // sanity-check size + if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0)) + return stbi__errpuc("too large", "Corrupt BMP"); + + out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + if (info.bpp < 16) { + int z=0; + if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); } + for (i=0; i < psize; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + if (info.hsz != 12) stbi__get8(s); + pal[i][3] = 255; + } + stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); + if (info.bpp == 1) width = (s->img_x + 7) >> 3; + else if (info.bpp == 4) width = (s->img_x + 1) >> 1; + else if (info.bpp == 8) width = s->img_x; + else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); } + pad = (-width)&3; + if (info.bpp == 1) { + for (j=0; j < (int) s->img_y; ++j) { + int bit_offset = 7, v = stbi__get8(s); + for (i=0; i < (int) s->img_x; ++i) { + int color = (v>>bit_offset)&0x1; + out[z++] = pal[color][0]; + out[z++] = pal[color][1]; + out[z++] = pal[color][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) s->img_x) break; + if((--bit_offset) < 0) { + bit_offset = 7; + v = stbi__get8(s); + } + } + stbi__skip(s, pad); + } + } else { + for (j=0; j < (int) s->img_y; ++j) { + for (i=0; i < (int) s->img_x; i += 2) { + int v=stbi__get8(s),v2=0; + if (info.bpp == 4) { + v2 = v & 15; + v >>= 4; + } + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) s->img_x) break; + v = (info.bpp == 8) ? stbi__get8(s) : v2; + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + } + stbi__skip(s, pad); + } + } + } else { + int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; + int z = 0; + int easy=0; + stbi__skip(s, info.offset - info.extra_read - info.hsz); + if (info.bpp == 24) width = 3 * s->img_x; + else if (info.bpp == 16) width = 2*s->img_x; + else /* bpp = 32 and pad = 0 */ width=0; + pad = (-width) & 3; + if (info.bpp == 24) { + easy = 1; + } else if (info.bpp == 32) { + if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) + easy = 2; + } + if (!easy) { + if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } + // right shift amt to put high bit in position #7 + rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr); + gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg); + bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb); + ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma); + if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } + } + for (j=0; j < (int) s->img_y; ++j) { + if (easy) { + for (i=0; i < (int) s->img_x; ++i) { + unsigned char a; + out[z+2] = stbi__get8(s); + out[z+1] = stbi__get8(s); + out[z+0] = stbi__get8(s); + z += 3; + a = (easy == 2 ? stbi__get8(s) : 255); + all_a |= a; + if (target == 4) out[z++] = a; + } + } else { + int bpp = info.bpp; + for (i=0; i < (int) s->img_x; ++i) { + stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s)); + unsigned int a; + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); + a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); + all_a |= a; + if (target == 4) out[z++] = STBI__BYTECAST(a); + } + } + stbi__skip(s, pad); + } + } + + // if alpha channel is all 0s, replace with all 255s + if (target == 4 && all_a == 0) + for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4) + out[i] = 255; + + if (flip_vertically) { + stbi_uc t; + for (j=0; j < (int) s->img_y>>1; ++j) { + stbi_uc *p1 = out + j *s->img_x*target; + stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target; + for (i=0; i < (int) s->img_x*target; ++i) { + t = p1[i]; p1[i] = p2[i]; p2[i] = t; + } + } + } + + if (req_comp && req_comp != target) { + out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + return out; +} +#endif + +// Targa Truevision - TGA +// by Jonathan Dummer +#ifndef STBI_NO_TGA +// returns STBI_rgb or whatever, 0 on error +static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16) +{ + // only RGB or RGBA (incl. 16bit) or grey allowed + if (is_rgb16) *is_rgb16 = 0; + switch(bits_per_pixel) { + case 8: return STBI_grey; + case 16: if(is_grey) return STBI_grey_alpha; + // fallthrough + case 15: if(is_rgb16) *is_rgb16 = 1; + return STBI_rgb; + case 24: // fallthrough + case 32: return bits_per_pixel/8; + default: return 0; + } +} + +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp) +{ + int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp; + int sz, tga_colormap_type; + stbi__get8(s); // discard Offset + tga_colormap_type = stbi__get8(s); // colormap type + if( tga_colormap_type > 1 ) { + stbi__rewind(s); + return 0; // only RGB or indexed allowed + } + tga_image_type = stbi__get8(s); // image type + if ( tga_colormap_type == 1 ) { // colormapped (paletted) image + if (tga_image_type != 1 && tga_image_type != 9) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip image x and y origin + tga_colormap_bpp = sz; + } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE + if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) { + stbi__rewind(s); + return 0; // only RGB or grey allowed, +/- RLE + } + stbi__skip(s,9); // skip colormap specification and image x/y origin + tga_colormap_bpp = 0; + } + tga_w = stbi__get16le(s); + if( tga_w < 1 ) { + stbi__rewind(s); + return 0; // test width + } + tga_h = stbi__get16le(s); + if( tga_h < 1 ) { + stbi__rewind(s); + return 0; // test height + } + tga_bits_per_pixel = stbi__get8(s); // bits per pixel + stbi__get8(s); // ignore alpha bits + if (tga_colormap_bpp != 0) { + if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) { + // when using a colormap, tga_bits_per_pixel is the size of the indexes + // I don't think anything but 8 or 16bit indexes makes sense + stbi__rewind(s); + return 0; + } + tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL); + } else { + tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL); + } + if(!tga_comp) { + stbi__rewind(s); + return 0; + } + if (x) *x = tga_w; + if (y) *y = tga_h; + if (comp) *comp = tga_comp; + return 1; // seems to have passed everything +} + +static int stbi__tga_test(stbi__context *s) +{ + int res = 0; + int sz, tga_color_type; + stbi__get8(s); // discard Offset + tga_color_type = stbi__get8(s); // color type + if ( tga_color_type > 1 ) goto errorEnd; // only RGB or indexed allowed + sz = stbi__get8(s); // image type + if ( tga_color_type == 1 ) { // colormapped (paletted) image + if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9 + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + stbi__skip(s,4); // skip image x and y origin + } else { // "normal" image w/o colormap + if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE + stbi__skip(s,9); // skip colormap specification and image x/y origin + } + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test width + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test height + sz = stbi__get8(s); // bits per pixel + if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + + res = 1; // if we got this far, everything's good and we can return 1 instead of 0 + +errorEnd: + stbi__rewind(s); + return res; +} + +// read 16bit value and convert to 24bit RGB +static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out) +{ + stbi__uint16 px = (stbi__uint16)stbi__get16le(s); + stbi__uint16 fiveBitMask = 31; + // we have 3 channels with 5bits each + int r = (px >> 10) & fiveBitMask; + int g = (px >> 5) & fiveBitMask; + int b = px & fiveBitMask; + // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later + out[0] = (stbi_uc)((r * 255)/31); + out[1] = (stbi_uc)((g * 255)/31); + out[2] = (stbi_uc)((b * 255)/31); + + // some people claim that the most significant bit might be used for alpha + // (possibly if an alpha-bit is set in the "image descriptor byte") + // but that only made 16bit test images completely translucent.. + // so let's treat all 15 and 16bit TGAs as RGB with no alpha. +} + +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + // read in the TGA header stuff + int tga_offset = stbi__get8(s); + int tga_indexed = stbi__get8(s); + int tga_image_type = stbi__get8(s); + int tga_is_RLE = 0; + int tga_palette_start = stbi__get16le(s); + int tga_palette_len = stbi__get16le(s); + int tga_palette_bits = stbi__get8(s); + int tga_x_origin = stbi__get16le(s); + int tga_y_origin = stbi__get16le(s); + int tga_width = stbi__get16le(s); + int tga_height = stbi__get16le(s); + int tga_bits_per_pixel = stbi__get8(s); + int tga_comp, tga_rgb16=0; + int tga_inverted = stbi__get8(s); + // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?) + // image data + unsigned char *tga_data; + unsigned char *tga_palette = NULL; + int i, j; + unsigned char raw_data[4] = {0}; + int RLE_count = 0; + int RLE_repeating = 0; + int read_next_pixel = 1; + STBI_NOTUSED(ri); + STBI_NOTUSED(tga_x_origin); // @TODO + STBI_NOTUSED(tga_y_origin); // @TODO + + if (tga_height > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (tga_width > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + // do a tiny bit of precessing + if ( tga_image_type >= 8 ) + { + tga_image_type -= 8; + tga_is_RLE = 1; + } + tga_inverted = 1 - ((tga_inverted >> 5) & 1); + + // If I'm paletted, then I'll use the number of bits from the palette + if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16); + else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16); + + if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency + return stbi__errpuc("bad format", "Can't find out TGA pixelformat"); + + // tga info + *x = tga_width; + *y = tga_height; + if (comp) *comp = tga_comp; + + if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0)) + return stbi__errpuc("too large", "Corrupt TGA"); + + tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0); + if (!tga_data) return stbi__errpuc("outofmem", "Out of memory"); + + // skip to the data's starting position (offset usually = 0) + stbi__skip(s, tga_offset ); + + if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) { + for (i=0; i < tga_height; ++i) { + int row = tga_inverted ? tga_height -i - 1 : i; + stbi_uc *tga_row = tga_data + row*tga_width*tga_comp; + stbi__getn(s, tga_row, tga_width * tga_comp); + } + } else { + // do I need to load a palette? + if ( tga_indexed) + { + if (tga_palette_len == 0) { /* you have to have at least one entry! */ + STBI_FREE(tga_data); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + + // any data to skip? (offset usually = 0) + stbi__skip(s, tga_palette_start ); + // load the palette + tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0); + if (!tga_palette) { + STBI_FREE(tga_data); + return stbi__errpuc("outofmem", "Out of memory"); + } + if (tga_rgb16) { + stbi_uc *pal_entry = tga_palette; + STBI_ASSERT(tga_comp == STBI_rgb); + for (i=0; i < tga_palette_len; ++i) { + stbi__tga_read_rgb16(s, pal_entry); + pal_entry += tga_comp; + } + } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) { + STBI_FREE(tga_data); + STBI_FREE(tga_palette); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + } + // load the data + for (i=0; i < tga_width * tga_height; ++i) + { + // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk? + if ( tga_is_RLE ) + { + if ( RLE_count == 0 ) + { + // yep, get the next byte as a RLE command + int RLE_cmd = stbi__get8(s); + RLE_count = 1 + (RLE_cmd & 127); + RLE_repeating = RLE_cmd >> 7; + read_next_pixel = 1; + } else if ( !RLE_repeating ) + { + read_next_pixel = 1; + } + } else + { + read_next_pixel = 1; + } + // OK, if I need to read a pixel, do it now + if ( read_next_pixel ) + { + // load however much data we did have + if ( tga_indexed ) + { + // read in index, then perform the lookup + int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s); + if ( pal_idx >= tga_palette_len ) { + // invalid index + pal_idx = 0; + } + pal_idx *= tga_comp; + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = tga_palette[pal_idx+j]; + } + } else if(tga_rgb16) { + STBI_ASSERT(tga_comp == STBI_rgb); + stbi__tga_read_rgb16(s, raw_data); + } else { + // read in the data raw + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = stbi__get8(s); + } + } + // clear the reading flag for the next pixel + read_next_pixel = 0; + } // end of reading a pixel + + // copy data + for (j = 0; j < tga_comp; ++j) + tga_data[i*tga_comp+j] = raw_data[j]; + + // in case we're in RLE mode, keep counting down + --RLE_count; + } + // do I need to invert the image? + if ( tga_inverted ) + { + for (j = 0; j*2 < tga_height; ++j) + { + int index1 = j * tga_width * tga_comp; + int index2 = (tga_height - 1 - j) * tga_width * tga_comp; + for (i = tga_width * tga_comp; i > 0; --i) + { + unsigned char temp = tga_data[index1]; + tga_data[index1] = tga_data[index2]; + tga_data[index2] = temp; + ++index1; + ++index2; + } + } + } + // clear my palette, if I had one + if ( tga_palette != NULL ) + { + STBI_FREE( tga_palette ); + } + } + + // swap RGB - if the source data was RGB16, it already is in the right order + if (tga_comp >= 3 && !tga_rgb16) + { + unsigned char* tga_pixel = tga_data; + for (i=0; i < tga_width * tga_height; ++i) + { + unsigned char temp = tga_pixel[0]; + tga_pixel[0] = tga_pixel[2]; + tga_pixel[2] = temp; + tga_pixel += tga_comp; + } + } + + // convert to target component count + if (req_comp && req_comp != tga_comp) + tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height); + + // the things I do to get rid of an error message, and yet keep + // Microsoft's C compilers happy... [8^( + tga_palette_start = tga_palette_len = tga_palette_bits = + tga_x_origin = tga_y_origin = 0; + STBI_NOTUSED(tga_palette_start); + // OK, done + return tga_data; +} +#endif + +// ************************************************************************************************* +// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context *s) +{ + int r = (stbi__get32be(s) == 0x38425053); + stbi__rewind(s); + return r; +} + +static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount) +{ + int count, nleft, len; + + count = 0; + while ((nleft = pixelCount - count) > 0) { + len = stbi__get8(s); + if (len == 128) { + // No-op. + } else if (len < 128) { + // Copy next len+1 bytes literally. + len++; + if (len > nleft) return 0; // corrupt data + count += len; + while (len) { + *p = stbi__get8(s); + p += 4; + len--; + } + } else if (len > 128) { + stbi_uc val; + // Next -len+1 bytes in the dest are replicated from next source byte. + // (Interpret len as a negative 8-bit int.) + len = 257 - len; + if (len > nleft) return 0; // corrupt data + val = stbi__get8(s); + count += len; + while (len) { + *p = val; + p += 4; + len--; + } + } + } + + return 1; +} + +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + int pixelCount; + int channelCount, compression; + int channel, i; + int bitdepth; + int w,h; + stbi_uc *out; + STBI_NOTUSED(ri); + + // Check identifier + if (stbi__get32be(s) != 0x38425053) // "8BPS" + return stbi__errpuc("not PSD", "Corrupt PSD image"); + + // Check file type version. + if (stbi__get16be(s) != 1) + return stbi__errpuc("wrong version", "Unsupported version of PSD image"); + + // Skip 6 reserved bytes. + stbi__skip(s, 6 ); + + // Read the number of channels (R, G, B, A, etc). + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) + return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image"); + + // Read the rows and columns of the image. + h = stbi__get32be(s); + w = stbi__get32be(s); + + if (h > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (w > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + // Make sure the depth is 8 bits. + bitdepth = stbi__get16be(s); + if (bitdepth != 8 && bitdepth != 16) + return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit"); + + // Make sure the color mode is RGB. + // Valid options are: + // 0: Bitmap + // 1: Grayscale + // 2: Indexed color + // 3: RGB color + // 4: CMYK color + // 7: Multichannel + // 8: Duotone + // 9: Lab color + if (stbi__get16be(s) != 3) + return stbi__errpuc("wrong color format", "PSD is not in RGB color format"); + + // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) + stbi__skip(s,stbi__get32be(s) ); + + // Skip the image resources. (resolution, pen tool paths, etc) + stbi__skip(s, stbi__get32be(s) ); + + // Skip the reserved data. + stbi__skip(s, stbi__get32be(s) ); + + // Find out if the data is compressed. + // Known values: + // 0: no compression + // 1: RLE compressed + compression = stbi__get16be(s); + if (compression > 1) + return stbi__errpuc("bad compression", "PSD has an unknown compression format"); + + // Check size + if (!stbi__mad3sizes_valid(4, w, h, 0)) + return stbi__errpuc("too large", "Corrupt PSD"); + + // Create the destination image. + + if (!compression && bitdepth == 16 && bpc == 16) { + out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0); + ri->bits_per_channel = 16; + } else + out = (stbi_uc *) stbi__malloc(4 * w*h); + + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + pixelCount = w*h; + + // Initialize the data to zero. + //memset( out, 0, pixelCount * 4 ); + + // Finally, the image data. + if (compression) { + // RLE as used by .PSD and .TIFF + // Loop until you get the number of unpacked bytes you are expecting: + // Read the next source byte into n. + // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. + // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. + // Else if n is 128, noop. + // Endloop + + // The RLE-compressed data is preceded by a 2-byte data count for each row in the data, + // which we're going to just skip. + stbi__skip(s, h * channelCount * 2 ); + + // Read the RLE data by channel. + for (channel = 0; channel < 4; channel++) { + stbi_uc *p; + + p = out+channel; + if (channel >= channelCount) { + // Fill this channel with default data. + for (i = 0; i < pixelCount; i++, p += 4) + *p = (channel == 3 ? 255 : 0); + } else { + // Read the RLE data. + if (!stbi__psd_decode_rle(s, p, pixelCount)) { + STBI_FREE(out); + return stbi__errpuc("corrupt", "bad RLE data"); + } + } + } + + } else { + // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) + // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image. + + // Read the data by channel. + for (channel = 0; channel < 4; channel++) { + if (channel >= channelCount) { + // Fill this channel with default data. + if (bitdepth == 16 && bpc == 16) { + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + stbi__uint16 val = channel == 3 ? 65535 : 0; + for (i = 0; i < pixelCount; i++, q += 4) + *q = val; + } else { + stbi_uc *p = out+channel; + stbi_uc val = channel == 3 ? 255 : 0; + for (i = 0; i < pixelCount; i++, p += 4) + *p = val; + } + } else { + if (ri->bits_per_channel == 16) { // output bpc + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + for (i = 0; i < pixelCount; i++, q += 4) + *q = (stbi__uint16) stbi__get16be(s); + } else { + stbi_uc *p = out+channel; + if (bitdepth == 16) { // input bpc + for (i = 0; i < pixelCount; i++, p += 4) + *p = (stbi_uc) (stbi__get16be(s) >> 8); + } else { + for (i = 0; i < pixelCount; i++, p += 4) + *p = stbi__get8(s); + } + } + } + } + } + + // remove weird white matte from PSD + if (channelCount >= 4) { + if (ri->bits_per_channel == 16) { + for (i=0; i < w*h; ++i) { + stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i; + if (pixel[3] != 0 && pixel[3] != 65535) { + float a = pixel[3] / 65535.0f; + float ra = 1.0f / a; + float inv_a = 65535.0f * (1 - ra); + pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a); + pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a); + pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a); + } + } + } else { + for (i=0; i < w*h; ++i) { + unsigned char *pixel = out + 4*i; + if (pixel[3] != 0 && pixel[3] != 255) { + float a = pixel[3] / 255.0f; + float ra = 1.0f / a; + float inv_a = 255.0f * (1 - ra); + pixel[0] = (unsigned char) (pixel[0]*ra + inv_a); + pixel[1] = (unsigned char) (pixel[1]*ra + inv_a); + pixel[2] = (unsigned char) (pixel[2]*ra + inv_a); + } + } + } + } + + // convert to desired output format + if (req_comp && req_comp != 4) { + if (ri->bits_per_channel == 16) + out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h); + else + out = stbi__convert_format(out, 4, req_comp, w, h); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + if (comp) *comp = 4; + *y = h; + *x = w; + + return out; +} +#endif + +// ************************************************************************************************* +// Softimage PIC loader +// by Tom Seddon +// +// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format +// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ + +#ifndef STBI_NO_PIC +static int stbi__pic_is4(stbi__context *s,const char *str) +{ + int i; + for (i=0; i<4; ++i) + if (stbi__get8(s) != (stbi_uc)str[i]) + return 0; + + return 1; +} + +static int stbi__pic_test_core(stbi__context *s) +{ + int i; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) + return 0; + + for(i=0;i<84;++i) + stbi__get8(s); + + if (!stbi__pic_is4(s,"PICT")) + return 0; + + return 1; +} + +typedef struct +{ + stbi_uc size,type,channel; +} stbi__pic_packet; + +static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest) +{ + int mask=0x80, i; + + for (i=0; i<4; ++i, mask>>=1) { + if (channel & mask) { + if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short"); + dest[i]=stbi__get8(s); + } + } + + return dest; +} + +static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src) +{ + int mask=0x80,i; + + for (i=0;i<4; ++i, mask>>=1) + if (channel&mask) + dest[i]=src[i]; +} + +static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result) +{ + int act_comp=0,num_packets=0,y,chained; + stbi__pic_packet packets[10]; + + // this will (should...) cater for even some bizarre stuff like having data + // for the same channel in multiple packets. + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return stbi__errpuc("bad format","too many packets"); + + packet = &packets[num_packets++]; + + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + + act_comp |= packet->channel; + + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (reading packets)"); + if (packet->size != 8) return stbi__errpuc("bad format","packet isn't 8bpp"); + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? + + for(y=0; ytype) { + default: + return stbi__errpuc("bad format","packet has bad compression type"); + + case 0: {//uncompressed + int x; + + for(x=0;xchannel,dest)) + return 0; + break; + } + + case 1://Pure RLE + { + int left=width, i; + + while (left>0) { + stbi_uc count,value[4]; + + count=stbi__get8(s); + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pure read count)"); + + if (count > left) + count = (stbi_uc) left; + + if (!stbi__readval(s,packet->channel,value)) return 0; + + for(i=0; ichannel,dest,value); + left -= count; + } + } + break; + + case 2: {//Mixed RLE + int left=width; + while (left>0) { + int count = stbi__get8(s), i; + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (mixed read count)"); + + if (count >= 128) { // Repeated + stbi_uc value[4]; + + if (count==128) + count = stbi__get16be(s); + else + count -= 127; + if (count > left) + return stbi__errpuc("bad file","scanline overrun"); + + if (!stbi__readval(s,packet->channel,value)) + return 0; + + for(i=0;ichannel,dest,value); + } else { // Raw + ++count; + if (count>left) return stbi__errpuc("bad file","scanline overrun"); + + for(i=0;ichannel,dest)) + return 0; + } + left-=count; + } + break; + } + } + } + } + + return result; +} + +static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri) +{ + stbi_uc *result; + int i, x,y, internal_comp; + STBI_NOTUSED(ri); + + if (!comp) comp = &internal_comp; + + for (i=0; i<92; ++i) + stbi__get8(s); + + x = stbi__get16be(s); + y = stbi__get16be(s); + + if (y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)"); + if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode"); + + stbi__get32be(s); //skip `ratio' + stbi__get16be(s); //skip `fields' + stbi__get16be(s); //skip `pad' + + // intermediate buffer is RGBA + result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0); + if (!result) return stbi__errpuc("outofmem", "Out of memory"); + memset(result, 0xff, x*y*4); + + if (!stbi__pic_load_core(s,x,y,comp, result)) { + STBI_FREE(result); + result=0; + } + *px = x; + *py = y; + if (req_comp == 0) req_comp = *comp; + result=stbi__convert_format(result,4,req_comp,x,y); + + return result; +} + +static int stbi__pic_test(stbi__context *s) +{ + int r = stbi__pic_test_core(s); + stbi__rewind(s); + return r; +} +#endif + +// ************************************************************************************************* +// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb + +#ifndef STBI_NO_GIF +typedef struct +{ + stbi__int16 prefix; + stbi_uc first; + stbi_uc suffix; +} stbi__gif_lzw; + +typedef struct +{ + int w,h; + stbi_uc *out; // output buffer (always 4 components) + stbi_uc *background; // The current "background" as far as a gif is concerned + stbi_uc *history; + int flags, bgindex, ratio, transparent, eflags; + stbi_uc pal[256][4]; + stbi_uc lpal[256][4]; + stbi__gif_lzw codes[8192]; + stbi_uc *color_table; + int parse, step; + int lflags; + int start_x, start_y; + int max_x, max_y; + int cur_x, cur_y; + int line_size; + int delay; +} stbi__gif; + +static int stbi__gif_test_raw(stbi__context *s) +{ + int sz; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0; + sz = stbi__get8(s); + if (sz != '9' && sz != '7') return 0; + if (stbi__get8(s) != 'a') return 0; + return 1; +} + +static int stbi__gif_test(stbi__context *s) +{ + int r = stbi__gif_test_raw(s); + stbi__rewind(s); + return r; +} + +static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp) +{ + int i; + for (i=0; i < num_entries; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + pal[i][3] = transp == i ? 0 : 255; + } +} + +static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info) +{ + stbi_uc version; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') + return stbi__err("not GIF", "Corrupt GIF"); + + version = stbi__get8(s); + if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF"); + if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF"); + + stbi__g_failure_reason = ""; + g->w = stbi__get16le(s); + g->h = stbi__get16le(s); + g->flags = stbi__get8(s); + g->bgindex = stbi__get8(s); + g->ratio = stbi__get8(s); + g->transparent = -1; + + if (g->w > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + if (g->h > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + + if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments + + if (is_info) return 1; + + if (g->flags & 0x80) + stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1); + + return 1; +} + +static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); + if (!g) return stbi__err("outofmem", "Out of memory"); + if (!stbi__gif_header(s, g, comp, 1)) { + STBI_FREE(g); + stbi__rewind( s ); + return 0; + } + if (x) *x = g->w; + if (y) *y = g->h; + STBI_FREE(g); + return 1; +} + +static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) +{ + stbi_uc *p, *c; + int idx; + + // recurse to decode the prefixes, since the linked-list is backwards, + // and working backwards through an interleaved image would be nasty + if (g->codes[code].prefix >= 0) + stbi__out_gif_code(g, g->codes[code].prefix); + + if (g->cur_y >= g->max_y) return; + + idx = g->cur_x + g->cur_y; + p = &g->out[idx]; + g->history[idx / 4] = 1; + + c = &g->color_table[g->codes[code].suffix * 4]; + if (c[3] > 128) { // don't render transparent pixels; + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = c[3]; + } + g->cur_x += 4; + + if (g->cur_x >= g->max_x) { + g->cur_x = g->start_x; + g->cur_y += g->step; + + while (g->cur_y >= g->max_y && g->parse > 0) { + g->step = (1 << g->parse) * g->line_size; + g->cur_y = g->start_y + (g->step >> 1); + --g->parse; + } + } +} + +static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) +{ + stbi_uc lzw_cs; + stbi__int32 len, init_code; + stbi__uint32 first; + stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; + stbi__gif_lzw *p; + + lzw_cs = stbi__get8(s); + if (lzw_cs > 12) return NULL; + clear = 1 << lzw_cs; + first = 1; + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + bits = 0; + valid_bits = 0; + for (init_code = 0; init_code < clear; init_code++) { + g->codes[init_code].prefix = -1; + g->codes[init_code].first = (stbi_uc) init_code; + g->codes[init_code].suffix = (stbi_uc) init_code; + } + + // support no starting clear code + avail = clear+2; + oldcode = -1; + + len = 0; + for(;;) { + if (valid_bits < codesize) { + if (len == 0) { + len = stbi__get8(s); // start new block + if (len == 0) + return g->out; + } + --len; + bits |= (stbi__int32) stbi__get8(s) << valid_bits; + valid_bits += 8; + } else { + stbi__int32 code = bits & codemask; + bits >>= codesize; + valid_bits -= codesize; + // @OPTIMIZE: is there some way we can accelerate the non-clear path? + if (code == clear) { // clear code + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + avail = clear + 2; + oldcode = -1; + first = 0; + } else if (code == clear + 1) { // end of stream code + stbi__skip(s, len); + while ((len = stbi__get8(s)) > 0) + stbi__skip(s,len); + return g->out; + } else if (code <= avail) { + if (first) { + return stbi__errpuc("no clear code", "Corrupt GIF"); + } + + if (oldcode >= 0) { + p = &g->codes[avail++]; + if (avail > 8192) { + return stbi__errpuc("too many codes", "Corrupt GIF"); + } + + p->prefix = (stbi__int16) oldcode; + p->first = g->codes[oldcode].first; + p->suffix = (code == avail) ? p->first : g->codes[code].first; + } else if (code == avail) + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + + stbi__out_gif_code(g, (stbi__uint16) code); + + if ((avail & codemask) == 0 && avail <= 0x0FFF) { + codesize++; + codemask = (1 << codesize) - 1; + } + + oldcode = code; + } else { + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + } + } + } +} + +// this function is designed to support animated gifs, although stb_image doesn't support it +// two back is the image from two frames ago, used for a very specific disposal format +static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back) +{ + int dispose; + int first_frame; + int pi; + int pcount; + STBI_NOTUSED(req_comp); + + // on first frame, any non-written pixels get the background colour (non-transparent) + first_frame = 0; + if (g->out == 0) { + if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header + if (!stbi__mad3sizes_valid(4, g->w, g->h, 0)) + return stbi__errpuc("too large", "GIF image is too large"); + pcount = g->w * g->h; + g->out = (stbi_uc *) stbi__malloc(4 * pcount); + g->background = (stbi_uc *) stbi__malloc(4 * pcount); + g->history = (stbi_uc *) stbi__malloc(pcount); + if (!g->out || !g->background || !g->history) + return stbi__errpuc("outofmem", "Out of memory"); + + // image is treated as "transparent" at the start - ie, nothing overwrites the current background; + // background colour is only used for pixels that are not rendered first frame, after that "background" + // color refers to the color that was there the previous frame. + memset(g->out, 0x00, 4 * pcount); + memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent) + memset(g->history, 0x00, pcount); // pixels that were affected previous frame + first_frame = 1; + } else { + // second frame - how do we dispose of the previous one? + dispose = (g->eflags & 0x1C) >> 2; + pcount = g->w * g->h; + + if ((dispose == 3) && (two_back == 0)) { + dispose = 2; // if I don't have an image to revert back to, default to the old background + } + + if (dispose == 3) { // use previous graphic + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 ); + } + } + } else if (dispose == 2) { + // restore what was changed last frame to background before that frame; + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 ); + } + } + } else { + // This is a non-disposal case eithe way, so just + // leave the pixels as is, and they will become the new background + // 1: do not dispose + // 0: not specified. + } + + // background is what out is after the undoing of the previou frame; + memcpy( g->background, g->out, 4 * g->w * g->h ); + } + + // clear my history; + memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame + + for (;;) { + int tag = stbi__get8(s); + switch (tag) { + case 0x2C: /* Image Descriptor */ + { + stbi__int32 x, y, w, h; + stbi_uc *o; + + x = stbi__get16le(s); + y = stbi__get16le(s); + w = stbi__get16le(s); + h = stbi__get16le(s); + if (((x + w) > (g->w)) || ((y + h) > (g->h))) + return stbi__errpuc("bad Image Descriptor", "Corrupt GIF"); + + g->line_size = g->w * 4; + g->start_x = x * 4; + g->start_y = y * g->line_size; + g->max_x = g->start_x + w * 4; + g->max_y = g->start_y + h * g->line_size; + g->cur_x = g->start_x; + g->cur_y = g->start_y; + + // if the width of the specified rectangle is 0, that means + // we may not see *any* pixels or the image is malformed; + // to make sure this is caught, move the current y down to + // max_y (which is what out_gif_code checks). + if (w == 0) + g->cur_y = g->max_y; + + g->lflags = stbi__get8(s); + + if (g->lflags & 0x40) { + g->step = 8 * g->line_size; // first interlaced spacing + g->parse = 3; + } else { + g->step = g->line_size; + g->parse = 0; + } + + if (g->lflags & 0x80) { + stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); + g->color_table = (stbi_uc *) g->lpal; + } else if (g->flags & 0x80) { + g->color_table = (stbi_uc *) g->pal; + } else + return stbi__errpuc("missing color table", "Corrupt GIF"); + + o = stbi__process_gif_raster(s, g); + if (!o) return NULL; + + // if this was the first frame, + pcount = g->w * g->h; + if (first_frame && (g->bgindex > 0)) { + // if first frame, any pixel not drawn to gets the background color + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi] == 0) { + g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be; + memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 ); + } + } + } + + return o; + } + + case 0x21: // Comment Extension. + { + int len; + int ext = stbi__get8(s); + if (ext == 0xF9) { // Graphic Control Extension. + len = stbi__get8(s); + if (len == 4) { + g->eflags = stbi__get8(s); + g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths. + + // unset old transparent + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 255; + } + if (g->eflags & 0x01) { + g->transparent = stbi__get8(s); + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 0; + } + } else { + // don't need transparent + stbi__skip(s, 1); + g->transparent = -1; + } + } else { + stbi__skip(s, len); + break; + } + } + while ((len = stbi__get8(s)) != 0) { + stbi__skip(s, len); + } + break; + } + + case 0x3B: // gif stream termination code + return (stbi_uc *) s; // using '1' causes warning on some compilers + + default: + return stbi__errpuc("unknown code", "Corrupt GIF"); + } + } +} + +static void *stbi__load_gif_main_outofmem(stbi__gif *g, stbi_uc *out, int **delays) +{ + STBI_FREE(g->out); + STBI_FREE(g->history); + STBI_FREE(g->background); + + if (out) STBI_FREE(out); + if (delays && *delays) STBI_FREE(*delays); + return stbi__errpuc("outofmem", "Out of memory"); +} + +static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp) +{ + if (stbi__gif_test(s)) { + int layers = 0; + stbi_uc *u = 0; + stbi_uc *out = 0; + stbi_uc *two_back = 0; + stbi__gif g; + int stride; + int out_size = 0; + int delays_size = 0; + + STBI_NOTUSED(out_size); + STBI_NOTUSED(delays_size); + + memset(&g, 0, sizeof(g)); + if (delays) { + *delays = 0; + } + + do { + u = stbi__gif_load_next(s, &g, comp, req_comp, two_back); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + + if (u) { + *x = g.w; + *y = g.h; + ++layers; + stride = g.w * g.h * 4; + + if (out) { + void *tmp = (stbi_uc*) STBI_REALLOC_SIZED( out, out_size, layers * stride ); + if (!tmp) + return stbi__load_gif_main_outofmem(&g, out, delays); + else { + out = (stbi_uc*) tmp; + out_size = layers * stride; + } + + if (delays) { + int *new_delays = (int*) STBI_REALLOC_SIZED( *delays, delays_size, sizeof(int) * layers ); + if (!new_delays) + return stbi__load_gif_main_outofmem(&g, out, delays); + *delays = new_delays; + delays_size = layers * sizeof(int); + } + } else { + out = (stbi_uc*)stbi__malloc( layers * stride ); + if (!out) + return stbi__load_gif_main_outofmem(&g, out, delays); + out_size = layers * stride; + if (delays) { + *delays = (int*) stbi__malloc( layers * sizeof(int) ); + if (!*delays) + return stbi__load_gif_main_outofmem(&g, out, delays); + delays_size = layers * sizeof(int); + } + } + memcpy( out + ((layers - 1) * stride), u, stride ); + if (layers >= 2) { + two_back = out - 2 * stride; + } + + if (delays) { + (*delays)[layers - 1U] = g.delay; + } + } + } while (u != 0); + + // free temp buffer; + STBI_FREE(g.out); + STBI_FREE(g.history); + STBI_FREE(g.background); + + // do the final conversion after loading everything; + if (req_comp && req_comp != 4) + out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h); + + *z = layers; + return out; + } else { + return stbi__errpuc("not GIF", "Image was not as a gif type."); + } +} + +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *u = 0; + stbi__gif g; + memset(&g, 0, sizeof(g)); + STBI_NOTUSED(ri); + + u = stbi__gif_load_next(s, &g, comp, req_comp, 0); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + if (u) { + *x = g.w; + *y = g.h; + + // moved conversion to after successful load so that the same + // can be done for multiple frames. + if (req_comp && req_comp != 4) + u = stbi__convert_format(u, 4, req_comp, g.w, g.h); + } else if (g.out) { + // if there was an error and we allocated an image buffer, free it! + STBI_FREE(g.out); + } + + // free buffers needed for multiple frame loading; + STBI_FREE(g.history); + STBI_FREE(g.background); + + return u; +} + +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp) +{ + return stbi__gif_info_raw(s,x,y,comp); +} +#endif + +// ************************************************************************************************* +// Radiance RGBE HDR loader +// originally by Nicolas Schulz +#ifndef STBI_NO_HDR +static int stbi__hdr_test_core(stbi__context *s, const char *signature) +{ + int i; + for (i=0; signature[i]; ++i) + if (stbi__get8(s) != signature[i]) + return 0; + stbi__rewind(s); + return 1; +} + +static int stbi__hdr_test(stbi__context* s) +{ + int r = stbi__hdr_test_core(s, "#?RADIANCE\n"); + stbi__rewind(s); + if(!r) { + r = stbi__hdr_test_core(s, "#?RGBE\n"); + stbi__rewind(s); + } + return r; +} + +#define STBI__HDR_BUFLEN 1024 +static char *stbi__hdr_gettoken(stbi__context *z, char *buffer) +{ + int len=0; + char c = '\0'; + + c = (char) stbi__get8(z); + + while (!stbi__at_eof(z) && c != '\n') { + buffer[len++] = c; + if (len == STBI__HDR_BUFLEN-1) { + // flush to end of line + while (!stbi__at_eof(z) && stbi__get8(z) != '\n') + ; + break; + } + c = (char) stbi__get8(z); + } + + buffer[len] = 0; + return buffer; +} + +static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp) +{ + if ( input[3] != 0 ) { + float f1; + // Exponent + f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); + if (req_comp <= 2) + output[0] = (input[0] + input[1] + input[2]) * f1 / 3; + else { + output[0] = input[0] * f1; + output[1] = input[1] * f1; + output[2] = input[2] * f1; + } + if (req_comp == 2) output[1] = 1; + if (req_comp == 4) output[3] = 1; + } else { + switch (req_comp) { + case 4: output[3] = 1; /* fallthrough */ + case 3: output[0] = output[1] = output[2] = 0; + break; + case 2: output[1] = 1; /* fallthrough */ + case 1: output[0] = 0; + break; + } + } +} + +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + int width, height; + stbi_uc *scanline; + float *hdr_data; + int len; + unsigned char count, value; + int i, j, k, c1,c2, z; + const char *headerToken; + STBI_NOTUSED(ri); + + // Check identifier + headerToken = stbi__hdr_gettoken(s,buffer); + if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0) + return stbi__errpf("not HDR", "Corrupt HDR image"); + + // Parse header + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) return stbi__errpf("unsupported format", "Unsupported HDR format"); + + // Parse width and height + // can't use sscanf() if we're not using stdio! + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + height = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + width = (int) strtol(token, NULL, 10); + + if (height > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)"); + if (width > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)"); + + *x = width; + *y = height; + + if (comp) *comp = 3; + if (req_comp == 0) req_comp = 3; + + if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0)) + return stbi__errpf("too large", "HDR image is too large"); + + // Read data + hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0); + if (!hdr_data) + return stbi__errpf("outofmem", "Out of memory"); + + // Load image data + // image data is stored as some number of sca + if ( width < 8 || width >= 32768) { + // Read flat data + for (j=0; j < height; ++j) { + for (i=0; i < width; ++i) { + stbi_uc rgbe[4]; + main_decode_loop: + stbi__getn(s, rgbe, 4); + stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); + } + } + } else { + // Read RLE-encoded data + scanline = NULL; + + for (j = 0; j < height; ++j) { + c1 = stbi__get8(s); + c2 = stbi__get8(s); + len = stbi__get8(s); + if (c1 != 2 || c2 != 2 || (len & 0x80)) { + // not run-length encoded, so we have to actually use THIS data as a decoded + // pixel (note this can't be a valid pixel--one of RGB must be >= 128) + stbi_uc rgbe[4]; + rgbe[0] = (stbi_uc) c1; + rgbe[1] = (stbi_uc) c2; + rgbe[2] = (stbi_uc) len; + rgbe[3] = (stbi_uc) stbi__get8(s); + stbi__hdr_convert(hdr_data, rgbe, req_comp); + i = 1; + j = 0; + STBI_FREE(scanline); + goto main_decode_loop; // yes, this makes no sense + } + len <<= 8; + len |= stbi__get8(s); + if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } + if (scanline == NULL) { + scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0); + if (!scanline) { + STBI_FREE(hdr_data); + return stbi__errpf("outofmem", "Out of memory"); + } + } + + for (k = 0; k < 4; ++k) { + int nleft; + i = 0; + while ((nleft = width - i) > 0) { + count = stbi__get8(s); + if (count > 128) { + // Run + value = stbi__get8(s); + count -= 128; + if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = value; + } else { + // Dump + if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = stbi__get8(s); + } + } + } + for (i=0; i < width; ++i) + stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); + } + if (scanline) + STBI_FREE(scanline); + } + + return hdr_data; +} + +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + int dummy; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + if (stbi__hdr_test(s) == 0) { + stbi__rewind( s ); + return 0; + } + + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) { + stbi__rewind( s ); + return 0; + } + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *y = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *x = (int) strtol(token, NULL, 10); + *comp = 3; + return 1; +} +#endif // STBI_NO_HDR + +#ifndef STBI_NO_BMP +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) +{ + void *p; + stbi__bmp_data info; + + info.all_a = 255; + p = stbi__bmp_parse_header(s, &info); + if (p == NULL) { + stbi__rewind( s ); + return 0; + } + if (x) *x = s->img_x; + if (y) *y = s->img_y; + if (comp) { + if (info.bpp == 24 && info.ma == 0xff000000) + *comp = 3; + else + *comp = info.ma ? 4 : 3; + } + return 1; +} +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) +{ + int channelCount, dummy, depth; + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind( s ); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind( s ); + return 0; + } + *y = stbi__get32be(s); + *x = stbi__get32be(s); + depth = stbi__get16be(s); + if (depth != 8 && depth != 16) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 3) { + stbi__rewind( s ); + return 0; + } + *comp = 4; + return 1; +} + +static int stbi__psd_is16(stbi__context *s) +{ + int channelCount, depth; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind( s ); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind( s ); + return 0; + } + STBI_NOTUSED(stbi__get32be(s)); + STBI_NOTUSED(stbi__get32be(s)); + depth = stbi__get16be(s); + if (depth != 16) { + stbi__rewind( s ); + return 0; + } + return 1; +} +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) +{ + int act_comp=0,num_packets=0,chained,dummy; + stbi__pic_packet packets[10]; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) { + stbi__rewind(s); + return 0; + } + + stbi__skip(s, 88); + + *x = stbi__get16be(s); + *y = stbi__get16be(s); + if (stbi__at_eof(s)) { + stbi__rewind( s); + return 0; + } + if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { + stbi__rewind( s ); + return 0; + } + + stbi__skip(s, 8); + + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return 0; + + packet = &packets[num_packets++]; + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + act_comp |= packet->channel; + + if (stbi__at_eof(s)) { + stbi__rewind( s ); + return 0; + } + if (packet->size != 8) { + stbi__rewind( s ); + return 0; + } + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); + + return 1; +} +#endif + +// ************************************************************************************************* +// Portable Gray Map and Portable Pixel Map loader +// by Ken Miller +// +// PGM: http://netpbm.sourceforge.net/doc/pgm.html +// PPM: http://netpbm.sourceforge.net/doc/ppm.html +// +// Known limitations: +// Does not support comments in the header section +// Does not support ASCII image data (formats P2 and P3) + +#ifndef STBI_NO_PNM + +static int stbi__pnm_test(stbi__context *s) +{ + char p, t; + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind( s ); + return 0; + } + return 1; +} + +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *out; + STBI_NOTUSED(ri); + + ri->bits_per_channel = stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n); + if (ri->bits_per_channel == 0) + return 0; + + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + + if (!stbi__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0)) + return stbi__errpuc("too large", "PNM too large"); + + out = (stbi_uc *) stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + if (!stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8))) { + STBI_FREE(out); + return stbi__errpuc("bad PNM", "PNM file truncated"); + } + + if (req_comp && req_comp != s->img_n) { + if (ri->bits_per_channel == 16) { + out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, s->img_n, req_comp, s->img_x, s->img_y); + } else { + out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); + } + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + return out; +} + +static int stbi__pnm_isspace(char c) +{ + return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'; +} + +static void stbi__pnm_skip_whitespace(stbi__context *s, char *c) +{ + for (;;) { + while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) + *c = (char) stbi__get8(s); + + if (stbi__at_eof(s) || *c != '#') + break; + + while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' ) + *c = (char) stbi__get8(s); + } +} + +static int stbi__pnm_isdigit(char c) +{ + return c >= '0' && c <= '9'; +} + +static int stbi__pnm_getinteger(stbi__context *s, char *c) +{ + int value = 0; + + while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) { + value = value*10 + (*c - '0'); + *c = (char) stbi__get8(s); + if((value > 214748364) || (value == 214748364 && *c > '7')) + return stbi__err("integer parse overflow", "Parsing an integer in the PPM header overflowed a 32-bit int"); + } + + return value; +} + +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) +{ + int maxv, dummy; + char c, p, t; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + stbi__rewind(s); + + // Get identifier + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind(s); + return 0; + } + + *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm + + c = (char) stbi__get8(s); + stbi__pnm_skip_whitespace(s, &c); + + *x = stbi__pnm_getinteger(s, &c); // read width + if(*x == 0) + return stbi__err("invalid width", "PPM image header had zero or overflowing width"); + stbi__pnm_skip_whitespace(s, &c); + + *y = stbi__pnm_getinteger(s, &c); // read height + if (*y == 0) + return stbi__err("invalid width", "PPM image header had zero or overflowing width"); + stbi__pnm_skip_whitespace(s, &c); + + maxv = stbi__pnm_getinteger(s, &c); // read max value + if (maxv > 65535) + return stbi__err("max value > 65535", "PPM image supports only 8-bit and 16-bit images"); + else if (maxv > 255) + return 16; + else + return 8; +} + +static int stbi__pnm_is16(stbi__context *s) +{ + if (stbi__pnm_info(s, NULL, NULL, NULL) == 16) + return 1; + return 0; +} +#endif + +static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp) +{ + #ifndef STBI_NO_JPEG + if (stbi__jpeg_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PNG + if (stbi__png_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_GIF + if (stbi__gif_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_BMP + if (stbi__bmp_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PSD + if (stbi__psd_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PIC + if (stbi__pic_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PNM + if (stbi__pnm_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_HDR + if (stbi__hdr_info(s, x, y, comp)) return 1; + #endif + + // test tga last because it's a crappy test! + #ifndef STBI_NO_TGA + if (stbi__tga_info(s, x, y, comp)) + return 1; + #endif + return stbi__err("unknown image type", "Image not of any known type, or corrupt"); +} + +static int stbi__is_16_main(stbi__context *s) +{ + #ifndef STBI_NO_PNG + if (stbi__png_is16(s)) return 1; + #endif + + #ifndef STBI_NO_PSD + if (stbi__psd_is16(s)) return 1; + #endif + + #ifndef STBI_NO_PNM + if (stbi__pnm_is16(s)) return 1; + #endif + return 0; +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_info_from_file(f, x, y, comp); + fclose(f); + return result; +} + +STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__info_main(&s,x,y,comp); + fseek(f,pos,SEEK_SET); + return r; +} + +STBIDEF int stbi_is_16_bit(char const *filename) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_is_16_bit_from_file(f); + fclose(f); + return result; +} + +STBIDEF int stbi_is_16_bit_from_file(FILE *f) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__is_16_main(&s); + fseek(f,pos,SEEK_SET); + return r; +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__info_main(&s,x,y,comp); +} + +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__info_main(&s,x,y,comp); +} + +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__is_16_main(&s); +} + +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__is_16_main(&s); +} + +#endif // STB_IMAGE_IMPLEMENTATION + +/* + revision history: + 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug + 1-bit BMP + *_is_16_bit api + avoid warnings + 2.16 (2017-07-23) all functions have 16-bit variants; + STBI_NO_STDIO works again; + compilation fixes; + fix rounding in unpremultiply; + optimize vertical flip; + disable raw_len validation; + documentation fixes + 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; + warning fixes; disable run-time SSE detection on gcc; + uniform handling of optional "return" values; + thread-safe initialization of zlib tables + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) allocate large structures on the stack + remove white matting for transparent PSD + fix reported channel count for PNG & BMP + re-enable SSE2 in non-gcc 64-bit + support RGB-formatted JPEG + read 16-bit PNGs (only as 8-bit) + 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED + 2.09 (2016-01-16) allow comments in PNM files + 16-bit-per-pixel TGA (not bit-per-component) + info() for TGA could break due to .hdr handling + info() for BMP to shares code instead of sloppy parse + can use STBI_REALLOC_SIZED if allocator doesn't support realloc + code cleanup + 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA + 2.07 (2015-09-13) fix compiler warnings + partial animated GIF support + limited 16-bpc PSD support + #ifdef unused functions + bug with < 92 byte PIC,PNM,HDR,TGA + 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value + 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning + 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit + 2.03 (2015-04-12) extra corruption checking (mmozeiko) + stbi_set_flip_vertically_on_load (nguillemot) + fix NEON support; fix mingw support + 2.02 (2015-01-19) fix incorrect assert, fix warning + 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 + 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG + 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) + progressive JPEG (stb) + PGM/PPM support (Ken Miller) + STBI_MALLOC,STBI_REALLOC,STBI_FREE + GIF bugfix -- seemingly never worked + STBI_NO_*, STBI_ONLY_* + 1.48 (2014-12-14) fix incorrectly-named assert() + 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb) + optimize PNG (ryg) + fix bug in interlaced PNG with user-specified channel count (stb) + 1.46 (2014-08-26) + fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG + 1.45 (2014-08-16) + fix MSVC-ARM internal compiler error by wrapping malloc + 1.44 (2014-08-07) + various warning fixes from Ronny Chevalier + 1.43 (2014-07-15) + fix MSVC-only compiler problem in code changed in 1.42 + 1.42 (2014-07-09) + don't define _CRT_SECURE_NO_WARNINGS (affects user code) + fixes to stbi__cleanup_jpeg path + added STBI_ASSERT to avoid requiring assert.h + 1.41 (2014-06-25) + fix search&replace from 1.36 that messed up comments/error messages + 1.40 (2014-06-22) + fix gcc struct-initialization warning + 1.39 (2014-06-15) + fix to TGA optimization when req_comp != number of components in TGA; + fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) + add support for BMP version 5 (more ignored fields) + 1.38 (2014-06-06) + suppress MSVC warnings on integer casts truncating values + fix accidental rename of 'skip' field of I/O + 1.37 (2014-06-04) + remove duplicate typedef + 1.36 (2014-06-03) + convert to header file single-file library + if de-iphone isn't set, load iphone images color-swapped instead of returning NULL + 1.35 (2014-05-27) + various warnings + fix broken STBI_SIMD path + fix bug where stbi_load_from_file no longer left file pointer in correct place + fix broken non-easy path for 32-bit BMP (possibly never used) + TGA optimization by Arseny Kapoulkine + 1.34 (unknown) + use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case + 1.33 (2011-07-14) + make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements + 1.32 (2011-07-13) + support for "info" function for all supported filetypes (SpartanJ) + 1.31 (2011-06-20) + a few more leak fixes, bug in PNG handling (SpartanJ) + 1.30 (2011-06-11) + added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) + removed deprecated format-specific test/load functions + removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway + error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) + fix inefficiency in decoding 32-bit BMP (David Woo) + 1.29 (2010-08-16) + various warning fixes from Aurelien Pocheville + 1.28 (2010-08-01) + fix bug in GIF palette transparency (SpartanJ) + 1.27 (2010-08-01) + cast-to-stbi_uc to fix warnings + 1.26 (2010-07-24) + fix bug in file buffering for PNG reported by SpartanJ + 1.25 (2010-07-17) + refix trans_data warning (Won Chun) + 1.24 (2010-07-12) + perf improvements reading from files on platforms with lock-heavy fgetc() + minor perf improvements for jpeg + deprecated type-specific functions so we'll get feedback if they're needed + attempt to fix trans_data warning (Won Chun) + 1.23 fixed bug in iPhone support + 1.22 (2010-07-10) + removed image *writing* support + stbi_info support from Jetro Lauha + GIF support from Jean-Marc Lienher + iPhone PNG-extensions from James Brown + warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) + 1.21 fix use of 'stbi_uc' in header (reported by jon blow) + 1.20 added support for Softimage PIC, by Tom Seddon + 1.19 bug in interlaced PNG corruption check (found by ryg) + 1.18 (2008-08-02) + fix a threading bug (local mutable static) + 1.17 support interlaced PNG + 1.16 major bugfix - stbi__convert_format converted one too many pixels + 1.15 initialize some fields for thread safety + 1.14 fix threadsafe conversion bug + header-file-only version (#define STBI_HEADER_FILE_ONLY before including) + 1.13 threadsafe + 1.12 const qualifiers in the API + 1.11 Support installable IDCT, colorspace conversion routines + 1.10 Fixes for 64-bit (don't use "unsigned long") + optimized upsampling by Fabian "ryg" Giesen + 1.09 Fix format-conversion for PSD code (bad global variables!) + 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz + 1.07 attempt to fix C++ warning/errors again + 1.06 attempt to fix C++ warning/errors again + 1.05 fix TGA loading to return correct *comp and use good luminance calc + 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free + 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR + 1.02 support for (subset of) HDR files, float interface for preferred access to them + 1.01 fix bug: possible bug in handling right-side up bmps... not sure + fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all + 1.00 interface to zlib that skips zlib header + 0.99 correct handling of alpha in palette + 0.98 TGA loader by lonesock; dynamically add loaders (untested) + 0.97 jpeg errors on too large a file; also catch another malloc failure + 0.96 fix detection of invalid v value - particleman@mollyrocket forum + 0.95 during header scan, seek to markers in case of padding + 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same + 0.93 handle jpegtran output; verbose errors + 0.92 read 4,8,16,24,32-bit BMP files of several formats + 0.91 output 24-bit Windows 3.0 BMP files + 0.90 fix a few more warnings; bump version number to approach 1.0 + 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd + 0.60 fix compiling as c++ + 0.59 fix warnings: merge Dave Moore's -Wall fixes + 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian + 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available + 0.56 fix bug: zlib uncompressed mode len vs. nlen + 0.55 fix bug: restart_interval not initialized to 0 + 0.54 allow NULL for 'int *comp' + 0.53 fix bug in png 3->4; speedup png decoding + 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments + 0.51 obey req_comp requests, 1-component jpegs return as 1-component, + on 'test' only check type, not whether we support this variant + 0.50 (2006-11-19) + first released version +*/ + + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/external/stb/stb_sprintf.h b/external/stb/stb_sprintf.h new file mode 100644 index 0000000..ca432a6 --- /dev/null +++ b/external/stb/stb_sprintf.h @@ -0,0 +1,1906 @@ +// stb_sprintf - v1.10 - public domain snprintf() implementation +// originally by Jeff Roberts / RAD Game Tools, 2015/10/20 +// http://github.com/nothings/stb +// +// allowed types: sc uidBboXx p AaGgEef n +// lengths : hh h ll j z t I64 I32 I +// +// Contributors: +// Fabian "ryg" Giesen (reformatting) +// github:aganm (attribute format) +// +// Contributors (bugfixes): +// github:d26435 +// github:trex78 +// github:account-login +// Jari Komppa (SI suffixes) +// Rohit Nirmal +// Marcin Wojdyr +// Leonard Ritter +// Stefano Zanotti +// Adam Allison +// Arvid Gerstmann +// Markus Kolb +// +// LICENSE: +// +// See end of file for license information. + +#ifndef STB_SPRINTF_H_INCLUDE +#define STB_SPRINTF_H_INCLUDE + +/* +Single file sprintf replacement. + +Originally written by Jeff Roberts at RAD Game Tools - 2015/10/20. +Hereby placed in public domain. + +This is a full sprintf replacement that supports everything that +the C runtime sprintfs support, including float/double, 64-bit integers, +hex floats, field parameters (%*.*d stuff), length reads backs, etc. + +Why would you need this if sprintf already exists? Well, first off, +it's *much* faster (see below). It's also much smaller than the CRT +versions code-space-wise. We've also added some simple improvements +that are super handy (commas in thousands, callbacks at buffer full, +for example). Finally, the format strings for MSVC and GCC differ +for 64-bit integers (among other small things), so this lets you use +the same format strings in cross platform code. + +It uses the standard single file trick of being both the header file +and the source itself. If you just include it normally, you just get +the header file function definitions. To get the code, you include +it from a C or C++ file and define STB_SPRINTF_IMPLEMENTATION first. + +It only uses va_args macros from the C runtime to do it's work. It +does cast doubles to S64s and shifts and divides U64s, which does +drag in CRT code on most platforms. + +It compiles to roughly 8K with float support, and 4K without. +As a comparison, when using MSVC static libs, calling sprintf drags +in 16K. + +API: +==== +int stbsp_sprintf( char * buf, char const * fmt, ... ) +int stbsp_snprintf( char * buf, int count, char const * fmt, ... ) + Convert an arg list into a buffer. stbsp_snprintf always returns + a zero-terminated string (unlike regular snprintf). + +int stbsp_vsprintf( char * buf, char const * fmt, va_list va ) +int stbsp_vsnprintf( char * buf, int count, char const * fmt, va_list va ) + Convert a va_list arg list into a buffer. stbsp_vsnprintf always returns + a zero-terminated string (unlike regular snprintf). + +int stbsp_vsprintfcb( STBSP_SPRINTFCB * callback, void * user, char * buf, char const * fmt, va_list va ) + typedef char * STBSP_SPRINTFCB( char const * buf, void * user, int len ); + Convert into a buffer, calling back every STB_SPRINTF_MIN chars. + Your callback can then copy the chars out, print them or whatever. + This function is actually the workhorse for everything else. + The buffer you pass in must hold at least STB_SPRINTF_MIN characters. + // you return the next buffer to use or 0 to stop converting + +void stbsp_set_separators( char comma, char period ) + Set the comma and period characters to use. + +FLOATS/DOUBLES: +=============== +This code uses a internal float->ascii conversion method that uses +doubles with error correction (double-doubles, for ~105 bits of +precision). This conversion is round-trip perfect - that is, an atof +of the values output here will give you the bit-exact double back. + +One difference is that our insignificant digits will be different than +with MSVC or GCC (but they don't match each other either). We also +don't attempt to find the minimum length matching float (pre-MSVC15 +doesn't either). + +If you don't need float or doubles at all, define STB_SPRINTF_NOFLOAT +and you'll save 4K of code space. + +64-BIT INTS: +============ +This library also supports 64-bit integers and you can use MSVC style or +GCC style indicators (%I64d or %lld). It supports the C99 specifiers +for size_t and ptr_diff_t (%jd %zd) as well. + +EXTRAS: +======= +Like some GCCs, for integers and floats, you can use a ' (single quote) +specifier and commas will be inserted on the thousands: "%'d" on 12345 +would print 12,345. + +For integers and floats, you can use a "$" specifier and the number +will be converted to float and then divided to get kilo, mega, giga or +tera and then printed, so "%$d" 1000 is "1.0 k", "%$.2d" 2536000 is +"2.53 M", etc. For byte values, use two $:s, like "%$$d" to turn +2536000 to "2.42 Mi". If you prefer JEDEC suffixes to SI ones, use three +$:s: "%$$$d" -> "2.42 M". To remove the space between the number and the +suffix, add "_" specifier: "%_$d" -> "2.53M". + +In addition to octal and hexadecimal conversions, you can print +integers in binary: "%b" for 256 would print 100. + +PERFORMANCE vs MSVC 2008 32-/64-bit (GCC is even slower than MSVC): +=================================================================== +"%d" across all 32-bit ints (4.8x/4.0x faster than 32-/64-bit MSVC) +"%24d" across all 32-bit ints (4.5x/4.2x faster) +"%x" across all 32-bit ints (4.5x/3.8x faster) +"%08x" across all 32-bit ints (4.3x/3.8x faster) +"%f" across e-10 to e+10 floats (7.3x/6.0x faster) +"%e" across e-10 to e+10 floats (8.1x/6.0x faster) +"%g" across e-10 to e+10 floats (10.0x/7.1x faster) +"%f" for values near e-300 (7.9x/6.5x faster) +"%f" for values near e+300 (10.0x/9.1x faster) +"%e" for values near e-300 (10.1x/7.0x faster) +"%e" for values near e+300 (9.2x/6.0x faster) +"%.320f" for values near e-300 (12.6x/11.2x faster) +"%a" for random values (8.6x/4.3x faster) +"%I64d" for 64-bits with 32-bit values (4.8x/3.4x faster) +"%I64d" for 64-bits > 32-bit values (4.9x/5.5x faster) +"%s%s%s" for 64 char strings (7.1x/7.3x faster) +"...512 char string..." ( 35.0x/32.5x faster!) +*/ + +#if defined(__clang__) + #if defined(__has_feature) && defined(__has_attribute) + #if __has_feature(address_sanitizer) + #if __has_attribute(__no_sanitize__) + #define STBSP__ASAN __attribute__((__no_sanitize__("address"))) + #elif __has_attribute(__no_sanitize_address__) + #define STBSP__ASAN __attribute__((__no_sanitize_address__)) + #elif __has_attribute(__no_address_safety_analysis__) + #define STBSP__ASAN __attribute__((__no_address_safety_analysis__)) + #endif + #endif + #endif +#elif defined(__GNUC__) && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) + #if defined(__SANITIZE_ADDRESS__) && __SANITIZE_ADDRESS__ + #define STBSP__ASAN __attribute__((__no_sanitize_address__)) + #endif +#endif + +#ifndef STBSP__ASAN +#define STBSP__ASAN +#endif + +#ifdef STB_SPRINTF_STATIC +#define STBSP__PUBLICDEC static +#define STBSP__PUBLICDEF static STBSP__ASAN +#else +#ifdef __cplusplus +#define STBSP__PUBLICDEC extern "C" +#define STBSP__PUBLICDEF extern "C" STBSP__ASAN +#else +#define STBSP__PUBLICDEC extern +#define STBSP__PUBLICDEF STBSP__ASAN +#endif +#endif + +#if defined(__has_attribute) + #if __has_attribute(format) + #define STBSP__ATTRIBUTE_FORMAT(fmt,va) __attribute__((format(printf,fmt,va))) + #endif +#endif + +#ifndef STBSP__ATTRIBUTE_FORMAT +#define STBSP__ATTRIBUTE_FORMAT(fmt,va) +#endif + +#ifdef _MSC_VER +#define STBSP__NOTUSED(v) (void)(v) +#else +#define STBSP__NOTUSED(v) (void)sizeof(v) +#endif + +#include // for va_arg(), va_list() +#include // size_t, ptrdiff_t + +#ifndef STB_SPRINTF_MIN +#define STB_SPRINTF_MIN 512 // how many characters per callback +#endif +typedef char *STBSP_SPRINTFCB(const char *buf, void *user, int len); + +#ifndef STB_SPRINTF_DECORATE +#define STB_SPRINTF_DECORATE(name) stbsp_##name // define this before including if you want to change the names +#endif + +STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(vsprintf)(char *buf, char const *fmt, va_list va); +STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(vsnprintf)(char *buf, int count, char const *fmt, va_list va); +STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(sprintf)(char *buf, char const *fmt, ...) STBSP__ATTRIBUTE_FORMAT(2,3); +STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(snprintf)(char *buf, int count, char const *fmt, ...) STBSP__ATTRIBUTE_FORMAT(3,4); + +STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(vsprintfcb)(STBSP_SPRINTFCB *callback, void *user, char *buf, char const *fmt, va_list va); +STBSP__PUBLICDEC void STB_SPRINTF_DECORATE(set_separators)(char comma, char period); + +#endif // STB_SPRINTF_H_INCLUDE + +#ifdef STB_SPRINTF_IMPLEMENTATION + +#define stbsp__uint32 unsigned int +#define stbsp__int32 signed int + +#ifdef _MSC_VER +#define stbsp__uint64 unsigned __int64 +#define stbsp__int64 signed __int64 +#else +#define stbsp__uint64 unsigned long long +#define stbsp__int64 signed long long +#endif +#define stbsp__uint16 unsigned short + +#ifndef stbsp__uintptr +#if defined(__ppc64__) || defined(__powerpc64__) || defined(__aarch64__) || defined(_M_X64) || defined(__x86_64__) || defined(__x86_64) || defined(__s390x__) +#define stbsp__uintptr stbsp__uint64 +#else +#define stbsp__uintptr stbsp__uint32 +#endif +#endif + +#ifndef STB_SPRINTF_MSVC_MODE // used for MSVC2013 and earlier (MSVC2015 matches GCC) +#if defined(_MSC_VER) && (_MSC_VER < 1900) +#define STB_SPRINTF_MSVC_MODE +#endif +#endif + +#ifdef STB_SPRINTF_NOUNALIGNED // define this before inclusion to force stbsp_sprintf to always use aligned accesses +#define STBSP__UNALIGNED(code) +#else +#define STBSP__UNALIGNED(code) code +#endif + +#ifndef STB_SPRINTF_NOFLOAT +// internal float utility functions +static stbsp__int32 stbsp__real_to_str(char const **start, stbsp__uint32 *len, char *out, stbsp__int32 *decimal_pos, double value, stbsp__uint32 frac_digits); +static stbsp__int32 stbsp__real_to_parts(stbsp__int64 *bits, stbsp__int32 *expo, double value); +#define STBSP__SPECIAL 0x7000 +#endif + +static char stbsp__period = '.'; +static char stbsp__comma = ','; +static struct +{ + short temp; // force next field to be 2-byte aligned + char pair[201]; +} stbsp__digitpair = +{ + 0, + "00010203040506070809101112131415161718192021222324" + "25262728293031323334353637383940414243444546474849" + "50515253545556575859606162636465666768697071727374" + "75767778798081828384858687888990919293949596979899" +}; + +STBSP__PUBLICDEF void STB_SPRINTF_DECORATE(set_separators)(char pcomma, char pperiod) +{ + stbsp__period = pperiod; + stbsp__comma = pcomma; +} + +#define STBSP__LEFTJUST 1 +#define STBSP__LEADINGPLUS 2 +#define STBSP__LEADINGSPACE 4 +#define STBSP__LEADING_0X 8 +#define STBSP__LEADINGZERO 16 +#define STBSP__INTMAX 32 +#define STBSP__TRIPLET_COMMA 64 +#define STBSP__NEGATIVE 128 +#define STBSP__METRIC_SUFFIX 256 +#define STBSP__HALFWIDTH 512 +#define STBSP__METRIC_NOSPACE 1024 +#define STBSP__METRIC_1024 2048 +#define STBSP__METRIC_JEDEC 4096 + +static void stbsp__lead_sign(stbsp__uint32 fl, char *sign) +{ + sign[0] = 0; + if (fl & STBSP__NEGATIVE) { + sign[0] = 1; + sign[1] = '-'; + } else if (fl & STBSP__LEADINGSPACE) { + sign[0] = 1; + sign[1] = ' '; + } else if (fl & STBSP__LEADINGPLUS) { + sign[0] = 1; + sign[1] = '+'; + } +} + +static STBSP__ASAN stbsp__uint32 stbsp__strlen_limited(char const *s, stbsp__uint32 limit) +{ + char const * sn = s; + + // get up to 4-byte alignment + for (;;) { + if (((stbsp__uintptr)sn & 3) == 0) + break; + + if (!limit || *sn == 0) + return (stbsp__uint32)(sn - s); + + ++sn; + --limit; + } + + // scan over 4 bytes at a time to find terminating 0 + // this will intentionally scan up to 3 bytes past the end of buffers, + // but becase it works 4B aligned, it will never cross page boundaries + // (hence the STBSP__ASAN markup; the over-read here is intentional + // and harmless) + while (limit >= 4) { + stbsp__uint32 v = *(stbsp__uint32 *)sn; + // bit hack to find if there's a 0 byte in there + if ((v - 0x01010101) & (~v) & 0x80808080UL) + break; + + sn += 4; + limit -= 4; + } + + // handle the last few characters to find actual size + while (limit && *sn) { + ++sn; + --limit; + } + + return (stbsp__uint32)(sn - s); +} + +STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(vsprintfcb)(STBSP_SPRINTFCB *callback, void *user, char *buf, char const *fmt, va_list va) +{ + static char hex[] = "0123456789abcdefxp"; + static char hexu[] = "0123456789ABCDEFXP"; + char *bf; + char const *f; + int tlen = 0; + + bf = buf; + f = fmt; + for (;;) { + stbsp__int32 fw, pr, tz; + stbsp__uint32 fl; + + // macros for the callback buffer stuff + #define stbsp__chk_cb_bufL(bytes) \ + { \ + int len = (int)(bf - buf); \ + if ((len + (bytes)) >= STB_SPRINTF_MIN) { \ + tlen += len; \ + if (0 == (bf = buf = callback(buf, user, len))) \ + goto done; \ + } \ + } + #define stbsp__chk_cb_buf(bytes) \ + { \ + if (callback) { \ + stbsp__chk_cb_bufL(bytes); \ + } \ + } + #define stbsp__flush_cb() \ + { \ + stbsp__chk_cb_bufL(STB_SPRINTF_MIN - 1); \ + } // flush if there is even one byte in the buffer + #define stbsp__cb_buf_clamp(cl, v) \ + cl = v; \ + if (callback) { \ + int lg = STB_SPRINTF_MIN - (int)(bf - buf); \ + if (cl > lg) \ + cl = lg; \ + } + + // fast copy everything up to the next % (or end of string) + for (;;) { + while (((stbsp__uintptr)f) & 3) { + schk1: + if (f[0] == '%') + goto scandd; + schk2: + if (f[0] == 0) + goto endfmt; + stbsp__chk_cb_buf(1); + *bf++ = f[0]; + ++f; + } + for (;;) { + // Check if the next 4 bytes contain %(0x25) or end of string. + // Using the 'hasless' trick: + // https://graphics.stanford.edu/~seander/bithacks.html#HasLessInWord + stbsp__uint32 v, c; + v = *(stbsp__uint32 *)f; + c = (~v) & 0x80808080; + if (((v ^ 0x25252525) - 0x01010101) & c) + goto schk1; + if ((v - 0x01010101) & c) + goto schk2; + if (callback) + if ((STB_SPRINTF_MIN - (int)(bf - buf)) < 4) + goto schk1; + #ifdef STB_SPRINTF_NOUNALIGNED + if(((stbsp__uintptr)bf) & 3) { + bf[0] = f[0]; + bf[1] = f[1]; + bf[2] = f[2]; + bf[3] = f[3]; + } else + #endif + { + *(stbsp__uint32 *)bf = v; + } + bf += 4; + f += 4; + } + } + scandd: + + ++f; + + // ok, we have a percent, read the modifiers first + fw = 0; + pr = -1; + fl = 0; + tz = 0; + + // flags + for (;;) { + switch (f[0]) { + // if we have left justify + case '-': + fl |= STBSP__LEFTJUST; + ++f; + continue; + // if we have leading plus + case '+': + fl |= STBSP__LEADINGPLUS; + ++f; + continue; + // if we have leading space + case ' ': + fl |= STBSP__LEADINGSPACE; + ++f; + continue; + // if we have leading 0x + case '#': + fl |= STBSP__LEADING_0X; + ++f; + continue; + // if we have thousand commas + case '\'': + fl |= STBSP__TRIPLET_COMMA; + ++f; + continue; + // if we have kilo marker (none->kilo->kibi->jedec) + case '$': + if (fl & STBSP__METRIC_SUFFIX) { + if (fl & STBSP__METRIC_1024) { + fl |= STBSP__METRIC_JEDEC; + } else { + fl |= STBSP__METRIC_1024; + } + } else { + fl |= STBSP__METRIC_SUFFIX; + } + ++f; + continue; + // if we don't want space between metric suffix and number + case '_': + fl |= STBSP__METRIC_NOSPACE; + ++f; + continue; + // if we have leading zero + case '0': + fl |= STBSP__LEADINGZERO; + ++f; + goto flags_done; + default: goto flags_done; + } + } + flags_done: + + // get the field width + if (f[0] == '*') { + fw = va_arg(va, stbsp__uint32); + ++f; + } else { + while ((f[0] >= '0') && (f[0] <= '9')) { + fw = fw * 10 + f[0] - '0'; + f++; + } + } + // get the precision + if (f[0] == '.') { + ++f; + if (f[0] == '*') { + pr = va_arg(va, stbsp__uint32); + ++f; + } else { + pr = 0; + while ((f[0] >= '0') && (f[0] <= '9')) { + pr = pr * 10 + f[0] - '0'; + f++; + } + } + } + + // handle integer size overrides + switch (f[0]) { + // are we halfwidth? + case 'h': + fl |= STBSP__HALFWIDTH; + ++f; + if (f[0] == 'h') + ++f; // QUARTERWIDTH + break; + // are we 64-bit (unix style) + case 'l': + fl |= ((sizeof(long) == 8) ? STBSP__INTMAX : 0); + ++f; + if (f[0] == 'l') { + fl |= STBSP__INTMAX; + ++f; + } + break; + // are we 64-bit on intmax? (c99) + case 'j': + fl |= (sizeof(size_t) == 8) ? STBSP__INTMAX : 0; + ++f; + break; + // are we 64-bit on size_t or ptrdiff_t? (c99) + case 'z': + fl |= (sizeof(ptrdiff_t) == 8) ? STBSP__INTMAX : 0; + ++f; + break; + case 't': + fl |= (sizeof(ptrdiff_t) == 8) ? STBSP__INTMAX : 0; + ++f; + break; + // are we 64-bit (msft style) + case 'I': + if ((f[1] == '6') && (f[2] == '4')) { + fl |= STBSP__INTMAX; + f += 3; + } else if ((f[1] == '3') && (f[2] == '2')) { + f += 3; + } else { + fl |= ((sizeof(void *) == 8) ? STBSP__INTMAX : 0); + ++f; + } + break; + default: break; + } + + // handle each replacement + switch (f[0]) { + #define STBSP__NUMSZ 512 // big enough for e308 (with commas) or e-307 + char num[STBSP__NUMSZ]; + char lead[8]; + char tail[8]; + char *s; + char const *h; + stbsp__uint32 l, n, cs; + stbsp__uint64 n64; +#ifndef STB_SPRINTF_NOFLOAT + double fv; +#endif + stbsp__int32 dp; + char const *sn; + + case 's': + // get the string + s = va_arg(va, char *); + if (s == 0) + s = (char *)"null"; + // get the length, limited to desired precision + // always limit to ~0u chars since our counts are 32b + l = stbsp__strlen_limited(s, (pr >= 0) ? pr : ~0u); + lead[0] = 0; + tail[0] = 0; + pr = 0; + dp = 0; + cs = 0; + // copy the string in + goto scopy; + + case 'c': // char + // get the character + s = num + STBSP__NUMSZ - 1; + *s = (char)va_arg(va, int); + l = 1; + lead[0] = 0; + tail[0] = 0; + pr = 0; + dp = 0; + cs = 0; + goto scopy; + + case 'n': // weird write-bytes specifier + { + int *d = va_arg(va, int *); + *d = tlen + (int)(bf - buf); + } break; + +#ifdef STB_SPRINTF_NOFLOAT + case 'A': // float + case 'a': // hex float + case 'G': // float + case 'g': // float + case 'E': // float + case 'e': // float + case 'f': // float + va_arg(va, double); // eat it + s = (char *)"No float"; + l = 8; + lead[0] = 0; + tail[0] = 0; + pr = 0; + cs = 0; + STBSP__NOTUSED(dp); + goto scopy; +#else + case 'A': // hex float + case 'a': // hex float + h = (f[0] == 'A') ? hexu : hex; + fv = va_arg(va, double); + if (pr == -1) + pr = 6; // default is 6 + // read the double into a string + if (stbsp__real_to_parts((stbsp__int64 *)&n64, &dp, fv)) + fl |= STBSP__NEGATIVE; + + s = num + 64; + + stbsp__lead_sign(fl, lead); + + if (dp == -1023) + dp = (n64) ? -1022 : 0; + else + n64 |= (((stbsp__uint64)1) << 52); + n64 <<= (64 - 56); + if (pr < 15) + n64 += ((((stbsp__uint64)8) << 56) >> (pr * 4)); +// add leading chars + +#ifdef STB_SPRINTF_MSVC_MODE + *s++ = '0'; + *s++ = 'x'; +#else + lead[1 + lead[0]] = '0'; + lead[2 + lead[0]] = 'x'; + lead[0] += 2; +#endif + *s++ = h[(n64 >> 60) & 15]; + n64 <<= 4; + if (pr) + *s++ = stbsp__period; + sn = s; + + // print the bits + n = pr; + if (n > 13) + n = 13; + if (pr > (stbsp__int32)n) + tz = pr - n; + pr = 0; + while (n--) { + *s++ = h[(n64 >> 60) & 15]; + n64 <<= 4; + } + + // print the expo + tail[1] = h[17]; + if (dp < 0) { + tail[2] = '-'; + dp = -dp; + } else + tail[2] = '+'; + n = (dp >= 1000) ? 6 : ((dp >= 100) ? 5 : ((dp >= 10) ? 4 : 3)); + tail[0] = (char)n; + for (;;) { + tail[n] = '0' + dp % 10; + if (n <= 3) + break; + --n; + dp /= 10; + } + + dp = (int)(s - sn); + l = (int)(s - (num + 64)); + s = num + 64; + cs = 1 + (3 << 24); + goto scopy; + + case 'G': // float + case 'g': // float + h = (f[0] == 'G') ? hexu : hex; + fv = va_arg(va, double); + if (pr == -1) + pr = 6; + else if (pr == 0) + pr = 1; // default is 6 + // read the double into a string + if (stbsp__real_to_str(&sn, &l, num, &dp, fv, (pr - 1) | 0x80000000)) + fl |= STBSP__NEGATIVE; + + // clamp the precision and delete extra zeros after clamp + n = pr; + if (l > (stbsp__uint32)pr) + l = pr; + while ((l > 1) && (pr) && (sn[l - 1] == '0')) { + --pr; + --l; + } + + // should we use %e + if ((dp <= -4) || (dp > (stbsp__int32)n)) { + if (pr > (stbsp__int32)l) + pr = l - 1; + else if (pr) + --pr; // when using %e, there is one digit before the decimal + goto doexpfromg; + } + // this is the insane action to get the pr to match %g semantics for %f + if (dp > 0) { + pr = (dp < (stbsp__int32)l) ? l - dp : 0; + } else { + pr = -dp + ((pr > (stbsp__int32)l) ? (stbsp__int32) l : pr); + } + goto dofloatfromg; + + case 'E': // float + case 'e': // float + h = (f[0] == 'E') ? hexu : hex; + fv = va_arg(va, double); + if (pr == -1) + pr = 6; // default is 6 + // read the double into a string + if (stbsp__real_to_str(&sn, &l, num, &dp, fv, pr | 0x80000000)) + fl |= STBSP__NEGATIVE; + doexpfromg: + tail[0] = 0; + stbsp__lead_sign(fl, lead); + if (dp == STBSP__SPECIAL) { + s = (char *)sn; + cs = 0; + pr = 0; + goto scopy; + } + s = num + 64; + // handle leading chars + *s++ = sn[0]; + + if (pr) + *s++ = stbsp__period; + + // handle after decimal + if ((l - 1) > (stbsp__uint32)pr) + l = pr + 1; + for (n = 1; n < l; n++) + *s++ = sn[n]; + // trailing zeros + tz = pr - (l - 1); + pr = 0; + // dump expo + tail[1] = h[0xe]; + dp -= 1; + if (dp < 0) { + tail[2] = '-'; + dp = -dp; + } else + tail[2] = '+'; +#ifdef STB_SPRINTF_MSVC_MODE + n = 5; +#else + n = (dp >= 100) ? 5 : 4; +#endif + tail[0] = (char)n; + for (;;) { + tail[n] = '0' + dp % 10; + if (n <= 3) + break; + --n; + dp /= 10; + } + cs = 1 + (3 << 24); // how many tens + goto flt_lead; + + case 'f': // float + fv = va_arg(va, double); + doafloat: + // do kilos + if (fl & STBSP__METRIC_SUFFIX) { + double divisor; + divisor = 1000.0f; + if (fl & STBSP__METRIC_1024) + divisor = 1024.0; + while (fl < 0x4000000) { + if ((fv < divisor) && (fv > -divisor)) + break; + fv /= divisor; + fl += 0x1000000; + } + } + if (pr == -1) + pr = 6; // default is 6 + // read the double into a string + if (stbsp__real_to_str(&sn, &l, num, &dp, fv, pr)) + fl |= STBSP__NEGATIVE; + dofloatfromg: + tail[0] = 0; + stbsp__lead_sign(fl, lead); + if (dp == STBSP__SPECIAL) { + s = (char *)sn; + cs = 0; + pr = 0; + goto scopy; + } + s = num + 64; + + // handle the three decimal varieties + if (dp <= 0) { + stbsp__int32 i; + // handle 0.000*000xxxx + *s++ = '0'; + if (pr) + *s++ = stbsp__period; + n = -dp; + if ((stbsp__int32)n > pr) + n = pr; + i = n; + while (i) { + if ((((stbsp__uintptr)s) & 3) == 0) + break; + *s++ = '0'; + --i; + } + while (i >= 4) { + *(stbsp__uint32 *)s = 0x30303030; + s += 4; + i -= 4; + } + while (i) { + *s++ = '0'; + --i; + } + if ((stbsp__int32)(l + n) > pr) + l = pr - n; + i = l; + while (i) { + *s++ = *sn++; + --i; + } + tz = pr - (n + l); + cs = 1 + (3 << 24); // how many tens did we write (for commas below) + } else { + cs = (fl & STBSP__TRIPLET_COMMA) ? ((600 - (stbsp__uint32)dp) % 3) : 0; + if ((stbsp__uint32)dp >= l) { + // handle xxxx000*000.0 + n = 0; + for (;;) { + if ((fl & STBSP__TRIPLET_COMMA) && (++cs == 4)) { + cs = 0; + *s++ = stbsp__comma; + } else { + *s++ = sn[n]; + ++n; + if (n >= l) + break; + } + } + if (n < (stbsp__uint32)dp) { + n = dp - n; + if ((fl & STBSP__TRIPLET_COMMA) == 0) { + while (n) { + if ((((stbsp__uintptr)s) & 3) == 0) + break; + *s++ = '0'; + --n; + } + while (n >= 4) { + *(stbsp__uint32 *)s = 0x30303030; + s += 4; + n -= 4; + } + } + while (n) { + if ((fl & STBSP__TRIPLET_COMMA) && (++cs == 4)) { + cs = 0; + *s++ = stbsp__comma; + } else { + *s++ = '0'; + --n; + } + } + } + cs = (int)(s - (num + 64)) + (3 << 24); // cs is how many tens + if (pr) { + *s++ = stbsp__period; + tz = pr; + } + } else { + // handle xxxxx.xxxx000*000 + n = 0; + for (;;) { + if ((fl & STBSP__TRIPLET_COMMA) && (++cs == 4)) { + cs = 0; + *s++ = stbsp__comma; + } else { + *s++ = sn[n]; + ++n; + if (n >= (stbsp__uint32)dp) + break; + } + } + cs = (int)(s - (num + 64)) + (3 << 24); // cs is how many tens + if (pr) + *s++ = stbsp__period; + if ((l - dp) > (stbsp__uint32)pr) + l = pr + dp; + while (n < l) { + *s++ = sn[n]; + ++n; + } + tz = pr - (l - dp); + } + } + pr = 0; + + // handle k,m,g,t + if (fl & STBSP__METRIC_SUFFIX) { + char idx; + idx = 1; + if (fl & STBSP__METRIC_NOSPACE) + idx = 0; + tail[0] = idx; + tail[1] = ' '; + { + if (fl >> 24) { // SI kilo is 'k', JEDEC and SI kibits are 'K'. + if (fl & STBSP__METRIC_1024) + tail[idx + 1] = "_KMGT"[fl >> 24]; + else + tail[idx + 1] = "_kMGT"[fl >> 24]; + idx++; + // If printing kibits and not in jedec, add the 'i'. + if (fl & STBSP__METRIC_1024 && !(fl & STBSP__METRIC_JEDEC)) { + tail[idx + 1] = 'i'; + idx++; + } + tail[0] = idx; + } + } + }; + + flt_lead: + // get the length that we copied + l = (stbsp__uint32)(s - (num + 64)); + s = num + 64; + goto scopy; +#endif + + case 'B': // upper binary + case 'b': // lower binary + h = (f[0] == 'B') ? hexu : hex; + lead[0] = 0; + if (fl & STBSP__LEADING_0X) { + lead[0] = 2; + lead[1] = '0'; + lead[2] = h[0xb]; + } + l = (8 << 4) | (1 << 8); + goto radixnum; + + case 'o': // octal + h = hexu; + lead[0] = 0; + if (fl & STBSP__LEADING_0X) { + lead[0] = 1; + lead[1] = '0'; + } + l = (3 << 4) | (3 << 8); + goto radixnum; + + case 'p': // pointer + fl |= (sizeof(void *) == 8) ? STBSP__INTMAX : 0; + pr = sizeof(void *) * 2; + fl &= ~STBSP__LEADINGZERO; // 'p' only prints the pointer with zeros + // fall through - to X + + case 'X': // upper hex + case 'x': // lower hex + h = (f[0] == 'X') ? hexu : hex; + l = (4 << 4) | (4 << 8); + lead[0] = 0; + if (fl & STBSP__LEADING_0X) { + lead[0] = 2; + lead[1] = '0'; + lead[2] = h[16]; + } + radixnum: + // get the number + if (fl & STBSP__INTMAX) + n64 = va_arg(va, stbsp__uint64); + else + n64 = va_arg(va, stbsp__uint32); + + s = num + STBSP__NUMSZ; + dp = 0; + // clear tail, and clear leading if value is zero + tail[0] = 0; + if (n64 == 0) { + lead[0] = 0; + if (pr == 0) { + l = 0; + cs = 0; + goto scopy; + } + } + // convert to string + for (;;) { + *--s = h[n64 & ((1 << (l >> 8)) - 1)]; + n64 >>= (l >> 8); + if (!((n64) || ((stbsp__int32)((num + STBSP__NUMSZ) - s) < pr))) + break; + if (fl & STBSP__TRIPLET_COMMA) { + ++l; + if ((l & 15) == ((l >> 4) & 15)) { + l &= ~15; + *--s = stbsp__comma; + } + } + }; + // get the tens and the comma pos + cs = (stbsp__uint32)((num + STBSP__NUMSZ) - s) + ((((l >> 4) & 15)) << 24); + // get the length that we copied + l = (stbsp__uint32)((num + STBSP__NUMSZ) - s); + // copy it + goto scopy; + + case 'u': // unsigned + case 'i': + case 'd': // integer + // get the integer and abs it + if (fl & STBSP__INTMAX) { + stbsp__int64 i64 = va_arg(va, stbsp__int64); + n64 = (stbsp__uint64)i64; + if ((f[0] != 'u') && (i64 < 0)) { + n64 = (stbsp__uint64)-i64; + fl |= STBSP__NEGATIVE; + } + } else { + stbsp__int32 i = va_arg(va, stbsp__int32); + n64 = (stbsp__uint32)i; + if ((f[0] != 'u') && (i < 0)) { + n64 = (stbsp__uint32)-i; + fl |= STBSP__NEGATIVE; + } + } + +#ifndef STB_SPRINTF_NOFLOAT + if (fl & STBSP__METRIC_SUFFIX) { + if (n64 < 1024) + pr = 0; + else if (pr == -1) + pr = 1; + fv = (double)(stbsp__int64)n64; + goto doafloat; + } +#endif + + // convert to string + s = num + STBSP__NUMSZ; + l = 0; + + for (;;) { + // do in 32-bit chunks (avoid lots of 64-bit divides even with constant denominators) + char *o = s - 8; + if (n64 >= 100000000) { + n = (stbsp__uint32)(n64 % 100000000); + n64 /= 100000000; + } else { + n = (stbsp__uint32)n64; + n64 = 0; + } + if ((fl & STBSP__TRIPLET_COMMA) == 0) { + do { + s -= 2; + *(stbsp__uint16 *)s = *(stbsp__uint16 *)&stbsp__digitpair.pair[(n % 100) * 2]; + n /= 100; + } while (n); + } + while (n) { + if ((fl & STBSP__TRIPLET_COMMA) && (l++ == 3)) { + l = 0; + *--s = stbsp__comma; + --o; + } else { + *--s = (char)(n % 10) + '0'; + n /= 10; + } + } + if (n64 == 0) { + if ((s[0] == '0') && (s != (num + STBSP__NUMSZ))) + ++s; + break; + } + while (s != o) + if ((fl & STBSP__TRIPLET_COMMA) && (l++ == 3)) { + l = 0; + *--s = stbsp__comma; + --o; + } else { + *--s = '0'; + } + } + + tail[0] = 0; + stbsp__lead_sign(fl, lead); + + // get the length that we copied + l = (stbsp__uint32)((num + STBSP__NUMSZ) - s); + if (l == 0) { + *--s = '0'; + l = 1; + } + cs = l + (3 << 24); + if (pr < 0) + pr = 0; + + scopy: + // get fw=leading/trailing space, pr=leading zeros + if (pr < (stbsp__int32)l) + pr = l; + n = pr + lead[0] + tail[0] + tz; + if (fw < (stbsp__int32)n) + fw = n; + fw -= n; + pr -= l; + + // handle right justify and leading zeros + if ((fl & STBSP__LEFTJUST) == 0) { + if (fl & STBSP__LEADINGZERO) // if leading zeros, everything is in pr + { + pr = (fw > pr) ? fw : pr; + fw = 0; + } else { + fl &= ~STBSP__TRIPLET_COMMA; // if no leading zeros, then no commas + } + } + + // copy the spaces and/or zeros + if (fw + pr) { + stbsp__int32 i; + stbsp__uint32 c; + + // copy leading spaces (or when doing %8.4d stuff) + if ((fl & STBSP__LEFTJUST) == 0) + while (fw > 0) { + stbsp__cb_buf_clamp(i, fw); + fw -= i; + while (i) { + if ((((stbsp__uintptr)bf) & 3) == 0) + break; + *bf++ = ' '; + --i; + } + while (i >= 4) { + *(stbsp__uint32 *)bf = 0x20202020; + bf += 4; + i -= 4; + } + while (i) { + *bf++ = ' '; + --i; + } + stbsp__chk_cb_buf(1); + } + + // copy leader + sn = lead + 1; + while (lead[0]) { + stbsp__cb_buf_clamp(i, lead[0]); + lead[0] -= (char)i; + while (i) { + *bf++ = *sn++; + --i; + } + stbsp__chk_cb_buf(1); + } + + // copy leading zeros + c = cs >> 24; + cs &= 0xffffff; + cs = (fl & STBSP__TRIPLET_COMMA) ? ((stbsp__uint32)(c - ((pr + cs) % (c + 1)))) : 0; + while (pr > 0) { + stbsp__cb_buf_clamp(i, pr); + pr -= i; + if ((fl & STBSP__TRIPLET_COMMA) == 0) { + while (i) { + if ((((stbsp__uintptr)bf) & 3) == 0) + break; + *bf++ = '0'; + --i; + } + while (i >= 4) { + *(stbsp__uint32 *)bf = 0x30303030; + bf += 4; + i -= 4; + } + } + while (i) { + if ((fl & STBSP__TRIPLET_COMMA) && (cs++ == c)) { + cs = 0; + *bf++ = stbsp__comma; + } else + *bf++ = '0'; + --i; + } + stbsp__chk_cb_buf(1); + } + } + + // copy leader if there is still one + sn = lead + 1; + while (lead[0]) { + stbsp__int32 i; + stbsp__cb_buf_clamp(i, lead[0]); + lead[0] -= (char)i; + while (i) { + *bf++ = *sn++; + --i; + } + stbsp__chk_cb_buf(1); + } + + // copy the string + n = l; + while (n) { + stbsp__int32 i; + stbsp__cb_buf_clamp(i, n); + n -= i; + STBSP__UNALIGNED(while (i >= 4) { + *(stbsp__uint32 volatile *)bf = *(stbsp__uint32 volatile *)s; + bf += 4; + s += 4; + i -= 4; + }) + while (i) { + *bf++ = *s++; + --i; + } + stbsp__chk_cb_buf(1); + } + + // copy trailing zeros + while (tz) { + stbsp__int32 i; + stbsp__cb_buf_clamp(i, tz); + tz -= i; + while (i) { + if ((((stbsp__uintptr)bf) & 3) == 0) + break; + *bf++ = '0'; + --i; + } + while (i >= 4) { + *(stbsp__uint32 *)bf = 0x30303030; + bf += 4; + i -= 4; + } + while (i) { + *bf++ = '0'; + --i; + } + stbsp__chk_cb_buf(1); + } + + // copy tail if there is one + sn = tail + 1; + while (tail[0]) { + stbsp__int32 i; + stbsp__cb_buf_clamp(i, tail[0]); + tail[0] -= (char)i; + while (i) { + *bf++ = *sn++; + --i; + } + stbsp__chk_cb_buf(1); + } + + // handle the left justify + if (fl & STBSP__LEFTJUST) + if (fw > 0) { + while (fw) { + stbsp__int32 i; + stbsp__cb_buf_clamp(i, fw); + fw -= i; + while (i) { + if ((((stbsp__uintptr)bf) & 3) == 0) + break; + *bf++ = ' '; + --i; + } + while (i >= 4) { + *(stbsp__uint32 *)bf = 0x20202020; + bf += 4; + i -= 4; + } + while (i--) + *bf++ = ' '; + stbsp__chk_cb_buf(1); + } + } + break; + + default: // unknown, just copy code + s = num + STBSP__NUMSZ - 1; + *s = f[0]; + l = 1; + fw = fl = 0; + lead[0] = 0; + tail[0] = 0; + pr = 0; + dp = 0; + cs = 0; + goto scopy; + } + ++f; + } +endfmt: + + if (!callback) + *bf = 0; + else + stbsp__flush_cb(); + +done: + return tlen + (int)(bf - buf); +} + +// cleanup +#undef STBSP__LEFTJUST +#undef STBSP__LEADINGPLUS +#undef STBSP__LEADINGSPACE +#undef STBSP__LEADING_0X +#undef STBSP__LEADINGZERO +#undef STBSP__INTMAX +#undef STBSP__TRIPLET_COMMA +#undef STBSP__NEGATIVE +#undef STBSP__METRIC_SUFFIX +#undef STBSP__NUMSZ +#undef stbsp__chk_cb_bufL +#undef stbsp__chk_cb_buf +#undef stbsp__flush_cb +#undef stbsp__cb_buf_clamp + +// ============================================================================ +// wrapper functions + +STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(sprintf)(char *buf, char const *fmt, ...) +{ + int result; + va_list va; + va_start(va, fmt); + result = STB_SPRINTF_DECORATE(vsprintfcb)(0, 0, buf, fmt, va); + va_end(va); + return result; +} + +typedef struct stbsp__context { + char *buf; + int count; + int length; + char tmp[STB_SPRINTF_MIN]; +} stbsp__context; + +static char *stbsp__clamp_callback(const char *buf, void *user, int len) +{ + stbsp__context *c = (stbsp__context *)user; + c->length += len; + + if (len > c->count) + len = c->count; + + if (len) { + if (buf != c->buf) { + const char *s, *se; + char *d; + d = c->buf; + s = buf; + se = buf + len; + do { + *d++ = *s++; + } while (s < se); + } + c->buf += len; + c->count -= len; + } + + if (c->count <= 0) + return c->tmp; + return (c->count >= STB_SPRINTF_MIN) ? c->buf : c->tmp; // go direct into buffer if you can +} + +static char * stbsp__count_clamp_callback( const char * buf, void * user, int len ) +{ + stbsp__context * c = (stbsp__context*)user; + (void) sizeof(buf); + + c->length += len; + return c->tmp; // go direct into buffer if you can +} + +STBSP__PUBLICDEF int STB_SPRINTF_DECORATE( vsnprintf )( char * buf, int count, char const * fmt, va_list va ) +{ + stbsp__context c; + + if ( (count == 0) && !buf ) + { + c.length = 0; + + STB_SPRINTF_DECORATE( vsprintfcb )( stbsp__count_clamp_callback, &c, c.tmp, fmt, va ); + } + else + { + int l; + + c.buf = buf; + c.count = count; + c.length = 0; + + STB_SPRINTF_DECORATE( vsprintfcb )( stbsp__clamp_callback, &c, stbsp__clamp_callback(0,&c,0), fmt, va ); + + // zero-terminate + l = (int)( c.buf - buf ); + if ( l >= count ) // should never be greater, only equal (or less) than count + l = count - 1; + buf[l] = 0; + } + + return c.length; +} + +STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(snprintf)(char *buf, int count, char const *fmt, ...) +{ + int result; + va_list va; + va_start(va, fmt); + + result = STB_SPRINTF_DECORATE(vsnprintf)(buf, count, fmt, va); + va_end(va); + + return result; +} + +STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(vsprintf)(char *buf, char const *fmt, va_list va) +{ + return STB_SPRINTF_DECORATE(vsprintfcb)(0, 0, buf, fmt, va); +} + +// ======================================================================= +// low level float utility functions + +#ifndef STB_SPRINTF_NOFLOAT + +// copies d to bits w/ strict aliasing (this compiles to nothing on /Ox) +#define STBSP__COPYFP(dest, src) \ + { \ + int cn; \ + for (cn = 0; cn < 8; cn++) \ + ((char *)&dest)[cn] = ((char *)&src)[cn]; \ + } + +// get float info +static stbsp__int32 stbsp__real_to_parts(stbsp__int64 *bits, stbsp__int32 *expo, double value) +{ + double d; + stbsp__int64 b = 0; + + // load value and round at the frac_digits + d = value; + + STBSP__COPYFP(b, d); + + *bits = b & ((((stbsp__uint64)1) << 52) - 1); + *expo = (stbsp__int32)(((b >> 52) & 2047) - 1023); + + return (stbsp__int32)((stbsp__uint64) b >> 63); +} + +static double const stbsp__bot[23] = { + 1e+000, 1e+001, 1e+002, 1e+003, 1e+004, 1e+005, 1e+006, 1e+007, 1e+008, 1e+009, 1e+010, 1e+011, + 1e+012, 1e+013, 1e+014, 1e+015, 1e+016, 1e+017, 1e+018, 1e+019, 1e+020, 1e+021, 1e+022 +}; +static double const stbsp__negbot[22] = { + 1e-001, 1e-002, 1e-003, 1e-004, 1e-005, 1e-006, 1e-007, 1e-008, 1e-009, 1e-010, 1e-011, + 1e-012, 1e-013, 1e-014, 1e-015, 1e-016, 1e-017, 1e-018, 1e-019, 1e-020, 1e-021, 1e-022 +}; +static double const stbsp__negboterr[22] = { + -5.551115123125783e-018, -2.0816681711721684e-019, -2.0816681711721686e-020, -4.7921736023859299e-021, -8.1803053914031305e-022, 4.5251888174113741e-023, + 4.5251888174113739e-024, -2.0922560830128471e-025, -6.2281591457779853e-026, -3.6432197315497743e-027, 6.0503030718060191e-028, 2.0113352370744385e-029, + -3.0373745563400371e-030, 1.1806906454401013e-032, -7.7705399876661076e-032, 2.0902213275965398e-033, -7.1542424054621921e-034, -7.1542424054621926e-035, + 2.4754073164739869e-036, 5.4846728545790429e-037, 9.2462547772103625e-038, -4.8596774326570872e-039 +}; +static double const stbsp__top[13] = { + 1e+023, 1e+046, 1e+069, 1e+092, 1e+115, 1e+138, 1e+161, 1e+184, 1e+207, 1e+230, 1e+253, 1e+276, 1e+299 +}; +static double const stbsp__negtop[13] = { + 1e-023, 1e-046, 1e-069, 1e-092, 1e-115, 1e-138, 1e-161, 1e-184, 1e-207, 1e-230, 1e-253, 1e-276, 1e-299 +}; +static double const stbsp__toperr[13] = { + 8388608, + 6.8601809640529717e+028, + -7.253143638152921e+052, + -4.3377296974619174e+075, + -1.5559416129466825e+098, + -3.2841562489204913e+121, + -3.7745893248228135e+144, + -1.7356668416969134e+167, + -3.8893577551088374e+190, + -9.9566444326005119e+213, + 6.3641293062232429e+236, + -5.2069140800249813e+259, + -5.2504760255204387e+282 +}; +static double const stbsp__negtoperr[13] = { + 3.9565301985100693e-040, -2.299904345391321e-063, 3.6506201437945798e-086, 1.1875228833981544e-109, + -5.0644902316928607e-132, -6.7156837247865426e-155, -2.812077463003139e-178, -5.7778912386589953e-201, + 7.4997100559334532e-224, -4.6439668915134491e-247, -6.3691100762962136e-270, -9.436808465446358e-293, + 8.0970921678014997e-317 +}; + +#if defined(_MSC_VER) && (_MSC_VER <= 1200) +static stbsp__uint64 const stbsp__powten[20] = { + 1, + 10, + 100, + 1000, + 10000, + 100000, + 1000000, + 10000000, + 100000000, + 1000000000, + 10000000000, + 100000000000, + 1000000000000, + 10000000000000, + 100000000000000, + 1000000000000000, + 10000000000000000, + 100000000000000000, + 1000000000000000000, + 10000000000000000000U +}; +#define stbsp__tento19th ((stbsp__uint64)1000000000000000000) +#else +static stbsp__uint64 const stbsp__powten[20] = { + 1, + 10, + 100, + 1000, + 10000, + 100000, + 1000000, + 10000000, + 100000000, + 1000000000, + 10000000000ULL, + 100000000000ULL, + 1000000000000ULL, + 10000000000000ULL, + 100000000000000ULL, + 1000000000000000ULL, + 10000000000000000ULL, + 100000000000000000ULL, + 1000000000000000000ULL, + 10000000000000000000ULL +}; +#define stbsp__tento19th (1000000000000000000ULL) +#endif + +#define stbsp__ddmulthi(oh, ol, xh, yh) \ + { \ + double ahi = 0, alo, bhi = 0, blo; \ + stbsp__int64 bt; \ + oh = xh * yh; \ + STBSP__COPYFP(bt, xh); \ + bt &= ((~(stbsp__uint64)0) << 27); \ + STBSP__COPYFP(ahi, bt); \ + alo = xh - ahi; \ + STBSP__COPYFP(bt, yh); \ + bt &= ((~(stbsp__uint64)0) << 27); \ + STBSP__COPYFP(bhi, bt); \ + blo = yh - bhi; \ + ol = ((ahi * bhi - oh) + ahi * blo + alo * bhi) + alo * blo; \ + } + +#define stbsp__ddtoS64(ob, xh, xl) \ + { \ + double ahi = 0, alo, vh, t; \ + ob = (stbsp__int64)xh; \ + vh = (double)ob; \ + ahi = (xh - vh); \ + t = (ahi - xh); \ + alo = (xh - (ahi - t)) - (vh + t); \ + ob += (stbsp__int64)(ahi + alo + xl); \ + } + +#define stbsp__ddrenorm(oh, ol) \ + { \ + double s; \ + s = oh + ol; \ + ol = ol - (s - oh); \ + oh = s; \ + } + +#define stbsp__ddmultlo(oh, ol, xh, xl, yh, yl) ol = ol + (xh * yl + xl * yh); + +#define stbsp__ddmultlos(oh, ol, xh, yl) ol = ol + (xh * yl); + +static void stbsp__raise_to_power10(double *ohi, double *olo, double d, stbsp__int32 power) // power can be -323 to +350 +{ + double ph, pl; + if ((power >= 0) && (power <= 22)) { + stbsp__ddmulthi(ph, pl, d, stbsp__bot[power]); + } else { + stbsp__int32 e, et, eb; + double p2h, p2l; + + e = power; + if (power < 0) + e = -e; + et = (e * 0x2c9) >> 14; /* %23 */ + if (et > 13) + et = 13; + eb = e - (et * 23); + + ph = d; + pl = 0.0; + if (power < 0) { + if (eb) { + --eb; + stbsp__ddmulthi(ph, pl, d, stbsp__negbot[eb]); + stbsp__ddmultlos(ph, pl, d, stbsp__negboterr[eb]); + } + if (et) { + stbsp__ddrenorm(ph, pl); + --et; + stbsp__ddmulthi(p2h, p2l, ph, stbsp__negtop[et]); + stbsp__ddmultlo(p2h, p2l, ph, pl, stbsp__negtop[et], stbsp__negtoperr[et]); + ph = p2h; + pl = p2l; + } + } else { + if (eb) { + e = eb; + if (eb > 22) + eb = 22; + e -= eb; + stbsp__ddmulthi(ph, pl, d, stbsp__bot[eb]); + if (e) { + stbsp__ddrenorm(ph, pl); + stbsp__ddmulthi(p2h, p2l, ph, stbsp__bot[e]); + stbsp__ddmultlos(p2h, p2l, stbsp__bot[e], pl); + ph = p2h; + pl = p2l; + } + } + if (et) { + stbsp__ddrenorm(ph, pl); + --et; + stbsp__ddmulthi(p2h, p2l, ph, stbsp__top[et]); + stbsp__ddmultlo(p2h, p2l, ph, pl, stbsp__top[et], stbsp__toperr[et]); + ph = p2h; + pl = p2l; + } + } + } + stbsp__ddrenorm(ph, pl); + *ohi = ph; + *olo = pl; +} + +// given a float value, returns the significant bits in bits, and the position of the +// decimal point in decimal_pos. +/-INF and NAN are specified by special values +// returned in the decimal_pos parameter. +// frac_digits is absolute normally, but if you want from first significant digits (got %g and %e), or in 0x80000000 +static stbsp__int32 stbsp__real_to_str(char const **start, stbsp__uint32 *len, char *out, stbsp__int32 *decimal_pos, double value, stbsp__uint32 frac_digits) +{ + double d; + stbsp__int64 bits = 0; + stbsp__int32 expo, e, ng, tens; + + d = value; + STBSP__COPYFP(bits, d); + expo = (stbsp__int32)((bits >> 52) & 2047); + ng = (stbsp__int32)((stbsp__uint64) bits >> 63); + if (ng) + d = -d; + + if (expo == 2047) // is nan or inf? + { + *start = (bits & ((((stbsp__uint64)1) << 52) - 1)) ? "NaN" : "Inf"; + *decimal_pos = STBSP__SPECIAL; + *len = 3; + return ng; + } + + if (expo == 0) // is zero or denormal + { + if (((stbsp__uint64) bits << 1) == 0) // do zero + { + *decimal_pos = 1; + *start = out; + out[0] = '0'; + *len = 1; + return ng; + } + // find the right expo for denormals + { + stbsp__int64 v = ((stbsp__uint64)1) << 51; + while ((bits & v) == 0) { + --expo; + v >>= 1; + } + } + } + + // find the decimal exponent as well as the decimal bits of the value + { + double ph, pl; + + // log10 estimate - very specifically tweaked to hit or undershoot by no more than 1 of log10 of all expos 1..2046 + tens = expo - 1023; + tens = (tens < 0) ? ((tens * 617) / 2048) : (((tens * 1233) / 4096) + 1); + + // move the significant bits into position and stick them into an int + stbsp__raise_to_power10(&ph, &pl, d, 18 - tens); + + // get full as much precision from double-double as possible + stbsp__ddtoS64(bits, ph, pl); + + // check if we undershot + if (((stbsp__uint64)bits) >= stbsp__tento19th) + ++tens; + } + + // now do the rounding in integer land + frac_digits = (frac_digits & 0x80000000) ? ((frac_digits & 0x7ffffff) + 1) : (tens + frac_digits); + if ((frac_digits < 24)) { + stbsp__uint32 dg = 1; + if ((stbsp__uint64)bits >= stbsp__powten[9]) + dg = 10; + while ((stbsp__uint64)bits >= stbsp__powten[dg]) { + ++dg; + if (dg == 20) + goto noround; + } + if (frac_digits < dg) { + stbsp__uint64 r; + // add 0.5 at the right position and round + e = dg - frac_digits; + if ((stbsp__uint32)e >= 24) + goto noround; + r = stbsp__powten[e]; + bits = bits + (r / 2); + if ((stbsp__uint64)bits >= stbsp__powten[dg]) + ++tens; + bits /= r; + } + noround:; + } + + // kill long trailing runs of zeros + if (bits) { + stbsp__uint32 n; + for (;;) { + if (bits <= 0xffffffff) + break; + if (bits % 1000) + goto donez; + bits /= 1000; + } + n = (stbsp__uint32)bits; + while ((n % 1000) == 0) + n /= 1000; + bits = n; + donez:; + } + + // convert to string + out += 64; + e = 0; + for (;;) { + stbsp__uint32 n; + char *o = out - 8; + // do the conversion in chunks of U32s (avoid most 64-bit divides, worth it, constant denomiators be damned) + if (bits >= 100000000) { + n = (stbsp__uint32)(bits % 100000000); + bits /= 100000000; + } else { + n = (stbsp__uint32)bits; + bits = 0; + } + while (n) { + out -= 2; + *(stbsp__uint16 *)out = *(stbsp__uint16 *)&stbsp__digitpair.pair[(n % 100) * 2]; + n /= 100; + e += 2; + } + if (bits == 0) { + if ((e) && (out[0] == '0')) { + ++out; + --e; + } + break; + } + while (out != o) { + *--out = '0'; + ++e; + } + } + + *decimal_pos = tens; + *start = out; + *len = e; + return ng; +} + +#undef stbsp__ddmulthi +#undef stbsp__ddrenorm +#undef stbsp__ddmultlo +#undef stbsp__ddmultlos +#undef STBSP__SPECIAL +#undef STBSP__COPYFP + +#endif // STB_SPRINTF_NOFLOAT + +// clean up +#undef stbsp__uint16 +#undef stbsp__uint32 +#undef stbsp__int32 +#undef stbsp__uint64 +#undef stbsp__int64 +#undef STBSP__UNALIGNED + +#endif // STB_SPRINTF_IMPLEMENTATION + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/external/xxhash/LICENSE b/external/xxhash/LICENSE new file mode 100644 index 0000000..e4c5da7 --- /dev/null +++ b/external/xxhash/LICENSE @@ -0,0 +1,26 @@ +xxHash Library +Copyright (c) 2012-2021 Yann Collet +All rights reserved. + +BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php) + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/external/xxhash/README.md b/external/xxhash/README.md new file mode 100644 index 0000000..1ff987b --- /dev/null +++ b/external/xxhash/README.md @@ -0,0 +1,274 @@ + +xxHash - Extremely fast hash algorithm +====================================== + +xxHash is an Extremely fast Hash algorithm, processing at RAM speed limits. +Code is highly portable, and produces hashes identical across all platforms (little / big endian). +The library includes the following algorithms : +- XXH32 : generates 32-bit hashes, using 32-bit arithmetic +- XXH64 : generates 64-bit hashes, using 64-bit arithmetic +- XXH3 (since `v0.8.0`): generates 64 or 128-bit hashes, using vectorized arithmetic. + The 128-bit variant is called XXH128. + +All variants successfully complete the [SMHasher](https://code.google.com/p/smhasher/wiki/SMHasher) test suite +which evaluates the quality of hash functions (collision, dispersion and randomness). +Additional tests, which evaluate more thoroughly speed and collision properties of 64-bit hashes, [are also provided](https://github.com/Cyan4973/xxHash/tree/dev/tests). + +|Branch |Status | +|------------|---------| +|release | [![Build Status](https://github.com/Cyan4973/xxHash/actions/workflows/ci.yml/badge.svg?branch=release)](https://github.com/Cyan4973/xxHash/actions?query=branch%3Arelease+) | +|dev | [![Build Status](https://github.com/Cyan4973/xxHash/actions/workflows/ci.yml/badge.svg?branch=dev)](https://github.com/Cyan4973/xxHash/actions?query=branch%3Adev+) | + + +Benchmarks +------------------------- + +The benchmarked reference system uses an Intel i7-9700K cpu, and runs Ubuntu x64 20.04. +The [open source benchmark program] is compiled with `clang` v10.0 using `-O3` flag. + +| Hash Name | Width | Bandwidth (GB/s) | Small Data Velocity | Quality | Comment | +| --------- | ----- | ---------------- | ----- | --- | --- | +| __XXH3__ (SSE2) | 64 | 31.5 GB/s | 133.1 | 10 +| __XXH128__ (SSE2) | 128 | 29.6 GB/s | 118.1 | 10 +| _RAM sequential read_ | N/A | 28.0 GB/s | N/A | N/A | _for reference_ +| City64 | 64 | 22.0 GB/s | 76.6 | 10 +| T1ha2 | 64 | 22.0 GB/s | 99.0 | 9 | Slightly worse [collisions] +| City128 | 128 | 21.7 GB/s | 57.7 | 10 +| __XXH64__ | 64 | 19.4 GB/s | 71.0 | 10 +| SpookyHash | 64 | 19.3 GB/s | 53.2 | 10 +| Mum | 64 | 18.0 GB/s | 67.0 | 9 | Slightly worse [collisions] +| __XXH32__ | 32 | 9.7 GB/s | 71.9 | 10 +| City32 | 32 | 9.1 GB/s | 66.0 | 10 +| Murmur3 | 32 | 3.9 GB/s | 56.1 | 10 +| SipHash | 64 | 3.0 GB/s | 43.2 | 10 +| FNV64 | 64 | 1.2 GB/s | 62.7 | 5 | Poor avalanche properties +| Blake2 | 256 | 1.1 GB/s | 5.1 | 10 | Cryptographic +| SHA1 | 160 | 0.8 GB/s | 5.6 | 10 | Cryptographic but broken +| MD5 | 128 | 0.6 GB/s | 7.8 | 10 | Cryptographic but broken + +[open source benchmark program]: https://github.com/Cyan4973/xxHash/tree/release/tests/bench +[collisions]: https://github.com/Cyan4973/xxHash/wiki/Collision-ratio-comparison#collision-study + +note 1: Small data velocity is a _rough_ evaluation of algorithm's efficiency on small data. For more detailed analysis, please refer to next paragraph. + +note 2: some algorithms feature _faster than RAM_ speed. In which case, they can only reach their full speed potential when input is already in CPU cache (L3 or better). Otherwise, they max out on RAM speed limit. + +### Small data + +Performance on large data is only one part of the picture. +Hashing is also very useful in constructions like hash tables and bloom filters. +In these use cases, it's frequent to hash a lot of small data (starting at a few bytes). +Algorithm's performance can be very different for such scenarios, since parts of the algorithm, +such as initialization or finalization, become fixed cost. +The impact of branch mis-prediction also becomes much more present. + +XXH3 has been designed for excellent performance on both long and small inputs, +which can be observed in the following graph: + +![XXH3, latency, random size](https://user-images.githubusercontent.com/750081/61976089-aedeab00-af9f-11e9-9239-e5375d6c080f.png) + +For a more detailed analysis, please visit the wiki : +https://github.com/Cyan4973/xxHash/wiki/Performance-comparison#benchmarks-concentrating-on-small-data- + +Quality +------------------------- + +Speed is not the only property that matters. +Produced hash values must respect excellent dispersion and randomness properties, +so that any sub-section of it can be used to maximally spread out a table or index, +as well as reduce the amount of collisions to the minimal theoretical level, following the [birthday paradox]. + +`xxHash` has been tested with Austin Appleby's excellent SMHasher test suite, +and passes all tests, ensuring reasonable quality levels. +It also passes extended tests from [newer forks of SMHasher], featuring additional scenarios and conditions. + +Finally, xxHash provides its own [massive collision tester](https://github.com/Cyan4973/xxHash/tree/dev/tests/collisions), +able to generate and compare billions of hashes to test the limits of 64-bit hash algorithms. +On this front too, xxHash features good results, in line with the [birthday paradox]. +A more detailed analysis is documented [in the wiki](https://github.com/Cyan4973/xxHash/wiki/Collision-ratio-comparison). + +[birthday paradox]: https://en.wikipedia.org/wiki/Birthday_problem +[newer forks of SMHasher]: https://github.com/rurban/smhasher + + +### Build modifiers + +The following macros can be set at compilation time to modify `libxxhash`'s behavior. They are generally disabled by default. + +- `XXH_INLINE_ALL`: Make all functions `inline`, implementation is directly included within `xxhash.h`. + Inlining functions is beneficial for speed, notably for small keys. + It's _extremely effective_ when key's length is expressed as _a compile time constant_, + with performance improvements observed in the +200% range . + See [this article](https://fastcompression.blogspot.com/2018/03/xxhash-for-small-keys-impressive-power.html) for details. +- `XXH_PRIVATE_API`: same outcome as `XXH_INLINE_ALL`. Still available for legacy support. + The name underlines that `XXH_*` symbol names will not be exported. +- `XXH_STATIC_LINKING_ONLY`: gives access to internal state declaration, required for static allocation. + Incompatible with dynamic linking, due to risks of ABI changes. +- `XXH_NAMESPACE`: Prefixes all symbols with the value of `XXH_NAMESPACE`. + This macro can only use compilable character set. + Useful to evade symbol naming collisions, + in case of multiple inclusions of xxHash's source code. + Client applications still use the regular function names, + as symbols are automatically translated through `xxhash.h`. +- `XXH_FORCE_ALIGN_CHECK`: Use a faster direct read path when input is aligned. + This option can result in dramatic performance improvement on architectures unable to load memory from unaligned addresses + when input to hash happens to be aligned on 32 or 64-bit boundaries. + It is (slightly) detrimental on platform with good unaligned memory access performance (same instruction for both aligned and unaligned accesses). + This option is automatically disabled on `x86`, `x64` and `aarch64`, and enabled on all other platforms. +- `XXH_FORCE_MEMORY_ACCESS`: The default method `0` uses a portable `memcpy()` notation. + Method `1` uses a gcc-specific `packed` attribute, which can provide better performance for some targets. + Method `2` forces unaligned reads, which is not standard compliant, but might sometimes be the only way to extract better read performance. + Method `3` uses a byteshift operation, which is best for old compilers which don't inline `memcpy()` or big-endian systems without a byteswap instruction. +- `XXH_CPU_LITTLE_ENDIAN`: By default, endianness is determined by a runtime test resolved at compile time. + If, for some reason, the compiler cannot simplify the runtime test, it can cost performance. + It's possible to skip auto-detection and simply state that the architecture is little-endian by setting this macro to 1. + Setting it to 0 states big-endian. +- `XXH_ENABLE_AUTOVECTORIZE`: Auto-vectorization may be triggered for XXH32 and XXH64, depending on cpu vector capabilities and compiler version. + Note: auto-vectorization tends to be triggered more easily with recent versions of `clang`. + For XXH32, SSE4.1 or equivalent (NEON) is enough, while XXH64 requires AVX512. + Unfortunately, auto-vectorization is generally detrimental to XXH performance. + For this reason, the xxhash source code tries to prevent auto-vectorization by default. + That being said, systems evolve, and this conclusion is not forthcoming. + For example, it has been reported that recent Zen4 cpus are more likely to improve performance with vectorization. + Therefore, should you prefer or want to test vectorized code, you can enable this flag: + it will remove the no-vectorization protection code, thus making it more likely for XXH32 and XXH64 to be auto-vectorized. +- `XXH32_ENDJMP`: Switch multi-branch finalization stage of XXH32 by a single jump. + This is generally undesirable for performance, especially when hashing inputs of random sizes. + But depending on exact architecture and compiler, a jump might provide slightly better performance on small inputs. Disabled by default. +- `XXH_IMPORT`: MSVC specific: should only be defined for dynamic linking, as it prevents linkage errors. +- `XXH_NO_STDLIB`: Disable invocation of `` functions, notably `malloc()` and `free()`. + `libxxhash`'s `XXH*_createState()` will always fail and return `NULL`. + But one-shot hashing (like `XXH32()`) or streaming using statically allocated states + still work as expected. + This build flag is useful for embedded environments without dynamic allocation. +- `XXH_memcpy`, `XXH_memset`, `XXH_memcmp` : redirect `memcpy()`, `memset()` and `memcmp()` to some user-selected symbol at compile time. + Redirecting all 3 removes the need to include `` standard library. +- `XXH_NO_EXTERNC_GUARD`: When `xxhash.h` is compiled in C++ mode, removes the `extern "C" { .. }` block guard. +- `XXH_DEBUGLEVEL` : When set to any value >= 1, enables `assert()` statements. + This (slightly) slows down execution, but may help finding bugs during debugging sessions. + +#### Binary size control +- `XXH_NO_XXH3` : removes symbols related to `XXH3` (both 64 & 128 bits) from generated binary. + `XXH3` is by far the largest contributor to `libxxhash` size, + so it's useful to reduce binary size for applications which do not employ `XXH3`. +- `XXH_NO_LONG_LONG`: removes compilation of algorithms relying on 64-bit `long long` types + which include `XXH3` and `XXH64`. + Only `XXH32` will be compiled. + Useful for targets (architectures and compilers) without 64-bit support. +- `XXH_NO_STREAM`: Disables the streaming API, limiting the library to single shot variants only. +- `XXH_NO_INLINE_HINTS`: By default, xxHash uses `__attribute__((always_inline))` and `__forceinline` to improve performance at the cost of code size. + Defining this macro to 1 will mark all internal functions as `static`, allowing the compiler to decide whether to inline a function or not. + This is very useful when optimizing for smallest binary size, + and is automatically defined when compiling with `-O0`, `-Os`, `-Oz`, or `-fno-inline` on GCC and Clang. + It may also be required to successfully compile using `-Og`, depending on compiler version. +- `XXH_SIZE_OPT`: `0`: default, optimize for speed + `1`: default for `-Os` and `-Oz`: disables some speed hacks for size optimization + `2`: makes code as small as possible, performance may cry + +#### Build modifiers specific for XXH3 +- `XXH_VECTOR` : manually select a vector instruction set (default: auto-selected at compilation time). Available instruction sets are `XXH_SCALAR`, `XXH_SSE2`, `XXH_AVX2`, `XXH_AVX512`, `XXH_NEON` and `XXH_VSX`. Compiler may require additional flags to ensure proper support (for example, `gcc` on x86_64 requires `-mavx2` for `AVX2`, or `-mavx512f` for `AVX512`). +- `XXH_PREFETCH_DIST` : select prefetching distance. For close-to-metal adaptation to specific hardware platforms. XXH3 only. +- `XXH_NO_PREFETCH` : disable prefetching. Some platforms or situations may perform better without prefetching. XXH3 only. + +#### Makefile variables +When compiling the Command Line Interface `xxhsum` using `make`, the following environment variables can also be set : +- `DISPATCH=1` : use `xxh_x86dispatch.c`, select at runtime between `scalar`, `sse2`, `avx2` or `avx512` instruction set. This option is only valid for `x86`/`x64` systems. It is enabled by default when target `x86`/`x64` is detected. It can be forcefully turned off using `DISPATCH=0`. +- `LIBXXH_DISPATCH=1` : same idea, implemented a runtime vector extension detector, but within `libxxhash`. This parameter is disabled by default. When enabled (only valid for `x86`/`x64` systems), new symbols published in `xxh_x86dispatch.h` become accessible. At the time of this writing, it's required to include `xxh_x86dispatch.h` in order to access the symbols with runtime vector extension detection. +- `XXH_1ST_SPEED_TARGET` : select an initial speed target, expressed in MB/s, for the first speed test in benchmark mode. Benchmark will adjust the target at subsequent iterations, but the first test is made "blindly" by targeting this speed. Currently conservatively set to 10 MB/s, to support very slow (emulated) platforms. +- `NODE_JS=1` : When compiling `xxhsum` for Node.js with Emscripten, this links the `NODERAWFS` library for unrestricted filesystem access and patches `isatty` to make the command line utility correctly detect the terminal. This does make the binary specific to Node.js. + +### Building xxHash - Using vcpkg + +You can download and install xxHash using the [vcpkg](https://github.com/Microsoft/vcpkg) dependency manager: + + git clone https://github.com/Microsoft/vcpkg.git + cd vcpkg + ./bootstrap-vcpkg.sh + ./vcpkg integrate install + ./vcpkg install xxhash + +The xxHash port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository. + +### Example + +The simplest example calls xxhash 64-bit variant as a one-shot function +generating a hash value from a single buffer, and invoked from a C/C++ program: + +```C +#include "xxhash.h" + + (...) + XXH64_hash_t hash = XXH64(buffer, size, seed); +} +``` + +Streaming variant is more involved, but makes it possible to provide data incrementally: + +```C +#include "stdlib.h" /* abort() */ +#include "xxhash.h" + + +XXH64_hash_t calcul_hash_streaming(FileHandler fh) +{ + /* create a hash state */ + XXH64_state_t* const state = XXH64_createState(); + if (state==NULL) abort(); + + size_t const bufferSize = SOME_SIZE; + void* const buffer = malloc(bufferSize); + if (buffer==NULL) abort(); + + /* Initialize state with selected seed */ + XXH64_hash_t const seed = 0; /* or any other value */ + if (XXH64_reset(state, seed) == XXH_ERROR) abort(); + + /* Feed the state with input data, any size, any number of times */ + (...) + while ( /* some data left */ ) { + size_t const length = get_more_data(buffer, bufferSize, fh); + if (XXH64_update(state, buffer, length) == XXH_ERROR) abort(); + (...) + } + (...) + + /* Produce the final hash value */ + XXH64_hash_t const hash = XXH64_digest(state); + + /* State could be re-used; but in this example, it is simply freed */ + free(buffer); + XXH64_freeState(state); + + return hash; +} +``` + + +### License + +The library files `xxhash.c` and `xxhash.h` are BSD licensed. +The utility `xxhsum` is GPL licensed. + + +### Other programming languages + +Beyond the C reference version, +xxHash is also available from many different programming languages, +thanks to great contributors. +They are [listed here](http://www.xxhash.com/#other-languages). + + +### Packaging status + +Many distributions bundle a package manager +which allows easy xxhash installation as both a `libxxhash` library +and `xxhsum` command line interface. + +[![Packaging status](https://repology.org/badge/vertical-allrepos/xxhash.svg)](https://repology.org/project/xxhash/versions) + + +### Special Thanks + +- Takayuki Matsuoka, aka @t-mat, for creating `xxhsum -c` and great support during early xxh releases +- Mathias Westerdahl, aka @JCash, for introducing the first version of `XXH64` +- Devin Hussey, aka @easyaspi314, for incredible low-level optimizations on `XXH3` and `XXH128` diff --git a/external/xxhash/SECURITY.md b/external/xxhash/SECURITY.md new file mode 100644 index 0000000..2a8b4c8 --- /dev/null +++ b/external/xxhash/SECURITY.md @@ -0,0 +1,13 @@ +# Security Policy + +## Supported Versions + +Security updates are applied only to the latest release. + +## Reporting a Vulnerability + +If you have discovered a security vulnerability in this project, please report it privately. **Do not disclose it as a public issue.** This gives us time to work with you to fix the issue before public exposure, reducing the chance that the exploit will be used before a patch is released. + +Please disclose it at [security advisory](https://github.com/Cyan4973/xxHash/security/advisories/new). + +This project is maintained by a team of volunteers on a reasonable-effort basis. As such, please give us at least 90 days to work on a fix before public exposure. diff --git a/external/xxhash/xxh3.h b/external/xxhash/xxh3.h new file mode 100644 index 0000000..7e3ce68 --- /dev/null +++ b/external/xxhash/xxh3.h @@ -0,0 +1,55 @@ +/* + * xxHash - Extremely Fast Hash algorithm + * Development source file for `xxh3` + * Copyright (C) 2019-2021 Yann Collet + * + * BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * You can contact the author at: + * - xxHash homepage: https://www.xxhash.com + * - xxHash source repository: https://github.com/Cyan4973/xxHash + */ + +/* + * Note: This file used to host the source code of XXH3_* variants. + * during the development period. + * The source code is now properly integrated within xxhash.h. + * + * xxh3.h is no longer useful, + * but it is still provided for compatibility with source code + * which used to include it directly. + * + * Programs are now highly discouraged to include xxh3.h. + * Include `xxhash.h` instead, which is the officially supported interface. + * + * In the future, xxh3.h will start to generate warnings, then errors, + * then it will be removed from source package and from include directory. + */ + +/* Simulate the same impact as including the old xxh3.h source file */ + +#define XXH_INLINE_ALL +#include "xxhash.h" diff --git a/external/xxhash/xxh_x86dispatch.c b/external/xxhash/xxh_x86dispatch.c new file mode 100644 index 0000000..0c15820 --- /dev/null +++ b/external/xxhash/xxh_x86dispatch.c @@ -0,0 +1,821 @@ +/* + * xxHash - Extremely Fast Hash algorithm + * Copyright (C) 2020-2021 Yann Collet + * + * BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * You can contact the author at: + * - xxHash homepage: https://www.xxhash.com + * - xxHash source repository: https://github.com/Cyan4973/xxHash + */ + + +/*! + * @file xxh_x86dispatch.c + * + * Automatic dispatcher code for the @ref XXH3_family on x86-based targets. + * + * Optional add-on. + * + * **Compile this file with the default flags for your target.** + * Note that compiling with flags like `-mavx*`, `-march=native`, or `/arch:AVX*` + * will make the resulting binary incompatible with cpus not supporting the requested instruction set. + * + * @defgroup dispatch x86 Dispatcher + * @{ + */ + +#if defined (__cplusplus) +extern "C" { +#endif + +#if !(defined(__x86_64__) || defined(__i386__) || defined(_M_IX86) || defined(_M_X64)) +# error "Dispatching is currently only supported on x86 and x86_64." +#endif + +/*! @cond Doxygen ignores this part */ +#ifndef XXH_HAS_INCLUDE +# ifdef __has_include +/* + * Not defined as XXH_HAS_INCLUDE(x) (function-like) because + * this causes segfaults in Apple Clang 4.2 (on Mac OS X 10.7 Lion) + */ +# define XXH_HAS_INCLUDE __has_include +# else +# define XXH_HAS_INCLUDE(x) 0 +# endif +#endif +/*! @endcond */ + +/*! + * @def XXH_DISPATCH_SCALAR + * @brief Enables/dispatching the scalar code path. + * + * If this is defined to 0, SSE2 support is assumed. This reduces code size + * when the scalar path is not needed. + * + * This is automatically defined to 0 when... + * - SSE2 support is enabled in the compiler + * - Targeting x86_64 + * - Targeting Android x86 + * - Targeting macOS + */ +#ifndef XXH_DISPATCH_SCALAR +# if defined(__SSE2__) || (defined(_M_IX86_FP) && _M_IX86_FP >= 2) /* SSE2 on by default */ \ + || defined(__x86_64__) || defined(_M_X64) /* x86_64 */ \ + || defined(__ANDROID__) || defined(__APPLE__) /* Android or macOS */ +# define XXH_DISPATCH_SCALAR 0 /* disable */ +# else +# define XXH_DISPATCH_SCALAR 1 +# endif +#endif +/*! + * @def XXH_DISPATCH_AVX2 + * @brief Enables/disables dispatching for AVX2. + * + * This is automatically detected if it is not defined. + * - GCC 4.7 and later are known to support AVX2, but >4.9 is required for + * to get the AVX2 intrinsics and typedefs without -mavx -mavx2. + * - Visual Studio 2013 Update 2 and later are known to support AVX2. + * - The GCC/Clang internal header `` is detected. While this is + * not allowed to be included directly, it still appears in the builtin + * include path and is detectable with `__has_include`. + * + * @see XXH_AVX2 + */ +#ifndef XXH_DISPATCH_AVX2 +# if (defined(__GNUC__) && (__GNUC__ > 4)) /* GCC 5.0+ */ \ + || (defined(_MSC_VER) && _MSC_VER >= 1900) /* VS 2015+ */ \ + || (defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 180030501) /* VS 2013 Update 2 */ \ + || XXH_HAS_INCLUDE() /* GCC/Clang internal header */ +# define XXH_DISPATCH_AVX2 1 /* enable dispatch towards AVX2 */ +# else +# define XXH_DISPATCH_AVX2 0 +# endif +#endif /* XXH_DISPATCH_AVX2 */ + +/*! + * @def XXH_DISPATCH_AVX512 + * @brief Enables/disables dispatching for AVX512. + * + * Automatically detected if one of the following conditions is met: + * - GCC 4.9 and later are known to support AVX512. + * - Visual Studio 2017 and later are known to support AVX2. + * - The GCC/Clang internal header `` is detected. While this + * is not allowed to be included directly, it still appears in the builtin + * include path and is detectable with `__has_include`. + * + * @see XXH_AVX512 + */ +#ifndef XXH_DISPATCH_AVX512 +# if (defined(__GNUC__) \ + && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9))) /* GCC 4.9+ */ \ + || (defined(_MSC_VER) && _MSC_VER >= 1910) /* VS 2017+ */ \ + || XXH_HAS_INCLUDE() /* GCC/Clang internal header */ +# define XXH_DISPATCH_AVX512 1 /* enable dispatch towards AVX512 */ +# else +# define XXH_DISPATCH_AVX512 0 +# endif +#endif /* XXH_DISPATCH_AVX512 */ + +/*! + * @def XXH_TARGET_SSE2 + * @brief Allows a function to be compiled with SSE2 intrinsics. + * + * Uses `__attribute__((__target__("sse2")))` on GCC to allow SSE2 to be used + * even with `-mno-sse2`. + * + * @def XXH_TARGET_AVX2 + * @brief Like @ref XXH_TARGET_SSE2, but for AVX2. + * + * @def XXH_TARGET_AVX512 + * @brief Like @ref XXH_TARGET_SSE2, but for AVX512. + * + */ +#if defined(__GNUC__) +# include /* SSE2 */ +# if XXH_DISPATCH_AVX2 || XXH_DISPATCH_AVX512 +# include /* AVX2, AVX512F */ +# endif +# define XXH_TARGET_SSE2 __attribute__((__target__("sse2"))) +# define XXH_TARGET_AVX2 __attribute__((__target__("avx2"))) +# define XXH_TARGET_AVX512 __attribute__((__target__("avx512f"))) +#elif defined(__clang__) && defined(_MSC_VER) /* clang-cl.exe */ +# include /* SSE2 */ +# if XXH_DISPATCH_AVX2 || XXH_DISPATCH_AVX512 +# include /* AVX2, AVX512F */ +# include +# include +# include +# include +# endif +# define XXH_TARGET_SSE2 __attribute__((__target__("sse2"))) +# define XXH_TARGET_AVX2 __attribute__((__target__("avx2"))) +# define XXH_TARGET_AVX512 __attribute__((__target__("avx512f"))) +#elif defined(_MSC_VER) +# include +# define XXH_TARGET_SSE2 +# define XXH_TARGET_AVX2 +# define XXH_TARGET_AVX512 +#else +# error "Dispatching is currently not supported for your compiler." +#endif + +/*! @cond Doxygen ignores this part */ +#ifdef XXH_DISPATCH_DEBUG +/* debug logging */ +# include +# define XXH_debugPrint(str) { fprintf(stderr, "DEBUG: xxHash dispatch: %s \n", str); fflush(NULL); } +#else +# define XXH_debugPrint(str) ((void)0) +# undef NDEBUG /* avoid redefinition */ +# define NDEBUG +#endif +/*! @endcond */ +#include + +#ifndef XXH_DOXYGEN +#define XXH_INLINE_ALL +#define XXH_X86DISPATCH +#include "xxhash.h" +#endif + +/*! @cond Doxygen ignores this part */ +#ifndef XXH_HAS_ATTRIBUTE +# ifdef __has_attribute +# define XXH_HAS_ATTRIBUTE(...) __has_attribute(__VA_ARGS__) +# else +# define XXH_HAS_ATTRIBUTE(...) 0 +# endif +#endif +/*! @endcond */ + +/*! @cond Doxygen ignores this part */ +#if XXH_HAS_ATTRIBUTE(constructor) +# define XXH_CONSTRUCTOR __attribute__((constructor)) +# define XXH_DISPATCH_MAYBE_NULL 0 +#else +# define XXH_CONSTRUCTOR +# define XXH_DISPATCH_MAYBE_NULL 1 +#endif +/*! @endcond */ + + +/*! @cond Doxygen ignores this part */ +/* + * Support both AT&T and Intel dialects + * + * GCC doesn't convert AT&T syntax to Intel syntax, and will error out if + * compiled with -masm=intel. Instead, it supports dialect switching with + * curly braces: { AT&T syntax | Intel syntax } + * + * Clang's integrated assembler automatically converts AT&T syntax to Intel if + * needed, making the dialect switching useless (it isn't even supported). + * + * Note: Comments are written in the inline assembly itself. + */ +#ifdef __clang__ +# define XXH_I_ATT(intel, att) att "\n\t" +#else +# define XXH_I_ATT(intel, att) "{" att "|" intel "}\n\t" +#endif +/*! @endcond */ + +/*! + * @private + * @brief Runs CPUID. + * + * @param eax , ecx The parameters to pass to CPUID, %eax and %ecx respectively. + * @param abcd The array to store the result in, `{ eax, ebx, ecx, edx }` + */ +static void XXH_cpuid(xxh_u32 eax, xxh_u32 ecx, xxh_u32* abcd) +{ +#if defined(_MSC_VER) + __cpuidex((int*)abcd, eax, ecx); +#else + xxh_u32 ebx, edx; +# if defined(__i386__) && defined(__PIC__) + __asm__( + "# Call CPUID\n\t" + "#\n\t" + "# On 32-bit x86 with PIC enabled, we are not allowed to overwrite\n\t" + "# EBX, so we use EDI instead.\n\t" + XXH_I_ATT("mov edi, ebx", "movl %%ebx, %%edi") + XXH_I_ATT("cpuid", "cpuid" ) + XXH_I_ATT("xchg edi, ebx", "xchgl %%ebx, %%edi") + : "=D" (ebx), +# else + __asm__( + "# Call CPUID\n\t" + XXH_I_ATT("cpuid", "cpuid") + : "=b" (ebx), +# endif + "+a" (eax), "+c" (ecx), "=d" (edx)); + abcd[0] = eax; + abcd[1] = ebx; + abcd[2] = ecx; + abcd[3] = edx; +#endif +} + +/* + * Modified version of Intel's guide + * https://software.intel.com/en-us/articles/how-to-detect-new-instruction-support-in-the-4th-generation-intel-core-processor-family + */ + +#if XXH_DISPATCH_AVX2 || XXH_DISPATCH_AVX512 +/*! + * @private + * @brief Runs `XGETBV`. + * + * While the CPU may support AVX2, the operating system might not properly save + * the full YMM/ZMM registers. + * + * xgetbv is used for detecting this: Any compliant operating system will define + * a set of flags in the xcr0 register indicating how it saves the AVX registers. + * + * You can manually disable this flag on Windows by running, as admin: + * + * bcdedit.exe /set xsavedisable 1 + * + * and rebooting. Run the same command with 0 to re-enable it. + */ +static xxh_u64 XXH_xgetbv(void) +{ +#if defined(_MSC_VER) + return _xgetbv(0); /* min VS2010 SP1 compiler is required */ +#else + xxh_u32 xcr0_lo, xcr0_hi; + __asm__( + "# Call XGETBV\n\t" + "#\n\t" + "# Older assemblers (e.g. macOS's ancient GAS version) don't support\n\t" + "# the XGETBV opcode, so we encode it by hand instead.\n\t" + "# See for details.\n\t" + ".byte 0x0f, 0x01, 0xd0\n\t" + : "=a" (xcr0_lo), "=d" (xcr0_hi) : "c" (0)); + return xcr0_lo | ((xxh_u64)xcr0_hi << 32); +#endif +} +#endif + +/*! @cond Doxygen ignores this part */ +#define XXH_SSE2_CPUID_MASK (1 << 26) +#define XXH_OSXSAVE_CPUID_MASK ((1 << 26) | (1 << 27)) +#define XXH_AVX2_CPUID_MASK (1 << 5) +#define XXH_AVX2_XGETBV_MASK ((1 << 2) | (1 << 1)) +#define XXH_AVX512F_CPUID_MASK (1 << 16) +#define XXH_AVX512F_XGETBV_MASK ((7 << 5) | (1 << 2) | (1 << 1)) +/*! @endcond */ + +/*! + * @private + * @brief Returns the best XXH3 implementation. + * + * Runs various CPUID/XGETBV tests to try and determine the best implementation. + * + * @return The best @ref XXH_VECTOR implementation. + * @see XXH_VECTOR_TYPES + */ +int XXH_featureTest(void) +{ + xxh_u32 abcd[4]; + xxh_u32 max_leaves; + int best = XXH_SCALAR; +#if XXH_DISPATCH_AVX2 || XXH_DISPATCH_AVX512 + xxh_u64 xgetbv_val; +#endif +#if defined(__GNUC__) && defined(__i386__) + xxh_u32 cpuid_supported; + __asm__( + "# For the sake of ruthless backwards compatibility, check if CPUID\n\t" + "# is supported in the EFLAGS on i386.\n\t" + "# This is not necessary on x86_64 - CPUID is mandatory.\n\t" + "# The ID flag (bit 21) in the EFLAGS register indicates support\n\t" + "# for the CPUID instruction. If a software procedure can set and\n\t" + "# clear this flag, the processor executing the procedure supports\n\t" + "# the CPUID instruction.\n\t" + "# \n\t" + "#\n\t" + "# Routine is from .\n\t" + + "# Save EFLAGS\n\t" + XXH_I_ATT("pushfd", "pushfl" ) + "# Store EFLAGS\n\t" + XXH_I_ATT("pushfd", "pushfl" ) + "# Invert the ID bit in stored EFLAGS\n\t" + XXH_I_ATT("xor dword ptr[esp], 0x200000", "xorl $0x200000, (%%esp)") + "# Load stored EFLAGS (with ID bit inverted)\n\t" + XXH_I_ATT("popfd", "popfl" ) + "# Store EFLAGS again (ID bit may or not be inverted)\n\t" + XXH_I_ATT("pushfd", "pushfl" ) + "# eax = modified EFLAGS (ID bit may or may not be inverted)\n\t" + XXH_I_ATT("pop eax", "popl %%eax" ) + "# eax = whichever bits were changed\n\t" + XXH_I_ATT("xor eax, dword ptr[esp]", "xorl (%%esp), %%eax" ) + "# Restore original EFLAGS\n\t" + XXH_I_ATT("popfd", "popfl" ) + "# eax = zero if ID bit can't be changed, else non-zero\n\t" + XXH_I_ATT("and eax, 0x200000", "andl $0x200000, %%eax" ) + : "=a" (cpuid_supported) :: "cc"); + + if (XXH_unlikely(!cpuid_supported)) { + XXH_debugPrint("CPUID support is not detected!"); + return best; + } + +#endif + /* Check how many CPUID pages we have */ + XXH_cpuid(0, 0, abcd); + max_leaves = abcd[0]; + + /* Shouldn't happen on hardware, but happens on some QEMU configs. */ + if (XXH_unlikely(max_leaves == 0)) { + XXH_debugPrint("Max CPUID leaves == 0!"); + return best; + } + + /* Check for SSE2, OSXSAVE and xgetbv */ + XXH_cpuid(1, 0, abcd); + + /* + * Test for SSE2. The check is redundant on x86_64, but it doesn't hurt. + */ + if (XXH_unlikely((abcd[3] & XXH_SSE2_CPUID_MASK) != XXH_SSE2_CPUID_MASK)) + return best; + + XXH_debugPrint("SSE2 support detected."); + + best = XXH_SSE2; +#if XXH_DISPATCH_AVX2 || XXH_DISPATCH_AVX512 + /* Make sure we have enough leaves */ + if (XXH_unlikely(max_leaves < 7)) + return best; + + /* Test for OSXSAVE and XGETBV */ + if ((abcd[2] & XXH_OSXSAVE_CPUID_MASK) != XXH_OSXSAVE_CPUID_MASK) + return best; + + /* CPUID check for AVX features */ + XXH_cpuid(7, 0, abcd); + + xgetbv_val = XXH_xgetbv(); +#if XXH_DISPATCH_AVX2 + /* Validate that AVX2 is supported by the CPU */ + if ((abcd[1] & XXH_AVX2_CPUID_MASK) != XXH_AVX2_CPUID_MASK) + return best; + + /* Validate that the OS supports YMM registers */ + if ((xgetbv_val & XXH_AVX2_XGETBV_MASK) != XXH_AVX2_XGETBV_MASK) { + XXH_debugPrint("AVX2 supported by the CPU, but not the OS."); + return best; + } + + /* AVX2 supported */ + XXH_debugPrint("AVX2 support detected."); + best = XXH_AVX2; +#endif +#if XXH_DISPATCH_AVX512 + /* Check if AVX512F is supported by the CPU */ + if ((abcd[1] & XXH_AVX512F_CPUID_MASK) != XXH_AVX512F_CPUID_MASK) { + XXH_debugPrint("AVX512F not supported by CPU"); + return best; + } + + /* Validate that the OS supports ZMM registers */ + if ((xgetbv_val & XXH_AVX512F_XGETBV_MASK) != XXH_AVX512F_XGETBV_MASK) { + XXH_debugPrint("AVX512F supported by the CPU, but not the OS."); + return best; + } + + /* AVX512F supported */ + XXH_debugPrint("AVX512F support detected."); + best = XXH_AVX512; +#endif +#endif + return best; +} + + +/* === Vector implementations === */ + +/*! @cond PRIVATE */ +/*! + * @private + * @brief Defines the various dispatch functions. + * + * TODO: Consolidate? + * + * @param suffix The suffix for the functions, e.g. sse2 or scalar + * @param target XXH_TARGET_* or empty. + */ + +#define XXH_DEFINE_DISPATCH_FUNCS(suffix, target) \ + \ +/* === XXH3, default variants === */ \ + \ +XXH_NO_INLINE target XXH64_hash_t \ +XXHL64_default_##suffix(XXH_NOESCAPE const void* XXH_RESTRICT input, \ + size_t len) \ +{ \ + return XXH3_hashLong_64b_internal( \ + input, len, XXH3_kSecret, sizeof(XXH3_kSecret), \ + XXH3_accumulate_##suffix, XXH3_scrambleAcc_##suffix \ + ); \ +} \ + \ +/* === XXH3, Seeded variants === */ \ + \ +XXH_NO_INLINE target XXH64_hash_t \ +XXHL64_seed_##suffix(XXH_NOESCAPE const void* XXH_RESTRICT input, size_t len, \ + XXH64_hash_t seed) \ +{ \ + return XXH3_hashLong_64b_withSeed_internal( \ + input, len, seed, XXH3_accumulate_##suffix, \ + XXH3_scrambleAcc_##suffix, XXH3_initCustomSecret_##suffix \ + ); \ +} \ + \ +/* === XXH3, Secret variants === */ \ + \ +XXH_NO_INLINE target XXH64_hash_t \ +XXHL64_secret_##suffix(XXH_NOESCAPE const void* XXH_RESTRICT input, \ + size_t len, XXH_NOESCAPE const void* secret, \ + size_t secretLen) \ +{ \ + return XXH3_hashLong_64b_internal( \ + input, len, secret, secretLen, \ + XXH3_accumulate_##suffix, XXH3_scrambleAcc_##suffix \ + ); \ +} \ + \ +/* === XXH3 update variants === */ \ + \ +XXH_NO_INLINE target XXH_errorcode \ +XXH3_update_##suffix(XXH_NOESCAPE XXH3_state_t* state, \ + XXH_NOESCAPE const void* input, size_t len) \ +{ \ + return XXH3_update(state, (const xxh_u8*)input, len, \ + XXH3_accumulate_##suffix, XXH3_scrambleAcc_##suffix); \ +} \ + \ +/* === XXH128 default variants === */ \ + \ +XXH_NO_INLINE target XXH128_hash_t \ +XXHL128_default_##suffix(XXH_NOESCAPE const void* XXH_RESTRICT input, \ + size_t len) \ +{ \ + return XXH3_hashLong_128b_internal( \ + input, len, XXH3_kSecret, sizeof(XXH3_kSecret), \ + XXH3_accumulate_##suffix, XXH3_scrambleAcc_##suffix \ + ); \ +} \ + \ +/* === XXH128 Secret variants === */ \ + \ +XXH_NO_INLINE target XXH128_hash_t \ +XXHL128_secret_##suffix(XXH_NOESCAPE const void* XXH_RESTRICT input, \ + size_t len, \ + XXH_NOESCAPE const void* XXH_RESTRICT secret, \ + size_t secretLen) \ +{ \ + return XXH3_hashLong_128b_internal( \ + input, len, (const xxh_u8*)secret, secretLen, \ + XXH3_accumulate_##suffix, XXH3_scrambleAcc_##suffix); \ +} \ + \ +/* === XXH128 Seeded variants === */ \ + \ +XXH_NO_INLINE target XXH128_hash_t \ +XXHL128_seed_##suffix(XXH_NOESCAPE const void* XXH_RESTRICT input, size_t len,\ + XXH64_hash_t seed) \ +{ \ + return XXH3_hashLong_128b_withSeed_internal(input, len, seed, \ + XXH3_accumulate_##suffix, XXH3_scrambleAcc_##suffix, \ + XXH3_initCustomSecret_##suffix); \ +} + +/*! @endcond */ +/* End XXH_DEFINE_DISPATCH_FUNCS */ + +/*! @cond Doxygen ignores this part */ +#if XXH_DISPATCH_SCALAR +XXH_DEFINE_DISPATCH_FUNCS(scalar, /* nothing */) +#endif +XXH_DEFINE_DISPATCH_FUNCS(sse2, XXH_TARGET_SSE2) +#if XXH_DISPATCH_AVX2 +XXH_DEFINE_DISPATCH_FUNCS(avx2, XXH_TARGET_AVX2) +#endif +#if XXH_DISPATCH_AVX512 +XXH_DEFINE_DISPATCH_FUNCS(avx512, XXH_TARGET_AVX512) +#endif +#undef XXH_DEFINE_DISPATCH_FUNCS +/*! @endcond */ + +/* ==== Dispatchers ==== */ + +/*! @cond Doxygen ignores this part */ +typedef XXH64_hash_t (*XXH3_dispatchx86_hashLong64_default)(XXH_NOESCAPE const void* XXH_RESTRICT, size_t); + +typedef XXH64_hash_t (*XXH3_dispatchx86_hashLong64_withSeed)(XXH_NOESCAPE const void* XXH_RESTRICT, size_t, XXH64_hash_t); + +typedef XXH64_hash_t (*XXH3_dispatchx86_hashLong64_withSecret)(XXH_NOESCAPE const void* XXH_RESTRICT, size_t, XXH_NOESCAPE const void* XXH_RESTRICT, size_t); + +typedef XXH_errorcode (*XXH3_dispatchx86_update)(XXH_NOESCAPE XXH3_state_t*, XXH_NOESCAPE const void*, size_t); + +typedef struct { + XXH3_dispatchx86_hashLong64_default hashLong64_default; + XXH3_dispatchx86_hashLong64_withSeed hashLong64_seed; + XXH3_dispatchx86_hashLong64_withSecret hashLong64_secret; + XXH3_dispatchx86_update update; +} XXH_dispatchFunctions_s; + +#define XXH_NB_DISPATCHES 4 +/*! @endcond */ + +/*! + * @private + * @brief Table of dispatchers for @ref XXH3_64bits(). + * + * @pre The indices must match @ref XXH_VECTOR_TYPE. + */ +static const XXH_dispatchFunctions_s XXH_kDispatch[XXH_NB_DISPATCHES] = { +#if XXH_DISPATCH_SCALAR + /* Scalar */ { XXHL64_default_scalar, XXHL64_seed_scalar, XXHL64_secret_scalar, XXH3_update_scalar }, +#else + /* Scalar */ { NULL, NULL, NULL, NULL }, +#endif + /* SSE2 */ { XXHL64_default_sse2, XXHL64_seed_sse2, XXHL64_secret_sse2, XXH3_update_sse2 }, +#if XXH_DISPATCH_AVX2 + /* AVX2 */ { XXHL64_default_avx2, XXHL64_seed_avx2, XXHL64_secret_avx2, XXH3_update_avx2 }, +#else + /* AVX2 */ { NULL, NULL, NULL, NULL }, +#endif +#if XXH_DISPATCH_AVX512 + /* AVX512 */ { XXHL64_default_avx512, XXHL64_seed_avx512, XXHL64_secret_avx512, XXH3_update_avx512 } +#else + /* AVX512 */ { NULL, NULL, NULL, NULL } +#endif +}; +/*! + * @private + * @brief The selected dispatch table for @ref XXH3_64bits(). + */ +static XXH_dispatchFunctions_s XXH_g_dispatch = { NULL, NULL, NULL, NULL }; + + +/*! @cond Doxygen ignores this part */ +typedef XXH128_hash_t (*XXH3_dispatchx86_hashLong128_default)(XXH_NOESCAPE const void* XXH_RESTRICT, size_t); + +typedef XXH128_hash_t (*XXH3_dispatchx86_hashLong128_withSeed)(XXH_NOESCAPE const void* XXH_RESTRICT, size_t, XXH64_hash_t); + +typedef XXH128_hash_t (*XXH3_dispatchx86_hashLong128_withSecret)(XXH_NOESCAPE const void* XXH_RESTRICT, size_t, XXH_NOESCAPE const void* XXH_RESTRICT, size_t); + +typedef struct { + XXH3_dispatchx86_hashLong128_default hashLong128_default; + XXH3_dispatchx86_hashLong128_withSeed hashLong128_seed; + XXH3_dispatchx86_hashLong128_withSecret hashLong128_secret; + XXH3_dispatchx86_update update; +} XXH_dispatch128Functions_s; +/*! @endcond */ + + +/*! + * @private + * @brief Table of dispatchers for @ref XXH3_128bits(). + * + * @pre The indices must match @ref XXH_VECTOR_TYPE. + */ +static const XXH_dispatch128Functions_s XXH_kDispatch128[XXH_NB_DISPATCHES] = { +#if XXH_DISPATCH_SCALAR + /* Scalar */ { XXHL128_default_scalar, XXHL128_seed_scalar, XXHL128_secret_scalar, XXH3_update_scalar }, +#else + /* Scalar */ { NULL, NULL, NULL, NULL }, +#endif + /* SSE2 */ { XXHL128_default_sse2, XXHL128_seed_sse2, XXHL128_secret_sse2, XXH3_update_sse2 }, +#if XXH_DISPATCH_AVX2 + /* AVX2 */ { XXHL128_default_avx2, XXHL128_seed_avx2, XXHL128_secret_avx2, XXH3_update_avx2 }, +#else + /* AVX2 */ { NULL, NULL, NULL, NULL }, +#endif +#if XXH_DISPATCH_AVX512 + /* AVX512 */ { XXHL128_default_avx512, XXHL128_seed_avx512, XXHL128_secret_avx512, XXH3_update_avx512 } +#else + /* AVX512 */ { NULL, NULL, NULL, NULL } +#endif +}; + +/*! + * @private + * @brief The selected dispatch table for @ref XXH3_64bits(). + */ +static XXH_dispatch128Functions_s XXH_g_dispatch128 = { NULL, NULL, NULL, NULL }; + +/*! + * @private + * @brief Runs a CPUID check and sets the correct dispatch tables. + */ +static XXH_CONSTRUCTOR void XXH_setDispatch(void) +{ + int vecID = XXH_featureTest(); + XXH_STATIC_ASSERT(XXH_AVX512 == XXH_NB_DISPATCHES-1); + assert(XXH_SCALAR <= vecID && vecID <= XXH_AVX512); +#if !XXH_DISPATCH_SCALAR + assert(vecID != XXH_SCALAR); +#endif +#if !XXH_DISPATCH_AVX512 + assert(vecID != XXH_AVX512); +#endif +#if !XXH_DISPATCH_AVX2 + assert(vecID != XXH_AVX2); +#endif + XXH_g_dispatch = XXH_kDispatch[vecID]; + XXH_g_dispatch128 = XXH_kDispatch128[vecID]; +} + + +/* ==== XXH3 public functions ==== */ +/*! @cond Doxygen ignores this part */ + +static XXH64_hash_t +XXH3_hashLong_64b_defaultSecret_selection(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, const xxh_u8* XXH_RESTRICT secret, size_t secretLen) +{ + (void)seed64; (void)secret; (void)secretLen; + if (XXH_DISPATCH_MAYBE_NULL && XXH_g_dispatch.hashLong64_default == NULL) + XXH_setDispatch(); + return XXH_g_dispatch.hashLong64_default(input, len); +} + +XXH64_hash_t XXH3_64bits_dispatch(XXH_NOESCAPE const void* input, size_t len) +{ + return XXH3_64bits_internal(input, len, 0, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_defaultSecret_selection); +} + +static XXH64_hash_t +XXH3_hashLong_64b_withSeed_selection(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, const xxh_u8* XXH_RESTRICT secret, size_t secretLen) +{ + (void)secret; (void)secretLen; + if (XXH_DISPATCH_MAYBE_NULL && XXH_g_dispatch.hashLong64_seed == NULL) + XXH_setDispatch(); + return XXH_g_dispatch.hashLong64_seed(input, len, seed64); +} + +XXH64_hash_t XXH3_64bits_withSeed_dispatch(XXH_NOESCAPE const void* input, size_t len, XXH64_hash_t seed) +{ + return XXH3_64bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_withSeed_selection); +} + +static XXH64_hash_t +XXH3_hashLong_64b_withSecret_selection(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, const xxh_u8* XXH_RESTRICT secret, size_t secretLen) +{ + (void)seed64; + if (XXH_DISPATCH_MAYBE_NULL && XXH_g_dispatch.hashLong64_secret == NULL) + XXH_setDispatch(); + return XXH_g_dispatch.hashLong64_secret(input, len, secret, secretLen); +} + +XXH64_hash_t XXH3_64bits_withSecret_dispatch(XXH_NOESCAPE const void* input, size_t len, XXH_NOESCAPE const void* secret, size_t secretLen) +{ + return XXH3_64bits_internal(input, len, 0, secret, secretLen, XXH3_hashLong_64b_withSecret_selection); +} + +XXH_errorcode +XXH3_64bits_update_dispatch(XXH_NOESCAPE XXH3_state_t* state, XXH_NOESCAPE const void* input, size_t len) +{ + if (XXH_DISPATCH_MAYBE_NULL && XXH_g_dispatch.update == NULL) + XXH_setDispatch(); + + return XXH_g_dispatch.update(state, (const xxh_u8*)input, len); +} + +/*! @endcond */ + + +/* ==== XXH128 public functions ==== */ +/*! @cond Doxygen ignores this part */ + +static XXH128_hash_t +XXH3_hashLong_128b_defaultSecret_selection(const void* input, size_t len, + XXH64_hash_t seed64, const void* secret, size_t secretLen) +{ + (void)seed64; (void)secret; (void)secretLen; + if (XXH_DISPATCH_MAYBE_NULL && XXH_g_dispatch128.hashLong128_default == NULL) + XXH_setDispatch(); + return XXH_g_dispatch128.hashLong128_default(input, len); +} + +XXH128_hash_t XXH3_128bits_dispatch(XXH_NOESCAPE const void* input, size_t len) +{ + return XXH3_128bits_internal(input, len, 0, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_128b_defaultSecret_selection); +} + +static XXH128_hash_t +XXH3_hashLong_128b_withSeed_selection(const void* input, size_t len, + XXH64_hash_t seed64, const void* secret, size_t secretLen) +{ + (void)secret; (void)secretLen; + if (XXH_DISPATCH_MAYBE_NULL && XXH_g_dispatch128.hashLong128_seed == NULL) + XXH_setDispatch(); + return XXH_g_dispatch128.hashLong128_seed(input, len, seed64); +} + +XXH128_hash_t XXH3_128bits_withSeed_dispatch(XXH_NOESCAPE const void* input, size_t len, XXH64_hash_t seed) +{ + return XXH3_128bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_128b_withSeed_selection); +} + +static XXH128_hash_t +XXH3_hashLong_128b_withSecret_selection(const void* input, size_t len, + XXH64_hash_t seed64, const void* secret, size_t secretLen) +{ + (void)seed64; + if (XXH_DISPATCH_MAYBE_NULL && XXH_g_dispatch128.hashLong128_secret == NULL) + XXH_setDispatch(); + return XXH_g_dispatch128.hashLong128_secret(input, len, secret, secretLen); +} + +XXH128_hash_t XXH3_128bits_withSecret_dispatch(XXH_NOESCAPE const void* input, size_t len, XXH_NOESCAPE const void* secret, size_t secretLen) +{ + return XXH3_128bits_internal(input, len, 0, secret, secretLen, XXH3_hashLong_128b_withSecret_selection); +} + +XXH_errorcode +XXH3_128bits_update_dispatch(XXH_NOESCAPE XXH3_state_t* state, XXH_NOESCAPE const void* input, size_t len) +{ + if (XXH_DISPATCH_MAYBE_NULL && XXH_g_dispatch128.update == NULL) + XXH_setDispatch(); + return XXH_g_dispatch128.update(state, (const xxh_u8*)input, len); +} + +/*! @endcond */ + +#if defined (__cplusplus) +} +#endif +/*! @} */ diff --git a/external/xxhash/xxh_x86dispatch.h b/external/xxhash/xxh_x86dispatch.h new file mode 100644 index 0000000..7085221 --- /dev/null +++ b/external/xxhash/xxh_x86dispatch.h @@ -0,0 +1,93 @@ +/* + * xxHash - XXH3 Dispatcher for x86-based targets + * Copyright (C) 2020-2024 Yann Collet + * + * BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * You can contact the author at: + * - xxHash homepage: https://www.xxhash.com + * - xxHash source repository: https://github.com/Cyan4973/xxHash + */ + +#ifndef XXH_X86DISPATCH_H_13563687684 +#define XXH_X86DISPATCH_H_13563687684 + +#include "xxhash.h" /* XXH64_hash_t, XXH3_state_t */ + +#if defined (__cplusplus) +extern "C" { +#endif + +/*! + * @brief Returns the best XXH3 implementation for x86 + * + * @return The best @ref XXH_VECTOR implementation. + * @see XXH_VECTOR_TYPES + */ +XXH_PUBLIC_API int XXH_featureTest(void); + +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_dispatch(XXH_NOESCAPE const void* input, size_t len); +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSeed_dispatch(XXH_NOESCAPE const void* input, size_t len, XXH64_hash_t seed); +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSecret_dispatch(XXH_NOESCAPE const void* input, size_t len, XXH_NOESCAPE const void* secret, size_t secretLen); +XXH_PUBLIC_API XXH_errorcode XXH3_64bits_update_dispatch(XXH_NOESCAPE XXH3_state_t* state, XXH_NOESCAPE const void* input, size_t len); + +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_dispatch(XXH_NOESCAPE const void* input, size_t len); +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSeed_dispatch(XXH_NOESCAPE const void* input, size_t len, XXH64_hash_t seed); +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSecret_dispatch(XXH_NOESCAPE const void* input, size_t len, XXH_NOESCAPE const void* secret, size_t secretLen); +XXH_PUBLIC_API XXH_errorcode XXH3_128bits_update_dispatch(XXH_NOESCAPE XXH3_state_t* state, XXH_NOESCAPE const void* input, size_t len); + +#if defined (__cplusplus) +} +#endif + + +/* automatic replacement of XXH3 functions. + * can be disabled by setting XXH_DISPATCH_DISABLE_REPLACE */ +#ifndef XXH_DISPATCH_DISABLE_REPLACE + +# undef XXH3_64bits +# define XXH3_64bits XXH3_64bits_dispatch +# undef XXH3_64bits_withSeed +# define XXH3_64bits_withSeed XXH3_64bits_withSeed_dispatch +# undef XXH3_64bits_withSecret +# define XXH3_64bits_withSecret XXH3_64bits_withSecret_dispatch +# undef XXH3_64bits_update +# define XXH3_64bits_update XXH3_64bits_update_dispatch + +# undef XXH128 +# define XXH128 XXH3_128bits_withSeed_dispatch +# undef XXH3_128bits +# define XXH3_128bits XXH3_128bits_dispatch +# undef XXH3_128bits_withSeed +# define XXH3_128bits_withSeed XXH3_128bits_withSeed_dispatch +# undef XXH3_128bits_withSecret +# define XXH3_128bits_withSecret XXH3_128bits_withSecret_dispatch +# undef XXH3_128bits_update +# define XXH3_128bits_update XXH3_128bits_update_dispatch + +#endif /* XXH_DISPATCH_DISABLE_REPLACE */ + +#endif /* XXH_X86DISPATCH_H_13563687684 */ diff --git a/external/xxhash/xxhash.c b/external/xxhash/xxhash.c new file mode 100644 index 0000000..e60cc37 --- /dev/null +++ b/external/xxhash/xxhash.c @@ -0,0 +1,42 @@ +/* + * xxHash - Extremely Fast Hash algorithm + * Copyright (C) 2012-2023 Yann Collet + * + * BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * You can contact the author at: + * - xxHash homepage: https://www.xxhash.com + * - xxHash source repository: https://github.com/Cyan4973/xxHash + */ + +/* + * xxhash.c instantiates functions defined in xxhash.h + */ + +#define XXH_STATIC_LINKING_ONLY /* access advanced declarations */ +#define XXH_IMPLEMENTATION /* access definitions */ + +#include "xxhash.h" diff --git a/external/xxhash/xxhash.h b/external/xxhash/xxhash.h new file mode 100644 index 0000000..1ad2ddb --- /dev/null +++ b/external/xxhash/xxhash.h @@ -0,0 +1,7343 @@ +/* + * xxHash - Extremely Fast Hash algorithm + * Header File + * Copyright (C) 2012-2023 Yann Collet + * + * BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * You can contact the author at: + * - xxHash homepage: https://www.xxhash.com + * - xxHash source repository: https://github.com/Cyan4973/xxHash + */ + +/*! + * @mainpage xxHash + * + * xxHash is an extremely fast non-cryptographic hash algorithm, working at RAM speed + * limits. + * + * It is proposed in four flavors, in three families: + * 1. @ref XXH32_family + * - Classic 32-bit hash function. Simple, compact, and runs on almost all + * 32-bit and 64-bit systems. + * 2. @ref XXH64_family + * - Classic 64-bit adaptation of XXH32. Just as simple, and runs well on most + * 64-bit systems (but _not_ 32-bit systems). + * 3. @ref XXH3_family + * - Modern 64-bit and 128-bit hash function family which features improved + * strength and performance across the board, especially on smaller data. + * It benefits greatly from SIMD and 64-bit without requiring it. + * + * Benchmarks + * --- + * The reference system uses an Intel i7-9700K CPU, and runs Ubuntu x64 20.04. + * The open source benchmark program is compiled with clang v10.0 using -O3 flag. + * + * | Hash Name | ISA ext | Width | Large Data Speed | Small Data Velocity | + * | -------------------- | ------- | ----: | ---------------: | ------------------: | + * | XXH3_64bits() | @b AVX2 | 64 | 59.4 GB/s | 133.1 | + * | MeowHash | AES-NI | 128 | 58.2 GB/s | 52.5 | + * | XXH3_128bits() | @b AVX2 | 128 | 57.9 GB/s | 118.1 | + * | CLHash | PCLMUL | 64 | 37.1 GB/s | 58.1 | + * | XXH3_64bits() | @b SSE2 | 64 | 31.5 GB/s | 133.1 | + * | XXH3_128bits() | @b SSE2 | 128 | 29.6 GB/s | 118.1 | + * | RAM sequential read | | N/A | 28.0 GB/s | N/A | + * | ahash | AES-NI | 64 | 22.5 GB/s | 107.2 | + * | City64 | | 64 | 22.0 GB/s | 76.6 | + * | T1ha2 | | 64 | 22.0 GB/s | 99.0 | + * | City128 | | 128 | 21.7 GB/s | 57.7 | + * | FarmHash | AES-NI | 64 | 21.3 GB/s | 71.9 | + * | XXH64() | | 64 | 19.4 GB/s | 71.0 | + * | SpookyHash | | 64 | 19.3 GB/s | 53.2 | + * | Mum | | 64 | 18.0 GB/s | 67.0 | + * | CRC32C | SSE4.2 | 32 | 13.0 GB/s | 57.9 | + * | XXH32() | | 32 | 9.7 GB/s | 71.9 | + * | City32 | | 32 | 9.1 GB/s | 66.0 | + * | Blake3* | @b AVX2 | 256 | 4.4 GB/s | 8.1 | + * | Murmur3 | | 32 | 3.9 GB/s | 56.1 | + * | SipHash* | | 64 | 3.0 GB/s | 43.2 | + * | Blake3* | @b SSE2 | 256 | 2.4 GB/s | 8.1 | + * | HighwayHash | | 64 | 1.4 GB/s | 6.0 | + * | FNV64 | | 64 | 1.2 GB/s | 62.7 | + * | Blake2* | | 256 | 1.1 GB/s | 5.1 | + * | SHA1* | | 160 | 0.8 GB/s | 5.6 | + * | MD5* | | 128 | 0.6 GB/s | 7.8 | + * @note + * - Hashes which require a specific ISA extension are noted. SSE2 is also noted, + * even though it is mandatory on x64. + * - Hashes with an asterisk are cryptographic. Note that MD5 is non-cryptographic + * by modern standards. + * - Small data velocity is a rough average of algorithm's efficiency for small + * data. For more accurate information, see the wiki. + * - More benchmarks and strength tests are found on the wiki: + * https://github.com/Cyan4973/xxHash/wiki + * + * Usage + * ------ + * All xxHash variants use a similar API. Changing the algorithm is a trivial + * substitution. + * + * @pre + * For functions which take an input and length parameter, the following + * requirements are assumed: + * - The range from [`input`, `input + length`) is valid, readable memory. + * - The only exception is if the `length` is `0`, `input` may be `NULL`. + * - For C++, the objects must have the *TriviallyCopyable* property, as the + * functions access bytes directly as if it was an array of `unsigned char`. + * + * @anchor single_shot_example + * **Single Shot** + * + * These functions are stateless functions which hash a contiguous block of memory, + * immediately returning the result. They are the easiest and usually the fastest + * option. + * + * XXH32(), XXH64(), XXH3_64bits(), XXH3_128bits() + * + * @code{.c} + * #include + * #include "xxhash.h" + * + * // Example for a function which hashes a null terminated string with XXH32(). + * XXH32_hash_t hash_string(const char* string, XXH32_hash_t seed) + * { + * // NULL pointers are only valid if the length is zero + * size_t length = (string == NULL) ? 0 : strlen(string); + * return XXH32(string, length, seed); + * } + * @endcode + * + * + * @anchor streaming_example + * **Streaming** + * + * These groups of functions allow incremental hashing of unknown size, even + * more than what would fit in a size_t. + * + * XXH32_reset(), XXH64_reset(), XXH3_64bits_reset(), XXH3_128bits_reset() + * + * @code{.c} + * #include + * #include + * #include "xxhash.h" + * // Example for a function which hashes a FILE incrementally with XXH3_64bits(). + * XXH64_hash_t hashFile(FILE* f) + * { + * // Allocate a state struct. Do not just use malloc() or new. + * XXH3_state_t* state = XXH3_createState(); + * assert(state != NULL && "Out of memory!"); + * // Reset the state to start a new hashing session. + * XXH3_64bits_reset(state); + * char buffer[4096]; + * size_t count; + * // Read the file in chunks + * while ((count = fread(buffer, 1, sizeof(buffer), f)) != 0) { + * // Run update() as many times as necessary to process the data + * XXH3_64bits_update(state, buffer, count); + * } + * // Retrieve the finalized hash. This will not change the state. + * XXH64_hash_t result = XXH3_64bits_digest(state); + * // Free the state. Do not use free(). + * XXH3_freeState(state); + * return result; + * } + * @endcode + * + * Streaming functions generate the xxHash value from an incremental input. + * This method is slower than single-call functions, due to state management. + * For small inputs, prefer `XXH32()` and `XXH64()`, which are better optimized. + * + * An XXH state must first be allocated using `XXH*_createState()`. + * + * Start a new hash by initializing the state with a seed using `XXH*_reset()`. + * + * Then, feed the hash state by calling `XXH*_update()` as many times as necessary. + * + * The function returns an error code, with 0 meaning OK, and any other value + * meaning there is an error. + * + * Finally, a hash value can be produced anytime, by using `XXH*_digest()`. + * This function returns the nn-bits hash as an int or long long. + * + * It's still possible to continue inserting input into the hash state after a + * digest, and generate new hash values later on by invoking `XXH*_digest()`. + * + * When done, release the state using `XXH*_freeState()`. + * + * + * @anchor canonical_representation_example + * **Canonical Representation** + * + * The default return values from XXH functions are unsigned 32, 64 and 128 bit + * integers. + * This the simplest and fastest format for further post-processing. + * + * However, this leaves open the question of what is the order on the byte level, + * since little and big endian conventions will store the same number differently. + * + * The canonical representation settles this issue by mandating big-endian + * convention, the same convention as human-readable numbers (large digits first). + * + * When writing hash values to storage, sending them over a network, or printing + * them, it's highly recommended to use the canonical representation to ensure + * portability across a wider range of systems, present and future. + * + * The following functions allow transformation of hash values to and from + * canonical format. + * + * XXH32_canonicalFromHash(), XXH32_hashFromCanonical(), + * XXH64_canonicalFromHash(), XXH64_hashFromCanonical(), + * XXH128_canonicalFromHash(), XXH128_hashFromCanonical(), + * + * @code{.c} + * #include + * #include "xxhash.h" + * + * // Example for a function which prints XXH32_hash_t in human readable format + * void printXxh32(XXH32_hash_t hash) + * { + * XXH32_canonical_t cano; + * XXH32_canonicalFromHash(&cano, hash); + * size_t i; + * for(i = 0; i < sizeof(cano.digest); ++i) { + * printf("%02x", cano.digest[i]); + * } + * printf("\n"); + * } + * + * // Example for a function which converts XXH32_canonical_t to XXH32_hash_t + * XXH32_hash_t convertCanonicalToXxh32(XXH32_canonical_t cano) + * { + * XXH32_hash_t hash = XXH32_hashFromCanonical(&cano); + * return hash; + * } + * @endcode + * + * + * @file xxhash.h + * xxHash prototypes and implementation + */ + +#if defined(__cplusplus) && !defined(XXH_NO_EXTERNC_GUARD) +extern "C" { +#endif + +/* **************************** + * INLINE mode + ******************************/ +/*! + * @defgroup public Public API + * Contains details on the public xxHash functions. + * @{ + */ +#ifdef XXH_DOXYGEN +/*! + * @brief Gives access to internal state declaration, required for static allocation. + * + * Incompatible with dynamic linking, due to risks of ABI changes. + * + * Usage: + * @code{.c} + * #define XXH_STATIC_LINKING_ONLY + * #include "xxhash.h" + * @endcode + */ +# define XXH_STATIC_LINKING_ONLY +/* Do not undef XXH_STATIC_LINKING_ONLY for Doxygen */ + +/*! + * @brief Gives access to internal definitions. + * + * Usage: + * @code{.c} + * #define XXH_STATIC_LINKING_ONLY + * #define XXH_IMPLEMENTATION + * #include "xxhash.h" + * @endcode + */ +# define XXH_IMPLEMENTATION +/* Do not undef XXH_IMPLEMENTATION for Doxygen */ + +/*! + * @brief Exposes the implementation and marks all functions as `inline`. + * + * Use these build macros to inline xxhash into the target unit. + * Inlining improves performance on small inputs, especially when the length is + * expressed as a compile-time constant: + * + * https://fastcompression.blogspot.com/2018/03/xxhash-for-small-keys-impressive-power.html + * + * It also keeps xxHash symbols private to the unit, so they are not exported. + * + * Usage: + * @code{.c} + * #define XXH_INLINE_ALL + * #include "xxhash.h" + * @endcode + * Do not compile and link xxhash.o as a separate object, as it is not useful. + */ +# define XXH_INLINE_ALL +# undef XXH_INLINE_ALL +/*! + * @brief Exposes the implementation without marking functions as inline. + */ +# define XXH_PRIVATE_API +# undef XXH_PRIVATE_API +/*! + * @brief Emulate a namespace by transparently prefixing all symbols. + * + * If you want to include _and expose_ xxHash functions from within your own + * library, but also want to avoid symbol collisions with other libraries which + * may also include xxHash, you can use @ref XXH_NAMESPACE to automatically prefix + * any public symbol from xxhash library with the value of @ref XXH_NAMESPACE + * (therefore, avoid empty or numeric values). + * + * Note that no change is required within the calling program as long as it + * includes `xxhash.h`: Regular symbol names will be automatically translated + * by this header. + */ +# define XXH_NAMESPACE /* YOUR NAME HERE */ +# undef XXH_NAMESPACE +#endif + +#if (defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API)) \ + && !defined(XXH_INLINE_ALL_31684351384) + /* this section should be traversed only once */ +# define XXH_INLINE_ALL_31684351384 + /* give access to the advanced API, required to compile implementations */ +# undef XXH_STATIC_LINKING_ONLY /* avoid macro redef */ +# define XXH_STATIC_LINKING_ONLY + /* make all functions private */ +# undef XXH_PUBLIC_API +# if defined(__GNUC__) +# define XXH_PUBLIC_API static __inline __attribute__((__unused__)) +# elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) +# define XXH_PUBLIC_API static inline +# elif defined(_MSC_VER) +# define XXH_PUBLIC_API static __inline +# else + /* note: this version may generate warnings for unused static functions */ +# define XXH_PUBLIC_API static +# endif + + /* + * This part deals with the special case where a unit wants to inline xxHash, + * but "xxhash.h" has previously been included without XXH_INLINE_ALL, + * such as part of some previously included *.h header file. + * Without further action, the new include would just be ignored, + * and functions would effectively _not_ be inlined (silent failure). + * The following macros solve this situation by prefixing all inlined names, + * avoiding naming collision with previous inclusions. + */ + /* Before that, we unconditionally #undef all symbols, + * in case they were already defined with XXH_NAMESPACE. + * They will then be redefined for XXH_INLINE_ALL + */ +# undef XXH_versionNumber + /* XXH32 */ +# undef XXH32 +# undef XXH32_createState +# undef XXH32_freeState +# undef XXH32_reset +# undef XXH32_update +# undef XXH32_digest +# undef XXH32_copyState +# undef XXH32_canonicalFromHash +# undef XXH32_hashFromCanonical + /* XXH64 */ +# undef XXH64 +# undef XXH64_createState +# undef XXH64_freeState +# undef XXH64_reset +# undef XXH64_update +# undef XXH64_digest +# undef XXH64_copyState +# undef XXH64_canonicalFromHash +# undef XXH64_hashFromCanonical + /* XXH3_64bits */ +# undef XXH3_64bits +# undef XXH3_64bits_withSecret +# undef XXH3_64bits_withSeed +# undef XXH3_64bits_withSecretandSeed +# undef XXH3_createState +# undef XXH3_freeState +# undef XXH3_copyState +# undef XXH3_64bits_reset +# undef XXH3_64bits_reset_withSeed +# undef XXH3_64bits_reset_withSecret +# undef XXH3_64bits_update +# undef XXH3_64bits_digest +# undef XXH3_generateSecret + /* XXH3_128bits */ +# undef XXH128 +# undef XXH3_128bits +# undef XXH3_128bits_withSeed +# undef XXH3_128bits_withSecret +# undef XXH3_128bits_reset +# undef XXH3_128bits_reset_withSeed +# undef XXH3_128bits_reset_withSecret +# undef XXH3_128bits_reset_withSecretandSeed +# undef XXH3_128bits_update +# undef XXH3_128bits_digest +# undef XXH128_isEqual +# undef XXH128_cmp +# undef XXH128_canonicalFromHash +# undef XXH128_hashFromCanonical + /* Finally, free the namespace itself */ +# undef XXH_NAMESPACE + + /* employ the namespace for XXH_INLINE_ALL */ +# define XXH_NAMESPACE XXH_INLINE_ + /* + * Some identifiers (enums, type names) are not symbols, + * but they must nonetheless be renamed to avoid redeclaration. + * Alternative solution: do not redeclare them. + * However, this requires some #ifdefs, and has a more dispersed impact. + * Meanwhile, renaming can be achieved in a single place. + */ +# define XXH_IPREF(Id) XXH_NAMESPACE ## Id +# define XXH_OK XXH_IPREF(XXH_OK) +# define XXH_ERROR XXH_IPREF(XXH_ERROR) +# define XXH_errorcode XXH_IPREF(XXH_errorcode) +# define XXH32_canonical_t XXH_IPREF(XXH32_canonical_t) +# define XXH64_canonical_t XXH_IPREF(XXH64_canonical_t) +# define XXH128_canonical_t XXH_IPREF(XXH128_canonical_t) +# define XXH32_state_s XXH_IPREF(XXH32_state_s) +# define XXH32_state_t XXH_IPREF(XXH32_state_t) +# define XXH64_state_s XXH_IPREF(XXH64_state_s) +# define XXH64_state_t XXH_IPREF(XXH64_state_t) +# define XXH3_state_s XXH_IPREF(XXH3_state_s) +# define XXH3_state_t XXH_IPREF(XXH3_state_t) +# define XXH128_hash_t XXH_IPREF(XXH128_hash_t) + /* Ensure the header is parsed again, even if it was previously included */ +# undef XXHASH_H_5627135585666179 +# undef XXHASH_H_STATIC_13879238742 +#endif /* XXH_INLINE_ALL || XXH_PRIVATE_API */ + +/* **************************************************************** + * Stable API + *****************************************************************/ +#ifndef XXHASH_H_5627135585666179 +#define XXHASH_H_5627135585666179 1 + +/*! @brief Marks a global symbol. */ +#if !defined(XXH_INLINE_ALL) && !defined(XXH_PRIVATE_API) +# if defined(_WIN32) && defined(_MSC_VER) && (defined(XXH_IMPORT) || defined(XXH_EXPORT)) +# ifdef XXH_EXPORT +# define XXH_PUBLIC_API __declspec(dllexport) +# elif XXH_IMPORT +# define XXH_PUBLIC_API __declspec(dllimport) +# endif +# else +# define XXH_PUBLIC_API /* do nothing */ +# endif +#endif + +#ifdef XXH_NAMESPACE +# define XXH_CAT(A,B) A##B +# define XXH_NAME2(A,B) XXH_CAT(A,B) +# define XXH_versionNumber XXH_NAME2(XXH_NAMESPACE, XXH_versionNumber) +/* XXH32 */ +# define XXH32 XXH_NAME2(XXH_NAMESPACE, XXH32) +# define XXH32_createState XXH_NAME2(XXH_NAMESPACE, XXH32_createState) +# define XXH32_freeState XXH_NAME2(XXH_NAMESPACE, XXH32_freeState) +# define XXH32_reset XXH_NAME2(XXH_NAMESPACE, XXH32_reset) +# define XXH32_update XXH_NAME2(XXH_NAMESPACE, XXH32_update) +# define XXH32_digest XXH_NAME2(XXH_NAMESPACE, XXH32_digest) +# define XXH32_copyState XXH_NAME2(XXH_NAMESPACE, XXH32_copyState) +# define XXH32_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH32_canonicalFromHash) +# define XXH32_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH32_hashFromCanonical) +/* XXH64 */ +# define XXH64 XXH_NAME2(XXH_NAMESPACE, XXH64) +# define XXH64_createState XXH_NAME2(XXH_NAMESPACE, XXH64_createState) +# define XXH64_freeState XXH_NAME2(XXH_NAMESPACE, XXH64_freeState) +# define XXH64_reset XXH_NAME2(XXH_NAMESPACE, XXH64_reset) +# define XXH64_update XXH_NAME2(XXH_NAMESPACE, XXH64_update) +# define XXH64_digest XXH_NAME2(XXH_NAMESPACE, XXH64_digest) +# define XXH64_copyState XXH_NAME2(XXH_NAMESPACE, XXH64_copyState) +# define XXH64_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH64_canonicalFromHash) +# define XXH64_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH64_hashFromCanonical) +/* XXH3_64bits */ +# define XXH3_64bits XXH_NAME2(XXH_NAMESPACE, XXH3_64bits) +# define XXH3_64bits_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSecret) +# define XXH3_64bits_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSeed) +# define XXH3_64bits_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSecretandSeed) +# define XXH3_createState XXH_NAME2(XXH_NAMESPACE, XXH3_createState) +# define XXH3_freeState XXH_NAME2(XXH_NAMESPACE, XXH3_freeState) +# define XXH3_copyState XXH_NAME2(XXH_NAMESPACE, XXH3_copyState) +# define XXH3_64bits_reset XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset) +# define XXH3_64bits_reset_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSeed) +# define XXH3_64bits_reset_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSecret) +# define XXH3_64bits_reset_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSecretandSeed) +# define XXH3_64bits_update XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_update) +# define XXH3_64bits_digest XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_digest) +# define XXH3_generateSecret XXH_NAME2(XXH_NAMESPACE, XXH3_generateSecret) +# define XXH3_generateSecret_fromSeed XXH_NAME2(XXH_NAMESPACE, XXH3_generateSecret_fromSeed) +/* XXH3_128bits */ +# define XXH128 XXH_NAME2(XXH_NAMESPACE, XXH128) +# define XXH3_128bits XXH_NAME2(XXH_NAMESPACE, XXH3_128bits) +# define XXH3_128bits_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSeed) +# define XXH3_128bits_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSecret) +# define XXH3_128bits_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSecretandSeed) +# define XXH3_128bits_reset XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset) +# define XXH3_128bits_reset_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSeed) +# define XXH3_128bits_reset_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSecret) +# define XXH3_128bits_reset_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSecretandSeed) +# define XXH3_128bits_update XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_update) +# define XXH3_128bits_digest XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_digest) +# define XXH128_isEqual XXH_NAME2(XXH_NAMESPACE, XXH128_isEqual) +# define XXH128_cmp XXH_NAME2(XXH_NAMESPACE, XXH128_cmp) +# define XXH128_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH128_canonicalFromHash) +# define XXH128_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH128_hashFromCanonical) +#endif + + +/* ************************************* +* Compiler specifics +***************************************/ + +/* specific declaration modes for Windows */ +#if !defined(XXH_INLINE_ALL) && !defined(XXH_PRIVATE_API) +# if defined(_WIN32) && defined(_MSC_VER) && (defined(XXH_IMPORT) || defined(XXH_EXPORT)) +# ifdef XXH_EXPORT +# define XXH_PUBLIC_API __declspec(dllexport) +# elif XXH_IMPORT +# define XXH_PUBLIC_API __declspec(dllimport) +# endif +# else +# define XXH_PUBLIC_API /* do nothing */ +# endif +#endif + +#if defined (__GNUC__) +# define XXH_CONSTF __attribute__((__const__)) +# define XXH_PUREF __attribute__((__pure__)) +# define XXH_MALLOCF __attribute__((__malloc__)) +#else +# define XXH_CONSTF /* disable */ +# define XXH_PUREF +# define XXH_MALLOCF +#endif + +/* ************************************* +* Version +***************************************/ +#define XXH_VERSION_MAJOR 0 +#define XXH_VERSION_MINOR 8 +#define XXH_VERSION_RELEASE 3 +/*! @brief Version number, encoded as two digits each */ +#define XXH_VERSION_NUMBER (XXH_VERSION_MAJOR *100*100 + XXH_VERSION_MINOR *100 + XXH_VERSION_RELEASE) + +/*! + * @brief Obtains the xxHash version. + * + * This is mostly useful when xxHash is compiled as a shared library, + * since the returned value comes from the library, as opposed to header file. + * + * @return @ref XXH_VERSION_NUMBER of the invoked library. + */ +XXH_PUBLIC_API XXH_CONSTF unsigned XXH_versionNumber (void); + + +/* **************************** +* Common basic types +******************************/ +#include /* size_t */ +/*! + * @brief Exit code for the streaming API. + */ +typedef enum { + XXH_OK = 0, /*!< OK */ + XXH_ERROR /*!< Error */ +} XXH_errorcode; + + +/*-********************************************************************** +* 32-bit hash +************************************************************************/ +#if defined(XXH_DOXYGEN) /* Don't show include */ +/*! + * @brief An unsigned 32-bit integer. + * + * Not necessarily defined to `uint32_t` but functionally equivalent. + */ +typedef uint32_t XXH32_hash_t; + +#elif !defined (__VMS) \ + && (defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) +# ifdef _AIX +# include +# else +# include +# endif + typedef uint32_t XXH32_hash_t; + +#else +# include +# if UINT_MAX == 0xFFFFFFFFUL + typedef unsigned int XXH32_hash_t; +# elif ULONG_MAX == 0xFFFFFFFFUL + typedef unsigned long XXH32_hash_t; +# else +# error "unsupported platform: need a 32-bit type" +# endif +#endif + +/*! + * @} + * + * @defgroup XXH32_family XXH32 family + * @ingroup public + * Contains functions used in the classic 32-bit xxHash algorithm. + * + * @note + * XXH32 is useful for older platforms, with no or poor 64-bit performance. + * Note that the @ref XXH3_family provides competitive speed for both 32-bit + * and 64-bit systems, and offers true 64/128 bit hash results. + * + * @see @ref XXH64_family, @ref XXH3_family : Other xxHash families + * @see @ref XXH32_impl for implementation details + * @{ + */ + +/*! + * @brief Calculates the 32-bit hash of @p input using xxHash32. + * + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * @param seed The 32-bit seed to alter the hash's output predictably. + * + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return The calculated 32-bit xxHash32 value. + * + * @see @ref single_shot_example "Single Shot Example" for an example. + */ +XXH_PUBLIC_API XXH_PUREF XXH32_hash_t XXH32 (const void* input, size_t length, XXH32_hash_t seed); + +#ifndef XXH_NO_STREAM +/*! + * @typedef struct XXH32_state_s XXH32_state_t + * @brief The opaque state struct for the XXH32 streaming API. + * + * @see XXH32_state_s for details. + * @see @ref streaming_example "Streaming Example" + */ +typedef struct XXH32_state_s XXH32_state_t; + +/*! + * @brief Allocates an @ref XXH32_state_t. + * + * @return An allocated pointer of @ref XXH32_state_t on success. + * @return `NULL` on failure. + * + * @note Must be freed with XXH32_freeState(). + * + * @see @ref streaming_example "Streaming Example" + */ +XXH_PUBLIC_API XXH_MALLOCF XXH32_state_t* XXH32_createState(void); +/*! + * @brief Frees an @ref XXH32_state_t. + * + * @param statePtr A pointer to an @ref XXH32_state_t allocated with @ref XXH32_createState(). + * + * @return @ref XXH_OK. + * + * @note @p statePtr must be allocated with XXH32_createState(). + * + * @see @ref streaming_example "Streaming Example" + * + */ +XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr); +/*! + * @brief Copies one @ref XXH32_state_t to another. + * + * @param dst_state The state to copy to. + * @param src_state The state to copy from. + * @pre + * @p dst_state and @p src_state must not be `NULL` and must not overlap. + */ +XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dst_state, const XXH32_state_t* src_state); + +/*! + * @brief Resets an @ref XXH32_state_t to begin a new hash. + * + * @param statePtr The state struct to reset. + * @param seed The 32-bit seed to alter the hash result predictably. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return @ref XXH_OK on success. + * @return @ref XXH_ERROR on failure. + * + * @note This function resets and seeds a state. Call it before @ref XXH32_update(). + * + * @see @ref streaming_example "Streaming Example" + */ +XXH_PUBLIC_API XXH_errorcode XXH32_reset (XXH32_state_t* statePtr, XXH32_hash_t seed); + +/*! + * @brief Consumes a block of @p input to an @ref XXH32_state_t. + * + * @param statePtr The state struct to update. + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * + * @pre + * @p statePtr must not be `NULL`. + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return @ref XXH_OK on success. + * @return @ref XXH_ERROR on failure. + * + * @note Call this to incrementally consume blocks of data. + * + * @see @ref streaming_example "Streaming Example" + */ +XXH_PUBLIC_API XXH_errorcode XXH32_update (XXH32_state_t* statePtr, const void* input, size_t length); + +/*! + * @brief Returns the calculated hash value from an @ref XXH32_state_t. + * + * @param statePtr The state struct to calculate the hash from. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return The calculated 32-bit xxHash32 value from that state. + * + * @note + * Calling XXH32_digest() will not affect @p statePtr, so you can update, + * digest, and update again. + * + * @see @ref streaming_example "Streaming Example" + */ +XXH_PUBLIC_API XXH_PUREF XXH32_hash_t XXH32_digest (const XXH32_state_t* statePtr); +#endif /* !XXH_NO_STREAM */ + +/******* Canonical representation *******/ + +/*! + * @brief Canonical (big endian) representation of @ref XXH32_hash_t. + */ +typedef struct { + unsigned char digest[4]; /*!< Hash bytes, big endian */ +} XXH32_canonical_t; + +/*! + * @brief Converts an @ref XXH32_hash_t to a big endian @ref XXH32_canonical_t. + * + * @param dst The @ref XXH32_canonical_t pointer to be stored to. + * @param hash The @ref XXH32_hash_t to be converted. + * + * @pre + * @p dst must not be `NULL`. + * + * @see @ref canonical_representation_example "Canonical Representation Example" + */ +XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash); + +/*! + * @brief Converts an @ref XXH32_canonical_t to a native @ref XXH32_hash_t. + * + * @param src The @ref XXH32_canonical_t to convert. + * + * @pre + * @p src must not be `NULL`. + * + * @return The converted hash. + * + * @see @ref canonical_representation_example "Canonical Representation Example" + */ +XXH_PUBLIC_API XXH_PUREF XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src); + + +/*! @cond Doxygen ignores this part */ +#ifdef __has_attribute +# define XXH_HAS_ATTRIBUTE(x) __has_attribute(x) +#else +# define XXH_HAS_ATTRIBUTE(x) 0 +#endif +/*! @endcond */ + +/*! @cond Doxygen ignores this part */ +/* + * C23 __STDC_VERSION__ number hasn't been specified yet. For now + * leave as `201711L` (C17 + 1). + * TODO: Update to correct value when its been specified. + */ +#define XXH_C23_VN 201711L +/*! @endcond */ + +/*! @cond Doxygen ignores this part */ +/* C-language Attributes are added in C23. */ +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= XXH_C23_VN) && defined(__has_c_attribute) +# define XXH_HAS_C_ATTRIBUTE(x) __has_c_attribute(x) +#else +# define XXH_HAS_C_ATTRIBUTE(x) 0 +#endif +/*! @endcond */ + +/*! @cond Doxygen ignores this part */ +#if defined(__cplusplus) && defined(__has_cpp_attribute) +# define XXH_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) +#else +# define XXH_HAS_CPP_ATTRIBUTE(x) 0 +#endif +/*! @endcond */ + +/*! @cond Doxygen ignores this part */ +/* + * Define XXH_FALLTHROUGH macro for annotating switch case with the 'fallthrough' attribute + * introduced in CPP17 and C23. + * CPP17 : https://en.cppreference.com/w/cpp/language/attributes/fallthrough + * C23 : https://en.cppreference.com/w/c/language/attributes/fallthrough + */ +#if XXH_HAS_C_ATTRIBUTE(fallthrough) || XXH_HAS_CPP_ATTRIBUTE(fallthrough) +# define XXH_FALLTHROUGH [[fallthrough]] +#elif XXH_HAS_ATTRIBUTE(__fallthrough__) +# define XXH_FALLTHROUGH __attribute__ ((__fallthrough__)) +#else +# define XXH_FALLTHROUGH /* fallthrough */ +#endif +/*! @endcond */ + +/*! @cond Doxygen ignores this part */ +/* + * Define XXH_NOESCAPE for annotated pointers in public API. + * https://clang.llvm.org/docs/AttributeReference.html#noescape + * As of writing this, only supported by clang. + */ +#if XXH_HAS_ATTRIBUTE(noescape) +# define XXH_NOESCAPE __attribute__((__noescape__)) +#else +# define XXH_NOESCAPE +#endif +/*! @endcond */ + + +/*! + * @} + * @ingroup public + * @{ + */ + +#ifndef XXH_NO_LONG_LONG +/*-********************************************************************** +* 64-bit hash +************************************************************************/ +#if defined(XXH_DOXYGEN) /* don't include */ +/*! + * @brief An unsigned 64-bit integer. + * + * Not necessarily defined to `uint64_t` but functionally equivalent. + */ +typedef uint64_t XXH64_hash_t; +#elif !defined (__VMS) \ + && (defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) +# ifdef _AIX +# include +# else +# include +# endif + typedef uint64_t XXH64_hash_t; +#else +# include +# if defined(__LP64__) && ULONG_MAX == 0xFFFFFFFFFFFFFFFFULL + /* LP64 ABI says uint64_t is unsigned long */ + typedef unsigned long XXH64_hash_t; +# else + /* the following type must have a width of 64-bit */ + typedef unsigned long long XXH64_hash_t; +# endif +#endif + +/*! + * @} + * + * @defgroup XXH64_family XXH64 family + * @ingroup public + * @{ + * Contains functions used in the classic 64-bit xxHash algorithm. + * + * @note + * XXH3 provides competitive speed for both 32-bit and 64-bit systems, + * and offers true 64/128 bit hash results. + * It provides better speed for systems with vector processing capabilities. + */ + +/*! + * @brief Calculates the 64-bit hash of @p input using xxHash64. + * + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * @param seed The 64-bit seed to alter the hash's output predictably. + * + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return The calculated 64-bit xxHash64 value. + * + * @see @ref single_shot_example "Single Shot Example" for an example. + */ +XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH64(XXH_NOESCAPE const void* input, size_t length, XXH64_hash_t seed); + +/******* Streaming *******/ +#ifndef XXH_NO_STREAM +/*! + * @brief The opaque state struct for the XXH64 streaming API. + * + * @see XXH64_state_s for details. + * @see @ref streaming_example "Streaming Example" + */ +typedef struct XXH64_state_s XXH64_state_t; /* incomplete type */ + +/*! + * @brief Allocates an @ref XXH64_state_t. + * + * @return An allocated pointer of @ref XXH64_state_t on success. + * @return `NULL` on failure. + * + * @note Must be freed with XXH64_freeState(). + * + * @see @ref streaming_example "Streaming Example" + */ +XXH_PUBLIC_API XXH_MALLOCF XXH64_state_t* XXH64_createState(void); + +/*! + * @brief Frees an @ref XXH64_state_t. + * + * @param statePtr A pointer to an @ref XXH64_state_t allocated with @ref XXH64_createState(). + * + * @return @ref XXH_OK. + * + * @note @p statePtr must be allocated with XXH64_createState(). + * + * @see @ref streaming_example "Streaming Example" + */ +XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr); + +/*! + * @brief Copies one @ref XXH64_state_t to another. + * + * @param dst_state The state to copy to. + * @param src_state The state to copy from. + * @pre + * @p dst_state and @p src_state must not be `NULL` and must not overlap. + */ +XXH_PUBLIC_API void XXH64_copyState(XXH_NOESCAPE XXH64_state_t* dst_state, const XXH64_state_t* src_state); + +/*! + * @brief Resets an @ref XXH64_state_t to begin a new hash. + * + * @param statePtr The state struct to reset. + * @param seed The 64-bit seed to alter the hash result predictably. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return @ref XXH_OK on success. + * @return @ref XXH_ERROR on failure. + * + * @note This function resets and seeds a state. Call it before @ref XXH64_update(). + * + * @see @ref streaming_example "Streaming Example" + */ +XXH_PUBLIC_API XXH_errorcode XXH64_reset (XXH_NOESCAPE XXH64_state_t* statePtr, XXH64_hash_t seed); + +/*! + * @brief Consumes a block of @p input to an @ref XXH64_state_t. + * + * @param statePtr The state struct to update. + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * + * @pre + * @p statePtr must not be `NULL`. + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return @ref XXH_OK on success. + * @return @ref XXH_ERROR on failure. + * + * @note Call this to incrementally consume blocks of data. + * + * @see @ref streaming_example "Streaming Example" + */ +XXH_PUBLIC_API XXH_errorcode XXH64_update (XXH_NOESCAPE XXH64_state_t* statePtr, XXH_NOESCAPE const void* input, size_t length); + +/*! + * @brief Returns the calculated hash value from an @ref XXH64_state_t. + * + * @param statePtr The state struct to calculate the hash from. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return The calculated 64-bit xxHash64 value from that state. + * + * @note + * Calling XXH64_digest() will not affect @p statePtr, so you can update, + * digest, and update again. + * + * @see @ref streaming_example "Streaming Example" + */ +XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH64_digest (XXH_NOESCAPE const XXH64_state_t* statePtr); +#endif /* !XXH_NO_STREAM */ +/******* Canonical representation *******/ + +/*! + * @brief Canonical (big endian) representation of @ref XXH64_hash_t. + */ +typedef struct { unsigned char digest[sizeof(XXH64_hash_t)]; } XXH64_canonical_t; + +/*! + * @brief Converts an @ref XXH64_hash_t to a big endian @ref XXH64_canonical_t. + * + * @param dst The @ref XXH64_canonical_t pointer to be stored to. + * @param hash The @ref XXH64_hash_t to be converted. + * + * @pre + * @p dst must not be `NULL`. + * + * @see @ref canonical_representation_example "Canonical Representation Example" + */ +XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH_NOESCAPE XXH64_canonical_t* dst, XXH64_hash_t hash); + +/*! + * @brief Converts an @ref XXH64_canonical_t to a native @ref XXH64_hash_t. + * + * @param src The @ref XXH64_canonical_t to convert. + * + * @pre + * @p src must not be `NULL`. + * + * @return The converted hash. + * + * @see @ref canonical_representation_example "Canonical Representation Example" + */ +XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH64_hashFromCanonical(XXH_NOESCAPE const XXH64_canonical_t* src); + +#ifndef XXH_NO_XXH3 + +/*! + * @} + * ************************************************************************ + * @defgroup XXH3_family XXH3 family + * @ingroup public + * @{ + * + * XXH3 is a more recent hash algorithm featuring: + * - Improved speed for both small and large inputs + * - True 64-bit and 128-bit outputs + * - SIMD acceleration + * - Improved 32-bit viability + * + * Speed analysis methodology is explained here: + * + * https://fastcompression.blogspot.com/2019/03/presenting-xxh3.html + * + * Compared to XXH64, expect XXH3 to run approximately + * ~2x faster on large inputs and >3x faster on small ones, + * exact differences vary depending on platform. + * + * XXH3's speed benefits greatly from SIMD and 64-bit arithmetic, + * but does not require it. + * Most 32-bit and 64-bit targets that can run XXH32 smoothly can run XXH3 + * at competitive speeds, even without vector support. Further details are + * explained in the implementation. + * + * XXH3 has a fast scalar implementation, but it also includes accelerated SIMD + * implementations for many common platforms: + * - AVX512 + * - AVX2 + * - SSE2 + * - ARM NEON + * - WebAssembly SIMD128 + * - POWER8 VSX + * - s390x ZVector + * This can be controlled via the @ref XXH_VECTOR macro, but it automatically + * selects the best version according to predefined macros. For the x86 family, an + * automatic runtime dispatcher is included separately in @ref xxh_x86dispatch.c. + * + * XXH3 implementation is portable: + * it has a generic C90 formulation that can be compiled on any platform, + * all implementations generate exactly the same hash value on all platforms. + * Starting from v0.8.0, it's also labelled "stable", meaning that + * any future version will also generate the same hash value. + * + * XXH3 offers 2 variants, _64bits and _128bits. + * + * When only 64 bits are needed, prefer invoking the _64bits variant, as it + * reduces the amount of mixing, resulting in faster speed on small inputs. + * It's also generally simpler to manipulate a scalar return type than a struct. + * + * The API supports one-shot hashing, streaming mode, and custom secrets. + */ + +/*! + * @ingroup tuning + * @brief Possible values for @ref XXH_VECTOR. + * + * Unless set explicitly, determined automatically. + */ +# define XXH_SCALAR 0 /*!< Portable scalar version */ +# define XXH_SSE2 1 /*!< SSE2 for Pentium 4, Opteron, all x86_64. */ +# define XXH_AVX2 2 /*!< AVX2 for Haswell and Bulldozer */ +# define XXH_AVX512 3 /*!< AVX512 for Skylake and Icelake */ +# define XXH_NEON 4 /*!< NEON for most ARMv7-A, all AArch64, and WASM SIMD128 */ +# define XXH_VSX 5 /*!< VSX and ZVector for POWER8/z13 (64-bit) */ +# define XXH_SVE 6 /*!< SVE for some ARMv8-A and ARMv9-A */ +# define XXH_LSX 7 /*!< LSX (128-bit SIMD) for LoongArch64 */ +# define XXH_LASX 8 /*!< LASX (256-bit SIMD) for LoongArch64 */ + + +/*-********************************************************************** +* XXH3 64-bit variant +************************************************************************/ + +/*! + * @brief Calculates 64-bit unseeded variant of XXH3 hash of @p input. + * + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return The calculated 64-bit XXH3 hash value. + * + * @note + * This is equivalent to @ref XXH3_64bits_withSeed() with a seed of `0`, however + * it may have slightly better performance due to constant propagation of the + * defaults. + * + * @see + * XXH3_64bits_withSeed(), XXH3_64bits_withSecret(): other seeding variants + * @see @ref single_shot_example "Single Shot Example" for an example. + */ +XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH3_64bits(XXH_NOESCAPE const void* input, size_t length); + +/*! + * @brief Calculates 64-bit seeded variant of XXH3 hash of @p input. + * + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * @param seed The 64-bit seed to alter the hash result predictably. + * + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return The calculated 64-bit XXH3 hash value. + * + * @note + * seed == 0 produces the same results as @ref XXH3_64bits(). + * + * This variant generates a custom secret on the fly based on default secret + * altered using the @p seed value. + * + * While this operation is decently fast, note that it's not completely free. + * + * @see @ref single_shot_example "Single Shot Example" for an example. + */ +XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH3_64bits_withSeed(XXH_NOESCAPE const void* input, size_t length, XXH64_hash_t seed); + +/*! + * The bare minimum size for a custom secret. + * + * @see + * XXH3_64bits_withSecret(), XXH3_64bits_reset_withSecret(), + * XXH3_128bits_withSecret(), XXH3_128bits_reset_withSecret(). + */ +#define XXH3_SECRET_SIZE_MIN 136 + +/*! + * @brief Calculates 64-bit variant of XXH3 with a custom "secret". + * + * @param data The block of data to be hashed, at least @p len bytes in size. + * @param len The length of @p data, in bytes. + * @param secret The secret data. + * @param secretSize The length of @p secret, in bytes. + * + * @return The calculated 64-bit XXH3 hash value. + * + * @pre + * The memory between @p data and @p data + @p len must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p data may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * It's possible to provide any blob of bytes as a "secret" to generate the hash. + * This makes it more difficult for an external actor to prepare an intentional collision. + * The main condition is that @p secretSize *must* be large enough (>= @ref XXH3_SECRET_SIZE_MIN). + * However, the quality of the secret impacts the dispersion of the hash algorithm. + * Therefore, the secret _must_ look like a bunch of random bytes. + * Avoid "trivial" or structured data such as repeated sequences or a text document. + * Whenever in doubt about the "randomness" of the blob of bytes, + * consider employing @ref XXH3_generateSecret() instead (see below). + * It will generate a proper high entropy secret derived from the blob of bytes. + * Another advantage of using XXH3_generateSecret() is that + * it guarantees that all bits within the initial blob of bytes + * will impact every bit of the output. + * This is not necessarily the case when using the blob of bytes directly + * because, when hashing _small_ inputs, only a portion of the secret is employed. + * + * @see @ref single_shot_example "Single Shot Example" for an example. + */ +XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH3_64bits_withSecret(XXH_NOESCAPE const void* data, size_t len, XXH_NOESCAPE const void* secret, size_t secretSize); + + +/******* Streaming *******/ +#ifndef XXH_NO_STREAM +/* + * Streaming requires state maintenance. + * This operation costs memory and CPU. + * As a consequence, streaming is slower than one-shot hashing. + * For better performance, prefer one-shot functions whenever applicable. + */ + +/*! + * @brief The opaque state struct for the XXH3 streaming API. + * + * @see XXH3_state_s for details. + * @see @ref streaming_example "Streaming Example" + */ +typedef struct XXH3_state_s XXH3_state_t; +XXH_PUBLIC_API XXH_MALLOCF XXH3_state_t* XXH3_createState(void); +XXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t* statePtr); + +/*! + * @brief Copies one @ref XXH3_state_t to another. + * + * @param dst_state The state to copy to. + * @param src_state The state to copy from. + * @pre + * @p dst_state and @p src_state must not be `NULL` and must not overlap. + */ +XXH_PUBLIC_API void XXH3_copyState(XXH_NOESCAPE XXH3_state_t* dst_state, XXH_NOESCAPE const XXH3_state_t* src_state); + +/*! + * @brief Resets an @ref XXH3_state_t to begin a new hash. + * + * @param statePtr The state struct to reset. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return @ref XXH_OK on success. + * @return @ref XXH_ERROR on failure. + * + * @note + * - This function resets `statePtr` and generate a secret with default parameters. + * - Call this function before @ref XXH3_64bits_update(). + * - Digest will be equivalent to `XXH3_64bits()`. + * + * @see @ref streaming_example "Streaming Example" + * + */ +XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset(XXH_NOESCAPE XXH3_state_t* statePtr); + +/*! + * @brief Resets an @ref XXH3_state_t with 64-bit seed to begin a new hash. + * + * @param statePtr The state struct to reset. + * @param seed The 64-bit seed to alter the hash result predictably. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return @ref XXH_OK on success. + * @return @ref XXH_ERROR on failure. + * + * @note + * - This function resets `statePtr` and generate a secret from `seed`. + * - Call this function before @ref XXH3_64bits_update(). + * - Digest will be equivalent to `XXH3_64bits_withSeed()`. + * + * @see @ref streaming_example "Streaming Example" + * + */ +XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSeed(XXH_NOESCAPE XXH3_state_t* statePtr, XXH64_hash_t seed); + +/*! + * @brief Resets an @ref XXH3_state_t with secret data to begin a new hash. + * + * @param statePtr The state struct to reset. + * @param secret The secret data. + * @param secretSize The length of @p secret, in bytes. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return @ref XXH_OK on success. + * @return @ref XXH_ERROR on failure. + * + * @note + * `secret` is referenced, it _must outlive_ the hash streaming session. + * + * Similar to one-shot API, `secretSize` must be >= @ref XXH3_SECRET_SIZE_MIN, + * and the quality of produced hash values depends on secret's entropy + * (secret's content should look like a bunch of random bytes). + * When in doubt about the randomness of a candidate `secret`, + * consider employing `XXH3_generateSecret()` instead (see below). + * + * @see @ref streaming_example "Streaming Example" + */ +XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSecret(XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* secret, size_t secretSize); + +/*! + * @brief Consumes a block of @p input to an @ref XXH3_state_t. + * + * @param statePtr The state struct to update. + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * + * @pre + * @p statePtr must not be `NULL`. + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return @ref XXH_OK on success. + * @return @ref XXH_ERROR on failure. + * + * @note Call this to incrementally consume blocks of data. + * + * @see @ref streaming_example "Streaming Example" + */ +XXH_PUBLIC_API XXH_errorcode XXH3_64bits_update (XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* input, size_t length); + +/*! + * @brief Returns the calculated XXH3 64-bit hash value from an @ref XXH3_state_t. + * + * @param statePtr The state struct to calculate the hash from. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return The calculated XXH3 64-bit hash value from that state. + * + * @note + * Calling XXH3_64bits_digest() will not affect @p statePtr, so you can update, + * digest, and update again. + * + * @see @ref streaming_example "Streaming Example" + */ +XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH3_64bits_digest (XXH_NOESCAPE const XXH3_state_t* statePtr); +#endif /* !XXH_NO_STREAM */ + +/* note : canonical representation of XXH3 is the same as XXH64 + * since they both produce XXH64_hash_t values */ + + +/*-********************************************************************** +* XXH3 128-bit variant +************************************************************************/ + +/*! + * @brief The return value from 128-bit hashes. + * + * Stored in little endian order, although the fields themselves are in native + * endianness. + */ +typedef struct { + XXH64_hash_t low64; /*!< `value & 0xFFFFFFFFFFFFFFFF` */ + XXH64_hash_t high64; /*!< `value >> 64` */ +} XXH128_hash_t; + +/*! + * @brief Calculates 128-bit unseeded variant of XXH3 of @p data. + * + * @param data The block of data to be hashed, at least @p length bytes in size. + * @param len The length of @p data, in bytes. + * + * @return The calculated 128-bit variant of XXH3 value. + * + * The 128-bit variant of XXH3 has more strength, but it has a bit of overhead + * for shorter inputs. + * + * This is equivalent to @ref XXH3_128bits_withSeed() with a seed of `0`, however + * it may have slightly better performance due to constant propagation of the + * defaults. + * + * @see XXH3_128bits_withSeed(), XXH3_128bits_withSecret(): other seeding variants + * @see @ref single_shot_example "Single Shot Example" for an example. + */ +XXH_PUBLIC_API XXH_PUREF XXH128_hash_t XXH3_128bits(XXH_NOESCAPE const void* data, size_t len); +/*! @brief Calculates 128-bit seeded variant of XXH3 hash of @p data. + * + * @param data The block of data to be hashed, at least @p length bytes in size. + * @param len The length of @p data, in bytes. + * @param seed The 64-bit seed to alter the hash result predictably. + * + * @return The calculated 128-bit variant of XXH3 value. + * + * @note + * seed == 0 produces the same results as @ref XXH3_64bits(). + * + * This variant generates a custom secret on the fly based on default secret + * altered using the @p seed value. + * + * While this operation is decently fast, note that it's not completely free. + * + * @see XXH3_128bits(), XXH3_128bits_withSecret(): other seeding variants + * @see @ref single_shot_example "Single Shot Example" for an example. + */ +XXH_PUBLIC_API XXH_PUREF XXH128_hash_t XXH3_128bits_withSeed(XXH_NOESCAPE const void* data, size_t len, XXH64_hash_t seed); +/*! + * @brief Calculates 128-bit variant of XXH3 with a custom "secret". + * + * @param data The block of data to be hashed, at least @p len bytes in size. + * @param len The length of @p data, in bytes. + * @param secret The secret data. + * @param secretSize The length of @p secret, in bytes. + * + * @return The calculated 128-bit variant of XXH3 value. + * + * It's possible to provide any blob of bytes as a "secret" to generate the hash. + * This makes it more difficult for an external actor to prepare an intentional collision. + * The main condition is that @p secretSize *must* be large enough (>= @ref XXH3_SECRET_SIZE_MIN). + * However, the quality of the secret impacts the dispersion of the hash algorithm. + * Therefore, the secret _must_ look like a bunch of random bytes. + * Avoid "trivial" or structured data such as repeated sequences or a text document. + * Whenever in doubt about the "randomness" of the blob of bytes, + * consider employing @ref XXH3_generateSecret() instead (see below). + * It will generate a proper high entropy secret derived from the blob of bytes. + * Another advantage of using XXH3_generateSecret() is that + * it guarantees that all bits within the initial blob of bytes + * will impact every bit of the output. + * This is not necessarily the case when using the blob of bytes directly + * because, when hashing _small_ inputs, only a portion of the secret is employed. + * + * @see @ref single_shot_example "Single Shot Example" for an example. + */ +XXH_PUBLIC_API XXH_PUREF XXH128_hash_t XXH3_128bits_withSecret(XXH_NOESCAPE const void* data, size_t len, XXH_NOESCAPE const void* secret, size_t secretSize); + +/******* Streaming *******/ +#ifndef XXH_NO_STREAM +/* + * Streaming requires state maintenance. + * This operation costs memory and CPU. + * As a consequence, streaming is slower than one-shot hashing. + * For better performance, prefer one-shot functions whenever applicable. + * + * XXH3_128bits uses the same XXH3_state_t as XXH3_64bits(). + * Use already declared XXH3_createState() and XXH3_freeState(). + * + * All reset and streaming functions have same meaning as their 64-bit counterpart. + */ + +/*! + * @brief Resets an @ref XXH3_state_t to begin a new hash. + * + * @param statePtr The state struct to reset. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return @ref XXH_OK on success. + * @return @ref XXH_ERROR on failure. + * + * @note + * - This function resets `statePtr` and generate a secret with default parameters. + * - Call it before @ref XXH3_128bits_update(). + * - Digest will be equivalent to `XXH3_128bits()`. + * + * @see @ref streaming_example "Streaming Example" + */ +XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset(XXH_NOESCAPE XXH3_state_t* statePtr); + +/*! + * @brief Resets an @ref XXH3_state_t with 64-bit seed to begin a new hash. + * + * @param statePtr The state struct to reset. + * @param seed The 64-bit seed to alter the hash result predictably. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return @ref XXH_OK on success. + * @return @ref XXH_ERROR on failure. + * + * @note + * - This function resets `statePtr` and generate a secret from `seed`. + * - Call it before @ref XXH3_128bits_update(). + * - Digest will be equivalent to `XXH3_128bits_withSeed()`. + * + * @see @ref streaming_example "Streaming Example" + */ +XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSeed(XXH_NOESCAPE XXH3_state_t* statePtr, XXH64_hash_t seed); +/*! + * @brief Resets an @ref XXH3_state_t with secret data to begin a new hash. + * + * @param statePtr The state struct to reset. + * @param secret The secret data. + * @param secretSize The length of @p secret, in bytes. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return @ref XXH_OK on success. + * @return @ref XXH_ERROR on failure. + * + * `secret` is referenced, it _must outlive_ the hash streaming session. + * Similar to one-shot API, `secretSize` must be >= @ref XXH3_SECRET_SIZE_MIN, + * and the quality of produced hash values depends on secret's entropy + * (secret's content should look like a bunch of random bytes). + * When in doubt about the randomness of a candidate `secret`, + * consider employing `XXH3_generateSecret()` instead (see below). + * + * @see @ref streaming_example "Streaming Example" + */ +XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSecret(XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* secret, size_t secretSize); + +/*! + * @brief Consumes a block of @p input to an @ref XXH3_state_t. + * + * Call this to incrementally consume blocks of data. + * + * @param statePtr The state struct to update. + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return @ref XXH_OK on success. + * @return @ref XXH_ERROR on failure. + * + * @note + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + */ +XXH_PUBLIC_API XXH_errorcode XXH3_128bits_update (XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* input, size_t length); + +/*! + * @brief Returns the calculated XXH3 128-bit hash value from an @ref XXH3_state_t. + * + * @param statePtr The state struct to calculate the hash from. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return The calculated XXH3 128-bit hash value from that state. + * + * @note + * Calling XXH3_128bits_digest() will not affect @p statePtr, so you can update, + * digest, and update again. + * + */ +XXH_PUBLIC_API XXH_PUREF XXH128_hash_t XXH3_128bits_digest (XXH_NOESCAPE const XXH3_state_t* statePtr); +#endif /* !XXH_NO_STREAM */ + +/* Following helper functions make it possible to compare XXH128_hast_t values. + * Since XXH128_hash_t is a structure, this capability is not offered by the language. + * Note: For better performance, these functions can be inlined using XXH_INLINE_ALL */ + +/*! + * @brief Check equality of two XXH128_hash_t values + * + * @param h1 The 128-bit hash value. + * @param h2 Another 128-bit hash value. + * + * @return `1` if `h1` and `h2` are equal. + * @return `0` if they are not. + */ +XXH_PUBLIC_API XXH_PUREF int XXH128_isEqual(XXH128_hash_t h1, XXH128_hash_t h2); + +/*! + * @brief Compares two @ref XXH128_hash_t + * + * This comparator is compatible with stdlib's `qsort()`/`bsearch()`. + * + * @param h128_1 Left-hand side value + * @param h128_2 Right-hand side value + * + * @return >0 if @p h128_1 > @p h128_2 + * @return =0 if @p h128_1 == @p h128_2 + * @return <0 if @p h128_1 < @p h128_2 + */ +XXH_PUBLIC_API XXH_PUREF int XXH128_cmp(XXH_NOESCAPE const void* h128_1, XXH_NOESCAPE const void* h128_2); + + +/******* Canonical representation *******/ +typedef struct { unsigned char digest[sizeof(XXH128_hash_t)]; } XXH128_canonical_t; + + +/*! + * @brief Converts an @ref XXH128_hash_t to a big endian @ref XXH128_canonical_t. + * + * @param dst The @ref XXH128_canonical_t pointer to be stored to. + * @param hash The @ref XXH128_hash_t to be converted. + * + * @pre + * @p dst must not be `NULL`. + * @see @ref canonical_representation_example "Canonical Representation Example" + */ +XXH_PUBLIC_API void XXH128_canonicalFromHash(XXH_NOESCAPE XXH128_canonical_t* dst, XXH128_hash_t hash); + +/*! + * @brief Converts an @ref XXH128_canonical_t to a native @ref XXH128_hash_t. + * + * @param src The @ref XXH128_canonical_t to convert. + * + * @pre + * @p src must not be `NULL`. + * + * @return The converted hash. + * @see @ref canonical_representation_example "Canonical Representation Example" + */ +XXH_PUBLIC_API XXH_PUREF XXH128_hash_t XXH128_hashFromCanonical(XXH_NOESCAPE const XXH128_canonical_t* src); + + +#endif /* !XXH_NO_XXH3 */ +#endif /* XXH_NO_LONG_LONG */ + +/*! + * @} + */ +#endif /* XXHASH_H_5627135585666179 */ + + + +#if defined(XXH_STATIC_LINKING_ONLY) && !defined(XXHASH_H_STATIC_13879238742) +#define XXHASH_H_STATIC_13879238742 +/* **************************************************************************** + * This section contains declarations which are not guaranteed to remain stable. + * They may change in future versions, becoming incompatible with a different + * version of the library. + * These declarations should only be used with static linking. + * Never use them in association with dynamic linking! + ***************************************************************************** */ + +/* + * These definitions are only present to allow static allocation + * of XXH states, on stack or in a struct, for example. + * Never **ever** access their members directly. + */ + +/*! + * @internal + * @brief Structure for XXH32 streaming API. + * + * @note This is only defined when @ref XXH_STATIC_LINKING_ONLY, + * @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined. Otherwise it is + * an opaque type. This allows fields to safely be changed. + * + * Typedef'd to @ref XXH32_state_t. + * Do not access the members of this struct directly. + * @see XXH64_state_s, XXH3_state_s + */ +struct XXH32_state_s { + XXH32_hash_t total_len_32; /*!< Total length hashed, modulo 2^32 */ + XXH32_hash_t large_len; /*!< Whether the hash is >= 16 (handles @ref total_len_32 overflow) */ + XXH32_hash_t acc[4]; /*!< Accumulator lanes */ + unsigned char buffer[16]; /*!< Internal buffer for partial reads. */ + XXH32_hash_t bufferedSize; /*!< Amount of data in @ref buffer */ + XXH32_hash_t reserved; /*!< Reserved field. Do not read nor write to it. */ +}; /* typedef'd to XXH32_state_t */ + + +#ifndef XXH_NO_LONG_LONG /* defined when there is no 64-bit support */ + +/*! + * @internal + * @brief Structure for XXH64 streaming API. + * + * @note This is only defined when @ref XXH_STATIC_LINKING_ONLY, + * @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined. Otherwise it is + * an opaque type. This allows fields to safely be changed. + * + * Typedef'd to @ref XXH64_state_t. + * Do not access the members of this struct directly. + * @see XXH32_state_s, XXH3_state_s + */ +struct XXH64_state_s { + XXH64_hash_t total_len; /*!< Total length hashed. This is always 64-bit. */ + XXH64_hash_t acc[4]; /*!< Accumulator lanes */ + unsigned char buffer[32]; /*!< Internal buffer for partial reads.. */ + XXH32_hash_t bufferedSize; /*!< Amount of data in @ref buffer */ + XXH32_hash_t reserved32; /*!< Reserved field, needed for padding anyways*/ + XXH64_hash_t reserved64; /*!< Reserved field. Do not read or write to it. */ +}; /* typedef'd to XXH64_state_t */ + +#ifndef XXH_NO_XXH3 + +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* >= C11 */ +# define XXH_ALIGN(n) _Alignas(n) +#elif defined(__cplusplus) && (__cplusplus >= 201103L) /* >= C++11 */ +/* In C++ alignas() is a keyword */ +# define XXH_ALIGN(n) alignas(n) +#elif defined(__GNUC__) +# define XXH_ALIGN(n) __attribute__ ((aligned(n))) +#elif defined(_MSC_VER) +# define XXH_ALIGN(n) __declspec(align(n)) +#else +# define XXH_ALIGN(n) /* disabled */ +#endif + +/* Old GCC versions only accept the attribute after the type in structures. */ +#if !(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) /* C11+ */ \ + && ! (defined(__cplusplus) && (__cplusplus >= 201103L)) /* >= C++11 */ \ + && defined(__GNUC__) +# define XXH_ALIGN_MEMBER(align, type) type XXH_ALIGN(align) +#else +# define XXH_ALIGN_MEMBER(align, type) XXH_ALIGN(align) type +#endif + +/*! + * @internal + * @brief The size of the internal XXH3 buffer. + * + * This is the optimal update size for incremental hashing. + * + * @see XXH3_64b_update(), XXH3_128b_update(). + */ +#define XXH3_INTERNALBUFFER_SIZE 256 + +/*! + * @def XXH3_SECRET_DEFAULT_SIZE + * @brief Default Secret's size + * + * This is the size of internal XXH3_kSecret + * and is needed by XXH3_generateSecret_fromSeed(). + * + * Not to be confused with @ref XXH3_SECRET_SIZE_MIN. + */ +#define XXH3_SECRET_DEFAULT_SIZE 192 + +/*! + * @internal + * @brief Structure for XXH3 streaming API. + * + * @note This is only defined when @ref XXH_STATIC_LINKING_ONLY, + * @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined. + * Otherwise it is an opaque type. + * Never use this definition in combination with dynamic library. + * This allows fields to safely be changed in the future. + * + * @note ** This structure has a strict alignment requirement of 64 bytes!! ** + * Do not allocate this with `malloc()` or `new`, + * it will not be sufficiently aligned. + * Use @ref XXH3_createState() and @ref XXH3_freeState(), or stack allocation. + * + * Typedef'd to @ref XXH3_state_t. + * Do never access the members of this struct directly. + * + * @see XXH3_INITSTATE() for stack initialization. + * @see XXH3_createState(), XXH3_freeState(). + * @see XXH32_state_s, XXH64_state_s + */ +struct XXH3_state_s { + XXH_ALIGN_MEMBER(64, XXH64_hash_t acc[8]); + /*!< The 8 accumulators. See @ref XXH32_state_s::acc and @ref XXH64_state_s::acc */ + XXH_ALIGN_MEMBER(64, unsigned char customSecret[XXH3_SECRET_DEFAULT_SIZE]); + /*!< Used to store a custom secret generated from a seed. */ + XXH_ALIGN_MEMBER(64, unsigned char buffer[XXH3_INTERNALBUFFER_SIZE]); + /*!< The internal buffer. @see XXH32_state_s::mem32 */ + XXH32_hash_t bufferedSize; + /*!< The amount of memory in @ref buffer, @see XXH32_state_s::memsize */ + XXH32_hash_t useSeed; + /*!< Reserved field. Needed for padding on 64-bit. */ + size_t nbStripesSoFar; + /*!< Number or stripes processed. */ + XXH64_hash_t totalLen; + /*!< Total length hashed. 64-bit even on 32-bit targets. */ + size_t nbStripesPerBlock; + /*!< Number of stripes per block. */ + size_t secretLimit; + /*!< Size of @ref customSecret or @ref extSecret */ + XXH64_hash_t seed; + /*!< Seed for _withSeed variants. Must be zero otherwise, @see XXH3_INITSTATE() */ + XXH64_hash_t reserved64; + /*!< Reserved field. */ + const unsigned char* extSecret; + /*!< Reference to an external secret for the _withSecret variants, NULL + * for other variants. */ + /* note: there may be some padding at the end due to alignment on 64 bytes */ +}; /* typedef'd to XXH3_state_t */ + +#undef XXH_ALIGN_MEMBER + +/*! + * @brief Initializes a stack-allocated `XXH3_state_s`. + * + * When the @ref XXH3_state_t structure is merely emplaced on stack, + * it should be initialized with XXH3_INITSTATE() or a memset() + * in case its first reset uses XXH3_NNbits_reset_withSeed(). + * This init can be omitted if the first reset uses default or _withSecret mode. + * This operation isn't necessary when the state is created with XXH3_createState(). + * Note that this doesn't prepare the state for a streaming operation, + * it's still necessary to use XXH3_NNbits_reset*() afterwards. + */ +#define XXH3_INITSTATE(XXH3_state_ptr) \ + do { \ + XXH3_state_t* tmp_xxh3_state_ptr = (XXH3_state_ptr); \ + tmp_xxh3_state_ptr->seed = 0; \ + tmp_xxh3_state_ptr->extSecret = NULL; \ + } while(0) + + +/*! + * @brief Calculates the 128-bit hash of @p data using XXH3. + * + * @param data The block of data to be hashed, at least @p len bytes in size. + * @param len The length of @p data, in bytes. + * @param seed The 64-bit seed to alter the hash's output predictably. + * + * @pre + * The memory between @p data and @p data + @p len must be valid, + * readable, contiguous memory. However, if @p len is `0`, @p data may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return The calculated 128-bit XXH3 value. + * + * @see @ref single_shot_example "Single Shot Example" for an example. + */ +XXH_PUBLIC_API XXH_PUREF XXH128_hash_t XXH128(XXH_NOESCAPE const void* data, size_t len, XXH64_hash_t seed); + + +/* === Experimental API === */ +/* Symbols defined below must be considered tied to a specific library version. */ + +/*! + * @brief Derive a high-entropy secret from any user-defined content, named customSeed. + * + * @param secretBuffer A writable buffer for derived high-entropy secret data. + * @param secretSize Size of secretBuffer, in bytes. Must be >= XXH3_SECRET_SIZE_MIN. + * @param customSeed A user-defined content. + * @param customSeedSize Size of customSeed, in bytes. + * + * @return @ref XXH_OK on success. + * @return @ref XXH_ERROR on failure. + * + * The generated secret can be used in combination with `*_withSecret()` functions. + * The `_withSecret()` variants are useful to provide a higher level of protection + * than 64-bit seed, as it becomes much more difficult for an external actor to + * guess how to impact the calculation logic. + * + * The function accepts as input a custom seed of any length and any content, + * and derives from it a high-entropy secret of length @p secretSize into an + * already allocated buffer @p secretBuffer. + * + * The generated secret can then be used with any `*_withSecret()` variant. + * The functions @ref XXH3_128bits_withSecret(), @ref XXH3_64bits_withSecret(), + * @ref XXH3_128bits_reset_withSecret() and @ref XXH3_64bits_reset_withSecret() + * are part of this list. They all accept a `secret` parameter + * which must be large enough for implementation reasons (>= @ref XXH3_SECRET_SIZE_MIN) + * _and_ feature very high entropy (consist of random-looking bytes). + * These conditions can be a high bar to meet, so @ref XXH3_generateSecret() can + * be employed to ensure proper quality. + * + * @p customSeed can be anything. It can have any size, even small ones, + * and its content can be anything, even "poor entropy" sources such as a bunch + * of zeroes. The resulting `secret` will nonetheless provide all required qualities. + * + * @pre + * - @p secretSize must be >= @ref XXH3_SECRET_SIZE_MIN + * - When @p customSeedSize > 0, supplying NULL as customSeed is undefined behavior. + * + * Example code: + * @code{.c} + * #include + * #include + * #include + * #define XXH_STATIC_LINKING_ONLY // expose unstable API + * #include "xxhash.h" + * // Hashes argv[2] using the entropy from argv[1]. + * int main(int argc, char* argv[]) + * { + * char secret[XXH3_SECRET_SIZE_MIN]; + * if (argv != 3) { return 1; } + * XXH3_generateSecret(secret, sizeof(secret), argv[1], strlen(argv[1])); + * XXH64_hash_t h = XXH3_64bits_withSecret( + * argv[2], strlen(argv[2]), + * secret, sizeof(secret) + * ); + * printf("%016llx\n", (unsigned long long) h); + * } + * @endcode + */ +XXH_PUBLIC_API XXH_errorcode XXH3_generateSecret(XXH_NOESCAPE void* secretBuffer, size_t secretSize, XXH_NOESCAPE const void* customSeed, size_t customSeedSize); + +/*! + * @brief Generate the same secret as the _withSeed() variants. + * + * @param secretBuffer A writable buffer of @ref XXH3_SECRET_DEFAULT_SIZE bytes + * @param seed The 64-bit seed to alter the hash result predictably. + * + * The generated secret can be used in combination with + *`*_withSecret()` and `_withSecretandSeed()` variants. + * + * Example C++ `std::string` hash class: + * @code{.cpp} + * #include + * #define XXH_STATIC_LINKING_ONLY // expose unstable API + * #include "xxhash.h" + * // Slow, seeds each time + * class HashSlow { + * XXH64_hash_t seed; + * public: + * HashSlow(XXH64_hash_t s) : seed{s} {} + * size_t operator()(const std::string& x) const { + * return size_t{XXH3_64bits_withSeed(x.c_str(), x.length(), seed)}; + * } + * }; + * // Fast, caches the seeded secret for future uses. + * class HashFast { + * unsigned char secret[XXH3_SECRET_DEFAULT_SIZE]; + * public: + * HashFast(XXH64_hash_t s) { + * XXH3_generateSecret_fromSeed(secret, seed); + * } + * size_t operator()(const std::string& x) const { + * return size_t{ + * XXH3_64bits_withSecret(x.c_str(), x.length(), secret, sizeof(secret)) + * }; + * } + * }; + * @endcode + */ +XXH_PUBLIC_API void XXH3_generateSecret_fromSeed(XXH_NOESCAPE void* secretBuffer, XXH64_hash_t seed); + +/*! + * @brief Maximum size of "short" key in bytes. + */ +#define XXH3_MIDSIZE_MAX 240 + +/*! + * @brief Calculates 64/128-bit seeded variant of XXH3 hash of @p data. + * + * @param data The block of data to be hashed, at least @p len bytes in size. + * @param len The length of @p data, in bytes. + * @param secret The secret data. + * @param secretSize The length of @p secret, in bytes. + * @param seed The 64-bit seed to alter the hash result predictably. + * + * These variants generate hash values using either: + * - @p seed for "short" keys (< @ref XXH3_MIDSIZE_MAX = 240 bytes) + * - @p secret for "large" keys (>= @ref XXH3_MIDSIZE_MAX). + * + * This generally benefits speed, compared to `_withSeed()` or `_withSecret()`. + * `_withSeed()` has to generate the secret on the fly for "large" keys. + * It's fast, but can be perceptible for "not so large" keys (< 1 KB). + * `_withSecret()` has to generate the masks on the fly for "small" keys, + * which requires more instructions than _withSeed() variants. + * Therefore, _withSecretandSeed variant combines the best of both worlds. + * + * When @p secret has been generated by XXH3_generateSecret_fromSeed(), + * this variant produces *exactly* the same results as `_withSeed()` variant, + * hence offering only a pure speed benefit on "large" input, + * by skipping the need to regenerate the secret for every large input. + * + * Another usage scenario is to hash the secret to a 64-bit hash value, + * for example with XXH3_64bits(), which then becomes the seed, + * and then employ both the seed and the secret in _withSecretandSeed(). + * On top of speed, an added benefit is that each bit in the secret + * has a 50% chance to swap each bit in the output, via its impact to the seed. + * + * This is not guaranteed when using the secret directly in "small data" scenarios, + * because only portions of the secret are employed for small data. + */ +XXH_PUBLIC_API XXH_PUREF XXH64_hash_t +XXH3_64bits_withSecretandSeed(XXH_NOESCAPE const void* data, size_t len, + XXH_NOESCAPE const void* secret, size_t secretSize, + XXH64_hash_t seed); + +/*! + * @brief Calculates 128-bit seeded variant of XXH3 hash of @p data. + * + * @param input The memory segment to be hashed, at least @p len bytes in size. + * @param length The length of @p data, in bytes. + * @param secret The secret used to alter hash result predictably. + * @param secretSize The length of @p secret, in bytes (must be >= XXH3_SECRET_SIZE_MIN) + * @param seed64 The 64-bit seed to alter the hash result predictably. + * + * @return @ref XXH_OK on success. + * @return @ref XXH_ERROR on failure. + * + * @see XXH3_64bits_withSecretandSeed(): contract is the same. + */ +XXH_PUBLIC_API XXH_PUREF XXH128_hash_t +XXH3_128bits_withSecretandSeed(XXH_NOESCAPE const void* input, size_t length, + XXH_NOESCAPE const void* secret, size_t secretSize, + XXH64_hash_t seed64); + +#ifndef XXH_NO_STREAM +/*! + * @brief Resets an @ref XXH3_state_t with secret data to begin a new hash. + * + * @param statePtr A pointer to an @ref XXH3_state_t allocated with @ref XXH3_createState(). + * @param secret The secret data. + * @param secretSize The length of @p secret, in bytes. + * @param seed64 The 64-bit seed to alter the hash result predictably. + * + * @return @ref XXH_OK on success. + * @return @ref XXH_ERROR on failure. + * + * @see XXH3_64bits_withSecretandSeed(). Contract is identical. + */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSecretandSeed(XXH_NOESCAPE XXH3_state_t* statePtr, + XXH_NOESCAPE const void* secret, size_t secretSize, + XXH64_hash_t seed64); + +/*! + * @brief Resets an @ref XXH3_state_t with secret data to begin a new hash. + * + * @param statePtr A pointer to an @ref XXH3_state_t allocated with @ref XXH3_createState(). + * @param secret The secret data. + * @param secretSize The length of @p secret, in bytes. + * @param seed64 The 64-bit seed to alter the hash result predictably. + * + * @return @ref XXH_OK on success. + * @return @ref XXH_ERROR on failure. + * + * @see XXH3_64bits_withSecretandSeed(). Contract is identical. + * + * Note: there was a bug in an earlier version of this function (<= v0.8.2) + * that would make it generate an incorrect hash value + * when @p seed == 0 and @p length < XXH3_MIDSIZE_MAX + * and @p secret is different from XXH3_generateSecret_fromSeed(). + * As stated in the contract, the correct hash result must be + * the same as XXH3_128bits_withSeed() when @p length <= XXH3_MIDSIZE_MAX. + * Results generated by this older version are wrong, hence not comparable. + */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSecretandSeed(XXH_NOESCAPE XXH3_state_t* statePtr, + XXH_NOESCAPE const void* secret, size_t secretSize, + XXH64_hash_t seed64); + +#endif /* !XXH_NO_STREAM */ + +#endif /* !XXH_NO_XXH3 */ +#endif /* XXH_NO_LONG_LONG */ +#if defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API) +# define XXH_IMPLEMENTATION +#endif + +#endif /* defined(XXH_STATIC_LINKING_ONLY) && !defined(XXHASH_H_STATIC_13879238742) */ + + +/* ======================================================================== */ +/* ======================================================================== */ +/* ======================================================================== */ + + +/*-********************************************************************** + * xxHash implementation + *-********************************************************************** + * xxHash's implementation used to be hosted inside xxhash.c. + * + * However, inlining requires implementation to be visible to the compiler, + * hence be included alongside the header. + * Previously, implementation was hosted inside xxhash.c, + * which was then #included when inlining was activated. + * This construction created issues with a few build and install systems, + * as it required xxhash.c to be stored in /include directory. + * + * xxHash implementation is now directly integrated within xxhash.h. + * As a consequence, xxhash.c is no longer needed in /include. + * + * xxhash.c is still available and is still useful. + * In a "normal" setup, when xxhash is not inlined, + * xxhash.h only exposes the prototypes and public symbols, + * while xxhash.c can be built into an object file xxhash.o + * which can then be linked into the final binary. + ************************************************************************/ + +#if ( defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API) \ + || defined(XXH_IMPLEMENTATION) ) && !defined(XXH_IMPLEM_13a8737387) +# define XXH_IMPLEM_13a8737387 + +/* ************************************* +* Tuning parameters +***************************************/ + +/*! + * @defgroup tuning Tuning parameters + * @{ + * + * Various macros to control xxHash's behavior. + */ +#ifdef XXH_DOXYGEN +/*! + * @brief Define this to disable 64-bit code. + * + * Useful if only using the @ref XXH32_family and you have a strict C90 compiler. + */ +# define XXH_NO_LONG_LONG +# undef XXH_NO_LONG_LONG /* don't actually */ +/*! + * @brief Controls how unaligned memory is accessed. + * + * By default, access to unaligned memory is controlled by `memcpy()`, which is + * safe and portable. + * + * Unfortunately, on some target/compiler combinations, the generated assembly + * is sub-optimal. + * + * The below switch allow selection of a different access method + * in the search for improved performance. + * + * @par Possible options: + * + * - `XXH_FORCE_MEMORY_ACCESS=0` (default): `memcpy` + * @par + * Use `memcpy()`. Safe and portable. Note that most modern compilers will + * eliminate the function call and treat it as an unaligned access. + * + * - `XXH_FORCE_MEMORY_ACCESS=1`: `__attribute__((aligned(1)))` + * @par + * Depends on compiler extensions and is therefore not portable. + * This method is safe _if_ your compiler supports it, + * and *generally* as fast or faster than `memcpy`. + * + * - `XXH_FORCE_MEMORY_ACCESS=2`: Direct cast + * @par + * Casts directly and dereferences. This method doesn't depend on the + * compiler, but it violates the C standard as it directly dereferences an + * unaligned pointer. It can generate buggy code on targets which do not + * support unaligned memory accesses, but in some circumstances, it's the + * only known way to get the most performance. + * + * - `XXH_FORCE_MEMORY_ACCESS=3`: Byteshift + * @par + * Also portable. This can generate the best code on old compilers which don't + * inline small `memcpy()` calls, and it might also be faster on big-endian + * systems which lack a native byteswap instruction. However, some compilers + * will emit literal byteshifts even if the target supports unaligned access. + * + * + * @warning + * Methods 1 and 2 rely on implementation-defined behavior. Use these with + * care, as what works on one compiler/platform/optimization level may cause + * another to read garbage data or even crash. + * + * See https://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html for details. + * + * Prefer these methods in priority order (0 > 3 > 1 > 2) + */ +# define XXH_FORCE_MEMORY_ACCESS 0 + +/*! + * @def XXH_SIZE_OPT + * @brief Controls how much xxHash optimizes for size. + * + * xxHash, when compiled, tends to result in a rather large binary size. This + * is mostly due to heavy usage to forced inlining and constant folding of the + * @ref XXH3_family to increase performance. + * + * However, some developers prefer size over speed. This option can + * significantly reduce the size of the generated code. When using the `-Os` + * or `-Oz` options on GCC or Clang, this is defined to 1 by default, + * otherwise it is defined to 0. + * + * Most of these size optimizations can be controlled manually. + * + * This is a number from 0-2. + * - `XXH_SIZE_OPT` == 0: Default. xxHash makes no size optimizations. Speed + * comes first. + * - `XXH_SIZE_OPT` == 1: Default for `-Os` and `-Oz`. xxHash is more + * conservative and disables hacks that increase code size. It implies the + * options @ref XXH_NO_INLINE_HINTS == 1, @ref XXH_FORCE_ALIGN_CHECK == 0, + * and @ref XXH3_NEON_LANES == 8 if they are not already defined. + * - `XXH_SIZE_OPT` == 2: xxHash tries to make itself as small as possible. + * Performance may cry. For example, the single shot functions just use the + * streaming API. + */ +# define XXH_SIZE_OPT 0 + +/*! + * @def XXH_FORCE_ALIGN_CHECK + * @brief If defined to non-zero, adds a special path for aligned inputs (XXH32() + * and XXH64() only). + * + * This is an important performance trick for architectures without decent + * unaligned memory access performance. + * + * It checks for input alignment, and when conditions are met, uses a "fast + * path" employing direct 32-bit/64-bit reads, resulting in _dramatically + * faster_ read speed. + * + * The check costs one initial branch per hash, which is generally negligible, + * but not zero. + * + * Moreover, it's not useful to generate an additional code path if memory + * access uses the same instruction for both aligned and unaligned + * addresses (e.g. x86 and aarch64). + * + * In these cases, the alignment check can be removed by setting this macro to 0. + * Then the code will always use unaligned memory access. + * Align check is automatically disabled on x86, x64, ARM64, and some ARM chips + * which are platforms known to offer good unaligned memory accesses performance. + * + * It is also disabled by default when @ref XXH_SIZE_OPT >= 1. + * + * This option does not affect XXH3 (only XXH32 and XXH64). + */ +# define XXH_FORCE_ALIGN_CHECK 0 + +/*! + * @def XXH_NO_INLINE_HINTS + * @brief When non-zero, sets all functions to `static`. + * + * By default, xxHash tries to force the compiler to inline almost all internal + * functions. + * + * This can usually improve performance due to reduced jumping and improved + * constant folding, but significantly increases the size of the binary which + * might not be favorable. + * + * Additionally, sometimes the forced inlining can be detrimental to performance, + * depending on the architecture. + * + * XXH_NO_INLINE_HINTS marks all internal functions as static, giving the + * compiler full control on whether to inline or not. + * + * When not optimizing (-O0), using `-fno-inline` with GCC or Clang, or if + * @ref XXH_SIZE_OPT >= 1, this will automatically be defined. + */ +# define XXH_NO_INLINE_HINTS 0 + +/*! + * @def XXH3_INLINE_SECRET + * @brief Determines whether to inline the XXH3 withSecret code. + * + * When the secret size is known, the compiler can improve the performance + * of XXH3_64bits_withSecret() and XXH3_128bits_withSecret(). + * + * However, if the secret size is not known, it doesn't have any benefit. This + * happens when xxHash is compiled into a global symbol. Therefore, if + * @ref XXH_INLINE_ALL is *not* defined, this will be defined to 0. + * + * Additionally, this defaults to 0 on GCC 12+, which has an issue with function pointers + * that are *sometimes* force inline on -Og, and it is impossible to automatically + * detect this optimization level. + */ +# define XXH3_INLINE_SECRET 0 + +/*! + * @def XXH32_ENDJMP + * @brief Whether to use a jump for `XXH32_finalize`. + * + * For performance, `XXH32_finalize` uses multiple branches in the finalizer. + * This is generally preferable for performance, + * but depending on exact architecture, a jmp may be preferable. + * + * This setting is only possibly making a difference for very small inputs. + */ +# define XXH32_ENDJMP 0 + +/*! + * @internal + * @brief Redefines old internal names. + * + * For compatibility with code that uses xxHash's internals before the names + * were changed to improve namespacing. There is no other reason to use this. + */ +# define XXH_OLD_NAMES +# undef XXH_OLD_NAMES /* don't actually use, it is ugly. */ + +/*! + * @def XXH_NO_STREAM + * @brief Disables the streaming API. + * + * When xxHash is not inlined and the streaming functions are not used, disabling + * the streaming functions can improve code size significantly, especially with + * the @ref XXH3_family which tends to make constant folded copies of itself. + */ +# define XXH_NO_STREAM +# undef XXH_NO_STREAM /* don't actually */ +#endif /* XXH_DOXYGEN */ +/*! + * @} + */ + +#ifndef XXH_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */ + /* prefer __packed__ structures (method 1) for GCC + * < ARMv7 with unaligned access (e.g. Raspbian armhf) still uses byte shifting, so we use memcpy + * which for some reason does unaligned loads. */ +# if defined(__GNUC__) && !(defined(__ARM_ARCH) && __ARM_ARCH < 7 && defined(__ARM_FEATURE_UNALIGNED)) +# define XXH_FORCE_MEMORY_ACCESS 1 +# endif +#endif + +#ifndef XXH_SIZE_OPT + /* default to 1 for -Os or -Oz */ +# if (defined(__GNUC__) || defined(__clang__)) && defined(__OPTIMIZE_SIZE__) +# define XXH_SIZE_OPT 1 +# else +# define XXH_SIZE_OPT 0 +# endif +#endif + +#ifndef XXH_FORCE_ALIGN_CHECK /* can be defined externally */ + /* don't check on sizeopt, x86, aarch64, or arm when unaligned access is available */ +# if XXH_SIZE_OPT >= 1 || \ + defined(__i386) || defined(__x86_64__) || defined(__aarch64__) || defined(__ARM_FEATURE_UNALIGNED) \ + || defined(_M_IX86) || defined(_M_X64) || defined(_M_ARM64) || defined(_M_ARM) /* visual */ +# define XXH_FORCE_ALIGN_CHECK 0 +# else +# define XXH_FORCE_ALIGN_CHECK 1 +# endif +#endif + +#ifndef XXH_NO_INLINE_HINTS +# if XXH_SIZE_OPT >= 1 || defined(__NO_INLINE__) /* -O0, -fno-inline */ +# define XXH_NO_INLINE_HINTS 1 +# else +# define XXH_NO_INLINE_HINTS 0 +# endif +#endif + +#ifndef XXH3_INLINE_SECRET +# if (defined(__GNUC__) && !defined(__clang__) && __GNUC__ >= 12) \ + || !defined(XXH_INLINE_ALL) +# define XXH3_INLINE_SECRET 0 +# else +# define XXH3_INLINE_SECRET 1 +# endif +#endif + +#ifndef XXH32_ENDJMP +/* generally preferable for performance */ +# define XXH32_ENDJMP 0 +#endif + +/*! + * @defgroup impl Implementation + * @{ + */ + + +/* ************************************* +* Includes & Memory related functions +***************************************/ +#if defined(XXH_NO_STREAM) +/* nothing */ +#elif defined(XXH_NO_STDLIB) + +/* When requesting to disable any mention of stdlib, + * the library loses the ability to invoked malloc / free. + * In practice, it means that functions like `XXH*_createState()` + * will always fail, and return NULL. + * This flag is useful in situations where + * xxhash.h is integrated into some kernel, embedded or limited environment + * without access to dynamic allocation. + */ + +static XXH_CONSTF void* XXH_malloc(size_t s) { (void)s; return NULL; } +static void XXH_free(void* p) { (void)p; } + +#else + +/* + * Modify the local functions below should you wish to use + * different memory routines for malloc() and free() + */ +#include + +/*! + * @internal + * @brief Modify this function to use a different routine than malloc(). + */ +static XXH_MALLOCF void* XXH_malloc(size_t s) { return malloc(s); } + +/*! + * @internal + * @brief Modify this function to use a different routine than free(). + */ +static void XXH_free(void* p) { free(p); } + +#endif /* XXH_NO_STDLIB */ + +#ifndef XXH_memcpy +/*! + * @internal + * @brief XXH_memcpy() macro can be redirected at compile time + */ +# include +# define XXH_memcpy memcpy +#endif + +#ifndef XXH_memset +/*! + * @internal + * @brief XXH_memset() macro can be redirected at compile time + */ +# include +# define XXH_memset memset +#endif + +#ifndef XXH_memcmp +/*! + * @internal + * @brief XXH_memcmp() macro can be redirected at compile time + * Note: only needed by XXH128. + */ +# include +# define XXH_memcmp memcmp +#endif + + + +#include /* ULLONG_MAX */ + + +/* ************************************* +* Compiler Specific Options +***************************************/ +#ifdef _MSC_VER /* Visual Studio warning fix */ +# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ +#endif + +#if XXH_NO_INLINE_HINTS /* disable inlining hints */ +# if defined(__GNUC__) || defined(__clang__) +# define XXH_FORCE_INLINE static __attribute__((__unused__)) +# else +# define XXH_FORCE_INLINE static +# endif +# define XXH_NO_INLINE static +/* enable inlining hints */ +#elif defined(__GNUC__) || defined(__clang__) +# define XXH_FORCE_INLINE static __inline__ __attribute__((__always_inline__, __unused__)) +# define XXH_NO_INLINE static __attribute__((__noinline__)) +#elif defined(_MSC_VER) /* Visual Studio */ +# define XXH_FORCE_INLINE static __forceinline +# define XXH_NO_INLINE static __declspec(noinline) +#elif defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) /* C99 */ +# define XXH_FORCE_INLINE static inline +# define XXH_NO_INLINE static +#else +# define XXH_FORCE_INLINE static +# define XXH_NO_INLINE static +#endif + +#if defined(XXH_INLINE_ALL) +# define XXH_STATIC XXH_FORCE_INLINE +#else +# define XXH_STATIC static +#endif + +#if XXH3_INLINE_SECRET +# define XXH3_WITH_SECRET_INLINE XXH_FORCE_INLINE +#else +# define XXH3_WITH_SECRET_INLINE XXH_NO_INLINE +#endif + +#if ((defined(sun) || defined(__sun)) && __cplusplus) /* Solaris includes __STDC_VERSION__ with C++. Tested with GCC 5.5 */ +# define XXH_RESTRICT /* disable */ +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* >= C99 */ +# define XXH_RESTRICT restrict +#elif (defined (__GNUC__) && ((__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))) \ + || (defined (__clang__)) \ + || (defined (_MSC_VER) && (_MSC_VER >= 1400)) \ + || (defined (__INTEL_COMPILER) && (__INTEL_COMPILER >= 1300)) +/* + * There are a LOT more compilers that recognize __restrict but this + * covers the major ones. + */ +# define XXH_RESTRICT __restrict +#else +# define XXH_RESTRICT /* disable */ +#endif + +/* ************************************* +* Debug +***************************************/ +/*! + * @ingroup tuning + * @def XXH_DEBUGLEVEL + * @brief Sets the debugging level. + * + * XXH_DEBUGLEVEL is expected to be defined externally, typically via the + * compiler's command line options. The value must be a number. + */ +#ifndef XXH_DEBUGLEVEL +# ifdef DEBUGLEVEL /* backwards compat */ +# define XXH_DEBUGLEVEL DEBUGLEVEL +# else +# define XXH_DEBUGLEVEL 0 +# endif +#endif + +#if (XXH_DEBUGLEVEL>=1) +# include /* note: can still be disabled with NDEBUG */ +# define XXH_ASSERT(c) assert(c) +#else +# if defined(__INTEL_COMPILER) +# define XXH_ASSERT(c) XXH_ASSUME((unsigned char) (c)) +# else +# define XXH_ASSERT(c) XXH_ASSUME(c) +# endif +#endif + +/* note: use after variable declarations */ +#ifndef XXH_STATIC_ASSERT +# if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* C11 */ +# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { _Static_assert((c),m); } while(0) +# elif defined(__cplusplus) && (__cplusplus >= 201103L) /* C++11 */ +# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { static_assert((c),m); } while(0) +# else +# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { struct xxh_sa { char x[(c) ? 1 : -1]; }; } while(0) +# endif +# define XXH_STATIC_ASSERT(c) XXH_STATIC_ASSERT_WITH_MESSAGE((c),#c) +#endif + +/*! + * @internal + * @def XXH_COMPILER_GUARD(var) + * @brief Used to prevent unwanted optimizations for @p var. + * + * It uses an empty GCC inline assembly statement with a register constraint + * which forces @p var into a general purpose register (eg eax, ebx, ecx + * on x86) and marks it as modified. + * + * This is used in a few places to avoid unwanted autovectorization (e.g. + * XXH32_round()). All vectorization we want is explicit via intrinsics, + * and _usually_ isn't wanted elsewhere. + * + * We also use it to prevent unwanted constant folding for AArch64 in + * XXH3_initCustomSecret_scalar(). + */ +#if defined(__GNUC__) || defined(__clang__) +# define XXH_COMPILER_GUARD(var) __asm__("" : "+r" (var)) +#else +# define XXH_COMPILER_GUARD(var) ((void)0) +#endif + +/* Specifically for NEON vectors which use the "w" constraint, on + * Clang. */ +#if defined(__clang__) && defined(__ARM_ARCH) && !defined(__wasm__) +# define XXH_COMPILER_GUARD_CLANG_NEON(var) __asm__("" : "+w" (var)) +#else +# define XXH_COMPILER_GUARD_CLANG_NEON(var) ((void)0) +#endif + +/* ************************************* +* Basic Types +***************************************/ +#if !defined (__VMS) \ + && (defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) +# ifdef _AIX +# include +# else +# include +# endif + typedef uint8_t xxh_u8; +#else + typedef unsigned char xxh_u8; +#endif +typedef XXH32_hash_t xxh_u32; + +#ifdef XXH_OLD_NAMES +# warning "XXH_OLD_NAMES is planned to be removed starting v0.9. If the program depends on it, consider moving away from it by employing newer type names directly" +# define BYTE xxh_u8 +# define U8 xxh_u8 +# define U32 xxh_u32 +#endif + +/* *** Memory access *** */ + +/*! + * @internal + * @fn xxh_u32 XXH_read32(const void* ptr) + * @brief Reads an unaligned 32-bit integer from @p ptr in native endianness. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * + * @param ptr The pointer to read from. + * @return The 32-bit native endian integer from the bytes at @p ptr. + */ + +/*! + * @internal + * @fn xxh_u32 XXH_readLE32(const void* ptr) + * @brief Reads an unaligned 32-bit little endian integer from @p ptr. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * + * @param ptr The pointer to read from. + * @return The 32-bit little endian integer from the bytes at @p ptr. + */ + +/*! + * @internal + * @fn xxh_u32 XXH_readBE32(const void* ptr) + * @brief Reads an unaligned 32-bit big endian integer from @p ptr. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * + * @param ptr The pointer to read from. + * @return The 32-bit big endian integer from the bytes at @p ptr. + */ + +/*! + * @internal + * @fn xxh_u32 XXH_readLE32_align(const void* ptr, XXH_alignment align) + * @brief Like @ref XXH_readLE32(), but has an option for aligned reads. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * Note that when @ref XXH_FORCE_ALIGN_CHECK == 0, the @p align parameter is + * always @ref XXH_alignment::XXH_unaligned. + * + * @param ptr The pointer to read from. + * @param align Whether @p ptr is aligned. + * @pre + * If @p align == @ref XXH_alignment::XXH_aligned, @p ptr must be 4 byte + * aligned. + * @return The 32-bit little endian integer from the bytes at @p ptr. + */ + +#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) +/* + * Manual byteshift. Best for old compilers which don't inline memcpy. + * We actually directly use XXH_readLE32 and XXH_readBE32. + */ +#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2)) + +/* + * Force direct memory access. Only works on CPU which support unaligned memory + * access in hardware. + */ +static xxh_u32 XXH_read32(const void* memPtr) { return *(const xxh_u32*) memPtr; } + +#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1)) + +/* + * __attribute__((aligned(1))) is supported by gcc and clang. Originally the + * documentation claimed that it only increased the alignment, but actually it + * can decrease it on gcc, clang, and icc: + * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69502, + * https://gcc.godbolt.org/z/xYez1j67Y. + */ +#ifdef XXH_OLD_NAMES +typedef union { xxh_u32 u32; } __attribute__((__packed__)) unalign; +#endif +static xxh_u32 XXH_read32(const void* ptr) +{ + typedef __attribute__((__aligned__(1))) xxh_u32 xxh_unalign32; + return *((const xxh_unalign32*)ptr); +} + +#else + +/* + * Portable and safe solution. Generally efficient. + * see: https://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html + */ +static xxh_u32 XXH_read32(const void* memPtr) +{ + xxh_u32 val; + XXH_memcpy(&val, memPtr, sizeof(val)); + return val; +} + +#endif /* XXH_FORCE_DIRECT_MEMORY_ACCESS */ + + +/* *** Endianness *** */ + +/*! + * @ingroup tuning + * @def XXH_CPU_LITTLE_ENDIAN + * @brief Whether the target is little endian. + * + * Defined to 1 if the target is little endian, or 0 if it is big endian. + * It can be defined externally, for example on the compiler command line. + * + * If it is not defined, + * a runtime check (which is usually constant folded) is used instead. + * + * @note + * This is not necessarily defined to an integer constant. + * + * @see XXH_isLittleEndian() for the runtime check. + */ +#ifndef XXH_CPU_LITTLE_ENDIAN +/* + * Try to detect endianness automatically, to avoid the nonstandard behavior + * in `XXH_isLittleEndian()` + */ +# if defined(_WIN32) /* Windows is always little endian */ \ + || defined(__LITTLE_ENDIAN__) \ + || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) +# define XXH_CPU_LITTLE_ENDIAN 1 +# elif defined(__BIG_ENDIAN__) \ + || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) +# define XXH_CPU_LITTLE_ENDIAN 0 +# else +/*! + * @internal + * @brief Runtime check for @ref XXH_CPU_LITTLE_ENDIAN. + * + * Most compilers will constant fold this. + */ +static int XXH_isLittleEndian(void) +{ + /* + * Portable and well-defined behavior. + * Don't use static: it is detrimental to performance. + */ + const union { xxh_u32 u; xxh_u8 c[4]; } one = { 1 }; + return one.c[0]; +} +# define XXH_CPU_LITTLE_ENDIAN XXH_isLittleEndian() +# endif +#endif + + + + +/* **************************************** +* Compiler-specific Functions and Macros +******************************************/ +#define XXH_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) + +#ifdef __has_builtin +# define XXH_HAS_BUILTIN(x) __has_builtin(x) +#else +# define XXH_HAS_BUILTIN(x) 0 +#endif + + + +/* + * C23 and future versions have standard "unreachable()". + * Once it has been implemented reliably we can add it as an + * additional case: + * + * ``` + * #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= XXH_C23_VN) + * # include + * # ifdef unreachable + * # define XXH_UNREACHABLE() unreachable() + * # endif + * #endif + * ``` + * + * Note C++23 also has std::unreachable() which can be detected + * as follows: + * ``` + * #if defined(__cpp_lib_unreachable) && (__cpp_lib_unreachable >= 202202L) + * # include + * # define XXH_UNREACHABLE() std::unreachable() + * #endif + * ``` + * NB: `__cpp_lib_unreachable` is defined in the `` header. + * We don't use that as including `` in `extern "C"` blocks + * doesn't work on GCC12 + */ + +#if XXH_HAS_BUILTIN(__builtin_unreachable) +# define XXH_UNREACHABLE() __builtin_unreachable() + +#elif defined(_MSC_VER) +# define XXH_UNREACHABLE() __assume(0) + +#else +# define XXH_UNREACHABLE() +#endif + +#if XXH_HAS_BUILTIN(__builtin_assume) +# define XXH_ASSUME(c) __builtin_assume(c) +#else +# define XXH_ASSUME(c) if (!(c)) { XXH_UNREACHABLE(); } +#endif + +/*! + * @internal + * @def XXH_rotl32(x,r) + * @brief 32-bit rotate left. + * + * @param x The 32-bit integer to be rotated. + * @param r The number of bits to rotate. + * @pre + * @p r > 0 && @p r < 32 + * @note + * @p x and @p r may be evaluated multiple times. + * @return The rotated result. + */ +#if !defined(NO_CLANG_BUILTIN) && XXH_HAS_BUILTIN(__builtin_rotateleft32) \ + && XXH_HAS_BUILTIN(__builtin_rotateleft64) +# define XXH_rotl32 __builtin_rotateleft32 +# define XXH_rotl64 __builtin_rotateleft64 +#elif XXH_HAS_BUILTIN(__builtin_stdc_rotate_left) +# define XXH_rotl32 __builtin_stdc_rotate_left +# define XXH_rotl64 __builtin_stdc_rotate_left +/* Note: although _rotl exists for minGW (GCC under windows), performance seems poor */ +#elif defined(_MSC_VER) +# define XXH_rotl32(x,r) _rotl(x,r) +# define XXH_rotl64(x,r) _rotl64(x,r) +#else +# define XXH_rotl32(x,r) (((x) << (r)) | ((x) >> (32 - (r)))) +# define XXH_rotl64(x,r) (((x) << (r)) | ((x) >> (64 - (r)))) +#endif + +/*! + * @internal + * @fn xxh_u32 XXH_swap32(xxh_u32 x) + * @brief A 32-bit byteswap. + * + * @param x The 32-bit integer to byteswap. + * @return @p x, byteswapped. + */ +#if defined(_MSC_VER) /* Visual Studio */ +# define XXH_swap32 _byteswap_ulong +#elif XXH_GCC_VERSION >= 403 +# define XXH_swap32 __builtin_bswap32 +#else +static xxh_u32 XXH_swap32 (xxh_u32 x) +{ + return ((x << 24) & 0xff000000 ) | + ((x << 8) & 0x00ff0000 ) | + ((x >> 8) & 0x0000ff00 ) | + ((x >> 24) & 0x000000ff ); +} +#endif + + +/* *************************** +* Memory reads +*****************************/ + +/*! + * @internal + * @brief Enum to indicate whether a pointer is aligned. + */ +typedef enum { + XXH_aligned, /*!< Aligned */ + XXH_unaligned /*!< Possibly unaligned */ +} XXH_alignment; + +/* + * XXH_FORCE_MEMORY_ACCESS==3 is an endian-independent byteshift load. + * + * This is ideal for older compilers which don't inline memcpy. + */ +#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) + +XXH_FORCE_INLINE xxh_u32 XXH_readLE32(const void* memPtr) +{ + const xxh_u8* bytePtr = (const xxh_u8 *)memPtr; + return bytePtr[0] + | ((xxh_u32)bytePtr[1] << 8) + | ((xxh_u32)bytePtr[2] << 16) + | ((xxh_u32)bytePtr[3] << 24); +} + +XXH_FORCE_INLINE xxh_u32 XXH_readBE32(const void* memPtr) +{ + const xxh_u8* bytePtr = (const xxh_u8 *)memPtr; + return bytePtr[3] + | ((xxh_u32)bytePtr[2] << 8) + | ((xxh_u32)bytePtr[1] << 16) + | ((xxh_u32)bytePtr[0] << 24); +} + +#else +XXH_FORCE_INLINE xxh_u32 XXH_readLE32(const void* ptr) +{ + return XXH_CPU_LITTLE_ENDIAN ? XXH_read32(ptr) : XXH_swap32(XXH_read32(ptr)); +} + +static xxh_u32 XXH_readBE32(const void* ptr) +{ + return XXH_CPU_LITTLE_ENDIAN ? XXH_swap32(XXH_read32(ptr)) : XXH_read32(ptr); +} +#endif + +XXH_FORCE_INLINE xxh_u32 +XXH_readLE32_align(const void* ptr, XXH_alignment align) +{ + if (align==XXH_unaligned) { + return XXH_readLE32(ptr); + } else { + return XXH_CPU_LITTLE_ENDIAN ? *(const xxh_u32*)ptr : XXH_swap32(*(const xxh_u32*)ptr); + } +} + + +/* ************************************* +* Misc +***************************************/ +/*! @ingroup public */ +XXH_PUBLIC_API unsigned XXH_versionNumber (void) { return XXH_VERSION_NUMBER; } + + +/* ******************************************************************* +* 32-bit hash functions +*********************************************************************/ +/*! + * @} + * @defgroup XXH32_impl XXH32 implementation + * @ingroup impl + * + * Details on the XXH32 implementation. + * @{ + */ + /* #define instead of static const, to be used as initializers */ +#define XXH_PRIME32_1 0x9E3779B1U /*!< 0b10011110001101110111100110110001 */ +#define XXH_PRIME32_2 0x85EBCA77U /*!< 0b10000101111010111100101001110111 */ +#define XXH_PRIME32_3 0xC2B2AE3DU /*!< 0b11000010101100101010111000111101 */ +#define XXH_PRIME32_4 0x27D4EB2FU /*!< 0b00100111110101001110101100101111 */ +#define XXH_PRIME32_5 0x165667B1U /*!< 0b00010110010101100110011110110001 */ + +#ifdef XXH_OLD_NAMES +# define PRIME32_1 XXH_PRIME32_1 +# define PRIME32_2 XXH_PRIME32_2 +# define PRIME32_3 XXH_PRIME32_3 +# define PRIME32_4 XXH_PRIME32_4 +# define PRIME32_5 XXH_PRIME32_5 +#endif + +/*! + * @internal + * @brief Normal stripe processing routine. + * + * This shuffles the bits so that any bit from @p input impacts several bits in + * @p acc. + * + * @param acc The accumulator lane. + * @param input The stripe of input to mix. + * @return The mixed accumulator lane. + */ +static xxh_u32 XXH32_round(xxh_u32 acc, xxh_u32 input) +{ + acc += input * XXH_PRIME32_2; + acc = XXH_rotl32(acc, 13); + acc *= XXH_PRIME32_1; +#if (defined(__SSE4_1__) || defined(__aarch64__) || defined(__wasm_simd128__)) && !defined(XXH_ENABLE_AUTOVECTORIZE) + /* + * UGLY HACK: + * A compiler fence is used to prevent GCC and Clang from + * autovectorizing the XXH32 loop (pragmas and attributes don't work for some + * reason) without globally disabling SSE4.1. + * + * The reason we want to avoid vectorization is because despite working on + * 4 integers at a time, there are multiple factors slowing XXH32 down on + * SSE4: + * - There's a ridiculous amount of lag from pmulld (10 cycles of latency on + * newer chips!) making it slightly slower to multiply four integers at + * once compared to four integers independently. Even when pmulld was + * fastest, Sandy/Ivy Bridge, it is still not worth it to go into SSE + * just to multiply unless doing a long operation. + * + * - Four instructions are required to rotate, + * movqda tmp, v // not required with VEX encoding + * pslld tmp, 13 // tmp <<= 13 + * psrld v, 19 // x >>= 19 + * por v, tmp // x |= tmp + * compared to one for scalar: + * roll v, 13 // reliably fast across the board + * shldl v, v, 13 // Sandy Bridge and later prefer this for some reason + * + * - Instruction level parallelism is actually more beneficial here because + * the SIMD actually serializes this operation: While v1 is rotating, v2 + * can load data, while v3 can multiply. SSE forces them to operate + * together. + * + * This is also enabled on AArch64, as Clang is *very aggressive* in vectorizing + * the loop. NEON is only faster on the A53, and with the newer cores, it is less + * than half the speed. + * + * Additionally, this is used on WASM SIMD128 because it JITs to the same + * SIMD instructions and has the same issue. + */ + XXH_COMPILER_GUARD(acc); +#endif + return acc; +} + +/*! + * @internal + * @brief Mixes all bits to finalize the hash. + * + * The final mix ensures that all input bits have a chance to impact any bit in + * the output digest, resulting in an unbiased distribution. + * + * @param hash The hash to avalanche. + * @return The avalanched hash. + */ +static xxh_u32 XXH32_avalanche(xxh_u32 hash) +{ + hash ^= hash >> 15; + hash *= XXH_PRIME32_2; + hash ^= hash >> 13; + hash *= XXH_PRIME32_3; + hash ^= hash >> 16; + return hash; +} + +#define XXH_get32bits(p) XXH_readLE32_align(p, align) + +/*! + * @internal + * @brief Sets up the initial accumulator state for XXH32(). + */ +XXH_FORCE_INLINE void +XXH32_initAccs(xxh_u32 *acc, xxh_u32 seed) +{ + XXH_ASSERT(acc != NULL); + acc[0] = seed + XXH_PRIME32_1 + XXH_PRIME32_2; + acc[1] = seed + XXH_PRIME32_2; + acc[2] = seed + 0; + acc[3] = seed - XXH_PRIME32_1; +} + +/*! + * @internal + * @brief Consumes a block of data for XXH32(). + * + * @return the end input pointer. + */ +XXH_FORCE_INLINE const xxh_u8 * +XXH32_consumeLong( + xxh_u32 *XXH_RESTRICT acc, + xxh_u8 const *XXH_RESTRICT input, + size_t len, + XXH_alignment align +) +{ + const xxh_u8* const bEnd = input + len; + const xxh_u8* const limit = bEnd - 15; + XXH_ASSERT(acc != NULL); + XXH_ASSERT(input != NULL); + XXH_ASSERT(len >= 16); + do { + acc[0] = XXH32_round(acc[0], XXH_get32bits(input)); input += 4; + acc[1] = XXH32_round(acc[1], XXH_get32bits(input)); input += 4; + acc[2] = XXH32_round(acc[2], XXH_get32bits(input)); input += 4; + acc[3] = XXH32_round(acc[3], XXH_get32bits(input)); input += 4; + } while (input < limit); + + return input; +} + +/*! + * @internal + * @brief Merges the accumulator lanes together for XXH32() + */ +XXH_FORCE_INLINE XXH_PUREF xxh_u32 +XXH32_mergeAccs(const xxh_u32 *acc) +{ + XXH_ASSERT(acc != NULL); + return XXH_rotl32(acc[0], 1) + XXH_rotl32(acc[1], 7) + + XXH_rotl32(acc[2], 12) + XXH_rotl32(acc[3], 18); +} + +/*! + * @internal + * @brief Processes the last 0-15 bytes of @p ptr. + * + * There may be up to 15 bytes remaining to consume from the input. + * This final stage will digest them to ensure that all input bytes are present + * in the final mix. + * + * @param hash The hash to finalize. + * @param ptr The pointer to the remaining input. + * @param len The remaining length, modulo 16. + * @param align Whether @p ptr is aligned. + * @return The finalized hash. + * @see XXH64_finalize(). + */ +static XXH_PUREF xxh_u32 +XXH32_finalize(xxh_u32 hash, const xxh_u8* ptr, size_t len, XXH_alignment align) +{ +#define XXH_PROCESS1 do { \ + hash += (*ptr++) * XXH_PRIME32_5; \ + hash = XXH_rotl32(hash, 11) * XXH_PRIME32_1; \ +} while (0) + +#define XXH_PROCESS4 do { \ + hash += XXH_get32bits(ptr) * XXH_PRIME32_3; \ + ptr += 4; \ + hash = XXH_rotl32(hash, 17) * XXH_PRIME32_4; \ +} while (0) + + if (ptr==NULL) XXH_ASSERT(len == 0); + + /* Compact rerolled version; generally faster */ + if (!XXH32_ENDJMP) { + len &= 15; + while (len >= 4) { + XXH_PROCESS4; + len -= 4; + } + while (len > 0) { + XXH_PROCESS1; + --len; + } + return XXH32_avalanche(hash); + } else { + switch(len&15) /* or switch(bEnd - p) */ { + case 12: XXH_PROCESS4; + XXH_FALLTHROUGH; /* fallthrough */ + case 8: XXH_PROCESS4; + XXH_FALLTHROUGH; /* fallthrough */ + case 4: XXH_PROCESS4; + return XXH32_avalanche(hash); + + case 13: XXH_PROCESS4; + XXH_FALLTHROUGH; /* fallthrough */ + case 9: XXH_PROCESS4; + XXH_FALLTHROUGH; /* fallthrough */ + case 5: XXH_PROCESS4; + XXH_PROCESS1; + return XXH32_avalanche(hash); + + case 14: XXH_PROCESS4; + XXH_FALLTHROUGH; /* fallthrough */ + case 10: XXH_PROCESS4; + XXH_FALLTHROUGH; /* fallthrough */ + case 6: XXH_PROCESS4; + XXH_PROCESS1; + XXH_PROCESS1; + return XXH32_avalanche(hash); + + case 15: XXH_PROCESS4; + XXH_FALLTHROUGH; /* fallthrough */ + case 11: XXH_PROCESS4; + XXH_FALLTHROUGH; /* fallthrough */ + case 7: XXH_PROCESS4; + XXH_FALLTHROUGH; /* fallthrough */ + case 3: XXH_PROCESS1; + XXH_FALLTHROUGH; /* fallthrough */ + case 2: XXH_PROCESS1; + XXH_FALLTHROUGH; /* fallthrough */ + case 1: XXH_PROCESS1; + XXH_FALLTHROUGH; /* fallthrough */ + case 0: return XXH32_avalanche(hash); + } + XXH_ASSERT(0); + return hash; /* reaching this point is deemed impossible */ + } +} + +#ifdef XXH_OLD_NAMES +# define PROCESS1 XXH_PROCESS1 +# define PROCESS4 XXH_PROCESS4 +#else +# undef XXH_PROCESS1 +# undef XXH_PROCESS4 +#endif + +/*! + * @internal + * @brief The implementation for @ref XXH32(). + * + * @param input , len , seed Directly passed from @ref XXH32(). + * @param align Whether @p input is aligned. + * @return The calculated hash. + */ +XXH_FORCE_INLINE XXH_PUREF xxh_u32 +XXH32_endian_align(const xxh_u8* input, size_t len, xxh_u32 seed, XXH_alignment align) +{ + xxh_u32 h32; + + if (input==NULL) XXH_ASSERT(len == 0); + + if (len>=16) { + xxh_u32 acc[4]; + XXH32_initAccs(acc, seed); + + input = XXH32_consumeLong(acc, input, len, align); + + h32 = XXH32_mergeAccs(acc); + } else { + h32 = seed + XXH_PRIME32_5; + } + + h32 += (xxh_u32)len; + + return XXH32_finalize(h32, input, len&15, align); +} + +/*! @ingroup XXH32_family */ +XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t len, XXH32_hash_t seed) +{ +#if !defined(XXH_NO_STREAM) && XXH_SIZE_OPT >= 2 + /* Simple version, good for code maintenance, but unfortunately slow for small inputs */ + XXH32_state_t state; + XXH32_reset(&state, seed); + XXH32_update(&state, (const xxh_u8*)input, len); + return XXH32_digest(&state); +#else + if (XXH_FORCE_ALIGN_CHECK) { + if ((((size_t)input) & 3) == 0) { /* Input is 4-bytes aligned, leverage the speed benefit */ + return XXH32_endian_align((const xxh_u8*)input, len, seed, XXH_aligned); + } } + + return XXH32_endian_align((const xxh_u8*)input, len, seed, XXH_unaligned); +#endif +} + + + +/******* Hash streaming *******/ +#ifndef XXH_NO_STREAM +/*! @ingroup XXH32_family */ +XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void) +{ + return (XXH32_state_t*)XXH_malloc(sizeof(XXH32_state_t)); +} +/*! @ingroup XXH32_family */ +XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr) +{ + XXH_free(statePtr); + return XXH_OK; +} + +/*! @ingroup XXH32_family */ +XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dstState, const XXH32_state_t* srcState) +{ + XXH_memcpy(dstState, srcState, sizeof(*dstState)); +} + +/*! @ingroup XXH32_family */ +XXH_PUBLIC_API XXH_errorcode XXH32_reset(XXH32_state_t* statePtr, XXH32_hash_t seed) +{ + XXH_ASSERT(statePtr != NULL); + XXH_memset(statePtr, 0, sizeof(*statePtr)); + XXH32_initAccs(statePtr->acc, seed); + return XXH_OK; +} + + +/*! @ingroup XXH32_family */ +XXH_PUBLIC_API XXH_errorcode +XXH32_update(XXH32_state_t* state, const void* input, size_t len) +{ + if (input==NULL) { + XXH_ASSERT(len == 0); + return XXH_OK; + } + + state->total_len_32 += (XXH32_hash_t)len; + state->large_len |= (XXH32_hash_t)((len>=16) | (state->total_len_32>=16)); + + XXH_ASSERT(state->bufferedSize < sizeof(state->buffer)); + if (len < sizeof(state->buffer) - state->bufferedSize) { /* fill in tmp buffer */ + XXH_memcpy(state->buffer + state->bufferedSize, input, len); + state->bufferedSize += (XXH32_hash_t)len; + return XXH_OK; + } + + { const xxh_u8* xinput = (const xxh_u8*)input; + const xxh_u8* const bEnd = xinput + len; + + if (state->bufferedSize) { /* non-empty buffer: complete first */ + XXH_memcpy(state->buffer + state->bufferedSize, xinput, sizeof(state->buffer) - state->bufferedSize); + xinput += sizeof(state->buffer) - state->bufferedSize; + /* then process one round */ + (void)XXH32_consumeLong(state->acc, state->buffer, sizeof(state->buffer), XXH_aligned); + state->bufferedSize = 0; + } + + XXH_ASSERT(xinput <= bEnd); + if ((size_t)(bEnd - xinput) >= sizeof(state->buffer)) { + /* Process the remaining data */ + xinput = XXH32_consumeLong(state->acc, xinput, (size_t)(bEnd - xinput), XXH_unaligned); + } + + if (xinput < bEnd) { + /* Copy the leftover to the tmp buffer */ + XXH_memcpy(state->buffer, xinput, (size_t)(bEnd-xinput)); + state->bufferedSize = (unsigned)(bEnd-xinput); + } + } + + return XXH_OK; +} + + +/*! @ingroup XXH32_family */ +XXH_PUBLIC_API XXH32_hash_t XXH32_digest(const XXH32_state_t* state) +{ + xxh_u32 h32; + + if (state->large_len) { + h32 = XXH32_mergeAccs(state->acc); + } else { + h32 = state->acc[2] /* == seed */ + XXH_PRIME32_5; + } + + h32 += state->total_len_32; + + return XXH32_finalize(h32, state->buffer, state->bufferedSize, XXH_aligned); +} +#endif /* !XXH_NO_STREAM */ + +/******* Canonical representation *******/ + +/*! @ingroup XXH32_family */ +XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash) +{ + XXH_STATIC_ASSERT(sizeof(XXH32_canonical_t) == sizeof(XXH32_hash_t)); + if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap32(hash); + XXH_memcpy(dst, &hash, sizeof(*dst)); +} +/*! @ingroup XXH32_family */ +XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src) +{ + return XXH_readBE32(src); +} + + +#ifndef XXH_NO_LONG_LONG + +/* ******************************************************************* +* 64-bit hash functions +*********************************************************************/ +/*! + * @} + * @ingroup impl + * @{ + */ +/******* Memory access *******/ + +typedef XXH64_hash_t xxh_u64; + +#ifdef XXH_OLD_NAMES +# define U64 xxh_u64 +#endif + +#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) +/* + * Manual byteshift. Best for old compilers which don't inline memcpy. + * We actually directly use XXH_readLE64 and XXH_readBE64. + */ +#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2)) + +/* Force direct memory access. Only works on CPU which support unaligned memory access in hardware */ +static xxh_u64 XXH_read64(const void* memPtr) +{ + return *(const xxh_u64*) memPtr; +} + +#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1)) + +/* + * __attribute__((aligned(1))) is supported by gcc and clang. Originally the + * documentation claimed that it only increased the alignment, but actually it + * can decrease it on gcc, clang, and icc: + * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69502, + * https://gcc.godbolt.org/z/xYez1j67Y. + */ +#ifdef XXH_OLD_NAMES +typedef union { xxh_u32 u32; xxh_u64 u64; } __attribute__((__packed__)) unalign64; +#endif +static xxh_u64 XXH_read64(const void* ptr) +{ + typedef __attribute__((__aligned__(1))) xxh_u64 xxh_unalign64; + return *((const xxh_unalign64*)ptr); +} + +#else + +/* + * Portable and safe solution. Generally efficient. + * see: https://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html + */ +static xxh_u64 XXH_read64(const void* memPtr) +{ + xxh_u64 val; + XXH_memcpy(&val, memPtr, sizeof(val)); + return val; +} + +#endif /* XXH_FORCE_DIRECT_MEMORY_ACCESS */ + +#if defined(_MSC_VER) /* Visual Studio */ +# define XXH_swap64 _byteswap_uint64 +#elif XXH_GCC_VERSION >= 403 +# define XXH_swap64 __builtin_bswap64 +#else +static xxh_u64 XXH_swap64(xxh_u64 x) +{ + return ((x << 56) & 0xff00000000000000ULL) | + ((x << 40) & 0x00ff000000000000ULL) | + ((x << 24) & 0x0000ff0000000000ULL) | + ((x << 8) & 0x000000ff00000000ULL) | + ((x >> 8) & 0x00000000ff000000ULL) | + ((x >> 24) & 0x0000000000ff0000ULL) | + ((x >> 40) & 0x000000000000ff00ULL) | + ((x >> 56) & 0x00000000000000ffULL); +} +#endif + + +/* XXH_FORCE_MEMORY_ACCESS==3 is an endian-independent byteshift load. */ +#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) + +XXH_FORCE_INLINE xxh_u64 XXH_readLE64(const void* memPtr) +{ + const xxh_u8* bytePtr = (const xxh_u8 *)memPtr; + return bytePtr[0] + | ((xxh_u64)bytePtr[1] << 8) + | ((xxh_u64)bytePtr[2] << 16) + | ((xxh_u64)bytePtr[3] << 24) + | ((xxh_u64)bytePtr[4] << 32) + | ((xxh_u64)bytePtr[5] << 40) + | ((xxh_u64)bytePtr[6] << 48) + | ((xxh_u64)bytePtr[7] << 56); +} + +XXH_FORCE_INLINE xxh_u64 XXH_readBE64(const void* memPtr) +{ + const xxh_u8* bytePtr = (const xxh_u8 *)memPtr; + return bytePtr[7] + | ((xxh_u64)bytePtr[6] << 8) + | ((xxh_u64)bytePtr[5] << 16) + | ((xxh_u64)bytePtr[4] << 24) + | ((xxh_u64)bytePtr[3] << 32) + | ((xxh_u64)bytePtr[2] << 40) + | ((xxh_u64)bytePtr[1] << 48) + | ((xxh_u64)bytePtr[0] << 56); +} + +#else +XXH_FORCE_INLINE xxh_u64 XXH_readLE64(const void* ptr) +{ + return XXH_CPU_LITTLE_ENDIAN ? XXH_read64(ptr) : XXH_swap64(XXH_read64(ptr)); +} + +static xxh_u64 XXH_readBE64(const void* ptr) +{ + return XXH_CPU_LITTLE_ENDIAN ? XXH_swap64(XXH_read64(ptr)) : XXH_read64(ptr); +} +#endif + +XXH_FORCE_INLINE xxh_u64 +XXH_readLE64_align(const void* ptr, XXH_alignment align) +{ + if (align==XXH_unaligned) + return XXH_readLE64(ptr); + else + return XXH_CPU_LITTLE_ENDIAN ? *(const xxh_u64*)ptr : XXH_swap64(*(const xxh_u64*)ptr); +} + + +/******* xxh64 *******/ +/*! + * @} + * @defgroup XXH64_impl XXH64 implementation + * @ingroup impl + * + * Details on the XXH64 implementation. + * @{ + */ +/* #define rather that static const, to be used as initializers */ +#define XXH_PRIME64_1 0x9E3779B185EBCA87ULL /*!< 0b1001111000110111011110011011000110000101111010111100101010000111 */ +#define XXH_PRIME64_2 0xC2B2AE3D27D4EB4FULL /*!< 0b1100001010110010101011100011110100100111110101001110101101001111 */ +#define XXH_PRIME64_3 0x165667B19E3779F9ULL /*!< 0b0001011001010110011001111011000110011110001101110111100111111001 */ +#define XXH_PRIME64_4 0x85EBCA77C2B2AE63ULL /*!< 0b1000010111101011110010100111011111000010101100101010111001100011 */ +#define XXH_PRIME64_5 0x27D4EB2F165667C5ULL /*!< 0b0010011111010100111010110010111100010110010101100110011111000101 */ + +#ifdef XXH_OLD_NAMES +# define PRIME64_1 XXH_PRIME64_1 +# define PRIME64_2 XXH_PRIME64_2 +# define PRIME64_3 XXH_PRIME64_3 +# define PRIME64_4 XXH_PRIME64_4 +# define PRIME64_5 XXH_PRIME64_5 +#endif + +/*! @copydoc XXH32_round */ +static xxh_u64 XXH64_round(xxh_u64 acc, xxh_u64 input) +{ + acc += input * XXH_PRIME64_2; + acc = XXH_rotl64(acc, 31); + acc *= XXH_PRIME64_1; +#if (defined(__AVX512F__)) && !defined(XXH_ENABLE_AUTOVECTORIZE) + /* + * DISABLE AUTOVECTORIZATION: + * A compiler fence is used to prevent GCC and Clang from + * autovectorizing the XXH64 loop (pragmas and attributes don't work for some + * reason) without globally disabling AVX512. + * + * Autovectorization of XXH64 tends to be detrimental, + * though the exact outcome may change depending on exact cpu and compiler version. + * For information, it has been reported as detrimental for Skylake-X, + * but possibly beneficial for Zen4. + * + * The default is to disable auto-vectorization, + * but you can select to enable it instead using `XXH_ENABLE_AUTOVECTORIZE` build variable. + */ + XXH_COMPILER_GUARD(acc); +#endif + return acc; +} + +static xxh_u64 XXH64_mergeRound(xxh_u64 acc, xxh_u64 val) +{ + val = XXH64_round(0, val); + acc ^= val; + acc = acc * XXH_PRIME64_1 + XXH_PRIME64_4; + return acc; +} + +/*! @copydoc XXH32_avalanche */ +static xxh_u64 XXH64_avalanche(xxh_u64 hash) +{ + hash ^= hash >> 33; + hash *= XXH_PRIME64_2; + hash ^= hash >> 29; + hash *= XXH_PRIME64_3; + hash ^= hash >> 32; + return hash; +} + + +#define XXH_get64bits(p) XXH_readLE64_align(p, align) + +/*! + * @internal + * @brief Sets up the initial accumulator state for XXH64(). + */ +XXH_FORCE_INLINE void +XXH64_initAccs(xxh_u64 *acc, xxh_u64 seed) +{ + XXH_ASSERT(acc != NULL); + acc[0] = seed + XXH_PRIME64_1 + XXH_PRIME64_2; + acc[1] = seed + XXH_PRIME64_2; + acc[2] = seed + 0; + acc[3] = seed - XXH_PRIME64_1; +} + +/*! + * @internal + * @brief Consumes a block of data for XXH64(). + * + * @return the end input pointer. + */ +XXH_FORCE_INLINE const xxh_u8 * +XXH64_consumeLong( + xxh_u64 *XXH_RESTRICT acc, + xxh_u8 const *XXH_RESTRICT input, + size_t len, + XXH_alignment align +) +{ + const xxh_u8* const bEnd = input + len; + const xxh_u8* const limit = bEnd - 31; + XXH_ASSERT(acc != NULL); + XXH_ASSERT(input != NULL); + XXH_ASSERT(len >= 32); + do { + /* reroll on 32-bit */ + if (sizeof(void *) < sizeof(xxh_u64)) { + size_t i; + for (i = 0; i < 4; i++) { + acc[i] = XXH64_round(acc[i], XXH_get64bits(input)); + input += 8; + } + } else { + acc[0] = XXH64_round(acc[0], XXH_get64bits(input)); input += 8; + acc[1] = XXH64_round(acc[1], XXH_get64bits(input)); input += 8; + acc[2] = XXH64_round(acc[2], XXH_get64bits(input)); input += 8; + acc[3] = XXH64_round(acc[3], XXH_get64bits(input)); input += 8; + } + } while (input < limit); + + return input; +} + +/*! + * @internal + * @brief Merges the accumulator lanes together for XXH64() + */ +XXH_FORCE_INLINE XXH_PUREF xxh_u64 +XXH64_mergeAccs(const xxh_u64 *acc) +{ + XXH_ASSERT(acc != NULL); + { + xxh_u64 h64 = XXH_rotl64(acc[0], 1) + XXH_rotl64(acc[1], 7) + + XXH_rotl64(acc[2], 12) + XXH_rotl64(acc[3], 18); + /* reroll on 32-bit */ + if (sizeof(void *) < sizeof(xxh_u64)) { + size_t i; + for (i = 0; i < 4; i++) { + h64 = XXH64_mergeRound(h64, acc[i]); + } + } else { + h64 = XXH64_mergeRound(h64, acc[0]); + h64 = XXH64_mergeRound(h64, acc[1]); + h64 = XXH64_mergeRound(h64, acc[2]); + h64 = XXH64_mergeRound(h64, acc[3]); + } + return h64; + } +} + +/*! + * @internal + * @brief Processes the last 0-31 bytes of @p ptr. + * + * There may be up to 31 bytes remaining to consume from the input. + * This final stage will digest them to ensure that all input bytes are present + * in the final mix. + * + * @param hash The hash to finalize. + * @param ptr The pointer to the remaining input. + * @param len The remaining length, modulo 32. + * @param align Whether @p ptr is aligned. + * @return The finalized hash + * @see XXH32_finalize(). + */ +XXH_STATIC XXH_PUREF xxh_u64 +XXH64_finalize(xxh_u64 hash, const xxh_u8* ptr, size_t len, XXH_alignment align) +{ + if (ptr==NULL) XXH_ASSERT(len == 0); + len &= 31; + while (len >= 8) { + xxh_u64 const k1 = XXH64_round(0, XXH_get64bits(ptr)); + ptr += 8; + hash ^= k1; + hash = XXH_rotl64(hash,27) * XXH_PRIME64_1 + XXH_PRIME64_4; + len -= 8; + } + if (len >= 4) { + hash ^= (xxh_u64)(XXH_get32bits(ptr)) * XXH_PRIME64_1; + ptr += 4; + hash = XXH_rotl64(hash, 23) * XXH_PRIME64_2 + XXH_PRIME64_3; + len -= 4; + } + while (len > 0) { + hash ^= (*ptr++) * XXH_PRIME64_5; + hash = XXH_rotl64(hash, 11) * XXH_PRIME64_1; + --len; + } + return XXH64_avalanche(hash); +} + +#ifdef XXH_OLD_NAMES +# define PROCESS1_64 XXH_PROCESS1_64 +# define PROCESS4_64 XXH_PROCESS4_64 +# define PROCESS8_64 XXH_PROCESS8_64 +#else +# undef XXH_PROCESS1_64 +# undef XXH_PROCESS4_64 +# undef XXH_PROCESS8_64 +#endif + +/*! + * @internal + * @brief The implementation for @ref XXH64(). + * + * @param input , len , seed Directly passed from @ref XXH64(). + * @param align Whether @p input is aligned. + * @return The calculated hash. + */ +XXH_FORCE_INLINE XXH_PUREF xxh_u64 +XXH64_endian_align(const xxh_u8* input, size_t len, xxh_u64 seed, XXH_alignment align) +{ + xxh_u64 h64; + if (input==NULL) XXH_ASSERT(len == 0); + + if (len>=32) { /* Process a large block of data */ + xxh_u64 acc[4]; + XXH64_initAccs(acc, seed); + + input = XXH64_consumeLong(acc, input, len, align); + + h64 = XXH64_mergeAccs(acc); + } else { + h64 = seed + XXH_PRIME64_5; + } + + h64 += (xxh_u64) len; + + return XXH64_finalize(h64, input, len, align); +} + + +/*! @ingroup XXH64_family */ +XXH_PUBLIC_API XXH64_hash_t XXH64 (XXH_NOESCAPE const void* input, size_t len, XXH64_hash_t seed) +{ +#if !defined(XXH_NO_STREAM) && XXH_SIZE_OPT >= 2 + /* Simple version, good for code maintenance, but unfortunately slow for small inputs */ + XXH64_state_t state; + XXH64_reset(&state, seed); + XXH64_update(&state, (const xxh_u8*)input, len); + return XXH64_digest(&state); +#else + if (XXH_FORCE_ALIGN_CHECK) { + if ((((size_t)input) & 7)==0) { /* Input is aligned, let's leverage the speed advantage */ + return XXH64_endian_align((const xxh_u8*)input, len, seed, XXH_aligned); + } } + + return XXH64_endian_align((const xxh_u8*)input, len, seed, XXH_unaligned); + +#endif +} + +/******* Hash Streaming *******/ +#ifndef XXH_NO_STREAM +/*! @ingroup XXH64_family*/ +XXH_PUBLIC_API XXH64_state_t* XXH64_createState(void) +{ + return (XXH64_state_t*)XXH_malloc(sizeof(XXH64_state_t)); +} +/*! @ingroup XXH64_family */ +XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr) +{ + XXH_free(statePtr); + return XXH_OK; +} + +/*! @ingroup XXH64_family */ +XXH_PUBLIC_API void XXH64_copyState(XXH_NOESCAPE XXH64_state_t* dstState, const XXH64_state_t* srcState) +{ + XXH_memcpy(dstState, srcState, sizeof(*dstState)); +} + +/*! @ingroup XXH64_family */ +XXH_PUBLIC_API XXH_errorcode XXH64_reset(XXH_NOESCAPE XXH64_state_t* statePtr, XXH64_hash_t seed) +{ + XXH_ASSERT(statePtr != NULL); + XXH_memset(statePtr, 0, sizeof(*statePtr)); + XXH64_initAccs(statePtr->acc, seed); + return XXH_OK; +} + +/*! @ingroup XXH64_family */ +XXH_PUBLIC_API XXH_errorcode +XXH64_update (XXH_NOESCAPE XXH64_state_t* state, XXH_NOESCAPE const void* input, size_t len) +{ + if (input==NULL) { + XXH_ASSERT(len == 0); + return XXH_OK; + } + + state->total_len += len; + + XXH_ASSERT(state->bufferedSize <= sizeof(state->buffer)); + if (len < sizeof(state->buffer) - state->bufferedSize) { /* fill in tmp buffer */ + XXH_memcpy(state->buffer + state->bufferedSize, input, len); + state->bufferedSize += (XXH32_hash_t)len; + return XXH_OK; + } + + { const xxh_u8* xinput = (const xxh_u8*)input; + const xxh_u8* const bEnd = xinput + len; + + if (state->bufferedSize) { /* non-empty buffer => complete first */ + XXH_memcpy(state->buffer + state->bufferedSize, xinput, sizeof(state->buffer) - state->bufferedSize); + xinput += sizeof(state->buffer) - state->bufferedSize; + /* and process one round */ + (void)XXH64_consumeLong(state->acc, state->buffer, sizeof(state->buffer), XXH_aligned); + state->bufferedSize = 0; + } + + XXH_ASSERT(xinput <= bEnd); + if ((size_t)(bEnd - xinput) >= sizeof(state->buffer)) { + /* Process the remaining data */ + xinput = XXH64_consumeLong(state->acc, xinput, (size_t)(bEnd - xinput), XXH_unaligned); + } + + if (xinput < bEnd) { + /* Copy the leftover to the tmp buffer */ + XXH_memcpy(state->buffer, xinput, (size_t)(bEnd-xinput)); + state->bufferedSize = (unsigned)(bEnd-xinput); + } + } + + return XXH_OK; +} + + +/*! @ingroup XXH64_family */ +XXH_PUBLIC_API XXH64_hash_t XXH64_digest(XXH_NOESCAPE const XXH64_state_t* state) +{ + xxh_u64 h64; + + if (state->total_len >= 32) { + h64 = XXH64_mergeAccs(state->acc); + } else { + h64 = state->acc[2] /*seed*/ + XXH_PRIME64_5; + } + + h64 += (xxh_u64) state->total_len; + + return XXH64_finalize(h64, state->buffer, (size_t)state->total_len, XXH_aligned); +} +#endif /* !XXH_NO_STREAM */ + +/******* Canonical representation *******/ + +/*! @ingroup XXH64_family */ +XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH_NOESCAPE XXH64_canonical_t* dst, XXH64_hash_t hash) +{ + XXH_STATIC_ASSERT(sizeof(XXH64_canonical_t) == sizeof(XXH64_hash_t)); + if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap64(hash); + XXH_memcpy(dst, &hash, sizeof(*dst)); +} + +/*! @ingroup XXH64_family */ +XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(XXH_NOESCAPE const XXH64_canonical_t* src) +{ + return XXH_readBE64(src); +} + +#ifndef XXH_NO_XXH3 + +/* ********************************************************************* +* XXH3 +* New generation hash designed for speed on small keys and vectorization +************************************************************************ */ +/*! + * @} + * @defgroup XXH3_impl XXH3 implementation + * @ingroup impl + * @{ + */ + +/* === Compiler specifics === */ + + +#if (defined(__GNUC__) && (__GNUC__ >= 3)) \ + || (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 800)) \ + || defined(__clang__) +# define XXH_likely(x) __builtin_expect(x, 1) +# define XXH_unlikely(x) __builtin_expect(x, 0) +#else +# define XXH_likely(x) (x) +# define XXH_unlikely(x) (x) +#endif + +#ifndef XXH_HAS_INCLUDE +# ifdef __has_include +/* + * Not defined as XXH_HAS_INCLUDE(x) (function-like) because + * this causes segfaults in Apple Clang 4.2 (on Mac OS X 10.7 Lion) + */ +# define XXH_HAS_INCLUDE __has_include +# else +# define XXH_HAS_INCLUDE(x) 0 +# endif +#endif + +#if defined(__GNUC__) || defined(__clang__) +# if defined(__ARM_FEATURE_SVE) +# include +# endif +# if defined(__ARM_NEON__) || defined(__ARM_NEON) \ + || (defined(_M_ARM) && _M_ARM >= 7) \ + || defined(_M_ARM64) || defined(_M_ARM64EC) \ + || (defined(__wasm_simd128__) && XXH_HAS_INCLUDE()) /* WASM SIMD128 via SIMDe */ +# define inline __inline__ /* circumvent a clang bug */ +# include +# undef inline +# elif defined(__AVX2__) +# include +# elif defined(__SSE2__) +# include +# elif defined(__loongarch_asx) +# include +# include +# elif defined(__loongarch_sx) +# include +# endif +#endif + +#if defined(_MSC_VER) +# include +#endif + +/* + * One goal of XXH3 is to make it fast on both 32-bit and 64-bit, while + * remaining a true 64-bit/128-bit hash function. + * + * This is done by prioritizing a subset of 64-bit operations that can be + * emulated without too many steps on the average 32-bit machine. + * + * For example, these two lines seem similar, and run equally fast on 64-bit: + * + * xxh_u64 x; + * x ^= (x >> 47); // good + * x ^= (x >> 13); // bad + * + * However, to a 32-bit machine, there is a major difference. + * + * x ^= (x >> 47) looks like this: + * + * x.lo ^= (x.hi >> (47 - 32)); + * + * while x ^= (x >> 13) looks like this: + * + * // note: funnel shifts are not usually cheap. + * x.lo ^= (x.lo >> 13) | (x.hi << (32 - 13)); + * x.hi ^= (x.hi >> 13); + * + * The first one is significantly faster than the second, simply because the + * shift is larger than 32. This means: + * - All the bits we need are in the upper 32 bits, so we can ignore the lower + * 32 bits in the shift. + * - The shift result will always fit in the lower 32 bits, and therefore, + * we can ignore the upper 32 bits in the xor. + * + * Thanks to this optimization, XXH3 only requires these features to be efficient: + * + * - Usable unaligned access + * - A 32-bit or 64-bit ALU + * - If 32-bit, a decent ADC instruction + * - A 32 or 64-bit multiply with a 64-bit result + * - For the 128-bit variant, a decent byteswap helps short inputs. + * + * The first two are already required by XXH32, and almost all 32-bit and 64-bit + * platforms which can run XXH32 can run XXH3 efficiently. + * + * Thumb-1, the classic 16-bit only subset of ARM's instruction set, is one + * notable exception. + * + * First of all, Thumb-1 lacks support for the UMULL instruction which + * performs the important long multiply. This means numerous __aeabi_lmul + * calls. + * + * Second of all, the 8 functional registers are just not enough. + * Setup for __aeabi_lmul, byteshift loads, pointers, and all arithmetic need + * Lo registers, and this shuffling results in thousands more MOVs than A32. + * + * A32 and T32 don't have this limitation. They can access all 14 registers, + * do a 32->64 multiply with UMULL, and the flexible operand allowing free + * shifts is helpful, too. + * + * Therefore, we do a quick sanity check. + * + * If compiling Thumb-1 for a target which supports ARM instructions, we will + * emit a warning, as it is not a "sane" platform to compile for. + * + * Usually, if this happens, it is because of an accident and you probably need + * to specify -march, as you likely meant to compile for a newer architecture. + * + * Credit: large sections of the vectorial and asm source code paths + * have been contributed by @easyaspi314 + */ +#if defined(__thumb__) && !defined(__thumb2__) && defined(__ARM_ARCH_ISA_ARM) +# warning "XXH3 is highly inefficient without ARM or Thumb-2." +#endif + +/* ========================================== + * Vectorization detection + * ========================================== */ + +#ifdef XXH_DOXYGEN +/*! + * @ingroup tuning + * @brief Overrides the vectorization implementation chosen for XXH3. + * + * Can be defined to 0 to disable SIMD, + * or any other authorized value of @ref XXH_VECTOR. + * + * If this is not defined, it uses predefined macros to determine the best + * implementation. + */ +# define XXH_VECTOR XXH_SCALAR +/*! + * @ingroup tuning + * @brief Selects the minimum alignment for XXH3's accumulators. + * + * When using SIMD, this should match the alignment required for said vector + * type, so, for example, 32 for AVX2. + * + * Default: Auto detected. + */ +# define XXH_ACC_ALIGN 8 +#endif + +/* Actual definition */ +#ifndef XXH_DOXYGEN +#endif + +#ifndef XXH_VECTOR /* can be defined on command line */ +# if defined(__ARM_FEATURE_SVE) +# define XXH_VECTOR XXH_SVE +# elif ( \ + defined(__ARM_NEON__) || defined(__ARM_NEON) /* gcc */ \ + || defined(_M_ARM) || defined(_M_ARM64) || defined(_M_ARM64EC) /* msvc */ \ + || (defined(__wasm_simd128__) && XXH_HAS_INCLUDE()) /* wasm simd128 via SIMDe */ \ + ) && ( \ + defined(_WIN32) || defined(__LITTLE_ENDIAN__) /* little endian only */ \ + || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) \ + ) +# define XXH_VECTOR XXH_NEON +# elif defined(__AVX512F__) +# define XXH_VECTOR XXH_AVX512 +# elif defined(__AVX2__) +# define XXH_VECTOR XXH_AVX2 +# elif defined(__SSE2__) || defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP == 2)) +# define XXH_VECTOR XXH_SSE2 +# elif (defined(__PPC64__) && defined(__POWER8_VECTOR__)) \ + || (defined(__s390x__) && defined(__VEC__)) \ + && defined(__GNUC__) /* TODO: IBM XL */ +# define XXH_VECTOR XXH_VSX +# elif defined(__loongarch_asx) +# define XXH_VECTOR XXH_LASX +# elif defined(__loongarch_sx) +# define XXH_VECTOR XXH_LSX +# else +# define XXH_VECTOR XXH_SCALAR +# endif +#endif + +/* __ARM_FEATURE_SVE is only supported by GCC & Clang. */ +#if (XXH_VECTOR == XXH_SVE) && !defined(__ARM_FEATURE_SVE) +# ifdef _MSC_VER +# pragma warning(once : 4606) +# else +# warning "__ARM_FEATURE_SVE isn't supported. Use SCALAR instead." +# endif +# undef XXH_VECTOR +# define XXH_VECTOR XXH_SCALAR +#endif + +/* + * Controls the alignment of the accumulator, + * for compatibility with aligned vector loads, which are usually faster. + */ +#ifndef XXH_ACC_ALIGN +# if defined(XXH_X86DISPATCH) +# define XXH_ACC_ALIGN 64 /* for compatibility with avx512 */ +# elif XXH_VECTOR == XXH_SCALAR /* scalar */ +# define XXH_ACC_ALIGN 8 +# elif XXH_VECTOR == XXH_SSE2 /* sse2 */ +# define XXH_ACC_ALIGN 16 +# elif XXH_VECTOR == XXH_AVX2 /* avx2 */ +# define XXH_ACC_ALIGN 32 +# elif XXH_VECTOR == XXH_NEON /* neon */ +# define XXH_ACC_ALIGN 16 +# elif XXH_VECTOR == XXH_VSX /* vsx */ +# define XXH_ACC_ALIGN 16 +# elif XXH_VECTOR == XXH_AVX512 /* avx512 */ +# define XXH_ACC_ALIGN 64 +# elif XXH_VECTOR == XXH_SVE /* sve */ +# define XXH_ACC_ALIGN 64 +# elif XXH_VECTOR == XXH_LASX /* lasx */ +# define XXH_ACC_ALIGN 64 +# elif XXH_VECTOR == XXH_LSX /* lsx */ +# define XXH_ACC_ALIGN 64 +# endif +#endif + +#if defined(XXH_X86DISPATCH) || XXH_VECTOR == XXH_SSE2 \ + || XXH_VECTOR == XXH_AVX2 || XXH_VECTOR == XXH_AVX512 +# define XXH_SEC_ALIGN XXH_ACC_ALIGN +#elif XXH_VECTOR == XXH_SVE +# define XXH_SEC_ALIGN XXH_ACC_ALIGN +#else +# define XXH_SEC_ALIGN 8 +#endif + +#if defined(__GNUC__) || defined(__clang__) +# define XXH_ALIASING __attribute__((__may_alias__)) +#else +# define XXH_ALIASING /* nothing */ +#endif + +/* + * UGLY HACK: + * GCC usually generates the best code with -O3 for xxHash. + * + * However, when targeting AVX2, it is overzealous in its unrolling resulting + * in code roughly 3/4 the speed of Clang. + * + * There are other issues, such as GCC splitting _mm256_loadu_si256 into + * _mm_loadu_si128 + _mm256_inserti128_si256. This is an optimization which + * only applies to Sandy and Ivy Bridge... which don't even support AVX2. + * + * That is why when compiling the AVX2 version, it is recommended to use either + * -O2 -mavx2 -march=haswell + * or + * -O2 -mavx2 -mno-avx256-split-unaligned-load + * for decent performance, or to use Clang instead. + * + * Fortunately, we can control the first one with a pragma that forces GCC into + * -O2, but the other one we can't control without "failed to inline always + * inline function due to target mismatch" warnings. + */ +#if XXH_VECTOR == XXH_AVX2 /* AVX2 */ \ + && defined(__GNUC__) && !defined(__clang__) /* GCC, not Clang */ \ + && defined(__OPTIMIZE__) && XXH_SIZE_OPT <= 0 /* respect -O0 and -Os */ +# pragma GCC push_options +# pragma GCC optimize("-O2") +#endif + +#if XXH_VECTOR == XXH_NEON + +/* + * UGLY HACK: While AArch64 GCC on Linux does not seem to care, on macOS, GCC -O3 + * optimizes out the entire hashLong loop because of the aliasing violation. + * + * However, GCC is also inefficient at load-store optimization with vld1q/vst1q, + * so the only option is to mark it as aliasing. + */ +typedef uint64x2_t xxh_aliasing_uint64x2_t XXH_ALIASING; + +/*! + * @internal + * @brief `vld1q_u64` but faster and alignment-safe. + * + * On AArch64, unaligned access is always safe, but on ARMv7-a, it is only + * *conditionally* safe (`vld1` has an alignment bit like `movdq[ua]` in x86). + * + * GCC for AArch64 sees `vld1q_u8` as an intrinsic instead of a load, so it + * prohibits load-store optimizations. Therefore, a direct dereference is used. + * + * Otherwise, `vld1q_u8` is used with `vreinterpretq_u8_u64` to do a safe + * unaligned load. + */ +#if defined(__aarch64__) && defined(__GNUC__) && !defined(__clang__) +XXH_FORCE_INLINE uint64x2_t XXH_vld1q_u64(void const* ptr) /* silence -Wcast-align */ +{ + return *(xxh_aliasing_uint64x2_t const *)ptr; +} +#else +XXH_FORCE_INLINE uint64x2_t XXH_vld1q_u64(void const* ptr) +{ + return vreinterpretq_u64_u8(vld1q_u8((uint8_t const*)ptr)); +} +#endif + +/*! + * @internal + * @brief `vmlal_u32` on low and high halves of a vector. + * + * This is a workaround for AArch64 GCC < 11 which implemented arm_neon.h with + * inline assembly and were therefore incapable of merging the `vget_{low, high}_u32` + * with `vmlal_u32`. + */ +#if defined(__aarch64__) && defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 11 +XXH_FORCE_INLINE uint64x2_t +XXH_vmlal_low_u32(uint64x2_t acc, uint32x4_t lhs, uint32x4_t rhs) +{ + /* Inline assembly is the only way */ + __asm__("umlal %0.2d, %1.2s, %2.2s" : "+w" (acc) : "w" (lhs), "w" (rhs)); + return acc; +} +XXH_FORCE_INLINE uint64x2_t +XXH_vmlal_high_u32(uint64x2_t acc, uint32x4_t lhs, uint32x4_t rhs) +{ + /* This intrinsic works as expected */ + return vmlal_high_u32(acc, lhs, rhs); +} +#else +/* Portable intrinsic versions */ +XXH_FORCE_INLINE uint64x2_t +XXH_vmlal_low_u32(uint64x2_t acc, uint32x4_t lhs, uint32x4_t rhs) +{ + return vmlal_u32(acc, vget_low_u32(lhs), vget_low_u32(rhs)); +} +/*! @copydoc XXH_vmlal_low_u32 + * Assume the compiler converts this to vmlal_high_u32 on aarch64 */ +XXH_FORCE_INLINE uint64x2_t +XXH_vmlal_high_u32(uint64x2_t acc, uint32x4_t lhs, uint32x4_t rhs) +{ + return vmlal_u32(acc, vget_high_u32(lhs), vget_high_u32(rhs)); +} +#endif + +/*! + * @ingroup tuning + * @brief Controls the NEON to scalar ratio for XXH3 + * + * This can be set to 2, 4, 6, or 8. + * + * ARM Cortex CPUs are _very_ sensitive to how their pipelines are used. + * + * For example, the Cortex-A73 can dispatch 3 micro-ops per cycle, but only 2 of those + * can be NEON. If you are only using NEON instructions, you are only using 2/3 of the CPU + * bandwidth. + * + * This is even more noticeable on the more advanced cores like the Cortex-A76 which + * can dispatch 8 micro-ops per cycle, but still only 2 NEON micro-ops at once. + * + * Therefore, to make the most out of the pipeline, it is beneficial to run 6 NEON lanes + * and 2 scalar lanes, which is chosen by default. + * + * This does not apply to Apple processors or 32-bit processors, which run better with + * full NEON. These will default to 8. Additionally, size-optimized builds run 8 lanes. + * + * This change benefits CPUs with large micro-op buffers without negatively affecting + * most other CPUs: + * + * | Chipset | Dispatch type | NEON only | 6:2 hybrid | Diff. | + * |:----------------------|:--------------------|----------:|-----------:|------:| + * | Snapdragon 730 (A76) | 2 NEON/8 micro-ops | 8.8 GB/s | 10.1 GB/s | ~16% | + * | Snapdragon 835 (A73) | 2 NEON/3 micro-ops | 5.1 GB/s | 5.3 GB/s | ~5% | + * | Marvell PXA1928 (A53) | In-order dual-issue | 1.9 GB/s | 1.9 GB/s | 0% | + * | Apple M1 | 4 NEON/8 micro-ops | 37.3 GB/s | 36.1 GB/s | ~-3% | + * + * It also seems to fix some bad codegen on GCC, making it almost as fast as clang. + * + * When using WASM SIMD128, if this is 2 or 6, SIMDe will scalarize 2 of the lanes meaning + * it effectively becomes worse 4. + * + * @see XXH3_accumulate_512_neon() + */ +# ifndef XXH3_NEON_LANES +# if (defined(__aarch64__) || defined(__arm64__) || defined(_M_ARM64) || defined(_M_ARM64EC)) \ + && !defined(__APPLE__) && XXH_SIZE_OPT <= 0 +# define XXH3_NEON_LANES 6 +# else +# define XXH3_NEON_LANES XXH_ACC_NB +# endif +# endif +#endif /* XXH_VECTOR == XXH_NEON */ + +/* + * VSX and Z Vector helpers. + * + * This is very messy, and any pull requests to clean this up are welcome. + * + * There are a lot of problems with supporting VSX and s390x, due to + * inconsistent intrinsics, spotty coverage, and multiple endiannesses. + */ +#if XXH_VECTOR == XXH_VSX +/* Annoyingly, these headers _may_ define three macros: `bool`, `vector`, + * and `pixel`. This is a problem for obvious reasons. + * + * These keywords are unnecessary; the spec literally says they are + * equivalent to `__bool`, `__vector`, and `__pixel` and may be undef'd + * after including the header. + * + * We use pragma push_macro/pop_macro to keep the namespace clean. */ +# pragma push_macro("bool") +# pragma push_macro("vector") +# pragma push_macro("pixel") +/* silence potential macro redefined warnings */ +# undef bool +# undef vector +# undef pixel + +# if defined(__s390x__) +# include +# else +# include +# endif + +/* Restore the original macro values, if applicable. */ +# pragma pop_macro("pixel") +# pragma pop_macro("vector") +# pragma pop_macro("bool") + +typedef __vector unsigned long long xxh_u64x2; +typedef __vector unsigned char xxh_u8x16; +typedef __vector unsigned xxh_u32x4; + +/* + * UGLY HACK: Similar to aarch64 macOS GCC, s390x GCC has the same aliasing issue. + */ +typedef xxh_u64x2 xxh_aliasing_u64x2 XXH_ALIASING; + +# ifndef XXH_VSX_BE +# if defined(__BIG_ENDIAN__) \ + || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) +# define XXH_VSX_BE 1 +# elif defined(__VEC_ELEMENT_REG_ORDER__) && __VEC_ELEMENT_REG_ORDER__ == __ORDER_BIG_ENDIAN__ +# warning "-maltivec=be is not recommended. Please use native endianness." +# define XXH_VSX_BE 1 +# else +# define XXH_VSX_BE 0 +# endif +# endif /* !defined(XXH_VSX_BE) */ + +# if XXH_VSX_BE +# if defined(__POWER9_VECTOR__) || (defined(__clang__) && defined(__s390x__)) +# define XXH_vec_revb vec_revb +# else +/*! + * A polyfill for POWER9's vec_revb(). + */ +XXH_FORCE_INLINE xxh_u64x2 XXH_vec_revb(xxh_u64x2 val) +{ + xxh_u8x16 const vByteSwap = { 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, + 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08 }; + return vec_perm(val, val, vByteSwap); +} +# endif +# endif /* XXH_VSX_BE */ + +/*! + * Performs an unaligned vector load and byte swaps it on big endian. + */ +XXH_FORCE_INLINE xxh_u64x2 XXH_vec_loadu(const void *ptr) +{ + xxh_u64x2 ret; + XXH_memcpy(&ret, ptr, sizeof(xxh_u64x2)); +# if XXH_VSX_BE + ret = XXH_vec_revb(ret); +# endif + return ret; +} + +/* + * vec_mulo and vec_mule are very problematic intrinsics on PowerPC + * + * These intrinsics weren't added until GCC 8, despite existing for a while, + * and they are endian dependent. Also, their meaning swap depending on version. + * */ +# if defined(__s390x__) + /* s390x is always big endian, no issue on this platform */ +# define XXH_vec_mulo vec_mulo +# define XXH_vec_mule vec_mule +# elif defined(__clang__) && XXH_HAS_BUILTIN(__builtin_altivec_vmuleuw) && !defined(__ibmxl__) +/* Clang has a better way to control this, we can just use the builtin which doesn't swap. */ + /* The IBM XL Compiler (which defined __clang__) only implements the vec_* operations */ +# define XXH_vec_mulo __builtin_altivec_vmulouw +# define XXH_vec_mule __builtin_altivec_vmuleuw +# else +/* gcc needs inline assembly */ +/* Adapted from https://github.com/google/highwayhash/blob/master/highwayhash/hh_vsx.h. */ +XXH_FORCE_INLINE xxh_u64x2 XXH_vec_mulo(xxh_u32x4 a, xxh_u32x4 b) +{ + xxh_u64x2 result; + __asm__("vmulouw %0, %1, %2" : "=v" (result) : "v" (a), "v" (b)); + return result; +} +XXH_FORCE_INLINE xxh_u64x2 XXH_vec_mule(xxh_u32x4 a, xxh_u32x4 b) +{ + xxh_u64x2 result; + __asm__("vmuleuw %0, %1, %2" : "=v" (result) : "v" (a), "v" (b)); + return result; +} +# endif /* XXH_vec_mulo, XXH_vec_mule */ +#endif /* XXH_VECTOR == XXH_VSX */ + +#if XXH_VECTOR == XXH_SVE +#define ACCRND(acc, offset) \ +do { \ + svuint64_t input_vec = svld1_u64(mask, xinput + offset); \ + svuint64_t secret_vec = svld1_u64(mask, xsecret + offset); \ + svuint64_t mixed = sveor_u64_x(mask, secret_vec, input_vec); \ + svuint64_t swapped = svtbl_u64(input_vec, kSwap); \ + svuint64_t mixed_lo = svextw_u64_x(mask, mixed); \ + svuint64_t mixed_hi = svlsr_n_u64_x(mask, mixed, 32); \ + svuint64_t mul = svmad_u64_x(mask, mixed_lo, mixed_hi, swapped); \ + acc = svadd_u64_x(mask, acc, mul); \ +} while (0) +#endif /* XXH_VECTOR == XXH_SVE */ + +/* prefetch + * can be disabled, by declaring XXH_NO_PREFETCH build macro */ +#if defined(XXH_NO_PREFETCH) +# define XXH_PREFETCH(ptr) (void)(ptr) /* disabled */ +#else +# if XXH_SIZE_OPT >= 1 +# define XXH_PREFETCH(ptr) (void)(ptr) +# elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) /* _mm_prefetch() not defined outside of x86/x64 */ +# include /* https://msdn.microsoft.com/fr-fr/library/84szxsww(v=vs.90).aspx */ +# define XXH_PREFETCH(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T0) +# elif defined(__GNUC__) && ( (__GNUC__ >= 4) || ( (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1) ) ) +# define XXH_PREFETCH(ptr) __builtin_prefetch((ptr), 0 /* rw==read */, 3 /* locality */) +# else +# define XXH_PREFETCH(ptr) (void)(ptr) /* disabled */ +# endif +#endif /* XXH_NO_PREFETCH */ + + +/* ========================================== + * XXH3 default settings + * ========================================== */ + +#define XXH_SECRET_DEFAULT_SIZE 192 /* minimum XXH3_SECRET_SIZE_MIN */ + +#if (XXH_SECRET_DEFAULT_SIZE < XXH3_SECRET_SIZE_MIN) +# error "default keyset is not large enough" +#endif + +/*! + * @internal + * @def XXH3_kSecret + * @brief Pseudorandom secret taken directly from FARSH. */ +XXH_ALIGN(64) static const xxh_u8 XXH3_kSecret[XXH_SECRET_DEFAULT_SIZE] = { + 0xb8, 0xfe, 0x6c, 0x39, 0x23, 0xa4, 0x4b, 0xbe, 0x7c, 0x01, 0x81, 0x2c, 0xf7, 0x21, 0xad, 0x1c, + 0xde, 0xd4, 0x6d, 0xe9, 0x83, 0x90, 0x97, 0xdb, 0x72, 0x40, 0xa4, 0xa4, 0xb7, 0xb3, 0x67, 0x1f, + 0xcb, 0x79, 0xe6, 0x4e, 0xcc, 0xc0, 0xe5, 0x78, 0x82, 0x5a, 0xd0, 0x7d, 0xcc, 0xff, 0x72, 0x21, + 0xb8, 0x08, 0x46, 0x74, 0xf7, 0x43, 0x24, 0x8e, 0xe0, 0x35, 0x90, 0xe6, 0x81, 0x3a, 0x26, 0x4c, + 0x3c, 0x28, 0x52, 0xbb, 0x91, 0xc3, 0x00, 0xcb, 0x88, 0xd0, 0x65, 0x8b, 0x1b, 0x53, 0x2e, 0xa3, + 0x71, 0x64, 0x48, 0x97, 0xa2, 0x0d, 0xf9, 0x4e, 0x38, 0x19, 0xef, 0x46, 0xa9, 0xde, 0xac, 0xd8, + 0xa8, 0xfa, 0x76, 0x3f, 0xe3, 0x9c, 0x34, 0x3f, 0xf9, 0xdc, 0xbb, 0xc7, 0xc7, 0x0b, 0x4f, 0x1d, + 0x8a, 0x51, 0xe0, 0x4b, 0xcd, 0xb4, 0x59, 0x31, 0xc8, 0x9f, 0x7e, 0xc9, 0xd9, 0x78, 0x73, 0x64, + 0xea, 0xc5, 0xac, 0x83, 0x34, 0xd3, 0xeb, 0xc3, 0xc5, 0x81, 0xa0, 0xff, 0xfa, 0x13, 0x63, 0xeb, + 0x17, 0x0d, 0xdd, 0x51, 0xb7, 0xf0, 0xda, 0x49, 0xd3, 0x16, 0x55, 0x26, 0x29, 0xd4, 0x68, 0x9e, + 0x2b, 0x16, 0xbe, 0x58, 0x7d, 0x47, 0xa1, 0xfc, 0x8f, 0xf8, 0xb8, 0xd1, 0x7a, 0xd0, 0x31, 0xce, + 0x45, 0xcb, 0x3a, 0x8f, 0x95, 0x16, 0x04, 0x28, 0xaf, 0xd7, 0xfb, 0xca, 0xbb, 0x4b, 0x40, 0x7e, +}; + +static const xxh_u64 PRIME_MX1 = 0x165667919E3779F9ULL; /*!< 0b0001011001010110011001111001000110011110001101110111100111111001 */ +static const xxh_u64 PRIME_MX2 = 0x9FB21C651E98DF25ULL; /*!< 0b1001111110110010000111000110010100011110100110001101111100100101 */ + +#ifdef XXH_OLD_NAMES +# define kSecret XXH3_kSecret +#endif + +#ifdef XXH_DOXYGEN +/*! + * @brief Calculates a 32-bit to 64-bit long multiply. + * + * Implemented as a macro. + * + * Wraps `__emulu` on MSVC x86 because it tends to call `__allmul` when it doesn't + * need to (but it shouldn't need to anyways, it is about 7 instructions to do + * a 64x64 multiply...). Since we know that this will _always_ emit `MULL`, we + * use that instead of the normal method. + * + * If you are compiling for platforms like Thumb-1 and don't have a better option, + * you may also want to write your own long multiply routine here. + * + * @param x, y Numbers to be multiplied + * @return 64-bit product of the low 32 bits of @p x and @p y. + */ +XXH_FORCE_INLINE xxh_u64 +XXH_mult32to64(xxh_u64 x, xxh_u64 y) +{ + return (x & 0xFFFFFFFF) * (y & 0xFFFFFFFF); +} +#elif defined(_MSC_VER) && defined(_M_IX86) +# define XXH_mult32to64(x, y) __emulu((unsigned)(x), (unsigned)(y)) +#else +/* + * Downcast + upcast is usually better than masking on older compilers like + * GCC 4.2 (especially 32-bit ones), all without affecting newer compilers. + * + * The other method, (x & 0xFFFFFFFF) * (y & 0xFFFFFFFF), will AND both operands + * and perform a full 64x64 multiply -- entirely redundant on 32-bit. + */ +# define XXH_mult32to64(x, y) ((xxh_u64)(xxh_u32)(x) * (xxh_u64)(xxh_u32)(y)) +#endif + +/*! + * @brief Calculates a 64->128-bit long multiply. + * + * Uses `__uint128_t` and `_umul128` if available, otherwise uses a scalar + * version. + * + * @param lhs , rhs The 64-bit integers to be multiplied + * @return The 128-bit result represented in an @ref XXH128_hash_t. + */ +static XXH128_hash_t +XXH_mult64to128(xxh_u64 lhs, xxh_u64 rhs) +{ + /* + * GCC/Clang __uint128_t method. + * + * On most 64-bit targets, GCC and Clang define a __uint128_t type. + * This is usually the best way as it usually uses a native long 64-bit + * multiply, such as MULQ on x86_64 or MUL + UMULH on aarch64. + * + * Usually. + * + * Despite being a 32-bit platform, Clang (and emscripten) define this type + * despite not having the arithmetic for it. This results in a laggy + * compiler builtin call which calculates a full 128-bit multiply. + * In that case it is best to use the portable one. + * https://github.com/Cyan4973/xxHash/issues/211#issuecomment-515575677 + */ +#if (defined(__GNUC__) || defined(__clang__)) && !defined(__wasm__) \ + && defined(__SIZEOF_INT128__) \ + || (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 128) + + __uint128_t const product = (__uint128_t)lhs * (__uint128_t)rhs; + XXH128_hash_t r128; + r128.low64 = (xxh_u64)(product); + r128.high64 = (xxh_u64)(product >> 64); + return r128; + + /* + * MSVC for x64's _umul128 method. + * + * xxh_u64 _umul128(xxh_u64 Multiplier, xxh_u64 Multiplicand, xxh_u64 *HighProduct); + * + * This compiles to single operand MUL on x64. + */ +#elif (defined(_M_X64) || defined(_M_IA64)) && !defined(_M_ARM64EC) + +#ifndef _MSC_VER +# pragma intrinsic(_umul128) +#endif + xxh_u64 product_high; + xxh_u64 const product_low = _umul128(lhs, rhs, &product_high); + XXH128_hash_t r128; + r128.low64 = product_low; + r128.high64 = product_high; + return r128; + + /* + * MSVC for ARM64's __umulh method. + * + * This compiles to the same MUL + UMULH as GCC/Clang's __uint128_t method. + */ +#elif defined(_M_ARM64) || defined(_M_ARM64EC) + +#ifndef _MSC_VER +# pragma intrinsic(__umulh) +#endif + XXH128_hash_t r128; + r128.low64 = lhs * rhs; + r128.high64 = __umulh(lhs, rhs); + return r128; + +#else + /* + * Portable scalar method. Optimized for 32-bit and 64-bit ALUs. + * + * This is a fast and simple grade school multiply, which is shown below + * with base 10 arithmetic instead of base 0x100000000. + * + * 9 3 // D2 lhs = 93 + * x 7 5 // D2 rhs = 75 + * ---------- + * 1 5 // D2 lo_lo = (93 % 10) * (75 % 10) = 15 + * 4 5 | // D2 hi_lo = (93 / 10) * (75 % 10) = 45 + * 2 1 | // D2 lo_hi = (93 % 10) * (75 / 10) = 21 + * + 6 3 | | // D2 hi_hi = (93 / 10) * (75 / 10) = 63 + * --------- + * 2 7 | // D2 cross = (15 / 10) + (45 % 10) + 21 = 27 + * + 6 7 | | // D2 upper = (27 / 10) + (45 / 10) + 63 = 67 + * --------- + * 6 9 7 5 // D4 res = (27 * 10) + (15 % 10) + (67 * 100) = 6975 + * + * The reasons for adding the products like this are: + * 1. It avoids manual carry tracking. Just like how + * (9 * 9) + 9 + 9 = 99, the same applies with this for UINT64_MAX. + * This avoids a lot of complexity. + * + * 2. It hints for, and on Clang, compiles to, the powerful UMAAL + * instruction available in ARM's Digital Signal Processing extension + * in 32-bit ARMv6 and later, which is shown below: + * + * void UMAAL(xxh_u32 *RdLo, xxh_u32 *RdHi, xxh_u32 Rn, xxh_u32 Rm) + * { + * xxh_u64 product = (xxh_u64)*RdLo * (xxh_u64)*RdHi + Rn + Rm; + * *RdLo = (xxh_u32)(product & 0xFFFFFFFF); + * *RdHi = (xxh_u32)(product >> 32); + * } + * + * This instruction was designed for efficient long multiplication, and + * allows this to be calculated in only 4 instructions at speeds + * comparable to some 64-bit ALUs. + * + * 3. It isn't terrible on other platforms. Usually this will be a couple + * of 32-bit ADD/ADCs. + */ + + /* First calculate all of the cross products. */ + xxh_u64 const lo_lo = XXH_mult32to64(lhs & 0xFFFFFFFF, rhs & 0xFFFFFFFF); + xxh_u64 const hi_lo = XXH_mult32to64(lhs >> 32, rhs & 0xFFFFFFFF); + xxh_u64 const lo_hi = XXH_mult32to64(lhs & 0xFFFFFFFF, rhs >> 32); + xxh_u64 const hi_hi = XXH_mult32to64(lhs >> 32, rhs >> 32); + + /* Now add the products together. These will never overflow. */ + xxh_u64 const cross = (lo_lo >> 32) + (hi_lo & 0xFFFFFFFF) + lo_hi; + xxh_u64 const upper = (hi_lo >> 32) + (cross >> 32) + hi_hi; + xxh_u64 const lower = (cross << 32) | (lo_lo & 0xFFFFFFFF); + + XXH128_hash_t r128; + r128.low64 = lower; + r128.high64 = upper; + return r128; +#endif +} + +/*! + * @brief Calculates a 64-bit to 128-bit multiply, then XOR folds it. + * + * The reason for the separate function is to prevent passing too many structs + * around by value. This will hopefully inline the multiply, but we don't force it. + * + * @param lhs , rhs The 64-bit integers to multiply + * @return The low 64 bits of the product XOR'd by the high 64 bits. + * @see XXH_mult64to128() + */ +static xxh_u64 +XXH3_mul128_fold64(xxh_u64 lhs, xxh_u64 rhs) +{ + XXH128_hash_t product = XXH_mult64to128(lhs, rhs); + return product.low64 ^ product.high64; +} + +/*! Seems to produce slightly better code on GCC for some reason. */ +XXH_FORCE_INLINE XXH_CONSTF xxh_u64 XXH_xorshift64(xxh_u64 v64, int shift) +{ + XXH_ASSERT(0 <= shift && shift < 64); + return v64 ^ (v64 >> shift); +} + +/* + * This is a fast avalanche stage, + * suitable when input bits are already partially mixed + */ +static XXH64_hash_t XXH3_avalanche(xxh_u64 h64) +{ + h64 = XXH_xorshift64(h64, 37); + h64 *= PRIME_MX1; + h64 = XXH_xorshift64(h64, 32); + return h64; +} + +/* + * This is a stronger avalanche, + * inspired by Pelle Evensen's rrmxmx + * preferable when input has not been previously mixed + */ +static XXH64_hash_t XXH3_rrmxmx(xxh_u64 h64, xxh_u64 len) +{ + /* this mix is inspired by Pelle Evensen's rrmxmx */ + h64 ^= XXH_rotl64(h64, 49) ^ XXH_rotl64(h64, 24); + h64 *= PRIME_MX2; + h64 ^= (h64 >> 35) + len ; + h64 *= PRIME_MX2; + return XXH_xorshift64(h64, 28); +} + + +/* ========================================== + * Short keys + * ========================================== + * One of the shortcomings of XXH32 and XXH64 was that their performance was + * sub-optimal on short lengths. It used an iterative algorithm which strongly + * favored lengths that were a multiple of 4 or 8. + * + * Instead of iterating over individual inputs, we use a set of single shot + * functions which piece together a range of lengths and operate in constant time. + * + * Additionally, the number of multiplies has been significantly reduced. This + * reduces latency, especially when emulating 64-bit multiplies on 32-bit. + * + * Depending on the platform, this may or may not be faster than XXH32, but it + * is almost guaranteed to be faster than XXH64. + */ + +/* + * At very short lengths, there isn't enough input to fully hide secrets, or use + * the entire secret. + * + * There is also only a limited amount of mixing we can do before significantly + * impacting performance. + * + * Therefore, we use different sections of the secret and always mix two secret + * samples with an XOR. This should have no effect on performance on the + * seedless or withSeed variants because everything _should_ be constant folded + * by modern compilers. + * + * The XOR mixing hides individual parts of the secret and increases entropy. + * + * This adds an extra layer of strength for custom secrets. + */ +XXH_FORCE_INLINE XXH_PUREF XXH64_hash_t +XXH3_len_1to3_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(1 <= len && len <= 3); + XXH_ASSERT(secret != NULL); + /* + * len = 1: combined = { input[0], 0x01, input[0], input[0] } + * len = 2: combined = { input[1], 0x02, input[0], input[1] } + * len = 3: combined = { input[2], 0x03, input[0], input[1] } + */ + { xxh_u8 const c1 = input[0]; + xxh_u8 const c2 = input[len >> 1]; + xxh_u8 const c3 = input[len - 1]; + xxh_u32 const combined = ((xxh_u32)c1 << 16) | ((xxh_u32)c2 << 24) + | ((xxh_u32)c3 << 0) | ((xxh_u32)len << 8); + xxh_u64 const bitflip = (XXH_readLE32(secret) ^ XXH_readLE32(secret+4)) + seed; + xxh_u64 const keyed = (xxh_u64)combined ^ bitflip; + return XXH64_avalanche(keyed); + } +} + +XXH_FORCE_INLINE XXH_PUREF XXH64_hash_t +XXH3_len_4to8_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(secret != NULL); + XXH_ASSERT(4 <= len && len <= 8); + seed ^= (xxh_u64)XXH_swap32((xxh_u32)seed) << 32; + { xxh_u32 const input1 = XXH_readLE32(input); + xxh_u32 const input2 = XXH_readLE32(input + len - 4); + xxh_u64 const bitflip = (XXH_readLE64(secret+8) ^ XXH_readLE64(secret+16)) - seed; + xxh_u64 const input64 = input2 + (((xxh_u64)input1) << 32); + xxh_u64 const keyed = input64 ^ bitflip; + return XXH3_rrmxmx(keyed, len); + } +} + +XXH_FORCE_INLINE XXH_PUREF XXH64_hash_t +XXH3_len_9to16_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(secret != NULL); + XXH_ASSERT(9 <= len && len <= 16); + { xxh_u64 const bitflip1 = (XXH_readLE64(secret+24) ^ XXH_readLE64(secret+32)) + seed; + xxh_u64 const bitflip2 = (XXH_readLE64(secret+40) ^ XXH_readLE64(secret+48)) - seed; + xxh_u64 const input_lo = XXH_readLE64(input) ^ bitflip1; + xxh_u64 const input_hi = XXH_readLE64(input + len - 8) ^ bitflip2; + xxh_u64 const acc = len + + XXH_swap64(input_lo) + input_hi + + XXH3_mul128_fold64(input_lo, input_hi); + return XXH3_avalanche(acc); + } +} + +XXH_FORCE_INLINE XXH_PUREF XXH64_hash_t +XXH3_len_0to16_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(len <= 16); + { if (XXH_likely(len > 8)) return XXH3_len_9to16_64b(input, len, secret, seed); + if (XXH_likely(len >= 4)) return XXH3_len_4to8_64b(input, len, secret, seed); + if (len) return XXH3_len_1to3_64b(input, len, secret, seed); + return XXH64_avalanche(seed ^ (XXH_readLE64(secret+56) ^ XXH_readLE64(secret+64))); + } +} + +/* + * DISCLAIMER: There are known *seed-dependent* multicollisions here due to + * multiplication by zero, affecting hashes of lengths 17 to 240. + * + * However, they are very unlikely. + * + * Keep this in mind when using the unseeded XXH3_64bits() variant: As with all + * unseeded non-cryptographic hashes, it does not attempt to defend itself + * against specially crafted inputs, only random inputs. + * + * Compared to classic UMAC where a 1 in 2^31 chance of 4 consecutive bytes + * cancelling out the secret is taken an arbitrary number of times (addressed + * in XXH3_accumulate_512), this collision is very unlikely with random inputs + * and/or proper seeding: + * + * This only has a 1 in 2^63 chance of 8 consecutive bytes cancelling out, in a + * function that is only called up to 16 times per hash with up to 240 bytes of + * input. + * + * This is not too bad for a non-cryptographic hash function, especially with + * only 64 bit outputs. + * + * The 128-bit variant (which trades some speed for strength) is NOT affected + * by this, although it is always a good idea to use a proper seed if you care + * about strength. + */ +XXH_FORCE_INLINE xxh_u64 XXH3_mix16B(const xxh_u8* XXH_RESTRICT input, + const xxh_u8* XXH_RESTRICT secret, xxh_u64 seed64) +{ +#if defined(__GNUC__) && !defined(__clang__) /* GCC, not Clang */ \ + && defined(__i386__) && defined(__SSE2__) /* x86 + SSE2 */ \ + && !defined(XXH_ENABLE_AUTOVECTORIZE) /* Define to disable like XXH32 hack */ + /* + * UGLY HACK: + * GCC for x86 tends to autovectorize the 128-bit multiply, resulting in + * slower code. + * + * By forcing seed64 into a register, we disrupt the cost model and + * cause it to scalarize. See `XXH32_round()` + * + * FIXME: Clang's output is still _much_ faster -- On an AMD Ryzen 3600, + * XXH3_64bits @ len=240 runs at 4.6 GB/s with Clang 9, but 3.3 GB/s on + * GCC 9.2, despite both emitting scalar code. + * + * GCC generates much better scalar code than Clang for the rest of XXH3, + * which is why finding a more optimal codepath is an interest. + */ + XXH_COMPILER_GUARD(seed64); +#endif + { xxh_u64 const input_lo = XXH_readLE64(input); + xxh_u64 const input_hi = XXH_readLE64(input+8); + return XXH3_mul128_fold64( + input_lo ^ (XXH_readLE64(secret) + seed64), + input_hi ^ (XXH_readLE64(secret+8) - seed64) + ); + } +} + +/* For mid range keys, XXH3 uses a Mum-hash variant. */ +XXH_FORCE_INLINE XXH_PUREF XXH64_hash_t +XXH3_len_17to128_64b(const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH64_hash_t seed) +{ + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; + XXH_ASSERT(16 < len && len <= 128); + + { xxh_u64 acc = len * XXH_PRIME64_1; +#if XXH_SIZE_OPT >= 1 + /* Smaller and cleaner, but slightly slower. */ + unsigned int i = (unsigned int)(len - 1) / 32; + do { + acc += XXH3_mix16B(input+16 * i, secret+32*i, seed); + acc += XXH3_mix16B(input+len-16*(i+1), secret+32*i+16, seed); + } while (i-- != 0); +#else + if (len > 32) { + if (len > 64) { + if (len > 96) { + acc += XXH3_mix16B(input+48, secret+96, seed); + acc += XXH3_mix16B(input+len-64, secret+112, seed); + } + acc += XXH3_mix16B(input+32, secret+64, seed); + acc += XXH3_mix16B(input+len-48, secret+80, seed); + } + acc += XXH3_mix16B(input+16, secret+32, seed); + acc += XXH3_mix16B(input+len-32, secret+48, seed); + } + acc += XXH3_mix16B(input+0, secret+0, seed); + acc += XXH3_mix16B(input+len-16, secret+16, seed); +#endif + return XXH3_avalanche(acc); + } +} + +XXH_NO_INLINE XXH_PUREF XXH64_hash_t +XXH3_len_129to240_64b(const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH64_hash_t seed) +{ + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; + XXH_ASSERT(128 < len && len <= XXH3_MIDSIZE_MAX); + + #define XXH3_MIDSIZE_STARTOFFSET 3 + #define XXH3_MIDSIZE_LASTOFFSET 17 + + { xxh_u64 acc = len * XXH_PRIME64_1; + xxh_u64 acc_end; + unsigned int const nbRounds = (unsigned int)len / 16; + unsigned int i; + XXH_ASSERT(128 < len && len <= XXH3_MIDSIZE_MAX); + for (i=0; i<8; i++) { + acc += XXH3_mix16B(input+(16*i), secret+(16*i), seed); + } + /* last bytes */ + acc_end = XXH3_mix16B(input + len - 16, secret + XXH3_SECRET_SIZE_MIN - XXH3_MIDSIZE_LASTOFFSET, seed); + XXH_ASSERT(nbRounds >= 8); + acc = XXH3_avalanche(acc); +#if defined(__clang__) /* Clang */ \ + && (defined(__ARM_NEON) || defined(__ARM_NEON__)) /* NEON */ \ + && !defined(XXH_ENABLE_AUTOVECTORIZE) /* Define to disable */ + /* + * UGLY HACK: + * Clang for ARMv7-A tries to vectorize this loop, similar to GCC x86. + * In everywhere else, it uses scalar code. + * + * For 64->128-bit multiplies, even if the NEON was 100% optimal, it + * would still be slower than UMAAL (see XXH_mult64to128). + * + * Unfortunately, Clang doesn't handle the long multiplies properly and + * converts them to the nonexistent "vmulq_u64" intrinsic, which is then + * scalarized into an ugly mess of VMOV.32 instructions. + * + * This mess is difficult to avoid without turning autovectorization + * off completely, but they are usually relatively minor and/or not + * worth it to fix. + * + * This loop is the easiest to fix, as unlike XXH32, this pragma + * _actually works_ because it is a loop vectorization instead of an + * SLP vectorization. + */ + #pragma clang loop vectorize(disable) +#endif + for (i=8 ; i < nbRounds; i++) { + /* + * Prevents clang for unrolling the acc loop and interleaving with this one. + */ + XXH_COMPILER_GUARD(acc); + acc_end += XXH3_mix16B(input+(16*i), secret+(16*(i-8)) + XXH3_MIDSIZE_STARTOFFSET, seed); + } + return XXH3_avalanche(acc + acc_end); + } +} + + +/* ======= Long Keys ======= */ + +#define XXH_STRIPE_LEN 64 +#define XXH_SECRET_CONSUME_RATE 8 /* nb of secret bytes consumed at each accumulation */ +#define XXH_ACC_NB (XXH_STRIPE_LEN / sizeof(xxh_u64)) + +#ifdef XXH_OLD_NAMES +# define STRIPE_LEN XXH_STRIPE_LEN +# define ACC_NB XXH_ACC_NB +#endif + +#ifndef XXH_PREFETCH_DIST +# ifdef __clang__ +# define XXH_PREFETCH_DIST 320 +# else +# if (XXH_VECTOR == XXH_AVX512) +# define XXH_PREFETCH_DIST 512 +# else +# define XXH_PREFETCH_DIST 384 +# endif +# endif /* __clang__ */ +#endif /* XXH_PREFETCH_DIST */ + +/* + * These macros are to generate an XXH3_accumulate() function. + * The two arguments select the name suffix and target attribute. + * + * The name of this symbol is XXH3_accumulate_() and it calls + * XXH3_accumulate_512_(). + * + * It may be useful to hand implement this function if the compiler fails to + * optimize the inline function. + */ +#define XXH3_ACCUMULATE_TEMPLATE(name) \ +void \ +XXH3_accumulate_##name(xxh_u64* XXH_RESTRICT acc, \ + const xxh_u8* XXH_RESTRICT input, \ + const xxh_u8* XXH_RESTRICT secret, \ + size_t nbStripes) \ +{ \ + size_t n; \ + for (n = 0; n < nbStripes; n++ ) { \ + const xxh_u8* const in = input + n*XXH_STRIPE_LEN; \ + XXH_PREFETCH(in + XXH_PREFETCH_DIST); \ + XXH3_accumulate_512_##name( \ + acc, \ + in, \ + secret + n*XXH_SECRET_CONSUME_RATE); \ + } \ +} + + +XXH_FORCE_INLINE void XXH_writeLE64(void* dst, xxh_u64 v64) +{ + if (!XXH_CPU_LITTLE_ENDIAN) v64 = XXH_swap64(v64); + XXH_memcpy(dst, &v64, sizeof(v64)); +} + +/* Several intrinsic functions below are supposed to accept __int64 as argument, + * as documented in https://software.intel.com/sites/landingpage/IntrinsicsGuide/ . + * However, several environments do not define __int64 type, + * requiring a workaround. + */ +#if !defined (__VMS) \ + && (defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) + typedef int64_t xxh_i64; +#else + /* the following type must have a width of 64-bit */ + typedef long long xxh_i64; +#endif + + +/* + * XXH3_accumulate_512 is the tightest loop for long inputs, and it is the most optimized. + * + * It is a hardened version of UMAC, based off of FARSH's implementation. + * + * This was chosen because it adapts quite well to 32-bit, 64-bit, and SIMD + * implementations, and it is ridiculously fast. + * + * We harden it by mixing the original input to the accumulators as well as the product. + * + * This means that in the (relatively likely) case of a multiply by zero, the + * original input is preserved. + * + * On 128-bit inputs, we swap 64-bit pairs when we add the input to improve + * cross-pollination, as otherwise the upper and lower halves would be + * essentially independent. + * + * This doesn't matter on 64-bit hashes since they all get merged together in + * the end, so we skip the extra step. + * + * Both XXH3_64bits and XXH3_128bits use this subroutine. + */ + +#if (XXH_VECTOR == XXH_AVX512) \ + || (defined(XXH_DISPATCH_AVX512) && XXH_DISPATCH_AVX512 != 0) + +#ifndef XXH_TARGET_AVX512 +# define XXH_TARGET_AVX512 /* disable attribute target */ +#endif + +XXH_FORCE_INLINE XXH_TARGET_AVX512 void +XXH3_accumulate_512_avx512(void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + __m512i* const xacc = (__m512i *) acc; + XXH_ASSERT((((size_t)acc) & 63) == 0); + XXH_STATIC_ASSERT(XXH_STRIPE_LEN == sizeof(__m512i)); + + { + /* data_vec = input[0]; */ + __m512i const data_vec = _mm512_loadu_si512 (input); + /* key_vec = secret[0]; */ + __m512i const key_vec = _mm512_loadu_si512 (secret); + /* data_key = data_vec ^ key_vec; */ + __m512i const data_key = _mm512_xor_si512 (data_vec, key_vec); + /* data_key_lo = data_key >> 32; */ + __m512i const data_key_lo = _mm512_srli_epi64 (data_key, 32); + /* product = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */ + __m512i const product = _mm512_mul_epu32 (data_key, data_key_lo); + /* xacc[0] += swap(data_vec); */ + __m512i const data_swap = _mm512_shuffle_epi32(data_vec, (_MM_PERM_ENUM)_MM_SHUFFLE(1, 0, 3, 2)); + __m512i const sum = _mm512_add_epi64(*xacc, data_swap); + /* xacc[0] += product; */ + *xacc = _mm512_add_epi64(product, sum); + } +} +XXH_FORCE_INLINE XXH_TARGET_AVX512 XXH3_ACCUMULATE_TEMPLATE(avx512) + +/* + * XXH3_scrambleAcc: Scrambles the accumulators to improve mixing. + * + * Multiplication isn't perfect, as explained by Google in HighwayHash: + * + * // Multiplication mixes/scrambles bytes 0-7 of the 64-bit result to + * // varying degrees. In descending order of goodness, bytes + * // 3 4 2 5 1 6 0 7 have quality 228 224 164 160 100 96 36 32. + * // As expected, the upper and lower bytes are much worse. + * + * Source: https://github.com/google/highwayhash/blob/0aaf66b/highwayhash/hh_avx2.h#L291 + * + * Since our algorithm uses a pseudorandom secret to add some variance into the + * mix, we don't need to (or want to) mix as often or as much as HighwayHash does. + * + * This isn't as tight as XXH3_accumulate, but still written in SIMD to avoid + * extraction. + * + * Both XXH3_64bits and XXH3_128bits use this subroutine. + */ + +XXH_FORCE_INLINE XXH_TARGET_AVX512 void +XXH3_scrambleAcc_avx512(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 63) == 0); + XXH_STATIC_ASSERT(XXH_STRIPE_LEN == sizeof(__m512i)); + { __m512i* const xacc = (__m512i*) acc; + const __m512i prime32 = _mm512_set1_epi32((int)XXH_PRIME32_1); + + /* xacc[0] ^= (xacc[0] >> 47) */ + __m512i const acc_vec = *xacc; + __m512i const shifted = _mm512_srli_epi64 (acc_vec, 47); + /* xacc[0] ^= secret; */ + __m512i const key_vec = _mm512_loadu_si512 (secret); + __m512i const data_key = _mm512_ternarylogic_epi32(key_vec, acc_vec, shifted, 0x96 /* key_vec ^ acc_vec ^ shifted */); + + /* xacc[0] *= XXH_PRIME32_1; */ + __m512i const data_key_hi = _mm512_srli_epi64 (data_key, 32); + __m512i const prod_lo = _mm512_mul_epu32 (data_key, prime32); + __m512i const prod_hi = _mm512_mul_epu32 (data_key_hi, prime32); + *xacc = _mm512_add_epi64(prod_lo, _mm512_slli_epi64(prod_hi, 32)); + } +} + +XXH_FORCE_INLINE XXH_TARGET_AVX512 void +XXH3_initCustomSecret_avx512(void* XXH_RESTRICT customSecret, xxh_u64 seed64) +{ + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 63) == 0); + XXH_STATIC_ASSERT(XXH_SEC_ALIGN == 64); + XXH_ASSERT(((size_t)customSecret & 63) == 0); + (void)(&XXH_writeLE64); + { int const nbRounds = XXH_SECRET_DEFAULT_SIZE / sizeof(__m512i); + __m512i const seed_pos = _mm512_set1_epi64((xxh_i64)seed64); + __m512i const seed = _mm512_mask_sub_epi64(seed_pos, 0xAA, _mm512_set1_epi8(0), seed_pos); + + const __m512i* const src = (const __m512i*) ((const void*) XXH3_kSecret); + __m512i* const dest = ( __m512i*) customSecret; + int i; + XXH_ASSERT(((size_t)src & 63) == 0); /* control alignment */ + XXH_ASSERT(((size_t)dest & 63) == 0); + for (i=0; i < nbRounds; ++i) { + dest[i] = _mm512_add_epi64(_mm512_load_si512(src + i), seed); + } } +} + +#endif + +#if (XXH_VECTOR == XXH_AVX2) \ + || (defined(XXH_DISPATCH_AVX2) && XXH_DISPATCH_AVX2 != 0) + +#ifndef XXH_TARGET_AVX2 +# define XXH_TARGET_AVX2 /* disable attribute target */ +#endif + +XXH_FORCE_INLINE XXH_TARGET_AVX2 void +XXH3_accumulate_512_avx2( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 31) == 0); + { __m256i* const xacc = (__m256i *) acc; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm256_loadu_si256 requires a const __m256i * pointer for some reason. */ + const __m256i* const xinput = (const __m256i *) input; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm256_loadu_si256 requires a const __m256i * pointer for some reason. */ + const __m256i* const xsecret = (const __m256i *) secret; + + size_t i; + for (i=0; i < XXH_STRIPE_LEN/sizeof(__m256i); i++) { + /* data_vec = xinput[i]; */ + __m256i const data_vec = _mm256_loadu_si256 (xinput+i); + /* key_vec = xsecret[i]; */ + __m256i const key_vec = _mm256_loadu_si256 (xsecret+i); + /* data_key = data_vec ^ key_vec; */ + __m256i const data_key = _mm256_xor_si256 (data_vec, key_vec); + /* data_key_lo = data_key >> 32; */ + __m256i const data_key_lo = _mm256_srli_epi64 (data_key, 32); + /* product = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */ + __m256i const product = _mm256_mul_epu32 (data_key, data_key_lo); + /* xacc[i] += swap(data_vec); */ + __m256i const data_swap = _mm256_shuffle_epi32(data_vec, _MM_SHUFFLE(1, 0, 3, 2)); + __m256i const sum = _mm256_add_epi64(xacc[i], data_swap); + /* xacc[i] += product; */ + xacc[i] = _mm256_add_epi64(product, sum); + } } +} +XXH_FORCE_INLINE XXH_TARGET_AVX2 XXH3_ACCUMULATE_TEMPLATE(avx2) + +XXH_FORCE_INLINE XXH_TARGET_AVX2 void +XXH3_scrambleAcc_avx2(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 31) == 0); + { __m256i* const xacc = (__m256i*) acc; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm256_loadu_si256 requires a const __m256i * pointer for some reason. */ + const __m256i* const xsecret = (const __m256i *) secret; + const __m256i prime32 = _mm256_set1_epi32((int)XXH_PRIME32_1); + + size_t i; + for (i=0; i < XXH_STRIPE_LEN/sizeof(__m256i); i++) { + /* xacc[i] ^= (xacc[i] >> 47) */ + __m256i const acc_vec = xacc[i]; + __m256i const shifted = _mm256_srli_epi64 (acc_vec, 47); + __m256i const data_vec = _mm256_xor_si256 (acc_vec, shifted); + /* xacc[i] ^= xsecret; */ + __m256i const key_vec = _mm256_loadu_si256 (xsecret+i); + __m256i const data_key = _mm256_xor_si256 (data_vec, key_vec); + + /* xacc[i] *= XXH_PRIME32_1; */ + __m256i const data_key_hi = _mm256_srli_epi64 (data_key, 32); + __m256i const prod_lo = _mm256_mul_epu32 (data_key, prime32); + __m256i const prod_hi = _mm256_mul_epu32 (data_key_hi, prime32); + xacc[i] = _mm256_add_epi64(prod_lo, _mm256_slli_epi64(prod_hi, 32)); + } + } +} + +XXH_FORCE_INLINE XXH_TARGET_AVX2 void XXH3_initCustomSecret_avx2(void* XXH_RESTRICT customSecret, xxh_u64 seed64) +{ + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 31) == 0); + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE / sizeof(__m256i)) == 6); + XXH_STATIC_ASSERT(XXH_SEC_ALIGN <= 64); + (void)(&XXH_writeLE64); + XXH_PREFETCH(customSecret); + { __m256i const seed = _mm256_set_epi64x((xxh_i64)(0U - seed64), (xxh_i64)seed64, (xxh_i64)(0U - seed64), (xxh_i64)seed64); + + const __m256i* const src = (const __m256i*) ((const void*) XXH3_kSecret); + __m256i* dest = ( __m256i*) customSecret; + +# if defined(__GNUC__) || defined(__clang__) + /* + * On GCC & Clang, marking 'dest' as modified will cause the compiler: + * - do not extract the secret from sse registers in the internal loop + * - use less common registers, and avoid pushing these reg into stack + */ + XXH_COMPILER_GUARD(dest); +# endif + XXH_ASSERT(((size_t)src & 31) == 0); /* control alignment */ + XXH_ASSERT(((size_t)dest & 31) == 0); + + /* GCC -O2 need unroll loop manually */ + dest[0] = _mm256_add_epi64(_mm256_load_si256(src+0), seed); + dest[1] = _mm256_add_epi64(_mm256_load_si256(src+1), seed); + dest[2] = _mm256_add_epi64(_mm256_load_si256(src+2), seed); + dest[3] = _mm256_add_epi64(_mm256_load_si256(src+3), seed); + dest[4] = _mm256_add_epi64(_mm256_load_si256(src+4), seed); + dest[5] = _mm256_add_epi64(_mm256_load_si256(src+5), seed); + } +} + +#endif + +/* x86dispatch always generates SSE2 */ +#if (XXH_VECTOR == XXH_SSE2) || defined(XXH_X86DISPATCH) + +#ifndef XXH_TARGET_SSE2 +# define XXH_TARGET_SSE2 /* disable attribute target */ +#endif + +XXH_FORCE_INLINE XXH_TARGET_SSE2 void +XXH3_accumulate_512_sse2( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + /* SSE2 is just a half-scale version of the AVX2 version. */ + XXH_ASSERT((((size_t)acc) & 15) == 0); + { __m128i* const xacc = (__m128i *) acc; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */ + const __m128i* const xinput = (const __m128i *) input; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */ + const __m128i* const xsecret = (const __m128i *) secret; + + size_t i; + for (i=0; i < XXH_STRIPE_LEN/sizeof(__m128i); i++) { + /* data_vec = xinput[i]; */ + __m128i const data_vec = _mm_loadu_si128 (xinput+i); + /* key_vec = xsecret[i]; */ + __m128i const key_vec = _mm_loadu_si128 (xsecret+i); + /* data_key = data_vec ^ key_vec; */ + __m128i const data_key = _mm_xor_si128 (data_vec, key_vec); + /* data_key_lo = data_key >> 32; */ + __m128i const data_key_lo = _mm_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1)); + /* product = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */ + __m128i const product = _mm_mul_epu32 (data_key, data_key_lo); + /* xacc[i] += swap(data_vec); */ + __m128i const data_swap = _mm_shuffle_epi32(data_vec, _MM_SHUFFLE(1,0,3,2)); + __m128i const sum = _mm_add_epi64(xacc[i], data_swap); + /* xacc[i] += product; */ + xacc[i] = _mm_add_epi64(product, sum); + } } +} +XXH_FORCE_INLINE XXH_TARGET_SSE2 XXH3_ACCUMULATE_TEMPLATE(sse2) + +XXH_FORCE_INLINE XXH_TARGET_SSE2 void +XXH3_scrambleAcc_sse2(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 15) == 0); + { __m128i* const xacc = (__m128i*) acc; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */ + const __m128i* const xsecret = (const __m128i *) secret; + const __m128i prime32 = _mm_set1_epi32((int)XXH_PRIME32_1); + + size_t i; + for (i=0; i < XXH_STRIPE_LEN/sizeof(__m128i); i++) { + /* xacc[i] ^= (xacc[i] >> 47) */ + __m128i const acc_vec = xacc[i]; + __m128i const shifted = _mm_srli_epi64 (acc_vec, 47); + __m128i const data_vec = _mm_xor_si128 (acc_vec, shifted); + /* xacc[i] ^= xsecret[i]; */ + __m128i const key_vec = _mm_loadu_si128 (xsecret+i); + __m128i const data_key = _mm_xor_si128 (data_vec, key_vec); + + /* xacc[i] *= XXH_PRIME32_1; */ + __m128i const data_key_hi = _mm_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1)); + __m128i const prod_lo = _mm_mul_epu32 (data_key, prime32); + __m128i const prod_hi = _mm_mul_epu32 (data_key_hi, prime32); + xacc[i] = _mm_add_epi64(prod_lo, _mm_slli_epi64(prod_hi, 32)); + } + } +} + +XXH_FORCE_INLINE XXH_TARGET_SSE2 void XXH3_initCustomSecret_sse2(void* XXH_RESTRICT customSecret, xxh_u64 seed64) +{ + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 15) == 0); + (void)(&XXH_writeLE64); + { int const nbRounds = XXH_SECRET_DEFAULT_SIZE / sizeof(__m128i); + +# if defined(_MSC_VER) && defined(_M_IX86) && _MSC_VER < 1900 + /* MSVC 32bit mode does not support _mm_set_epi64x before 2015 */ + XXH_ALIGN(16) const xxh_i64 seed64x2[2] = { (xxh_i64)seed64, (xxh_i64)(0U - seed64) }; + __m128i const seed = _mm_load_si128((__m128i const*)seed64x2); +# else + __m128i const seed = _mm_set_epi64x((xxh_i64)(0U - seed64), (xxh_i64)seed64); +# endif + int i; + + const void* const src16 = XXH3_kSecret; + __m128i* dst16 = (__m128i*) customSecret; +# if defined(__GNUC__) || defined(__clang__) + /* + * On GCC & Clang, marking 'dest' as modified will cause the compiler: + * - do not extract the secret from sse registers in the internal loop + * - use less common registers, and avoid pushing these reg into stack + */ + XXH_COMPILER_GUARD(dst16); +# endif + XXH_ASSERT(((size_t)src16 & 15) == 0); /* control alignment */ + XXH_ASSERT(((size_t)dst16 & 15) == 0); + + for (i=0; i < nbRounds; ++i) { + dst16[i] = _mm_add_epi64(_mm_load_si128((const __m128i *)src16+i), seed); + } } +} + +#endif + +#if (XXH_VECTOR == XXH_NEON) + +/* forward declarations for the scalar routines */ +XXH_FORCE_INLINE void +XXH3_scalarRound(void* XXH_RESTRICT acc, void const* XXH_RESTRICT input, + void const* XXH_RESTRICT secret, size_t lane); + +XXH_FORCE_INLINE void +XXH3_scalarScrambleRound(void* XXH_RESTRICT acc, + void const* XXH_RESTRICT secret, size_t lane); + +/*! + * @internal + * @brief The bulk processing loop for NEON and WASM SIMD128. + * + * The NEON code path is actually partially scalar when running on AArch64. This + * is to optimize the pipelining and can have up to 15% speedup depending on the + * CPU, and it also mitigates some GCC codegen issues. + * + * @see XXH3_NEON_LANES for configuring this and details about this optimization. + * + * NEON's 32-bit to 64-bit long multiply takes a half vector of 32-bit + * integers instead of the other platforms which mask full 64-bit vectors, + * so the setup is more complicated than just shifting right. + * + * Additionally, there is an optimization for 4 lanes at once noted below. + * + * Since, as stated, the most optimal amount of lanes for Cortexes is 6, + * there needs to be *three* versions of the accumulate operation used + * for the remaining 2 lanes. + * + * WASM's SIMD128 uses SIMDe's arm_neon.h polyfill because the intrinsics overlap + * nearly perfectly. + */ + +XXH_FORCE_INLINE void +XXH3_accumulate_512_neon( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 15) == 0); + XXH_STATIC_ASSERT(XXH3_NEON_LANES > 0 && XXH3_NEON_LANES <= XXH_ACC_NB && XXH3_NEON_LANES % 2 == 0); + { /* GCC for darwin arm64 does not like aliasing here */ + xxh_aliasing_uint64x2_t* const xacc = (xxh_aliasing_uint64x2_t*) acc; + /* We don't use a uint32x4_t pointer because it causes bus errors on ARMv7. */ + uint8_t const* xinput = (const uint8_t *) input; + uint8_t const* xsecret = (const uint8_t *) secret; + + size_t i; +#ifdef __wasm_simd128__ + /* + * On WASM SIMD128, Clang emits direct address loads when XXH3_kSecret + * is constant propagated, which results in it converting it to this + * inside the loop: + * + * a = v128.load(XXH3_kSecret + 0 + $secret_offset, offset = 0) + * b = v128.load(XXH3_kSecret + 16 + $secret_offset, offset = 0) + * ... + * + * This requires a full 32-bit address immediate (and therefore a 6 byte + * instruction) as well as an add for each offset. + * + * Putting an asm guard prevents it from folding (at the cost of losing + * the alignment hint), and uses the free offset in `v128.load` instead + * of adding secret_offset each time which overall reduces code size by + * about a kilobyte and improves performance. + */ + XXH_COMPILER_GUARD(xsecret); +#endif + /* Scalar lanes use the normal scalarRound routine */ + for (i = XXH3_NEON_LANES; i < XXH_ACC_NB; i++) { + XXH3_scalarRound(acc, input, secret, i); + } + i = 0; + /* 4 NEON lanes at a time. */ + for (; i+1 < XXH3_NEON_LANES / 2; i+=2) { + /* data_vec = xinput[i]; */ + uint64x2_t data_vec_1 = XXH_vld1q_u64(xinput + (i * 16)); + uint64x2_t data_vec_2 = XXH_vld1q_u64(xinput + ((i+1) * 16)); + /* key_vec = xsecret[i]; */ + uint64x2_t key_vec_1 = XXH_vld1q_u64(xsecret + (i * 16)); + uint64x2_t key_vec_2 = XXH_vld1q_u64(xsecret + ((i+1) * 16)); + /* data_swap = swap(data_vec) */ + uint64x2_t data_swap_1 = vextq_u64(data_vec_1, data_vec_1, 1); + uint64x2_t data_swap_2 = vextq_u64(data_vec_2, data_vec_2, 1); + /* data_key = data_vec ^ key_vec; */ + uint64x2_t data_key_1 = veorq_u64(data_vec_1, key_vec_1); + uint64x2_t data_key_2 = veorq_u64(data_vec_2, key_vec_2); + + /* + * If we reinterpret the 64x2 vectors as 32x4 vectors, we can use a + * de-interleave operation for 4 lanes in 1 step with `vuzpq_u32` to + * get one vector with the low 32 bits of each lane, and one vector + * with the high 32 bits of each lane. + * + * The intrinsic returns a double vector because the original ARMv7-a + * instruction modified both arguments in place. AArch64 and SIMD128 emit + * two instructions from this intrinsic. + * + * [ dk11L | dk11H | dk12L | dk12H ] -> [ dk11L | dk12L | dk21L | dk22L ] + * [ dk21L | dk21H | dk22L | dk22H ] -> [ dk11H | dk12H | dk21H | dk22H ] + */ + uint32x4x2_t unzipped = vuzpq_u32( + vreinterpretq_u32_u64(data_key_1), + vreinterpretq_u32_u64(data_key_2) + ); + /* data_key_lo = data_key & 0xFFFFFFFF */ + uint32x4_t data_key_lo = unzipped.val[0]; + /* data_key_hi = data_key >> 32 */ + uint32x4_t data_key_hi = unzipped.val[1]; + /* + * Then, we can split the vectors horizontally and multiply which, as for most + * widening intrinsics, have a variant that works on both high half vectors + * for free on AArch64. A similar instruction is available on SIMD128. + * + * sum = data_swap + (u64x2) data_key_lo * (u64x2) data_key_hi + */ + uint64x2_t sum_1 = XXH_vmlal_low_u32(data_swap_1, data_key_lo, data_key_hi); + uint64x2_t sum_2 = XXH_vmlal_high_u32(data_swap_2, data_key_lo, data_key_hi); + /* + * Clang reorders + * a += b * c; // umlal swap.2d, dkl.2s, dkh.2s + * c += a; // add acc.2d, acc.2d, swap.2d + * to + * c += a; // add acc.2d, acc.2d, swap.2d + * c += b * c; // umlal acc.2d, dkl.2s, dkh.2s + * + * While it would make sense in theory since the addition is faster, + * for reasons likely related to umlal being limited to certain NEON + * pipelines, this is worse. A compiler guard fixes this. + */ + XXH_COMPILER_GUARD_CLANG_NEON(sum_1); + XXH_COMPILER_GUARD_CLANG_NEON(sum_2); + /* xacc[i] = acc_vec + sum; */ + xacc[i] = vaddq_u64(xacc[i], sum_1); + xacc[i+1] = vaddq_u64(xacc[i+1], sum_2); + } + /* Operate on the remaining NEON lanes 2 at a time. */ + for (; i < XXH3_NEON_LANES / 2; i++) { + /* data_vec = xinput[i]; */ + uint64x2_t data_vec = XXH_vld1q_u64(xinput + (i * 16)); + /* key_vec = xsecret[i]; */ + uint64x2_t key_vec = XXH_vld1q_u64(xsecret + (i * 16)); + /* acc_vec_2 = swap(data_vec) */ + uint64x2_t data_swap = vextq_u64(data_vec, data_vec, 1); + /* data_key = data_vec ^ key_vec; */ + uint64x2_t data_key = veorq_u64(data_vec, key_vec); + /* For two lanes, just use VMOVN and VSHRN. */ + /* data_key_lo = data_key & 0xFFFFFFFF; */ + uint32x2_t data_key_lo = vmovn_u64(data_key); + /* data_key_hi = data_key >> 32; */ + uint32x2_t data_key_hi = vshrn_n_u64(data_key, 32); + /* sum = data_swap + (u64x2) data_key_lo * (u64x2) data_key_hi; */ + uint64x2_t sum = vmlal_u32(data_swap, data_key_lo, data_key_hi); + /* Same Clang workaround as before */ + XXH_COMPILER_GUARD_CLANG_NEON(sum); + /* xacc[i] = acc_vec + sum; */ + xacc[i] = vaddq_u64 (xacc[i], sum); + } + } +} +XXH_FORCE_INLINE XXH3_ACCUMULATE_TEMPLATE(neon) + +XXH_FORCE_INLINE void +XXH3_scrambleAcc_neon(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 15) == 0); + + { xxh_aliasing_uint64x2_t* xacc = (xxh_aliasing_uint64x2_t*) acc; + uint8_t const* xsecret = (uint8_t const*) secret; + + size_t i; + /* WASM uses operator overloads and doesn't need these. */ +#ifndef __wasm_simd128__ + /* { prime32_1, prime32_1 } */ + uint32x2_t const kPrimeLo = vdup_n_u32(XXH_PRIME32_1); + /* { 0, prime32_1, 0, prime32_1 } */ + uint32x4_t const kPrimeHi = vreinterpretq_u32_u64(vdupq_n_u64((xxh_u64)XXH_PRIME32_1 << 32)); +#endif + + /* AArch64 uses both scalar and neon at the same time */ + for (i = XXH3_NEON_LANES; i < XXH_ACC_NB; i++) { + XXH3_scalarScrambleRound(acc, secret, i); + } + for (i=0; i < XXH3_NEON_LANES / 2; i++) { + /* xacc[i] ^= (xacc[i] >> 47); */ + uint64x2_t acc_vec = xacc[i]; + uint64x2_t shifted = vshrq_n_u64(acc_vec, 47); + uint64x2_t data_vec = veorq_u64(acc_vec, shifted); + + /* xacc[i] ^= xsecret[i]; */ + uint64x2_t key_vec = XXH_vld1q_u64(xsecret + (i * 16)); + uint64x2_t data_key = veorq_u64(data_vec, key_vec); + /* xacc[i] *= XXH_PRIME32_1 */ +#ifdef __wasm_simd128__ + /* SIMD128 has multiply by u64x2, use it instead of expanding and scalarizing */ + xacc[i] = data_key * XXH_PRIME32_1; +#else + /* + * Expanded version with portable NEON intrinsics + * + * lo(x) * lo(y) + (hi(x) * lo(y) << 32) + * + * prod_hi = hi(data_key) * lo(prime) << 32 + * + * Since we only need 32 bits of this multiply a trick can be used, reinterpreting the vector + * as a uint32x4_t and multiplying by { 0, prime, 0, prime } to cancel out the unwanted bits + * and avoid the shift. + */ + uint32x4_t prod_hi = vmulq_u32 (vreinterpretq_u32_u64(data_key), kPrimeHi); + /* Extract low bits for vmlal_u32 */ + uint32x2_t data_key_lo = vmovn_u64(data_key); + /* xacc[i] = prod_hi + lo(data_key) * XXH_PRIME32_1; */ + xacc[i] = vmlal_u32(vreinterpretq_u64_u32(prod_hi), data_key_lo, kPrimeLo); +#endif + } + } +} +#endif + +#if (XXH_VECTOR == XXH_VSX) + +XXH_FORCE_INLINE void +XXH3_accumulate_512_vsx( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + /* presumed aligned */ + xxh_aliasing_u64x2* const xacc = (xxh_aliasing_u64x2*) acc; + xxh_u8 const* const xinput = (xxh_u8 const*) input; /* no alignment restriction */ + xxh_u8 const* const xsecret = (xxh_u8 const*) secret; /* no alignment restriction */ + xxh_u64x2 const v32 = { 32, 32 }; + size_t i; + for (i = 0; i < XXH_STRIPE_LEN / sizeof(xxh_u64x2); i++) { + /* data_vec = xinput[i]; */ + xxh_u64x2 const data_vec = XXH_vec_loadu(xinput + 16*i); + /* key_vec = xsecret[i]; */ + xxh_u64x2 const key_vec = XXH_vec_loadu(xsecret + 16*i); + xxh_u64x2 const data_key = data_vec ^ key_vec; + /* shuffled = (data_key << 32) | (data_key >> 32); */ + xxh_u32x4 const shuffled = (xxh_u32x4)vec_rl(data_key, v32); + /* product = ((xxh_u64x2)data_key & 0xFFFFFFFF) * ((xxh_u64x2)shuffled & 0xFFFFFFFF); */ + xxh_u64x2 const product = XXH_vec_mulo((xxh_u32x4)data_key, shuffled); + /* acc_vec = xacc[i]; */ + xxh_u64x2 acc_vec = xacc[i]; + acc_vec += product; + + /* swap high and low halves */ +#ifdef __s390x__ + acc_vec += vec_permi(data_vec, data_vec, 2); +#else + acc_vec += vec_xxpermdi(data_vec, data_vec, 2); +#endif + xacc[i] = acc_vec; + } +} +XXH_FORCE_INLINE XXH3_ACCUMULATE_TEMPLATE(vsx) + +XXH_FORCE_INLINE void +XXH3_scrambleAcc_vsx(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 15) == 0); + + { xxh_aliasing_u64x2* const xacc = (xxh_aliasing_u64x2*) acc; + const xxh_u8* const xsecret = (const xxh_u8*) secret; + /* constants */ + xxh_u64x2 const v32 = { 32, 32 }; + xxh_u64x2 const v47 = { 47, 47 }; + xxh_u32x4 const prime = { XXH_PRIME32_1, XXH_PRIME32_1, XXH_PRIME32_1, XXH_PRIME32_1 }; + size_t i; + for (i = 0; i < XXH_STRIPE_LEN / sizeof(xxh_u64x2); i++) { + /* xacc[i] ^= (xacc[i] >> 47); */ + xxh_u64x2 const acc_vec = xacc[i]; + xxh_u64x2 const data_vec = acc_vec ^ (acc_vec >> v47); + + /* xacc[i] ^= xsecret[i]; */ + xxh_u64x2 const key_vec = XXH_vec_loadu(xsecret + 16*i); + xxh_u64x2 const data_key = data_vec ^ key_vec; + + /* xacc[i] *= XXH_PRIME32_1 */ + /* prod_lo = ((xxh_u64x2)data_key & 0xFFFFFFFF) * ((xxh_u64x2)prime & 0xFFFFFFFF); */ + xxh_u64x2 const prod_even = XXH_vec_mule((xxh_u32x4)data_key, prime); + /* prod_hi = ((xxh_u64x2)data_key >> 32) * ((xxh_u64x2)prime >> 32); */ + xxh_u64x2 const prod_odd = XXH_vec_mulo((xxh_u32x4)data_key, prime); + xacc[i] = prod_odd + (prod_even << v32); + } } +} + +#endif + +#if (XXH_VECTOR == XXH_SVE) + +XXH_FORCE_INLINE void +XXH3_accumulate_512_sve( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + uint64_t *xacc = (uint64_t *)acc; + const uint64_t *xinput = (const uint64_t *)(const void *)input; + const uint64_t *xsecret = (const uint64_t *)(const void *)secret; + svuint64_t kSwap = sveor_n_u64_z(svptrue_b64(), svindex_u64(0, 1), 1); + uint64_t element_count = svcntd(); + if (element_count >= 8) { + svbool_t mask = svptrue_pat_b64(SV_VL8); + svuint64_t vacc = svld1_u64(mask, xacc); + ACCRND(vacc, 0); + svst1_u64(mask, xacc, vacc); + } else if (element_count == 2) { /* sve128 */ + svbool_t mask = svptrue_pat_b64(SV_VL2); + svuint64_t acc0 = svld1_u64(mask, xacc + 0); + svuint64_t acc1 = svld1_u64(mask, xacc + 2); + svuint64_t acc2 = svld1_u64(mask, xacc + 4); + svuint64_t acc3 = svld1_u64(mask, xacc + 6); + ACCRND(acc0, 0); + ACCRND(acc1, 2); + ACCRND(acc2, 4); + ACCRND(acc3, 6); + svst1_u64(mask, xacc + 0, acc0); + svst1_u64(mask, xacc + 2, acc1); + svst1_u64(mask, xacc + 4, acc2); + svst1_u64(mask, xacc + 6, acc3); + } else { + svbool_t mask = svptrue_pat_b64(SV_VL4); + svuint64_t acc0 = svld1_u64(mask, xacc + 0); + svuint64_t acc1 = svld1_u64(mask, xacc + 4); + ACCRND(acc0, 0); + ACCRND(acc1, 4); + svst1_u64(mask, xacc + 0, acc0); + svst1_u64(mask, xacc + 4, acc1); + } +} + +XXH_FORCE_INLINE void +XXH3_accumulate_sve(xxh_u64* XXH_RESTRICT acc, + const xxh_u8* XXH_RESTRICT input, + const xxh_u8* XXH_RESTRICT secret, + size_t nbStripes) +{ + if (nbStripes != 0) { + uint64_t *xacc = (uint64_t *)acc; + const uint64_t *xinput = (const uint64_t *)(const void *)input; + const uint64_t *xsecret = (const uint64_t *)(const void *)secret; + svuint64_t kSwap = sveor_n_u64_z(svptrue_b64(), svindex_u64(0, 1), 1); + uint64_t element_count = svcntd(); + if (element_count >= 8) { + svbool_t mask = svptrue_pat_b64(SV_VL8); + svuint64_t vacc = svld1_u64(mask, xacc + 0); + do { + /* svprfd(svbool_t, void *, enum svfprop); */ + svprfd(mask, xinput + 128, SV_PLDL1STRM); + ACCRND(vacc, 0); + xinput += 8; + xsecret += 1; + nbStripes--; + } while (nbStripes != 0); + + svst1_u64(mask, xacc + 0, vacc); + } else if (element_count == 2) { /* sve128 */ + svbool_t mask = svptrue_pat_b64(SV_VL2); + svuint64_t acc0 = svld1_u64(mask, xacc + 0); + svuint64_t acc1 = svld1_u64(mask, xacc + 2); + svuint64_t acc2 = svld1_u64(mask, xacc + 4); + svuint64_t acc3 = svld1_u64(mask, xacc + 6); + do { + svprfd(mask, xinput + 128, SV_PLDL1STRM); + ACCRND(acc0, 0); + ACCRND(acc1, 2); + ACCRND(acc2, 4); + ACCRND(acc3, 6); + xinput += 8; + xsecret += 1; + nbStripes--; + } while (nbStripes != 0); + + svst1_u64(mask, xacc + 0, acc0); + svst1_u64(mask, xacc + 2, acc1); + svst1_u64(mask, xacc + 4, acc2); + svst1_u64(mask, xacc + 6, acc3); + } else { + svbool_t mask = svptrue_pat_b64(SV_VL4); + svuint64_t acc0 = svld1_u64(mask, xacc + 0); + svuint64_t acc1 = svld1_u64(mask, xacc + 4); + do { + svprfd(mask, xinput + 128, SV_PLDL1STRM); + ACCRND(acc0, 0); + ACCRND(acc1, 4); + xinput += 8; + xsecret += 1; + nbStripes--; + } while (nbStripes != 0); + + svst1_u64(mask, xacc + 0, acc0); + svst1_u64(mask, xacc + 4, acc1); + } + } +} + +#endif + +#if (XXH_VECTOR == XXH_LSX) +#define _LSX_SHUFFLE(z, y, x, w) (((z) << 6) | ((y) << 4) | ((x) << 2) | (w)) + +XXH_FORCE_INLINE void +XXH3_accumulate_512_lsx( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 15) == 0); + { + __m128i* const xacc = (__m128i *) acc; + const __m128i* const xinput = (const __m128i *) input; + const __m128i* const xsecret = (const __m128i *) secret; + + for (size_t i = 0; i < XXH_STRIPE_LEN / sizeof(__m128i); i++) { + /* data_vec = xinput[i]; */ + __m128i const data_vec = __lsx_vld(xinput + i, 0); + /* key_vec = xsecret[i]; */ + __m128i const key_vec = __lsx_vld(xsecret + i, 0); + /* data_key = data_vec ^ key_vec; */ + __m128i const data_key = __lsx_vxor_v(data_vec, key_vec); + /* data_key_lo = data_key >> 32; */ + __m128i const data_key_lo = __lsx_vsrli_d(data_key, 32); + // __m128i const data_key_lo = __lsx_vsrli_d(data_key, 32); + /* product = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */ + __m128i const product = __lsx_vmulwev_d_wu(data_key, data_key_lo); + /* xacc[i] += swap(data_vec); */ + __m128i const data_swap = __lsx_vshuf4i_w(data_vec, _LSX_SHUFFLE(1, 0, 3, 2)); + __m128i const sum = __lsx_vadd_d(xacc[i], data_swap); + /* xacc[i] += product; */ + xacc[i] = __lsx_vadd_d(product, sum); + } + } +} +XXH_FORCE_INLINE XXH3_ACCUMULATE_TEMPLATE(lsx) + +XXH_FORCE_INLINE void +XXH3_scrambleAcc_lsx(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 15) == 0); + { + __m128i* const xacc = (__m128i*) acc; + const __m128i* const xsecret = (const __m128i *) secret; + const __m128i prime32 = __lsx_vreplgr2vr_d(XXH_PRIME32_1); + + for (size_t i = 0; i < XXH_STRIPE_LEN / sizeof(__m128i); i++) { + /* xacc[i] ^= (xacc[i] >> 47) */ + __m128i const acc_vec = xacc[i]; + __m128i const shifted = __lsx_vsrli_d(acc_vec, 47); + __m128i const data_vec = __lsx_vxor_v(acc_vec, shifted); + /* xacc[i] ^= xsecret[i]; */ + __m128i const key_vec = __lsx_vld(xsecret + i, 0); + __m128i const data_key = __lsx_vxor_v(data_vec, key_vec); + + /* xacc[i] *= XXH_PRIME32_1; */ + xacc[i] = __lsx_vmul_d(data_key, prime32); + } + } +} + +#endif + +#if (XXH_VECTOR == XXH_LASX) +#define _LASX_SHUFFLE(z, y, x, w) (((z) << 6) | ((y) << 4) | ((x) << 2) | (w)) + +XXH_FORCE_INLINE void +XXH3_accumulate_512_lasx( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 31) == 0); + { + __m256i* const xacc = (__m256i *) acc; + const __m256i* const xinput = (const __m256i *) input; + const __m256i* const xsecret = (const __m256i *) secret; + + for (size_t i = 0; i < XXH_STRIPE_LEN / sizeof(__m256i); i++) { + /* data_vec = xinput[i]; */ + __m256i const data_vec = __lasx_xvld(xinput + i, 0); + /* key_vec = xsecret[i]; */ + __m256i const key_vec = __lasx_xvld(xsecret + i, 0); + /* data_key = data_vec ^ key_vec; */ + __m256i const data_key = __lasx_xvxor_v(data_vec, key_vec); + /* data_key_lo = data_key >> 32; */ + __m256i const data_key_lo = __lasx_xvsrli_d(data_key, 32); + // __m256i const data_key_lo = __lasx_xvsrli_d(data_key, 32); + /* product = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */ + __m256i const product = __lasx_xvmulwev_d_wu(data_key, data_key_lo); + /* xacc[i] += swap(data_vec); */ + __m256i const data_swap = __lasx_xvshuf4i_w(data_vec, _LASX_SHUFFLE(1, 0, 3, 2)); + __m256i const sum = __lasx_xvadd_d(xacc[i], data_swap); + /* xacc[i] += product; */ + xacc[i] = __lasx_xvadd_d(product, sum); + } + } +} +XXH_FORCE_INLINE XXH3_ACCUMULATE_TEMPLATE(lasx) + +XXH_FORCE_INLINE void +XXH3_scrambleAcc_lasx(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 31) == 0); + { + __m256i* const xacc = (__m256i*) acc; + const __m256i* const xsecret = (const __m256i *) secret; + const __m256i prime32 = __lasx_xvreplgr2vr_d(XXH_PRIME32_1); + + for (size_t i = 0; i < XXH_STRIPE_LEN / sizeof(__m256i); i++) { + /* xacc[i] ^= (xacc[i] >> 47) */ + __m256i const acc_vec = xacc[i]; + __m256i const shifted = __lasx_xvsrli_d(acc_vec, 47); + __m256i const data_vec = __lasx_xvxor_v(acc_vec, shifted); + /* xacc[i] ^= xsecret[i]; */ + __m256i const key_vec = __lasx_xvld(xsecret + i, 0); + __m256i const data_key = __lasx_xvxor_v(data_vec, key_vec); + + /* xacc[i] *= XXH_PRIME32_1; */ + xacc[i] = __lasx_xvmul_d(data_key, prime32); + } + } +} + +#endif + +/* scalar variants - universal */ + +#if defined(__aarch64__) && (defined(__GNUC__) || defined(__clang__)) +/* + * In XXH3_scalarRound(), GCC and Clang have a similar codegen issue, where they + * emit an excess mask and a full 64-bit multiply-add (MADD X-form). + * + * While this might not seem like much, as AArch64 is a 64-bit architecture, only + * big Cortex designs have a full 64-bit multiplier. + * + * On the little cores, the smaller 32-bit multiplier is used, and full 64-bit + * multiplies expand to 2-3 multiplies in microcode. This has a major penalty + * of up to 4 latency cycles and 2 stall cycles in the multiply pipeline. + * + * Thankfully, AArch64 still provides the 32-bit long multiply-add (UMADDL) which does + * not have this penalty and does the mask automatically. + */ +XXH_FORCE_INLINE xxh_u64 +XXH_mult32to64_add64(xxh_u64 lhs, xxh_u64 rhs, xxh_u64 acc) +{ + xxh_u64 ret; + /* note: %x = 64-bit register, %w = 32-bit register */ + __asm__("umaddl %x0, %w1, %w2, %x3" : "=r" (ret) : "r" (lhs), "r" (rhs), "r" (acc)); + return ret; +} +#else +XXH_FORCE_INLINE xxh_u64 +XXH_mult32to64_add64(xxh_u64 lhs, xxh_u64 rhs, xxh_u64 acc) +{ + return XXH_mult32to64((xxh_u32)lhs, (xxh_u32)rhs) + acc; +} +#endif + +/*! + * @internal + * @brief Scalar round for @ref XXH3_accumulate_512_scalar(). + * + * This is extracted to its own function because the NEON path uses a combination + * of NEON and scalar. + */ +XXH_FORCE_INLINE void +XXH3_scalarRound(void* XXH_RESTRICT acc, + void const* XXH_RESTRICT input, + void const* XXH_RESTRICT secret, + size_t lane) +{ + xxh_u64* xacc = (xxh_u64*) acc; + xxh_u8 const* xinput = (xxh_u8 const*) input; + xxh_u8 const* xsecret = (xxh_u8 const*) secret; + XXH_ASSERT(lane < XXH_ACC_NB); + XXH_ASSERT(((size_t)acc & (XXH_ACC_ALIGN-1)) == 0); + { + xxh_u64 const data_val = XXH_readLE64(xinput + lane * 8); + xxh_u64 const data_key = data_val ^ XXH_readLE64(xsecret + lane * 8); + xacc[lane ^ 1] += data_val; /* swap adjacent lanes */ + xacc[lane] = XXH_mult32to64_add64(data_key /* & 0xFFFFFFFF */, data_key >> 32, xacc[lane]); + } +} + +/*! + * @internal + * @brief Processes a 64 byte block of data using the scalar path. + */ +XXH_FORCE_INLINE void +XXH3_accumulate_512_scalar(void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + size_t i; + /* ARM GCC refuses to unroll this loop, resulting in a 24% slowdown on ARMv6. */ +#if defined(__GNUC__) && !defined(__clang__) \ + && (defined(__arm__) || defined(__thumb2__)) \ + && defined(__ARM_FEATURE_UNALIGNED) /* no unaligned access just wastes bytes */ \ + && XXH_SIZE_OPT <= 0 +# pragma GCC unroll 8 +#endif + for (i=0; i < XXH_ACC_NB; i++) { + XXH3_scalarRound(acc, input, secret, i); + } +} +XXH_FORCE_INLINE XXH3_ACCUMULATE_TEMPLATE(scalar) + +/*! + * @internal + * @brief Scalar scramble step for @ref XXH3_scrambleAcc_scalar(). + * + * This is extracted to its own function because the NEON path uses a combination + * of NEON and scalar. + */ +XXH_FORCE_INLINE void +XXH3_scalarScrambleRound(void* XXH_RESTRICT acc, + void const* XXH_RESTRICT secret, + size_t lane) +{ + xxh_u64* const xacc = (xxh_u64*) acc; /* presumed aligned */ + const xxh_u8* const xsecret = (const xxh_u8*) secret; /* no alignment restriction */ + XXH_ASSERT((((size_t)acc) & (XXH_ACC_ALIGN-1)) == 0); + XXH_ASSERT(lane < XXH_ACC_NB); + { + xxh_u64 const key64 = XXH_readLE64(xsecret + lane * 8); + xxh_u64 acc64 = xacc[lane]; + acc64 = XXH_xorshift64(acc64, 47); + acc64 ^= key64; + acc64 *= XXH_PRIME32_1; + xacc[lane] = acc64; + } +} + +/*! + * @internal + * @brief Scrambles the accumulators after a large chunk has been read + */ +XXH_FORCE_INLINE void +XXH3_scrambleAcc_scalar(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + size_t i; + for (i=0; i < XXH_ACC_NB; i++) { + XXH3_scalarScrambleRound(acc, secret, i); + } +} + +XXH_FORCE_INLINE void +XXH3_initCustomSecret_scalar(void* XXH_RESTRICT customSecret, xxh_u64 seed64) +{ + /* + * We need a separate pointer for the hack below, + * which requires a non-const pointer. + * Any decent compiler will optimize this out otherwise. + */ + const xxh_u8* kSecretPtr = XXH3_kSecret; + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 15) == 0); + +#if defined(__GNUC__) && defined(__aarch64__) + /* + * UGLY HACK: + * GCC and Clang generate a bunch of MOV/MOVK pairs for aarch64, and they are + * placed sequentially, in order, at the top of the unrolled loop. + * + * While MOVK is great for generating constants (2 cycles for a 64-bit + * constant compared to 4 cycles for LDR), it fights for bandwidth with + * the arithmetic instructions. + * + * I L S + * MOVK + * MOVK + * MOVK + * MOVK + * ADD + * SUB STR + * STR + * By forcing loads from memory (as the asm line causes the compiler to assume + * that XXH3_kSecretPtr has been changed), the pipelines are used more + * efficiently: + * I L S + * LDR + * ADD LDR + * SUB STR + * STR + * + * See XXH3_NEON_LANES for details on the pipsline. + * + * XXH3_64bits_withSeed, len == 256, Snapdragon 835 + * without hack: 2654.4 MB/s + * with hack: 3202.9 MB/s + */ + XXH_COMPILER_GUARD(kSecretPtr); +#endif + { int const nbRounds = XXH_SECRET_DEFAULT_SIZE / 16; + int i; + for (i=0; i < nbRounds; i++) { + /* + * The asm hack causes the compiler to assume that kSecretPtr aliases with + * customSecret, and on aarch64, this prevented LDP from merging two + * loads together for free. Putting the loads together before the stores + * properly generates LDP. + */ + xxh_u64 lo = XXH_readLE64(kSecretPtr + 16*i) + seed64; + xxh_u64 hi = XXH_readLE64(kSecretPtr + 16*i + 8) - seed64; + XXH_writeLE64((xxh_u8*)customSecret + 16*i, lo); + XXH_writeLE64((xxh_u8*)customSecret + 16*i + 8, hi); + } } +} + + +typedef void (*XXH3_f_accumulate)(xxh_u64* XXH_RESTRICT, const xxh_u8* XXH_RESTRICT, const xxh_u8* XXH_RESTRICT, size_t); +typedef void (*XXH3_f_scrambleAcc)(void* XXH_RESTRICT, const void*); +typedef void (*XXH3_f_initCustomSecret)(void* XXH_RESTRICT, xxh_u64); + + +#if (XXH_VECTOR == XXH_AVX512) + +#define XXH3_accumulate_512 XXH3_accumulate_512_avx512 +#define XXH3_accumulate XXH3_accumulate_avx512 +#define XXH3_scrambleAcc XXH3_scrambleAcc_avx512 +#define XXH3_initCustomSecret XXH3_initCustomSecret_avx512 + +#elif (XXH_VECTOR == XXH_AVX2) + +#define XXH3_accumulate_512 XXH3_accumulate_512_avx2 +#define XXH3_accumulate XXH3_accumulate_avx2 +#define XXH3_scrambleAcc XXH3_scrambleAcc_avx2 +#define XXH3_initCustomSecret XXH3_initCustomSecret_avx2 + +#elif (XXH_VECTOR == XXH_SSE2) + +#define XXH3_accumulate_512 XXH3_accumulate_512_sse2 +#define XXH3_accumulate XXH3_accumulate_sse2 +#define XXH3_scrambleAcc XXH3_scrambleAcc_sse2 +#define XXH3_initCustomSecret XXH3_initCustomSecret_sse2 + +#elif (XXH_VECTOR == XXH_NEON) + +#define XXH3_accumulate_512 XXH3_accumulate_512_neon +#define XXH3_accumulate XXH3_accumulate_neon +#define XXH3_scrambleAcc XXH3_scrambleAcc_neon +#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar + +#elif (XXH_VECTOR == XXH_VSX) + +#define XXH3_accumulate_512 XXH3_accumulate_512_vsx +#define XXH3_accumulate XXH3_accumulate_vsx +#define XXH3_scrambleAcc XXH3_scrambleAcc_vsx +#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar + +#elif (XXH_VECTOR == XXH_SVE) +#define XXH3_accumulate_512 XXH3_accumulate_512_sve +#define XXH3_accumulate XXH3_accumulate_sve +#define XXH3_scrambleAcc XXH3_scrambleAcc_scalar +#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar + +#elif (XXH_VECTOR == XXH_LASX) +#define XXH3_accumulate_512 XXH3_accumulate_512_lasx +#define XXH3_accumulate XXH3_accumulate_lasx +#define XXH3_scrambleAcc XXH3_scrambleAcc_lasx +#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar + +#elif (XXH_VECTOR == XXH_LSX) +#define XXH3_accumulate_512 XXH3_accumulate_512_lsx +#define XXH3_accumulate XXH3_accumulate_lsx +#define XXH3_scrambleAcc XXH3_scrambleAcc_lsx +#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar + +#else /* scalar */ + +#define XXH3_accumulate_512 XXH3_accumulate_512_scalar +#define XXH3_accumulate XXH3_accumulate_scalar +#define XXH3_scrambleAcc XXH3_scrambleAcc_scalar +#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar + +#endif + +#if XXH_SIZE_OPT >= 1 /* don't do SIMD for initialization */ +# undef XXH3_initCustomSecret +# define XXH3_initCustomSecret XXH3_initCustomSecret_scalar +#endif + +XXH_FORCE_INLINE void +XXH3_hashLong_internal_loop(xxh_u64* XXH_RESTRICT acc, + const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH3_f_accumulate f_acc, + XXH3_f_scrambleAcc f_scramble) +{ + size_t const nbStripesPerBlock = (secretSize - XXH_STRIPE_LEN) / XXH_SECRET_CONSUME_RATE; + size_t const block_len = XXH_STRIPE_LEN * nbStripesPerBlock; + size_t const nb_blocks = (len - 1) / block_len; + + size_t n; + + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); + + for (n = 0; n < nb_blocks; n++) { + f_acc(acc, input + n*block_len, secret, nbStripesPerBlock); + f_scramble(acc, secret + secretSize - XXH_STRIPE_LEN); + } + + /* last partial block */ + XXH_ASSERT(len > XXH_STRIPE_LEN); + { size_t const nbStripes = ((len - 1) - (block_len * nb_blocks)) / XXH_STRIPE_LEN; + XXH_ASSERT(nbStripes <= (secretSize / XXH_SECRET_CONSUME_RATE)); + f_acc(acc, input + nb_blocks*block_len, secret, nbStripes); + + /* last stripe */ + { const xxh_u8* const p = input + len - XXH_STRIPE_LEN; +#define XXH_SECRET_LASTACC_START 7 /* not aligned on 8, last secret is different from acc & scrambler */ + XXH3_accumulate_512(acc, p, secret + secretSize - XXH_STRIPE_LEN - XXH_SECRET_LASTACC_START); + } } +} + +XXH_FORCE_INLINE xxh_u64 +XXH3_mix2Accs(const xxh_u64* XXH_RESTRICT acc, const xxh_u8* XXH_RESTRICT secret) +{ + return XXH3_mul128_fold64( + acc[0] ^ XXH_readLE64(secret), + acc[1] ^ XXH_readLE64(secret+8) ); +} + +static XXH_PUREF XXH64_hash_t +XXH3_mergeAccs(const xxh_u64* XXH_RESTRICT acc, const xxh_u8* XXH_RESTRICT secret, xxh_u64 start) +{ + xxh_u64 result64 = start; + size_t i = 0; + + for (i = 0; i < 4; i++) { + result64 += XXH3_mix2Accs(acc+2*i, secret + 16*i); +#if defined(__clang__) /* Clang */ \ + && (defined(__arm__) || defined(__thumb__)) /* ARMv7 */ \ + && (defined(__ARM_NEON) || defined(__ARM_NEON__)) /* NEON */ \ + && !defined(XXH_ENABLE_AUTOVECTORIZE) /* Define to disable */ + /* + * UGLY HACK: + * Prevent autovectorization on Clang ARMv7-a. Exact same problem as + * the one in XXH3_len_129to240_64b. Speeds up shorter keys > 240b. + * XXH3_64bits, len == 256, Snapdragon 835: + * without hack: 2063.7 MB/s + * with hack: 2560.7 MB/s + */ + XXH_COMPILER_GUARD(result64); +#endif + } + + return XXH3_avalanche(result64); +} + +/* do not align on 8, so that the secret is different from the accumulator */ +#define XXH_SECRET_MERGEACCS_START 11 + +static XXH_PUREF XXH64_hash_t +XXH3_finalizeLong_64b(const xxh_u64* XXH_RESTRICT acc, const xxh_u8* XXH_RESTRICT secret, xxh_u64 len) +{ + return XXH3_mergeAccs(acc, secret + XXH_SECRET_MERGEACCS_START, len * XXH_PRIME64_1); +} + +#define XXH3_INIT_ACC { XXH_PRIME32_3, XXH_PRIME64_1, XXH_PRIME64_2, XXH_PRIME64_3, \ + XXH_PRIME64_4, XXH_PRIME32_2, XXH_PRIME64_5, XXH_PRIME32_1 } + +XXH_FORCE_INLINE XXH64_hash_t +XXH3_hashLong_64b_internal(const void* XXH_RESTRICT input, size_t len, + const void* XXH_RESTRICT secret, size_t secretSize, + XXH3_f_accumulate f_acc, + XXH3_f_scrambleAcc f_scramble) +{ + XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[XXH_ACC_NB] = XXH3_INIT_ACC; + + XXH3_hashLong_internal_loop(acc, (const xxh_u8*)input, len, (const xxh_u8*)secret, secretSize, f_acc, f_scramble); + + /* converge into final hash */ + XXH_STATIC_ASSERT(sizeof(acc) == 64); + XXH_ASSERT(secretSize >= sizeof(acc) + XXH_SECRET_MERGEACCS_START); + return XXH3_finalizeLong_64b(acc, (const xxh_u8*)secret, (xxh_u64)len); +} + +/* + * It's important for performance to transmit secret's size (when it's static) + * so that the compiler can properly optimize the vectorized loop. + * This makes a big performance difference for "medium" keys (<1 KB) when using AVX instruction set. + * When the secret size is unknown, or on GCC 12 where the mix of NO_INLINE and FORCE_INLINE + * breaks -Og, this is XXH_NO_INLINE. + */ +XXH3_WITH_SECRET_INLINE XXH64_hash_t +XXH3_hashLong_64b_withSecret(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, const xxh_u8* XXH_RESTRICT secret, size_t secretLen) +{ + (void)seed64; + return XXH3_hashLong_64b_internal(input, len, secret, secretLen, XXH3_accumulate, XXH3_scrambleAcc); +} + +/* + * It's preferable for performance that XXH3_hashLong is not inlined, + * as it results in a smaller function for small data, easier to the instruction cache. + * Note that inside this no_inline function, we do inline the internal loop, + * and provide a statically defined secret size to allow optimization of vector loop. + */ +XXH_NO_INLINE XXH_PUREF XXH64_hash_t +XXH3_hashLong_64b_default(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, const xxh_u8* XXH_RESTRICT secret, size_t secretLen) +{ + (void)seed64; (void)secret; (void)secretLen; + return XXH3_hashLong_64b_internal(input, len, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_accumulate, XXH3_scrambleAcc); +} + +/* + * XXH3_hashLong_64b_withSeed(): + * Generate a custom key based on alteration of default XXH3_kSecret with the seed, + * and then use this key for long mode hashing. + * + * This operation is decently fast but nonetheless costs a little bit of time. + * Try to avoid it whenever possible (typically when seed==0). + * + * It's important for performance that XXH3_hashLong is not inlined. Not sure + * why (uop cache maybe?), but the difference is large and easily measurable. + */ +XXH_FORCE_INLINE XXH64_hash_t +XXH3_hashLong_64b_withSeed_internal(const void* input, size_t len, + XXH64_hash_t seed, + XXH3_f_accumulate f_acc, + XXH3_f_scrambleAcc f_scramble, + XXH3_f_initCustomSecret f_initSec) +{ +#if XXH_SIZE_OPT <= 0 + if (seed == 0) + return XXH3_hashLong_64b_internal(input, len, + XXH3_kSecret, sizeof(XXH3_kSecret), + f_acc, f_scramble); +#endif + { XXH_ALIGN(XXH_SEC_ALIGN) xxh_u8 secret[XXH_SECRET_DEFAULT_SIZE]; + f_initSec(secret, seed); + return XXH3_hashLong_64b_internal(input, len, secret, sizeof(secret), + f_acc, f_scramble); + } +} + +/* + * It's important for performance that XXH3_hashLong is not inlined. + */ +XXH_NO_INLINE XXH64_hash_t +XXH3_hashLong_64b_withSeed(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed, const xxh_u8* XXH_RESTRICT secret, size_t secretLen) +{ + (void)secret; (void)secretLen; + return XXH3_hashLong_64b_withSeed_internal(input, len, seed, + XXH3_accumulate, XXH3_scrambleAcc, XXH3_initCustomSecret); +} + + +typedef XXH64_hash_t (*XXH3_hashLong64_f)(const void* XXH_RESTRICT, size_t, + XXH64_hash_t, const xxh_u8* XXH_RESTRICT, size_t); + +XXH_FORCE_INLINE XXH64_hash_t +XXH3_64bits_internal(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, const void* XXH_RESTRICT secret, size_t secretLen, + XXH3_hashLong64_f f_hashLong) +{ + XXH_ASSERT(secretLen >= XXH3_SECRET_SIZE_MIN); + /* + * If an action is to be taken if `secretLen` condition is not respected, + * it should be done here. + * For now, it's a contract pre-condition. + * Adding a check and a branch here would cost performance at every hash. + * Also, note that function signature doesn't offer room to return an error. + */ + if (len <= 16) + return XXH3_len_0to16_64b((const xxh_u8*)input, len, (const xxh_u8*)secret, seed64); + if (len <= 128) + return XXH3_len_17to128_64b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64); + if (len <= XXH3_MIDSIZE_MAX) + return XXH3_len_129to240_64b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64); + return f_hashLong(input, len, seed64, (const xxh_u8*)secret, secretLen); +} + + +/* === Public entry point === */ + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits(XXH_NOESCAPE const void* input, size_t length) +{ + return XXH3_64bits_internal(input, length, 0, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_default); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH64_hash_t +XXH3_64bits_withSecret(XXH_NOESCAPE const void* input, size_t length, XXH_NOESCAPE const void* secret, size_t secretSize) +{ + return XXH3_64bits_internal(input, length, 0, secret, secretSize, XXH3_hashLong_64b_withSecret); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH64_hash_t +XXH3_64bits_withSeed(XXH_NOESCAPE const void* input, size_t length, XXH64_hash_t seed) +{ + return XXH3_64bits_internal(input, length, seed, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_withSeed); +} + +XXH_PUBLIC_API XXH64_hash_t +XXH3_64bits_withSecretandSeed(XXH_NOESCAPE const void* input, size_t length, XXH_NOESCAPE const void* secret, size_t secretSize, XXH64_hash_t seed) +{ + if (length <= XXH3_MIDSIZE_MAX) + return XXH3_64bits_internal(input, length, seed, XXH3_kSecret, sizeof(XXH3_kSecret), NULL); + return XXH3_hashLong_64b_withSecret(input, length, seed, (const xxh_u8*)secret, secretSize); +} + + +/* === XXH3 streaming === */ +#ifndef XXH_NO_STREAM +/* + * Malloc's a pointer that is always aligned to @align. + * + * This must be freed with `XXH_alignedFree()`. + * + * malloc typically guarantees 16 byte alignment on 64-bit systems and 8 byte + * alignment on 32-bit. This isn't enough for the 32 byte aligned loads in AVX2 + * or on 32-bit, the 16 byte aligned loads in SSE2 and NEON. + * + * This underalignment previously caused a rather obvious crash which went + * completely unnoticed due to XXH3_createState() not actually being tested. + * Credit to RedSpah for noticing this bug. + * + * The alignment is done manually: Functions like posix_memalign or _mm_malloc + * are avoided: To maintain portability, we would have to write a fallback + * like this anyways, and besides, testing for the existence of library + * functions without relying on external build tools is impossible. + * + * The method is simple: Overallocate, manually align, and store the offset + * to the original behind the returned pointer. + * + * Align must be a power of 2 and 8 <= align <= 128. + */ +static XXH_MALLOCF void* XXH_alignedMalloc(size_t s, size_t align) +{ + XXH_ASSERT(align <= 128 && align >= 8); /* range check */ + XXH_ASSERT((align & (align-1)) == 0); /* power of 2 */ + XXH_ASSERT(s != 0 && s < (s + align)); /* empty/overflow */ + { /* Overallocate to make room for manual realignment and an offset byte */ + xxh_u8* base = (xxh_u8*)XXH_malloc(s + align); + if (base != NULL) { + /* + * Get the offset needed to align this pointer. + * + * Even if the returned pointer is aligned, there will always be + * at least one byte to store the offset to the original pointer. + */ + size_t offset = align - ((size_t)base & (align - 1)); /* base % align */ + /* Add the offset for the now-aligned pointer */ + xxh_u8* ptr = base + offset; + + XXH_ASSERT((size_t)ptr % align == 0); + + /* Store the offset immediately before the returned pointer. */ + ptr[-1] = (xxh_u8)offset; + return ptr; + } + return NULL; + } +} +/* + * Frees an aligned pointer allocated by XXH_alignedMalloc(). Don't pass + * normal malloc'd pointers, XXH_alignedMalloc has a specific data layout. + */ +static void XXH_alignedFree(void* p) +{ + if (p != NULL) { + xxh_u8* ptr = (xxh_u8*)p; + /* Get the offset byte we added in XXH_malloc. */ + xxh_u8 offset = ptr[-1]; + /* Free the original malloc'd pointer */ + xxh_u8* base = ptr - offset; + XXH_free(base); + } +} +/*! @ingroup XXH3_family */ +/*! + * @brief Allocate an @ref XXH3_state_t. + * + * @return An allocated pointer of @ref XXH3_state_t on success. + * @return `NULL` on failure. + * + * @note Must be freed with XXH3_freeState(). + * + * @see @ref streaming_example "Streaming Example" + */ +XXH_PUBLIC_API XXH3_state_t* XXH3_createState(void) +{ + XXH3_state_t* const state = (XXH3_state_t*)XXH_alignedMalloc(sizeof(XXH3_state_t), 64); + if (state==NULL) return NULL; + XXH3_INITSTATE(state); + return state; +} + +/*! @ingroup XXH3_family */ +/*! + * @brief Frees an @ref XXH3_state_t. + * + * @param statePtr A pointer to an @ref XXH3_state_t allocated with @ref XXH3_createState(). + * + * @return @ref XXH_OK. + * + * @note Must be allocated with XXH3_createState(). + * + * @see @ref streaming_example "Streaming Example" + */ +XXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t* statePtr) +{ + XXH_alignedFree(statePtr); + return XXH_OK; +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API void +XXH3_copyState(XXH_NOESCAPE XXH3_state_t* dst_state, XXH_NOESCAPE const XXH3_state_t* src_state) +{ + XXH_memcpy(dst_state, src_state, sizeof(*dst_state)); +} + +static void +XXH3_reset_internal(XXH3_state_t* statePtr, + XXH64_hash_t seed, + const void* secret, size_t secretSize) +{ + size_t const initStart = offsetof(XXH3_state_t, bufferedSize); + size_t const initLength = offsetof(XXH3_state_t, nbStripesPerBlock) - initStart; + XXH_ASSERT(offsetof(XXH3_state_t, nbStripesPerBlock) > initStart); + XXH_ASSERT(statePtr != NULL); + /* set members from bufferedSize to nbStripesPerBlock (excluded) to 0 */ + XXH_memset((char*)statePtr + initStart, 0, initLength); + statePtr->acc[0] = XXH_PRIME32_3; + statePtr->acc[1] = XXH_PRIME64_1; + statePtr->acc[2] = XXH_PRIME64_2; + statePtr->acc[3] = XXH_PRIME64_3; + statePtr->acc[4] = XXH_PRIME64_4; + statePtr->acc[5] = XXH_PRIME32_2; + statePtr->acc[6] = XXH_PRIME64_5; + statePtr->acc[7] = XXH_PRIME32_1; + statePtr->seed = seed; + statePtr->useSeed = (seed != 0); + statePtr->extSecret = (const unsigned char*)secret; + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); + statePtr->secretLimit = secretSize - XXH_STRIPE_LEN; + statePtr->nbStripesPerBlock = statePtr->secretLimit / XXH_SECRET_CONSUME_RATE; +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset(XXH_NOESCAPE XXH3_state_t* statePtr) +{ + if (statePtr == NULL) return XXH_ERROR; + XXH3_reset_internal(statePtr, 0, XXH3_kSecret, XXH_SECRET_DEFAULT_SIZE); + return XXH_OK; +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSecret(XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* secret, size_t secretSize) +{ + if (statePtr == NULL) return XXH_ERROR; + XXH3_reset_internal(statePtr, 0, secret, secretSize); + if (secret == NULL) return XXH_ERROR; + if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; + return XXH_OK; +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSeed(XXH_NOESCAPE XXH3_state_t* statePtr, XXH64_hash_t seed) +{ + if (statePtr == NULL) return XXH_ERROR; + if (seed==0) return XXH3_64bits_reset(statePtr); + if ((seed != statePtr->seed) || (statePtr->extSecret != NULL)) + XXH3_initCustomSecret(statePtr->customSecret, seed); + XXH3_reset_internal(statePtr, seed, NULL, XXH_SECRET_DEFAULT_SIZE); + return XXH_OK; +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSecretandSeed(XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* secret, size_t secretSize, XXH64_hash_t seed64) +{ + if (statePtr == NULL) return XXH_ERROR; + if (secret == NULL) return XXH_ERROR; + if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; + XXH3_reset_internal(statePtr, seed64, secret, secretSize); + statePtr->useSeed = 1; /* always, even if seed64==0 */ + return XXH_OK; +} + +/*! + * @internal + * @brief Processes a large input for XXH3_update() and XXH3_digest_long(). + * + * Unlike XXH3_hashLong_internal_loop(), this can process data that overlaps a block. + * + * @param acc Pointer to the 8 accumulator lanes + * @param nbStripesSoFarPtr In/out pointer to the number of leftover stripes in the block* + * @param nbStripesPerBlock Number of stripes in a block + * @param input Input pointer + * @param nbStripes Number of stripes to process + * @param secret Secret pointer + * @param secretLimit Offset of the last block in @p secret + * @param f_acc Pointer to an XXH3_accumulate implementation + * @param f_scramble Pointer to an XXH3_scrambleAcc implementation + * @return Pointer past the end of @p input after processing + */ +XXH_FORCE_INLINE const xxh_u8 * +XXH3_consumeStripes(xxh_u64* XXH_RESTRICT acc, + size_t* XXH_RESTRICT nbStripesSoFarPtr, size_t nbStripesPerBlock, + const xxh_u8* XXH_RESTRICT input, size_t nbStripes, + const xxh_u8* XXH_RESTRICT secret, size_t secretLimit, + XXH3_f_accumulate f_acc, + XXH3_f_scrambleAcc f_scramble) +{ + const xxh_u8* initialSecret = secret + *nbStripesSoFarPtr * XXH_SECRET_CONSUME_RATE; + /* Process full blocks */ + if (nbStripes >= (nbStripesPerBlock - *nbStripesSoFarPtr)) { + /* Process the initial partial block... */ + size_t nbStripesThisIter = nbStripesPerBlock - *nbStripesSoFarPtr; + + do { + /* Accumulate and scramble */ + f_acc(acc, input, initialSecret, nbStripesThisIter); + f_scramble(acc, secret + secretLimit); + input += nbStripesThisIter * XXH_STRIPE_LEN; + nbStripes -= nbStripesThisIter; + /* Then continue the loop with the full block size */ + nbStripesThisIter = nbStripesPerBlock; + initialSecret = secret; + } while (nbStripes >= nbStripesPerBlock); + *nbStripesSoFarPtr = 0; + } + /* Process a partial block */ + if (nbStripes > 0) { + f_acc(acc, input, initialSecret, nbStripes); + input += nbStripes * XXH_STRIPE_LEN; + *nbStripesSoFarPtr += nbStripes; + } + /* Return end pointer */ + return input; +} + +#ifndef XXH3_STREAM_USE_STACK +# if XXH_SIZE_OPT <= 0 && !defined(__clang__) /* clang doesn't need additional stack space */ +# define XXH3_STREAM_USE_STACK 1 +# endif +#endif +/* This function accepts f_acc and f_scramble as function pointers, + * making it possible to implement multiple variants with different acc & scramble stages. + * This is notably useful to implement multiple vector variants with different intrinsics. + */ +XXH_FORCE_INLINE XXH_errorcode +XXH3_update(XXH3_state_t* XXH_RESTRICT const state, + const xxh_u8* XXH_RESTRICT input, size_t len, + XXH3_f_accumulate f_acc, + XXH3_f_scrambleAcc f_scramble) +{ + if (input==NULL) { + XXH_ASSERT(len == 0); + return XXH_OK; + } + + XXH_ASSERT(state != NULL); + { const xxh_u8* const bEnd = input + len; + const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret; +#if defined(XXH3_STREAM_USE_STACK) && XXH3_STREAM_USE_STACK >= 1 + /* For some reason, gcc and MSVC seem to suffer greatly + * when operating accumulators directly into state. + * Operating into stack space seems to enable proper optimization. + * clang, on the other hand, doesn't seem to need this trick */ + XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[8]; + XXH_memcpy(acc, state->acc, sizeof(acc)); +#else + xxh_u64* XXH_RESTRICT const acc = state->acc; +#endif + state->totalLen += len; + XXH_ASSERT(state->bufferedSize <= XXH3_INTERNALBUFFER_SIZE); + + /* small input : just fill in tmp buffer */ + if (len <= XXH3_INTERNALBUFFER_SIZE - state->bufferedSize) { + XXH_memcpy(state->buffer + state->bufferedSize, input, len); + state->bufferedSize += (XXH32_hash_t)len; + return XXH_OK; + } + + /* total input is now > XXH3_INTERNALBUFFER_SIZE */ + #define XXH3_INTERNALBUFFER_STRIPES (XXH3_INTERNALBUFFER_SIZE / XXH_STRIPE_LEN) + XXH_STATIC_ASSERT(XXH3_INTERNALBUFFER_SIZE % XXH_STRIPE_LEN == 0); /* clean multiple */ + + /* + * Internal buffer is partially filled (always, except at beginning) + * Complete it, then consume it. + */ + if (state->bufferedSize) { + size_t const loadSize = XXH3_INTERNALBUFFER_SIZE - state->bufferedSize; + XXH_memcpy(state->buffer + state->bufferedSize, input, loadSize); + input += loadSize; + XXH3_consumeStripes(acc, + &state->nbStripesSoFar, state->nbStripesPerBlock, + state->buffer, XXH3_INTERNALBUFFER_STRIPES, + secret, state->secretLimit, + f_acc, f_scramble); + state->bufferedSize = 0; + } + XXH_ASSERT(input < bEnd); + if (bEnd - input > XXH3_INTERNALBUFFER_SIZE) { + size_t nbStripes = (size_t)(bEnd - 1 - input) / XXH_STRIPE_LEN; + input = XXH3_consumeStripes(acc, + &state->nbStripesSoFar, state->nbStripesPerBlock, + input, nbStripes, + secret, state->secretLimit, + f_acc, f_scramble); + XXH_memcpy(state->buffer + sizeof(state->buffer) - XXH_STRIPE_LEN, input - XXH_STRIPE_LEN, XXH_STRIPE_LEN); + + } + /* Some remaining input (always) : buffer it */ + XXH_ASSERT(input < bEnd); + XXH_ASSERT(bEnd - input <= XXH3_INTERNALBUFFER_SIZE); + XXH_ASSERT(state->bufferedSize == 0); + XXH_memcpy(state->buffer, input, (size_t)(bEnd-input)); + state->bufferedSize = (XXH32_hash_t)(bEnd-input); +#if defined(XXH3_STREAM_USE_STACK) && XXH3_STREAM_USE_STACK >= 1 + /* save stack accumulators into state */ + XXH_memcpy(state->acc, acc, sizeof(acc)); +#endif + } + + return XXH_OK; +} + +/* + * Both XXH3_64bits_update and XXH3_128bits_update use this routine. + */ +XXH_NO_INLINE XXH_errorcode +XXH3_update_regular(XXH_NOESCAPE XXH3_state_t* state, XXH_NOESCAPE const void* input, size_t len) +{ + return XXH3_update(state, (const xxh_u8*)input, len, + XXH3_accumulate, XXH3_scrambleAcc); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_update(XXH_NOESCAPE XXH3_state_t* state, XXH_NOESCAPE const void* input, size_t len) +{ + return XXH3_update_regular(state, input, len); +} + + +XXH_FORCE_INLINE void +XXH3_digest_long (XXH64_hash_t* acc, + const XXH3_state_t* state, + const unsigned char* secret) +{ + xxh_u8 lastStripe[XXH_STRIPE_LEN]; + const xxh_u8* lastStripePtr; + + /* + * Digest on a local copy. This way, the state remains unaltered, and it can + * continue ingesting more input afterwards. + */ + XXH_memcpy(acc, state->acc, sizeof(state->acc)); + if (state->bufferedSize >= XXH_STRIPE_LEN) { + /* Consume remaining stripes then point to remaining data in buffer */ + size_t const nbStripes = (state->bufferedSize - 1) / XXH_STRIPE_LEN; + size_t nbStripesSoFar = state->nbStripesSoFar; + XXH3_consumeStripes(acc, + &nbStripesSoFar, state->nbStripesPerBlock, + state->buffer, nbStripes, + secret, state->secretLimit, + XXH3_accumulate, XXH3_scrambleAcc); + lastStripePtr = state->buffer + state->bufferedSize - XXH_STRIPE_LEN; + } else { /* bufferedSize < XXH_STRIPE_LEN */ + /* Copy to temp buffer */ + size_t const catchupSize = XXH_STRIPE_LEN - state->bufferedSize; + XXH_ASSERT(state->bufferedSize > 0); /* there is always some input buffered */ + XXH_memcpy(lastStripe, state->buffer + sizeof(state->buffer) - catchupSize, catchupSize); + XXH_memcpy(lastStripe + catchupSize, state->buffer, state->bufferedSize); + lastStripePtr = lastStripe; + } + /* Last stripe */ + XXH3_accumulate_512(acc, + lastStripePtr, + secret + state->secretLimit - XXH_SECRET_LASTACC_START); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest (XXH_NOESCAPE const XXH3_state_t* state) +{ + const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret; + if (state->totalLen > XXH3_MIDSIZE_MAX) { + XXH_ALIGN(XXH_ACC_ALIGN) XXH64_hash_t acc[XXH_ACC_NB]; + XXH3_digest_long(acc, state, secret); + return XXH3_finalizeLong_64b(acc, secret, (xxh_u64)state->totalLen); + } + /* totalLen <= XXH3_MIDSIZE_MAX: digesting a short input */ + if (state->useSeed) + return XXH3_64bits_withSeed(state->buffer, (size_t)state->totalLen, state->seed); + return XXH3_64bits_withSecret(state->buffer, (size_t)(state->totalLen), + secret, state->secretLimit + XXH_STRIPE_LEN); +} +#endif /* !XXH_NO_STREAM */ + + +/* ========================================== + * XXH3 128 bits (a.k.a XXH128) + * ========================================== + * XXH3's 128-bit variant has better mixing and strength than the 64-bit variant, + * even without counting the significantly larger output size. + * + * For example, extra steps are taken to avoid the seed-dependent collisions + * in 17-240 byte inputs (See XXH3_mix16B and XXH128_mix32B). + * + * This strength naturally comes at the cost of some speed, especially on short + * lengths. Note that longer hashes are about as fast as the 64-bit version + * due to it using only a slight modification of the 64-bit loop. + * + * XXH128 is also more oriented towards 64-bit machines. It is still extremely + * fast for a _128-bit_ hash on 32-bit (it usually clears XXH64). + */ + +XXH_FORCE_INLINE XXH_PUREF XXH128_hash_t +XXH3_len_1to3_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + /* A doubled version of 1to3_64b with different constants. */ + XXH_ASSERT(input != NULL); + XXH_ASSERT(1 <= len && len <= 3); + XXH_ASSERT(secret != NULL); + /* + * len = 1: combinedl = { input[0], 0x01, input[0], input[0] } + * len = 2: combinedl = { input[1], 0x02, input[0], input[1] } + * len = 3: combinedl = { input[2], 0x03, input[0], input[1] } + */ + { xxh_u8 const c1 = input[0]; + xxh_u8 const c2 = input[len >> 1]; + xxh_u8 const c3 = input[len - 1]; + xxh_u32 const combinedl = ((xxh_u32)c1 <<16) | ((xxh_u32)c2 << 24) + | ((xxh_u32)c3 << 0) | ((xxh_u32)len << 8); + xxh_u32 const combinedh = XXH_rotl32(XXH_swap32(combinedl), 13); + xxh_u64 const bitflipl = (XXH_readLE32(secret) ^ XXH_readLE32(secret+4)) + seed; + xxh_u64 const bitfliph = (XXH_readLE32(secret+8) ^ XXH_readLE32(secret+12)) - seed; + xxh_u64 const keyed_lo = (xxh_u64)combinedl ^ bitflipl; + xxh_u64 const keyed_hi = (xxh_u64)combinedh ^ bitfliph; + XXH128_hash_t h128; + h128.low64 = XXH64_avalanche(keyed_lo); + h128.high64 = XXH64_avalanche(keyed_hi); + return h128; + } +} + +XXH_FORCE_INLINE XXH_PUREF XXH128_hash_t +XXH3_len_4to8_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(secret != NULL); + XXH_ASSERT(4 <= len && len <= 8); + seed ^= (xxh_u64)XXH_swap32((xxh_u32)seed) << 32; + { xxh_u32 const input_lo = XXH_readLE32(input); + xxh_u32 const input_hi = XXH_readLE32(input + len - 4); + xxh_u64 const input_64 = input_lo + ((xxh_u64)input_hi << 32); + xxh_u64 const bitflip = (XXH_readLE64(secret+16) ^ XXH_readLE64(secret+24)) + seed; + xxh_u64 const keyed = input_64 ^ bitflip; + + /* Shift len to the left to ensure it is even, this avoids even multiplies. */ + XXH128_hash_t m128 = XXH_mult64to128(keyed, XXH_PRIME64_1 + (len << 2)); + + m128.high64 += (m128.low64 << 1); + m128.low64 ^= (m128.high64 >> 3); + + m128.low64 = XXH_xorshift64(m128.low64, 35); + m128.low64 *= PRIME_MX2; + m128.low64 = XXH_xorshift64(m128.low64, 28); + m128.high64 = XXH3_avalanche(m128.high64); + return m128; + } +} + +XXH_FORCE_INLINE XXH_PUREF XXH128_hash_t +XXH3_len_9to16_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(secret != NULL); + XXH_ASSERT(9 <= len && len <= 16); + { xxh_u64 const bitflipl = (XXH_readLE64(secret+32) ^ XXH_readLE64(secret+40)) - seed; + xxh_u64 const bitfliph = (XXH_readLE64(secret+48) ^ XXH_readLE64(secret+56)) + seed; + xxh_u64 const input_lo = XXH_readLE64(input); + xxh_u64 input_hi = XXH_readLE64(input + len - 8); + XXH128_hash_t m128 = XXH_mult64to128(input_lo ^ input_hi ^ bitflipl, XXH_PRIME64_1); + /* + * Put len in the middle of m128 to ensure that the length gets mixed to + * both the low and high bits in the 128x64 multiply below. + */ + m128.low64 += (xxh_u64)(len - 1) << 54; + input_hi ^= bitfliph; + /* + * Add the high 32 bits of input_hi to the high 32 bits of m128, then + * add the long product of the low 32 bits of input_hi and XXH_PRIME32_2 to + * the high 64 bits of m128. + * + * The best approach to this operation is different on 32-bit and 64-bit. + */ + if (sizeof(void *) < sizeof(xxh_u64)) { /* 32-bit */ + /* + * 32-bit optimized version, which is more readable. + * + * On 32-bit, it removes an ADC and delays a dependency between the two + * halves of m128.high64, but it generates an extra mask on 64-bit. + */ + m128.high64 += (input_hi & 0xFFFFFFFF00000000ULL) + XXH_mult32to64((xxh_u32)input_hi, XXH_PRIME32_2); + } else { + /* + * 64-bit optimized (albeit more confusing) version. + * + * Uses some properties of addition and multiplication to remove the mask: + * + * Let: + * a = input_hi.lo = (input_hi & 0x00000000FFFFFFFF) + * b = input_hi.hi = (input_hi & 0xFFFFFFFF00000000) + * c = XXH_PRIME32_2 + * + * a + (b * c) + * Inverse Property: x + y - x == y + * a + (b * (1 + c - 1)) + * Distributive Property: x * (y + z) == (x * y) + (x * z) + * a + (b * 1) + (b * (c - 1)) + * Identity Property: x * 1 == x + * a + b + (b * (c - 1)) + * + * Substitute a, b, and c: + * input_hi.hi + input_hi.lo + ((xxh_u64)input_hi.lo * (XXH_PRIME32_2 - 1)) + * + * Since input_hi.hi + input_hi.lo == input_hi, we get this: + * input_hi + ((xxh_u64)input_hi.lo * (XXH_PRIME32_2 - 1)) + */ + m128.high64 += input_hi + XXH_mult32to64((xxh_u32)input_hi, XXH_PRIME32_2 - 1); + } + /* m128 ^= XXH_swap64(m128 >> 64); */ + m128.low64 ^= XXH_swap64(m128.high64); + + { /* 128x64 multiply: h128 = m128 * XXH_PRIME64_2; */ + XXH128_hash_t h128 = XXH_mult64to128(m128.low64, XXH_PRIME64_2); + h128.high64 += m128.high64 * XXH_PRIME64_2; + + h128.low64 = XXH3_avalanche(h128.low64); + h128.high64 = XXH3_avalanche(h128.high64); + return h128; + } } +} + +/* + * Assumption: `secret` size is >= XXH3_SECRET_SIZE_MIN + */ +XXH_FORCE_INLINE XXH_PUREF XXH128_hash_t +XXH3_len_0to16_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(len <= 16); + { if (len > 8) return XXH3_len_9to16_128b(input, len, secret, seed); + if (len >= 4) return XXH3_len_4to8_128b(input, len, secret, seed); + if (len) return XXH3_len_1to3_128b(input, len, secret, seed); + { XXH128_hash_t h128; + xxh_u64 const bitflipl = XXH_readLE64(secret+64) ^ XXH_readLE64(secret+72); + xxh_u64 const bitfliph = XXH_readLE64(secret+80) ^ XXH_readLE64(secret+88); + h128.low64 = XXH64_avalanche(seed ^ bitflipl); + h128.high64 = XXH64_avalanche( seed ^ bitfliph); + return h128; + } } +} + +/* + * A bit slower than XXH3_mix16B, but handles multiply by zero better. + */ +XXH_FORCE_INLINE XXH128_hash_t +XXH128_mix32B(XXH128_hash_t acc, const xxh_u8* input_1, const xxh_u8* input_2, + const xxh_u8* secret, XXH64_hash_t seed) +{ + acc.low64 += XXH3_mix16B (input_1, secret+0, seed); + acc.low64 ^= XXH_readLE64(input_2) + XXH_readLE64(input_2 + 8); + acc.high64 += XXH3_mix16B (input_2, secret+16, seed); + acc.high64 ^= XXH_readLE64(input_1) + XXH_readLE64(input_1 + 8); + return acc; +} + + +XXH_FORCE_INLINE XXH_PUREF XXH128_hash_t +XXH3_len_17to128_128b(const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH64_hash_t seed) +{ + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; + XXH_ASSERT(16 < len && len <= 128); + + { XXH128_hash_t acc; + acc.low64 = len * XXH_PRIME64_1; + acc.high64 = 0; + +#if XXH_SIZE_OPT >= 1 + { + /* Smaller, but slightly slower. */ + unsigned int i = (unsigned int)(len - 1) / 32; + do { + acc = XXH128_mix32B(acc, input+16*i, input+len-16*(i+1), secret+32*i, seed); + } while (i-- != 0); + } +#else + if (len > 32) { + if (len > 64) { + if (len > 96) { + acc = XXH128_mix32B(acc, input+48, input+len-64, secret+96, seed); + } + acc = XXH128_mix32B(acc, input+32, input+len-48, secret+64, seed); + } + acc = XXH128_mix32B(acc, input+16, input+len-32, secret+32, seed); + } + acc = XXH128_mix32B(acc, input, input+len-16, secret, seed); +#endif + { XXH128_hash_t h128; + h128.low64 = acc.low64 + acc.high64; + h128.high64 = (acc.low64 * XXH_PRIME64_1) + + (acc.high64 * XXH_PRIME64_4) + + ((len - seed) * XXH_PRIME64_2); + h128.low64 = XXH3_avalanche(h128.low64); + h128.high64 = (XXH64_hash_t)0 - XXH3_avalanche(h128.high64); + return h128; + } + } +} + +XXH_NO_INLINE XXH_PUREF XXH128_hash_t +XXH3_len_129to240_128b(const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH64_hash_t seed) +{ + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; + XXH_ASSERT(128 < len && len <= XXH3_MIDSIZE_MAX); + + { XXH128_hash_t acc; + unsigned i; + acc.low64 = len * XXH_PRIME64_1; + acc.high64 = 0; + /* + * We set as `i` as offset + 32. We do this so that unchanged + * `len` can be used as upper bound. This reaches a sweet spot + * where both x86 and aarch64 get simple agen and good codegen + * for the loop. + */ + for (i = 32; i < 160; i += 32) { + acc = XXH128_mix32B(acc, + input + i - 32, + input + i - 16, + secret + i - 32, + seed); + } + acc.low64 = XXH3_avalanche(acc.low64); + acc.high64 = XXH3_avalanche(acc.high64); + /* + * NB: `i <= len` will duplicate the last 32-bytes if + * len % 32 was zero. This is an unfortunate necessity to keep + * the hash result stable. + */ + for (i=160; i <= len; i += 32) { + acc = XXH128_mix32B(acc, + input + i - 32, + input + i - 16, + secret + XXH3_MIDSIZE_STARTOFFSET + i - 160, + seed); + } + /* last bytes */ + acc = XXH128_mix32B(acc, + input + len - 16, + input + len - 32, + secret + XXH3_SECRET_SIZE_MIN - XXH3_MIDSIZE_LASTOFFSET - 16, + (XXH64_hash_t)0 - seed); + + { XXH128_hash_t h128; + h128.low64 = acc.low64 + acc.high64; + h128.high64 = (acc.low64 * XXH_PRIME64_1) + + (acc.high64 * XXH_PRIME64_4) + + ((len - seed) * XXH_PRIME64_2); + h128.low64 = XXH3_avalanche(h128.low64); + h128.high64 = (XXH64_hash_t)0 - XXH3_avalanche(h128.high64); + return h128; + } + } +} + +static XXH_PUREF XXH128_hash_t +XXH3_finalizeLong_128b(const xxh_u64* XXH_RESTRICT acc, const xxh_u8* XXH_RESTRICT secret, size_t secretSize, xxh_u64 len) +{ + XXH128_hash_t h128; + h128.low64 = XXH3_finalizeLong_64b(acc, secret, len); + h128.high64 = XXH3_mergeAccs(acc, secret + secretSize + - XXH_STRIPE_LEN - XXH_SECRET_MERGEACCS_START, + ~(len * XXH_PRIME64_2)); + return h128; +} + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_hashLong_128b_internal(const void* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH3_f_accumulate f_acc, + XXH3_f_scrambleAcc f_scramble) +{ + XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[XXH_ACC_NB] = XXH3_INIT_ACC; + + XXH3_hashLong_internal_loop(acc, (const xxh_u8*)input, len, secret, secretSize, f_acc, f_scramble); + + /* converge into final hash */ + XXH_STATIC_ASSERT(sizeof(acc) == 64); + XXH_ASSERT(secretSize >= sizeof(acc) + XXH_SECRET_MERGEACCS_START); + return XXH3_finalizeLong_128b(acc, secret, secretSize, (xxh_u64)len); +} + +/* + * It's important for performance that XXH3_hashLong() is not inlined. + */ +XXH_NO_INLINE XXH_PUREF XXH128_hash_t +XXH3_hashLong_128b_default(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, + const void* XXH_RESTRICT secret, size_t secretLen) +{ + (void)seed64; (void)secret; (void)secretLen; + return XXH3_hashLong_128b_internal(input, len, XXH3_kSecret, sizeof(XXH3_kSecret), + XXH3_accumulate, XXH3_scrambleAcc); +} + +/* + * It's important for performance to pass @p secretLen (when it's static) + * to the compiler, so that it can properly optimize the vectorized loop. + * + * When the secret size is unknown, or on GCC 12 where the mix of NO_INLINE and FORCE_INLINE + * breaks -Og, this is XXH_NO_INLINE. + */ +XXH3_WITH_SECRET_INLINE XXH128_hash_t +XXH3_hashLong_128b_withSecret(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, + const void* XXH_RESTRICT secret, size_t secretLen) +{ + (void)seed64; + return XXH3_hashLong_128b_internal(input, len, (const xxh_u8*)secret, secretLen, + XXH3_accumulate, XXH3_scrambleAcc); +} + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_hashLong_128b_withSeed_internal(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, + XXH3_f_accumulate f_acc, + XXH3_f_scrambleAcc f_scramble, + XXH3_f_initCustomSecret f_initSec) +{ + if (seed64 == 0) + return XXH3_hashLong_128b_internal(input, len, + XXH3_kSecret, sizeof(XXH3_kSecret), + f_acc, f_scramble); + { XXH_ALIGN(XXH_SEC_ALIGN) xxh_u8 secret[XXH_SECRET_DEFAULT_SIZE]; + f_initSec(secret, seed64); + return XXH3_hashLong_128b_internal(input, len, (const xxh_u8*)secret, sizeof(secret), + f_acc, f_scramble); + } +} + +/* + * It's important for performance that XXH3_hashLong is not inlined. + */ +XXH_NO_INLINE XXH128_hash_t +XXH3_hashLong_128b_withSeed(const void* input, size_t len, + XXH64_hash_t seed64, const void* XXH_RESTRICT secret, size_t secretLen) +{ + (void)secret; (void)secretLen; + return XXH3_hashLong_128b_withSeed_internal(input, len, seed64, + XXH3_accumulate, XXH3_scrambleAcc, XXH3_initCustomSecret); +} + +typedef XXH128_hash_t (*XXH3_hashLong128_f)(const void* XXH_RESTRICT, size_t, + XXH64_hash_t, const void* XXH_RESTRICT, size_t); + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_128bits_internal(const void* input, size_t len, + XXH64_hash_t seed64, const void* XXH_RESTRICT secret, size_t secretLen, + XXH3_hashLong128_f f_hl128) +{ + XXH_ASSERT(secretLen >= XXH3_SECRET_SIZE_MIN); + /* + * If an action is to be taken if `secret` conditions are not respected, + * it should be done here. + * For now, it's a contract pre-condition. + * Adding a check and a branch here would cost performance at every hash. + */ + if (len <= 16) + return XXH3_len_0to16_128b((const xxh_u8*)input, len, (const xxh_u8*)secret, seed64); + if (len <= 128) + return XXH3_len_17to128_128b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64); + if (len <= XXH3_MIDSIZE_MAX) + return XXH3_len_129to240_128b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64); + return f_hl128(input, len, seed64, secret, secretLen); +} + + +/* === Public XXH128 API === */ + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits(XXH_NOESCAPE const void* input, size_t len) +{ + return XXH3_128bits_internal(input, len, 0, + XXH3_kSecret, sizeof(XXH3_kSecret), + XXH3_hashLong_128b_default); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH3_128bits_withSecret(XXH_NOESCAPE const void* input, size_t len, XXH_NOESCAPE const void* secret, size_t secretSize) +{ + return XXH3_128bits_internal(input, len, 0, + (const xxh_u8*)secret, secretSize, + XXH3_hashLong_128b_withSecret); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH3_128bits_withSeed(XXH_NOESCAPE const void* input, size_t len, XXH64_hash_t seed) +{ + return XXH3_128bits_internal(input, len, seed, + XXH3_kSecret, sizeof(XXH3_kSecret), + XXH3_hashLong_128b_withSeed); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH3_128bits_withSecretandSeed(XXH_NOESCAPE const void* input, size_t len, XXH_NOESCAPE const void* secret, size_t secretSize, XXH64_hash_t seed) +{ + if (len <= XXH3_MIDSIZE_MAX) + return XXH3_128bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), NULL); + return XXH3_hashLong_128b_withSecret(input, len, seed, secret, secretSize); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH128(XXH_NOESCAPE const void* input, size_t len, XXH64_hash_t seed) +{ + return XXH3_128bits_withSeed(input, len, seed); +} + + +/* === XXH3 128-bit streaming === */ +#ifndef XXH_NO_STREAM +/* + * All initialization and update functions are identical to 64-bit streaming variant. + * The only difference is the finalization routine. + */ + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset(XXH_NOESCAPE XXH3_state_t* statePtr) +{ + return XXH3_64bits_reset(statePtr); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSecret(XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* secret, size_t secretSize) +{ + return XXH3_64bits_reset_withSecret(statePtr, secret, secretSize); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSeed(XXH_NOESCAPE XXH3_state_t* statePtr, XXH64_hash_t seed) +{ + return XXH3_64bits_reset_withSeed(statePtr, seed); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSecretandSeed(XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* secret, size_t secretSize, XXH64_hash_t seed) +{ + return XXH3_64bits_reset_withSecretandSeed(statePtr, secret, secretSize, seed); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_update(XXH_NOESCAPE XXH3_state_t* state, XXH_NOESCAPE const void* input, size_t len) +{ + return XXH3_update_regular(state, input, len); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_digest (XXH_NOESCAPE const XXH3_state_t* state) +{ + const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret; + if (state->totalLen > XXH3_MIDSIZE_MAX) { + XXH_ALIGN(XXH_ACC_ALIGN) XXH64_hash_t acc[XXH_ACC_NB]; + XXH3_digest_long(acc, state, secret); + XXH_ASSERT(state->secretLimit + XXH_STRIPE_LEN >= sizeof(acc) + XXH_SECRET_MERGEACCS_START); + return XXH3_finalizeLong_128b(acc, secret, state->secretLimit + XXH_STRIPE_LEN, (xxh_u64)state->totalLen); + } + /* len <= XXH3_MIDSIZE_MAX : short code */ + if (state->useSeed) + return XXH3_128bits_withSeed(state->buffer, (size_t)state->totalLen, state->seed); + return XXH3_128bits_withSecret(state->buffer, (size_t)(state->totalLen), + secret, state->secretLimit + XXH_STRIPE_LEN); +} +#endif /* !XXH_NO_STREAM */ +/* 128-bit utility functions */ + +/* return : 1 is equal, 0 if different */ +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API int XXH128_isEqual(XXH128_hash_t h1, XXH128_hash_t h2) +{ + /* note : XXH128_hash_t is compact, it has no padding byte */ + return !(XXH_memcmp(&h1, &h2, sizeof(h1))); +} + +/* This prototype is compatible with stdlib's qsort(). + * @return : >0 if *h128_1 > *h128_2 + * <0 if *h128_1 < *h128_2 + * =0 if *h128_1 == *h128_2 */ +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API int XXH128_cmp(XXH_NOESCAPE const void* h128_1, XXH_NOESCAPE const void* h128_2) +{ + XXH128_hash_t const h1 = *(const XXH128_hash_t*)h128_1; + XXH128_hash_t const h2 = *(const XXH128_hash_t*)h128_2; + int const hcmp = (h1.high64 > h2.high64) - (h2.high64 > h1.high64); + /* note : bets that, in most cases, hash values are different */ + if (hcmp) return hcmp; + return (h1.low64 > h2.low64) - (h2.low64 > h1.low64); +} + + +/*====== Canonical representation ======*/ +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API void +XXH128_canonicalFromHash(XXH_NOESCAPE XXH128_canonical_t* dst, XXH128_hash_t hash) +{ + XXH_STATIC_ASSERT(sizeof(XXH128_canonical_t) == sizeof(XXH128_hash_t)); + if (XXH_CPU_LITTLE_ENDIAN) { + hash.high64 = XXH_swap64(hash.high64); + hash.low64 = XXH_swap64(hash.low64); + } + XXH_memcpy(dst, &hash.high64, sizeof(hash.high64)); + XXH_memcpy((char*)dst + sizeof(hash.high64), &hash.low64, sizeof(hash.low64)); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH128_hashFromCanonical(XXH_NOESCAPE const XXH128_canonical_t* src) +{ + XXH128_hash_t h; + h.high64 = XXH_readBE64(src); + h.low64 = XXH_readBE64(src->digest + 8); + return h; +} + + + +/* ========================================== + * Secret generators + * ========================================== + */ +#define XXH_MIN(x, y) (((x) > (y)) ? (y) : (x)) + +XXH_FORCE_INLINE void XXH3_combine16(void* dst, XXH128_hash_t h128) +{ + XXH_writeLE64( dst, XXH_readLE64(dst) ^ h128.low64 ); + XXH_writeLE64( (char*)dst+8, XXH_readLE64((char*)dst+8) ^ h128.high64 ); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_generateSecret(XXH_NOESCAPE void* secretBuffer, size_t secretSize, XXH_NOESCAPE const void* customSeed, size_t customSeedSize) +{ +#if (XXH_DEBUGLEVEL >= 1) + XXH_ASSERT(secretBuffer != NULL); + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); +#else + /* production mode, assert() are disabled */ + if (secretBuffer == NULL) return XXH_ERROR; + if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; +#endif + + if (customSeedSize == 0) { + customSeed = XXH3_kSecret; + customSeedSize = XXH_SECRET_DEFAULT_SIZE; + } +#if (XXH_DEBUGLEVEL >= 1) + XXH_ASSERT(customSeed != NULL); +#else + if (customSeed == NULL) return XXH_ERROR; +#endif + + /* Fill secretBuffer with a copy of customSeed - repeat as needed */ + { size_t pos = 0; + while (pos < secretSize) { + size_t const toCopy = XXH_MIN((secretSize - pos), customSeedSize); + XXH_memcpy((char*)secretBuffer + pos, customSeed, toCopy); + pos += toCopy; + } } + + { size_t const nbSeg16 = secretSize / 16; + size_t n; + XXH128_canonical_t scrambler; + XXH128_canonicalFromHash(&scrambler, XXH128(customSeed, customSeedSize, 0)); + for (n=0; nbuffer = (u8 *)buffer; + arena->length = size; + arena->pos = 0; + + return arena; +} + +static Arena * +ArenaCreate(usize size) +{ + u8 *mem = (u8 *)pMemAllocZeroed(size); + return ArenaInit(mem, size); +} + +static Arena * +ArenaCreateDebug(usize size, u32 init_line_no) +{ + u8 *mem = (u8 *)pMemAllocZeroed(size); + return ArenaInitDebug(mem, size, init_line_no); +} + +// TODO: investigate overflows when out of memory because something bad is going on +static rawptr +ArenaAllocAlign(Arena *arena, usize size, usize align) +{ + rawptr ptr = NULL; + + uintptr curr_ptr = (uintptr)arena->buffer + (uintptr)arena->pos; + uintptr offset = AlignPow2(curr_ptr, align); + offset -= (uintptr)arena->buffer; + + if (offset+size <= arena->length) + { + ptr = &arena->buffer[offset]; + arena->pos = offset+size; + } + else + { + Printfln("Out of memory: %d", arena->init_line_no); + Assert(0, "Memory Failure"); + } + + return ptr; +} + +static rawptr +ArenaAlloc(Arena *arena, usize size) +{ + return ArenaAllocAlign(arena, size, DEFAULT_ALIGNMENT); +} + +static void +ArenaFree(Arena *arena) +{ + arena->pos = 0; +} + +static void +ArenaFreeZeroed(Arena *arena) +{ + MemZero(arena->buffer, arena->pos); + ArenaFree(arena); +} + +static void +DeallocArena(Arena *arena) +{ + pMemFree(arena, arena->length); +} + +static Arena * +ArenaInitDebug(rawptr buffer, usize size, u32 init_line_no) +{ + Arena *arena = ArenaInit(buffer, size); + arena->init_line_no = init_line_no; + return arena; +} diff --git a/src/alloc.h b/src/alloc.h new file mode 100644 index 0000000..ff5244d --- /dev/null +++ b/src/alloc.h @@ -0,0 +1,30 @@ +#pragma once + +// ::Types:: + +constexpr usize ARENA_HEADER_SIZE = 32; + +typedef struct Arena +{ + u8 *buffer; + usize length; + usize pos; + u32 init_line_no; +} Arena; + +// ::Allocator::Util::Header:: + +static inline usize CalcPaddingWithHeader(uintptr ptr, uintptr alignment, usize header_size); +static inline usize CalcPadding(uintptr ptr, uintptr alignment); + +// ::Allocator::Arena::Header:: + +static Arena *ArenaInit(rawptr buffer, usize size); +static Arena *ArenaCreate(usize size); +static Arena *ArenaCreateDebug(usize size, u32 init_line_no); +static Arena *ArenaInitDebug(rawptr buffer, usize size, u32 init_line_no); +static rawptr ArenaAllocAlign(Arena *arena, usize size, usize align); +static rawptr ArenaAlloc(Arena *arena, usize size); +static void ArenaFree(Arena *arena); +static void ArenaFreeZeroed(Arena *arena); +static void DeallocArena(Arena *arena); diff --git a/src/assets.cpp b/src/assets.cpp new file mode 100644 index 0000000..e5eba1f --- /dev/null +++ b/src/assets.cpp @@ -0,0 +1,482 @@ +// ::Assets::Constants::Start:: + +const u32 M3D_FILE = CreateMagicValue('3', 'D', 'M', 'O'); +const u32 M3D_PREVIEW = CreateMagicValue('P', 'R', 'V', 'W'); +const u32 M3D_HEAD = CreateMagicValue('H', 'E', 'A', 'D'); +const u32 M3D_END_CHUNK = CreateMagicValue('O', 'M', 'D', '3'); +const u32 M3D_ASSET = CreateMagicValue('A', 'S', 'E', 'T'); +const u32 M3D_ACTION = CreateMagicValue('A', 'C', 'T', 'N'); +const u32 M3D_COL_MAP = CreateMagicValue('C', 'M', 'A', 'P'); +const u32 M3D_TEX_MAP = CreateMagicValue('T', 'M', 'A', 'P'); +const u32 M3D_VERT = CreateMagicValue('V', 'R', 'T', 'S'); +const u32 M3D_BONE = CreateMagicValue('B', 'O', 'N', 'E'); +const u32 M3D_MAT = CreateMagicValue('M', 'T', 'R', 'L'); +const u32 M3D_PROCEDURAL = CreateMagicValue('P', 'R', 'O', 'C'); +const u32 M3D_MESH = CreateMagicValue('M', 'E', 'S', 'H'); +const u32 M3D_VOXEL_TYPE = CreateMagicValue('V', 'O', 'X', 'T'); +const u32 M3D_VOXEL_DATA = CreateMagicValue('V', 'O', 'X', 'D'); +const u32 M3D_SHAPE = CreateMagicValue('S', 'H', 'P', 'E'); +const u32 M3D_LABEL = CreateMagicValue('L', 'B', 'L', 'S'); + + +// ::Assets::Constants::Start:: + + + +// ::Assets::Globals::Start:: + +#ifndef BUILD_PACKER + u8 ASSET_PACK[] = + { + #embed "../build/assets.sgp" + }; +#else + u8 ASSET_PACK[] = {}; +#endif + +static FileHeader File_Header = {0}; + +static AssetFile Asset_Info[ASSET_MAX]; +static Asset Asset_Data[ASSET_MAX]; + +static b32 ASSET_HEADER_LOADED = false; + + +// ::Assets::Global::End:: + + + +// ::Assets::Init::Functions::Start:: + +static void apInit() +{ + MemCpy(&File_Header, ASSET_PACK, sizeof(FileHeader)); + + Assert(File_Header.magic_num == CreateMagicValue('s', 't', 'e', 'g'), "Magic value is incorrect"); + Assert(File_Header.version == FILE_VERSION, "Asset file version mismatch"); + + MemCpy(Asset_Info, &ASSET_PACK[File_Header.asset_offset], sizeof(AssetFile) * File_Header.asset_counts); + + ASSET_HEADER_LOADED = true; +} + +// ::Assets::Init::Functions::End:: + + + +// ::Assets::Loading::Functions::Start:: + +static Asset * +apAssetSearch(u64 hash) +{ + Asset *asset = NULL; + + for (u64 i = 0; i < ASSET_MAX; i++) + { + if (asset == NULL && Asset_Data[i].hash == 0) + { + asset = Asset_Data + i; + } + + if (hash == Asset_Data[i].hash) + { + asset = Asset_Data + i; + break; + } + } + + return asset; +} + +static Asset +apLoadWithHash(u64 hash) +{ + if (!ASSET_HEADER_LOADED) + { + apInit(); + } + + Asset *asset = apAssetSearch(hash); + AssetFile file_info = {0}; + + if (asset->bytes == NULL) + { + for (u64 i = 0; i < ASSET_MAX; i++) + { + if (hash == Asset_Info[i].hash) + { + file_info = Asset_Info[i]; + break; + } + } + + if (file_info.hash != 0) + { + asset->hash = hash; + asset->type = file_info.type; + + u8 *bytes = (u8 *)malloc(file_info.len); + MemCpy(bytes, &ASSET_PACK[file_info.data_offset], file_info.len); + + if (file_info.type == AT_MODEL) + { + asset->model = apParseModel(bytes); + asset->model_meta = file_info.model_meta; + free(bytes); + } + else + { + asset->len = file_info.len; + asset->bytes = bytes; + asset->texture_meta = file_info.texture_meta; + } + } + } + + return *asset; +} + +static Asset +apLoad(c8 *str) +{ + u64 hash = HashFromString(String8CStr(str)); + return apLoadWithHash(hash); +} + +static Asset +apLoadS8(String8 str) +{ + return apLoad(str.value); +} + +static void +apUnloadWithHash(u64 hash) +{ + Asset *asset = apAssetSearch(hash); + + if (asset->bytes != NULL) + { + if (asset->type == AT_MODEL) + { + apFreeModel(asset->model); + } + else + { + free(asset->bytes); + } + + asset->bytes = NULL; + asset->type = AT_NONE; + asset->len = 0; + asset->hash = 0; + } +} + +static void +apUnload(c8 *str) +{ + u64 hash = HashFromString(String8CStr(str)); + apUnloadWithHash(hash); +} + +static void +apUnloadS8(String8 str) +{ + apUnload(str.value); +} + +static u64 +apAssetIndex(c8 *str) +{ + return 0; +} + +/* +static Asset apLoadTexture(TextureAsset asset_id) +{ + if (!ASSET_HEADER_LOADED) + { + apInit(); + } + + Assert(asset_id < i32(TEXTURE_ASSET_MAX), "LoadTextureAsset failure: asset_id is higher than TEXTURE_ASSET_MAX"); + + Asset asset = Texture_Asset_Lookup[asset_id]; + + if (asset.bytes == NULL) + { + AssetFile *asset_info = Texture_Assets + asset_id; + u8 *img = malloc(asset_info->len); + MemCpy(img, &ASSET_PACK[asset_info->data_offset], asset_info->len); + + asset.bytes = img; + asset.len = asset_info->len; + + Texture_Asset_Lookup[asset_id] = asset; + } + + return asset; +} + +static Asset apLoadShader(ShaderAsset asset_id) +{ + if (!ASSET_HEADER_LOADED) + { + apInit(); + } + + Assert(asset_id < SHADER_ASSET_MAX, "LoadShaderAsset failure: asset_id is higher than SHADER_ASSET_MAX"); + + Asset asset = Shader_Asset_Lookup[asset_id]; + if (asset.bytes == NULL) + { + AssetFile *asset_info = Shader_Assets + asset_id; + + asset.bytes = malloc(asset_info->len); + MemCpy(asset.bytes, &ASSET_PACK[asset_info->data_offset], asset_info->len); + asset.len = asset_info->len; + Shader_Asset_Lookup[asset_id] = asset; + } + + return asset; +} + +static Asset apLoadModel(ModelAsset asset_id) +{ + if (!ASSET_HEADER_LOADED) + { + apInit(); + } + + Assert(asset_id < MODEL_ASSET_MAX, "apLoadModel failure: asset_id is higher than MODEL_ASSET_MAX"); + + Asset asset = Model_Asset_Lookup[asset_id]; + if (asset.bytes == NULL) + { + AssetFile *asset_info = Model_Assets + asset_id; + + u8 *bytes = malloc(asset_info->len); + MemCpy(bytes, &ASSET_PACK[asset_info->data_offset], asset_info->len); + asset.model = apParseModel(bytes); + + free(bytes); + + Model_Asset_Lookup[asset_id] = asset; + } + + return asset; +} + +static TexMeta apGetTextureMeta(TextureAsset asset_id) +{ + AssetFile *asset_file = Texture_Assets + asset_id; + return asset_file->texture_meta; +} + +static ModelMeta apGetModelMeta(ModelAsset asset_id) +{ + //AssetFile *asset_file = Model_Assets + asset_id; + //return asset_file->model_meta; + + ModelMeta meta = {0}; + Asset asset = Model_Asset_Lookup[asset_id]; + if (asset.model != NULL) + { + meta.i_count = asset.model->index.count; + } + + return meta; +} + +static void apUnloadTexture(TextureAsset asset_id) +{ + Asset *asset = Texture_Asset_Lookup + asset_id; + if (asset->bytes != NULL) + { + free(asset->bytes); + asset->bytes = NULL; + asset->len = 0; + } +} + +static void apUnloadShader(ShaderAsset asset_id) +{ + Asset *asset = Shader_Asset_Lookup + asset_id; + if (asset->bytes != NULL) + { + free(asset->bytes); + asset->bytes = NULL; + asset->len = 0; + } +} + +static void apUnloadModel(ModelAsset asset_id) +{ + Asset *asset = Model_Asset_Lookup + asset_id; + if (asset->bytes != NULL) + { + free(asset->bytes); + asset->bytes = NULL; + asset->len = 0; + } +} + +*/ + +// ::Assets::Loading::Functions::End:: + + + +// ::Assets::Images::Start:: + +static Image +apLoadImage(u8 *data, u64 len) +{ + Image image = {0}; + image.w = -1; + image.h = -1; + image.ch = -1; + + int ch = 4; + int w, h, has_ch; + u8 *bytes = stbi_load_from_memory(data, len, &w, &h, &has_ch, ch); + if (w <= 0 || h <= 0 || has_ch <= 0) + { + Printfln("apLoadImage failure: %s", stbi_failure_reason()); + } + else + { + image.data = bytes; + image.w = w; + image.h = h; + image.ch = has_ch; + } + + return image; +} + +static void +apFreeImage(Image *image) +{ + if (image->data != NULL) + { + stbi_image_free(image->data); + } +} + +// ::Assets::Images::End:: + + + +// ::Assets::Models::Functions::Start:: + +static inline b32 apChkMag(u32 *magic, u32 expected) +{ + return *magic == expected; +} + +// TODO: parse this without the SDK +static Model * +apParseModel(u8 *data) +{ + m3d_t *m3d = m3d_load(data, NULL, NULL, NULL); + Assert(m3d != NULL, "model returned is NULL"); + + Printfln("model: %s", m3d->name); + Printfln("numcmap: %llu", m3d->numcmap); + Printfln("numtmap: %llu", m3d->numtmap); + Printfln("numtexture: %llu", m3d->numtexture); + Printfln("numbone: %llu", m3d->numbone); + Printfln("numvertex: %llu", m3d->numvertex); + Printfln("numskin: %llu", m3d->numskin); + Printfln("nummaterial: %llu", m3d->nummaterial); + Printfln("numface: %llu", m3d->numface); + Printfln("numvoxtype: %llu", m3d->numvoxtype); + Printfln("numvoxel: %llu", m3d->numvoxel); + Printfln("numshape: %llu", m3d->numshape); + Printfln("numlabel: %llu", m3d->numlabel); + Printfln("numaction: %llu", m3d->numaction); + Printfln("numinlined: %llu", m3d->numinlined); + Printfln("numextra: %llu", m3d->numextra); + + Model *model = (Model *)malloc(sizeof(Model)); + + model->vertex.count = u64(m3d->numvertex); + model->vertex.data = (Vertex *)malloc(sizeof(Vertex) * model->vertex.count); + + model->index.count = u64(m3d->numface * 3); + model->index.data = (u32 *)malloc(sizeof(u32) * model->index.count); + + model->material.count = u64(m3d->nummaterial); + model->material.data = (Material *)malloc(sizeof(Material) * m3d->nummaterial); + + for (u64 i = 0; i < m3d->nummaterial; i += 1) + { + for (u64 j = 0; j < m3d->material[i].numprop; j += 1) + { + switch (m3d->material[i].prop[j].type) + { + case m3dp_Kd: + { + U32ColToVec4(&model->material.data[i].color, m3d->material[i].prop[j].value.color); + } break; + case m3dp_Ka: + { + U32ColToVec4(&model->material.data[i].ambient, m3d->material[i].prop[j].value.color); + } break; + case m3dp_Ks: + { + U32ColToVec4(&model->material.data[i].specular, m3d->material[i].prop[j].value.color); + } break; + case m3dp_Ke: + { + U32ColToVec4(&model->material.data[i].emission, m3d->material[i].prop[j].value.color); + } break; + case m3dp_Ns: + { + model->material.data[i].shininess = m3d->material[i].prop[j].value.fnum; + } break; + } + } + } + + for (u64 i = 0; i < m3d->numinlined; i += 1) + { + Image texture = apLoadImage(m3d->inlined[i].data, m3d->inlined[i].length); + Assert(texture.data != NULL, "Image is null"); + } + + /* + TODO: replace + for (u64 i = 0; i < m3d->numvertex; i += 1) + { + model->vertex.data[i].pos.x = m3d->vertex[i].x; + model->vertex.data[i].pos.y = m3d->vertex[i].y; + model->vertex.data[i].pos.z = m3d->vertex[i].z; + model->vertex.data[i].pos.w = m3d->vertex[i].w; + + model->vertex.data[i].col.packed = m3d->vertex[i].color; + } + + for (u64 i = 0, j = 0; i < m3d->numface; i += 1, j += 3) + { + model->index.data[j] = m3d->face[i].vertex[0]; + model->index.data[j+1] = m3d->face[i].vertex[1]; + model->index.data[j+2] = m3d->face[i].vertex[2]; + } + */ + + m3d_free(m3d); + + return model; +} + +static void apFreeModel(Model *model) +{ + free(model->vertex.data); + free(model->index.data); + free(model); +} + +// ::Assets::Models::Functions::End:: + diff --git a/src/assets.h b/src/assets.h new file mode 100644 index 0000000..04d8881 --- /dev/null +++ b/src/assets.h @@ -0,0 +1,164 @@ +#pragma once + +// ::Assets::Macros::Header:: + +#define FILE_VERSION 3U + +#define CreateMagicValue(a, b, c, d) ((u32)(d << 24) | (u32)(c << 16) | (u32)(b << 8) | (u32)(a)) + +// ::Assets::Globals::Header:: +#include "codegen_assets.h" + +// ::Assets::Types::Header:: + +typedef struct Vertex +{ + f32 v_x, v_y, v_z; + f32 n_x, n_y, n_z; + f32 uv_x, uv_y; + u32 color; +} Vertex; + +typedef struct Image +{ + rawptr data; + i32 w; + i32 h; + i32 ch; +} Image; + +typedef struct Material +{ + Vec4 color; + Vec4 ambient; + Vec4 specular; + Vec4 emission; + f32 shininess; +} Material; + +typedef struct ModelIndex +{ + u32 material; + u32 start; + u32 count; +} ModelIndex; + +typedef struct Model +{ + struct + { + Vertex *data; + u64 count; + } vertex; + struct + { + u32 *data; + u64 count; + } index; + struct + { + Material *data; + u64 count; + } material; + struct + { + ModelIndex *data; + u64 count; + } offset; +} Model; + +typedef struct TexMeta +{ + u32 w; + u32 h; + u32 ch; +} TexMeta; + +typedef struct ModelMeta +{ + u64 i_count; +} ModelMeta; + +typedef struct AssetTag +{ + u32 tag_id; + f32 value; +} AssetTag; + +typedef enum AssetType_e +{ + AT_NONE, + AT_SHADER, + AT_TEXTURE, + AT_MODEL, +} AssetType; + +typedef struct Asset +{ + union + { + const char *cstr; + u8 *bytes; + Model *model; + }; + union + { + TexMeta texture_meta; + ModelMeta model_meta; + }; + u64 hash; + u64 len; + AssetType type; +} Asset; + +typedef struct AssetFile +{ + union + { + TexMeta texture_meta; + ModelMeta model_meta; + }; + u64 hash; + u64 data_offset; + u64 len; + AssetType type; +} AssetFile; + +typedef struct FileHeader +{ + u32 magic_num; + u32 version; + u32 asset_counts; + u64 asset_offset; +} FileHeader; + +// ::Assets::Init::Functions::Header:: + +static void apInit(); + +// ::Assets::Loading::Functions::Header:: + +static Asset apLoad(c8 *str); +static Asset apLoadS8(String8 str); +static Asset apLoadWithHash(u64 hash); +static void apUnload(c8 *str); +static void apUnloadS8(String8 str); +static void apUnloadWithHash(u64 hash); +static u64 apAssetIndex(c8 *str); +static Asset *apAssetSearch(u64 hash); + +// ::Assets::Util::Functions::Header:: + +// TODO(MA): Implement async asset handling +static inline b32 apMarkUnloaded(c8 *str); +static inline void apMarkLoaded(c8 *str); + +// ::Assets::Images::Header:: + +static Image apLoadImage(rawptr data, u64 len); +static void apFreeImage(Image *image); + +// ::Assets::Models::Functions::Header:: + +static Model *apParseModel(u8 *data); +static void apFreeModel(Model *model); diff --git a/src/base_types.h b/src/base_types.h new file mode 100644 index 0000000..c1426f4 --- /dev/null +++ b/src/base_types.h @@ -0,0 +1,92 @@ +#pragma once + +#include + +#ifdef __linux__ +# include +# include +#endif + +// ::BaseTypes:: + +typedef int8_t i8; +typedef int16_t i16; +typedef int32_t i32; +typedef int64_t i64; + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; + +typedef char c8; + +typedef intptr_t intptr; +typedef uintptr_t uintptr; + +typedef float f32; +typedef double f64; + +typedef uint8_t b8; +typedef uint32_t b32; + +typedef void * rawptr; + +#ifdef __linux__ + typedef ssize_t isize; + typedef size_t usize; +#elif _WIN64 + typedef int64_t isize; + typedef u64 usize; +#elif _WIN32 + typedef i32 isize; + typedef u32 usize; +#endif + +typedef struct String8 +{ + c8 *value; + u64 len; +} String8; + +typedef union +{ + struct { f32 x, y, z, w; }; + struct { f32 r, g, b, a; }; +} Vec4; + +typedef union +{ + struct { u8 x, y, z, w; }; + struct { u8 r, g, b, a; }; + struct { u32 packed; }; +} U8Vec4; + +// ::Macros:: + +#define i8(x) ((i8)(x)) +#define i16(x) ((i16)(x)) +#define i32(x) ((i32)(x)) +#define i64(x) ((i64)(x)) + +#define u8(x) ((u8)(x)) +#define u16(x) ((u16)(x)) +#define u32(x) ((u32)(x)) +#define u64(x) ((u64)(x)) + +#define c8(x) ((c8)(x)) +#define c8ptr(x) ((c8 *)(x)) +#define u8ptr(x) ((u8 *)(x)) +#define i8ptr(x) ((i8 *)(x)) + +#define intptr(x) ((intptr)(x)) +#define uintptr(x) ((uintptr)(x)) + +#define f32(x) ((f32)(x)) +#define f64(x) ((f64)(x)) + +#define rawptr(x) ((rawptr)(x)) + +#define cast(T, x) ((T)(x)) + +#define isizeof(T) ((isize)(sizeof(T))) diff --git a/src/codegen.cpp b/src/codegen.cpp new file mode 100644 index 0000000..415ec37 --- /dev/null +++ b/src/codegen.cpp @@ -0,0 +1,172 @@ +#include "codegen.h" + +#include "os.cpp" + +#include "xxhash/xxhash.c" + +u64 +WriteArrayToFile(Arena *arena, pFile file, String8 array_name, rawptr elements, u32 count, String8 type, u64 offset) +{ + b32 is_string = StrEq(type.value, "c8 *"); + c8 *decl = MakeArray(arena, c8, 2048); + i32 decl_len = SPrintf(decl, 2048, "static %s\n%s[] = \n{\n\t", type.value, array_name.value); + String8 result = { + .value = decl, + .len = u64(decl_len), + }; + + if (is_string) + { + String8 *strs = (String8 *)elements; + for (u32 i = 0; i < count; i += 1) + { + const c8 *f = i == count-1 ? "\"%s\"," : "\"%s\",\n\t"; + c8 buf[512]; + decl_len = SPrintf(buf, 512, f, strs[i].value); + result = String8Concat(arena, result, MakeString8(buf, decl_len)); + } + } + else + { + u64 *ints = (u64 *)elements; + for (u32 i = 0; i < count; i += 1) + { + const c8 *f = i == count-1 ? "%lluU," : "%lluU,\n\t"; + c8 buf[512]; + decl_len = SPrintf(buf, 512, f, ints[i]); + result = String8Concat(arena, result, MakeString8(buf, decl_len)); + } + } + + result = String8Concat(arena, result, String8CStr("\n};\n\n")); + + return pFileWrite(file, offset, result.value, result.len); +} + +static String8 * +ConvertCStrs(Arena *arena, c8 **strs, u32 count) +{ + String8 *str8s = MakeArray(arena, String8, count); + + for (u32 i = 0; i < count; i += 1) + { + str8s[i].value = strs[i]; + str8s[i].len = StrLen(strs[i]); + } + + return str8s; +} + +void +CodeGenAssetLookups(Arena *arena) +{ + pFile file = pFileOpen("../src/codegen_assets.h", pFS_WRITE | pFS_CREATE | pFS_TRUNC); + Assert(file > 0, "CodeGenAssetLookups failure: unable to open/create file"); + + Assert(pDirNavigate("../assets") == 0, "Unable to navigate to asset directory"); + + struct AssetDirInfo { + c8 *prefix, *struct_name, *hash_struct_name, *dir, *define; + }; + + struct AssetDirInfo dirs[] = { + { + .prefix = "shaders/", + .struct_name = "g_Shader_Asset_Names", + .hash_struct_name = "g_Shader_Asset_Hashes", + .dir = "shaders", + .define = "SHADER_ASSET", + }, + { + .prefix = "models/", + .struct_name = "g_Model_Asset_Names", + .hash_struct_name = "g_Model_Asset_Hashes", + .dir = "models", + .define = "MODEL_ASSET", + }, + { + .prefix = "textures/", + .struct_name = "g_Texture_Asset_Names", + .hash_struct_name = "g_Texture_Asset_Hashes", + .dir = "textures", + .define = "TEXTURE_ASSET", + }, + }; + + u64 total_assets = 0; + u64 offset = 0; + u32 dir_count = sizeof(dirs) / sizeof(struct AssetDirInfo); + for (u32 i = 0; i < dir_count; i += 1) + { + Assert(pDirNavigate(dirs[i].dir) == 0, "Unable to navigate to asset sub directory."); + + u32 count = 0; + c8 **cstrs = pDirGetFileNames(arena, &count); + u64 *hashes = MakeArray(arena, u64, count); + String8 *strs = ConvertCStrs(arena, cstrs, count); + + for (u32 j = 0; j < count; j += 1) + { + strs[j] = String8Concat(arena, String8CStr(dirs[i].prefix), strs[j]); + i64 offset = String8FindLast(strs[j], '.'); + hashes[j] = XXH3_64bits_withSeed(strs[j].value, offset, HASH_SEED); + } + + offset += WriteArrayToFile( + arena, + file, + String8CStr(dirs[i].struct_name), + strs, + count, + String8CStr("c8 *"), + offset + ); + + offset += WriteArrayToFile( + arena, + file, + String8CStr(dirs[i].hash_struct_name), + hashes, + count, + String8CStr("u64"), + offset + ); + + c8 buf[256]; + i32 decl_len = SPrintf(buf, 256, "#define %s_MAX %lluU\n\n#define %s %dU\n\n", dirs[i].define, count, dirs[i].define, i); + + offset += pFileWrite(file, offset, buf, decl_len); + + total_assets += count; + + if (i == dir_count-1) + { + decl_len = SPrintf(buf, 256, "#define ASSET_MAX %lluU\n\n#define RENDERER_ASSET_MAX (ASSET_MAX - SHADER_ASSET_MAX)\n\n#define ASSET_TYPE_MAX %dU\n\n", total_assets, i+1); + pFileWrite(file, offset, buf, decl_len); + } + + Assert(pDirNavigate("..") == 0, "CodeGenAssetLookups failure: unable to move back to build directory"); + } + + pFileClose(file); +} + +int +main(int argc, c8 **argv) +{ + #ifdef _WIN32 + { + _set_fmode(_O_BINARY); + } + #endif + + if (pDirIsVisible("build")) + { + Assert(pDirNavigate("./build") == 0, "Unable to change to build directory"); + } + + void *mem = pMemAllocZeroed(GB(1)); + Arena *arena = ArenaInitDebug(mem, GB(1), __LINE__); + + CodeGenAssetLookups(arena); +} diff --git a/src/codegen.h b/src/codegen.h new file mode 100644 index 0000000..f732cf7 --- /dev/null +++ b/src/codegen.h @@ -0,0 +1,6 @@ +#pragma once + +#define STG_IMPLEMENTATION + +#include "os.h" + diff --git a/src/codegen_assets.h b/src/codegen_assets.h new file mode 100644 index 0000000..dfdec60 --- /dev/null +++ b/src/codegen_assets.h @@ -0,0 +1,72 @@ +static c8 * +g_Shader_Asset_Names[] = +{ + "shaders/pbr.frag.spv", + "shaders/pbr.vert.spv", +}; + +static u64 +g_Shader_Asset_Hashes[] = +{ + 2230071466542309169U, + 8518761701216801634U, +}; + +#define SHADER_ASSET_MAX 2U + +#define SHADER_ASSET 0U + +static c8 * +g_Model_Asset_Names[] = +{ + "models/cube.m3d", + "models/test_char.m3d", + "models/yoda.m3d", +}; + +static u64 +g_Model_Asset_Hashes[] = +{ + 16487010975852376380U, + 13826959199295087925U, + 4559395153940738542U, +}; + +#define MODEL_ASSET_MAX 3U + +#define MODEL_ASSET 1U + +static c8 * +g_Texture_Asset_Names[] = +{ + "textures/ham_smoke.png", + "textures/cheesoid.png", + "textures/hog.jpg", + "textures/patamon.png", + "textures/pattermon.png", + "textures/hamster.png", + "textures/purplemon.png", +}; + +static u64 +g_Texture_Asset_Hashes[] = +{ + 15457434128510259736U, + 12443444479937967236U, + 5538438794723924882U, + 16650761267170532297U, + 11718504567089932798U, + 7627422980398294448U, + 14316598952102237724U, +}; + +#define TEXTURE_ASSET_MAX 7U + +#define TEXTURE_ASSET 2U + +#define ASSET_MAX 12U + +#define RENDERER_ASSET_MAX (ASSET_MAX - SHADER_ASSET_MAX) + +#define ASSET_TYPE_MAX 3U + diff --git a/src/entry_linux.cpp b/src/entry_linux.cpp new file mode 100644 index 0000000..1759837 --- /dev/null +++ b/src/entry_linux.cpp @@ -0,0 +1,14 @@ +#include "entry_linux.h" + +#include "os_linux.cpp" + +#include "renderer.cpp" + +int +main(int argc, char **argv) +{ + Renderer renderer; + Init(&renderer); + + while (RunCycle(&renderer)); +} diff --git a/src/entry_linux.h b/src/entry_linux.h new file mode 100644 index 0000000..d5772c4 --- /dev/null +++ b/src/entry_linux.h @@ -0,0 +1,7 @@ +#pragma once + +#include "os_linux.h" + +#include "renderer.h" + +int main(int argc, char **argv); diff --git a/src/os.cpp b/src/os.cpp new file mode 100644 index 0000000..0beae6f --- /dev/null +++ b/src/os.cpp @@ -0,0 +1,7 @@ +#pragma once + +#ifdef __linux__ +# include "os_linux.cpp" +#elif _WIN32 +# include "os_win32.cpp" +#endif diff --git a/src/os.h b/src/os.h new file mode 100644 index 0000000..5f3693e --- /dev/null +++ b/src/os.h @@ -0,0 +1,7 @@ +#pragma once + +#ifdef __linux__ +# include "os_linux.h" +#elif _WIN32 +# include "os_win32.h" +#endif diff --git a/src/os_linux.cpp b/src/os_linux.cpp new file mode 100644 index 0000000..1d3da21 --- /dev/null +++ b/src/os_linux.cpp @@ -0,0 +1,466 @@ +#include "os_linux.h" + +// ::Constants:: +static b32 g_Global_Quit = false; + +// TODO: figure out a way to get appropriate defaults +static constexpr i32 WINDOW_WIDTH = 1280; +static constexpr i32 WINDOW_HEIGHT = 720; + +// ::Misc::Impl::Start:: + +static b32 +pSyscallErrCheck(void *ptr) +{ + return (isize)ptr == SYS_ERR ? true : false; +} + +// ::Misc::Impl::End:: + + +// ::Console::Impl::Start:: + +static i32 +pWriteStdOut(void * buf, i32 len) +{ + return (i32)write(STDOUT, buf, len); +} + +static i32 +pWriteStdErr(void * buf, i32 len) +{ + return (i32)write(STDERR, buf, len); +} + +static i32 +SPrintf(char *buf, int len, const char *fmt, ...) +{ + va_list arg; + + va_start(arg, fmt); + int sprf_res = stbsp_vsnprintf(buf, len, fmt, arg); + va_end(arg); + + return sprf_res; +} + +static i32 +Printf(const char *fmt, ...) +{ + va_list arg; + + va_start(arg, fmt); + i32 result = PrintfVargs(fmt, arg); + va_end(arg); + + return result; +} + +static i32 +Printfln(const char *fmt, ...) +{ + va_list arg; + + va_start(arg, fmt); + i32 result = PrintflnVargs(fmt, arg); + va_end(arg); + + return result; +} + +static i32 +EPrintf(const char *fmt, ...) +{ + va_list arg; + + va_start(arg, fmt); + i32 result = EPrintfVargs(fmt, arg); + va_end(arg); + + return result; +} + +static i32 +EPrint(void *str) +{ + return pWriteStdErr(str, StrLen((const char*)str)); +} + +static i32 +EPrintfVargs(const char *fmt, va_list arg) +{ + char buffer[1024]; + + int sprf_res = stbsp_vsnprintf(&buffer[0], 1024, fmt, arg); + + if (sprf_res < 0) return sprf_res; + + return EPrint(&buffer); +} + +static i32 +PrintfVargs(const char *fmt, va_list arg) +{ + char buffer[1024]; + + int sprf_res = stbsp_vsnprintf(&buffer[0], 1024, fmt, arg); + + i32 pr_res; + if (sprf_res < 0) + pr_res = sprf_res; + else + pr_res = pWriteStdOut(&buffer, sprf_res); + + return pr_res; +} + +static i32 +PrintflnVargs(const char *fmt, va_list arg) +{ + char buffer[1024]; + + int sprf_res = stbsp_vsnprintf(&buffer[0], 1023, fmt, arg); + + i32 pr_res; + if (sprf_res < 0) + { + pr_res = sprf_res; + } + else + { + buffer[sprf_res] = '\n'; + buffer[sprf_res+1] = '\0'; + pr_res = pWriteStdOut(&buffer, sprf_res+1); + } + + return pr_res; +} + +// ::Console::Impl::End:: + + +// ::DynLib::Impl:: + +static b32 +pLibraryLoad(const char *name, pLibrary *out_lib) +{ + if (!name) { + return false; + } + + out_lib->lib = dlopen(name, RTLD_NOW); + if (!out_lib->lib) { + return false; + } + + return true; +} + +static b32 +pFunctionLoad(const char *name, pLibrary *lib, pFunction *out_fn) +{ + if (!name) { + return false; + } + + out_fn->fn = dlsym(lib->lib, name); + if (!out_fn->fn) { + Printf("unable to find function\n"); + return false; + } + + return true; +} + +// ::MemAlloc::Impl:: + +static void * +pMemAlloc(size_t size) +{ + void * addr = mmap( + NULL, + size, + PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE, + -1, + 0 + ); + + if (pSyscallErrCheck(addr)) addr = NULL; + + return addr; +} + +static void * +pMemAllocZeroed(size_t size) +{ + void * ptr = pMemAlloc(size); + MemZero(ptr, size); + return ptr; +} + +static void * +pMemRealloc(void * ptr, size_t old_size, size_t new_size) +{ + void * addr = mremap( + ptr, + old_size, + new_size, + MAP_ANON | MAP_PRIVATE + ); + + if (pSyscallErrCheck(addr)) addr = NULL; + + return addr; +} + +static void +pMemFree(void * ptr, size_t size) +{ + Assert(munmap(ptr, size) == 0, "munmap failed"); +} + +// ::FileSystem::Impl::Start:: + +static b32 +pDirNavigate(char *dir) +{ + return chdir(dir); +} + +static pFile +pFileOpen(char *file_name, pFileAccess acc) +{ + int flags = 0; + if (BitEq(acc, pFS_READ) && BitEq(acc, pFS_WRITE)) + flags = O_RDWR; + else if (BitEq(acc, pFS_READ)) + flags = O_RDONLY; + else if (BitEq(acc, pFS_WRITE)) + flags = O_WRONLY; + + if (BitEq(acc, pFS_TRUNC)) + { + flags |= O_TRUNC; + } + else if (BitEq(acc, pFS_APPEND)) + flags |= O_APPEND; + + if (BitEq(acc, pFS_CREATE)) + flags |= O_CREAT; + + i64 file = open(file_name, flags, S_IRUSR|S_IWUSR|S_IRGRP); + if (file < 0) + { + Printfln("errno: %d", errno); + Assert(false, "failed to open file"); + } + + return file; +} + +static void +pFileClose(pFile file) +{ + fsync(file); + close(file); +} + +static u64 +pFileRead(pFile file, u64 offset, void * buf, u64 len) +{ + i64 new_offset = lseek(file, offset, SEEK_SET); + if (new_offset < 0) + { + Printfln("errno: %d", errno); + Assert(false, "failed to read file"); + } + return read(file, buf, (size_t)len); +} + +static u64 +pFileWrite(pFile file, u64 offset, void * buf, u64 len) +{ + lseek(file, offset, SEEK_SET); + return write(file, buf, (size_t)len); +} + +static u64 +pFileSeek(pFile file, u64 pos) +{ + return (u64)lseek(file, (ssize_t)pos, SEEK_SET); +} + +static u64 +pFileLength(pFile file) +{ + ssize_t offset = lseek(file, 0, SEEK_CUR); + ssize_t size = lseek(file, 0, SEEK_END); + lseek(file, offset, SEEK_SET); + + if (size == -1) + size = UINT64_MAX; + + return (u64)size; +} + +static char ** +pDirGetFileNames(Arena *arena, u32 *count) +{ + struct dirent *dir; + + DIR *d = opendir("."); + + *count = 0; + if (d) + { + while ((dir = readdir(d)) != NULL) + { + if (!StrEq(dir->d_name, ".") && !StrEq(dir->d_name, "..")) + *count += 1; + } + } + + char **file_names = MakeArray(arena, c8*, *count); + + d = opendir("."); + *count = 0; + if (d) + { + while ((dir = readdir(d)) != NULL) + { + if (!StrEq(dir->d_name, ".") && !StrEq(dir->d_name, "..")) + { + i32 str_len = StrLen(dir->d_name); + file_names[*count] = MakeArray(arena, c8, str_len); + MemCpy(file_names[*count], dir->d_name, str_len); + *count += 1; + } + } + } + + return (char **)file_names; +} + +static b32 +pFSIsVisible(char *name, b32 is_dir) +{ + b32 found = false; + + struct dirent *dir; + DIR *d = opendir("."); + u8 type = is_dir ? DT_DIR : DT_REG; + + if (d) + { + while ((dir = readdir(d)) != NULL) + { + if (StrEq(name, dir->d_name) && dir->d_type == type) + { + found = true; + break; + } + } + } + + return found; +} + +static b32 +pDirIsVisible(char *dir_name) +{ + return pFSIsVisible(dir_name, true); +} + +static b32 +pFileIsVisible(char *file_name) +{ + return pFSIsVisible(file_name, false); +} + +static b32 +pFileCanAccess(char *file_name, pFileAccess file_access) +{ + int a = 0; + if (BitEq(file_access, pFS_READ)) + a |= R_OK; + if (BitEq(file_access, pFS_WRITE)) + a |= W_OK; + + return access(file_name, a) == 0; +} + +// ::FileSystem::Impl::End:: + + +// ::Profiling::Impl::Start:: + +static u64 +pOSTimerFreq() +{ + return 1000000; +} + +static u64 +pOSTimerRead() +{ + struct timeval value; + gettimeofday(&value, 0); + + return pOSTimerFreq() * u64(value.tv_sec) + u64(value.tv_usec); +} + +static inline u64 +pCPUTimerRead() +{ + return __rdtsc(); +} + +// ::Profiling::Impl::End:: + + +// ::Atomics::Impl::Start:: + +static inline void +pAtomicSignalFenceSeqCst() +{ + __atomic_signal_fence(__ATOMIC_SEQ_CST); +} + +static inline u32 +pAtomicFetchSubU32(u32 volatile *ptr, u32 count) +{ + return __atomic_fetch_sub(ptr, count, __ATOMIC_ACQUIRE); +} + +static inline u32 +pAtomicFetchIncrU32(u32 volatile *ptr) +{ + return __atomic_fetch_add(ptr, (u32)1, __ATOMIC_ACQUIRE); +} + +static inline void +pAtomicIncrU32(u32 volatile *ptr) +{ + __atomic_fetch_add(ptr, (u32)1, __ATOMIC_RELEASE); +} + +static inline u32 +pAtomicLoadU32(u32 volatile *ptr) +{ + return __atomic_load_n(ptr, __ATOMIC_ACQUIRE); +} + +static inline void +pAtomicStoreB32(b32 volatile *ptr, b32 value) +{ + __atomic_store_n(ptr, value, __ATOMIC_RELEASE); +} + +static inline b32 +pAtomicCompareExchangeB32(b32 volatile *ptr, b32 *expected, b32 desired) +{ + return __atomic_compare_exchange_n(ptr, expected, desired, true, __ATOMIC_ACQUIRE, __ATOMIC_RELAXED); +} + +// ::Atomics::Impl::End:: diff --git a/src/os_linux.h b/src/os_linux.h new file mode 100644 index 0000000..9da963a --- /dev/null +++ b/src/os_linux.h @@ -0,0 +1,176 @@ +#pragma once + +#define STB_SPRINTF_IMPLEMENTATION +#define STB_IMAGE_IMPLEMENTATION + +#include "stb/stb_sprintf.h" +#include "stb/stb_image.h" + +#include "glad/gl.h" + +#include "xxhash/xxhash.h" +#include "xxhash/xxhash.c" + +#define M3D_IMPLEMENTATION + +#include "m3d/m3d.h" + +#include "base_types.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// TODO: Replace this eventually: +#include + +#include "alloc.h" +#include "util.h" + +// ::Constants:: + +constexpr int SYS_ERR = -1; + +constexpr int STDIN = 0; +constexpr int STDOUT = 1; +constexpr int STDERR = 2; + +// ::Enums:: + +typedef enum e_pFSAccess +{ + pFS_READ = 0x01, + pFS_WRITE = 0x02, + pFS_TRUNC = 0x04, + pFS_APPEND = 0x08, + pFS_CREATE = 0x10, +} pFSAccess; + +typedef i32 pFileAccess; + +// ::Types:: + +typedef int pFile; + +typedef struct pThread +{ + pthread_t handle; + pthread_cond_t cond; + pthread_mutex_t mut; +} pThread; + +typedef struct pLibrary +{ + void *lib; +} pLibrary; + +typedef struct pFunction +{ + void *fn; +} pFunction; + +// ::Macros:: + +#define XCB_CHECK_CURRENT_ERROR(window, error, message) do { \ + error = xcb_request_check(window->connection, cookie); \ + if (error != NULL) { \ + EPrintf("%s ERROR CODE: %d\n", message, error->error_code); \ + free(error); \ + return false; \ + } \ +} while (0) + +#define XCB_CHECK_ERROR(window, cookie, error, message) do { \ + error = xcb_request_check(window->connection, cookie); \ + XCB_CHECK_CURRENT_ERROR(window, error, message); \ +} while (0) + +// ::Misc:: + +static b32 pSyscallErrCheck(void *ptr); + +// ::Console:: + +static i32 pWriteStdOut(void *buf, i32 len); +static i32 pWriteStdErr(void *buf, i32 len); + +static i32 SPrintf(char *buf, int len, const char *fmt, ...); +static i32 Printf(const char *fmt, ...); +static i32 Printfln(const char *fmt, ...); +static i32 EPrintf(const char *fmt, ...); + +static i32 PrintfVargs(const char *fmt, va_list arg); +static i32 PrintflnVargs(const char *fmt, va_list arg); +static i32 EPrintfVargs(const char *fmt, va_list arg); + +// ::DynLib:: + +static b32 pLibraryLoad(const char *name, pLibrary *out_lib); +static b32 pFunctionLoad(const char *name, pLibrary *lib, pFunction *out_fn); + +// ::MemAlloc:: + +static void * pMemAlloc(usize size); +static void * pMemAllocZeroed(usize size); +static void * pMemRealloc(void * ptr, usize old_size, usize new_size); +static void pMemFree(void * ptr, usize size); + +// ::FileSystem:: + +static b32 pDirNavigate(char *dir); +static char **pDirGetFileNames(Arena *arena, u32 *count); +static pFile pFileOpen(char *file_name, pFileAccess access); +static void pFileClose(pFile file); +static u64 pFileRead(pFile file, u64 offset, void * buf, u64 len); +static u64 pFileWrite(pFile file, u64 offset, void * buf, u64 len); +static u64 pFileSeek(pFile file, u64 pos); +static u64 pFileLength(pFile file); +static b32 pFSIsVisible(char *name, b32 is_dir); +static b32 pDirIsVisible(char *dir_name); +static b32 pFileIsVisible(char *file_name); +static b32 pFileCanAccess(char *file_name, pFileAccess access); + +// ::Profiling:: + +static u64 pOSTimerFreq(); +static u64 pOSTimerRead(); +static inline u64 pCPUTimerRead(); + +// ::Atomics:: + +static inline void pAtomicSignalFenceSeqCst(); +static inline u32 pAtomicFetchSubU32(u32 volatile *ptr, u32 count); +static inline u32 pAtomicFetchIncrU32(u32 volatile *ptr); +static inline void pAtomicIncrU8(uint8_t volatile *ptr); +static inline void pAtomicIncrU32(u32 volatile *ptr); +static inline u32 pAtomicLoadU32(u32 volatile *ptr); +static inline void pAtomicStoreB32(b32 volatile *ptr, b32 value); +static inline b32 pAtomicCompareExchangeB32(b32 volatile *ptr, b32 *expect, b32 desired); + +// ::Includes:: + +#include "util.cpp" +#include "alloc.cpp" diff --git a/src/packer.cpp b/src/packer.cpp new file mode 100644 index 0000000..2db67e3 --- /dev/null +++ b/src/packer.cpp @@ -0,0 +1,299 @@ +// ::Packer::Includes::CFiles::Start:: + +#include "os.cpp" + +#include "packer.h" + +#include "assets.cpp" + + +#ifdef _WIN32 +# include +#endif + +// ::Packer::Packing::Functions::Start:: + +i32 +WriteHeader(pFile file, FileHeader *header) +{ + i32 offset = 0; + + return offset; +} + +void +MoveToShaderDir(c8 **return_dir) +{ + Assert(pDirNavigate("../assets/shaders") == 0, "Unable to change to shader directory"); + *return_dir = "../../build"; +} + +void +MoveToTextureDir(c8 **return_dir) +{ + Assert(pDirNavigate("../assets/textures") == 0, "Unable to change to assets directory"); + *return_dir = "../../build"; +} + +void +MoveToModelDir(c8 **return_dir) +{ + Assert(pDirNavigate("../assets/models") == 0, "Unable to change to assets directory"); + *return_dir = "../../build"; +} + +void +InitHeader(FileHeader *header) +{ + Assert(header != NULL, "File header is null"); + + header->magic_num = CreateMagicValue('s', 't', 'e', 'g'); + header->version = FILE_VERSION; + + header->asset_counts = SHADER_ASSET_MAX + TEXTURE_ASSET_MAX + MODEL_ASSET_MAX; + header->asset_offset = sizeof(FileHeader); +} + +void +PackFiles(Arena *arena, FileHeader *header) +{ + pFile file = pFileOpen("assets.sgp", pFS_WRITE | pFS_TRUNC | pFS_CREATE); + + u64 file_pos = pFileWrite(file, 0, header, sizeof(FileHeader)); + + Assert(pDirNavigate("../assets") == 0, "Unable to move to assets directory"); + + u64 total_assets = SHADER_ASSET_MAX + TEXTURE_ASSET_MAX + MODEL_ASSET_MAX; + u64 asset_count = 0; + AssetFile *assets = MakeArray(arena, AssetFile, total_assets); + + u64 data_offset = header->asset_offset + (sizeof(AssetFile) * total_assets); + + for (u32 i = 0; i < SHADER_ASSET_MAX; i++, asset_count++) + { + c8 *asset_name = g_Shader_Asset_Names[i]; + + Printfln("Packing file: %s at offset %llu...", asset_name, data_offset); + + pFile asset_file = pFileOpen(asset_name, pFS_READ); + u64 file_size = pFileLength(asset_file); + + u8 *file_data = MakeArray(arena, u8, file_size); + pFileRead(asset_file, 0, file_data, file_size); + + u64 prev_offset = data_offset; + data_offset += pFileWrite(file, prev_offset, file_data, file_size); + + Assert((data_offset - prev_offset) == file_size, "File write size invalid"); + + assets[asset_count].data_offset = prev_offset; + assets[asset_count].len = file_size; + assets[asset_count].type = AT_SHADER; + assets[asset_count].hash = g_Shader_Asset_Hashes[i]; + + pFileClose(asset_file); + } + + for (u32 i = 0; i < TEXTURE_ASSET_MAX; i++, asset_count++) + { + c8 *asset_name = g_Texture_Asset_Names[i]; + + Printfln("Packing file: %s at offset %llu...", asset_name, data_offset); + + pFile asset_file = pFileOpen(asset_name, pFS_READ); + u64 file_size = pFileLength(asset_file); + + u8 *file_data = MakeArray(arena, u8, file_size); + pFileRead(asset_file, 0, file_data, file_size); + + int ch = 4; + int w, h, has_ch; + u8 *image_bytes = stbi_load_from_memory(file_data, file_size, &w, &h, &has_ch, ch); + if (w <= 0 || h <= 0 || has_ch <= 0) + { + Printfln("%s", stbi_failure_reason()); + Assert(0, "stbi_load_from_memory failure"); + } + + u64 loaded_length = u64(w * h * ch); + + u64 prev_offset = data_offset; + data_offset += pFileWrite(file, data_offset, image_bytes, loaded_length); + + Assert((data_offset - prev_offset) == loaded_length, "File write size invalid"); + + assets[asset_count].data_offset = prev_offset; + assets[asset_count].len = loaded_length; + assets[asset_count].type = AT_TEXTURE; + assets[asset_count].hash = g_Texture_Asset_Hashes[i]; + assets[asset_count].texture_meta.w = u32(w); + assets[asset_count].texture_meta.h = u32(h); + assets[asset_count].texture_meta.ch = u32(ch); + + stbi_image_free(image_bytes); + + pFileClose(asset_file); + + } + + for (u32 i = 0; i < MODEL_ASSET_MAX; i++, asset_count++) + { + c8 *asset_name = g_Model_Asset_Names[i]; + + Printfln("Packing file: %s at offset %llu...", asset_name, data_offset); + + pFile asset_file = pFileOpen(asset_name, pFS_READ); + u64 file_size = pFileLength(asset_file); + + u8 *file_data = MakeArray(arena, u8, file_size); + pFileRead(asset_file, 0, file_data, file_size); + + u64 prev_offset = data_offset; + data_offset += pFileWrite(file, data_offset, file_data, file_size); + + Assert((data_offset - prev_offset) == file_size, "File write size invalid"); + + m3d_t *model = m3d_load(file_data, NULL, NULL, NULL); + + assets[asset_count].data_offset = prev_offset; + assets[asset_count].type = AT_MODEL; + assets[asset_count].len = file_size; + assets[asset_count].hash = g_Model_Asset_Hashes[i]; + assets[asset_count].model_meta.i_count = u64(model->numface * 3); + + m3d_free(model); + + pFileClose(asset_file); + } + + pFileWrite(file, header->asset_offset, assets, sizeof(AssetFile)*asset_count); + + pFileClose(file); + + Assert(pDirNavigate("../build") == 0, "Unable to navigate back to build directory"); +} + +// ::Packer::Packing::Functions::End:: + + + +// ::Packer::Tests::Functions::Start:: + +static inline void +TestAssetIsCorrect(Arena *arena, c8 *file_name, AssetFile *file_info, pFile file) +{ + pFile asset_file = pFileOpen(file_name, pFS_READ); + u64 size = pFileLength(asset_file); + + u8 *file_data = MakeArray(arena, u8, size); + u64 write_count = pFileRead(asset_file, 0, file_data, size); + Assert(write_count == size, "Incorrect asset size retrieved"); + + u8 *packed_asset = MakeArray(arena, u8, file_info->len); + pFileRead(file, file_info->data_offset, packed_asset, file_info->len); + + u8 *image_bytes; + u64 image_length; + if (file_info->type == TEXTURE_ASSET) + { + int ch = 4; + int w, h, has_ch; + image_bytes = stbi_load_from_memory(file_data, size, &w, &h, &has_ch, ch); + image_length = u64(w * h * ch); + + Assert(file_info->len == image_length, "file length incorrect"); + + for (u64 i = 0; i < image_length; i++) + { + Assert(image_bytes[i] == packed_asset[i], "Asset file data is invalid"); + } + + stbi_image_free(image_bytes); + } + else + { + Assert(file_info->len == size, "file length incorrect"); + + for (u64 i = 0; i < size; i++) + { + Assert(file_data[i] == packed_asset[i], "Asset file data is invalid"); + } + } + + pFileClose(asset_file); +} + +void +TestAssetPack(Arena *arena) +{ + pFile file = pFileOpen("assets.sgp", pFS_READ); + + Assert(pDirNavigate("../assets") == 0, "Unable to navigate back to assets directory"); + + FileHeader header; + i64 offset = pFileRead(file, 0, &header, sizeof(FileHeader)); + + u64 asset_count = SHADER_ASSET_MAX + MODEL_ASSET_MAX + TEXTURE_ASSET_MAX; + + Assert(header.magic_num == CreateMagicValue('s', 't', 'e', 'g'), "Magic number is incorrect"); + Assert(header.version == FILE_VERSION, "File version is incorrect"); + + Assert(header.asset_counts == asset_count, "Asset count incorrect"); + + AssetFile *files = MakeArray(arena, AssetFile, asset_count); + pFileRead(file, header.asset_offset, files, sizeof(AssetFile)*header.asset_counts); + + u64 current_asset = 0; + for (u32 i = 0; i < SHADER_ASSET_MAX; i++, current_asset++) + { + TestAssetIsCorrect(arena, g_Shader_Asset_Names[i], files + current_asset, file); + Assert(files[current_asset].hash == g_Shader_Asset_Hashes[i], "Shader asset hash mismatch"); + } + + for (u32 i = 0; i < TEXTURE_ASSET_MAX; i++, current_asset++) + { + TestAssetIsCorrect(arena, g_Texture_Asset_Names[i], files + current_asset, file); + Assert(files[current_asset].hash == g_Texture_Asset_Hashes[i], "Texture asset hash mismatch"); + } + + for (u32 i = 0; i < MODEL_ASSET_MAX; i++, current_asset++) + { + TestAssetIsCorrect(arena, g_Model_Asset_Names[i], files + current_asset, file); + Assert(files[current_asset].hash == g_Model_Asset_Hashes[i], "Model asset hash mismatch"); + } +} + +// ::Packer::Tests::Functions::End:: + + + +// ::Packer::Main::Functions::Start:: + +int +main(int argc, c8 **argv) +{ + #ifdef _WIN32 + { + _set_fmode(_O_BINARY); + } + #endif + + if (pDirIsVisible("build")) + { + Assert(pDirNavigate("./build") == 0, "Unable to change to build directory"); + } + + void *mem = pMemAllocZeroed(GB(1)); + Arena *arena = ArenaInitDebug(mem, GB(1), __LINE__); + + FileHeader header = {0}; + InitHeader(&header); + + PackFiles(arena, &header); + + TestAssetPack(arena); +} + + + +// ::Packer::Main::Functions::End:: diff --git a/src/packer.h b/src/packer.h new file mode 100644 index 0000000..a59779a --- /dev/null +++ b/src/packer.h @@ -0,0 +1,41 @@ +#pragma once + +// ::Packer::Includes::Header:: + +#include "os.h" + +#include "assets.h" + +#include + +// ::Packer::Macros::Header:: + +#define FWrite(buf, size, count, file) ((size) * (fwrite(buf, size, count, file))) +#define FRead(buf, size, count, file) ((size) * (fread(buf, size, count, file))) + +// ::Packer::Types::Header:: + +typedef struct FileMapping +{ + c8 *file_name; + u32 ix; +} FileMapping; + +// ::Packer::Packing::Functions::Header:: + +void SetArrayLookups(); +void InitHeader(FileHeader *header); +i32 WriteHeader(pFile file, FileHeader *header); +void PackFiles(Arena *arena, FileHeader *header); +void MoveToTextureDir(c8 **return_dir); +void MoveToShaderDir(c8 **return_dir); +void MoveToModelDir(c8 **return_dir); + +// ::Packer::Tests::Functions::Header:: + +void TestAssetPack(Arena *arena); +static inline void TestAssetIsCorrect(Arena *arena, c8 *file_name, AssetFile *file_info, pFile file); + +// ::Packer::Main::Functions::Header:: + +int main(int argc, char **argv); diff --git a/src/renderer.cpp b/src/renderer.cpp new file mode 100644 index 0000000..28de5da --- /dev/null +++ b/src/renderer.cpp @@ -0,0 +1,268 @@ +#include "../external/glad/src/gl.c" + +#include "assets.cpp" + +// ::Globals:: + +PipelineCreateInfo g_Pipeline_Create_Info[] = { + { .vertex_shader = "shaders/pbr.vert", .fragment_shader = "shaders/pbr.frag" }, + //{ .vertex_shader = "shaders/gui.vert", .fragment_shader = "shaders/gui.frag" }, +}; + +// ::Init::Impl::Start:: + +MeshBuffer yoder; + +static b32 +Init(Renderer *renderer) +{ + b32 success = true; + + RGFW_setGLHint(RGFW_glMajor, 4); + RGFW_setGLHint(RGFW_glMinor, 6); + RGFW_setGLHint(RGFW_glProfile, RGFW_glCore); + + renderer->window = RGFW_createWindow("Video Game", RGFW_RECT(0, 0, 1280, 720), RGFW_windowCenter | RGFW_windowNoResize); + if (renderer->window == NULL) + { + Printfln("Failed to create window"); + success = false; + } + + if (success) + { + RGFW_window_makeCurrent(renderer->window); + + int glad_version = gladLoaderLoadGL(); + if (!glad_version) + { + Printfln("gladLoaderLoadGL failure"); + success = false; + } + } + + for (u32 i = 0; i < PIPELINE_MAX; i += 1) + { + renderer->pipelines[i] = BuildPipeline(g_Pipeline_Create_Info + i); + } + + yoder = CreateMeshBuffer("models/yoda"); + + return success; +} + + +static PipelineHandle +BuildPipeline(PipelineCreateInfo *create_info) +{ + auto vertex_shader = CreateShader(GL_VERTEX_SHADER); + Assert(BuildShader(&vertex_shader, create_info->vertex_shader), "BuildShader vertex failure"); + + auto fragment_shader = CreateShader(GL_FRAGMENT_SHADER); + Assert(BuildShader(&fragment_shader, create_info->fragment_shader), "BuildShader fragment failure"); + + auto pipeline = CreatePipeline(); + glAttachShader(pipeline, vertex_shader); + glAttachShader(pipeline, fragment_shader); + glLinkProgram(pipeline); + + int success = 0; + glGetProgramiv(pipeline, GL_LINK_STATUS, &success); + if (!success) + { + char info_log[512]; + glGetProgramInfoLog(pipeline, 512, NULL, info_log); + Assert(false, "Failed to build pipeline"); + } + + return pipeline; +} + +static b32 +BuildShader(ShaderHandle *handle, char *asset) +{ + b32 success = true; + + Asset data = apLoad(asset); + Assert(data.bytes != NULL && asset, "Shader data is NULL"); + + glShaderBinary(1, handle, GL_SHADER_BINARY_FORMAT_SPIR_V, data.bytes, data.len); + glSpecializeShader(*handle, "main", 0, 0, 0); + + int compiled = 0; + glGetShaderiv(*handle, GL_COMPILE_STATUS, &compiled); + if (!compiled) + { + char info_log[512]; + glGetShaderInfoLog(*handle, 512, NULL, info_log); + Printfln("Unable to compile shader: %s", info_log); + success = false; + } + + return success; +} + +static PipelineHandle +CreatePipeline() +{ + PipelineHandle pipeline = glCreateProgram(); + return pipeline; +} + +static VertexBuffer +CreateVertexBuffer() +{ + VertexBuffer buf; + glGenBuffers(1, &buf); + + return buf; +} + +static IndexBuffer +CreateIndexBuffer() +{ + IndexBuffer buf; + glGenBuffers(1, &buf); + + return buf; +} + +static VertexArray +CreateVertexArray() +{ + VertexArray array; + glGenVertexArrays(1, &array); + + return array; +} + +static ShaderHandle +CreateShader(int type) +{ + return (ShaderHandle)glCreateShader(type); +} + +static MeshBuffer +CreateMeshBuffer(char *asset) +{ + MeshBuffer mesh = {0}; + + /* + mesh.array = CreateVertexArray(); + mesh.vertex = CreateVertexBuffer(); + mesh.index = CreateIndexBuffer(); + + glBindVertexArray(mesh.array); + glBindBuffer(GL_ARRAY_BUFFER, mesh.vertex); + + Asset data = apLoad(asset); + Assert(data.model != NULL, "CreateMeshBuffer failed to load asset"); + + mesh.draw_count = data.model_meta.i_count; + + Printfln("v_count: %llu", data.model->v_count); + + glBufferData( + GL_ARRAY_BUFFER, + data.model->v_count * sizeof(Vertex), + data.model->vertices, + GL_STATIC_DRAW + ); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh.index); + glBufferData( + GL_ELEMENT_ARRAY_BUFFER, + data.model->i_count * sizeof(u32), + data.model->indices, + GL_STATIC_DRAW + ); + + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0); + + glEnableVertexAttribArray(1); + glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, GL_FALSE, sizeof(Vertex), (void *)offsetof(Vertex, col)); + + apUnload(asset); + + glBindVertexArray(0); + + */ + + return mesh; +} + +static void +DrawMeshBuffer(MeshBuffer *mesh) +{ + glBindVertexArray(mesh->array); + glDrawElements(GL_TRIANGLES, mesh->draw_count, GL_UNSIGNED_INT, 0); + glBindVertexArray(0); +} + +// ::Init::Impl::End:: + + + +// ::Textures::Impl::Start:: + +static u32 +CreateTexture(rawptr data, u32 width, u32 height, u32 channels) +{ + u32 tex; + glCreateTextures(GL_TEXTURE_2D, 1, &tex); + + i32 mipmap = Mini32(5, i32(log2f(f32(Maxi32(width, height))))); + + u32 format, copy_format; + switch (channels) + { + case 1: + format = GL_R8; + copy_format = GL_RED; + break; + case 2: + format = GL_RG8; + copy_format = GL_RG; + case 3: + format = GL_RGB8; + copy_format = GL_RGB; + case 4: + format = GL_RGBA8; + copy_format = GL_RGBA; + default: + Assert(false, "CreateTexture failure: unsupported channel number passed in"); + } + + glTextureStorage2D(tex, mipmap, format, width, height); + glTextureSubImage2D(tex, 0, 0, 0, width, height, copy_format, GL_UNSIGNED_BYTE, data); + + glTextureParameteri(tex, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glTextureParameteri(tex, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTextureParameterf(tex, GL_TEXTURE_BASE_LEVEL, 0); + glTextureParameteri(tex, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTextureParameteri(tex, GL_TEXTURE_WRAP_T, GL_REPEAT); + + glGenerateTextureMipmap(tex); + + return tex; +} + +// ::Textures::Impl::End:: + +static b32 +RunCycle(Renderer *renderer) +{ + while (RGFW_window_checkEvent(renderer->window)); + + glUseProgram(renderer->pipelines[PIPELINE_PBR]); + + glClearColor(0.1f, 0.8f, 0.4f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + DrawMeshBuffer(&yoder); + + RGFW_window_swapBuffers(renderer->window); + + return !RGFW_window_shouldClose(renderer->window); +} diff --git a/src/renderer.h b/src/renderer.h new file mode 100644 index 0000000..a483867 --- /dev/null +++ b/src/renderer.h @@ -0,0 +1,63 @@ +#pragma once + +#define RGFW_IMPLEMENTATION +#include "../external/rgfw/RGFW.h" + +#include "assets.h" + +typedef enum Pipeline_e +{ + PIPELINE_PBR, + //PIPELINE_GUI, + PIPELINE_MAX, +} Pipeline; + +typedef struct PipelineCreateInfo +{ + char *vertex_shader; + char *fragment_shader; +} PipelineCreateInfo; + +typedef unsigned int VertexBuffer; +typedef unsigned int IndexBuffer; +typedef unsigned int PipelineHandle; +typedef unsigned int ShaderHandle; +typedef unsigned int VertexArray; +typedef unsigned int UBO; + +typedef struct MeshBuffer +{ + VertexArray array; + VertexBuffer vertex; + IndexBuffer index; + u32 draw_count; +} MeshBuffer; + +typedef struct Renderer +{ + RGFW_window *window; + PipelineHandle pipelines[PIPELINE_MAX]; + MeshBuffer models[MODEL_ASSET_MAX]; +} Renderer; + +// ::Init::Decl:: + +static b32 Init(Renderer *renderer); +static PipelineHandle CreatePipeline(); +static VertexBuffer CreateVertexBuffer(); +static IndexBuffer CreateIndexBuffer(); +static VertexArray CreateVertexArray(); +static ShaderHandle CreateShader(int type); +static PipelineHandle BuildPipeline(PipelineCreateInfo *create_info); +static MeshBuffer CreateMeshBuffer(char *asset); +static UBO CreateUBO(rawptr data, u32 size); +static b32 BuildShader(ShaderHandle *handle, char *asset); + +// ::Textures::Decl:: + +static u32 CreateTexture(rawptr data, u32 width, u32 height); + +// ::Draw::Decl:: + +static void DrawMeshBuffer(MeshBuffer *mesh); + diff --git a/src/shaders/pbr.frag.glsl b/src/shaders/pbr.frag.glsl new file mode 100644 index 0000000..3cdea4a --- /dev/null +++ b/src/shaders/pbr.frag.glsl @@ -0,0 +1,10 @@ +#version 460 + +layout (location = 0) in vec4 in_color; + +layout (location = 0) out vec4 FragColor; + +void main() +{ + FragColor = in_color; +} diff --git a/src/shaders/pbr.vert.glsl b/src/shaders/pbr.vert.glsl new file mode 100644 index 0000000..270d7b2 --- /dev/null +++ b/src/shaders/pbr.vert.glsl @@ -0,0 +1,12 @@ +#version 460 + +layout (location = 0) in vec3 in_pos; +layout (location = 1) in vec4 in_color; + +layout (location = 0) out vec4 out_color; + +void main() +{ + gl_Position = vec4(in_pos, 1.0); + out_color = in_color; +} diff --git a/src/shaders/structures.glsl b/src/shaders/structures.glsl new file mode 100644 index 0000000..3ff86a9 --- /dev/null +++ b/src/shaders/structures.glsl @@ -0,0 +1,50 @@ +// ========================================== +// ====== TODO: Research values here ======== +// ========================================== + +struct Vertex { + vec4 pos; + vec4 col; +}; + +struct GUIVertex { + vec2 p0; + vec2 p1; + vec4 col; +}; + +layout (buffer_reference, std430) readonly buffer VertexBuffer { + Vertex vertices[]; +}; + +layout (set = 0, binding = 0) uniform GlobalUniform { + vec2 res; +} Globals; + +layout (set = 0, binding = 1) uniform ShaderOptions { + float placeholder; +} Options; + +layout (rgba16f, set = 0, binding = 2) uniform image2D image; + +layout (set = 0, binding = 3) uniform sampler SamplerNearest; + +layout (set = 1, binding = 0) uniform texture2D Textures[]; + +layout (set = 2, binding = 0) uniform PBRMaterials { + vec3 albedo; + vec3 normal; + float metallic; + float roughness; + float ao; +} Materials[]; + +layout (set = 3, binding = 0) uniform ModelMeshes { + VertexBuffer buf; +} Meshes[]; + +layout (push_constant) uniform Constants { + vec2 res; + float time; + uint mesh_index; +} PC; diff --git a/src/util.cpp b/src/util.cpp new file mode 100644 index 0000000..7819cd7 --- /dev/null +++ b/src/util.cpp @@ -0,0 +1,284 @@ +// ::String8::Impl::Start:: + +static void +StrConcat(c8 *str, c8 *append) +{ + u32 len = StrLen(str); + u32 i = 0; + for (; append[i] != '\0'; i += 1) + { + str[i] = append[i]; + } + + str[i] = '\0'; +} + +static b32 +StrEqL(const char *l, const char *r, u64 len) +{ + for (u64 i = 0; *l == *r && *l && i < len; l++, r++, i++); + return *l == *r; +} + +static b32 +StrEq(const char *l, const char *r) +{ + for (; *l == *r && *l; l++, r++); + return *l == '\0' && *r == '\0'; +} + +static u32 +StrLen(const char *str) +{ + const char *start; + + for (start = str; *str != '\0'; ++str) + /* Iterate only */; + + return (u32)(str - start); +} + +static String8 +MakeString8(c8 *str, u64 len) +{ + return (String8){ .value = str, .len = len }; +} + +static String8 +String8Concat(Arena *arena, String8 string, String8 append) +{ + u64 str_len = string.len + append.len; + String8 str = { + .value = MakeArray(arena, c8, str_len + 1), + .len = str_len, + }; + + MemCpy(str.value, string.value, string.len); + MemCpy(str.value+string.len, append.value, append.len); + + str.value[str_len] = '\0'; + + return str; +} + +static void +String8TrimSuffix(String8 *str, c8 delimiter) +{ + if (!str || str->len == 0) return; + + for (i64 i = i64(str->len)-1; i > 0; i -= 1) + { + if (str->value[i] == delimiter) + { + str->value[i] = '\0'; + str->len = i == 0 ? 0 : u64(i - 1); + break; + } + } +} + +static i64 +String8FindLast(String8 str, c8 delimiter) +{ + if (str.len == 0) return -1; + + i64 result = 1; + + for (i64 i = i64(str.len)-1; i >= 0; i -= 1) + { + if (str.value[i] == delimiter) + { + result = i; + break; + } + } + + return result; +} + +static b32 +String8Eq(String8 l, String8 r) +{ + return StrEqL(l.value, r.value, l.len); +} + +static b32 +String8StartsWith(String8 string, String8 cmp) +{ + return StrEqL(string.value, cmp.value, cmp.len); +} + +static String8 +PreSplitString8(String8 string, String8 delimiter) +{ + if (string.len == 0 || delimiter.len == 0) return string; + + u32 new_len = 0; + u32 matched_chars = 0; + + for (u32 i = 0; i < string.len; i++) + { + + if (string.value[i] == delimiter.value[matched_chars]) + matched_chars += 1; + else + matched_chars = 0; + + if (matched_chars == delimiter.len || delimiter.value[matched_chars+1] == '\0') + { + new_len = i; + break; + } + } + + return (String8){ .value = string.value, .len = new_len }; +} + +static String8 +PreSplitNewString8(Arena *arena, String8 string, String8 delimiter) +{ + String8 result = PreSplitString8(string, delimiter); + + if (result.len > 0) + { + result.value = MakeArray(arena, char, result.len+1); + MemCpy(result.value, string.value, result.len); + result.value[result.len] = '\0'; + } + + return result; +} + +// ::String8::Impl::End:: + + +// ::Memory::Impl::Start:: + +static void +MemZero(void *ptr, isize size) +{ + if (!size || !ptr) return; + + isize iter_size = size > isizeof(u64) ? 8 : 1; + iter_size *= 4; + isize iter_len = size / iter_size; + + u64 *mem = (u64 *)ptr; + + if (iter_size > isizeof(u64)) + { + while (iter_len > 0) + { + mem[0] = 0; + mem[1] = 0; + mem[2] = 0; + mem[3] = 0; + mem += 4; + iter_len--; + } + } + + u8 *byte_mem = (u8 *)mem; + isize rem_len = size % iter_size; + while (rem_len > 0) + { + byte_mem[0] = 0; + byte_mem++; + rem_len--; + } +} + +static void +MemCpy(rawptr dst, rawptr src, usize size) +{ + if (size == 0) return; + + isize iter_size = size > isizeof(u64) ? 8 : 1; + iter_size *= 4; + isize iter_len = size / iter_size; + isize rem_len = 0; + + u64 *mem_dst = (u64 *)dst; + u64 *mem_src = (u64 *)src; + + + if (iter_size > isizeof(size)) + { + while (iter_len > 0) + { + mem_dst[0] = mem_src[0]; + mem_dst[1] = mem_src[1]; + mem_dst[2] = mem_src[2]; + mem_dst[3] = mem_src[3]; + mem_dst += 4; + mem_src += 4; + iter_len--; + } + + rem_len = size % iter_size; + } + else + rem_len = size; + + + u8 *byte_dst = (u8 *)mem_dst; + u8 *byte_src = (u8 *)mem_src; + while (rem_len > 0) + { + byte_dst[0] = byte_src[0]; + byte_dst++; + byte_src++; + rem_len--; + } +} + +// ::Memory::Impl::End:: + + + +// ::Convert::Impl::Start:: + +static inline void +U32ColToVec4(Vec4 *dst, u32 src) +{ + if (src == 0) + { + dst->r = dst->g = dst->b = 0.0; + dst->a = 1.0; + } + else + { + U32ToVec4(dst, src); + } +} + +static inline void +U32ToVec4(Vec4 *dst, u32 src) +{ + dst->r = f32((src >> 0) & 0xFF) / 255.0; + dst->g = f32((src >> 8) & 0xFF) / 255.0; + dst->b = f32((src >> 16) & 0xFF) / 255.0; + dst->a = f32((src >> 24) & 0xFF) / 255.0; +} + +// ::Convert::Impl::End:: + + + +// ::Hashing::Impl::Start:: + +u64 static inline +HashFromString(String8 string) +{ + return XXH3_64bits_withSeed(string.value, string.len, HASH_SEED); +} + +// ::Hashing::Impl::End:: + + +// ::Math::Impl::Start:: + +DefMathImpl(Min); +DefMathImpl(Max); + +// ::Math::Impl::End:: diff --git a/src/util.h b/src/util.h new file mode 100644 index 0000000..fce84d7 --- /dev/null +++ b/src/util.h @@ -0,0 +1,140 @@ +#pragma once + +// ::Constants:: + +constexpr usize DEFAULT_ALIGNMENT = (2*sizeof(rawptr)); +constexpr u64 HASH_SEED = 5995; + +// ::Macros:: + +#define Assert(condition, message) do { assert((condition) && (message)); } while(0) + +#define KB(n) n * 1024LL +#define MB(n) KB(n) * 1024LL +#define GB(n) MB(n) * 1024LL +#define TB(n) GB(n) * 1024LL + +#define BitEq(var, bits) (((var) & (bits)) == (bits)) +#define AlignPow2(x, b) (((x) + (b) - 1) & (~((b) - 1))) +#define IsPow2(x) ((x) != 0 && ((x) &((x) - 1)) == 0) +#define PtrAdd(ptr, add) ((rawptr)(((uintptr)ptr) + ((uintptr)add))) + +#define MakeArray(arena, type, count) (type *)(ArenaAlloc(arena, (isize)(sizeof(type)) * (isize)(count))) +#define Len(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x]))))) + +#define i8(x) ((i8)(x)) +#define i16(x) ((i16)(x)) +#define i32(x) ((i32)(x)) +#define i64(x) ((i64)(x)) + +#define u8(x) ((u8)(x)) +#define u16(x) ((u16)(x)) +#define u32(x) ((u32)(x)) +#define u64(x) ((u64)(x)) + +#define c8(x) ((c8)(x)) +#define c8ptr(x) ((c8 *)(x)) +#define u8ptr(x) ((u8 *)(x)) +#define i8ptr(x) ((i8 *)(x)) + +#define intptr(x) ((intptr)(x)) +#define uintptr(x) ((uintptr)(x)) + +#define f32(x) ((f32)(x)) +#define f64(x) ((f64)(x)) + +#define rawptr(x) ((rawptr)(x)) + +#define String8Array(v, c) MakeString8((c8 *)(v), sizeof(*(v))*(c)) +#define String8Struct(v) MakeString8((c8 *)(v), sizeof(*(v))) +#define String8CStr(v) MakeString8((c8 *)v, StrLen(v)) + +#define DefIntegerImpl(def) \ + Def##def(i8); \ + Def##def(i16); \ + Def##def(i32); \ + Def##def(i64); \ + Def##def(u8); \ + Def##def(u16); \ + Def##def(u32); \ + Def##def(u64) + +#define DefFloatImpl(def) \ + Def##def(f32); \ + Def##def(f64) + +#define DefMathImpl(def) \ + DefIntegerImpl(def); \ + DefFloatImpl(def) + +#define ArrayType(T) \ +typedef struct T##Array \ +{ \ + T *data; \ + u64 length; \ +} T##Array + +#define PtrArrayType(T) \ +typedef struct T##PtrArray \ +{ \ + T **data; \ + u64 length; \ +} T##PtrArray + +#define InitArrayType(arr, arena, T, len) \ +arr.data = MakeArray(arena, T, len); \ +arr.length = len + +// ::String8:: + +static b32 String8Eq(String8 l, String8 r); +static u32 StrLen(const char *str); +static b32 StrEqL(const char *l, const char *r, u64 len); +static b32 StrEq(const char *l, const char *r); +static void StrConcat(c8 *str, c8 *append); +static String8 MakeString8(c8 *str, u64 len); +static String8 String8Concat(Arena *arena, String8 string, String8 append); +static void String8TrimSuffix(String8 *str, c8 delimiter); +static i64 String8FindLast(String8 str, c8 delimiter); +static String8 PreSplitString8(String8 string, String8 delimiter); +static String8 PreSplitNewString8(Arena *arena, String8 string, String8 delimiter); + +// ::Memory:: + +static void MemZero(void *ptr, isize size); +static void MemCpy(rawptr dst, rawptr src, usize len); + +// ::Convert:: + +static inline void U32ColToVec4(Vec4 *dst, u32 src); +static inline void U32ToVec4(Vec4 *dst, u32 src); + +// ::Math:: + +#define DefMin(T) \ +T Min##T(T l, T r) \ +{ \ + return l < r ? l : r; \ +} + +#define DefMax(T) \ +T Max##T(T l, T r) \ +{ \ + return l > r ? l : r; \ +} + +#define DefClamp(T) \ +T Clamp##T(T v, T min, T max) \ +{ \ + return Min##T(max, Max##T(v, min)); \ +} + +#define DefAbs(T) \ +T Abs##T(T v) \ +{ \ + return v < (T)0 ? -v : v; \ +} + +// ::Hashing:: + +u64 static inline HashFromString(String8 string);

      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%0AZqpmx&V~rEE&d^+>~e zsA)Fx=(*ai-@d2H$nkgd-2UiK>dfm{Tvk9SyN@MvV(lJ;2#fwkdR$al)loYc(mJ%l1G+{oKeW;j? zAh={u<;Q5lmI9&V{JbbZ5YN+ui;ujYIa_V5DhQ#`9 zDokW8RGJcjuWjGHT~mnk+kf?rP}EE7Hk=X6QL9XF0+0}+7|ihG#AOlxwIXoR+&>&1O=O-q(2^#H$CK{!CWzsK+rx? zIRPWK8P%|;9Yy$JoMeVos@U@}9S|*o3^XIwK=(P8bLxjevRo9d@bMcv0a1HlO3hy= zjhdQ^FcXgD(}CL5c{7){*THV*F%=llFE}j?^Cg^y-##iczL$c?mQx3Dh7#0NE4@#O zf(0|chGK9dnIZ+`m8#_#i`0}j7Zw+*sQjD`x;sc8d`oDdI3PmYVP?X5zD-6|W0rBl zn3J`Zv*o%vai42=_$7BI(Rk&I6W=@Sx1r73Xl6yCG$wVxtm@9^z%*Xe=laL@*Zj7o zZX*Jfl!vwlla$7DHSN1Xmci71GcG`5mNsBaTwF}uH3s&01=rv$`rHla0Zzhjaw8js zBI;*HPfuT8-?Jq?kk^NMH$qBEZ?lV^w8TC4S?~P!$o~DDFnYz~6kr@W7e#=zJ$a`v zV-u@01!V3IW&6yQWJRq}AFOBh@3AM!q<~_LK)BMV&%V#@26;m6nX#r()kCDd9`Nda z3fUBI2*4&iY|QVS;&8{J_yCuQ~sKq^O5yoy8vE%OgK?wafqJTgBHkIh}|$QqsZ%xT=9&q1L@K!%0(uj9DPf9! zad3!j?~tT0vQDdgWLJ6h(P3J%Br+!%6bXKsc)`g=ENl31#} z7gf1LOwp-DX;~mTz}%GuCghO`l`m7;ZwK~JncqXJE75UTK@4d^J{IbmUG3NXsSo!a zZD@R{WpF0_WJsSy@?t>0!^g4JL9Br-a@(`Rr>EGdni`xw zL0uB8=^XLErv>ICSfmup-9Y%LGkV!DA)yq1`U+@mG49wDEthwTYhC z5Jy90+{oTkjWU!R3uQ7EYus3rZm)yZ!{Lx+3!$kAajo-Ki(Cg4;M83`w6!^g;ovl| zDdJXCj(a=uF7^Lpc75|q*i;#N6sfew8krCq6I29gK}n#FniTUsNBApWCtMOLTqqFIj5?v0 z@7CPj?SAm$S!eV@J+#IxJPcmXyb~mvzyFq;RWt|~S+BOg1zgks-PYN=*EJ`5IjDS6 z(Rokf=Kv08kd4t@ zwKbT*T?Sm^rp`{_?W+N_&Ie#^lz2MF$iRSRxHKFKo~Psr(Qg}}6exP8YGPAUcP(@O zO;Y^@f}p(q{?2H!)Yj3_)`>VT-)8lF;R;uv3-?jN+;UCay|(%G=I5v1-qztak=dh+ zA2hWj)sVVwBtJVk{yUA($?yig&`eRzIHQ=Tf~vW{&E9Ov(<90;AC5I0C~C?Kv|25Q zx}o#&CD5=gdM}>=h|Ycha*JB9e8wzcuxySRpg-6y*y`+_j`x?T8#iM8^QO_2g18bK z7*CQ3^T$#P@=nAGGWqLi!K?0@P+bHoh2dFF`>b-7sA7itB)ds@Lfp1CSs-JhK49;_tsGxseJi-%1E4*$_bqUT{N6}zp~bK0m&BK?~L5b13*EK*|jXx!G&5yvrY zFt>zhAmC*G$s>}%K>#L+s;!L-keMJ( zy1#!giO~`z!3>u#u4K8Qz^^DQ4b^Dc>+7n7VHAE}Q7+ZJTs_xC!~XG{d-iw$m2N>2 zXHeDJBZssE8$pnD;caR z96Y^Z3OKU3P(51Db~6|}NmPs4XrRE8uMSAxNYyRhb324zh(0tpb=l*3GHEE0=^`t8f2S|~Oj z-?rbw3uA6T<1Mv3l6~kGVYpIr%DDSgRir}ZLEq)IvrMrZ+NR}`9p-|YQc|SP_a9kW zyCt|`h%hUG^M6moV!fT6K=A5w-s?%K=k|;F?s(27r_ajPmlobXvD;ox!rQNaG2pdj zBHrloLBRsB%zZEv_%{noWCvqoYk)#P^z~0NAdA+X31n!}KrsZdeL_-xEMfz5*Q)P+j?Vlq+~#t?krJTPs0FYvUpk8eRp?4J{!U! zNUf015(#imipa>UYid<;0sz4tXYdku?zaLc2KvKnJ-wUGDJfug{A=A+n?wjBc4=xL zrxK%*MU6d;v$M13=V$1C`k4(E15|Y|m9`2pjJ)q|gG$`=D> zh$J<}UHPo$F^%?2k1Yt-Jxvtk1(NgeIQ7CyE}YCXXruM~r&mwXBXQQB+VrJ%yIIkx zPS+IfNp6(%(jc{LibXFUOdk92LZm!g%9#VD2o`d3aDDoF{{6+pW8;V-*u_glxqQ&V$ZKi=s;gX!dv?d&cwAf%7bvwHnMO3e&Y)oi(y zjmqDSp)1~qLKsyf`v}5mbnps=^6moXfiGu926_h109@1&Fm=>SWwn_^)fV@k?f?*y z4M1)E1JrFT;>T4AKrYxjpo%l{KA($t2Lu4WTmfXtE5pZM(*J>Rx>;3n^zr99YI(;l zr>CEuhJmxI$@1Cgc}*wqWm(*a0O0qbRV=ekHlR^{O=d z^`G-^sg_^5pU)_NzqT6Tf@F()O!u@YZYRTTYL8htI9ZI@9qqful1_y*-NDKX=hd&8x0<#SZ-k=PFL5LC{@&;)W zDLkZw>}1&Nn6gzhubLc}@>L9HxGHNQ6Rgrab0|eU#-;Dvepdcb*I^D1xj=57F;Y0R zV3kG2E+-~s6B`hY5+p5{O!=mKlr*H_Vtn3oJuKk7Z$F_>1DVUp?Al&|Kv|hwa+rNE zE5c=UC3gxbSQ6c^m4O2pP;ZO<`87T~b=Oggew98}+50({0!M;dtjhh+oo-my>k|9v z<#lIiDyK@P&hhFzN8FX=`#5fSCAt;XxF2G4uP`nI9;XU~mVY#z^YUM}O>Fdc;La8} z1MJT)?TP(;j?YhkVMQ&-e=$K6Kr%k0|SaiX%kh#qjVe?Nm&mMeimgy z%F)j$MrJa`-`03)Ef4W47xq_Ofd?TSSj6uPPO*{Uqm)V3m) zgO^0XhZ?aQFWSMDeX7MPKYkfFsyVF|CQ_gh4a6e%VFp| zxteGE{L)GDmeU0086c266iE{e1bVBim;%#>A#>8W=+r2^Q`-w&I&&loE{iu~+MbPu zldqdbvJ`<9-Fx{$=8_Jq1S%urBRVvYz?JZyAnRnDG1zX*$4q%R3B;fw)ts32(5~Hx znv}0RPd_*cQXVJTef2NO&jv@P!lxBF1P%!_>XvWJ)dXZgm2+&Ns*J481Jk(he}Y|x zzs9CU(Lv&97Tj~x6*%S9F$`~g{c)6;D@Lujq(Wn3W3%`j9qjFe3j6ad0a`vfOQ==( zdc}b4@02X`m?+RRG5R>PjLOHV+4uFSvi=g_k`GAO%n+^t+KEl_kDyq_69kK zBC#+k3Nef)cOhR6HhnhxHJ>vKnlCydDh>)7NCl-s)d?284ks%d18$6fFgR}Um$B`a zJ@FpDyVEqs@)jGce{+|1muk1zv=>nW;dMQJP#Q3U(X<$vu+=yClUvZ1! zy^c&u%rmEk$!^()yT4Q=lRIOSa?3m2I3e=|@ZofwMPt*K0q{)EqQ6Bd)alWp)DtHm z4MI8EnF^d5WH@;H@Z_=-uc*l|E*)evdor zmm+?s{`q%-YVMP-P=MsL^{^4kwXW+wM{(oBjNVY1;{w21>{w>gSQT_U(7RFL3yu=esw$$ahdY zwCPd7s&MIggitvoyn^-`a&BDXy?T=)P2Na>BZtkk4(Gk$%Pn>gL73$TGhG-K(f!Vv z&l08%2#G*T{jHzcAD2MOe}mX{v5a>WEpRLfcp%qL=DKeNdG2qGCvyzmB8^%t6)*Zu z>QS%8^SXiy%|-BOY;M4Ehp_5`Rex17+N>(;gnB{fZL zrf6quo5qv?-eDu60CV>eHVni*M3%8i8Uzq77cD0qywhMyWl;Mi6MVsZAzS~i#5gc5 z11|c0y6K_HBA`x?@jJxa%f7tkv+2GKqIbFN0qe!Kdsq96wqS1s9_2i=I$UIndy>|? zs^HzubDm0lr&O|!DwjAV5mtPY-90mZ2ck(RLX5nmqMTlJZ{oh&XVJF? z%nng}Ex*PIF}2XkR!*^a&FzdTglW3hAUkqygf_we!me@-4b%o)Kv#*ETwKh_&6Yvv zM>jbn30Ys-5nz(1v#ed=RHg?*g>bxkyC=QyXN1quu*#xTWgZw=-<7(Fu{o(*~`ao)V${ zX3~Ktx9fT986f2eFwx&(yCi5~`0Ib7OUvIy_2WFTp$o0nE9 z6@xHItdf5g{}MTV0C9$aD_Ke^#gC=Umyr3q=WkwP@C6e;)Uo*ow#X;pYvHzgySiF> zUY!uDV288rcP&H;<%(rj4E+%0ZneC!2%a%;)JCCrr_iW+$QU-<-LJ$txcj=bWyU4X z3@L<#c3@3&b5?*hqI+bk_ zgBZ781!V4!DlB?VDf(~TP1N3<1eZ8}_UvxB$T>xmD6E}-IA|*>OIUr800|9FjRUtK z!w@vDxnfbP_eYmf+in7#E5FclYoP%il}@q8{>;nx*)l-sS8de3M<(~ndd1+{V>?CH z{!ZV99Sc!nW0GO0y>**XuUUA>VSwioE*T%*WPu=j=%)%qHGt=(yIkPvFs{bLprxf& zwWELvVIEG1Nu=bMS&d3K0qkICPJLAcpfsX4Fs}8M+9({k;vADp7{`=c|K5AVGIk`W zRz;PiZW3`7E{@NYAIP=@}>!n922lF0h@_WI`P)@FOE z)J2AfMqEL9h`b{TD@xDeo675vN5&wFNIxOMe}EQOO+HJY%w|ZaW$o#C^%U!V z6df_0D@`X8`spx%s0%`owY@OguvOUEz_z}qwk$2q&(Cp_znzE4us5e$5?Q7i!->~K zOJ}C4MnjzyC`^|;AF%njVEk9@Q3RAj=wmvMW22qy`ZXsUDUN;OZ94*c`05TW&-<{V zkTA2-XOd`Q>Owi2U$rLIc_=feNzmrq@0q!>sq3|^ND49L)&5wfi;XTcAR&*QUn)6- z5p5jk`|ymFvrvARM1O<$6IVlLZ4Nhy5bv`4B~BA3?8G5K7B;HHTsmjfyUjY`GHcUd z7rB;Pb2B~Eh4r3pm>gHFUf+f!VH6s*bDC?#ume{Hse;b`JZk=2q|U+ zkdGolN+u^h3-G_q7&^ocNCslTE__8iIO3P}gaGb0RKgWf)!yh3~?zHJe! z#6_Q5(OKvKg}ux69HL_>3{E>=`1V0xo->ms7?yTqnhsQLF=;61 ztCzZ(Mi)3^!^*Cx(+cZ}6(|U}xEbj&x)x(jV~Md=P`t&;O4&W<7*hO&7PV5#haIa3Hp#G0;9nFMzM(WTj!$|Y zg}Z?d0C8P+kGm~dAIs&w*`Y`o&*wE$!!ugK1}2xmzBbi3F8WF3xCt3-zyBJ6mmf;T z_k}yLcd;MWg;}d?Lv~ehgH-iZrSYSu>dY}-&QLwXsG=uj?4t_7m=Q8+%}B$hO77*- zJRR~?b2$j}4+tY+D@esh+EcL~Eh|52GQ5ns+-kemEp8~`%4Zb+_CT4zpQ8ogevXhx zhH0f{XecD%(Fj_M#8E`6m=b7d$tSgTbPxujfJ`l#;nOtj5mcLH0iO?BDc-MshWP_TfE$$4C-C~I^UA>c=kFrX4+XhFs%k!|~oDr@C%r%%sx07%52@{i!R>PdtzeC22+e8QtYJ@g_2Kq5_cs$dl@0>EG zYR+`j1kpYxgI2d|&zs51H^ZN7(Z8sMYTzXf4dt$KA|!bzm{J#py$4a35SR{yvdAt3 z3p~7hV`sMKq;I<4k=(Ug&Bsm1L}TV&^EpIoZkl3C5x$r0{CI<7st*n^KL7t- zfQWp|wS@!qBi(hc644&?VnN1|)O2e3Lj?MvVjSu2&NkP(QMVHlV+36qsXoc#4d&UgubNJ)1x(5Xc3+PjVIZlD7v5t$&z zMwXT{apA~dWA|h6QgL1B!gHzPhmdurt& zv{LN`96$4!XA7yg;&C(HQE6%AC@5_C4pjR$OCGRFs1ek(e0FAQ5+pJ-zjX1e=8Y{u zOCw-5^plZ7R@YLqKaGQi%mkhzDMsY9rhq`c6P&4DTwQH$==OSCti8TE^s+@R^c8F#{K*bE)hz_chvG~W zwsC#(eICRPcx}?@eL8se=J{ZJC)ar>XY{{oB+YZgR|ucrN;3|8jsRd~YDhl-7>4O3 z1Dtq~z(Gl*4b1u91qovM&}$( zF^Nfno>s1{ulxUd0Y)vJ6ipB8;gvN#9@v!Srw|Kh@E{ou3Rl;-k#d)g~ln9LXJx^y@$bX7X#BR2P@=J}Bl;W%iGbH!2uO6ORflFzeUl|gx-QWu0oW5IsF-g3qUb?UTnD?+VYs%Mhw}WL9McgN#MH(Ex zk;}&xkuhAbJBgyHiRcoSeG`=cJwv4z!X3DdR|N3 z1q7HMV;HG0>>1YaOrur#rIV<{F{~IK@7#TD)>s!;eB};|lmSz8dXNdK5l*%o=MTy+ z$6~jPn0S62e(TPrr}VXHd@>w004*HRX0*eByyU{ITqx!OXPA|n2D_i##F(^H9 z1@^AJ;u;PWF&{O2tzJ7xN*xh#Z<7D6FiB!+o+Ipq%?=BKC!NXV%SUuw_;MZe8v-ee zJ2B?j37x-MX+bBBR&&>FbYYOldMif{?P>pegD_|n+;#`+ECfOSM5xkwxFTdPBD6%%5iy(rODp}C%l*(jF5HeY5 z1WTUjTu2BFEmV6R6Fxz|6C#Kp>MK0#i(yA!>OkR5CI$fI=dv zz#I|+J@26SWHX=Jse2P?qhQTdF_LT}K>mISyUx)6Zqcagk1c>W@k)yX)Wm|epRq)P zenE$!AHv;~V-L4u-IU`|W_}AK;-4tsYam03zT|YjR4vyc%mFz;Y~umyziM&J7As5# ze?JgtCN=YN9Zh??b$oe#YmkS+b@vpqWvo7;x=bSvDFE)YWK=L&x9KON1Rc{@#k<_; zq?OMp^>*p;E`6Dy*l0ADSMfM=zB7}D5P|TPIWVapHZcCe(RYvQ!sb0s^QMWDfS={{ zMnjZj{z#Pa;9y)96d`kwsm)PPzEOg4G5W~H-PvM{1xEv^+HR#w%@B&1%$bFMLoJU; zH#B>$h5*7q!{x3FcEWo4HeF@ueuCM^Nf{5sTsUrgWyX{PqWWZ?|YAqQ*Gkm|+dyRNh=X>%<+iALPE{y;OHt zPe*aa`LGX7lfz_Yxja8N==4BH1Xe-z3}}Mou!6or&iM??u~95ufyg@^qS)`ddx%0O z=bz^6fn_OkPB7L;vOG);s*YDkAf?1C*n)nW&_sUK`|8M%x?+Ns-|)}Dc0(6>NS(O2 zfw-0FUy~=V=^ADq1RmIW&2{}mAfuPYEFaTP(QwqXTY1jjV1`d`uT~4u&_JMeH96Fb z{xm?qb_mZ!;Rb;~w3Q2+1#HZgbNIp&J2I=+Tkn0B*Oyvg*jW4?QFpv*sqBZwa~E?Y z^zIyKcK5Oogm1COnzho~y|j2k)02i^l{O)t3DvtSp&u}xO_|7Xq?DX&eSHIYDl7Go zl8S*`w2P1H`QxMI)Xcah3Q0y0dNB_TKR3KBC$YFJqF`kF{C>N6e!s7e^1LCM!s5?m z0DGw{@OghPKH&AHS9_U|x;P#9anN_VwS7ER9&26f?5VjS(>3tcbufgHi`8eD^~>PF zRxQ$p{anT6!0O8GEhpdJ*MpB&c3T_3e5nM3nDV*@HI+JPKZYRG;^%VdZ;x8E#eSm6 zKi0yw8_!=*GS5_=4LTB~2B9k+gdis0?%i<(!czi`A4B6s*Dwn1CR588a4V{6RmuCin!57T zQU)H|?fNpqfg(w>shBnJq7O$qGp7nxQYuEN{p__k@ETmHFno&0Br-bqfn7R^uP=sz zEQ~^Gb6|ve3}C#-`>m%=;? zPz5!|7p@A1#q36teIogNoZI1S@`)Hxh!!$AxHANcerP@1x6~J+J^@{G$X@NQ{W0__ ziB8f)!X!pbujEGpYLzn*OY)eN2q}$OU1Zed)y3x88fmO-&#!Y`EvVVFX!GQQD}i-z z1q&ojum4Y&IiMMDUm5xAFDM$l#QpwFzjPN&T z%uO>tWjE3Q^-(z0W3?h7$-%*)`{lkf?xjRA{?6xx0IBbb{t5c~;uL~J3BtD%J!<2n zlDzZUtDbOlCNdD}C-82eLDS$Zl^|ebQmLsa!Ku=f!6mFY!;ywD3pqV3)?|GSYcH>` z#qh0=m^5V)X%Qqy`*SEm5aauiP~z~G4Z^4LI2c;x2VyR^TW=#fQ(g8aUsTQ{<|>x)*CX5muBA9Lbo%b_SO-Sr`$) z??d2n7GM6ZwI~`Ukto4%8<^08J~TutBhN#tC2LfzM@*Gbn^*| zezwFLlk^kvoC&<=54@QNptFt3td&9xYOJ$d z&#EfQvtgzUzq~&(yvcM?16hqt3DOz-bh!OvM_j*Io?{e$cg}vY1auN1Y*VC7B}|A_ z&2a!eCAJ2;ZWCOaE9QFN<=UODx=>#r5f{786j=_>Qf#MXMmG3^Y;tY1A0Cg6r_hZ0 zb>&8*)B*(}%n!!&^t?aqz@iBXJ~&II!GUO$7TYZL<7V~P!TliQhEqzdFNwv&#dDh8 zuO~HyFt3y26*O?`_oBkXP;CxN&e?0w)HpQ~)k9h}4bo7tLs4V2>A!cqRWWZ*24#`2 z=qZQE8Q%>g;H+-I>6KL)7?26Xx3cZ7#gW3p;~>yR3CUOHW2q9<*L-cQ7rc@A*yL7~ zpd=k`vw@bgslU912mL2S6|}4SKbp=mD9Zos;!8IyB}kVv(%rB$igb6kN_WH3-QC?F z9U`H0r-0-t-5t;UduIL%ZGTcBHD_r z3ZG#r()Zz=^;(5pWTb%^n7$Q2x%*BFgc|8M~FhIjAk;QLOL2xx~(H;Nm*Y*Wdk+{UERV) z9YYyTRfx#I>Sfog2xG~U!-@4)gQJ#stgg*QNNLhWXmY6` zr{t(bMgaYs1ogVvz*(n3L6 ze<3=SumA`znbyu_HW5UM@E%S0)GrD`a3C~$>|8qDSm zU9+8OV6*Mxo9U)SJ7|30`6QyG=VE3DOpy|J>O{=6-XYRotoZ-{ZVyXmuKQ8-sg!3^ zFt~M(7{3u$H5x>-#zUVJn$(CUkB6H`H@GWMzZ{f6e5rT*{WF4lIoOPOtZDN!0<0Fp zSqhfc)RftZgz7~>>;4wuvvv1BdHW{f6ET$z{wY!T$0^GD_>SR@2N&Pw@WifsFkS6xVJSlY^cVij#Dhh@dbVf zgOL^&t&`PC52}@4fSK^#mJ@*(@iKCQP_fQyNXCCOt8juqxI$LOcanYL6!Ctk>mZY8GDkSyA)E%~!;t_ffnXE6LP}(& zjw(UWr$lm^rX8n(NAsg~uFOt<+{pH$)Q}emI#LGZ zwJ*5@WaieHGKVwi8|1BZmpdg^dw-wky{!)e`q`mx7$;Z0>D?c2W8dseT z5{miL$Xvi& z6!$jkj?&608k1h|>4l<&+r(~SF9j?GXO@`4bkg}F12=!(-+77~MnYZES%<5tTPtL! z>N&F8V}Cc5P;pKY3=hKKXQ~T?0l`)m5_sfZGG3ZfX;Y*`g(He5A<*Q!qzscsycx|HI=M{+CTb7 zSD@HN<#L2OG6y0A2;(P(@`{sP&$+67eeQeDhxOeT7)ahX9e{bt)6<9jvnn2#20_*S zE2xNGhQ}f!5i7C6YLkP8GrO6x-|TKKD%G%T#FApYSU|T+A$sgLgWO;+2jEffF=C&; zhG@u`L#e}s5Z$qHH3OjynpMZY8Rk~bKc@fgz^aOhs@w?-v~3?8U|bD4|6oXhQopw7 zdFa|V79zzFTgXdVScwil=dxi+CqoyZ+Eh<3qbaXoJ}+bw1Ew7;;j{xL2)inw#MFqW zs?r49?@Qon^gw|`xQi5Wt46dmQSzD#fR=Oai6`aY5GQQyVn0B6kHqodPA?_(1H_#O z6v%X6mc=_C8unv{w=<%{df3sM1v4Uv6OM}Sm6|C6_y09A>=i_Qt~ZE7nUaRYt@t>@ zk$-xAitYp2@m@~j<#zfWz8m|UeUAWoZJ7(uncwgpW{|9_99jw|{`VyJ5>HDd)z#HS z_3QWfKF0C`-FriF?4l0>UxJR3_L&!J5qd?x!C`0kAIv|xzE^1(Umu`s!$S8p2!@Uu zq?NjCY%_5V5ldA7hqX~l$cc|eDe2)~hw)4%&S3)eD21ewj1vbsx0zd!N(9vXc*hQW z`yYeIN)j;>s~71Sl1X}RujsNM#X5t7B5%Pop%t8pF~bK{pahIs9tS!Phq(!|iUM>W zpJKrC1Eepq`P%{~@$%RMi7}1Rh#(xWOK#A^ctx97R zvM%074fsqcA3@({Ttr~DN!n<}90$A&^`z=qh$&oD_3|ut68{!5FR7g9HVlo34; z@rkJSzb&ZeE{y2)94L?&5r0uNXCKSi@&)EtH2EKY9qHqllf;ieyTwVKw_BGs`!2qh zDy0KN^>*(bB8-uV@p0HhLB^7TkDA1(Xjq6S@2K)7@}i||s2rF0Sn z&5gJ@V_}(&|KM%=RgQXG;xaSQDk{G&(fPF6zFRJ(nK}@0aj+o8yY$!n8feQIV<{-q zxlWZfAI-cv9DdLl$5fg^#*7CqrKv*UbJXbUcc>5GwQhi#2JyRD;6x0-MuCWlf*L%1 zue$4?*&o4=E-~0g{@YCVKP|RCQF6VsA#LXWM0kg>SzqcypS>=F5~7LQ?R`8f{xUZ; z`t>uA)acnT!NbkebfJLYQERI1O=d-a?SD;+Ccm-Cx2D!isQBr%*yWP2DVj$1(jbm5 zZ{z6&6Y0uOi(v`_A9lKLkWt7xw2ZCa_Xulx5KY|{#J`PR;b}c=%p)Q5XrasbA!W9| zmUaFu#L8Y8E^GS_ck5EuBi|Q42vVz>a}tEDsh}V!rZZ$6b3H1U=EDaL1*TF0^%OeL z&+!iv9@5&bPAfBrSmB&KMo#*Q=Rgh2)P4({Fv#G~ViI*{avh{|HTP90NCjAp0Pin6&iW}yRQo|DFzJrMz>!*Uq2YTFpBm$1NICj-Cy=VUlYt<>s1vCO> z7X;d4{f*BM%<2}hLYOMTEvLhaEaT=B%(LQxs!Ux!Jkuo_6o2@hkP8BhxTd&~DMF#) znB>RWYiq!|7@_}h0x8zh1X)A+&E2&36F*~8#7O|+gX)#B?|G$T~_19@Vp{U zV|qzheS$k~SZxNg+PzY4@JQHli3_lapS zqd#ET)Qtb&S|WOC2>klOL6ah!SX__fc>1`Whw>qgUyR}6JaY12lhso=%v480wX^Zd z;a+}EXHWC%GQP@S#R6T!r84HAJOwnD)(Qqtc&mzvCWGkCH;62mk}}pc`rHILK*KeYWzQk|fpw#fha5gUc z=GcYfR!6RnHmy$PF~A?O@}Fmc@@~Kbr(D-Cpr*GCYv16BUTJ9~XI<>M)vX$gFYobL z%?bg*%nrxaTsv3-9W`)uy6szh0%rkFP`g9p!L0Hh+F$cOkuqpB6054vsRuKbt7$FL zYw2mcA2O|b0odZpW58?Q>yYu&&?V3abjdEF0!hN-tePe7rUn*$h6{xRcR>i#0dSkR zeaLq1D(Y+Uw)60Cc5%6!U%_CaKbw4Gi=7!shKC2PzpVkPD8l+AN%I551#CZKWX9geyd}<3njh#LX&{t`%2Y z8}g)0+cxWK+a)R!v2OYf?MbHw6U`Z0o=3aZA-a8R0B!YiQ<&~%vc2TOT*aPWtYn788QW{_f z`9;o98xE@-5p_*^DMU>+zw@=%i#FpISbD(K4(0Qn@yp(jQu?IG)%3=T)2}cKu0%_Z z`;6XF;JAVBWdgaxLnXK#e%K!q4*-0$ST{(5ZCzb$0AXIoPrg!02AN(W2m(c~V3ZA3 zwox{U0|WV9PExY6k93I_WGgr8-|ofaRxtHUPGWyq6fsi|0v^G%Qja)Xww$Qu)y3W^ zi(QJ#PPx-1NvQqWg}Kq?O;RluAyO6-dp5gZTPISWlbfDYfise6V40RT$(ttst1jONxi(8q`?MHIX5AGixdlV_ ze_nuOd3img*nz`rednI%lMNf+^O^F=JYf%e>#mQ}q;;Yf%RAT#YEoZ|6hN%G61b7X z1k0RMLZ{>aH5ppbVt_W_@H5s#afk|g?Bv=p+Mk_6SLppsh@Z%)z_LPFp1UT^`!Oyc ztlFGxhDRV(L$A4oK`*Nj21HRTNK~n-r+^4nF#)$Y`mH2`DMtujXOB(q6yxoWN&2cb zm(K!b2&=9{P0P0D$E1D@Om=TZYQA%Ne9aLRY~>;SAh}|WfpY!paHQ(ZF2*4v%-Csn@^Ol zu-EI;m-W}1yPf!ea~9*o6hK$x7IdF@&ayusA65iLARl+liEf7Iv=mG{0E!Jf& zK6SG9#tsn47gWvudC{9#k7bzPX}R>7;$Nwxu{61N{!}Z_xXUhyJL{Ko|)A>@Q*nc+=A4Xwe zVFlgqwa&kN4{MD9CwTAGoqBco#|2LMMDW~#{gQ!mf3FBk3HAvOFCmJ#at6g#SUT#x zvM=X!24UeV)W^emb~fD$7S6&#!iQsAjc$xuP#$2xy6^Pi6Zh-?IV-_r$(&9Cg5i>;rl6HOHX>Lv ziEC5N{s%nIF+&7VMRQE~ew*!>wJLd9q41oWNO02l!0YAfMc*3=+@DdA6+E|Gn~#>w z)}(dn4Q3QJ|H9;#KZWe~AwrcySCkf6f0sXPV(I(;$gH0b8$-0hXIeYX{6g8EF+s8| z=)l~T%sbmS#@aq8E9CwY2F`TWTx)&z=-M0yz8vXB4tGj@(&m0C5lpS1`J#wdJe+Yq zL-!6LIBs|c2=)7PbxjTsCux*$uCj&+D}`{S-di&}J1fW1Z+PKcJ3s^B!fI?yQ)w?Nhf{mT{ z!INlM*e1;R`^+iPdj(bGZfj;rA`!{ye-;|v5;9#b`Vz_7XojEZPEJc(|f8<$?t?N!WrZ#oaOKfvxeSJN*F7~l%H#@eH2=o>cx$hx9;QC^3EZ~wq z|9*Ky%>CwQ1>@AmMkqI2I*N?3C`;Us6?>K9i@?crXQyvAm8nr>!O(!Ue zPC+fXMAZJWyI`;cB;n7Z4Go>tqh>A2p*@ib7SlycFmd&8zzCQ|@**ORXD{FF<+b!1 z`!L8k3*k(qcI>KK1S8U}zH%%3t?bqHE)l*@jrcex6UG=??=fysn;<16lVYjM z;Va4Nu%*5g#F40H_}{C?|N4M+Dt1PZ$zmu@da0=4e1dIz)ak7R1e(yorO?#e*a37E z^)zFBMhwpHj;LDTV6LrcKD4**yVmb>yFO?IqFmX=PqRevl#j>$^{^Vkl$$ey+rNM^ z=m8jj=Cdzp?3rs2%CD}?)ua=>qr^K@6`L{d|L_P zy1lDV94mk#3syY@i_dX-r<`;oRSzgjkE>DA;XBtMU?glg9Z3?uL)+_vj79{GHjV3z zjf=4yIq;EUhAUQo{!=x39JC{pX+eCa_Q>iH$3U#a@k2ZBOMS~$a6yXMwcd?#r%x(Y%s z|Ag#tu@rGzPd@Df$Z){0)c3S(4x7xmFYkLfEc{GQbzureEpW2fR@Qc}+a(9QapZw! z!-#ZdXu()x?Om<+zb^q6-QC5(L1Hq)ltB232$6)l!SJ)DV!5r^iebkS2{mJFQj2vG zqEwa_71Cm`OImI-Z^c$d*PV@(qM0m&?R-SU3>{8!fenP9ceo>4FSA)W{aa zI;Nb&SPPCUEGAhkZKxX4mbsYhh_y5l%7o;dJMCar2XBbp*tJ9F4?gM$kHhI)XSE z6s&_$SWdk{(G0G?;s0U<{P0_rfka1fH8e$WIc6299Ii%mPgJA6ph&y1JRr1{Xf|8jB4xX>|MOqO)O# zKfLt)pm)uBX-4c0q+h`ytTpSajIKcAiOX&)b!!9mm{PsF4tk$$E%OvIsP;qsQnL(a z{-lGci~xek$i^;Pq31LmUVd&-QlbW9rGHc%UI9v|%PD{^>Jm4FlW{YS_ln*|Z(DkyjuZ6;eC8ebS}N(XLWWQDh>ZJo&`CB3{?&PY`g zdj|zk>S(K?gsILm0yGa0E+nU6ZMEGJQ|$B0k)QR)@~D=91Q2!95?Jw)5mBOeqQeCi zMf18%)YsnH^ZbGV%xVN_#}_+hORB73tpUZinF9#*$-;K;R$mO|{zVvvMzFk|xq6KC zvEZzWwtV5Q^c$rk`M@Qi`q}htqLZ_O_`~v2@9k0a^Y^>?%*UTsO;R-~luX#c3*|V% zP^x}buS8m@fN4t1p3D++_sK6t1TtHObQp&QEgIH0FR?T7Vir(4Vn>snf9rgvUy^N$ zlGOr&Fv@>lT(weC8px8mo#+=L?Tbuh7}`>mr>My?l}1VpxSnZUSw=255LZ?)#RpFa z4Y(;8-)BFEcMUq5W&a{F=x_}+K737y-1j5h*6|RH_jg!uemx9;nHm~WsyaPrvfH5; zKv=o0=1E&PPHGV+qSLa&8c-D5xor>li6mb0AG7~3e z1trmyrI(HS9_~-Dje|GWS4@dQX<`Q(j`U?cJ^L)2SL0>ohV1O!`vC>$*7|?2WOSvTN6ghp-e0=mUm9qsYuGYGDCA?Y~7Pxe%{&doQ$0HmoER#g!?y#^VNn? ztkP{a=*##-o$slY_#V>eK77`$*l3x|>NIStW~kKs!dMXdWwHr6`!K%JT;Kbkm}a>s z2nmCN@n6A(DurLC>D#isPy}db6q0_o`#%rIuFdHVANFrJ>Ic623oZFI)T*}P>V5LN zWApxav*T&C6sW*X{;_qI|H}W`y?KhyG{Ops@_q8g6g@TZPfe>m#?y89+H8E>x6Y}a zHz{{qmlgo~JDD1QgV=2yDQ$;lnz+JxdOf~BJlWQJJ#L?FM5(eEM0m2PO&TE$ipaqxJlNDrZGEj8v5o&BLV_l8^2Zu$Yntrq5@UX zoJl0g;Kg{+?q^k|!%6KEn!ThC?F)ZA&Z(iP^?7t8JPa+{xM(M@8e{m0_w#=0qu|8k zY{BG7Ii&V~A5dkiyfGpR0=3N0G<|to++QpMF(?FY3@VVA^g2FOg~^1rGG3Nq$$CP1 z{B+D(CSbyAYmuDsA{Q^}mcDb^rp>wEkq4_<=zKSMA!-ac|8%BMbpN4LwHBvLQfwAp zoEj*tRbU|Qz|rqhEs=fO@FA$QTm;WluaiG6E0;A~T+MCXKN0nI_Z)uA6%@~^u?!m{ z=LVtBek)*m^PSNdiLPamOFqq-m5Ue~C8Tgsk64F!pOCu*m0Ospm3fP_PkfPpJi4}C zj9=w(AzAUmE3YVvFtQ8(~4zI_94bQ z0jUfluy?%uYDIeM-hnUwLoHj1+Dvh!a%Xb@B{;D|)DS>R_ixc^6#$7I~xz~ z)EfHI0yWm>J8!n#KcD>yXlA`TnJt{sIrZ&av)Q3ImSa`e!)|#CcxYULZ*ch%+%gylnPMK|Wn%E4HfO$a_5p z4&k`3*fnAQW`qk^ zoEJaz1U&ZHslB7CE{?TnMFD-%edSeInsBV6pRL@b!;q*r+~`tTZ>Xugb`Hjl@B}+}5SZvNue6?~8nARPH-XThMa*2!LOsjPT#zLak8~$Xq{ZjZr`Wq(Y5pWlThO} z{&!~h#0hAr+z&_BstvBtIc` zi&b}*VS=9DP*&^RjZ7$?}lS2k|wyezRp=Iq^AtPi_I; zRBgfnfgE_%gT8W=(A!8u>@jLv=`{&Dh(s7=Dmlf{1p9jxkgCdw^bn~vDc}hH-m1Af z@vVQrzwC{eR2eppcW5z|TfW+J)cU@dH3*38()>;vp4;c;&YRvl2$Xk!eyNvVh#12g zUGNoP1uiD5E*-893~jOH14>A)a4{NG~Ku%@;Se(P0&ud^J@vNaIeC1nZE{oQq(1hRi(x&;&=p;216kh zEu6!HJi4K!=-nbWk11Dbo7GBZI;ykaYHB3Y&BKh3v-hQHaHP*Y0`(T>$ogKTPZTSGH!a$%SHZB7q4yraeP zC$1kWkO}me z2z^P9rPP-=(WvkC?8j-}*S%So`0Jo=@AcV__#BZhUw!P?bR$5aoTK)~y5R?f)v*Ub zXlrQ`TbY_yX1d-zKkhcVC>+T`^F@(laD!<^0u6h#* zt+)}7USh9s;FO|@X8v5L;nY$ZBYm)zkHZoUE}^yziv5CHv9Lhg)Q}ksSf!Y137KSe z)!nTxYZ}5_CIPE6Krjq1#-$-CC1jdsj*&Jv>TQ**CBx#AkO-v;b-~#W+@_nl5NX?% z%C89LX8s1Rs@z*%I=Dgh+3P(?S1|}w0SujAD>(#+LWQt4Bf<$PSeP};Z4?T%^yD1& zZ%st5h5;veM99&nh<%4^)V9^6}IjFg-Eg;qfotW1ghm%D=*UVNLYt2t9JS(XpP zKWzFbs4w3z>n|6fp#>H3hI`8Va_tn({-{DGelv}L1K3#_nicV>!El9lfpv+z7@!oE zpPb2Rhlg@;l*0b!+ck>be=8FCkuf8 z7K$Dj;B$yu;Z!bPF6s+QCr#PTWX98UcZs_K7JtNHp&`D&}m z!OhXN9Cz`N6<5}8zWD5X<6zLkFI@8U&eZ#dw82M$n2(ISLl3M^i-Poz;n_` z0RN%FCUVihEjokNU%zjde>mF@j0?|9BQt6}KDmE+?`uSWgiGl45o%k{PZ5h68H_}h z>hK14Wy})JHQ;PUe2i;^OxlK4)6-(hVCAD_qF8Ml&~Wu(_%6X>kd;$$ExVvCl<$NfwQ3+t z+k9fd`LCTDQS)KD?q~)fE?u~0EX%vnZ!GY)ar->_ z>Y@rI^5(AEM5e`ViLmAs4g5S&kDKw8xgU}$B~%ttH*e}TSkVS|Fyn!ImY;xx1Xanc z_|w^Efv0``{HNh$6#yptIGG2?agEfnUG*O|ef@Dv4ZAC%ZzM?9TMVQb?Q!I{JYa3< zSne&CJ=g*pE;i;~r|r$;BK-=CzG0uFus{;*%b&vt3oLwmUc%VL9+u4mgtONkPkb7d zNF7g=k*3iQsAz@YBrxBnIokYq#f#TAQjK2JtGyl_wOc&}oCe57hd738<6!}lY8@k*4^1$}P;GdduC=Zh}+g8om%BuUKEe#kH z4$0p7oKiCEvB{4^gMoSx2})x8ToitR68gPyH#2vtiKe*@3|rQcp&Na~v4I{(2RgLWcz>Ml;hU(JX!}t$p-n6{fgBRmFW<+d75J z@<&p6{iy6c4HJWNP?n+I6}3^ubx$<2(&58Ds;-5LzpBj^(7$f+o!IiRUDVq#I_-LR zoc9k^S#W66!jAT(WpgWw``(DsBOoYOy z{p=-`RxXMaMFJ5?iu#*f|1r20s`tjqTm&1^bi_}YlJ&_h@321Zxkk)pkMe5mW_=$@ zuCh-N@3?kIPMs)7=O)^B`cWTCP=KV}WiQ>K$lI$zRqPPhRAmNq`K$|9#{G9H%U>_p z#czIJiYq67AGI*dsKKW)0W+B7;?tpUwjgVa{I)Y1MO_6kNW=?uuG&sCOEoNQ?sm=_`6^A;7>*RUDG|=Po%V(aWYqeSpRK`DS{2~za17da% zwl_WvJg$8-4f}E=n?UxO$PP`qgOi8HzOZofdhY#+6FoLAR+5xPZ!#+;O%>U~HwOE} z)0W!2a1rw@GsJ6g->WI|2-dvoX4-+RHyyV!H|h+*lR+*6mY>t~Fh=#Uo2XgYQ|@}& zv{T>RW2G6`cI51_@-Sq7{@anCVO$9SrMrMdOfVau0mb;hN z*E6TAiFX1u^+r6)bn5CFGr;C}>0B;)9Sw+Zh@RFST}vt-^90;4234i#KZnMk?(Sqh zd}T&5L?t4Tz`#vZQxtVW+Z6ww7vQWv1V`koe^04i^!cjI>392=?Y}d{a`88_FRmWp z6o&~YXPPLhu$FTen`%U%TE{h6O+tHV?=b;ED@xx(Pbl9;*gO)iNYAy?iRuf@SqyrL z;^j$(^$MAM|V&z6beT)_-p#g^pQa}u92%$eb zIPG3!tXX7iUq+RR+5OY*`>C9XFt*j;%r9ar4%Cb2+>E6u=xCh~0q_2Ko*_1_lAF@z zQ@)*3&49C!fR7M(BeIz*-3r1DG;(|VN_bjiTod<=uwTxe#E4R{Xm$5@JQbnY1g`GU z$_7k?MDO7PQF>pb??q*~$&4+QJXv>@SK8v)#(3hamSXpKEit<1-w%)LS{i>*c%AL0Q8BUt@ca6 zNrx0LOJ7)U34YnO01WTQYs6jc{HsvWe@}aV<{P8Qn-cP=iNuv#Z>NWaGtMSi|01LV z4hSUbw)bt5dcA%=k30EyN5%0kj%kDpAM^Oi+M1iYgmaxvk4}zGc4f98pAxC=f9}z2 zgtQI_Y0B3Lm7_?=fRgk_0+UlyTU*_d=~%`7Qr_p1bbl;q)F5ix9>(EaLG~05LNY3@ zxcUjDCW@yBoJ{m z^43^ca$MvqT09;k;bcP-GD`W(YJV5H(djQ6b5o&vw!rO<#DQlPxQ`dL4blgj+#Q)n zBLCv2s;Ta-PcrF`8RT^DIk7&k>ggS(*2)Y`a84MjN_0Ysn*trp9 z#@e1LZ~#k~Si=QDqly6Q^HiC-GZOia5dJImc+#%8~^pQAwpg{??5SF;e?<#s=5 z7QMIelQ}{kOHbPs6$=f{tYgh}>xfEQI5?E@U<1AfSN|}G-Yb`P#fv@sjRz>z#fNf} zxx(epWw|Z5NX~sdy$!OIo{=L7R~*Og%YRfpKfCh%k!=vDJk?NX5KcbAR!g$=yHtF4 z{>2A8ac5_D0h*mkjsS074Qk-5&{Xq3SD~q<6$d+j8ElS>3ZGh`NVElBD(u)v+4h7p z0nq`!h#5f}K!6)s@T>Op5=Dx10oG5Ru47?Sti2qO!f2ERzrjin98+xf72lCZN9FgL zeWDE5?i+PUDxaQxX$)VK2YR9s+cN#$krcOv(z zNFkC`gp|DeQF$Q)X9T^K3GKMB6-y{9oHW~kQSs62!P=Tcbazjp^VhVL?Q`=?rP$uF z&-dNV#&yDmxR^BORu-bxyP~gI^z|`5rKf*F>wa@m%9wO!{LS882>^?&uD+puANsR! zhMzPv6ZNs@>fzd+w9T2N)Z3QiX>)~5=frGHvC0k@aEd;~3K6=a#{B#t>1@Aqv%r$h zurq@IJ5|Bo`5@K9+^De_%FuxRi>PQ77q1Zhv>N{F_FyEA-(P9a*}S@n-|LDs%JU0Q z-{$k2*Zcbg6bwZB!1}LBYNdtjP;7toS^p6 zf^Vt@pYC#2i9KLDIsg8|Bi~q8)caxnt$C72TS@9-)sj-|O!JDXxw(sn#}b{wsuEnk zuH4?`NwK`l8x>V#%3TUn)@>d1k>~H91<2@a*+ZRY_3V$^KCt7W*c`?C)L>POK<&7v zn5F%Y?AiLZn5t+oG3oIwTb$41(q2q7X>bTX;i3jkkpz_nL5m=ywHigSi_9PJjHyr= zOTL>FK+EQUxi~rH-uN3N?sD5EE?qPo=v#=yG%e;KQ2jJQjf6XBa#59%{v6UOk`G(? zO+%dDC6)1O+o0INID~(3#mwHtMQB|!G;$GMQmd_I@E^$y zmzwvPIg$h}qH1VVV8?R1+s?tll848)_?o&r5wD`nLrdL#3^e2g`0p&N#8}a7-snTg zQW9!57%WsjzMuW*J2Qp&o^-(evz&5W{=#Pf!qYJ`E530cMU=fv`E{9Zc8+blzY8n; z(#3x^e`49DSZzmet>6rpnpq3vdm{z{37EcVU`-1Ob6Vec`3>v40<0#Hf0G$L;zSg) zve&q=()7b~kzqdlv&*yWn#&BNQz%MBf1AT`5$w4NeW6U{ENeS=!30+2h1OQ100~8w z($vM&MbV@61=(JH;}xI1lurnWR1mv@Qmm4P-=7l+SsgEfKhX)eqRYN~lD)iG|D^b~ zICWMwyFV4ID#0=|?xpJB;Lvbc$T+Q6odTqZ_3Yy^4Iuq;l!Qbt!YpY1zj;%_1bamPS~Osvlec#I)-}Z7cwkC)7>Rfcs}u( z5y#AF97tKZFBbLs+2V-r-bm@(;aN*b3^KNUIRr*dX)~iXY>As~as3w&I-facQB0*E zVDS4WGrqMBzr*3$Z2r1l|GkISYT0VwZ6ySeXBS$DVf3FI;9qdNVl{@C8UnGrgi~gZRy&&rAY26B~lRWxQ zPRNytAi2CHTX$?}{6qu_1T{!F8JfQRG{yaR)zMJ7eN*}$jI-pA3YWYin6WC#V+ixYi(}m4Y zW5cMPd2*+$fyMWON4bI-L19A(*u*l?j2rO)b1fjs)U^9g=*r27!+NLJ&Vsh_#_Fm> z0`PNdwRUv3jlLXp=6?$+|TtA~dGS?}vW*yH5-?N0vF z9ftAU=-ya;j)4CW;J-x~EMlx_r73ECKchvao^aMUXmq{q?Nw=VxNG)Ywtr0^F%e`0 zj(X6YHd=V^P81M+ECT9*O%E5|{16W2!#0xA!TU%xRclGbm0oA?d<5>1a)dcXf6= zu0U-_9uTy56hV}q3g&14{W5V!y=Zf7T_Ntg>P2SjTYz#%`YVZR>6chIag%GboYxso?&^%fP68P^0x z=2O2*l}R1U!&^M_87QFQr=yHr<;E4K!|`QhPX z{yJl6xLSEzq!}M(sniEzSz4{iAOi^kXV7sD%izj!ZS0b9!1Kl4Qj~+(+gN1azQ+MH z!8|NfFGY>l)z?!BH(6l{TEhi`Th*X&DtA>q|0-}0_6Z9Iq~wh@7zY$*{BAcrfQrU! z{`!DDmQBx>duw_YmfLlYS5J|~MHm0=p0r`?J_ z1NrP9-?R{}1W<-mzy4o5>Zwx2&s~fqj$D}cZ+s~A*hNvpcN}~~P)=)Hrc4Sa{2!M} z2Kt#*;$+YGPjq;QHCUkGa;#tpnU;^kz|&%B$wQJ&hqev6Ku7xkp_c51)Urxszaa&| z8@2EG`h%!IP{y_{w({GOpHlRpC|*R=4wUDb@~;QzL=Aliv#Pr1V;n^5WPoTWw0 z_C)~Nve?s-PFKO3q*mJJ9LC;Hx~BCDRQ;L95+N-Se-NsHsK;X7GNT9V!uH2Nfx_hE zw?#b`DTr0&gb#uXG`>P6(HVt2Di9T(d(Bs@>uR-{f1`bJ5+C@)X9OKBYgnNb{x=FyP=$^`83m-C^_|%c!F`s$(k!xn-5qaaOvFYeW{>HAKJU7R$5E(uJRcB<*%PRNiXfn_D;@|7- z>*I1N%hKXf9Hpqcl+MM#8!=pw=G)J1Gd=w-wj*jf5rIA5`{^qA!sV$Uk66aK0u7o+ zW5rkyUJ?~8Z7q~y)z7$^%p}9Opv8~ZIzGln7!*9+hVRg0J!q8tvPhOj=&t{;pUq;# zkoxcpQ_)=z(;RJ8q|iu}rj}Lg+$JGt`s}JEvPJy^#P{{_y1N9V zyQM<}X{kj(KqZ#$&i_2`Iq!iz@OfwEH}`#I``Mqp9fhnfejI>aqjGkq2z?e@Qp0_3 zZkYCQHUqspol?>GF;?us?s0Z@@keu)j=Z?L0+raoy^@wem>$so`%!wFC)Jy|ipb)n zqRZb1W8^l!_gxOGHY+ZmWMI#L8NZg%o7|!sz_kLkO=*}NkCuw)$edm8*yMI zTo5N4JtL}lV#h%rlFR2}(i^b5J-IKRQ&UrekB$N+1|g_pK{o-43XE0;WXxL*uQO%) z-Xocb=GGPpUKSAqxp{hC3atljvzb0E4-XH|l#DDU(sBxpx&w=}y)!c^KRGB;2Dj1S zx8cv>wOFs0&c7w^u4pK0V(&>2@dWE?5_Wuf1mVd33{ZScjn z%;AlNl92?e)b0Q1g05EiBuiZljp`3l!$82;eZEL*5jpFKE~D#OgVIN;1aH8!g>MAKJd- zZU})Iut3Mok&)7vV)VbZ>KIfrs+XKLEGmBX;4zY z70FE>ciG6jy}Xilew}W}FQ31wUrWkKJ5yjK6W8EzuhDb%2sZy4z)O`NOZRjV`~VY%ebs0~UxSw5+aS(<aluzyTG5KNZj0zFvYjc zppYt632w;?LtF;*<~U-9oAHX}_D5?5i>xzjQjK2dv7Khy0v8Z0Hoe`PpHBn&Z~(R9 zro7{ini4?#5@-|sB7^&$lDrla(%_TskyB=$BI8N{mUM36T&5`D$<`{jmxLNkJ15!^9`U~K8PZONOQg#zlfpRV107|=8kkK*C$Ru%8>agbi3F6Y^Mx=Q2y8C4_ zaoU;RB~7l#>#v--K^(E3HLa&E|0V)1FBe_cx+~*%ukUH`?o-BpF*bzoGUmt^g}`(; z3RT$quEvIIsZwX$JcT8R=&I0=#D@eh2EPGulYu2an*R=eV!KUVeJokz;%!YPj-7&0tjtGE?#|S!-qFc^B61@g=vE3(< zeSG|Z+Xq(NVBB+k8CVPqVqUnIYLMP zf4zX$0kGjOIc?`%)-^l^nX=&_5B@8X0n~Q}L|8$BgS|{!rx7~Pig-W|-xH)7o}JH0 zsh*}|KOH9{Rhu@8%KU{esYe`nAGc;E`EF<7QCz5v6w*aUpM3Wid~O?mnqfy1wj~ma z#$)4QTGvfZLrRjKf5hBZl6MqXaLgz|%C(aIFc;8RW1O|)DO3h3124x) z6{B^k**1pkY~9yCf=*4|gbogde{Ji<4*?2Mr~BNtN(;N)ZpZe|eal*OBGbUZ38ynQ zG|h`FlH#2dXRIL&m@LGoh+kOK+e?59gVt~TK7}#x@v<7w_w607P_d<^O9X#z#kx<- zEPy`i1>0e7ZfmAO2-?^-eOfRL zK2=Oy>+SKpxEVdQS|H0qObK2kM6NM}MUWS~AtUUEw4dJ^IW{-7!S@MTc`M}9InCQV{J_m@c z*s-ZRWksvfRAXtV&o&a`#t(^z$m(9up$`y*%vSx5sBIN>>Tq|lwS6HFsqi>x3MMt*;lXFbJO5w&!{?iHu&I1{iSq3YIEe;A^dV=ufpTn~hN8VOa z7gf%e{?FU0iu{q2=N`JaHFwvS*!#NeI?Hh!*v`ckcXiA&UEc-pu4j(k8)fCiK!$<)!FR< z8WAd#WmWOMWaew;zv}wcyHVA5y*K~d#U6LR4{k{(XEV+Wa557AhFN}qObkNcA5*T@zJ53d*3o|>VyC0I?R+|Lcp|NcI%$&alwkB5 zav~6Z#?(M}Zuh-lthS*0gp^(4BAf zW1NB%F3N2&d3*luGoDQwe9O1M_I7H@gEyC4T0PPOllNo12}njLZYoCK!K{9d2h-;g z^F4XQGl+{LWv2^`fi&j1!53K$~!vv-TlGR-_c!|*0D6t z9b23qb}TtkV$2<~>07`!>eIBme<`~$Gdx_YnCWWLd3Mu09sC?d2gG1T;D|jJ6$*JD z{l2?fo_QtPqGO*kyaof1NH?tIFx7+^tJ?01)J)g4-xKcT9v`>HT7mk=<-}l*(|@Wa zPpZ!|Vt$*+I0rSb&z7ZX4>7vo%;J{=Da@EiHKS&VQpWoIqTU7nGTixg)wbw-T31WZ z_JqBEZ?PKK6X6aVz?!cOC<+Iuf{)`I|qx7Y7-xRInhfmY;G#kp{^ z%8+e4?Bh3sTs4py3!$0WcvEAmwUQtOzHEuPr`58nF54EFf@5h5VnpL8LzKso!~p{2 zl1jU^iVP8I0|py)Qhnfr$({V@7)F}5^cssRwjulh3;IQ^WcgZ-84O=avGrMV0iAW5 zC6H05`;^4fsxpQBHRH{-(MJb219X&sE{xfVj_sc6dM&FSPb6_>i8X$8JHm87uUI@j%vLz9ZU%VweoGQ*np>Ac4Ar7{^SGd}*uTCH9lbYAN z^vU)d$xKXf{Fm9%=wt^we|aRVOhpfd*{O+K3w`jP0bx0 zA8yZp+oa&>Ze1ks?xGU#a;*b_*4Ixs$3h<-Zjwu6hd0#gGr|4Kd#o%?ZCME4oU&yK z#BV^ndNlQ45G`FdP&vxp>vOo*8Xy0*_I`MxAn+cBudQVVMyIZ zsBn_-_2KIu2}_rE_5o{*d6h}@dV$hW^pYo0y!H@*Wp8!?VRH<iK!75G&z=*sOHWu`wv`vpAkml$yL#@k(2?|vghpBIB4 zqccrAJPvM_7SdnQk9rt1kbtZRN2sT-OQ+JiMFGwr7tQAU_Q<2GMPH;T=;7CgQXW=G zjW2Sa!(u`7#n%pRV+pa7tmk(F8ZjWmq@gDna9TCm`zS zxS;+xkUYDwvEk~{(&#xg60fT(Gq}{VZ(Vn}YfmfmwHTA0&faTsWlTIE6V1$VZ7K9Fj&` z4;_)|2mcKm!B1>`5956|C$El=ul;@DLD+5ouLTe-RB2{hu+Q;ntyVR`1Cur}xCP?W zy#14~gE&@?nLd`tyk5;1>(<<@9j7=7>LE5#QvA{A;h*HtKr#X1X_tJqm_cmvgj)BGw@uv*Q$)M&Z&U%S z!ij?#n=l1gFe&Y4A<7&#&oDh$QBF1C)NB|`5yrgctdL^$^B8BtDW^nZVj>})_lw+p z_gkn!@|FEmcXk;B$V)QUVq!QSND$brV#PKb<4v122`Yi5=>T@kCa%$D$TXKtCZPP_ z<%w1|kY;{?B%`cKeS_jBa6TLSaq2vZ7 zX;4oa42B{J&PP2H{_G%ACIeEl_s~%fFvsN;1y1N_uaCcaCS|Neg39z z^8Juw+*+FyG&G~=N3CZw7;FQ=YU20|@vg1nLRI@owkS?js0P01Ap(kf5Qm|UXjyg{K< zht+Kg?c{luR!N1!LP+_`TY=Y7DiFy$`PNX+CKK`9NlW9^Aazj}e>2K%8h+rmeA*$U+GYlBX* z0!8y(fOdEwREtXAoPp=52!%e&njVDecJK?>x8r4BS$Y6gnFFVcSAefm$oKAGZ+V7_ zuimuFYyW+r|Gy})pj}zuQ~1~%eD~wqv993T7~$z=z-I}i(lYT6g+V0g=|jh=i;F)* z{eE#cD$*(Io$vPdCo$Oat^(bpxgG!vL`rvsjFOqaj*2y;-4Db4oIqNAxfWiA+g&za#9 zJTQ=_v`GB;OP#}L`!XLQ-p?}=m??8VnOI1G8($I6FpG%|vT0@^W>(%Bx0PTq7Pu1G z^6zH|oiKBr@xzM>K@Ne6I_=mA1DDp<ds%c&#i;Zq!|5XJCW(z)gh#`gO`86lfxmTt@1Wt|Wo*8rA!lft zmdsR^B9~qackz#9mcx22n;8j@MZwvWiZfeHBFs>eV%hdr6OJ>D$HQ*{AuYVeLeaL)1p?jLG)EsGV z=hJ?NX>ne&t_ovz8KA`#_+l2K(_H0?F*9Ige@!^M?p;+9#KI?tRhwr06uXji&Tts(jUDRqh>yGT1$osAA|gi| z1V3s&6IcUIR{B9|)FRK_juiRo{&957%GQ5mIh2OnS2SP6yRFSWbeUqFbck{b{a~G3 z^@l~iG-+wY`Y{qPNyryV1L;a#!qam0rQ&QcI`lA#vj(3)1^d)~WykP3B;&Q%HRY!G z9ygh=FQ^ky#V7`dx3Pl4WOda$S8tnRiz~7GP@G)CXyh=vO-DU(a&{t7L!j8F&A3aixd52l=t>3n-)H= zeZGIbB>?{U?Nm@(PiJf_WTCVdFOuI15hcT)YMwACK=`WvYQ21wn!d2G(Au(24k}a$ zMfxNsImmO|PCWH$fT}bD%|7};3Imo^wrj^-9Fwgb8ZWaL5RAP2)$)}N53|cI^zX47 z&1nVxAA`Pzr=_B@ZUt2rn!w9c^VyLM!~$t0)vpa6r%oAg>_G`Fmj)6 z61@mLIB*&{sqdfsrcl`~0X26!0DT_%1NtN0efCp;tp9Y(A(;PwAZoGRIB?sa-PPqe zN-^`@BYEGGquBL86vj7EqAlrnf0T;TuJ7W{)G9`&6~41_Bd!Y`{?PWgSC+{n|EMhK zPVPR8u$&n)>UsjS)S{QsssVT3$=MB}Y^PWIIyhtCzd{wX~Cob+E zTQXx>Svl9Pz)ohgQQ8)-BqTp*ct+7HlYq?M!1W>GsBydYwMrIg#Sz2p_(7WNAAT|f zRyW0CtI|yD-IztZ3sOI>N9014`_*?rLNQ+*Tlk0r*k*ld2A6(H&Pqudq0=j;>ur#u zf+U0c8Kgrih@0DbuK<+X<=9EN-P^B6i->`Q)!Yj#Cx@&ghwL(n+fD3*x}g1cLtCy2zDSimhZWG{iYN!<6Dlv^OCIFAo9eayI4pJcFGIp3VVV-w|oOs%@e-) zHQ&8(5aLcBIxT#Ez*q3Fz1a6OG+u8sD`+g% zB${0VuJYv_Z~DEjgk#v?I^^e-IB&9{xDl}hQYOpc0p(VaEgNZkI6$2}RX5tvzXfcZ$h23m}V2Ff0q`ms& zFH{=(3z3EN6FWS)a#jJtfs?4hoy=*&_0rYZ$;b8A;4+vUI9GG7QcNVNxjZ&B{#KJ+MyvWxs`1Tpd$*)5hf*>zE-8xBf{%5VP^2@YldmuC|I;UxVP)YSg-@ zxr!+`txr9Mb7X^}sN08T^eSz9Qo!)^|Ux%Rx<45_xF0WQ`Cw&1?~x~ngmn6S)wh>XcF z4EVPat6_Gf5=0;agu+gOoU}S&DDSZEBbb<;S)*5+h(Z;fYL!){3!u7(j;8llTZ(*Q zXKdupqxFwtx97Gxi^CDEQ}Q{KgymT1k3&nyAy|Q5#o5E6-^LwVr;+HPnv3}h{xA^n z$cozv;g#Uk_Fv1r-(+Chsk_OSKK^pmqO8E!ryxxMYxqG^T%i1ZHj<|Iba)a-Z0nGv zyFbHWfB18EnY(d1*0}MeRX%pm*;#c7&DSIup^o+{#7Z9~{KVMf*< z7Dz_@ZmSHBZN2ux>3LNF12w_unQQMK%`MQwvCJk;@i0T>82+q7Y zP6!1_g0u{XG~QbJk8r$-kprRP-Fn*N>yEv*sIEGXd5(Zex{%w9fTs+gO(06~1!N~3 zu=Yt43E|&CLDZegJHQS_3UCEoT|z>JLQvMjOL@mqC`u718dH$&iBYB#d-7xg8I+Wy zh62Kh#Ux^m2M^y5CKabhqxYGtH}GE&I(t;U1MO&0zr9j?92dK5-lFStv3p!|#~9?& z^Z7}i)`pC6s_#&Y$Na{TU_c^lAYGW8!6i`cS) zV-r~_+c-t?<=Di5d(8n=&B6MrEF}?s$KcD9ZzznQP>Ny#?w|3!Rb59y&0H$peD4~L4@hBqW&nCu1 zUiqfp{(TzY`o)`!<1+&w=$%nKe%@pprS|^vsH>@el^$$NPy;YvgN*w$2%J0c*ha$Q==%mG8 zTun7zJ2}gwacror`#(=V9k4%Ls6HP&UW<*n11ZB%-<-izp+0o{m>4rk)S%WV7G%O# z9AN|y@q8CC$M#xfkUSwpa{f@*e-#kGuv%5*oo9d6BoOL^-4BO_ix+iP@{56a=oQ>7s{(suuSo={x9LOX>E6$4*v&)0rWn@nvi2HY9ul7>B@ionf-Yy z@%hR>IQaVLk=vO-cBNz{gEN{yLlBXV(NFj_rA|7dKj(`AGhRr(iI`(+t#XK5=^usT zcIv^{qIm24d~eXNT@M0$cD%?HE6B@|DGkoK%RQ^L5MGtZt8FUy@&GW(;S1)wq%hL| z>%L~7u>9jYCJl$Yci&1wS081Zz%7n5$@z*(cnSU7?9$l;f#RxTnm1-e5q4iA_fP0o zryEr3%Vk+2D}IW}Y5v6PCeoN$9Iq#D$$FMlMIq&YRG(t4^Jc#?bw4|+=qSpR%$XZs zI)aLG#HOVDU5mOAs&k&7$9d=0B_4Ivy>>0r0G?^U)LE{8u?KOU@8j^DDX#O-GZ9k1 zKzTH7Dx>_Ym1wRi6A2?SS+4z|scfkmN!|{<$%MHfq++`jGBOnOUjofRecu#Y}smp59$n9l7;gy%KwH zV!;2n+g+67{!cTvbL&b@60ZaMXTe*_)&wboB~5y`O*C%}55=pGFSeyOXSDXXXNINS zB+t9_o+pT46@}^r&Ds*bWSekz3vrD)!xlcwR#Pr#LSk+U|_ZV-j=6bh`7Ay zPC9(R?MvDwJ0JJSDll#@jb@NHoRA=#^+KGbJEo302~MjfB$7z+%701{36ob#`%Pw$ ze*~XebK(sa%%*f~X2g;RrH9u9%V`J{6Kj|is37KcA*iC=0nR_^S`D4KTAJH~JuYtG zlewu&$nm31T5l4Lw85NE#?E$}8$t)>Fu6}13l8aPVj_a*#VYN5)bWyk0B|u|X?zxg z3}50`EUdNCn-&zu^Ph_c_z_xp47xtukSz=jdTib=d>RdYJmwSayNn7x0d_O7r-ye#u7`)ePT} zf`koJ?E0AEPcrWQ8=0u47G+W%mDOS*xXZfrSq%-xT-r)bWF#Nx~9iz<-@C=ffB7N+tjz}(oz{M&~M zD`Zv0+xFRvdwI`GD0S3BFn`PUXlzhGm&{i`W8(LoM`w>o-@2G^_dF2M_(%)JmleXu ztP8pYz|@1gH;ZCj?$1xbk0;+$pU#6H2>PD;9sz8aFq%JYtr?c|*?h8WQo9L^8WMB! zV9Kz5Yp?ECl3S72$oGs*_vqT;H0un}4pFO3xO;5!7{G9RkN8EH;wbyR$CN}2up1$Zo95*j8-Gl7I2 zacBb@>Zi60feuj3qqr7jLbb;KtaW;K7buTW=^ z`)cAB&Ws7qf+#lsS5O1^xR}R3^5z>@3R)!*hDQ)#@}pvLUP3i1f3$vcc)?OqFAaN1 zsK1-x@oXHH2xf*TDT$Ly(3X$8m&7llmjn}oF_X40(W_Kjm~ZXzf||M1JalS}bhH&; z41QdDV)Etht#~~s29$pcyb7B++0r%nFco|eOHiK52{|(NGk_~smZ9EZMge=l@@KNghg*;ztk0@;rIkuI&i zS;`i{AfNJN#zBeS43UD)GrjVH2CV?)z!iN^V{^-^FQ6c zdewuHc0JHRa7Nf>;LXGNbkLcq>+|FK^Pj`^brHXhzxN4xJubJd8t725>)|qIkODRe z0+7Slb2oo^%1~f{4Jr^_8V1`&I*OlQBGuHTM@_ z6ngm_mv|ZZ6unDgk`ogkU<5+;#D~dmkxn>Z2l+c|8a^$OAUjPS|A)Ftq+2KM#MaCgGhoJS0lH#5gIEdlq( z{qw4wqdr@;p3Hmv5i!h#WQbz@xW0nDXwp(|e!V3-WJ|W{9 z7${lHqq_1lY&w+;zkeh6E--Q0erXr34b+c*!js;d5TMvss@}e6K6c*|tnu%tqG6p? zodXECh94e+h7$+?s*O(2!YpM&Vi@OgJoFLPhmcw8BNub-jfjKN$hVw&for`n3UO@p z_PTy&+$l`q936t3**}1$8tM1g+h`-0OJ+R)9{%N1IF>69qRdK8!X-va-VF%)$knC~ zUtbpN4k(@5M@l}YO={8^XR^<+(XU=O@(^5oa%)-Gy#R))>Ny6>PikuJ1QwVF!YDIS zYik1o3@II+h@)xXQf?m#&FLq%c0CTrg`mnUiCJ))&F@zQW9`jXA={}W%Eq_zrI9bo z^Rc{~Vn*CJJLR=5w1~r=RBTNbk{YJ{Zg%Oq`==w0pQ%{;&=tpSDVOo6epI<5$AB=K zw9qlc%`Zf)>{t9n1qE;aiap$@0%7=9h~QJPpsQvA1@bF`cYw&EW&s~mdM;fViDMkgH+w|=({Ar*_Srb~qRXVnXELfR?kSmd}NI_txbLc`8??n=Pa_L*T7sLvL52I$)lXebPD6Hr+-Q9TgSM@oJG7d;X)vg z_;jdameLSoHjgsBRXbn?oNE(&o}gHsy7yf}s`Sud)H zr6m|!Ygofvefm}*N?n>z=eqWhckga!$1usk-7te6KO}?=_q2RmA2tZYd@nw0W($2W zzu-sY5@RTXgI|J^7#wFPFj9-qmIVBg8T(HZ9^B&2&d2JQ7}FvP{x{6V@3t44(=pp#n8n2 zrfTR21FYy|Cb(2zRg!}<5@VK|D!#2o`Ru#JM=q>SM9G+V$;)=hY9#aqj%2=~xszkF z0@JbG0e2ovdZg0oIgC{J?e!-9_RoLZ_?H#tCYGUid{*&|=vew+R(D$r55EHyHMZ8f z+#0{XkkzVt1u+nVIffZoP^MxngmXpmRhZ@R*-e45r-P4zP@j=&7}){_WupvBqsS$G zZADD~dXMmO3YifV7c9zu947Cy>~MTU=X88Pmx!PX{J62P-(I)=bw5jK*~Rp>^`5{IJNrP)9me5xo}uo%ZuYf9=dp=gDc_b!5kt1oqRckF^vqhB5A3_X=487 z!&Nwi%{6*;bu=)r<!a$-Depj)?tFgqCdYZRw);uxJU(fYM5UzCQPn?{p|aokZo zu(C0Sawb7W5}+Xz(*5^ zCVQ#y+h_&7>!xWGTgWY&MGw zJC5J0OCkckf`!xkZtDD8pMZlkAK+u3%zo|yB0%L?Emcl&&z~=}uHJ%3f32<{=;39t z-ye3Zs{EQ58}&05JauFV5#8=Vg1N0L`Hzob(f5IRk@OaZCwr zv{!^N9R7#^Oo*`IW+dj!k#Q%`-K#75w6pP_J$m|i?>P9b`MU3^mG9}~`uP!v@HNz} zKeE>6gN=_9;_89hAI@Ex%*y9MEcX!N&6ZuooU|y!G$1EuPt1 zwEcyjSe3td8X$owHqbU^GGLTH2VSXxTaHUdb(OuOAomn-3bv=ClbgQ zHq&5CxiV%WlZ;Qk$?RYM8Hao=A^{83m!Wery>vbV{PJF%BFc~Npio8%5`oH$f4+(- zWf0;lXZZ5klD)T(8A}KVnFxuY8pCdZv-5gjkEp0Ylu0w~*9TS@l|qX^3*&yc-*{c= z`i*+?Vj)Q-SR?HtUtr4}x~}1nM*ZiVGiv`Bty+zr7IDCUq!0+k1Zw1g5hw2z z*9$4#LtVgBOVO&9gU70&E>@il9!nvVm&ii1e0m3p1P$a-UY{qA+y+riYBpn$@)~sv zwcSZy{!VQ3stkJeQ#`yaHi0vqswFPeQJVIZuvbWYmq3n-l;(ffa~vNe1Vw)-a0@`9 zt6dOu4G{Y`sa>nYQ?C2(gATX$i$Ac%>Mz6;psv-m@%jMYpU2*UtGRrDZ>Y@oFOZ4s z_!b-aSIfeo$I>y`tp!&$sdO?sw#}|r*P&PSf&-PMmbu|=V-bijg*(AqoI@N~u;5H1 zBO|JF8vt_(3@q;+yX$OEO!$l}51s}}^Yin=!oI1rkApkY|F8`!6$lu;U9b*cD?3*?cMv>Dt6Pe{&>aLceSNk z=OtvUJbR$%8h6GVYU2PVG=ue;sw=*YsS5Uwd~OpishK6#KEvNbt-X$R5O@V*vag0b zmZWYFh~At41C8m^MNeVi)h>e9G2ZJsvV_Kx7!i6+Ei8nP;J*QJCcjDHj13ShP(g8r zJ1i+UT~0M)%0i{=Gi>zzIVcVe4m<>n8A;x5Q1r;aaJ%iMuq7dRBttHJea&4fhnL*r z0ku^8BjnnQ4q)hYmO{>a1X-vqn`91?=uIrnI=j(Mv5%tRJiV}Up4v17nUc=dFyCvj zOS%9d{WtJ$&-nTG;vey?87Ve6FKA$xZZ8aFJKsk$^$H+9EbB6GfcQqh$o!F@zX7RZ z1_JTCyuv1`r*eVIgcSR#(m?!OqGVf@eK;p`U#mh3IqfzgF|-ax!CDSukX~a%Ftw=D zlFHZ7f7*5`>8VG)Se09k`z;i^Od{IPyFbM)WHTCYP~* zGfGS5df~0aRXK`N=}<36|MIy*8fv2)C8pF}MpKB*`H}%aiva+|cC|Lo?RqprEN#TY zn9eA$L5l{hzXU57V9P@M9MUQtYMS-Lsjub#1-cDH6??q%5d05a`D=GEJI=m(^N_k< z7<93?em|hP=C>dGc)k8e5PXB-+IzY;u%;rUD3lKg?;k`h?y%Lap$8$!L_bhFir=?4 zY_waK&a)MtQsoG0G9oAsmP7aG(Zpp{3)a5+?gO=Gg%5u)#2z*`_D5t@n{^O-t(nZD zumdZuSKOc>qouTxrxeuFzZ)aX(g|`vV3nh7Zk&2#MKN>MQdIw^(Xv_{;65pnFVi%% z{F}S;vN0Qf_vPK6v78VH1bOPd3BqEJhyG2ay!vH9v=dE@gq7q8Xr`@~=~O1RdFR{` z&BN8!hUiLEHDxG$Dt)Rg*Uqe2yHAEg&GEF_p`OQ9+NLXHaig*+RNx}gqfPE5yHu+w zJt1WiaJ*z9=9XHRv9(=+$JP4nLQut|bcAq?YD~X;N&^SVt3PNc{;hrtLlsg)L|C7r zSzl(|{0l+p3oh3Sv=wk|_!zMOGNv({_aV{WgU#njg-0_u5{U==RAa$q;O%I0;}Imi zjoS>Fv%f2+Uyf*Q<$W;K9DI%()8D^XWE6ce7}uwIWM2egUbXwvMT$nh?@GmU{K(=q zO@nRbxwZ>JZ3K-2?shK=`<`QupZ`R;_FP^8%BWPG^11!1JA1ed^jLrcl?-2SP8!+- z!Grj!i{>kpoeKkd&h=Hhx0ka;d~33#rEg9#2)KTyh)D$*S-i?QxB0ld+?*~+(IQIm z?fwH4|BU>{FhIF5cC{t}cR?Z2kmRkE!l@u~uRHsEwWQ(qisYdKSDYj_q9$uk6t0yq-*VJ`H_j9 z5GCdDx0uC&$Tcl`Cdk13t`#609X!gc}EGY@a(Y0VJ0}GBHoMd zR=k&@KF3+FRa2mbpid#{LI|3!m-uR&8M_cq{iJvC zICys}b0y!4(C2LP@8%{WK|&Z~B;<8QoSD%rud<^S(r2*z3p23x)Bf0e>$q ztf&Jh;@hIWz2zcHIvZ>R#g=(6nzs&ua7eA0jRbPp&jv3sz5(Z#qksE?{XPquwlPr$0}=A4OP z1d;YMNTYJE!-js#_fO>bf}pPhEVh?C66^@$m5C)U2E;^wNpdU^6Q6$Ulr4Yt($}%7)#Ts!9-}i$Q8Gj|{HvHbrda&Tty2LLi>LZb2m_dl zf&OI^(^D*;#E+(ltR%+hYZF!XIwhoXG$*i8ldx_q)FSPbGP|n6dsH_Ct1h zv!VWNKjDWLKcA4#;)9YGW$Fe*Z}&5v3DxayYB{5o_tZ@%5JsuU`S5WqESEGr6%sUL z$?CZ!vF@~11MlOt4)5!!jVOZh4H9DXQ+Tm5E;y;R^+U12b9{Q4nx&@pLTizR3KU}J zq;Z|gSw{J4ATsAO77wb*KvQH)Yi9tjAME2_)=E4 zPPoJW9DdppCH6FO9duFB-g~!Q4K$IhKMpUh-we0+3Q~APmLP!{vin8d=t-^Uaid>= zc_k|h|Gpnlp>)xqmv^$^8J?AqP(HV`F(NB=1HcXs zh~vJ?)b``mK1BDvSEv8|ea{oe__FkFOfe)d#G3K59kf8_^M$!^w$Sl?*v!;ZQ2V0l zY+Rf*kqhl7Vol2irU%rD9=R5c8Zr#zjQk0;1uZv(b_*vCJL=9b#0 zSnKCdLR;X(MXiyzON^Xw?vc{PLo^+(3wkhvPds#{f4OzJD%P$RvkhKRX{kI=Sqhi_ zq|Yh5qzxfS#L%W;nQw>|O@!9COF-3h_|4`Mbl26>QHkDT6OO<5g&BlREkPr+| zfo2z?GkGR{$)WsT|2*{D*h+dXJ9ER#Hu?~Iampd~huEu5u-PHXVwVx#mh0^6B1kv- z>f*KI)S#Wy>=nI_%``P?TbuWC{?yggRQ^gkt%wi5sDP+IkjCZ|zbi>+8GFR;pjr<&&jmh)>pt$TuC}hOnXv9@Bs6u* z*KQ5r!=Vfu+RGzV`?~n~RexK-E|XAjuFNw8^UPvp31{7wg{=3dd!OA_M6RZ3u!EH@ zy24~94|Vw%5)ud(2Sf~8#y(6fS&E-N?mnOD0?wx?q2uoR-OK4_h|sTfF^a2N<(gJV z3$u}#IU{4Wha5fY_QEX}Cp&=Ew+Zze=CA&BgYpuIBc!y@>V}v0bocrkXx^I0EyYqH zSY$-XW}M9&ZI4gR7M{$QlcQO;QL5(;5trTEit}3^PZ)e8BphqrBk}7wg6Q3R?mT84 zY~@ohLwL&0#0V{U_9ZPxLb3CCLbPzLQ5qsshRW*tQxbbizIq*G7$79IV~?2 zA6OEf${J00UF>uH^u%F+m~MyGn>;^)E#KXxG3!mV_K_B9%Wx6{h!d`ts}*G3=+T+q z&*@$2K810d@4d!Qd=_8lN8#}L)nL+?kef0N@rWghspWa}O;2v@_5vsb6`s_XRwkbl zT4fR%)fC?3F~PZ9u{XCf5QbXWY9EtBsYVfsLD%me9}+(Wb<}xi4HE0i(>WgEb$WWo zt9rNXy!U3&R2Qy$m_f)Nu7=h+^0}m$=QU<}6^8}{LZFL^J76@N~XDVNz*3$}MpS5P+ zf(zqDR10a>yZjM1H=`GuKD@bv$#OrMv?ejYdDhtk65MeyNBjA=6(dIF&Bf2{Xh~&rKkfM|0)pcYnNW#1q53Hvvr66mejh!K*A9X3 z=LrM}h!($d{c)SG_degX?{=FCD0e@zn}2bd?-DDu8!H)l>?Me4flC}xYA`xelTNR# z#Kt2?uGvHO<+5_+pj`9#&&$-SyrvJV1@482t|!w3u@UK?&jM9*e#Y)$oVLCQ)*>1t zvm`m<5=@2$A9e<_@)cPHm-UX|$GgeGp6kCtuFnUn-fJEH#|7?ddR=|NZkK!7=I`=x z)=-FKy}8lFNs(nLh?y{K9OqI;Z=On`N)8XlGwT!D+DILsrGIQlOhr%}7Zi<%CN(up zKQn}AJ2KVWXjI-xq+>|yBdZ6uc;23kV_;-<_PnDE8&0{KWT+G~O;blJ^1^ds*5Ge= zC%+Z`;~Z>CdaiG>O*^zhn_Sigw*w=+Y>DO>_7HT2at|9+YyH!1Kp#rQtY*%g3&O4S z^5@uTH*{7W63kZtFfMnM$AyM71IH`NxH>iA|Iu`nQBD4Df53!+be95?`q3aM4MRGm zrKB4L=?-CZNl8jGx?_Y$*FcaC=?>`M&kWg8~zCD1E z-=;86cXsKNsl8hT(S8d^RJLm+Zv{_aX%NEEB@`e!Q6J$0b5Zpt)y-n((j(09AREl= z4r$*1`l%j6irQK$q-Lqtw7Z0q$|*X%bu5pV&>@u2%!F;Sav^L7h7re)!v%Et1oWV5jvP94}+4( z1pS5(5);+*f2lY!qOK(umcmG}$Fpyh)wVTMl5o%rbw6=D9xX24Hkhhe(VFFmv#emI zOs8N18UE}>IeYSp0e%#~7U+o}$Px4VOA+`0csfssR=2wzi2_hXrc3A5!T~p($$~m( zV^Z%NW6-q!7eW}nqXvE3eiUZW^rv^cd1`E0CP#&@pB(IJVHg>S$ur74S55AhdG3Hy(I4g9PMbnd9Vk-~8_b zZ#}Jm`}re^PCT1Ykas3X(f@Bv3_HdooE22GF84EeX!G=!CURJ_-X~pwXeq*+er0_5h+)~$lB{7rKQOqFLT29f>pybb@WQ*V4@U%yXJS)0c>@&U) z!rzeS%PLCGm+st7q-AMu4cefd^#&4|+kHR3Q@TqS<>OgG88HNF`>AF4W-O^{3G;En zg87RE7b=|BF~J}+e3VEZ4!TTuj6hw(99Pk93IgHTZXNxbkN}@UC1yVhnNK*!gYMAW zgV?hj{4BcMZKhBDg*%E&O)M zn%1m)V~OZC@T?)6puK<^3GWcbu*gn0d$whxQk2sMHj?jwZn?wlo-XigW$~mV(5vOX zU(e*>ZnpET(#8KMcGhI&C7y~oaV8{!J~%WXoc25Yz(c#BBsx3?P>Cqh{4=1m@327N z1oG<6cKw2a++8E?JjZrRtEdO6jWOQYyTg)88Pgm=Vu^oUE;+S+u zM~f@}UQiMJH8n;G$0uu=)JMO%Q-4l8p}25o4GgQ=8O~lHVG=j|eMB0*rzZhcPbHxg zBOwFT`a91~eQA73vCZfNZm}r28c3MJid-K9l=n3@dJ@Qs8%{kz45`%($?cn%=0LUf znKM9V4BbCzxCTf6Hu^pJr9YvqPr)o8m?z|olPL6C?}bmt+DG9`wfnci7HPTGX1I8dlJf?FhQ4aZOQfe zxelHh`17BuF~vmj|1ki93Itb}l^2@q#5`Fqe}3dTZ_`DXer?IWvvdnP%J&`9&se(m zUzmVCRHW2*zI-4<*f2!?NU@{D)!9t{N2*UY3>ek`Ei+ z?e-jrfVjeivp)40QRJ6wPe#nh;Eyeh?zh7!BYIUASnnAq^V0*2>%BRw3Zl5lJ~2_7 zzmtYxm`7qj6HK+^G#Biql@`pVwr>bGW;`!7BCFA_AdH`1fAm}Lm2_fu$I{ae9X{3^C}ugP15t*QBjtk z;jFwflnw%0DFT--Lhc;Fo8F7uWlwlj$fdplgl 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